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
0009 #ifndef ALLOW_OPENAD
4e4ad91a39 Jean*0010 SUBROUTINE STREAMICE_VEL_PHISTAGE (
0011 I myThid,
0012 I maxNLIter,
0013 I maxCGiter,
0014 O cgtol,
95afe7199b Dani*0015 O nL_iter,
0016 O CONVERGED,
0017 O err_last_change,
2be4afbb6e Dani*0018 O err_init,
95afe7199b Dani*0019 I isinloop)
0020 #else
4e4ad91a39 Jean*0021 SUBROUTINE STREAMICE_VEL_PHISTAGE (
0022 I myThid,
0023 I maxNLIter,
0024 I maxCGiter,
0025 O cgtol,
95afe7199b Dani*0026 O nL_iter,
0027 O adj_iter,
0028 O CONVERGED,
0029 O ADJ_CONVERGED,
0030 O err_last_change,
2be4afbb6e Dani*0031 O err_init,
95afe7199b Dani*0032 I isinloop)
0033 #endif
0034
0035
0036
0037
0038
0039
0040
0041 IMPLICIT NONE
0042
0043
0044 #include "SIZE.h"
0045 #include "EEPARAMS.h"
0046 #include "PARAMS.h"
0047 #include "STREAMICE.h"
feb7fa5d1e dngo*0048 #include "STREAMICE_FP.h"
95afe7199b Dani*0049 #include "STREAMICE_CG.h"
0050
0051
0052 INTEGER myThid
0053 INTEGER maxNLIter
0054 INTEGER maxCGiter
0055 _RL cgtol
0056 _RL err_last_change
2be4afbb6e Dani*0057 _RL err_init
95afe7199b Dani*0058 INTEGER nL_iter
0059 LOGICAL CONVERGED
0060 INTEGER isinloop
0061 #ifdef ALLOW_OPENAD
0062 INTEGER adj_iter
0063 LOGICAL adj_CONVERGED
0064 #endif
0065
feb7fa5d1e dngo*0066 #ifdef ALLOW_STREAMICE_FP_ADJ
95afe7199b Dani*0067
0068
0069
0070 INTEGER i, j, bi, bj, cg_iters, m
96b006450c dngo*0071 _RL err_max, err_max_fp
95afe7199b Dani*0072 CHARACTER*(MAX_LEN_MBUF) msgBuf
4e4ad91a39 Jean*0073
95afe7199b Dani*0074 #ifdef ALLOW_OPENAD
0075 adj_iter=0
0076 adj_CONVERGED=.false.
0077 #endif
0078
96b006450c dngo*0079 IF (ISINLOOP .ne. 0) THEN
feb7fa5d1e dngo*0080 #ifdef ALLOW_OPENAD
96b006450c dngo*0081 IF (.NOT. CONVERGED) THEN
feb7fa5d1e dngo*0082 #endif
95ea1bba23 Dani*0083 NL_ITER = (NL_ITER + 1)
0084 CALL streamice_vel_phi(MYTHID,MAXNLITER,MAXCGITER,CGTOL
0085 +,CG_ITERS,err_max)
95afe7199b Dani*0086
96b006450c dngo*0087 WRITE(msgBuf,'(A,I5,A,I4,A)') 'streamice linear solve number',
95ea1bba23 Dani*0088 +NL_ITER,' ',CG_ITERS,' iterations '
96b006450c dngo*0089 CALL PRINT_MESSAGE( msgBuf, standardMessageUnit,
0090 + SQUEEZE_RIGHT, 1)
95afe7199b Dani*0091
95ea1bba23 Dani*0092
95afe7199b Dani*0093
96b006450c dngo*0094 IF (STREAMICE_chkresidconvergence) THEN
95afe7199b Dani*0095
95ea1bba23 Dani*0096 WRITE(msgBuf,'(A,E15.7)') 'err/err_init', err_max/err_init
96b006450c dngo*0097 CALL PRINT_MESSAGE( msgBuf, standardMessageUnit,
0098 + SQUEEZE_RIGHT, 1)
95afe7199b Dani*0099
95ea1bba23 Dani*0100 IF (err_max .LE. streamice_nonlin_tol * err_init) THEN
96b006450c dngo*0101 CONVERGED = .TRUE.
95ea1bba23 Dani*0102 ENDIF
95afe7199b Dani*0103
95ea1bba23 Dani*0104 IF (err_max<err_last_change*1.e-2 .and. STREAMICE_lower_cg_to
0105 +l) THEN
0106 cgtol = cgtol * 5.e-2
0107 err_last_change = err_max
0108 WRITE(msgBuf,'(A,E15.7)') 'new cg tol: ', cgtol
96b006450c dngo*0109 CALL PRINT_MESSAGE( msgBuf, standardMessageUnit,
0110 + SQUEEZE_RIGHT, 1)
95ea1bba23 Dani*0111 ENDIF
351fd6b6a4 Dani*0112
96b006450c dngo*0113 ENDIF
351fd6b6a4 Dani*0114
96b006450c dngo*0115 IF (STREAMICE_chkfixedptconvergence) THEN
351fd6b6a4 Dani*0116
95ea1bba23 Dani*0117 CALL STREAMICE_GET_FP_ERR_OAD ( err_max_fp, myThid )
351fd6b6a4 Dani*0118
95ea1bba23 Dani*0119 WRITE(msgBuf,'(A,1PE22.14)') 'STREAMICE_FP_ERROR =', err_max_
0120 +fp
96b006450c dngo*0121 CALL PRINT_MESSAGE( msgBuf, standardMessageUnit,
0122 + SQUEEZE_RIGHT, 1)
351fd6b6a4 Dani*0123
95ea1bba23 Dani*0124 IF (err_max_fp .LE. streamice_nonlin_tol_fp) THEN
96b006450c dngo*0125 CONVERGED = .TRUE.
351fd6b6a4 Dani*0126 ENDIF
0127
96b006450c dngo*0128 ENDIF
95ea1bba23 Dani*0129
0130 DO bj = myByLo(myThid), myByHi(myThid)
0131 DO bi = myBxLo(myThid), myBxHi(myThid)
0132 DO j=1-OLy,sNy+OLy
0133 DO i=1-OLx,sNx+OLx
0134 U_streamice (i,j,bi,bj)=u_new_SI (i,j,bi,bj)
0135 V_streamice (i,j,bi,bj)=v_new_SI (i,j,bi,bj)
6b6b38f093 Dani*0136 #ifdef STREAMICE_HYBRID_STRESS
95ea1bba23 Dani*0137 streamice_taubx(i,j,bi,bj)=taubx_new_si(i,j,bi,bj)
0138 streamice_tauby(i,j,bi,bj)=tauby_new_si(i,j,bi,bj)
0139 DO m=Nr,1,-1
0140 visc_streamice_full(i,j,m,bi,bj)= visc_full_new_si(i,j,m,
0141 +bi,bj)
0142 ENDDO
6b6b38f093 Dani*0143 #endif
95ea1bba23 Dani*0144 ENDDO
0145 ENDDO
0146 ENDDO
95afe7199b Dani*0147 ENDDO
0148
95ea1bba23 Dani*0149
feb7fa5d1e dngo*0150 #ifdef ALLOW_OPENAD
96b006450c dngo*0151 ENDIF
feb7fa5d1e dngo*0152 #endif
96b006450c dngo*0153 ENDIF
95ea1bba23 Dani*0154
feb7fa5d1e dngo*0155 #endif /* ALLOW_STREAMICE_FP_ADJ */
95afe7199b Dani*0156 RETURN
0157 END