File indexing completed on 2023-09-21 05:10:48 UTC
view on githubraw file Latest commit 96b00645 on 2023-09-20 15:15:14 UTC
5ca83cd8f7 Dani*0001 #include "STREAMICE_OPTIONS.h"
0002
0003
0004
0005
96b006450c dngo*0006 SUBROUTINE STREAMICE_CG_SOLVE_MATFREE (
5ca83cd8f7 Dani*0007 U cg_Uin,
0008 U cg_Vin,
0009 I cg_Bu,
0010 I cg_Bv,
96b006450c dngo*0011 I tolerance,
5ca83cd8f7 Dani*0012 O iters,
0013 I myThid )
0014
96b006450c dngo*0015
5ca83cd8f7 Dani*0016
0017
0018
0019
0020 IMPLICIT NONE
0021
0022
0023 #include "SIZE.h"
0024 #include "EEPARAMS.h"
0025 #include "PARAMS.h"
0026 #include "STREAMICE.h"
0027 #include "STREAMICE_CG.h"
0028
0029
0030
0031
0032 INTEGER myThid
0033 INTEGER iters
0034 _RL tolerance
0035 _RL cg_Uin (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
0036 _RL cg_Vin (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
0037 _RL cg_Bu (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
0038 _RL cg_Bv (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
0039
0040
0041 INTEGER i, j, bi, bj, cg_halo, conv_flag
96b006450c dngo*0042 INTEGER iter, is, js, ie, je
0043
5ca83cd8f7 Dani*0044 _RL dot_p1, dot_p2, alpha_k, beta_k, resid, resid_0
0045 _RL dot_p1_tile (nSx,nSy)
0046 _RL dot_p2_tile (nSx,nSy)
0047 CHARACTER*(MAX_LEN_MBUF) msgBuf
0048
0049 iters = streamice_max_cg_iter
0050
0051 #ifdef ALLOW_STREAMICE
0052
0053 conv_flag = 0
0054
0055 DO bj = myByLo(myThid), myByHi(myThid)
0056 DO bi = myBxLo(myThid), myBxHi(myThid)
0057 DO j=1,sNy
0058 DO i=1,sNx
0059 Zu_SI (i,j,bi,bj) = 0. _d 0
0060 Zv_SI (i,j,bi,bj) = 0. _d 0
0061 Ru_SI (i,j,bi,bj) = 0. _d 0
0062 Rv_SI (i,j,bi,bj) = 0. _d 0
0063 Au_SI (i,j,bi,bj) = 0. _d 0
0064 Av_SI (i,j,bi,bj) = 0. _d 0
0065 Du_SI (i,j,bi,bj) = 0. _d 0
0066 Dv_SI (i,j,bi,bj) = 0. _d 0
0067 ENDDO
0068 ENDDO
0069 ENDDO
0070 ENDDO
96b006450c dngo*0071
5ca83cd8f7 Dani*0072
0073
96b006450c dngo*0074
0075
0076
0077
0078
0079
0080
0081
0082
0083
0084
0085
0086
0087
0088
0089
0090
0091
0092
0093
0094
0095
0096
0097
0098
0099
0100
0101 CALL STREAMICE_CG_ACTION( myThid,
0102 O Au_SI,
0103 O Av_SI,
0104 I cg_Uin,
0105 I cg_Vin,
5ca83cd8f7 Dani*0106 I 0, sNx+1, 0, sNy+1 )
0107
96b006450c dngo*0108
5ca83cd8f7 Dani*0109
0110 _EXCH_XY_RL( Au_SI, myThid )
0111 _EXCH_XY_RL( Av_SI, myThid )
0112
0113 DO bj = myByLo(myThid), myByHi(myThid)
0114 DO bi = myBxLo(myThid), myBxHi(myThid)
0115 DO j=1-OLy,sNy+OLy
0116 DO i=1-OLx,sNx+OLx
0117 Ru_SI(i,j,bi,bj)=cg_Bu(i,j,bi,bj)-
0118 & Au_SI(i,j,bi,bj)
0119 Rv_SI(i,j,bi,bj)=cg_Bv(i,j,bi,bj)-
0120 & Av_SI(i,j,bi,bj)
0121 ENDDO
0122 ENDDO
0123 dot_p1_tile(bi,bj) = 0. _d 0
96b006450c dngo*0124 dot_p2_tile(bi,bj) = 0. _d 0
5ca83cd8f7 Dani*0125 ENDDO
0126 ENDDO
0127
0128 DO bj = myByLo(myThid), myByHi(myThid)
0129 DO bi = myBxLo(myThid), myBxHi(myThid)
0130 DO j=1,sNy
0131 DO i=1,sNx
0132 IF (STREAMICE_umask(i,j,bi,bj).eq.1.0)
0133 & dot_p1_tile(bi,bj)=dot_p1_tile(bi,bj)+Ru_SI(i,j,bi,bj)**2
0134 IF (STREAMICE_vmask(i,j,bi,bj).eq.1.0)
0135 & dot_p1_tile(bi,bj)=dot_p1_tile(bi,bj)+Rv_SI(i,j,bi,bj)**2
0136 ENDDO
0137 ENDDO
0138 ENDDO
0139 ENDDO
0140
96b006450c dngo*0141 CALL GLOBAL_SUM_TILE_RL( dot_p1_tile, dot_p1, myThid )
5ca83cd8f7 Dani*0142 resid_0 = sqrt(dot_p1)
0143
0144
0145
0146 DO bj = myByLo(myThid), myByHi(myThid)
0147 DO bi = myBxLo(myThid), myBxHi(myThid)
0148 DO j=1-OLy,sNy+OLy
0149 DO i=1-OLx,sNx+OLx
0150 IF (STREAMICE_umask(i,j,bi,bj).eq.1.0)
0151 & Zu_SI(i,j,bi,bj)=Ru_SI(i,j,bi,bj) / DIAGu_SI(i,j,bi,bj)
0152 IF (STREAMICE_vmask(i,j,bi,bj).eq.1.0)
0153 & Zv_SI(i,j,bi,bj)=Rv_SI(i,j,bi,bj) / DIAGv_SI(i,j,bi,bj)
0154 ENDDO
0155 ENDDO
0156 ENDDO
0157 ENDDO
0158
0159 cg_halo = min(OLx-1,OLy-1)
0160 conv_flag = 0
0161
0162 DO bj = myByLo(myThid), myByHi(myThid)
0163 DO bi = myBxLo(myThid), myBxHi(myThid)
0164 DO j=1-OLy,sNy+OLy
0165 DO i=1-OLx,sNx+OLx
96b006450c dngo*0166 Du_SI(i,j,bi,bj)=Zu_SI(i,j,bi,bj)
5ca83cd8f7 Dani*0167 Dv_SI(i,j,bi,bj)=Zv_SI(i,j,bi,bj)
0168 ENDDO
0169 ENDDO
0170 ENDDO
0171 ENDDO
0172
0173 resid = resid_0
0174 iters = 0
96b006450c dngo*0175
5ca83cd8f7 Dani*0176
0177
0178
0179
0180
0181
0182
0183
0184 WRITE(msgBuf,'(A)') 'BEGINNING MAIN CG LOOP'
0185 CALL PRINT_MESSAGE( msgBuf, standardMessageUnit,
0186 & SQUEEZE_RIGHT , 1)
0187
96b006450c dngo*0188
5ca83cd8f7 Dani*0189
0190 do iter = 1, streamice_max_cg_iter
0191 if (resid .gt. tolerance*resid_0) then
0192
0193
0194 iters = iters + 1
0195
96b006450c dngo*0196 is = 1 - cg_halo
0197 ie = sNx + cg_halo
0198 js = 1 - cg_halo
5ca83cd8f7 Dani*0199 je = sNy + cg_halo
96b006450c dngo*0200
5ca83cd8f7 Dani*0201 DO bj = myByLo(myThid), myByHi(myThid)
0202 DO bi = myBxLo(myThid), myBxHi(myThid)
0203 DO j=1-OLy,sNy+OLy
96b006450c dngo*0204 DO i=1-OLx,sNx+OLx
5ca83cd8f7 Dani*0205 Au_SI(i,j,bi,bj) = 0. _d 0
0206 Av_SI(i,j,bi,bj) = 0. _d 0
0207 ENDDO
0208 ENDDO
0209 ENDDO
0210 ENDDO
0211
96b006450c dngo*0212
0213
0214
0215
0216
0217
0218
0219
0220
0221
0222
0223
0224
0225
0226
0227
0228
0229
0230
0231
0232
0233
0234
0235
0236
0237
0238
0239
0240
0241
0242 CALL STREAMICE_CG_ACTION( myThid,
0243 O Au_SI,
0244 O Av_SI,
0245 I Du_SI,
0246 I Dv_SI,
5ca83cd8f7 Dani*0247 I is,ie,js,je)
0248
96b006450c dngo*0249
5ca83cd8f7 Dani*0250
96b006450c dngo*0251
5ca83cd8f7 Dani*0252
0253 DO bj = myByLo(myThid), myByHi(myThid)
0254 DO bi = myBxLo(myThid), myBxHi(myThid)
0255 dot_p1_tile(bi,bj) = 0. _d 0
96b006450c dngo*0256 dot_p2_tile(bi,bj) = 0. _d 0
5ca83cd8f7 Dani*0257 ENDDO
0258 ENDDO
0259
0260 DO bj = myByLo(myThid), myByHi(myThid)
0261 DO bi = myBxLo(myThid), myBxHi(myThid)
0262 DO j=1,sNy
0263 DO i=1,sNx
0264 IF (STREAMICE_umask(i,j,bi,bj).eq.1.0) THEN
0265 dot_p1_tile(bi,bj)=dot_p1_tile(bi,bj)+Zu_SI(i,j,bi,bj)*
0266 & Ru_SI(i,j,bi,bj)
0267 dot_p2_tile(bi,bj)=dot_p2_tile(bi,bj)+Du_SI(i,j,bi,bj)*
0268 & Au_SI(i,j,bi,bj)
0269 ENDIF
0270 IF (STREAMICE_vmask(i,j,bi,bj).eq.1.0) THEN
0271 dot_p1_tile(bi,bj)=dot_p1_tile(bi,bj)+Zv_SI(i,j,bi,bj)*
0272 & Rv_SI(i,j,bi,bj)
0273 dot_p2_tile(bi,bj)=dot_p2_tile(bi,bj)+Dv_SI(i,j,bi,bj)*
0274 & Av_SI(i,j,bi,bj)
0275 ENDIF
0276 ENDDO
0277 ENDDO
0278 ENDDO
0279 ENDDO
0280
0281 CALL GLOBAL_SUM_TILE_RL( dot_p1_tile, dot_p1, myThid )
96b006450c dngo*0282 CALL GLOBAL_SUM_TILE_RL( dot_p2_tile, dot_p2, myThid )
5ca83cd8f7 Dani*0283 alpha_k = dot_p1/dot_p2
0284
0285 DO bj = myByLo(myThid), myByHi(myThid)
0286 DO bi = myBxLo(myThid), myBxHi(myThid)
0287 DO j=1-OLy,sNy+OLy
0288 DO i=1-OLx,sNx+OLx
0289
0290 IF (STREAMICE_umask(i,j,bi,bj).eq.1.0) THEN
0291 cg_Uin(i,j,bi,bj)=cg_Uin(i,j,bi,bj)+
0292 & alpha_k*Du_SI(i,j,bi,bj)
0293 Ru_old_SI(i,j,bi,bj) = Ru_SI(i,j,bi,bj)
0294 Zu_old_SI(i,j,bi,bj) = Zu_SI(i,j,bi,bj)
0295 Ru_SI(i,j,bi,bj) = Ru_SI(i,j,bi,bj)-
0296 & alpha_k*Au_SI(i,j,bi,bj)
96b006450c dngo*0297 Zu_SI(i,j,bi,bj) = Ru_SI(i,j,bi,bj) /
5ca83cd8f7 Dani*0298 & DIAGu_SI(i,j,bi,bj)
0299 ENDIF
0300
0301 IF (STREAMICE_vmask(i,j,bi,bj).eq.1.0) THEN
0302 cg_Vin(i,j,bi,bj)=cg_Vin(i,j,bi,bj)+
0303 & alpha_k*Dv_SI(i,j,bi,bj)
0304 Rv_old_SI(i,j,bi,bj) = Rv_SI(i,j,bi,bj)
0305 Zv_old_SI(i,j,bi,bj) = Zv_SI(i,j,bi,bj)
0306 Rv_SI(i,j,bi,bj) = Rv_SI(i,j,bi,bj)-
0307 & alpha_k*Av_SI(i,j,bi,bj)
96b006450c dngo*0308 Zv_SI(i,j,bi,bj) = Rv_SI(i,j,bi,bj) /
5ca83cd8f7 Dani*0309 & DIAGv_SI(i,j,bi,bj)
0310
0311 ENDIF
0312 ENDDO
0313 ENDDO
0314 ENDDO
0315 ENDDO
0316
0317 DO bj = myByLo(myThid), myByHi(myThid)
0318 DO bi = myBxLo(myThid), myBxHi(myThid)
0319 dot_p1_tile(bi,bj) = 0. _d 0
96b006450c dngo*0320 dot_p2_tile(bi,bj) = 0. _d 0
5ca83cd8f7 Dani*0321 ENDDO
0322 ENDDO
0323
0324 DO bj = myByLo(myThid), myByHi(myThid)
0325 DO bi = myBxLo(myThid), myBxHi(myThid)
0326 DO j=1,sNy
0327 DO i=1,sNx
0328
0329 IF (STREAMICE_umask(i,j,bi,bj).eq.1.0) THEN
0330 dot_p1_tile(bi,bj)=dot_p1_tile(bi,bj)+Zu_SI(i,j,bi,bj)*
0331 & Ru_SI(i,j,bi,bj)
0332 dot_p2_tile(bi,bj)=dot_p2_tile(bi,bj)+Zu_old_SI(i,j,bi,bj)*
0333 & Ru_old_SI(i,j,bi,bj)
0334 ENDIF
0335
0336 IF (STREAMICE_vmask(i,j,bi,bj).eq.1.0) THEN
0337 dot_p1_tile(bi,bj)=dot_p1_tile(bi,bj)+Zv_SI(i,j,bi,bj)*
0338 & Rv_SI(i,j,bi,bj)
0339 dot_p2_tile(bi,bj)=dot_p2_tile(bi,bj)+Zv_old_SI(i,j,bi,bj)*
0340 & Rv_old_SI(i,j,bi,bj)
0341 ENDIF
0342
0343 ENDDO
0344 ENDDO
0345 ENDDO
0346 ENDDO
0347
0348 CALL GLOBAL_SUM_TILE_RL( dot_p1_tile, dot_p1, myThid )
0349 CALL GLOBAL_SUM_TILE_RL( dot_p2_tile, dot_p2, myThid )
96b006450c dngo*0350
5ca83cd8f7 Dani*0351 beta_k = dot_p1/dot_p2
0352
0353 DO bj = myByLo(myThid), myByHi(myThid)
0354 DO bi = myBxLo(myThid), myBxHi(myThid)
0355 DO j=1-OLy,sNy+OLy
0356 DO i=1-OLx,sNx+OLx
96b006450c dngo*0357 IF (STREAMICE_umask(i,j,bi,bj).eq.1.0)
5ca83cd8f7 Dani*0358 & Du_SI(i,j,bi,bj)=beta_k*Du_SI(i,j,bi,bj)+
0359 & Zu_SI(i,j,bi,bj)
96b006450c dngo*0360 IF (STREAMICE_vmask(i,j,bi,bj).eq.1.0)
5ca83cd8f7 Dani*0361 & Dv_SI(i,j,bi,bj)=beta_k*Dv_SI(i,j,bi,bj)+
0362 & Zv_SI(i,j,bi,bj)
0363 ENDDO
0364 ENDDO
0365 ENDDO
0366 ENDDO
0367
0368 DO bj = myByLo(myThid), myByHi(myThid)
0369 DO bi = myBxLo(myThid), myBxHi(myThid)
0370 dot_p1_tile(bi,bj) = 0. _d 0
0371 ENDDO
0372 ENDDO
0373
0374 DO bj = myByLo(myThid), myByHi(myThid)
0375 DO bi = myBxLo(myThid), myBxHi(myThid)
0376 DO j=1,sNy
0377 DO i=1,sNx
0378 IF (STREAMICE_umask(i,j,bi,bj).eq.1.0)
0379 & dot_p1_tile(bi,bj)=dot_p1_tile(bi,bj)+Ru_SI(i,j,bi,bj)**2
0380 IF (STREAMICE_vmask(i,j,bi,bj).eq.1.0)
0381 & dot_p1_tile(bi,bj)=dot_p1_tile(bi,bj)+Rv_SI(i,j,bi,bj)**2
0382 ENDDO
0383 ENDDO
0384 ENDDO
0385 ENDDO
0386
96b006450c dngo*0387 CALL GLOBAL_SUM_TILE_RL( dot_p1_tile, dot_p1, myThid )
5ca83cd8f7 Dani*0388 resid = sqrt(dot_p1)
0389
96b006450c dngo*0390
0391
0392
5ca83cd8f7 Dani*0393
0394 cg_halo = cg_halo - 1
0395
0396 if (cg_halo .eq. 0) then
0397 cg_halo = min(OLx-1,OLy-1)
0398 _EXCH_XY_RL( Du_SI, myThid )
0399 _EXCH_XY_RL( Dv_SI, myThid )
0400 _EXCH_XY_RL( Ru_SI, myThid )
0401 _EXCH_XY_RL( Rv_SI, myThid )
0402 _EXCH_XY_RL( cg_Uin, myThid )
0403 _EXCH_XY_RL( cg_Vin, myThid )
0404 endif
0405
0406 endif
0407 enddo
96b006450c dngo*0408
5ca83cd8f7 Dani*0409
0410
96b006450c dngo*0411
5ca83cd8f7 Dani*0412 IF (iters .lt. streamice_max_cg_iter) THEN
0413 conv_flag = 1
0414 ENDIF
0415
96b006450c dngo*0416
0417
0418
0419
0420
0421
0422
0423
0424
0425
0426
0427
0428
0429
0430
5ca83cd8f7 Dani*0431
0432 #endif
0433 RETURN
0434 END