Back to home page

MITgcm

 
 

    


Warning, /eesupp/src/exch_sm_3d_rx.template is written in an unsupported language. File is not indexed.

view on githubraw file Latest commit add29e06 on 2018-01-31 20:35:05 UTC
449149bd7b Jean*0001 #include "PACKAGES_CONFIG.h"
                0002 #include "CPP_EEOPTIONS.h"
                0003 
                0004 CBOP
                0005 C     !ROUTINE: EXCH_SM_3D_RX
                0006 
                0007 C     !INTERFACE:
                0008       SUBROUTINE EXCH_SM_3D_RX(
                0009      U                                phi,
                0010      I                                withSigns, myNz, myThid )
                0011 
                0012 C     !DESCRIPTION:
                0013 C*=====================================================================*
                0014 C  Purpose: SUBROUTINE EXCH_SM_3D_RX
                0015 C      handle exchanges for Second Moment (Sxy) 3D field
                0016 C     (for quantity which Sign depend on X & Y orientation), at Mass point
                0017 C
                0018 C  Input:
                0019 C    phi(lon,lat,levs,bi,bj)  :: array with overlap regions are to be exchanged
                0020 C    withSigns (logical)      :: true to use signs of X & Y orientation
                0021 C    myNz                     :: 3rd dimension of input arrays phi
                0022 C    myThid                   :: my Thread Id number
                0023 C
                0024 C  Output: phi is updated (halo regions filled)
                0025 C
                0026 C  Calls: exch (either exch_rx_cube or exch_rx)
                0027 C
                0028 C  NOTES: 1) If using CubedSphereExchange, only works on ONE PROCESSOR!
                0029 C*=====================================================================*
                0030 
                0031 C     !USES:
                0032       IMPLICIT NONE
                0033 
                0034 #include "SIZE.h"
                0035 #include "EEPARAMS.h"
                0036 
                0037 C     !INPUT/OUTPUT PARAMETERS:
                0038 C     == Argument list variables ==
                0039       INTEGER myNz
                0040       _RX phi(1-OLx:sNx+OLx,1-OLy:sNy+OLy,myNz,nSx,nSy)
                0041       LOGICAL withSigns
                0042       INTEGER myThid
                0043 
                0044 C     !LOCAL VARIABLES:
3e943aa97a Jean*0045 #ifndef ALLOW_EXCH2
449149bd7b Jean*0046 C     == Local variables ==
                0047 C     i,j,k,bi,bj   :: loop indices.
                0048 C     OL[wens]      :: Overlap extents in west, east, north, south.
                0049 C     exchWidth[XY] :: Extent of regions that will be exchanged.
                0050 C     dummy[12]     :: copies of the vector components with haloes filled.
                0051 
                0052       INTEGER i,j,k,bi,bj
                0053       INTEGER OLw, OLe, OLn, OLs, exchWidthX, exchWidthY
                0054       _RX negOne
3e943aa97a Jean*0055 #endif
                0056 CEOP
449149bd7b Jean*0057 
                0058 #ifdef ALLOW_EXCH2
                0059       CALL EXCH2_SM_3D_RX(
45d7b5cc4e Jean*0060      U                     phi,
                0061      I                     withSigns, myNz, myThid )
3e943aa97a Jean*0062 #else /* ALLOW_EXCH2 */
449149bd7b Jean*0063 
                0064       OLw        = OLx
                0065       OLe        = OLx
                0066       OLn        = OLy
                0067       OLs        = OLy
                0068       exchWidthX = OLx
                0069       exchWidthY = OLy
                0070       negOne = 1.
                0071 
b676deaff6 Jean*0072       IF (useCubedSphereExchange) THEN
                0073 C---  using CubedSphereExchange:
449149bd7b Jean*0074 
                0075 C--   First call the exchanges
                0076 
45d7b5cc4e Jean*0077        CALL EXCH1_RX_CUBE( phi, .FALSE.,
449149bd7b Jean*0078      I            OLw, OLe, OLs, OLn, myNz,
                0079      I            exchWidthX, exchWidthY,
45d7b5cc4e Jean*0080      I            EXCH_UPDATE_CORNERS, myThid )
449149bd7b Jean*0081 
b676deaff6 Jean*0082        IF (withSigns) THEN
449149bd7b Jean*0083 C--   Then we may need to switch the signs depending on which cube face
                0084 C      we are located (we assume that bj is always=1).
                0085 C     Choose what to do at each edge of the halo based on which face
