Back to home page

MITgcm

 
 

    


File indexing completed on 2020-01-15 06:10:57 UTC

view on githubraw file Latest commit 15f808dc on 2019-09-13 16:02:45 UTC
9bba4c8337 Jean*0001 #include "FLT_OPTIONS.h"
                0002 
                0003 C--   Contents
                0004 C--   o FLT_MAP_XY2IJLOCAL
                0005 C--   o FLT_MAP_IJLOCAL2XY
                0006 C--   o FLT_MAP_R2K  (Function)
                0007 C--   o FLT_MAP_K2R  (Function)
                0008 
                0009 C---+----1----+----2----+----3----+----4----+----5----+----6----+----7-|--+----|
                0010 
                0011       SUBROUTINE FLT_MAP_XY2IJLOCAL(
                0012      O                               ix, jy,
                0013      I                               xx, yy, bi, bj, myThid )
                0014 
                0015 C     ==================================================================
                0016 C     SUBROUTINE FLT_MAP_XY2IJLOCAL
                0017 C     ==================================================================
                0018 C     o Converts global x,y-coordinates (grid) to corresponding
                0019 C       local fractional horizontal indices for specific tile
                0020 C     Range: [1/2 , sNx+1/2] , [1/2 , sNy+1/2]
                0021 C           Center  (Tracer Pt) <-> integer , integer
                0022 C           U-velocity Pt <-> half integer , integer
                0023 C           V-velocity Pt <-> integer , half integer
                0024 C           Vorticity  Pt <-> half integer , half integer
                0025 C     ==================================================================
                0026 
                0027 C     !USES:
                0028       IMPLICIT NONE
                0029 
                0030 C     == global variables ==
                0031 #include "SIZE.h"
                0032 #include "EEPARAMS.h"
                0033 #include "GRID.h"
                0034 #include "PARAMS.h"
                0035 
                0036 C     == routine arguments ==
                0037       _RL ix, jy
                0038       _RL xx, yy
                0039       INTEGER bi, bj, myThid
                0040 
                0041 C     == local variables ==
                0042       _RL fm, dist
                0043       INTEGER i, j
                0044 
                0045 C     == end of interface ==
                0046 
                0047       IF ( usingCartesianGrid .OR.
                0048      &     usingSphericalPolarGrid .AND. .NOT.rotateGrid
                0049      &   ) THEN
                0050 
                0051         ix = -1. _d 0
                0052         jy = -1. _d 0
                0053 
                0054         j = 1
                0055         DO i=0,sNx+1
                0056           IF ( ix.EQ.-1. _d 0 ) THEN
                0057            IF ( xG(i,j,bi,bj).LE.xx .AND. xx.LT.xG(i+1,j,bi,bj) ) THEN
                0058              dist = xG(i+1,j,bi,bj) - xG(i,j,bi,bj)
6d901ff2ff Jean*0059              fm = ( xx - xG(i,j,bi,bj) ) / dist
9bba4c8337 Jean*0060              ix = DFLOAT(i)+fm-0.5 _d 0
                0061            ENDIF
                0062           ENDIF
                0063         ENDDO
                0064 
                0065         i = 1
                0066         DO j=0,sNy+1
                0067           IF ( jy.EQ.-1. _d 0 ) THEN
                0068            IF ( yG(i,j,bi,bj).LE.yy .AND. yy.LT.yG(i,j+1,bi,bj) ) THEN
                0069              dist = yG(i,j+1,bi,bj) - yG(i,j,bi,bj)
