GRID2INDX,
PNTS2INDX with optional SPHER1,
SPHER2 spheroid arguments for computing bilinear
interpolation indices and coefficients; single-layer and multi-layer
OpenMP parallel bilinear-matrix multiplication routine
INDXMULT:
SUBROUTINE GRID2INDX( GDTYP1, P_ALP1, P_BET1, P_GAM1, XCENT1, YCENT1, &
GDTYP2, P_ALP2, P_BET2, P_GAM2, XCENT2, YCENT2, &
NCOLS1, NROWS1, XORIG1, YORIG1, XCELL1, YCELL1, &
NCOLS2, NROWS2, XORIG2, YORIG2, XCELL2, YCELL2, &
IX2, PX2, PY2 )
SUBROUTINE GRID2INDX( GDTYP1, P_ALP1, P_BET1, P_GAM1, XCENT1, YCENT1, SPHER1, &
GDTYP2, P_ALP2, P_BET2, P_GAM2, XCENT2, YCENT2, SPHER2, &
NCOLS1, NROWS1, XORIG1, YORIG1, XCELL1, YCELL1, &
NCOLS2, NROWS2, XORIG2, YORIG2, XCELL2, YCELL2, &
IX2, PX2, PY2 )
INTEGER, INTENT(IN ) :: GDTYP1, GDTYP2
INTEGER, INTENT(IN ) :: NCOLS2, NROWS2
REAL*8 , INTENT(IN ) :: SPHER1, SPHER2 !! input, output spheres
REAL*8 , INTENT(IN ) :: P_ALP1, P_BET1, P_GAM1, XCENT1, YCENT1
REAL*8 , INTENT(IN ) :: P_ALP2, P_BET2, P_GAM2, XCENT2, YCENT2
REAL*8 , INTENT(IN ) :: XORIG2, YORIG2, XCELL2, YCELL2
INTEGER, INTENT( OUT) :: IX2( NPNTS2 )
REAL , INTENT( OUT) :: PX2( NPNTS2 )
REAL , INTENT( OUT) :: PY2( NPNTS2 )
SUBROUTINE PNTS2INDX( GDTYP1, P_ALP1, P_BET1, P_GAM1, XCENT1, YCENT1, &
GDTYP2, P_ALP2, P_BET2, P_GAM2, XCENT2, YCENT2, &
NCOLS1, NROWS1, XORIG1, YORIG1, XCELL1, YCELL1, &
NPNTS2, XPNTS2, YPNTS2, &
IX2, PX2, PY2 )
SUBROUTINE PNTS2INDX( GDTYP1, P_ALP1, P_BET1, P_GAM1, XCENT1, YCENT1, SPHER1, &
GDTYP2, P_ALP2, P_BET2, P_GAM2, XCENT2, YCENT2, SPHER2, &
NCOLS1, NROWS1, XORIG1, YORIG1, XCELL1, YCELL1, &
NPNTS2, XPNTS2, YPNTS2, &
IX2, PX2, PY2 )
INTEGER, INTENT(IN ) :: GDTYP1, GDTYP2
INTEGER, INTENT(IN ) :: NCOLS1, NROWS1, NPNTS2
REAL*8 , INTENT(IN ) :: SPHER1, SPHER2 !! input, output spheres
REAL*8 , INTENT(IN ) :: P_ALP1, P_BET1, P_GAM1, XCENT1, YCENT1
REAL*8 , INTENT(IN ) :: P_ALP2, P_BET2, P_GAM2, XCENT2, YCENT2
REAL*8 , INTENT(IN ) :: XORIG1, YORIG1, XCELL1, YCELL1
REAL*8 , INTENT(IN ) :: XPNTS2( NPNTS2 ), YPNTS2( NPNTS2 ) YCENT2
REAL*8 , INTENT(IN ) :: XORIG2, YORIG2, XCELL2, YCELL2
INTEGER, INTENT( OUT) :: IX2( NPNTS2 )
REAL , INTENT( OUT) :: PX2( NPNTS2 )
REAL , INTENT( OUT) :: PY2( NPNTS2 )
SUBROUTINE INDXMULT( NSIZE1, NCOLS2, NROWS2, &
IX1, PX1, PY1, GR1, GR2 )
SUBROUTINE INDXMULT( NSIZE1, NLAYS, NCOLS2, NROWS2, &
IX1, PX1, PY1, GR3, GR4 )
SUBROUTINE INDXMULT( NCOLS1, NROWS1, NLAYS, NCOLS2, NROWS2, &
IX5, PX5, PY5, GR5, GR6 )
INTEGER, INTENT(IN ) :: NSIZE1
INTEGER, INTENT(IN ) :: NLAYS
INTEGER, INTENT(IN ) :: NCOLS2, NROWS2
INTEGER, INTENT(IN ) :: IX1( NSIZE1 )
REAL , INTENT(IN ) :: PX1( NSIZE1 )
REAL , INTENT(IN ) :: PY1( NSIZE1 )
INTEGER, INTENT(IN ) :: IX5( NCOLS1*NROWS1 )
REAL , INTENT(IN ) :: PX5( NCOLS1*NROWS1 )
REAL , INTENT(IN ) :: PY5( NCOLS1*NROWS1 )
REAL , INTENT( OUT) :: GR1( NSIZE1 ) !! single-indexed 1-D or 2-D
REAL , INTENT(IN ) :: GR2( NCOLS2*NROWS2 )
REAL , INTENT( OUT) :: GR3( NSIZE1,NLAYS )
REAL , INTENT(IN ) :: GR4( NCOLS2*NROWS2,NLAYS ) !! single-indexed layered
REAL , INTENT( OUT) :: GR5( NCOLS1,NROWS1,NLAYS )
REAL , INTENT(IN ) :: GR6( NCOLS2,NROWS2,NLAYS ) !! double-indexed 3-D layered
Compute single-indexed, single-indexed-layered,
double-indexed-layered (3-D-gridded) array subscript IX
and bilinear interpolation fractions PX, PY for GRID2
nodes or array of point-locations relative to GRID1 using USGS
GCTP-package routine GTPZ0(), and use them for bilinear
interpolation.
Whenever the requested points lie outside the data-grid, the interpolation will use the nearest boundary cell of the data-grid to determine the output value (i.e., the interpolation uses "extend-by-constant" outside GRID1.
Use routine INITSPHERES() (controlled by environment
variable IOAPI_ISPH) to determine the spheroid used by
the map projections,
NOTE: The GRID1-vs-GRID2 issue for GRID2INDX() and
PNTS2INDX() is "backward" to the naive
intuition: to interpolate data-grids from GRID1 to GRID2, one needs
to compute the locations of GRID2-nodes relative to the GRID1
coordinate-and-grid system—a coordinate transformation in the
reverse of the direction of the data-interpolation.
MODULE MODGCTP..
USE MODGCTGP
CALL INITSPHERES() or CALL SETSPHERE()
before using.
and from GRID2 to GRID1,
as indicated below, or see m3tools program
mcple for a full-program example.
...
INTEGER GDTYP1 !! parameters for output coordinate system
REAL*8 P_ALP1
REAL*8 P_BET1
REAL*8 P_GAM1
REAL*8 XCENT1
REAL*8 YCENT1
INTEGER NCOLS1
INTEGER NROWS1
INTEGER NLAYS1
INTEGER GDTYP2 !! parameters for input grid and coord system
INTEGER NCOLS2
INTEGER NROWS2
INTEGER NTHIK2
REAL*8 P_ALP2
REAL*8 P_BET2
REAL*8 P_GAM2
REAL*8 XCENT2
REAL*8 YCENT2
REAL*8 XORIG2
REAL*8 YORIG2
REAL*8 XCELL2
REAL*8 YCELL2
...
INTEGER IX2( NCOLS2*NROWS2 )
REAL*8 PX2( NCOLS2*NROWS2 )
REAL*8 PY2( NCOLS2*NROWS2 )
...
REAL*8 TVALS1( NCOLS1*NROWS1 )
REAL*8 TVALS2( NCOLS2*NROWS2 )
REAL*8 ZVALS1( NCOLS1,NROWS1,NLAYS1 )
REAL*8 ZVALS2( NCOLS2,NROWS2,NLAYS1 )
...
CALL GRID2INDX( GDTYP1, P_ALP1, P_BET1, P_GAM1, XCENT1, YCENT1, &
GDTYP2, P_ALP2, P_BET2, P_GAM2, XCENT2, YCENT2, &
NCOLS1, NROWS1, XORIG1, YORIG1, XCELL1, YCELL1, &
NCOLS2, NROWS2, XORIG2, YORIG2, XCELL2, YCELL2, &
IX2, PX2, PY2 )
...
CALL INDXMULT( NCOLS1*NROWS1, NCOLS2, NROWS2, IX1, PX1, PY1, TVALS1, TVALS2 )
...
CALL INDXMULT( NCOLS1, NROWS1, NLAYS1, NCOLS2, NROWS2, IX1, PX1, PY1, ZVALS1, ZVALS2 )
...
See also:
Up: Coordinate and Grid Related Routines
To: Models-3/EDSS I/O API: The Help Pages