** 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: Mon, 22 Mar 2026 05:09:14 GMT
Content-Type: text/html; charset=utf-8
MITgcm/MITgcm/model/src/cg2d_ex0.F
File indexing completed on 2024-09-20 05:10:16 UTC
view on github raw file Latest commit e6e223b2 on 2024-09-19 22:01:15 UTC
015c19607c Jean* 0001 #include "CPP_OPTIONS.h "
0002 #ifdef TARGET_NEC_SX
0003
0004
0005 #ifndef CG2D_OUTERLOOPITERS
0006 # define CG2D_OUTERLOOPITERS 10
0007 #endif
0008 #endif /* TARGET_NEC_SX */
0009
0010
0011
0012
0013 SUBROUTINE CG2D_EX0 (
0014 U cg2d_b , cg2d_x ,
0015 O firstResidual , minResidualSq , lastResidual ,
0016 U numIters , nIterMin ,
0017 I myThid )
0018
aecc8b0f47 Mart* 0019
015c19607c Jean* 0020
aecc8b0f47 Mart* 0021
0022
015c19607c Jean* 0023
0024
0025
aecc8b0f47 Mart* 0026
015c19607c Jean* 0027
0028
0029
0030
0031
aecc8b0f47 Mart* 0032
015c19607c Jean* 0033
0034
0035
0036 IMPLICIT NONE
0037
0038 #include "SIZE.h "
0039 #include "EEPARAMS.h "
0040 #include "PARAMS.h "
0041 #include "CG2D.h "
0042
0043
0044
0045
0046
0047
0048
0049
0050
0051
0052
0053
0054 _RL cg2d_b (1-OLx :sNx +OLx ,1-OLy :sNy +OLy ,nSx ,nSy )
0055 _RL cg2d_x (1-OLx :sNx +OLx ,1-OLy :sNy +OLy ,nSx ,nSy )
0056 _RL firstResidual
0057 _RL minResidualSq
0058 _RL lastResidual
0059 INTEGER numIters
0060 INTEGER nIterMin
0061 INTEGER myThid
0062
0063
0064
0065
0066
0067
0068
0069
0070
0071
0072
0073
0074
0075
0076
aecc8b0f47 Mart* 0077
0078
0079
0080
015c19607c Jean* 0081 INTEGER bi , bj
0082 INTEGER i , j , it2d
0083 INTEGER actualIts (nSx ,nSy )
0084 INTEGER minResIter (nSx ,nSy )
0085 _RL err_sq , errTile (nSx ,nSy )
0086 _RL eta_qrNtile (nSx ,nSy )
0087 _RL eta_qrNM1 (nSx ,nSy )
0088 _RL cgBeta
0089 _RL alpha , alphaTile (nSx ,nSy )
0090 _RL sumRHS , sumRHStile (nSx ,nSy )
0091 _RL rhsMax , rhsMaxLoc
0092 _RL rhsNorm (nSx ,nSy )
0093 _RL minResTile (nSx ,nSy )
0094 _RL cg2d_min (1:sNx ,1:sNy ,nSx ,nSy )
d68b36a485 Mart* 0095 _RL cg2d_q (1:sNx ,1:sNy ,nSx ,nSy )
aecc8b0f47 Mart* 0096 _RL cg2d_r (1-1:sNx +1,1-1:sNy +1,nSx ,nSy )
0097 _RL cg2d_s (1-1:sNx +1,1-1:sNy +1,nSx ,nSy )
015c19607c Jean* 0098 CHARACTER *(MAX_LEN_MBUF ) msgBuf
0099 LOGICAL printResidual
0100
0101
0102
0103
0104
0105 rhsMax = 0. _d 0
0106 DO bj =myByLo (myThid ),myByHi (myThid )
0107 DO bi =myBxLo (myThid ),myBxHi (myThid )
0108
0109 actualIts (bi ,bj ) = 0
0110 minResIter (bi ,bj ) = 0
0111 minResTile (bi ,bj ) = -1. _d 0
0112 eta_qrNM1 (bi ,bj ) = 1. _d 0
0113 rhsMaxLoc = 0. _d 0
0114 DO j =1,sNy
0115 DO i =1,sNx
0116 cg2d_b (i ,j ,bi ,bj ) = cg2d_b (i ,j ,bi ,bj )*cg2dNorm
0117 rhsMaxLoc = MAX(ABS(cg2d_b (i ,j ,bi ,bj )),rhsMaxLoc )
0118 ENDDO
0119 ENDDO
0120 rhsNorm (bi ,bj ) = 1. _d 0
0121 IF ( rhsMaxLoc .NE. 0. ) rhsNorm (bi ,bj ) = 1. _d 0 / rhsMaxLoc
0122 IF (cg2dNormaliseRHS ) THEN
0123 DO j =1,sNy
0124 DO i =1,sNx
0125 cg2d_b (i ,j ,bi ,bj ) = cg2d_b (i ,j ,bi ,bj )*rhsNorm (bi ,bj )
0126 cg2d_x (i ,j ,bi ,bj ) = cg2d_x (i ,j ,bi ,bj )*rhsNorm (bi ,bj )
0127 ENDDO
0128 ENDDO
0129 ENDIF
0130 rhsMax = MAX( rhsMaxLoc , rhsMax )
0131
0132 ENDDO
0133 ENDDO
0134 _GLOBAL_MAX_RL ( rhsMax , myThid )
0135
0136
0137 CALL EXCH_XY_RL( cg2d_x , myThid )
0138
0139
0140 err_sq = 0.
0141 sumRHS = 0.
0142 DO bj =myByLo (myThid ),myByHi (myThid )
0143 DO bi =myBxLo (myThid ),myBxHi (myThid )
ff51fd05c6 Jean* 0144
0145 DO j =0,sNy +1
0146 DO i =0,sNx +1
0147 cg2d_r (i ,j ,bi ,bj ) = 0. _d 0
0148 cg2d_s (i ,j ,bi ,bj ) = 0. _d 0
0149 ENDDO
0150 ENDDO
015c19607c Jean* 0151 IF ( nIterMin .GE. 0 ) THEN
ff51fd05c6 Jean* 0152
015c19607c Jean* 0153 DO j =1,sNy
0154 DO i =1,sNx
ff51fd05c6 Jean* 0155 cg2d_min (i ,j ,bi ,bj ) = cg2d_x (i ,j ,bi ,bj )
015c19607c Jean* 0156 ENDDO
0157 ENDDO
0158 ENDIF
0159 sumRHStile (bi ,bj ) = 0. _d 0
0160 errTile (bi ,bj ) = 0. _d 0
0161 #ifdef TARGET_NEC_SX
0162
0163 #endif /* TARGET_NEC_SX */
0164 DO j =1,sNy
0165 DO i =1,sNx
0166 cg2d_r (i ,j ,bi ,bj ) = cg2d_b (i ,j ,bi ,bj ) -
0167 & (aW2d (i ,j ,bi ,bj )*cg2d_x (i -1,j ,bi ,bj )
0168 & +aW2d (i +1,j ,bi ,bj )*cg2d_x (i +1,j ,bi ,bj )
0169 & +aS2d (i ,j ,bi ,bj )*cg2d_x (i ,j -1,bi ,bj )
0170 & +aS2d (i ,j +1,bi ,bj )*cg2d_x (i ,j +1,bi ,bj )
0171 & +aC2d (i ,j ,bi ,bj )*cg2d_x (i ,j ,bi ,bj )
0172 & )
0173 errTile (bi ,bj ) = errTile (bi ,bj )
0174 & + cg2d_r (i ,j ,bi ,bj )*cg2d_r (i ,j ,bi ,bj )
0175 sumRHStile (bi ,bj ) = sumRHStile (bi ,bj ) + cg2d_b (i ,j ,bi ,bj )
0176 ENDDO
0177 ENDDO
0178 IF ( nIterMin .GE. 0 ) THEN
0179 minResTile (bi ,bj ) = errTile (bi ,bj )
0180 ENDIF
0181 err_sq = MAX( errTile (bi ,bj ), err_sq )
0182 sumRHS = MAX( ABS(sumRHStile (bi ,bj )), sumRHS )
0183
0184 ENDDO
0185 ENDDO
0186 CALL EXCH_S3D_RL( cg2d_r , 1, myThid )
0187 _GLOBAL_MAX_RL ( err_sq , myThid )
0188 _GLOBAL_MAX_RL ( sumRHS , myThid )
0189 firstResidual = SQRT(err_sq )
0190
0191 printResidual = .FALSE.
0192 IF ( debugLevel .GE. debLevZero ) THEN
0193 _BEGIN_MASTER ( myThid )
0194 printResidual = printResidualFreq .GE. 1
e6e223b277 Jean* 0195 WRITE (standardMessageUnit ,'(A,1P2E22.14)' )
015c19607c Jean* 0196 & ' cg2d: Sum(rhs),rhsMax = ' , sumRHS ,rhsMax
0197 _END_MASTER ( myThid )
0198 ENDIF
0199
0200
0201
0202
0203 DO it2d =1, numIters
0204 IF ( err_sq .GE. cg2dTolerance_sq ) THEN
0205 err_sq = 0. _d 0
0206
0207 DO bj =myByLo (myThid ),myByHi (myThid )
0208 DO bi =myBxLo (myThid ),myBxHi (myThid )
0209 IF ( errTile (bi ,bj ).GE. cg2dTolerance_sq ) THEN
0210
0211
0212
0213 eta_qrNtile (bi ,bj ) = 0. _d 0
0214 #ifdef TARGET_NEC_SX
0215
0216 #endif /* TARGET_NEC_SX */
0217 DO j =1,sNy
0218 DO i =1,sNx
0219 cg2d_q (i ,j ,bi ,bj ) =
0220 & pC (i ,j ,bi ,bj )*cg2d_r (i ,j ,bi ,bj )
0221 & +pW (i ,j ,bi ,bj )*cg2d_r (i -1,j ,bi ,bj )
0222 & +pW (i +1,j ,bi ,bj )*cg2d_r (i +1,j ,bi ,bj )
0223 & +pS (i ,j ,bi ,bj )*cg2d_r (i ,j -1,bi ,bj )
0224 & +pS (i ,j +1,bi ,bj )*cg2d_r (i ,j +1,bi ,bj )
0225 eta_qrNtile (bi ,bj ) = eta_qrNtile (bi ,bj )
0226 & +cg2d_q (i ,j ,bi ,bj )*cg2d_r (i ,j ,bi ,bj )
0227 ENDDO
0228 ENDDO
0229
0230 cgBeta = eta_qrNtile (bi ,bj )/eta_qrNM1 (bi ,bj )
0231 eta_qrNM1 (bi ,bj ) = eta_qrNtile (bi ,bj )
0232
0233 DO j =1,sNy
0234 DO i =1,sNx
0235 cg2d_s (i ,j ,bi ,bj ) = cg2d_q (i ,j ,bi ,bj )
0236 & + cgBeta *cg2d_s (i ,j ,bi ,bj )
0237 ENDDO
0238 ENDDO
0239
0240
0241 CALL FILL_HALO_LOCAL_RL(
0242 U cg2d_s (0,0,bi ,bj ),
0243 I 1, 1, 1, 1, 1,
0244 I EXCH_IGNORE_CORNERS , bi , bj , myThid )
0245
0246
0247
0248 alphaTile (bi ,bj ) = 0. _d 0
0249 #ifdef TARGET_NEC_SX
0250
0251 #endif /* TARGET_NEC_SX */
0252 DO j =1,sNy
0253 DO i =1,sNx
0254 cg2d_q (i ,j ,bi ,bj ) =
0255 & aW2d (i ,j ,bi ,bj )*cg2d_s (i -1,j ,bi ,bj )
0256 & +aW2d (i +1,j ,bi ,bj )*cg2d_s (i +1,j ,bi ,bj )
0257 & +aS2d (i ,j ,bi ,bj )*cg2d_s (i ,j -1,bi ,bj )
0258 & +aS2d (i ,j +1,bi ,bj )*cg2d_s (i ,j +1,bi ,bj )
0259 & +aC2d (i ,j ,bi ,bj )*cg2d_s (i ,j ,bi ,bj )
0260 alphaTile (bi ,bj ) = alphaTile (bi ,bj )
0261 & + cg2d_s (i ,j ,bi ,bj )*cg2d_q (i ,j ,bi ,bj )
0262 ENDDO
0263 ENDDO
0264 alpha = eta_qrNtile (bi ,bj )/alphaTile (bi ,bj )
0265
0266
0267
0268 errTile (bi ,bj ) = 0. _d 0
0269 DO j =1,sNy
0270 DO i =1,sNx
0271 cg2d_x (i ,j ,bi ,bj )=cg2d_x (i ,j ,bi ,bj )+alpha *cg2d_s (i ,j ,bi ,bj )
0272 cg2d_r (i ,j ,bi ,bj )=cg2d_r (i ,j ,bi ,bj )-alpha *cg2d_q (i ,j ,bi ,bj )
0273 errTile (bi ,bj ) = errTile (bi ,bj )
0274 & + cg2d_r (i ,j ,bi ,bj )*cg2d_r (i ,j ,bi ,bj )
0275 ENDDO
0276 ENDDO
0277 actualIts (bi ,bj ) = it2d
0278
0279 IF ( printResidual ) THEN
0280 IF ( MOD( it2d -1, printResidualFreq ).EQ. 0 ) THEN
0281 WRITE (msgBuf ,'(A,2I4,A,I6,A,1PE21.14)' ) ' cg2d(bi,bj=' , bi ,
0282 & bj , '): iter=' , it2d , ' ; resid.= ' , SQRT(errTile (bi ,bj ))
0283 CALL PRINT_MESSAGE ( msgBuf , standardMessageUnit ,
0284 & SQUEEZE_RIGHT , myThid )
0285 ENDIF
0286 ENDIF
0287 IF ( errTile (bi ,bj ) .GE. cg2dTolerance_sq .AND.
0288 & errTile (bi ,bj ) .LT. minResTile (bi ,bj ) ) THEN
0289
0290 minResTile (bi ,bj ) = errTile (bi ,bj )
0291 minResIter (bi ,bj ) = it2d
0292 DO j =1,sNy
0293 DO i =1,sNx
0294 cg2d_min (i ,j ,bi ,bj ) = cg2d_x (i ,j ,bi ,bj )
0295 ENDDO
0296 ENDDO
0297 ENDIF
0298
0299 CALL FILL_HALO_LOCAL_RL(
0300 U cg2d_r (0,0,bi ,bj ),
0301 I 1, 1, 1, 1, 1,
0302 I EXCH_IGNORE_CORNERS , bi , bj , myThid )
0303
0304 ENDIF
0305 err_sq = MAX( errTile (bi ,bj ), err_sq )
0306
0307 ENDDO
0308 ENDDO
0309
0310 ENDIF
0311 ENDDO
0312
0313
0314
0315 IF ( nIterMin .GE. 0 ) THEN
0316
0317 DO bj =myByLo (myThid ),myByHi (myThid )
0318 DO bi =myBxLo (myThid ),myBxHi (myThid )
0319
0320
0321 IF ( errTile (bi ,bj ) .GT. minResTile (bi ,bj ) ) THEN
0322 DO j =1,sNy
0323 DO i =1,sNx
0324 cg2d_x (i ,j ,bi ,bj ) = cg2d_min (i ,j ,bi ,bj )
0325 ENDDO
0326 ENDDO
0327 ENDIF
0328 ENDDO
0329 ENDDO
0330 ENDIF
0331
0332 IF (cg2dNormaliseRHS ) THEN
0333
0334 DO bj =myByLo (myThid ),myByHi (myThid )
0335 DO bi =myBxLo (myThid ),myBxHi (myThid )
0336 DO j =1,sNy
0337 DO i =1,sNx
0338 cg2d_x (i ,j ,bi ,bj ) = cg2d_x (i ,j ,bi ,bj )/rhsNorm (bi ,bj )
0339 ENDDO
0340 ENDDO
0341 ENDDO
0342 ENDDO
0343 ENDIF
0344
0345
0346
0347
0348 _GLOBAL_MAX_RL ( err_sq , myThid )
0349 nIterMin = numIters
0350 numIters = 0
0351 minResidualSq = err_sq
0352 DO bj =myByLo (myThid ),myByHi (myThid )
0353 DO bi =myBxLo (myThid ),myBxHi (myThid )
0354 nIterMin = MIN( actualIts (bi ,bj ), nIterMin )
0355 numIters = MAX( actualIts (bi ,bj ), numIters )
0356 minResidualSq = MIN( errTile (bi ,bj ), minResidualSq )
0357 ENDDO
0358 ENDDO
0359 lastResidual = SQRT(err_sq )
0360 alpha = -nIterMin
0361 _GLOBAL_MAX_RL ( alpha , myThid )
0362 nIterMin = NINT ( -alpha )
0363 alpha = numIters
0364 _GLOBAL_MAX_RL ( alpha , myThid )
0365 numIters = NINT ( alpha )
0366 alpha = -minResidualSq
0367 _GLOBAL_MAX_RL ( alpha , myThid )
0368 minResidualSq = -alpha
0369
0370 RETURN
0371 END