! !################################################################## !################################################################## !###### ###### !###### SUBROUTINE INTONEF ###### !###### ###### !###### Developed by ###### !###### Center for Analysis and Prediction of Storms ###### !###### University of Oklahoma ###### !###### ###### !################################################################## !################################################################## ! SUBROUTINE intonef(nx,ny,nz,vnx,vny,vnz, & 3,4 ibeg,iend,jbeg,jend,kbeg,kend, & ivbeg,ivend,jvbeg,jvend,kvbeg,kvend, & iorder, & x2d,y2d,zp, vx,vy,vzp, & vprt, vbar, aprt, abar, & iloc,jloc,zpver,dxfld,dyfld,rdxfld,rdyfld, & slopey,alphay,betay, & ireturn ) ! !----------------------------------------------------------------------- ! ! PURPOSE: ! Intfield interpolates scalars from a single field (the verification ! fields, "verif") having Cartesian coordinates described by vx,vy,vzp ! to a second set of fields described by cartesion coordinates x,y,zp. ! It is assumed that x,y,zp and vx,vy,vzp are monotonically increasing ! with increasing index. ! !----------------------------------------------------------------------- ! ! AUTHOR: Keith Brewster OU School of Meteorology. Feb 1992 ! ! MODIFICATION HISTORY: ! 12 Aug 1992 (KB) changed from arps2.5 to arps3.0 ! 19 May 1993 (KB) changed from arps3.1 to arps3.2 ! 24 May 1993 (KB) changed to special version for scalars only. ! ! 9 Sep 1995 (KB) added processing of sfc (soil) fields ! 07 Nov 1996 (KB) changed interpolation scheme ! Reordered sequence of variables in call. ! 15 Oct 1999 (KB via Eric Kemp) corrected some dimension ! statements (no effect on results) ! !----------------------------------------------------------------------- ! ! INPUT: ! nx Number grid pts in the x-direction (east/west) ! ny Number grid pts in the y-direction (north/south) ! nz Number grid pts in the vertical ! ! vnx Number grid pts in the x-direction (east/west) ! vny Number grid pts in the y-direction (north/south) ! vnz Number grid pts in the vertical ! ! ibeg,iend Range of x index to do interpolation ! jbeg,jend Range of y index to do interpolation ! kbeg,kend Range of z index to do interpolation ! ! ivbeg,ivend Range of x index to use in field to be interpolated ! jvbeg,jvend Range of y index to use in field to be interpolated ! kvbeg,kvend Range of z index to use in field to be interpolated ! ! iorder Interpolation parameter. ! iorder specifies the order of interpolation ! 1 = bi-linear ! 2 = bi-quadratic ! ! x2d x coordinate (m) of interpolation points ! y2d y coordinate (m) of interpolation points ! z z coordinate (m) of interpolation points ! ! vx x coordinate (m) of field to be interpolated ! vy y coordinate (m) of field to be interpolated ! zpver z coordinate (m) of field to be interpolated ! ! vprt perturbation variable to be interpolated ! vbar mean variable to be interpolated ! ! WORK ARRAYS: ! iloc I-index of interpolation points in field to be interpolated ! jloc J-index of interpolation points in field to be interpolated ! dxfld Vector of delta-x (m) of field to be interpolated ! dyfld Vector of delta-y (m) of field to be interpolated ! rdxfld Vector of 1./delta-x (1/m) of field to be interpolated ! rdyfld Vector of 1./delta-y (1/m) of field to be interpolated ! ! slopey Piecewise linear df/dy ! alphay Coefficient of y-squared term in y quadratic interpolator ! betay Coefficient of y term in y quadratic interpolator ! ! OUTPUT: ! aprt perturbation variable interpolated to ARPS grid ! abar mean variable interpolated to ARPS grid ! !----------------------------------------------------------------------- ! IMPLICIT NONE INTEGER :: nx,ny,nz INTEGER :: ibeg,iend,jbeg,jend,kbeg,kend REAL :: x2d(nx,ny) REAL :: y2d(nx,ny) REAL :: zp(nx,ny,nz) ! INTEGER :: vnx,vny,vnz INTEGER :: ivbeg,ivend,jvbeg,jvend,kvbeg,kvend REAL :: vx(vnx) REAL :: vy(vny) REAL :: vzp(vnx,vny,vnz) ! INTEGER :: iorder ! REAL :: vprt(vnx,vny,vnz) REAL :: vbar(vnx,vny,vnz) REAL :: aprt(nx,ny,nz) REAL :: abar(nx,ny,nz) ! INTEGER :: iloc(nx,ny) INTEGER :: jloc(nx,ny) REAL :: zpver(nx,ny,vnz) ! REAL :: dxfld(vnx) REAL :: dyfld(vny) REAL :: rdxfld(vnx) REAL :: rdyfld(vny) REAL :: slopey(vnx,vny,vnz) REAL :: alphay(vnx,vny,vnz) REAL :: betay(vnx,vny,vnz) ! INTEGER :: ireturn ! !----------------------------------------------------------------------- ! ! Misc. local variables ! !----------------------------------------------------------------------- ! INTEGER :: k,korder ! !@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ ! ! Beginning of executable code... ! !@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ ! !----------------------------------------------------------------------- ! ! Find i,j locations ! !----------------------------------------------------------------------- ! CALL setijloc(nx,ny,vnx,vny,x2d,y2d,vx,vy,iloc,jloc) ! !----------------------------------------------------------------------- ! ! Create array of verification heights at ! forecast x,y locations ! !----------------------------------------------------------------------- ! korder=MIN(iorder,2) DO k=1,vnz-1 CALL fldint2d(nx,ny,vnx,vny, & ibeg,iend,jbeg,jend, & ivbeg,ivend,jvbeg,jvend, & korder,x2d,y2d,vzp(1,1,k),vx,vy,iloc,jloc, & dxfld,dyfld,rdxfld,rdyfld, & slopey(1,1,k),alphay(1,1,k),betay(1,1,k), & zpver(1,1,k)) END DO ! !----------------------------------------------------------------------- ! ! Interpolate 3d fields ! !----------------------------------------------------------------------- ! CALL fldint3d(nx,ny,nz,vnx,vny,vnz, & ibeg,iend,jbeg,jend,kbeg,kend, & ivbeg,ivend,jvbeg,jvend,kvbeg,kvend, & korder,x2d,y2d,zp,vprt,vx,vy,zpver,iloc,jloc, & dxfld,dyfld,rdxfld,rdyfld, & slopey,alphay,betay, & aprt) ! CALL fldint3d(nx,ny,nz,vnx,vny,vnz, & ibeg,iend,jbeg,jend,kbeg,kend, & ivbeg,ivend,jvbeg,jvend,kvbeg,kvend, & korder,x2d,y2d,zp,vbar,vx,vy,zpver,iloc,jloc, & dxfld,dyfld,rdxfld,rdyfld, & slopey,alphay,betay, & abar) RETURN END SUBROUTINE intonef ! !################################################################## !################################################################## !###### ###### !###### SUBROUTINE FLDINT3D ###### !###### ###### !###### Developed by ###### !###### Center for Analysis and Prediction of Storms ###### !###### University of Oklahoma ###### !###### ###### !################################################################## !################################################################## ! SUBROUTINE fldint3d(nx,ny,nz,vnx,vny,vnz, & 19,1 ibeg,iend,jbeg,jend,kstart,kend, & ivstart,ivend,jvstart,jvend,kvstart,kvend, & iorder,x2d,y2d,z,var,vx,vy,zpver,iloc,jloc, & dxfld,dyfld,rdxfld,rdyfld, & slopey,alphay,betay, & varint) ! !----------------------------------------------------------------------- ! ! PURPOSE: ! Intfield interpolates scalars from a set of fields (the verification ! fields, "verif") having Cartesian coordinates described by vx,vy,vzp ! to a second set of fields described by cartesion coordinates x,y,zp. ! It is assumed that x,y,zp and vx,vy,vzp are monotonically increasing ! with increasing index. ! !----------------------------------------------------------------------- ! ! AUTHOR: Keith Brewster OU School of Meteorology. Feb 1992 ! ! MODIFICATION HISTORY: ! 12 Aug 1992 (KB) changed from arps2.5 to arps3.0 ! 19 May 1993 (KB) changed from arps3.1 to arps3.2 ! 24 May 1993 (KB) changed to special version for scalars only. ! ! 9 Sep 1995 (KB) added processing of sfc (soil) fields ! 26 Apr 1996 (KB) Version 2.0 -- Uses Gauss Forward routines for ! interpolation rather than piecewise linear. ! 07 Nov 1996 (KB) Changed interpolation scheme ! !----------------------------------------------------------------------- ! ! INPUT: ! nx Number of model grid points in the x-direction (east/west) ! ny Number of model grid points in the y-direction (north/south) ! nz Number of model grid points in the vertical ! ! ibeg,iend Range of x index to do interpolation ! jbeg,jend Range of y index to do interpolation ! kbeg,kend Range of z index to do interpolation ! ! iorder Interpolation parameter. ! iorder specifies the order of interpolation ! 1 = bi-linear ! 2 = bi-quadratic ! ! x2d x coordinate (m) of interpolation points ! y2d y coordinate (m) of interpolation points ! z z coordinate (m) of interpolation points ! ! vx x coordinate (m) of field to be interpolated ! vy y coordinate (m) of field to be interpolated ! zpver z coordinate (m) of field to be interpolated ! ! iloc I-index of interpolation points in field to be interpolated ! jloc J-index of interpolation points in field to be interpolated ! dxfld Vector of delta-x (m) of field to be interpolated ! dyfld Vector of delta-y (m) of field to be interpolated ! rdxfld Vector of 1./delta-x (1/m) of field to be interpolated ! rdyfld Vector of 1./delta-y (1/m) of field to be interpolated ! ! WORK ARRAYS: ! slopey Piecewise linear df/dy ! alphay Coefficient of y-squared term in y quadratic interpolator ! betay Coefficient of y term in y quadratic interpolator ! ! OUTPUT: ! varint 3-d array of interpolated values ! !----------------------------------------------------------------------- ! IMPLICIT NONE INTEGER :: nx,ny,nz INTEGER :: vnx,vny,vnz INTEGER :: ibeg,iend,jbeg,jend,kstart,kend INTEGER :: ivstart,ivend,jvstart,jvend,kvstart,kvend INTEGER :: iorder REAL :: x2d(nx,ny) REAL :: y2d(nx,ny) REAL :: z(nx,ny,nz) REAL :: var(vnx,vny,vnz) REAL :: vx(vnx) REAL :: vy(vny) REAL :: zpver(nx,ny,vnz) INTEGER :: iloc(nx,ny) INTEGER :: jloc(nx,ny) REAL :: dxfld(vnx) REAL :: dyfld(vny) REAL :: rdxfld(vnx) REAL :: rdyfld(vny) REAL :: slopey(vnx,vny,vnz) REAL :: alphay(vnx,vny,vnz) REAL :: betay(vnx,vny,vnz) REAL :: varint(nx,ny,nz) ! !----------------------------------------------------------------------- ! ! Misc. local variables ! !----------------------------------------------------------------------- ! INTEGER :: i,j,k,kv,kbot,ktop REAL :: wtop,varbot,vartop REAL :: pntint2d ! !@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ ! ! Beginning of executable code... ! !@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ ! !----------------------------------------------------------------------- ! ! Compute derivative terms ! !----------------------------------------------------------------------- ! CALL setdrvy(vnx,vny,vnz, & ivstart,ivend,jvstart,jvend,kvstart,kvend, & dyfld,rdyfld,var, & slopey,alphay,betay) ! !----------------------------------------------------------------------- ! ! Compute interpolated values ! !----------------------------------------------------------------------- ! DO k=kstart,kend DO j=jbeg,jend DO i=ibeg,iend ! !----------------------------------------------------------------------- ! ! Find location in second height array ! Assign linear weight ! !----------------------------------------------------------------------- ! DO kv=kvstart+1,kvend-1 IF(zpver(i,j,kv) > z(i,j,k)) EXIT END DO ! 51 CONTINUE ktop=kv kbot=kv-1 wtop=(z(i,j,k)-zpver(i,j,kbot))/ & (zpver(i,j,ktop)-zpver(i,j,kbot)) varbot=pntint2d(vnx,vny, & ivstart,ivend,jvstart,jvend, & iorder,vx,vy,x2d(i,j),y2d(i,j), & iloc(i,j),jloc(i,j),var(1,1,kbot), & dxfld,dyfld,rdxfld,rdyfld, & slopey(1,1,kbot),alphay(1,1,kbot),betay(1,1,kbot)) vartop=pntint2d(vnx,vny, & ivstart,ivend,jvstart,jvend, & iorder,vx,vy,x2d(i,j),y2d(i,j), & iloc(i,j),jloc(i,j),var(1,1,ktop), & dxfld,dyfld,rdxfld,rdyfld, & slopey(1,1,ktop),alphay(1,1,ktop),betay(1,1,ktop)) varint(i,j,k)=((1.-wtop)*varbot) + (wtop*vartop) END DO END DO END DO RETURN END SUBROUTINE fldint3d ! !################################################################## !################################################################## !###### ###### !###### SUBROUTINE FLDINT2D ###### !###### ###### !###### Developed by ###### !###### Center for Analysis and Prediction of Storms ###### !###### University of Oklahoma ###### !###### ###### !################################################################## !################################################################## ! SUBROUTINE fldint2d(nx,ny,vnx,vny, & 19,1 ibeg,iend,jbeg,jend, & ivstart,ivend,jvstart,jvend, & iorder,x2d,y2d,var,vx,vy,iloc,jloc, & dxfld,dyfld,rdxfld,rdyfld, & slopey,alphay,betay, & varint) ! !----------------------------------------------------------------------- ! ! PURPOSE: ! Interpolate a 2d field for several points 2-dimensions. ! !----------------------------------------------------------------------- ! ! AUTHOR: Keith Brewster CAPS, November, 1996 ! ! MODIFICATION HISTORY: ! !----------------------------------------------------------------------- ! ! INPUT: ! nx Number of model grid points in the x-direction (east/west) ! ny Number of model grid points in the y-direction (north/south) ! ! vnx Number of verif grid points in the x-direction (east/west) ! vny Number of verif grid points in the y-direction (north/south) ! ! ibeg,iend Range of x index to do interpolation ! jbeg,jend Range of y index to do interpolation ! kbeg,kend Range of z index to do interpolation ! ! ivbeg,ivend Range of x index to use in verification array ! jvbeg,jvend Range of y index to use in verification array ! kvbeg,kvend Range of z index to use in verification array ! ! iorder Interpolation parameter. ! iorder specifies the order of interpolation ! 1 = bi-linear ! 2 = bi-quadratic ! ! x2d x coordinate (m) of interpolation points ! y2d y coordinate (m) of interpolation points ! ! var variable to be interpolated ! ! vx x coordinate (m) of field to be interpolated ! vy y coordinate (m) of field to be interpolated ! ! WORK ARRAYS: ! iloc I-index of interpolation points in field to be interpolated ! jloc J-index of interpolation points in field to be interpolated ! dxfld Vector of delta-x (m) of field to be interpolated ! dyfld Vector of delta-y (m) of field to be interpolated ! rdxfld Vector of 1./delta-x (1/m) of field to be interpolated ! rdyfld Vector of 1./delta-y (1/m) of field to be interpolated ! ! slopey Piecewise linear df/dy ! alphay Coefficient of y-squared term in y quadratic interpolator ! betay Coefficient of y term in y quadratic interpolator ! ! OUTPUT ! varint Interpolated data array ! !----------------------------------------------------------------------- ! ! Variable declarations ! !----------------------------------------------------------------------- ! IMPLICIT NONE INTEGER :: nx,ny INTEGER :: vnx,vny INTEGER :: ibeg,iend,jbeg,jend INTEGER :: ivstart,ivend,jvstart,jvend INTEGER :: iorder REAL :: x2d(nx,ny) REAL :: y2d(nx,ny) REAL :: var(vnx,vny) REAL :: vx(vnx) REAL :: vy(vny) INTEGER :: iloc(nx,ny) INTEGER :: jloc(nx,ny) REAL :: dxfld(vnx) REAL :: dyfld(vny) REAL :: rdxfld(vnx) REAL :: rdyfld(vny) REAL :: slopey(vnx,vny) REAL :: alphay(vnx,vny) REAL :: betay(vnx,vny) REAL :: varint(nx,ny) ! !----------------------------------------------------------------------- ! ! Misc. local variables ! !----------------------------------------------------------------------- ! INTEGER :: i,j,ii,jj REAL :: delx,dely REAL :: alpha,beta,rtwodx REAL :: varm1,var00,varp1 ! !@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ ! ! Beginning of executable code... ! !@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ ! !----------------------------------------------------------------------- ! ! Compute y-derivative terms ! !----------------------------------------------------------------------- ! CALL setdrvy(vnx,vny,1, & ivstart,ivend,jvstart,jvend,1,1, & dyfld,rdyfld,var, & slopey,alphay,betay) ! !----------------------------------------------------------------------- ! ! Compute bilinear interpolated value ! !----------------------------------------------------------------------- ! IF(iorder == 1) THEN DO j=jbeg,jend DO i=ibeg,iend ii=MIN(MAX(iloc(i,j),ivstart),(ivend-1)) jj=MIN(MAX(jloc(i,j),jvstart),(jvend-1)) delx=(x2d(i,j)-vx(ii)) dely=(y2d(i,j)-vy(jj)) varint(i,j)=(1.-delx*rdxfld(ii))* & (var(ii ,jj)+slopey(ii ,jj)*dely)+ & (delx*rdxfld(ii))* & (var(ii+1,jj)+slopey(ii+1,jj)*dely) END DO END DO ! !----------------------------------------------------------------------- ! ! Compute biquadratic ! !----------------------------------------------------------------------- ! ELSE DO j=jbeg,jend DO i=ibeg,iend ii=MIN(MAX(iloc(i,j),(ivstart+1)),(ivend-1)) jj=MIN(MAX(jloc(i,j),(jvstart+1)),(jvend-1)) delx=(x2d(i,j)-vx(ii)) dely=(y2d(i,j)-vy(jj)) ! !----------------------------------------------------------------------- ! ! Stencil is ii-1 to ii+1 and jj-1 to jj + 1 ! ! Interpolate in y. ! !----------------------------------------------------------------------- ! varm1=(alphay(ii-1,jj)*dely+betay(ii-1,jj))*dely+var(ii-1,jj) var00=(alphay(ii ,jj)*dely+betay(ii ,jj))*dely+var(ii ,jj) varp1=(alphay(ii+1,jj)*dely+betay(ii+1,jj))*dely+var(ii+1,jj) ! !----------------------------------------------------------------------- ! ! Interpolate intermediate results in x. ! !----------------------------------------------------------------------- ! rtwodx=1./(dxfld(ii-1)+dxfld(ii)) alpha=((varp1-var00)*rdxfld(ii ) + & (varm1-var00)*rdxfld(ii-1))*rtwodx beta=(varp1-var00)*rdxfld(ii) - & dxfld(ii)*alpha varint(i,j)=(alpha*delx+beta)*delx+var00 END DO END DO END IF RETURN END SUBROUTINE fldint2d ! !################################################################## !################################################################## !###### ###### !###### FUNCTION PNTINT2D ###### !###### ###### !###### Developed by ###### !###### Center for Analysis and Prediction of Storms ###### !###### University of Oklahoma ###### !###### ###### !################################################################## !################################################################## ! FUNCTION pntint2d(vnx,vny, & ivbeg,ivend,jvbeg,jvend, & iorder,vx,vy,xpnt,ypnt,iloc,jloc,var, & dxfld,dyfld,rdxfld,rdyfld, & slopey,alphay,betay) ! !----------------------------------------------------------------------- ! ! PURPOSE: ! ! Interpolate a 2-d field for a single point on that plane. ! !----------------------------------------------------------------------- ! ! AUTHOR: Keith Brewster, CAPS, November, 1996 ! ! MODIFICATION HISTORY: ! !----------------------------------------------------------------------- ! ! INPUT: ! vnx Number of model grid points in the x-direction (east/west) ! vny Number of model grid points in the y-direction (north/south) ! ! ivbeg,ivend Range of x index to use in verification array ! jvbeg,jvend Range of y index to use in verification array ! ! iorder Interpolation parameter. ! iorder specifies the order of interpolation ! 1 = bi-linear ! 2 = bi-quadratic ! ! vx x coordinate of verif scalar grid points in physical space (m) ! vy y coordinate of verif scalar grid points in physical space (m) ! ! xpnt x coordinate (m) of interpolation point ! ypnt y coordinate (m) of interpolation point ! ! iloc I-index of interpolation point in field to be interpolated ! jloc J-index of interpolation point in field to be interpolated ! dxfld Vector of delta-x (m) of field to be interpolated ! dyfld Vector of delta-y (m) of field to be interpolated ! rdxfld Vector of 1./delta-x (1/m) of field to be interpolated ! rdyfld Vector of 1./delta-y (1/m) of field to be interpolated ! ! slopey Piecewise linear df/dy ! alphay Coefficient of y-squared term in y quadratic interpolator ! betay Coefficient of y term in y quadratic interpolator ! !----------------------------------------------------------------------- ! IMPLICIT NONE REAL :: pntint2d INTEGER :: vnx,vny INTEGER :: ivbeg,ivend,jvbeg,jvend INTEGER :: iorder REAL :: vx(vnx) REAL :: vy(vny) REAL :: xpnt REAL :: ypnt INTEGER :: iloc INTEGER :: jloc REAL :: var(vnx,vny) REAL :: dxfld(vnx) REAL :: dyfld(vny) REAL :: rdxfld(vnx) REAL :: rdyfld(vny) REAL :: slopey(vnx,vny) REAL :: alphay(vnx,vny) REAL :: betay(vnx,vny) ! !----------------------------------------------------------------------- ! ! Misc. local variables ! !----------------------------------------------------------------------- ! INTEGER :: ii,jj REAL :: delx,dely REAL :: alpha,beta,rtwodx REAL :: varm1,var00,varp1 REAL :: varint ! !@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ ! ! Beginning of executable code... ! !@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ ! !----------------------------------------------------------------------- ! ! Compute bilinear interpolated value ! !----------------------------------------------------------------------- ! IF(iorder == 1) THEN ii=MIN(MAX(iloc,ivbeg),(ivend-1)) jj=MIN(MAX(jloc,jvbeg),(jvend-1)) delx=(xpnt-vx(ii)) dely=(ypnt-vy(jj)) varint=(1.-delx*rdxfld(ii))* & (var(ii ,jj)+slopey(ii ,jj)*dely)+ & (delx*rdxfld(ii))* & (var(ii+1,jj)+slopey(ii+1,jj)*dely) ! !----------------------------------------------------------------------- ! ! Compute biquadratic ! !----------------------------------------------------------------------- ! ELSE ii=MIN(MAX(iloc,(ivbeg+1)),(ivend-1)) jj=MIN(MAX(jloc,(jvbeg+1)),(jvend-1)) delx=(xpnt-vx(ii)) dely=(ypnt-vy(jj)) ! !----------------------------------------------------------------------- ! ! Stencil is ii-1 to ii+1 and jj-1 to jj + 1 ! ! Interpolate in y. ! !----------------------------------------------------------------------- ! varm1=(alphay(ii-1,jj)*dely+betay(ii-1,jj))*dely+var(ii-1,jj) var00=(alphay(ii ,jj)*dely+betay(ii ,jj))*dely+var(ii ,jj) varp1=(alphay(ii+1,jj)*dely+betay(ii+1,jj))*dely+var(ii+1,jj) ! !----------------------------------------------------------------------- ! ! Interpolate intermediate results in x. ! !----------------------------------------------------------------------- ! rtwodx=1./(dxfld(ii-1)+dxfld(ii)) alpha=((varp1-var00)*rdxfld(ii ) + & (varm1-var00)*rdxfld(ii-1))*rtwodx beta=(varp1-var00)*rdxfld(ii) - & dxfld(ii)*alpha varint=(alpha*delx+beta)*delx+var00 END IF pntint2d=varint RETURN END FUNCTION pntint2d ! !################################################################## !################################################################## !###### ###### !###### SUBROUTINE SETIJLOC ###### !###### ###### !###### Developed by ###### !###### Center for Analysis and Prediction of Storms ###### !###### University of Oklahoma ###### !###### ###### !################################################################## !################################################################## ! SUBROUTINE setijloc(nx,ny,nx_ext,ny_ext, & 9 x2d,y2d,x_ext,y_ext,iloc,jloc) ! !----------------------------------------------------------------------- ! ! PURPOSE: ! Find i,j indices in verfication grid of each forecast point ! !----------------------------------------------------------------------- ! ! AUTHOR: Keith Brewster OU School of Meteorology. Feb 1992 ! ! MODIFICATION HISTORY: ! !----------------------------------------------------------------------- ! ! INPUT: ! nx Number of model grid points in the x-direction (east/west) ! ny Number of model grid points in the y-direction (north/south) ! ! nx_ext Number of external grid pts in the x-direction (east/west) ! ny_ext Number of external grid pts in the y-direction (north/south) ! ! x2d x coordinate (m) of interpolation points ! y2d y coordinate (m) of interpolation points ! ! x_ext x-coordinate (m) of external grid pts ! y_ext y-coordinate (m) of external grid pts ! ! OUTPUT: ! ! iloc i-index of interpolation points in field to be interpolated ! jloc j-index of interpolation points in field to be interpolated ! !----------------------------------------------------------------------- ! IMPLICIT NONE INTEGER :: nx,ny,nx_ext,ny_ext REAL :: x2d(nx,ny) REAL :: y2d(nx,ny) REAL :: x_ext(nx_ext) REAL :: y_ext(ny_ext) INTEGER :: iloc(nx,ny) INTEGER :: jloc(nx,ny) ! !----------------------------------------------------------------------- ! ! Misc. local variables ! !----------------------------------------------------------------------- ! INTEGER :: i,j,i_ext,j_ext INTEGER :: imid,jmid REAL :: xmid,ymid ! !@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ ! ! Beginning of executable code... ! !@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ ! imid=nx_ext/2 xmid=x_ext(imid) jmid=ny_ext/2 ymid=y_ext(jmid) ! DO j=1,ny DO i=1,nx IF(x2d(i,j) < xmid) THEN DO i_ext=imid,2,-1 IF(x_ext(i_ext) <= x2d(i,j)) EXIT END DO iloc(i,j)=i_ext ELSE DO i_ext=imid,nx_ext-1 IF(x_ext(i_ext) >= x2d(i,j)) EXIT END DO iloc(i,j)=i_ext-1 END IF ! IF(y2d(i,j) < ymid) THEN DO j_ext=jmid,2,-1 IF(y_ext(j_ext) <= y2d(i,j)) EXIT END DO jloc(i,j)=j_ext ELSE DO j_ext=jmid,ny_ext-1 IF(y_ext(j_ext) >= y2d(i,j)) EXIT END DO jloc(i,j)=j_ext-1 END IF END DO END DO RETURN END SUBROUTINE setijloc ! !################################################################## !################################################################## !###### ###### !###### SUBROUTINE SETDXDY ###### !###### ###### !###### Developed by ###### !###### Center for Analysis and Prediction of Storms ###### !###### University of Oklahoma ###### !###### ###### !################################################################## !################################################################## ! SUBROUTINE setdxdy(nx,ny, & 9 ibeg,iend,jbeg,jend, & x1d,y1d,dxfld,dyfld,rdxfld,rdyfld) ! !----------------------------------------------------------------------- ! ! PURPOSE: ! Calculate the local delta-x, delta-y and their inverses. ! Precalculating these variables speeds up later calculations. ! !----------------------------------------------------------------------- ! ! AUTHOR: Keith Brewster, CAPS, November, 1996 ! ! MODIFICATION HISTORY: ! !----------------------------------------------------------------------- ! ! INPUT: ! nx Number of model grid points in the x-direction (east/west) ! ny Number of model grid points in the y-direction (north/south) ! ! ibeg,iend Range of x index to do interpolation ! jbeg,jend Range of y index to do interpolation ! ! x1d Array of x-coordinate grid locations (m) ! y1d Array of y-coordinate grid locations (m) ! ! OUTPUT: ! dxfld Vector of delta-x (m) of field to be interpolated ! dyfld Vector of delta-y (m) of field to be interpolated ! rdxfld Vector of 1./delta-x (1/m) of field to be interpolated ! rdyfld Vector of 1./delta-y (1/m) of field to be interpolated ! !----------------------------------------------------------------------- ! IMPLICIT NONE INTEGER :: nx,ny INTEGER :: ibeg,iend INTEGER :: jbeg,jend REAL :: x1d(nx) REAL :: y1d(ny) REAL :: dxfld(nx) REAL :: dyfld(ny) REAL :: rdxfld(nx) REAL :: rdyfld(ny) ! !----------------------------------------------------------------------- ! ! Misc. local variables ! !----------------------------------------------------------------------- ! INTEGER :: i,j,istop,jstop ! !@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ ! ! Beginning of executable code... ! !@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ ! istop=MIN((iend-1),(nx-1)) DO i=ibeg,istop dxfld(i)=(x1d(i+1)-x1d(i)) rdxfld(i)=1./(x1d(i+1)-x1d(i)) END DO jstop=MIN((jend-1),(ny-1)) DO j=jbeg,jstop dyfld(j)=(y1d(j+1)-y1d(j)) rdyfld(j)=1./(y1d(j+1)-y1d(j)) END DO RETURN END SUBROUTINE setdxdy ! !################################################################## !################################################################## !###### ###### !###### SUBROUTINE SETDRVY ###### !###### ###### !###### Developed by ###### !###### Center for Analysis and Prediction of Storms ###### !###### University of Oklahoma ###### !###### ###### !################################################################## !################################################################## ! SUBROUTINE setdrvy(nx,ny,nz, & 11 ibeg,iend,jbeg,jend,kbeg,kend, & dyfld,rdyfld,var, & slopey,alphay,betay) ! !----------------------------------------------------------------------- ! ! PURPOSE: ! Calculate the coefficients of interpolating polynomials ! in the y-direction. ! !----------------------------------------------------------------------- ! ! AUTHOR: Keith Brewster, CAPS, November, 1996 ! ! MODIFICATION HISTORY: ! !----------------------------------------------------------------------- ! ! INPUT: ! nx Number of model grid points in the x-direction (east/west) ! ny Number of model grid points in the y-direction (north/south) ! nz Number of model grid points in the vertical ! ! ibeg,iend Range of x index to do interpolation ! jbeg,jend Range of y index to do interpolation ! kbeg,kend Range of z index to do interpolation ! ! dyfld Vector of delta-y (m) of field to be interpolated ! rdyfld Vector of 1./delta-y (1/m) of field to be interpolated ! ! var variable to be interpolated ! ! slopey Piecewise linear df/dy ! alphay Coefficient of y-squared term in y quadratic interpolator ! betay Coefficient of y term in y quadratic interpolator ! !----------------------------------------------------------------------- ! IMPLICIT NONE INTEGER :: nx,ny,nz INTEGER :: ibeg,iend,jbeg,jend,kbeg,kend REAL :: dyfld(ny) REAL :: rdyfld(ny) REAL :: var(nx,ny,nz) REAL :: slopey(nx,ny,nz) REAL :: alphay(nx,ny,nz) REAL :: betay(nx,ny,nz) ! !----------------------------------------------------------------------- ! ! Misc. local variables ! !----------------------------------------------------------------------- ! INTEGER :: i,j,k INTEGER :: jstart,jstop REAL :: rtwody ! !@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ ! ! Beginning of executable code... ! !@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ ! jstart=MAX(jbeg,2) jstop=MIN((jend-1),(ny-2)) DO k=kbeg,kend DO j=jstart,jstop DO i=ibeg,iend slopey(i,j,k)=(var(i,j+1,k)-var(i,j,k))*rdyfld(j) rtwody=1./(dyfld(j-1)+dyfld(j)) alphay(i,j,k)=((var(i,j+1,k)-var(i,j,k))*rdyfld(j) + & (var(i,j-1,k)-var(i,j,k))*rdyfld(j-1))*rtwody betay(i,j,k)=(var(i,j+1,k)-var(i,j,k))*rdyfld(j) - & dyfld(j)*alphay(i,j,k) END DO END DO END DO RETURN END SUBROUTINE setdrvy