6d901ff2ff Jean*0070              fm = ( yy - yG(i,j,bi,bj) ) / dist
9bba4c8337 Jean*0071              jy = DFLOAT(j)+fm-0.5 _d 0
                0072            ENDIF
                0073           ENDIF
                0074         ENDDO
                0075 
                0076       ELSE
                0077         STOP 'FLT_MAP_XY2IJLOCAL: not yet coded for this grid'
                0078       ENDIF
                0079 
                0080       RETURN
                0081       END
                0082 
                0083 C---+----1----+----2----+----3----+----4----+----5----+----6----+----7-|--+----|
                0084 
                0085       SUBROUTINE FLT_MAP_IJLOCAL2XY(
                0086      O                               xx, yy,
                0087      I                               ix, jy, bi, bj, myThid )
                0088 
                0089 C     ==================================================================
                0090 C     SUBROUTINE FLT_MAP_IJLOCAL2XY
                0091 C     ==================================================================
                0092 C     o Converts local fractional horizontal indices for specific tile
                0093 C       to corresponding global x,y-coordinates (grid)
                0094 C     Range: [1/2 , sNx+1/2] , [1/2 , sNy+1/2]
                0095 C           Center  (Tracer Pt) <-> integer , integer
                0096 C           U-velocity Pt <-> half integer , integer
                0097 C           V-velocity Pt <-> integer , half integer
                0098 C           Vorticity  Pt <-> half integer , half integer
                0099 C     ==================================================================
                0100 
                0101 C     !USES:
                0102       IMPLICIT NONE
                0103 
                0104 C     == global variables ==
                0105 #include "SIZE.h"
                0106 #include "EEPARAMS.h"
                0107 #include "GRID.h"
                0108 #include "PARAMS.h"
                0109 
                0110 C     == routine arguments ==
                0111       _RL xx, yy
                0112       _RL ix, jy
                0113       INTEGER bi, bj, myThid
                0114 
                0115 C     == local variables ==
                0116       _RL ddx, ddy
                0117       INTEGER i, j
f5995a4aae Gael*0118       _RL xx_ij,xx_ip1j,xx_ijp1,xx_ip1jp1
9bba4c8337 Jean*0119 
                0120 C     == end of interface ==
                0121 
                0122       IF ( usingCartesianGrid .OR.
                0123      &     usingSphericalPolarGrid .AND. .NOT.rotateGrid
                0124      &   ) THEN
                0125 
                0126         i = NINT(ix)
                0127         j = NINT(jy)
                0128         ddx = 0.5 _d 0 + ix - DFLOAT(i)
                0129         ddy = 0.5 _d 0 + jy - DFLOAT(j)
                0130 
                0131         xx = xG(i,j,bi,bj) + ddx*( xG(i+1,j,bi,bj) - xG(i,j,bi,bj) )
                0132         yy = yG(i,j,bi,bj) + ddy*( yG(i,j+1,bi,bj) - yG(i,j,bi,bj) )
                0133 
59649fe591 Oliv*0134       ELSEIF ( usingCurvilinearGrid ) THEN
                0135 
                0136         i = NINT(ix)
                0137         j = NINT(jy)
                0138         ddx = 0.5 _d 0 + ix - DFLOAT(i)
                0139         ddy = 0.5 _d 0 + jy - DFLOAT(j)
                0140 
                0141 C       bilinear interpolation within grid cell (should use arcs instead?)
                0142         xx = xG(i,j,bi,bj) + ddx*( xG(i+1,j,bi,bj) - xG(i,j,bi,bj) )
                0143      &                     + ddy*( xG(i,j+1,bi,bj) - xG(i,j,bi,bj) )
                0144      &                 + ddx*ddy*( xG(i+1,j+1,bi,bj) - xG(i+1,j,bi,bj)
                0145      &                           - xG(i,j+1,bi,bj) + xG(i,j,bi,bj) )
                0146         yy = yG(i,j,bi,bj) + ddx*( yG(i+1,j,bi,bj) - yG(i,j,bi,bj) )
                0147      &                     + ddy*( yG(i,j+1,bi,bj) - yG(i,j,bi,bj) )
                0148      &                 + ddx*ddy*( yG(i+1,j+1,bi,bj) - yG(i+1,j,bi,bj)
                0149      &                           - yG(i,j+1,bi,bj) + yG(i,j,bi,bj) )
                0150 
f5995a4aae Gael*0151         xx_ij=xG(i,j,bi,bj)
                0152         xx_ip1j=xG(i+1,j,bi,bj)
                0153         xx_ijp1=xG(i,j+1,bi,bj)
                0154         xx_ip1jp1=xG(i+1,j+1,bi,bj)
                0155         if (xx_ip1j.GT.xx_ij+180) xx_ip1j=xx_ip1j-360
                0156         if (xx_ip1j.LT.xx_ij-180) xx_ip1j=xx_ip1j+360
                0157         if (xx_ijp1.GT.xx_ij+180) xx_ijp1=xx_ijp1-360
                0158         if (xx_ijp1.LT.xx_ij-180) xx_ijp1=xx_ijp1+360
                0159         if (xx_ip1jp1.GT.xx_ij+180) xx_ip1jp1=xx_ip1jp1-360
                0160         if (xx_ip1jp1.LT.xx_ij-180) xx_ip1jp1=xx_ip1jp1+360
                0161         xx = xx_ij + ddx*( xx_ip1j - xx_ij )
                0162      &             + ddy*( xx_ijp1 - xx_ij )
                0163      &         + ddx*ddy*( xx_ip1jp1 - xx_ip1j - xx_ijp1 + xx_ij )
                0164 
