Back to home page

MITgcm

 
 

    


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 C---+----1----+----2----+----3----+----4----+----5----+----6----+----7-|--+----|
                0007 
                0008 CBOP
d2cdb9260d Dani*0009       SUBROUTINE STREAMICE_VEL_SOLVE( myThid, maxNLIter, maxCGiter,
07e785229e dngo*0010      &                                myIter )
5ca83cd8f7 Dani*0011 C     /============================================================\
96c608bee8 Jean*0012 C     | SUBROUTINE                                                 |
5ca83cd8f7 Dani*0013 C     | o                                                          |
                0014 C     |============================================================|
                0015 C     |                                                            |
                0016 C     \============================================================/
                0017       IMPLICIT NONE
                0018 
                0019 C     === Global variables ===
                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 C     !INPUT/OUTPUT ARGUMENTS
                0031       INTEGER myThid
d2cdb9260d Dani*0032       INTEGER maxNLIter
                0033       INTEGER maxCGIter
                0034       INTEGER myIter
5ca83cd8f7 Dani*0035 
                0036 #ifdef ALLOW_STREAMICE
                0037 
                0038 C     LOCAL VARIABLES
96c608bee8 Jean*0039 
07e785229e dngo*0040 c   real, dimension(:,:), pointer :: TAUDX, TAUDY, u_prev_iterate, v_prev_iterate, &
                0041 c                         u_bdry_cont, v_bdry_cont, Au, Av, err_u, err_v, &
                0042 c                         geolonq, geolatq, u_last, v_last, float_cond, H_node
                0043 c   type(ocean_grid_type), pointer      :: G
                0044 c   integer                 :: conv_flag, i, j, k,l, iter, isym, &
                0045 c                         isdq, iedq, jsdq, jedq, isd, ied, jsd, jed, isumstart, jsumstart, nodefloat, nsub
                0046 c   real                     :: err_max, err_tempu, err_tempv, err_init, area, max_vel, tempu, tempv, rhoi, rhow
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 c       _RL taudx (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
                0058 c       _RL taudy (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
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 c$TAF STORE taudx_SI = comlev1, key=ikey_dynamics
                0071 c$TAF STORE taudy_SI = comlev1, key=ikey_dynamics
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 c$TAF STORE U_streamice = comlev1, key=ikey_dynamics
                0104 c$TAF STORE V_streamice = comlev1, key=ikey_dynamics
5ca83cd8f7 Dani*0105 #ifdef STREAMICE_HYBRID_STRESS
07e785229e dngo*0106 c$TAF STORE streamice_taubx = comlev1, key=ikey_dynamics
                0107 c$TAF STORE streamice_tauby = comlev1, key=ikey_dynamics
                0108 c$TAF STORE visc_streamice_full = comlev1, key=ikey_dynamics
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 c$TAF STORE visc_streamice_full = comlev1, key=ikey_dynamics
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 c to stop ifort complaining
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 c$TAF STORE err_init = comlev1, key=ikey_dynamics
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 !STREAMICE_chkresidconvergence
                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 C START NL ITER. LOOP
                0154 C-------------------------------------------------------------------
b4daa24319 Shre*0155 #ifdef ALLOW_TAPENADE
                0156 C      Tapenade Pragma for fixed point iters
                0157 C$NOAD FP-LOOP
                0158 #endif
d2cdb9260d Dani*0159       DO iter=1,maxNLIter
5ca83cd8f7 Dani*0160 
96c608bee8 Jean*0161 C     To avoid using "exit", loop goes through all iterations
5ca83cd8f7 Dani*0162 C       but after convergence loop does nothing
                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 c$TAF STORE cgtol = comlev1_stream_nl, key=ikey_nl
                0169 c$TAF STORE err_max = comlev1_stream_nl, key=ikey_nl
                0170 c$TAF STORE err_max_fp = comlev1_stream_nl, key=ikey_nl
                0171 c$TAF STORE err_lastchange = comlev1_stream_nl, key=ikey_nl
                0172 c$TAF STORE ru_old_si = comlev1_stream_nl, key=ikey_nl
                0173 c$TAF STORE rv_old_si = comlev1_stream_nl, key=ikey_nl
                0174 c$TAF STORE u_old_si = comlev1_stream_nl, key=ikey_nl
                0175 c$TAF STORE v_old_si = comlev1_stream_nl, key=ikey_nl
                0176 c$TAF STORE streamice_cg_a1 = comlev1_stream_nl, key=ikey_nl
                0177 c$TAF STORE streamice_cg_a2 = comlev1_stream_nl, key=ikey_nl
                0178 c$TAF STORE streamice_cg_a3 = comlev1_stream_nl, key=ikey_nl
                0179 c$TAF STORE streamice_cg_a4 = comlev1_stream_nl, key=ikey_nl
                0180 c$TAF STORE U_streamice = comlev1_stream_nl, key=ikey_nl
                0181 c$TAF STORE V_streamice = comlev1_stream_nl, key=ikey_nl
                0182 c$TAF STORE tau_beta_eff_streamice = comlev1_stream_nl, key=ikey_nl
                0183 c$TAF STORE visc_streamice = comlev1_stream_nl, key=ikey_nl
                0184 c$TAF STORE zu_old_si = comlev1_stream_nl, key=ikey_nl
                0185 c$TAF STORE zv_old_si = comlev1_stream_nl, key=ikey_nl
5ca83cd8f7 Dani*0186 #endif
                0187 
07e785229e dngo*0188 c        IF ((err_max .GT. streamice_nonlin_tol * err_init) .and.
                0189 c      &     (err_max_fp .GT. streamice_nonlin_tol_fp)) THEN
d2cdb9260d Dani*0190 
                0191 #ifdef ALLOW_AUTODIFF_TAMC
07e785229e dngo*0192 c$TAF STORE CONVERGED = comlev1_stream_nl, key=ikey_nl
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 c$TAF STORE cgtol = comlev1_stream_nl, key=ikey_nl
                0201 c$TAF STORE err_max = comlev1_stream_nl, key=ikey_nl
                0202 c$TAF STORE err_lastchange = comlev1_stream_nl, key=ikey_nl
                0203 c$TAF STORE ru_old_si = comlev1_stream_nl, key=ikey_nl
                0204 c$TAF STORE rv_old_si = comlev1_stream_nl, key=ikey_nl
                0205 c$TAF STORE streamice_cg_a1 = comlev1_stream_nl, key=ikey_nl
                0206 c$TAF STORE streamice_cg_a2 = comlev1_stream_nl, key=ikey_nl
                0207 c$TAF STORE streamice_cg_a3 = comlev1_stream_nl, key=ikey_nl
                0208 c$TAF STORE streamice_cg_a4 = comlev1_stream_nl, key=ikey_nl
                0209 c$TAF STORE U_streamice = comlev1_stream_nl, key=ikey_nl
                0210 c$TAF STORE V_streamice = comlev1_stream_nl, key=ikey_nl
                0211 c$TAF STORE tau_beta_eff_streamice = comlev1_stream_nl, key=ikey_nl
                0212 c$TAF STORE visc_streamice = comlev1_stream_nl, key=ikey_nl
                0213 c$TAF STORE zu_old_si = comlev1_stream_nl, key=ikey_nl
                0214 c$TAF STORE zv_old_si = comlev1_stream_nl, key=ikey_nl
                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 c$TAF STORE U_streamice = comlev1_stream_nl, key=ikey_nl
                0239 c$TAF STORE V_streamice = comlev1_stream_nl, key=ikey_nl
5ca83cd8f7 Dani*0240 #endif
                0241 #endif
                0242 
                0243 #ifdef STREAMICE_HYBRID_STRESS
                0244         CALL STREAMICE_TAUB (myThid)
                0245 #endif
                0246 
07e785229e dngo*0247 c-----------------------------------------------------------------------------
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 c-----------------------------------------------------------------------------
5ca83cd8f7 Dani*0255 
                0256 #ifdef ALLOW_AUTODIFF_TAMC
07e785229e dngo*0257 c$TAF STORE U_streamice = comlev1_stream_nl, key=ikey_nl
                0258 c$TAF STORE V_streamice = comlev1_stream_nl, key=ikey_nl
5ca83cd8f7 Dani*0259 #ifdef STREAMICE_HYBRID_STRESS
07e785229e dngo*0260 c$TAF STORE streamice_taubx = comlev1_stream_nl, key=ikey_nl
                0261 c$TAF STORE streamice_tauby = comlev1_stream_nl, key=ikey_nl
                0262 c$TAF STORE visc_streamice_full = comlev1_stream_nl, key=ikey_nl
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 c----------------------CONVERGENCE TESTS-------------------------------
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 c----------------------END CONVERGENCE TESTS-------------------------------
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 ! (err_max .GT. streamice_nonlin_tol * err_init)
                0341       ENDDO
                0342 
                0343 C END NL ITER. LOOP
                0344 C-------------------------------------------------------------------
                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