C $Header: /u/gcmpack/MITgcm/pkg/flt/flt_mapping.F,v 1.5 2017/02/11 21:07:13 gforget Exp $ C $Name: $ #include "FLT_OPTIONS.h" C-- Contents C-- o FLT_MAP_XY2IJLOCAL C-- o FLT_MAP_IJLOCAL2XY C-- o FLT_MAP_R2K (Function) C-- o FLT_MAP_K2R (Function) C---+----1----+----2----+----3----+----4----+----5----+----6----+----7-|--+----| SUBROUTINE FLT_MAP_XY2IJLOCAL( O ix, jy, I xx, yy, bi, bj, myThid ) C ================================================================== C SUBROUTINE FLT_MAP_XY2IJLOCAL C ================================================================== C o Converts global x,y-coordinates (grid) to corresponding C local fractional horizontal indices for specific tile C Range: [1/2 , sNx+1/2] , [1/2 , sNy+1/2] C Center (Tracer Pt) <-> integer , integer C U-velocity Pt <-> half integer , integer C V-velocity Pt <-> integer , half integer C Vorticity Pt <-> half integer , half integer C ================================================================== C !USES: IMPLICIT NONE C == global variables == #include "SIZE.h" #include "EEPARAMS.h" #include "GRID.h" #include "PARAMS.h" C == routine arguments == _RL ix, jy _RL xx, yy INTEGER bi, bj, myThid C == local variables == _RL fm, dist INTEGER i, j C == end of interface == IF ( usingCartesianGrid .OR. & usingSphericalPolarGrid .AND. .NOT.rotateGrid & ) THEN ix = -1. _d 0 jy = -1. _d 0 j = 1 DO i=0,sNx+1 IF ( ix.EQ.-1. _d 0 ) THEN IF ( xG(i,j,bi,bj).LE.xx .AND. xx.LT.xG(i+1,j,bi,bj) ) THEN dist = xG(i+1,j,bi,bj) - xG(i,j,bi,bj) fm = ( xx - xG(i,j,bi,bj) ) / dist ix = DFLOAT(i)+fm-0.5 _d 0 ENDIF ENDIF ENDDO i = 1 DO j=0,sNy+1 IF ( jy.EQ.-1. _d 0 ) THEN IF ( yG(i,j,bi,bj).LE.yy .AND. yy.LT.yG(i,j+1,bi,bj) ) THEN dist = yG(i,j+1,bi,bj) - yG(i,j,bi,bj) fm = ( yy - yG(i,j,bi,bj) ) / dist jy = DFLOAT(j)+fm-0.5 _d 0 ENDIF ENDIF ENDDO ELSE STOP 'FLT_MAP_XY2IJLOCAL: not yet coded for this grid' ENDIF RETURN END
C---+----1----+----2----+----3----+----4----+----5----+----6----+----7-|--+----| SUBROUTINE FLT_MAP_IJLOCAL2XY( O xx, yy, I ix, jy, bi, bj, myThid ) C ================================================================== C SUBROUTINE FLT_MAP_IJLOCAL2XY C ================================================================== C o Converts local fractional horizontal indices for specific tile C to corresponding global x,y-coordinates (grid) C Range: [1/2 , sNx+1/2] , [1/2 , sNy+1/2] C Center (Tracer Pt) <-> integer , integer C U-velocity Pt <-> half integer , integer C V-velocity Pt <-> integer , half integer C Vorticity Pt <-> half integer , half integer C ================================================================== C !USES: IMPLICIT NONE C == global variables == #include "SIZE.h" #include "EEPARAMS.h" #include "GRID.h" #include "PARAMS.h" C == routine arguments == _RL xx, yy _RL ix, jy INTEGER bi, bj, myThid C == local variables == _RL ddx, ddy INTEGER i, j #ifdef DEVEL_FLT_EXCH2 _RL xx_ij,xx_ip1j,xx_ijp1,xx_ip1jp1 #endif C == end of interface == IF ( usingCartesianGrid .OR. & usingSphericalPolarGrid .AND. .NOT.rotateGrid & ) THEN i = NINT(ix) j = NINT(jy) ddx = 0.5 _d 0 + ix - DFLOAT(i) ddy = 0.5 _d 0 + jy - DFLOAT(j) xx = xG(i,j,bi,bj) + ddx*( xG(i+1,j,bi,bj) - xG(i,j,bi,bj) ) yy = yG(i,j,bi,bj) + ddy*( yG(i,j+1,bi,bj) - yG(i,j,bi,bj) ) ELSEIF ( usingCurvilinearGrid ) THEN i = NINT(ix) j = NINT(jy) ddx = 0.5 _d 0 + ix - DFLOAT(i) ddy = 0.5 _d 0 + jy - DFLOAT(j) C bilinear interpolation within grid cell (should use arcs instead?) xx = xG(i,j,bi,bj) + ddx*( xG(i+1,j,bi,bj) - xG(i,j,bi,bj) ) & + ddy*( xG(i,j+1,bi,bj) - xG(i,j,bi,bj) ) & + ddx*ddy*( xG(i+1,j+1,bi,bj) - xG(i+1,j,bi,bj) & - xG(i,j+1,bi,bj) + xG(i,j,bi,bj) ) yy = yG(i,j,bi,bj) + ddx*( yG(i+1,j,bi,bj) - yG(i,j,bi,bj) ) & + ddy*( yG(i,j+1,bi,bj) - yG(i,j,bi,bj) ) & + ddx*ddy*( yG(i+1,j+1,bi,bj) - yG(i+1,j,bi,bj) & - yG(i,j+1,bi,bj) + yG(i,j,bi,bj) ) #ifdef DEVEL_FLT_EXCH2 xx_ij=xG(i,j,bi,bj) xx_ip1j=xG(i+1,j,bi,bj) xx_ijp1=xG(i,j+1,bi,bj) xx_ip1jp1=xG(i+1,j+1,bi,bj) if (xx_ip1j.GT.xx_ij+180) xx_ip1j=xx_ip1j-360 if (xx_ip1j.LT.xx_ij-180) xx_ip1j=xx_ip1j+360 if (xx_ijp1.GT.xx_ij+180) xx_ijp1=xx_ijp1-360 if (xx_ijp1.LT.xx_ij-180) xx_ijp1=xx_ijp1+360 if (xx_ip1jp1.GT.xx_ij+180) xx_ip1jp1=xx_ip1jp1-360 if (xx_ip1jp1.LT.xx_ij-180) xx_ip1jp1=xx_ip1jp1+360 xx = xx_ij + ddx*( xx_ip1j - xx_ij ) & + ddy*( xx_ijp1 - xx_ij ) & + ddx*ddy*( xx_ip1jp1 - xx_ip1j - xx_ijp1 + xx_ij ) #endif ELSE STOP 'FLT_MAP_IJLOCAL2XY: not yet coded for this grid' ENDIF RETURN END
C---+----1----+----2----+----3----+----4----+----5----+----6----+----7-|--+----| _RL FUNCTION FLT_MAP_R2K( I rr, bi, bj, myThid ) C ================================================================== C FUNCTION FLT_MAP_R2K C ================================================================== C o Converts r-coordinate (grid) to corresponding C fractional vertical index C Range: [1/2 , Nr+1/2], C Center (Tracer Pt) <-> integer C Interface (wVel Pt) <-> half integer C ================================================================== C !USES: IMPLICIT NONE C == global variables == #include "SIZE.h" #include "EEPARAMS.h" #include "GRID.h" C == routine arguments == _RL rr INTEGER bi, bj, myThid C == local variables == _RL fm INTEGER k C == end of interface == FLT_MAP_R2K = 0. _d 0 DO k=1,Nr IF ( FLT_MAP_R2K .EQ. 0. _d 0 ) THEN C- r decreases when k increases (rkSign < 0): IF ( rF(k) .GE. rr .AND. rr.GT.rF(k+1) ) THEN fm = ( rr - rF(k) ) * recip_drF(k)*rkSign FLT_MAP_R2K = DFLOAT(k)+fm-0.5 _d 0 ENDIF ENDIF ENDDO RETURN END
C---+----1----+----2----+----3----+----4----+----5----+----6----+----7-|--+----| _RL FUNCTION FLT_MAP_K2R( I kr, bi, bj, myThid ) C ================================================================== C FUNCTION FLT_MAP_K2R C ================================================================== C o Converts fractional vertical index to corresponding C r-coordinate (grid) C Range: [1/2 , Nr+1/2], C Center (Tracer Pt) <-> integer C Interface (wVel Pt) <-> half integer C ================================================================== C !USES: IMPLICIT NONE C == global variables == #include "SIZE.h" #include "EEPARAMS.h" #include "GRID.h" C == routine arguments == _RL kr INTEGER bi, bj, myThid C == local variables == _RL ddz INTEGER k C == end of interface == k = NINT(kr) IF ( k.LT.1 ) THEN FLT_MAP_K2R = rF(1) ELSEIF ( k.GT.Nr ) THEN FLT_MAP_K2R = rF(Nr+1) ELSE ddz = 0.5 _d 0 + kr - DFLOAT(k) FLT_MAP_K2R = rF(k) + ddz*drF(k)*rkSign ENDIF RETURN END