Back to home page

MITgcm

 
 

    


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 C---+----1----+----2----+----3----+----4----+----5----+----6----+----7-|--+----|
                0007 
                0008 CBOP
feb7fa5d1e dngo*0009       SUBROUTINE STREAMICE_VEL_SOLVE_FP ( myThid, maxNLIter,
96b006450c dngo*0010      &                                maxCGiter, myIter )
95afe7199b Dani*0011 C     /============================================================\
                0012 C     | SUBROUTINE                                                 |
                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"
                0025 
                0026 C     !INPUT/OUTPUT ARGUMENTS
                0027       INTEGER myThid
                0028       INTEGER maxNLIter
                0029       INTEGER maxCGIter
                0030       INTEGER myIter
                0031 
                0032 #ifdef ALLOW_STREAMICE
                0033 
                0034 C     LOCAL VARIABLES
                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 !$AD FP-LOOP "u_streamice,v_streamice,streamice_taubx,streamice_tauby,visc_streamice_full" adj_reduction=1.e-6
                0124 #else
                0125 !$AD FP-LOOP "u_streamice,v_streamice" adj_reduction=2.e-8
                0126 #endif
                0127       DO WHILE (.not.CONVERGED)
                0128 #else
95afe7199b Dani*0129       DO loopiter=1,maxNLIter
feb7fa5d1e dngo*0130 #endif
95afe7199b Dani*0131 
                0132 C     To avoid using "exit", loop goes through all iterations
                0133 C       but after convergence loop does nothing
                0134 
96b006450c dngo*0135 c        IF (.not.CONVERGED) THEN
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 c      DO bj = myByLo(myThid), myByHi(myThid)
                0164 c       DO bi = myBxLo(myThid), myBxHi(myThid)
                0165 c        DO j=1-OLy,sNy+OLy
                0166 c         DO i=1-OLx,sNx+OLx
                0167 c          U_streamice (i,j,bi,bj)=u_new_SI (i,j,bi,bj)
                0168 c          V_streamice (i,j,bi,bj)=v_new_SI (i,j,bi,bj)
                0169 c         ENDDO
                0170 c        ENDDO
                0171 c       ENDDO
                0172 c      ENDDO
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 C END NL ITER. LOOP
                0192 C-------------------------------------------------------------------
                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