File indexing completed on 2023-05-28 05:10:38 UTC
view on githubraw file Latest commit b4daa243 on 2023-05-28 03:53:22 UTC
5ca83cd8f7 Dani*0001 #include "STREAMICE_OPTIONS.h"
9d8b0af494 Jean*0002 #ifdef ALLOW_AUTODIFF
0003 # include "AUTODIFF_OPTIONS.h"
0004 #endif
5ca83cd8f7 Dani*0005
0006
0007
0008
d2cdb9260d Dani*0009 SUBROUTINE STREAMICE_VEL_SOLVE( myThid, maxNLIter, maxCGiter,
07e785229e dngo*0010 & myIter )
5ca83cd8f7 Dani*0011
96c608bee8 Jean*0012
5ca83cd8f7 Dani*0013
0014
0015
0016
0017 IMPLICIT NONE
0018
0019
0020 #include "SIZE.h"
0021 #include "EEPARAMS.h"
0022 #include "PARAMS.h"
0023 #include "STREAMICE.h"
0024 #include "STREAMICE_CG.h"
18a089944d Dani*0025
5ca83cd8f7 Dani*0026 #ifdef ALLOW_AUTODIFF_TAMC
0027 # include "tamc.h"
0028 #endif
0029
0030
0031 INTEGER myThid
d2cdb9260d Dani*0032 INTEGER maxNLIter
0033 INTEGER maxCGIter
0034 INTEGER myIter
5ca83cd8f7 Dani*0035
0036 #ifdef ALLOW_STREAMICE
0037
0038
96c608bee8 Jean*0039
07e785229e dngo*0040
0041
0042
0043
0044
0045
0046
5ca83cd8f7 Dani*0047
07e785229e dngo*0048 INTEGER i, j, iter, cg_iters, bi, bj
5ca83cd8f7 Dani*0049 INTEGER iter_numconv
07e785229e dngo*0050 _RL err_max, err_init, err_max_fp
0051 _RL err_lastchange, cgtol
5ca83cd8f7 Dani*0052 CHARACTER*(MAX_LEN_MBUF) msgBuf
d2cdb9260d Dani*0053 LOGICAL CONVERGED
07e785229e dngo*0054 #ifdef ALLOW_AUTODIFF_TAMC
0055 INTEGER ikey_nl
0056 #endif
0057
0058
5ca83cd8f7 Dani*0059
29d9814714 Dani*0060 IF (STREAMICE_alt_driving_stress) THEN
0061 CALL STREAMICE_DRIVING_STRESS_FD (myThid)
0062 ELSEIF (STREAMICE_ppm_driving_stress) THEN
5ca83cd8f7 Dani*0063 CALL STREAMICE_DRIVING_STRESS_PPM (myThid)
0064 ELSE
0065 CALL STREAMICE_DRIVING_STRESS (myThid)
0066 ENDIF
0067
bdd8102d3e Dani*0068 #ifdef ALLOW_AUTODIFF_TAMC
0069 #ifdef STREAMICE_STRESS_BOUNDARY_CONTROL
07e785229e dngo*0070
0071
bdd8102d3e Dani*0072 #endif
0073 #endif
0074
0075 #ifdef STREAMICE_STRESS_BOUNDARY_CONTROL
0076 _EXCH_XY_RL( taudx_SI , myThid )
0077 _EXCH_XY_RL( taudy_SI , myThid )
0078 CALL STREAMICE_FORCED_BUTTRESS (myThid)
0079 #endif
0080
d2cdb9260d Dani*0081 CALL TIMER_START ('STREAMICE_VEL_SOLVE',myThid)
bdd8102d3e Dani*0082
5ca83cd8f7 Dani*0083 cgtol = streamice_cg_tol
d2cdb9260d Dani*0084 CONVERGED = .false.
0085 err_max = 0.
0086 err_max_fp = 0.
5ca83cd8f7 Dani*0087
7b7bae94ed Mart*0088 _EXCH_XY_RL( taudx_SI , myThid )
0089 _EXCH_XY_RL( taudy_SI , myThid )
5ca83cd8f7 Dani*0090
0091 DO bj = myByLo(myThid), myByHi(myThid)
0092 DO bi = myBxLo(myThid), myBxHi(myThid)
0093 DO j=1-OLy,sNy+OLy
0094 DO i=1-OLx,sNx+OLx
0095 u_old_SI (i,j,bi,bj) = U_streamice (i,j,bi,bj)
0096 v_old_SI (i,j,bi,bj) = V_streamice (i,j,bi,bj)
0097 ENDDO
0098 ENDDO
0099 ENDDO
0100 ENDDO
0101
0102 #ifdef ALLOW_AUTODIFF_TAMC
07e785229e dngo*0103
0104
5ca83cd8f7 Dani*0105 #ifdef STREAMICE_HYBRID_STRESS
07e785229e dngo*0106
0107
0108
5ca83cd8f7 Dani*0109 #endif
0110 #endif
0111
0112 #ifdef STREAMICE_HYBRID_STRESS
0113 CALL STREAMICE_VISC_BETA_HYBRID ( myThid )
0114 #else
0115 CALL STREAMICE_VISC_BETA ( myThid )
0116 #endif
0117
0118 #ifdef STREAMICE_HYBRID_STRESS
07e785229e dngo*0119
5ca83cd8f7 Dani*0120 #endif
0121
7b7bae94ed Mart*0122 _EXCH_XY_RL( tau_beta_eff_streamice , myThid )
0123 _EXCH_XY_RL( visc_streamice , myThid )
5ca83cd8f7 Dani*0124
07e785229e dngo*0125
6f2f55f3c7 Dani*0126 err_init = 0. _d 0
0127
d2cdb9260d Dani*0128 if (STREAMICE_chkresidconvergence .or.
0129 & (streamice_maxnliter_cpl.eq.0 .and. myIter.eq.0)) then
96c608bee8 Jean*0130
0fbff46b46 dngo*0131 CALL STREAMICE_GET_VEL_RESID_ERR ( err_init,
0132 #ifdef ALLOW_AUTODIFF_TAMC
0133 I ikey_dynamics,
0134 #endif
0135 I myThid )
5ca83cd8f7 Dani*0136
0137 #ifdef ALLOW_AUTODIFF_TAMC
07e785229e dngo*0138
5ca83cd8f7 Dani*0139 #endif
0140
d2cdb9260d Dani*0141 WRITE(msgBuf,'(A,E15.7)') 'initial nonlinear resid (error): ',
5ca83cd8f7 Dani*0142 & err_init
d2cdb9260d Dani*0143 CALL PRINT_MESSAGE( msgBuf, standardMessageUnit,
5ca83cd8f7 Dani*0144 & SQUEEZE_RIGHT , 1)
0145
d2cdb9260d Dani*0146 endif
0147
5ca83cd8f7 Dani*0148 iter_numconv = 0
0149 err_max = err_init
0150 err_max_fp = streamice_nonlin_tol_fp * 10.
0151 err_lastchange = err_init
0152
0153
0154
b4daa24319 Shre*0155 #ifdef ALLOW_TAPENADE
0156
0157
0158 #endif
d2cdb9260d Dani*0159 DO iter=1,maxNLIter
5ca83cd8f7 Dani*0160
96c608bee8 Jean*0161
5ca83cd8f7 Dani*0162
0163
0164 #ifdef ALLOW_AUTODIFF_TAMC
0165 ikey_nl = (ikey_dynamics-1)*streamice_max_nl + iter
0166 #endif
0167 #ifdef ALLOW_AUTODIFF_TAMC
07e785229e dngo*0168
0169
0170
0171
0172
0173
0174
0175
0176
0177
0178
0179
0180
0181
0182
0183
0184
0185
5ca83cd8f7 Dani*0186 #endif
0187
07e785229e dngo*0188
0189
d2cdb9260d Dani*0190
0191 #ifdef ALLOW_AUTODIFF_TAMC
07e785229e dngo*0192
d2cdb9260d Dani*0193 #endif
0194
9d8b0af494 Jean*0195 IF (.not.CONVERGED) THEN
5ca83cd8f7 Dani*0196
0197 iter_numconv = iter_numconv + 1
0198
0199 #ifdef ALLOW_AUTODIFF_TAMC
07e785229e dngo*0200
0201
0202
0203
0204
0205
0206
0207
0208
0209
0210
0211
0212
0213
0214
0215 #endif
0216
0217 petscFlag = 0
0218 #ifdef ALLOW_PETSC
0219 if (streamice_use_petsc) then
0220 if (iter .le. streamice_maxnliter_petsc) then
0221 petscFlag = 1
0222 endif
0223 endif
5ca83cd8f7 Dani*0224 #endif
0225
96c608bee8 Jean*0226 CALL STREAMICE_CG_WRAPPER(
5ca83cd8f7 Dani*0227 & U_streamice,
0228 & V_streamice,
0229 & taudx_SI,
96c608bee8 Jean*0230 & taudy_SI,
0231 & cgtol,
5ca83cd8f7 Dani*0232 & cg_iters,
d2cdb9260d Dani*0233 & maxCGIter,
5ca83cd8f7 Dani*0234 & myThid )
0235
0236 #ifdef STREAMICE_HYBRID_STRESS
0237 #ifdef ALLOW_AUTODIFF_TAMC
07e785229e dngo*0238
0239
5ca83cd8f7 Dani*0240 #endif
0241 #endif
0242
0243 #ifdef STREAMICE_HYBRID_STRESS
0244 CALL STREAMICE_TAUB (myThid)
0245 #endif
0246
07e785229e dngo*0247
5ca83cd8f7 Dani*0248 WRITE(msgBuf,'(A,I5,A,I4,A)') 'streamice linear solve number',
0249 & iter, " ",
0250 & cg_iters,
0251 & ' iterations '
0252 CALL PRINT_MESSAGE( msgBuf, standardMessageUnit,
0253 & SQUEEZE_RIGHT , 1)
07e785229e dngo*0254
5ca83cd8f7 Dani*0255
0256 #ifdef ALLOW_AUTODIFF_TAMC
07e785229e dngo*0257
0258
5ca83cd8f7 Dani*0259 #ifdef STREAMICE_HYBRID_STRESS
07e785229e dngo*0260
0261
0262
5ca83cd8f7 Dani*0263 #endif
0264 #endif
0265
0266 #ifdef STREAMICE_HYBRID_STRESS
0267 CALL STREAMICE_VISC_BETA_HYBRID ( myThid )
0268 #else
0269 CALL STREAMICE_VISC_BETA ( myThid )
0270 #endif
0271
d2cdb9260d Dani*0272 _EXCH_XY_RL( tau_beta_eff_streamice , myThid )
0273 _EXCH_XY_RL( visc_streamice , myThid )
5ca83cd8f7 Dani*0274
07e785229e dngo*0275
5ca83cd8f7 Dani*0276
d2cdb9260d Dani*0277 if (STREAMICE_chkresidconvergence .or.
0278 & (streamice_maxnliter_cpl.eq.0 .and. myIter.eq.0)) then
5ca83cd8f7 Dani*0279
0fbff46b46 dngo*0280 CALL STREAMICE_GET_VEL_RESID_ERR ( err_max,
0281 #ifdef ALLOW_AUTODIFF_TAMC
0282 I ikey_nl,
0283 #endif
0284 I myThid )
5ca83cd8f7 Dani*0285
d2cdb9260d Dani*0286 WRITE(msgBuf,'(A,E15.7)') 'err/err_init',
0287 & err_max/err_init
0288 CALL PRINT_MESSAGE( msgBuf, standardMessageUnit,
0289 & SQUEEZE_RIGHT , 1)
5ca83cd8f7 Dani*0290
d2cdb9260d Dani*0291 IF (err_max .LE. streamice_nonlin_tol * err_init) THEN
0292 CONVERGED = .true.
0293 ENDIF
5ca83cd8f7 Dani*0294
9d8b0af494 Jean*0295 endif
5ca83cd8f7 Dani*0296
d2cdb9260d Dani*0297 if (STREAMICE_chkfixedptconvergence .or.
0298 & (streamice_maxnliter_cpl.eq.0 .and. myIter.eq.0)) then
5ca83cd8f7 Dani*0299
0fbff46b46 dngo*0300 CALL STREAMICE_GET_VEL_FP_ERR ( err_max_fp,
0301 #ifdef ALLOW_AUTODIFF_TAMC
0302 I ikey_nl,
0303 #endif
0304 I myThid )
5ca83cd8f7 Dani*0305
0306 DO bj = myByLo(myThid), myByHi(myThid)
0307 DO bi = myBxLo(myThid), myBxHi(myThid)
0308 DO j=1-OLy,sNy+OLy
0309 DO i=1-OLx,sNx+OLx
0310 u_old_SI (i,j,bi,bj) = U_streamice (i,j,bi,bj)
0311 v_old_SI (i,j,bi,bj) = V_streamice (i,j,bi,bj)
0312 ENDDO
0313 ENDDO
0314 ENDDO
0315 ENDDO
0316
d2cdb9260d Dani*0317 WRITE(msgBuf,'(A,1PE22.14)') 'STREAMICE_FP_ERROR =',
0318 & err_max_fp
5ca83cd8f7 Dani*0319 CALL PRINT_MESSAGE( msgBuf, standardMessageUnit,
0320 & SQUEEZE_RIGHT , 1)
0321
d2cdb9260d Dani*0322 IF (err_max_fp .LE. streamice_nonlin_tol_fp) THEN
0323 CONVERGED = .true.
0324 ENDIF
0325
9d8b0af494 Jean*0326 endif
d2cdb9260d Dani*0327
07e785229e dngo*0328
d2cdb9260d Dani*0329
5ca83cd8f7 Dani*0330 IF (err_max<err_lastchange*1.e-2 .and.
0331 & STREAMICE_lower_cg_tol) THEN
0332 cgtol = cgtol * 5.e-2
0333 err_lastchange = err_max
0334 WRITE(msgBuf,'(A,E15.7)') 'new cg tol: ',
0335 & cgtol
0336 CALL PRINT_MESSAGE( msgBuf, standardMessageUnit,
0337 & SQUEEZE_RIGHT , 1)
0338 ENDIF
0339
0340 ENDIF
0341 ENDDO
0342
0343
0344
0345
7ba4a82552 Dani*0346 if (iter_numconv .lt. maxnliter) then
5ca83cd8f7 Dani*0347 WRITE(msgBuf,'(A,I5,A)') 'VELOCITY SOLVE CONVERGED, ',
0348 & iter_numconv, ' iterations'
0349 CALL PRINT_MESSAGE( msgBuf, standardMessageUnit,
0350 & SQUEEZE_RIGHT , 1)
0351 else
0352 WRITE(msgBuf,'(A,I5,A)') 'VELOCITY SOLVE NOT CONVERGED IN ',
0353 & iter_numconv, ' iterations'
0354 CALL PRINT_MESSAGE( msgBuf, standardMessageUnit,
0355 & SQUEEZE_RIGHT , 1)
0356 endif
0357
7b7bae94ed Mart*0358 _EXCH_XY_RL(U_streamice, myThid)
0359 _EXCH_XY_RL(V_streamice, myThid)
d2cdb9260d Dani*0360
0361 CALL TIMER_STOP ('STREAMICE_VEL_SOLVE',myThid)
5ca83cd8f7 Dani*0362
0363 #endif
0364 RETURN
0365 END