288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331 integer, intent(in) :: ng, LBx, UBx, LBy, UBy
332 integer, intent(in) :: LBi, UBi, LBj, UBj
333 integer, intent(in) :: Istr, Iend, Jstr, Jend
334
335 real(r8), intent(in) :: Xinp(LBx:UBx,LBy:UBy)
336 real(r8), intent(in) :: Yinp(LBx:UBx,LBy:UBy)
337 real(r8), intent(in) :: Finp(LBx:UBx,LBy:UBy)
338
339 real(r8), intent(in) :: Iout(LBi:UBi,LBj:UBj)
340 real(r8), intent(in) :: Jout(LBi:UBi,LBj:UBj)
341 real(r8), intent(in) :: Xout(LBi:UBi,LBj:UBj)
342 real(r8), intent(in) :: Yout(LBi:UBi,LBj:UBj)
343
344 real(r8), intent(out) :: Fout(LBi:UBi,LBj:UBj)
345
346 real(r8), intent(out), optional :: MinVal
347 real(r8), intent(out), optional :: MaxVal
348
349
350
351 integer i, ic, iter, i1, i2, j, jc, j1, j2
352
353 real(r8) :: a11, a12, a21, a22
354 real(r8) :: e11, e12, e21, e22
355 real(r8) :: cff, d1, d2, dfc, dx, dy, eta, xi, xy, yx
356 real(r8) :: f0, fx, fxx, fxxx, fxxy, fxy, fxyy, fy, fyy, fyyy
357
358 real(r8), parameter :: C01 = 1.0_r8/48.0_r8
359 real(r8), parameter :: C02 = 1.0_r8/32.0_r8
360 real(r8), parameter :: C03 = 0.0625_r8
361 real(r8), parameter :: C04 = 1.0_r8/6.0_r8
362 real(r8), parameter :: C05 = 0.25_r8
363 real(r8), parameter :: C06 = 0.5_r8
364 real(r8), parameter :: C07 = 0.3125_r8
365 real(r8), parameter :: C08 = 0.625_r8
366 real(r8), parameter :: C09 = 1.5_r8
367 real(r8), parameter :: C10 = 13.0_r8/24.0_r8
368
369 real(r8), parameter :: LIMTR = 3.0_r8
370 real(r8), parameter :: spv = 0.0_r8
371
372 real(r8) :: Fmin, Fmax
373
374 real(r8), dimension(-1:2,-1:2) :: dfx, dfy, f
375
376
377
378
379
380 fmin=1.0e+35_r8
381 fmax=-1.0e+35_r8
382 DO j=jstr,jend
383 DO i=istr,iend
384 i1=int(iout(i,j))
385 i2=i1+1
386 j1=int(jout(i,j))
387 j2=j1+1
388 IF (((lbx.le.i1).and.(i1.le.ubx)).and. &
389 & ((lby.le.j1).and.(j1.le.uby))) THEN
390
391
392
393
394
395
396
397
398
399
400
401
402
403 xy=xinp(i2,j2)-xinp(i1,j2)-xinp(i2,j1)+xinp(i1,j1)
404 yx=yinp(i2,j2)-yinp(i1,j2)-yinp(i2,j1)+yinp(i1,j1)
405 dx=xout(i,j)-0.25_r8*(xinp(i2,j2)+xinp(i1,j2)+ &
406 & xinp(i2,j1)+xinp(i1,j1))
407 dy=yout(i,j)-0.25_r8*(yinp(i2,j2)+yinp(i1,j2)+ &
408 & yinp(i2,j1)+yinp(i1,j1))
409
410
411
412
413
414
415
416
417
418
419
420
421
422
423
424 e11=0.5_r8*(xinp(i2,j2)-xinp(i1,j2)+xinp(i2,j1)-xinp(i1,j1))
425 e12=0.5_r8*(xinp(i2,j2)+xinp(i1,j2)-xinp(i2,j1)-xinp(i1,j1))
426 e21=0.5_r8*(yinp(i2,j2)-yinp(i1,j2)+yinp(i2,j1)-yinp(i1,j1))
427 e22=0.5_r8*(yinp(i2,j2)+yinp(i1,j2)-yinp(i2,j1)-yinp(i1,j1))
428
429 cff=1.0_r8/(e11*e22-e12*e21)
430 xi=cff*(e22*dx-e12*dy)
431 eta=cff*(e11*dy-e21*dx)
432
433 DO iter=1,4
434 d1=dx-e11*xi-e12*eta-xy*xi*eta
435 d2=dy-e21*xi-e22*eta-yx*xi*eta
436 a11=e11+xy*eta
437 a12=e12+xy*xi
438 a21=e21+yx*eta
439 a22=e22+yx*xi
440 cff=1.0_r8/(a11*a22-a12*a21)
441 xi =xi +cff*(a22*d1-a12*d2)
442 eta=eta+cff*(a11*d2-a21*d1)
443 END DO
444
445#ifndef CUBIC_MASKED
446
447
448
449
450
451
452
453
454
455
456
457
458
459
460
461
462
463
464
465
466
467
468
469
470
471 DO jc=-1,2
472 DO ic=-1,2
473 f(ic,jc)=finp(max(1,min(ubx,i1+ic)), &
474 & max(1,min(uby,j1+jc)))
475 END DO
476 END DO
477
478 f0=c07*(f(1,1)+f(1,0)+f(0,1)+f(0,0))- &
479 & c02*(f(2,0)+f(2,1)+f(1,2)+f(0,2)+ &
480 & f(-1,1)+f(-1,0)+f(0,-1)+f(1,-1))
481
482 fx=c08*(f(1,1)+f(1,0)-f(0,1)-f(0,0))- &
483 & c01*(f(2,1)+f(2,0)-f(-1,1)-f(-1,0))- &
484 & c03*(f(1,2)-f(0,2)+f(1,-1)-f(0,-1))
485
486 fy=c08*(f(1,1)-f(1,0)+f(0,1)-f(0,0))- &
487 & c01*(f(1,2)+f(0,2)-f(1,-1)-f(0,-1))- &
488 & c03*(f(2,1)-f(2,0)+f(-1,1)-f(-1,0))
489
490 fxy=f(1,1)-f(1,0)-f(0,1)+f(0,0)
491
492 fxx=c05*(f(2,1)-f(1,1)-f(0,1)+f(-1,1)+ &
493 & f(2,0)-f(1,0)-f(0,0)+f(-1,0))
494
495 fyy=c05*(f(1,2)-f(1,1)-f(1,0)+f(1,-1)+ &
496 & f(0,2)-f(0,1)-f(0,0)+f(0,-1))
497
498 fxxx=c06*(f(2,1)+f(2,0)-f(-1,1)-f(-1,0))- &
499 & c09*(f(1,1)+f(1,0)-f(0,1)-f(0,0))
500
501 fyyy=c06*(f(1,2)+f(0,2)-f(1,-1)-f(0,-1))- &
502 & c09*(f(1,1)-f(1,0)+f(0,1)-f(0,0))
503
504 fxxy=c06*(f(2,1)-f(1,1)-f(0,1)+f(-1,1)- &
505 & f(2,0)+f(1,0)+f(0,0)-f(-1,0))
506
507 fxyy=c06*(f(1,2)-f(1,1)-f(1,0)+f(1,-1)- &
508 & f(0,2)+f(0,1)+f(0,0)-f(0,-1))
509#else
510
511
512
513
514
515
516
517
518
519
520
521
522
523
524
525
526
527
528
529
530
531
532
533 f(0,0)=finp(i1,j1)
534 f(1,0)=finp(i2,j1)
535 f(0,1)=finp(i1,j2)
536 f(1,1)=finp(i2,j2)
537
538 dfc=f(1,1)-f(0,1)
539 IF (i1+2.gt.ubx) THEN
540 dfx(1,1)=dfc
541 ELSE IF (finp(i1+2,j2).eq.spv) THEN
542 dfx(1,1)=dfc
543 ELSE
544 dfx(1,1)=finp(i1+2,j2)-f(1,1)
545# ifdef LIMTR
546 IF ((dfx(1,1)*dfc).lt.0.0_r8) THEN
547 dfx(1,1)=0.0_r8
548 ELSE IF (abs(dfx(1,1)).gt.(limtr*abs(dfc))) THEN
549 dfx(1,1)=limtr*dfc
550 END IF
551# endif
552 END IF
553
554 dfc=f(1,0)-f(0,0)
555 IF ((i1+2).gt.ubx) THEN
556 dfx(1,0)=dfc
557 ELSE IF (finp(i1+2,j1).eq.spv) THEN
558 dfx(1,0)=dfc
559 ELSE
560 dfx(1,0)=finp(i1+2,j1)-f(1,0)
561# ifdef LIMTR
562 IF ((dfx(1,0)*dfc).lt.0.0_r8) THEN
563 dfx(1,0)=0.0_r8
564 ELSE IF (abs(dfx(1,0)).gt.(limtr*abs(dfc))) THEN
565 dfx(1,0)=limtr*dfc
566 END IF
567# endif
568 END IF
569
570 dfc=f(1,1)-f(0,1)
571 IF (i1-1.lt.1) THEN
572 dfx(0,1)=dfc
573 ELSE IF (finp(i1-1,j2).eq.spv) THEN
574 dfx(0,1)=dfc
575 ELSE
576 dfx(0,1)=f(0,1)-finp(i1-1,j2)
577# ifdef LIMTR
578 IF ((dfx(0,1)*dfc).lt.0.0_r8) THEN
579 dfx(0,1)=0.0_r8
580 ELSE IF (abs(dfx(0,1)).gt.(limtr*abs(dfc))) THEN
581 dfx(0,1)=limtr*dfc
582 END IF
583# endif
584 END IF
585
586 dfc=f(1,0)-f(0,0)
587 IF (i1-1.lt.1) THEN
588 dfx(0,0)=dfc
589 ELSE IF (finp(i1-1,j1).eq.spv) THEN
590 dfx(0,0)=dfc
591 ELSE
592 dfx(0,0)=f(0,0)-finp(i1-1,j1)
593# ifdef LIMTR
594 IF ((dfx(0,0)*dfc).lt.0.0_r8) THEN
595 dfx(0,0)=0.0_r8
596 ELSE IF (abs(dfx(0,0)).gt.(limtr*abs(dfc))) THEN
597 dfx(0,0)=limtr*dfc
598 END IF
599# endif
600 END IF
601
602 dfc=f(1,1)-f(1,0)
603 IF (j1+2.gt.uby) THEN
604 dfy(1,1)=dfc
605 ELSE IF (finp(i2,j1+2).eq.spv) THEN
606 dfy(1,1)=dfc
607 ELSE
608 dfy(1,1)=finp(i2,j1+2)-f(1,1)
609# ifdef LIMTR
610 IF ((dfy(1,1)*dfc).lt.0.0_r8) THEN
611 dfy(1,1)=0.0_r8
612 ELSEIF (abs(dfy(1,1)).gt.(limtr*abs(dfc))) THEN
613 dfy(1,1)=limtr*dfc
614 END IF
615# endif
616 END IF
617
618 dfc=f(0,1)-f(0,0)
619 IF (j1+2.gt.uby) THEN
620 dfy(0,1)=dfc
621 ELSE IF (finp(i1,j1+2).eq.spv) THEN
622 dfy(0,1)=dfc
623 ELSE
624 dfy(0,1)=finp(i1,j1+2)-f(0,1)
625# ifdef LIMTR
626 IF ((dfy(0,1)*dfc).lt.0.0_r8) THEN
627 dfy(0,1)=0.0_r8
628 ELSE IF (abs(dfy(0,1)).gt.(limtr*abs(dfc))) THEN
629 dfy(0,1)=limtr*dfc
630 END IF
631# endif
632 END IF
633
634 dfc=f(1,1)-f(1,0)
635 IF (j1-1.lt.1) THEN
636 dfy(1,0)=dfc
637 ELSE IF (finp(i2,j1-1).eq.spv) THEN
638 dfy(1,0)=dfc
639 ELSE
640 dfy(1,0)=f(1,0)-finp(i2,j1-1)
641# ifdef LIMTR
642 IF ((dfy(1,0)*dfc).lt.0.0_r8) THEN
643 dfy(1,0)=0.0_r8
644 ELSE IF (abs(dfy(1,0)).gt.(limtr*abs(dfc))) THEN
645 dfy(1,0)=limtr*dfc
646 END IF
647# endif
648 END IF
649
650 dfc=f(0,1)-f(0,0)
651 IF (j1-1.lt.1) THEN
652 dfy(0,0)=dfc
653 ELSE IF (finp(i1,j1-1).eq.spv) THEN
654 dfy(0,0)=dfc
655 ELSE
656 dfy(0,0)=f(0,0)-finp(i1,j1-1)
657# ifdef LIMTR
658 IF ((dfy(0,0)*dfc).lt.0.0_r8) THEN
659 dfy(0,0)=0.0_r8
660 ELSEIF (abs(dfy(0,0)).gt.(limtr*abs(dfc))) THEN
661 dfy(0,0)=limtr*dfc
662 END IF
663# endif
664 END IF
665
666 f0=c05*(f(1,1)+f(1,0)+f(0,1)+f(0,0))- &
667 & c02*(dfx(1,1)+dfx(1,0)-dfx(0,1)-dfx(0,0)+ &
668 & dfy(1,1)-dfy(1,0)+dfy(0,1)-dfy(0,0))
669
670 fx=c10*(f(1,1)-f(0,1)+f(1,0)-f(0,0))- &
671 & c01*(dfx(1,1)+dfx(1,0)+dfx(0,1)+dfx(0,0))- &
672 & c03*(dfy(1,1)-dfy(0,1)-dfy(1,0)+dfy(0,0))
673
674 fy=c10*(f(1,1)-f(1,0)+f(0,1)-f(0,0))- &
675 & c01*(dfy(1,1)+dfy(0,1)+dfy(1,0)+dfy(0,0))- &
676 & c03*(dfx(1,1)-dfx(1,0)-dfx(0,1)+dfx(0,0))
677
678 fxy=f(1,1)-f(1,0)-f(0,1)+f(0,0)
679
680 fxx=c05*(dfx(1,1)-dfx(0,1)+dfx(1,0)-dfx(0,0))
681
682 fyy=c05*(dfy(1,1)-dfy(1,0)+dfy(0,1)-dfy(0,0))
683
684 fxxx=c06*(dfx(1,1)+dfx(1,0)+dfx(0,1)+dfx(0,0))- &
685 & f(1,1)+f(0,1)-f(1,0)+f(0,0)
686
687 fyyy=c06*(dfy(1,1)+dfy(0,1)+dfy(1,0)+dfy(0,0))- &
688 & f(1,1)+f(1,0)-f(0,1)+f(0,0)
689
690 fxxy=c06*(dfx(1,1)-dfx(0,1)-dfx(1,0)+dfx(0,0))
691
692 fxyy=c06*(dfy(1,1)-dfy(1,0)-dfy(0,1)+dfy(0,0))
693#endif
694 fout(i,j)=f0+ &
695 & fx*xi+ &
696 & fy*eta+ &
697 & c06*fxx*xi*xi+ &
698 & fxy*xi*eta+ &
699 & c06*fyy*eta*eta+ &
700 & c04*fxxx*xi*xi*xi+ &
701 & c06*fxxy*xi*xi*eta+ &
702 & c04*fyyy*eta*eta*eta+ &
703 & c06*fxyy*xi*eta*eta
704 fmin=min(fmin,fout(i,j))
705 fmax=max(fmax,fout(i,j))
706 END IF
707 END DO
708 END DO
709
710
711
712 IF (PRESENT(minval)) THEN
713 minval=fmin
714 END IF
715 IF (PRESENT(maxval)) THEN
716 maxval=fmax
717 END IF
718
719 RETURN