** Warning **
Issuing rollback() due to DESTROY without explicit disconnect() of DBD::mysql::db handle dbname=MITgcm at /usr/local/share/lxr/lib/LXR/Common.pm line 1224.
Last-Modified: Tue, 15 Dec 2025 06:15:19 GMT
Content-Type: text/html; charset=utf-8
MITgcm/MITgcm/pkg/exch2/w2_cumulsum_z_tile.F
File indexing completed on 2018-03-02 18:39:43 UTC
view on github raw file Latest commit add29e06 on 2018-01-31 20:35:05 UTC
ca64f811ee Jean* 0001 #include "CPP_EEOPTIONS.h "
0002 #include "W2_OPTIONS.h "
0003
0004
0005
0006
0007
0008
0009
0010
0011
0012
0013
0014
0015 SUBROUTINE W2_CUMULSUM_Z_TILE_RL (
0016 O psiZ , psiLoc ,
0017 I dPsiX , dPsiY , myThid )
0018
0019
0020
0021
0022
0023
0024
0025
0026
0027
0028
0029
0030 IMPLICIT NONE
0031
0032
0033 #include "SIZE.h "
0034 #include "EEPARAMS.h "
0035 #include "EESUPPORT.h "
0036 #include "W2_EXCH2_SIZE.h "
936dcd2159 Jean* 0037 #include "W2_EXCH2_PARAMS.h "
ca64f811ee Jean* 0038 #include "W2_EXCH2_TOPOLOGY.h "
0039 #include "CUMULSUM.h "
0040
0041
0042
0043
0044
0045
0046
0047
0048 _RL psiZ (nSx ,nSy )
0049 _RL psiLoc (2)
0050 _RL dPsiX (nSx ,nSy )
0051 _RL dPsiY (nSx ,nSy )
0052 INTEGER myThid
0053
0054
0055
0056
0057
0058
0059 INTEGER bi ,bj
0060 INTEGER tN , tS
0061 Real *8 globalBuf (3,W2_maxNbTiles )
936dcd2159 Jean* 0062 #ifndef W2_CUMSUM_USE_MATRIX
0063 Real *8 facetXYSum (2,W2_maxNbFacets )
0064 Real *8 facet_CSum ( W2_maxNbFacets )
0065 INTEGER fNx , fNy , nbTx , nbTy
0066 INTEGER i , j
0067 #endif
ca64f811ee Jean* 0068 #ifdef ALLOW_USE_MPI
2790c2105f Jean* 0069 INTEGER np , pId
ca64f811ee Jean* 0070 INTEGER lbuf1 , lbuf2 , idest , itag , ready_to_receive
0071 INTEGER istatus (MPI_STATUS_SIZE), ierr
0072 Real *8 loc1Buf (nSx ,nSy )
0073 Real *8 loc2Buf (2,nSx ,nSy )
0074 #endif /* ALLOW_USE_MPI */
0075
0076
0077
0078 psiLoc (1) = 0.
0079 psiLoc (2) = 0.
0080 DO tN = 1,exch2_nTiles
0081 globalBuf (1,tN ) = 0.
0082 globalBuf (2,tN ) = 0.
0083 globalBuf (3,tN ) = 0.
0084 ENDDO
0085
0086
0087 DO bj = myByLo (myThid ), myByHi (myThid )
0088 DO bi = myBxLo (myThid ), myBxHi (myThid )
0089 shareBufCS2_R8 (1,bi ,bj ) = dPsiX (bi ,bj )
0090 shareBufCS2_R8 (2,bi ,bj ) = dPsiY (bi ,bj )
0091 ENDDO
0092 ENDDO
0093
0094
0095 CALL BAR2 ( myThid )
0096 _BEGIN_MASTER ( myThid )
0097
0098 #ifdef ALLOW_USE_MPI
0099 IF ( usingMPI ) THEN
0100
0101 lbuf1 = nSx *nSy
0102 lbuf2 = 2*lbuf1
0103 idest = 0
0104 itag = 0
0105 ready_to_receive = 0
0106
0107 IF ( mpiMyId .NE. 0 ) THEN
0108
0109
0110 #ifndef DISABLE_MPI_READY_TO_RECEIVE
0111 CALL MPI_RECV (ready_to_receive , 1, MPI_INTEGER,
0112 & idest , itag , MPI_COMM_MODEL , istatus , ierr )
0113 #endif
0114 CALL MPI_SEND (shareBufCS2_R8 , lbuf2 , MPI_DOUBLE_PRECISION,
0115 & idest , itag , MPI_COMM_MODEL , ierr )
0116
0117
0118 CALL MPI_RECV (shareBufCS1_R8 , lbuf1 , MPI_DOUBLE_PRECISION,
0119 & idest , itag , MPI_COMM_MODEL , istatus , ierr )
0120
0121 ELSE
0122
0123
2790c2105f Jean* 0124 DO np = 2, nPx *nPy
0125 pId = np - 1
ca64f811ee Jean* 0126 #ifndef DISABLE_MPI_READY_TO_RECEIVE
0127 CALL MPI_SEND (ready_to_receive , 1, MPI_INTEGER,
2790c2105f Jean* 0128 & pId , itag , MPI_COMM_MODEL , ierr )
ca64f811ee Jean* 0129 #endif
0130 CALL MPI_RECV (loc2Buf , lbuf2 , MPI_DOUBLE_PRECISION,
2790c2105f Jean* 0131 & pId , itag , MPI_COMM_MODEL , istatus , ierr )
ca64f811ee Jean* 0132
0133
0134 DO bj =1,nSy
0135 DO bi =1,nSx
2790c2105f Jean* 0136 tN = W2_procTileList (bi ,bj ,np )
ca64f811ee Jean* 0137 globalBuf (1,tN ) = loc2Buf (1,bi ,bj )
0138 globalBuf (2,tN ) = loc2Buf (2,bi ,bj )
0139 ENDDO
0140 ENDDO
2790c2105f Jean* 0141
ca64f811ee Jean* 0142 ENDDO
0143
0144
0145 ENDIF
0146
0147 ENDIF
0148 #endif /* ALLOW_USE_MPI */
0149
0150 IF ( myProcId .EQ. 0 ) THEN
0151
0152
0153 DO bj =1,nSy
0154 DO bi =1,nSx
0155 tN = W2_myTileList (bi ,bj )
0156 globalBuf (1,tN ) = shareBufCS2_R8 (1,bi ,bj )
0157 globalBuf (2,tN ) = shareBufCS2_R8 (2,bi ,bj )
0158 ENDDO
0159 ENDDO
0160
0161
575f97366a Jean* 0162 #ifdef W2_CUMSUM_USE_MATRIX
936dcd2159 Jean* 0163
ca64f811ee Jean* 0164 DO tN = 1,exch2_nTiles
0165 globalBuf (3,tN ) = 0.
0166 DO tS = 1,exch2_nTiles
0167 globalBuf (3,tN ) = globalBuf (3,tN )
0168 & + W2_cumSum_tiles (1,tS ,tN )*globalBuf (1,tS )
0169 & + W2_cumSum_tiles (2,tS ,tN )*globalBuf (2,tS )
0170 ENDDO
0171 ENDDO
575f97366a Jean* 0172 #else /* W2_CUMSUM_USE_MATRIX */
936dcd2159 Jean* 0173
0174
0175 DO j =1,W2_maxNbFacets
0176 facetXYSum (1,j ) = 0
0177 facetXYSum (2,j ) = 0
0178 facet_CSum (j ) = 0
0179 ENDDO
0180
0181
0182 DO j =1,nFacets
0183 fNx = facet_dims (2*j -1)
0184 fNy = facet_dims ( 2*j )
0185 IF ( fNx *fNy .GE. 1 ) THEN
0186 nbTx = fNx /sNx
0187 nbTy = fNy /sNy
0188
0189 DO bi =1,nbTx -1
0190 tN = facet_owns (1,j ) + bi -1
0191 globalBuf (3,tN +1) = globalBuf (3,tN ) + globalBuf (1,tN )
0192 ENDDO
0193 DO bj =1,nbTy -1
0194 tS = facet_owns (1,j ) - 1 + (bj -1)*nbTx
0195 DO bi =1,nbTx
0196 tN = tS + bi
0197 globalBuf (3,tN +nbTx ) = globalBuf (3,tN ) + globalBuf (2,tN )
0198 ENDDO
0199 ENDDO
0200
0201
0202 DO bi =1,nbTx
0203 tN = facet_owns (1,j ) + bi -1
0204 facetXYSum (1,j ) = facetXYSum (1,j ) + globalBuf (1,tN )
0205 ENDDO
0206 DO bj =1,nbTy
0207 tN = facet_owns (1,j ) + (bj -1)*nbTx
0208 facetXYSum (2,j ) = facetXYSum (2,j ) + globalBuf (2,tN )
0209 ENDDO
0210
0211 ENDIF
0212 ENDDO
0213
0214
0215 DO j =1,nFacets
0216 DO i =1,nFacets
0217 facet_CSum (j ) = facet_CSum (j )
0218 & + W2_cumSum_facet (1,i ,j )*facetXYSum (1,i )
0219 & + W2_cumSum_facet (2,i ,j )*facetXYSum (2,i )
0220 ENDDO
0221 ENDDO
0222
0223
0224 DO tN = 1,exch2_nTiles
0225 j = exch2_myFace (tN )
0226 IF ( j .NE. 0 ) THEN
0227 globalBuf (3,tN ) = globalBuf (3,tN ) + facet_CSum (j )
0228 ENDIF
0229 ENDDO
575f97366a Jean* 0230 #endif /* W2_CUMSUM_USE_MATRIX */
0231
ca64f811ee Jean* 0232
0233 IF ( W2_tMC1 .GE. 1 )
0234 & psiLoc (1) = globalBuf (3,W2_tMC1 ) + globalBuf (2,W2_tMC1 )
0235 IF ( W2_tMC2 .GE. 1 )
0236 & psiLoc (2) = globalBuf (3,W2_tMC2 ) + globalBuf (1,W2_tMC2 )
0237
0238
0239 DO bj =1,nSy
0240 DO bi =1,nSx
0241 tN = W2_myTileList (bi ,bj )
0242 shareBufCS1_R8 (bi ,bj ) = globalBuf (3,tN )
0243 ENDDO
0244 ENDDO
0245
0246 #ifdef ALLOW_USE_MPI
0247 IF ( usingMPI ) THEN
0248
2790c2105f Jean* 0249 DO np = 2, nPx *nPy
0250 pId = np - 1
ca64f811ee Jean* 0251
0252 DO bj =1,nSy
0253 DO bi =1,nSx
2790c2105f Jean* 0254 tN = W2_procTileList (bi ,bj ,np )
ca64f811ee Jean* 0255 loc1Buf (bi ,bj ) = globalBuf (3,tN )
0256 ENDDO
0257 ENDDO
0258 CALL MPI_SEND (loc1Buf , lbuf1 , MPI_DOUBLE_PRECISION,
2790c2105f Jean* 0259 & pId , itag , MPI_COMM_MODEL , ierr )
ca64f811ee Jean* 0260 ENDDO
0261
0262 ENDIF
0263 #endif /* ALLOW_USE_MPI */
0264
0265
0266 ENDIF
0267
0268 _END_MASTER ( myThid )
0269
0270 CALL BAR2 ( myThid )
0271
0272
0273 DO bj = myByLo (myThid ), myByHi (myThid )
0274 DO bi = myBxLo (myThid ), myBxHi (myThid )
0275 psiZ (bi ,bj ) = shareBufCS1_R8 (bi ,bj )
0276 ENDDO
0277 ENDDO
0278
0279 RETURN
0280 END