9bba4c8337 Jean*0165       ELSE
                0166         STOP 'FLT_MAP_IJLOCAL2XY: not yet coded for this grid'
                0167       ENDIF
                0168 
                0169       RETURN
                0170       END
                0171 
                0172 C---+----1----+----2----+----3----+----4----+----5----+----6----+----7-|--+----|
                0173 
                0174       _RL FUNCTION FLT_MAP_R2K(
                0175      I                          rr, bi, bj, myThid )
                0176 
                0177 C     ==================================================================
                0178 C     FUNCTION FLT_MAP_R2K
                0179 C     ==================================================================
                0180 C     o Converts r-coordinate (grid) to corresponding
                0181 C       fractional vertical index
                0182 C     Range: [1/2 , Nr+1/2],
                0183 C           Center  (Tracer Pt) <-> integer
                0184 C           Interface (wVel Pt) <-> half integer
                0185 C     ==================================================================
                0186 
                0187 C     !USES:
                0188       IMPLICIT NONE
                0189 
                0190 C     == global variables ==
                0191 #include "SIZE.h"
                0192 #include "EEPARAMS.h"
                0193 #include "GRID.h"
                0194 
                0195 C     == routine arguments ==
                0196       _RL rr
                0197       INTEGER bi, bj, myThid
                0198 
                0199 C     == local variables ==
                0200       _RL fm
                0201       INTEGER k
                0202 
                0203 C     == end of interface ==
                0204 
                0205       FLT_MAP_R2K = 0. _d 0
                0206       DO k=1,Nr
                0207         IF ( FLT_MAP_R2K .EQ. 0. _d 0 ) THEN
                0208 C-    r decreases when k increases (rkSign < 0):
                0209           IF ( rF(k) .GE. rr .AND. rr.GT.rF(k+1) ) THEN
                0210             fm = ( rr - rF(k) ) * recip_drF(k)*rkSign
                0211             FLT_MAP_R2K = DFLOAT(k)+fm-0.5 _d 0
                0212           ENDIF
                0213         ENDIF
                0214       ENDDO
                0215 
                0216       RETURN
                0217       END
                0218 
                0219 C---+----1----+----2----+----3----+----4----+----5----+----6----+----7-|--+----|
                0220 
                0221       _RL FUNCTION FLT_MAP_K2R(
                0222      I                          kr, bi, bj, myThid )
                0223 
                0224 C     ==================================================================
                0225 C     FUNCTION FLT_MAP_K2R
                0226 C     ==================================================================
                0227 C     o Converts fractional vertical index to corresponding
                0228 C           r-coordinate (grid)
                0229 C     Range: [1/2 , Nr+1/2],
                0230 C           Center  (Tracer Pt) <-> integer
                0231 C           Interface (wVel Pt) <-> half integer
                0232 C     ==================================================================
                0233 
                0234 C     !USES:
                0235       IMPLICIT NONE
                0236 
                0237 C     == global variables ==
                0238 #include "SIZE.h"
                0239 #include "EEPARAMS.h"
                0240 #include "GRID.h"
                0241 
                0242 C     == routine arguments ==
                0243       _RL kr
                0244       INTEGER bi, bj, myThid
                0245 
                0246 C     == local variables ==
                0247       _RL ddz
                0248       INTEGER k
                0249 
                0250 C     == end of interface ==
                0251 
                0252       k = NINT(kr)
                0253       IF ( k.LT.1 ) THEN
                0254         FLT_MAP_K2R = rF(1)
                0255       ELSEIF ( k.GT.Nr ) THEN
                0256         FLT_MAP_K2R = rF(Nr+1)
                0257       ELSE
                0258         ddz = 0.5 _d 0 + kr - DFLOAT(k)
                0259         FLT_MAP_K2R = rF(k) + ddz*drF(k)*rkSign
                0260       ENDIF
                0261 
                0262       RETURN
                0263       END