282 & Xinp, Yinp, Finp, &
283 & LBi, UBi, LBj, UBj, &
284 & Istr, Iend, Jstr, Jend, &
287 & Fout, MinVal, MaxVal)
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
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)
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)
344 real(r8),
intent(out) :: Fout(LBi:UBi,LBj:UBj)
346 real(r8),
intent(out),
optional :: MinVal
347 real(r8),
intent(out),
optional :: MaxVal
351 integer i, ic, iter, i1, i2, j, jc, j1, j2
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
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
369 real(r8),
parameter :: LIMTR = 3.0_r8
370 real(r8),
parameter :: spv = 0.0_r8
372 real(r8) :: Fmin, Fmax
374 real(r8),
dimension(-1:2,-1:2) :: dfx, dfy, f
388 IF (((lbx.le.i1).and.(i1.le.ubx)).and. &
389 & ((lby.le.j1).and.(j1.le.uby)))
THEN
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))
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))
429 cff=1.0_r8/(e11*e22-e12*e21)
430 xi=cff*(e22*dx-e12*dy)
431 eta=cff*(e11*dy-e21*dx)
434 d1=dx-e11*xi-e12*eta-xy*xi*eta
435 d2=dy-e21*xi-e22*eta-yx*xi*eta
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)
473 f(ic,jc)=finp(max(1,min(ubx,i1+ic)), &
474 & max(1,min(uby,j1+jc)))
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))
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))
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))
490 fxy=f(1,1)-f(1,0)-f(0,1)+f(0,0)
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))
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))
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))
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))
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))
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))
539 IF (i1+2.gt.ubx)
THEN
541 ELSE IF (finp(i1+2,j2).eq.spv)
THEN
544 dfx(1,1)=finp(i1+2,j2)-f(1,1)
546 IF ((dfx(1,1)*dfc).lt.0.0_r8)
THEN
548 ELSE IF (abs(dfx(1,1)).gt.(limtr*abs(dfc)))
THEN
555 IF ((i1+2).gt.ubx)
THEN
557 ELSE IF (finp(i1+2,j1).eq.spv)
THEN
560 dfx(1,0)=finp(i1+2,j1)-f(1,0)
562 IF ((dfx(1,0)*dfc).lt.0.0_r8)
THEN
564 ELSE IF (abs(dfx(1,0)).gt.(limtr*abs(dfc)))
THEN
573 ELSE IF (finp(i1-1,j2).eq.spv)
THEN
576 dfx(0,1)=f(0,1)-finp(i1-1,j2)
578 IF ((dfx(0,1)*dfc).lt.0.0_r8)
THEN
580 ELSE IF (abs(dfx(0,1)).gt.(limtr*abs(dfc)))
THEN
589 ELSE IF (finp(i1-1,j1).eq.spv)
THEN
592 dfx(0,0)=f(0,0)-finp(i1-1,j1)
594 IF ((dfx(0,0)*dfc).lt.0.0_r8)
THEN
596 ELSE IF (abs(dfx(0,0)).gt.(limtr*abs(dfc)))
THEN
603 IF (j1+2.gt.uby)
THEN
605 ELSE IF (finp(i2,j1+2).eq.spv)
THEN
608 dfy(1,1)=finp(i2,j1+2)-f(1,1)
610 IF ((dfy(1,1)*dfc).lt.0.0_r8)
THEN
612 ELSEIF (abs(dfy(1,1)).gt.(limtr*abs(dfc)))
THEN
619 IF (j1+2.gt.uby)
THEN
621 ELSE IF (finp(i1,j1+2).eq.spv)
THEN
624 dfy(0,1)=finp(i1,j1+2)-f(0,1)
626 IF ((dfy(0,1)*dfc).lt.0.0_r8)
THEN
628 ELSE IF (abs(dfy(0,1)).gt.(limtr*abs(dfc)))
THEN
637 ELSE IF (finp(i2,j1-1).eq.spv)
THEN
640 dfy(1,0)=f(1,0)-finp(i2,j1-1)
642 IF ((dfy(1,0)*dfc).lt.0.0_r8)
THEN
644 ELSE IF (abs(dfy(1,0)).gt.(limtr*abs(dfc)))
THEN
653 ELSE IF (finp(i1,j1-1).eq.spv)
THEN
656 dfy(0,0)=f(0,0)-finp(i1,j1-1)
658 IF ((dfy(0,0)*dfc).lt.0.0_r8)
THEN
660 ELSEIF (abs(dfy(0,0)).gt.(limtr*abs(dfc)))
THEN
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))
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))
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))
678 fxy=f(1,1)-f(1,0)-f(0,1)+f(0,0)
680 fxx=c05*(dfx(1,1)-dfx(0,1)+dfx(1,0)-dfx(0,0))
682 fyy=c05*(dfy(1,1)-dfy(1,0)+dfy(0,1)-dfy(0,0))
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)
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)
690 fxxy=c06*(dfx(1,1)-dfx(0,1)-dfx(1,0)+dfx(0,0))
692 fxyy=c06*(dfy(1,1)-dfy(1,0)-dfy(0,1)+dfy(0,0))
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))
712 IF (
PRESENT(minval))
THEN
715 IF (
PRESENT(maxval))
THEN
724 & angler, Xgrd, Ygrd, &
725 & LBm, UBm, LBn, UBn, &
727 & Xpos, Ypos, Ipos, Jpos, &
728 & IJspv, rectangular)
777 logical,
intent(in) :: rectangular
779 integer,
intent(in) :: ng
780 integer,
intent(in) :: LBi, UBi, LBj, UBj, Is, Ie, Js, Je
781 integer,
intent(in) :: LBm, UBm, LBn, UBn, Ms, Me, Ns, Ne
783 real(r8),
intent(in) :: IJspv
785 real(r8),
intent(in) :: angler(LBi:UBi,LBj:UBj)
786 real(r8),
intent(in) :: Xgrd(LBi:UBi,LBj:UBj)
787 real(r8),
intent(in) :: Ygrd(LBi:UBi,LBj:UBj)
789 real(r8),
intent(in) :: Xpos(LBm:UBm,LBn:UBn)
790 real(r8),
intent(in) :: Ypos(LBm:UBm,LBn:UBn)
792 real(r8),
intent(out) :: Ipos(LBm:UBm,LBn:UBn)
793 real(r8),
intent(out) :: Jpos(LBm:UBm,LBn:UBn)
797 logical :: found, foundi, foundj
799 integer :: Imax, Imin, Jmax, Jmin, i, i0, j, j0, mp, np
801 real(r8) :: aa2, ang, bb2, diag2, dx, dy, phi
802 real(r8) :: xfac, xpp, yfac, ypp
816 IF (rectangular)
THEN
818 i_loop :
DO i=lbi,ubi-1
819 IF ((xgrd(i ,1).le.xpos(mp,np)).and. &
820 & (xgrd(i+1,1).gt.xpos(mp,np)))
THEN
827 j_loop :
DO j=lbj,ubj-1
828 IF ((ygrd(1,j ).le.ypos(mp,np)).and. &
829 & (ygrd(1,j+1).gt.ypos(mp,np)))
THEN
835 found=foundi.and.foundj
843 found=
try_range(ng, lbi, ubi, lbj, ubj, &
846 & xpos(mp,np), ypos(mp,np))
852 DO while (((imax-imin).gt.1).or.((jmax-jmin).gt.1))
853 IF ((imax-imin).gt.1)
THEN
855 found=
try_range(ng, lbi, ubi, lbj, ubj, &
857 & imin, i0, jmin, jmax, &
858 & xpos(mp,np), ypos(mp,np))
865 IF ((jmax-jmin).gt.1)
THEN
867 found=
try_range(ng, lbi, ubi, lbj, ubj, &
869 & imin, imax, jmin, j0, &
870 & xpos(mp,np), ypos(mp,np))
878 found=(is.le.imin).and.(imin.le.ie).and. &
879 & (is.le.imax).and.(imax.le.ie).and. &
880 & (js.le.jmin).and.(jmin.le.je).and. &
881 & (js.le.jmax).and.(jmax.le.je)
892 xfac=yfac*cos(ypos(mp,np)*
deg2rad)
893 xpp=(xpos(mp,np)-xgrd(imin,jmin))*xfac
894 ypp=(ypos(mp,np)-ygrd(imin,jmin))*yfac
898 xpp=xpos(mp,np)-xgrd(imin,jmin)
899 ypp=ypos(mp,np)-ygrd(imin,jmin)
904 diag2=((xgrd(imin+1,jmin)-xgrd(imin,jmin+1))*xfac)**2+ &
905 & ((ygrd(imin+1,jmin)-ygrd(imin,jmin+1))*yfac)**2
906 aa2=((xgrd(imin,jmin)-xgrd(imin+1,jmin))*xfac)**2+ &
907 & ((ygrd(imin,jmin)-ygrd(imin+1,jmin))*yfac)**2
908 bb2=((xgrd(imin,jmin)-xgrd(imin,jmin+1))*xfac)**2+ &
909 & ((ygrd(imin,jmin)-ygrd(imin,jmin+1))*yfac)**2
910 phi=asin((diag2-aa2-bb2)/(2.0_r8*sqrt(aa2*bb2)))
915 ang=angler(imin,jmin)
916 dx=xpp*cos(ang)+ypp*sin(ang)
917 dy=ypp*cos(ang)-xpp*sin(ang)
926 dx=min(max(0.0_r8,dx/sqrt(aa2)),1.0_r8)
927 dy=min(max(0.0_r8,dy/sqrt(bb2)),1.0_r8)
928 ipos(mp,np)=real(imin,r8)+dx
929 jpos(mp,np)=real(jmin,r8)+dy
1282 datum, method, obsVetting)
1311 integer,
intent( in) :: method
1313 real(r8),
intent( in) :: fld_src(:,:,:)
1314 real(r8),
intent( in) :: z_src(:,:,:)
1315 real(r8),
intent( in) :: z_locs(:)
1316 real(r8),
intent(out) :: datum(:)
1318 real(r8),
intent(inout),
optional :: ObsVetting(:)
1320 TYPE (roms_interp_type),
intent(inout) :: S
1324 integer :: ic, iobs, i1, i2, j1, j2, k, k1, k2, nlevs, nlocs
1326 real(r8) :: Zbot, Ztop, dz, p1, p2, q1, q2, r1, r2
1327 real(r8) :: w11, w12, w21, w22, wsum
1329 real(r8),
dimension(8) :: Hmat
1331 character (len=*),
parameter :: MyFile = &
1332 & __FILE__//
", roms_datum_interp_3d"
1338 nlevs=
SIZE(fld_src, dim=3)
1339 nlocs=
SIZE(datum, dim=1)
1342 i1=int(s%x_dst(iobs,1))
1343 j1=int(s%y_dst(iobs,1))
1344 IF (((s%Istr_src.le.i1).and.(i1.lt.s%Iend_src)).and. &
1345 & ((s%Jstr_src.le.j1).and.(j1.lt.s%Jend_src)))
THEN
1348 p2=real(i2-i1,r8)*(s%x_dst(iobs,1)-real(i1,r8))
1349 q2=real(j2-j1,r8)*(s%y_dst(iobs,1)-real(j1,r8))
1356 IF (z_locs(iobs).gt.0.0_r8)
THEN
1357 k1=max(1,int(z_locs(iobs)))
1358 k2=min(int(z_locs(iobs))+1,nlevs)
1359 r2=real(k2-k1,r8)*(z_locs(iobs)-real(k1,r8))
1362 ztop=z_src(i1,j1,nlevs)
1363 zbot=z_src(i1,j1,1 )
1364 IF (z_locs(iobs).ge.ztop)
THEN
1367 IF (
PRESENT(obsvetting)) obsvetting(iobs)=0.0_r8
1368 ELSE IF (zbot.ge.z_locs(iobs))
THEN
1371 IF (
PRESENT(obsvetting)) obsvetting(iobs)=0.0_r8
1374 ztop=z_src(i1,j1,k )
1375 zbot=z_src(i1,j1,k-1)
1376 IF ((ztop.gt.z_locs(iobs)).and. &
1377 (z_locs(iobs).ge.zbot))
THEN
1382 dz=z_src(i1,j1,k2)-z_src(i1,j1,k1)
1383 r2=(z_locs(iobs)-z_src(i1,j1,k1))/dz
1387 IF ((r1+r2).gt.0.0_r8)
THEN
1397 hmat(1)=hmat(1)*s%mask_src(i1,j1)
1398 hmat(2)=hmat(2)*s%mask_src(i2,j1)
1399 hmat(3)=hmat(3)*s%mask_src(i2,j2)
1400 hmat(4)=hmat(4)*s%mask_src(i1,j2)
1401 hmat(5)=hmat(5)*s%mask_src(i1,j1)
1402 hmat(6)=hmat(6)*s%mask_src(i2,j1)
1403 hmat(7)=hmat(7)*s%mask_src(i2,j2)
1404 hmat(8)=hmat(8)*s%mask_src(i1,j2)
1409 IF (wsum.gt.0.0_r8)
THEN
1412 hmat(ic)=hmat(ic)*wsum
1416 datum(iobs)=hmat(1)*fld_src(i1,j1,k1)+ &
1417 & hmat(2)*fld_src(i2,j1,k1)+ &
1418 & hmat(3)*fld_src(i2,j2,k1)+ &
1419 & hmat(4)*fld_src(i1,j2,k1)+ &
1420 & hmat(5)*fld_src(i1,j1,k2)+ &
1421 & hmat(6)*fld_src(i2,j1,k2)+ &
1422 & hmat(7)*fld_src(i2,j2,k2)+ &
1423 & hmat(8)*fld_src(i1,j2,k2)
1427 IF (
PRESENT(obsvetting))
THEN
1429 IF (wsum.gt.0.0_r8) obsvetting(iobs)=1.0_r8
1431 obsvetting(iobs)=1.0_r8
1433#ifndef ALLOW_BOTTOM_OBS
1440 IF ((z_locs(iobs).gt.0.0_r8).and. &
1441 (z_locs(iobs).le.1.0_r8))
THEN
1442 obsvetting(iobs)=0.0_r8