File indexing completed on 2023-09-21 05:10:52 UTC
view on githubraw file Latest commit 96b00645 on 2023-09-20 15:15:14 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"
0048 #include "STREAMICE_CG.h"
0049
0050
0051 INTEGER myThid
0052 INTEGER maxNLIter
0053 INTEGER maxCGiter
0054 _RL cgtol
0055 _RL err_last_change
2be4afbb6e Dani*0056 _RL err_init
95afe7199b Dani*0057 INTEGER nL_iter
0058 LOGICAL CONVERGED
0059 INTEGER isinloop
0060 #ifdef ALLOW_OPENAD
0061 INTEGER adj_iter
0062 LOGICAL adj_CONVERGED
0063 #endif
0064
4e4ad91a39 Jean*0065 #ifdef ALLOW_STREAMICE_OAD_FP
95afe7199b Dani*0066
0067
0068
0069 INTEGER i, j, bi, bj, cg_iters, m
96b006450c dngo*0070 _RL err_max, err_max_fp
95afe7199b Dani*0071 CHARACTER*(MAX_LEN_MBUF) msgBuf
4e4ad91a39 Jean*0072
95afe7199b Dani*0073 #ifdef ALLOW_OPENAD
0074 adj_iter=0
0075 adj_CONVERGED=.false.
0076 #endif
0077
96b006450c dngo*0078 IF (ISINLOOP .ne. 0) THEN
0079 IF (.NOT. CONVERGED) THEN
95ea1bba23 Dani*0080 NL_ITER = (NL_ITER + 1)
0081 CALL streamice_vel_phi(MYTHID,MAXNLITER,MAXCGITER,CGTOL
0082 +,CG_ITERS,err_max)
95afe7199b Dani*0083
96b006450c dngo*0084 WRITE(msgBuf,'(A,I5,A,I4,A)') 'streamice linear solve number',
95ea1bba23 Dani*0085 +NL_ITER,' ',CG_ITERS,' iterations '
96b006450c dngo*0086 CALL PRINT_MESSAGE( msgBuf, standardMessageUnit,
0087 + SQUEEZE_RIGHT, 1)
95afe7199b Dani*0088
95ea1bba23 Dani*0089
95afe7199b Dani*0090
96b006450c dngo*0091 IF (STREAMICE_chkresidconvergence) THEN
95afe7199b Dani*0092
95ea1bba23 Dani*0093 WRITE(msgBuf,'(A,E15.7)') 'err/err_init', err_max/err_init
96b006450c dngo*0094 CALL PRINT_MESSAGE( msgBuf, standardMessageUnit,
0095 + SQUEEZE_RIGHT, 1)
95afe7199b Dani*0096
95ea1bba23 Dani*0097 IF (err_max .LE. streamice_nonlin_tol * err_init) THEN
96b006450c dngo*0098 CONVERGED = .TRUE.
95ea1bba23 Dani*0099 ENDIF
95afe7199b Dani*0100
95ea1bba23 Dani*0101 IF (err_max<err_last_change*1.e-2 .and. STREAMICE_lower_cg_to
0102 +l) THEN
0103 cgtol = cgtol * 5.e-2
0104 err_last_change = err_max
0105 WRITE(msgBuf,'(A,E15.7)') 'new cg tol: ', cgtol
96b006450c dngo*0106 CALL PRINT_MESSAGE( msgBuf, standardMessageUnit,
0107 + SQUEEZE_RIGHT, 1)
95ea1bba23 Dani*0108 ENDIF
351fd6b6a4 Dani*0109
96b006450c dngo*0110 ENDIF
351fd6b6a4 Dani*0111
96b006450c dngo*0112 IF (STREAMICE_chkfixedptconvergence) THEN
351fd6b6a4 Dani*0113
95ea1bba23 Dani*0114 CALL STREAMICE_GET_FP_ERR_OAD ( err_max_fp, myThid )
351fd6b6a4 Dani*0115
95ea1bba23 Dani*0116 WRITE(msgBuf,'(A,1PE22.14)') 'STREAMICE_FP_ERROR =', err_max_
0117 +fp
96b006450c dngo*0118 CALL PRINT_MESSAGE( msgBuf, standardMessageUnit,
0119 + SQUEEZE_RIGHT, 1)
351fd6b6a4 Dani*0120
95ea1bba23 Dani*0121 IF (err_max_fp .LE. streamice_nonlin_tol_fp) THEN
96b006450c dngo*0122 CONVERGED = .TRUE.
351fd6b6a4 Dani*0123 ENDIF
0124
96b006450c dngo*0125 ENDIF
95ea1bba23 Dani*0126
0127 DO bj = myByLo(myThid), myByHi(myThid)
0128 DO bi = myBxLo(myThid), myBxHi(myThid)
0129 DO j=1-OLy,sNy+OLy
0130 DO i=1-OLx,sNx+OLx
0131 U_streamice (i,j,bi,bj)=u_new_SI (i,j,bi,bj)
0132 V_streamice (i,j,bi,bj)=v_new_SI (i,j,bi,bj)
6b6b38f093 Dani*0133 #ifdef STREAMICE_HYBRID_STRESS
95ea1bba23 Dani*0134 streamice_taubx(i,j,bi,bj)=taubx_new_si(i,j,bi,bj)
0135 streamice_tauby(i,j,bi,bj)=tauby_new_si(i,j,bi,bj)
0136 DO m=Nr,1,-1
0137 visc_streamice_full(i,j,m,bi,bj)= visc_full_new_si(i,j,m,
0138 +bi,bj)
0139 ENDDO
6b6b38f093 Dani*0140 #endif
95ea1bba23 Dani*0141 ENDDO
0142 ENDDO
0143 ENDDO
95afe7199b Dani*0144 ENDDO
0145
95ea1bba23 Dani*0146
0147
96b006450c dngo*0148 ENDIF
0149 ENDIF
95ea1bba23 Dani*0150
4e4ad91a39 Jean*0151 #endif /* ALLOW_STREAMICE_OAD_FP */
95afe7199b Dani*0152 RETURN
0153 END