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