b676deaff6 Jean*0086         negOne = -1.
449149bd7b Jean*0087 
                0088 C--   Loops on tile and level indices:
b676deaff6 Jean*0089         DO bj = myByLo(myThid), myByHi(myThid)
449149bd7b Jean*0090         DO bi = myBxLo(myThid), myBxHi(myThid)
                0091          DO k = 1,myNz
                0092 
                0093 C-    odd (or even) faces share disposition of all sections of the halo
                0094           IF ( MOD(bi,2).EQ.1 ) THEN
                0095 C--   Face 1,3,5:
                0096 
                0097            DO j = 1,exchWidthY
                0098             DO i = 1,sNx
                0099 C-    North:
                0100              phi(i,sNy+j,k,bi,bj) = phi(i,sNy+j,k,bi,bj)*negOne
                0101 C-    South: (nothing to change)
                0102 c            phi(i,1-j,k,bi,bj) = phi(i,1-j,k,bi,bj)
                0103             ENDDO
                0104            ENDDO
                0105            DO j = 1,sNy
                0106             DO i = 1,exchWidthX
                0107 C-    East: (nothing to change)
                0108 c            phi(sNx+i,j,k,bi,bj) = phi(sNx+i,j,k,bi,bj)
                0109 C-    West:
                0110              phi(1-i,j,k,bi,bj) = phi(1-i,j,k,bi,bj)*negOne
                0111             ENDDO
                0112            ENDDO
                0113 
                0114           ELSE
                0115 C--   Face 2,4,6:
                0116 
                0117            DO j = 1,sNy
                0118             DO i = 1,exchWidthX
                0119 C-    East:
                0120              phi(sNx+i,j,k,bi,bj) = phi(sNx+i,j,k,bi,bj)*negOne
                0121 C-    West: (nothing to change)
                0122 c            phi(1-i,j,k,bi,bj) = phi(1-i,j,k,bi,bj)
                0123             ENDDO
                0124            ENDDO
                0125            DO j = 1,exchWidthY
                0126             DO i = 1,sNx
                0127 C-    North: (nothing to change)
                0128 c            phi(i,sNy+j,k,bi,bj) = phi(i,sNy+j,k,bi,bj)
                0129 C-    South:
                0130              phi(i,1-j,k,bi,bj) = phi(i,1-j,k,bi,bj)*negOne
                0131             ENDDO
                0132            ENDDO
                0133 
                0134 C--   End odd / even faces
                0135           ENDIF
                0136 
                0137 C--   end of Loops on tile and level indices (k,bi,bj).
                0138          ENDDO
                0139         ENDDO
b676deaff6 Jean*0140         ENDDO
                0141 
                0142 C--   End withSigns
                0143        ENDIF
449149bd7b Jean*0144 
                0145       ELSE
b676deaff6 Jean*0146 C---  not using CubedSphereExchange:
449149bd7b Jean*0147 
6979a1789e Jean*0148 #ifdef DISCONNECTED_TILES
                0149        CALL EXCH0_RX( phi,
                0150      I            OLw, OLe, OLs, OLn, myNz,
                0151      I            exchWidthX, exchWidthY,
                0152      I            EXCH_UPDATE_CORNERS, myThid )
                0153 #else /* DISCONNECTED_TILES */
45d7b5cc4e Jean*0154        CALL EXCH1_RX( phi,
449149bd7b Jean*0155      I            OLw, OLe, OLs, OLn, myNz,
                0156      I            exchWidthX, exchWidthY,
45d7b5cc4e Jean*0157      I            EXCH_UPDATE_CORNERS, myThid )
6979a1789e Jean*0158 #endif /* DISCONNECTED_TILES */
449149bd7b Jean*0159 
b676deaff6 Jean*0160 C---  using or not using CubedSphereExchange: end
449149bd7b Jean*0161       ENDIF
                0162 
3e943aa97a Jean*0163 #endif /* ALLOW_EXCH2 */
6979a1789e Jean*0164 
                0165       RETURN
449149bd7b Jean*0166       END
                0167 
                0168 C---+----1----+----2----+----3----+----4----+----5----+----6----+----7-|--+----|
                0169 
                0170 CEH3 ;;; Local Variables: ***
                0171 CEH3 ;;; mode:fortran ***
                0172 CEH3 ;;; End: ***