File indexing completed on 2025-11-22 06:08:49 UTC
view on githubraw file Latest commit feb7fa5d on 2025-11-21 15:45:20 UTC
95afe7199b Dani*0001 #include "STREAMICE_OPTIONS.h"
0002 #ifdef ALLOW_AUTODIFF
0003 # include "AUTODIFF_OPTIONS.h"
0004 #endif
0005
0006
0007
0008
feb7fa5d1e dngo*0009 SUBROUTINE STREAMICE_VEL_SOLVE_FP ( myThid, maxNLIter,
96b006450c dngo*0010 & maxCGiter, myIter )
95afe7199b Dani*0011
0012
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"
0025
0026
0027 INTEGER myThid
0028 INTEGER maxNLIter
0029 INTEGER maxCGIter
0030 INTEGER myIter
0031
0032 #ifdef ALLOW_STREAMICE
0033
0034
0035
feb7fa5d1e dngo*0036 #ifdef ALLOW_STREAMICE_FP_ADJ
95afe7199b Dani*0037 INTEGER i, j, k, l, bi, bj, loopiter
4e4ad91a39 Jean*0038 INTEGER NL_iter
96b006450c dngo*0039 CHARACTER*(MAX_LEN_MBUF) msgBuf
351fd6b6a4 Dani*0040 _RL err_last_change, cgtol, err_init
95afe7199b Dani*0041 LOGICAL CONVERGED
0042
0043 #ifdef ALLOW_OPENAD
0044 INTEGER ADJ_ITER
0045 LOGICAL ADJ_CONVERGED
0046 #endif
0047
0048 isinloop0 =0
0049 isinloop1 =1
0050 isinloop2 =2
0051
0052 IF (STREAMICE_ppm_driving_stress) THEN
0053 CALL STREAMICE_DRIVING_STRESS_PPM (myThid)
0054 ELSE
0055 CALL STREAMICE_DRIVING_STRESS (myThid)
0056 ENDIF
0057
0058 #ifdef STREAMICE_STRESS_BOUNDARY_CONTROL
0059 _EXCH_XY_RL( taudx_SI , myThid )
0060 _EXCH_XY_RL( taudy_SI , myThid )
0061 CALL STREAMICE_FORCED_BUTTRESS (myThid)
0062 #endif
0063
0064 CALL TIMER_START ('STREAMICE_VEL_SOLVE',myThid)
0065
0066 cgtol = streamice_cg_tol
0067 nl_iter = 0
0068 CONVERGED = .false.
0069 err_last_change = 1 _d 1
4e4ad91a39 Jean*0070
95afe7199b Dani*0071 _EXCH_XY_RL( taudx_SI , myThid )
0072 _EXCH_XY_RL( taudy_SI , myThid )
0073
0074 DO bj = myByLo(myThid), myByHi(myThid)
0075 DO bi = myBxLo(myThid), myBxHi(myThid)
0076 DO j=1-OLy,sNy+OLy
0077 DO i=1-OLx,sNx+OLx
0078 U_streamice (i,j,bi,bj)=U_streamice (i,j,bi,bj)
0079 & + 0*u_new_SI (i,j,bi,bj)
0080 V_streamice (i,j,bi,bj)=V_streamice (i,j,bi,bj)
4e4ad91a39 Jean*0081 & + 0*v_new_SI (i,j,bi,bj)
95afe7199b Dani*0082 ENDDO
0083 ENDDO
0084 ENDDO
0085 ENDDO
2be4afbb6e Dani*0086
0087 #ifdef STREAMICE_HYBRID_STRESS
0088 CALL STREAMICE_VISC_BETA_HYBRID ( myThid )
0089 #else
0090 CALL STREAMICE_VISC_BETA ( myThid )
0091 #endif
0092
0093 if (STREAMICE_chkresidconvergence .or.
0094 & (streamice_maxnliter_cpl.eq.0 .and. myIter.eq.0)) then
0095
0096 CALL STREAMICE_GET_VEL_RESID_ERR_OAD ( err_init, myThid )
351fd6b6a4 Dani*0097 err_last_change = err_init
2be4afbb6e Dani*0098
0099 WRITE(msgBuf,'(A,E15.7)') 'initial nonlinear resid (error): ',
0100 & err_init
0101 CALL PRINT_MESSAGE( msgBuf, standardMessageUnit,
0102 & SQUEEZE_RIGHT , 1)
0103
4e4ad91a39 Jean*0104 endif
2be4afbb6e Dani*0105
feb7fa5d1e dngo*0106 #ifdef ALLOW_OPENAD
4e4ad91a39 Jean*0107 CALL STREAMICE_VEL_PHISTAGE (
0108 I myThid,
0109 I maxNLIter,
0110 I maxCGiter,
0111 O cgtol,
95afe7199b Dani*0112 O nL_iter,
0113 O adj_iter,
0114 O CONVERGED,
0115 O ADJ_CONVERGED,
0116 O err_last_change,
2be4afbb6e Dani*0117 O err_init,
95afe7199b Dani*0118 I isinloop0)
0119 #endif
0120
feb7fa5d1e dngo*0121 #if (defined(ALLOW_STREAMICE_FP_ADJ) && defined(ALLOW_TAPENADE))
0122 #ifdef STREAMICE_HYBRID_STRESS
0123
0124 #else
0125
0126 #endif
0127 DO WHILE (.not.CONVERGED)
0128 #else
95afe7199b Dani*0129 DO loopiter=1,maxNLIter
feb7fa5d1e dngo*0130 #endif
95afe7199b Dani*0131
0132
0133
0134
96b006450c dngo*0135
95afe7199b Dani*0136
0137 #ifndef ALLOW_OPENAD
4e4ad91a39 Jean*0138 CALL STREAMICE_VEL_PHISTAGE (
0139 I myThid,
0140 I maxNLIter,
0141 I maxCGiter,
0142 O cgtol,
95afe7199b Dani*0143 O nL_iter,
0144 O CONVERGED,
0145 O err_last_change,
2be4afbb6e Dani*0146 O err_init,
95afe7199b Dani*0147 I isinloop1)
0148 #else
4e4ad91a39 Jean*0149 CALL STREAMICE_VEL_PHISTAGE (
0150 I myThid,
0151 I maxNLIter,
0152 I maxCGiter,
0153 O cgtol,
95afe7199b Dani*0154 O nL_iter,
0155 O adj_iter,
0156 O CONVERGED,
0157 O ADJ_CONVERGED,
0158 O err_last_change,
2be4afbb6e Dani*0159 O err_init,
95afe7199b Dani*0160 I isinloop1)
0161 #endif
0162
96b006450c dngo*0163
0164
0165
0166
0167
0168
0169
0170
0171
0172
95afe7199b Dani*0173
0174 ENDDO
0175
feb7fa5d1e dngo*0176 #ifdef ALLOW_OPENAD
4e4ad91a39 Jean*0177 CALL STREAMICE_VEL_PHISTAGE (
0178 I myThid,
0179 I maxNLIter,
0180 I maxCGiter,
0181 O cgtol,
95afe7199b Dani*0182 O nL_iter,
0183 O adj_iter,
0184 O CONVERGED,
0185 O ADJ_CONVERGED,
0186 O err_last_change,
2be4afbb6e Dani*0187 O err_init,
95afe7199b Dani*0188 I isinloop2)
0189 #endif
0190
0191
0192
0193
0194 if (nl_iter .lt. streamice_max_nl_iter) then
0195 WRITE(msgBuf,'(A,I5,A)') 'VELOCITY SOLVE CONVERGED, ',
0196 & nl_iter, ' iterations'
0197 CALL PRINT_MESSAGE( msgBuf, standardMessageUnit,
0198 & SQUEEZE_RIGHT , 1)
feb7fa5d1e dngo*0199 PRINT *, 'VELOCITY SOLVE CONVERGED, ', nl_iter, 'iterations'
95afe7199b Dani*0200 else
0201 WRITE(msgBuf,'(A,I5,A)') 'VELOCITY SOLVE NOT CONVERGED IN ',
0202 & nl_iter, ' iterations'
0203 CALL PRINT_MESSAGE( msgBuf, standardMessageUnit,
0204 & SQUEEZE_RIGHT , 1)
feb7fa5d1e dngo*0205 PRINT *, 'VELOCITY SOLVE NOT CONVERGED IN ', nl_iter,
0206 & 'iterations'
95afe7199b Dani*0207 endif
0208
0209 _EXCH_XY_RL(U_streamice, myThid)
0210 _EXCH_XY_RL(V_streamice, myThid)
0211
0212 CALL TIMER_STOP ('STREAMICE_VEL_SOLVE',myThid)
0213
0214 #endif
0215 #endif
0216 RETURN
0217 END