New URL for NEMO forge!   http://forge.nemo-ocean.eu

Since March 2022 along with NEMO 4.2 release, the code development moved to a self-hosted GitLab.
This present forge is now archived and remained online for history.
Changeset 13746 – NEMO

Changeset 13746


Ignore:
Timestamp:
2020-11-08T22:25:28+01:00 (3 years ago)
Author:
stefryn
Message:

update test case

Location:
NEMO/branches/2019/dev_r11842_SI3-10_EAP
Files:
8 edited

Legend:

Unmodified
Added
Removed
  • NEMO/branches/2019/dev_r11842_SI3-10_EAP/doc/namelists/namdyn_rhg

    r13662 r13746  
    33!------------------------------------------------------------------------------ 
    44   ln_rhg_EVP       = .true.          !  EVP rheology 
     5   ln_rhg_EAP       = .true.          !  EAP rheology 
    56      ln_aEVP       = .false.         !     adaptive rheology (Kimmritz et al. 2016 & 2017) 
    67      rn_creepl     =   2.0e-9        !     creep limit [1/s] 
  • NEMO/branches/2019/dev_r11842_SI3-10_EAP/src/ICE/icewri.F90

    r13662 r13746  
    254254      CALL iom_rstput( 0, 0, kid, 'sivolu', vt_i         )   ! Ice volume 
    255255      CALL iom_rstput( 0, 0, kid, 'sidive', divu_i*1.0e8 )   ! Ice divergence 
     256      CALL iom_rstput( 0, 0, kid, 'sishea', shear_i*1.0e8 )   ! Ice shear 
    256257      CALL iom_rstput( 0, 0, kid, 'si_amp', at_ip        )   ! Melt pond fraction 
    257258      CALL iom_rstput( 0, 0, kid, 'si_vmp', vt_ip        )   ! Melt pond volume 
  • NEMO/branches/2019/dev_r11842_SI3-10_EAP/src/OCE/LBC/lib_mpp.F90

    r13662 r13746  
    142142   INTEGER, PUBLIC                               ::   ncom_freq                    !: frequency of comm diagnostic 
    143143   INTEGER, PUBLIC , DIMENSION(:,:), ALLOCATABLE ::   ncomm_sequence               !: size of communicated arrays (halos) 
    144    INTEGER, PARAMETER, PUBLIC                    ::   ncom_rec_max = 5000          !: max number of communication record 
     144   INTEGER, PARAMETER, PUBLIC                    ::   ncom_rec_max = 20000          !: max number of communication record 
    145145   INTEGER, PUBLIC                               ::   n_sequence_lbc = 0           !: # of communicated arraysvia lbc 
    146146   INTEGER, PUBLIC                               ::   n_sequence_glb = 0           !: # of global communications 
  • NEMO/branches/2019/dev_r11842_SI3-10_EAP/tests/ICE_RHEO/EXPREF/file_def_nemo-ice.xml

    r12263 r13746  
    4141        <field field_ref="isig2"            name="isig2"   /> 
    4242        <field field_ref="isig3"            name="isig3"   /> 
     43        <field field_ref="aniso"            name="aniso"   /> 
    4344 
    4445        </file> 
  • NEMO/branches/2019/dev_r11842_SI3-10_EAP/tests/ICE_RHEO/EXPREF/namelist_ice_cfg

    r13574 r13746  
    4848&namdyn_rhg     !   Ice rheology 
    4949!------------------------------------------------------------------------------ 
    50    ln_rhg_EVP       = .true.          !  EVP rheology 
     50   ln_rhg_EVP       = .false.          !  EVP rheology 
    5151      ln_aEVP       = .false.          !     adaptive rheology (Kimmritz et al. 2016 & 2017) 
    5252      rn_creepl     =   2.0e-9        !     creep limit [1/s] 
     
    5555      rn_relast     =   0.333         !     ratio of elastic timescale to ice time step: Telast = dt_ice * rn_relast  
    5656                                      !        advised value: 1/3 (rn_nevp=120) or 1/9 (rn_nevp=300) 
    57    ln_rhg_EAP       = .false.          !  EVP rheology 
     57   ln_rhg_EAP       = .true.          !  EAP rheology 
     58   nn_rhg_chkcvg    =   0             !  check convergence of rheology 
     59                                      !     = 0  no check 
     60                                      !     = 1  check at the main time step (output xml: uice_cvg) 
     61                                      !     = 2  check at both main and rheology time steps (additional output: ice_cvg.nc) 
     62                                      !          this option 2 asks a lot of communications between cpu 
    5863/ 
    5964!------------------------------------------------------------------------------ 
     
    96101!------------------------------------------------------------------------------ 
    97102   ln_iceini        = .true.          !  activate ice initialization (T) or not (F) 
    98    ln_iceini_file   = .true.         !  netcdf file provided for initialization (T) or not (F) 
     103   nn_iceini_file   =   1             !     0 = Initialise sea ice based on SSTs 
     104                                      !     1 = Initialise sea ice from single category netcdf file 
     105                                      !     2 = Initialise sea ice from multi category restart file 
    99106   rn_thres_sst     =   2.0           !  max temp. above Tfreeze with initial ice = (sst - tfreeze) 
    100107   rn_hti_ini_n     =   3.0           !  initial ice thickness       (m), North 
  • NEMO/branches/2019/dev_r11842_SI3-10_EAP/tests/ICE_RHEO/MY_SRC/icedyn_rhg_eap.F90

    r13574 r13746  
    4343   USE prtctl         ! Print control 
    4444 
     45   USE netcdf         ! NetCDF library for convergence test 
    4546   IMPLICIT NONE 
    4647   PRIVATE 
     
    4950   PUBLIC   rhg_eap_rst       ! called by icedyn_rhg.F90 
    5051 
    51    REAL(wp), PARAMETER           ::   pphi = 3.141592653589793_wp/12._wp    ! diamond shaped floe smaller angle (default phi = 30 deg) 
     52   REAL(wp), PARAMETER ::   pphi = 3.141592653589793_wp/12._wp    ! diamond shaped floe smaller angle (default phi = 30 deg) 
    5253 
    5354   ! look-up table for calculating structure tensor 
     
    6061   !! * Substitutions 
    6162#  include "vectopt_loop_substitute.h90" 
     63 
     64   !! for convergence tests 
     65   INTEGER ::   ncvgid   ! netcdf file id 
     66   INTEGER ::   nvarid   ! netcdf variable id 
     67   REAL(wp), ALLOCATABLE, DIMENSION(:,:) ::   zmsk00, zmsk15 
    6268   !!---------------------------------------------------------------------- 
    6369   !! NEMO/ICE 4.0 , NEMO Consortium (2018) 
     
    131137      REAL(wp) ::   zdtevp, z1_dtevp                                    ! time step for subcycling 
    132138      REAL(wp) ::   ecc2, z1_ecc2                                       ! square of yield ellipse eccenticity 
    133       REAL(wp) ::   zalph1, z1_alph1                                    ! alpha coef from Bouillon 2009 or Kimmritz 2017 
     139      REAL(wp) ::   zalph1, z1_alph1, zalph2, z1_alph2                  ! alpha coef from Bouillon 2009 or Kimmritz 2017 
     140      REAl(wp) ::   zbetau, zbetav 
    134141      REAL(wp) ::   zm1, zm2, zm3, zmassU, zmassV, zvU, zvV             ! ice/snow mass and volume 
    135       REAL(wp) ::   zdelta, zp_delf, zds2, zdt, zdt2, zdiv, zdiv2, zdsT ! temporary scalars 
     142      REAL(wp) ::   zds2, zdt, zdt2, zdiv, zdiv2, zdsT                  ! temporary scalars 
    136143      REAL(wp) ::   zTauO, zTauB, zRHS, zvel                            ! temporary scalars 
    137144      REAL(wp) ::   zkt                                                 ! isotropic tensile strength for landfast ice 
    138145      REAL(wp) ::   zvCr                                                ! critical ice volume above which ice is landfast 
    139146      ! 
    140       REAL(wp) ::   zresm                                               ! Maximal error on ice velocity 
    141147      REAL(wp) ::   zintb, zintn                                        ! dummy argument 
    142148      REAL(wp) ::   zfac_x, zfac_y 
    143149      REAL(wp) ::   zshear, zdum1, zdum2 
    144       REAL(wp) ::   zstressptmp, zstressmtmp, zstress12tmpF                ! anisotropic stress tensor components 
    145       REAL(wp) ::   zalphar, zalphas                                      ! for mechanical redistribution 
    146       REAL(wp) ::   zmresult11, zmresult12, z1dtevpkth, zp5kth, z1_dtevp_A        ! for structure tensor evolution 
    147       REAL(wp) ::   invw                                                ! for test case 
    148       ! 
    149       REAL(wp), DIMENSION(jpi,jpj) ::   zstress12tmp                     ! anisotropic stress tensor component for regridding 
    150       REAL(wp), DIMENSION(jpi,jpj) ::   zyield11, zyield22, zyield12       ! yield surface tensor for history 
    151       REAL(wp), DIMENSION(jpi,jpj) ::   zp_delt                         ! P/delta at T points 
     150      REAL(wp) ::   zstressptmp, zstressmtmp, zstress12tmpF             ! anisotropic stress tensor components 
     151      REAL(wp) ::   zalphar, zalphas                                    ! for mechanical redistribution 
     152      REAL(wp) ::   zmresult11, zmresult12, z1dtevpkth, zp5kth, z1_dtevp_A  ! for structure tensor evolution 
     153      REAL(wp) ::   zinvw                                                ! for test case 
     154 
     155      ! 
     156      REAL(wp), DIMENSION(jpi,jpj) ::   zstress12tmp                    ! anisotropic stress tensor component for regridding 
     157      REAL(wp), DIMENSION(jpi,jpj) ::   zyield11, zyield22, zyield12    ! yield surface tensor for history 
     158      REAL(wp), DIMENSION(jpi,jpj) ::   zdelta, zp_delt                 ! delta and P/delta at T points 
     159      REAL(wp), DIMENSION(jpi,jpj) ::   zten_i                          ! tension 
    152160      REAL(wp), DIMENSION(jpi,jpj) ::   zbeta                           ! beta coef from Kimmritz 2017 
    153161      ! 
     
    160168      REAL(wp), DIMENSION(jpi,jpj) ::   zds                             ! shear 
    161169      REAL(wp), DIMENSION(jpi,jpj) ::   zs1, zs2, zs12                  ! stress tensor components 
    162 !!$      REAL(wp), DIMENSION(jpi,jpj) ::   zu_ice, zv_ice, zresr           ! check convergence 
    163170      REAL(wp), DIMENSION(jpi,jpj) ::   zsshdyn                         ! array used for the calculation of ice surface slope: 
    164171      !                                                                 !    ocean surface (ssh_m) if ice is not embedded 
     
    174181      REAL(wp), DIMENSION(jpi,jpj) ::   zmsk01x, zmsk01y                ! dummy arrays 
    175182      REAL(wp), DIMENSION(jpi,jpj) ::   zmsk00x, zmsk00y                ! mask for ice presence 
    176       REAL(wp), DIMENSION(jpi,jpj) ::   zfmask, zwf                     ! mask at F points for the ice 
     183      REAL(wp), DIMENSION(jpi,jpj) ::   zfmask                          ! mask at F points for the ice 
    177184 
    178185      REAL(wp), PARAMETER          ::   zepsi  = 1.0e-20_wp             ! tolerance parameter 
    179186      REAL(wp), PARAMETER          ::   zmmin  = 1._wp                  ! ice mass (kg/m2)  below which ice velocity becomes very small 
    180187      REAL(wp), PARAMETER          ::   zamin  = 0.001_wp               ! ice concentration below which ice velocity becomes very small 
     188      !! --- check convergence 
     189      REAL(wp), DIMENSION(jpi,jpj) ::   zu_ice, zv_ice 
    181190      !! --- diags 
    182       REAL(wp), DIMENSION(jpi,jpj) ::   zmsk00 
    183       REAL(wp), ALLOCATABLE, DIMENSION(:,:) ::   zsig1, zsig2, zsig3 
     191      REAL(wp) ::   zsig1, zsig2, zsig12, zfac, z1_strength 
     192      REAL(wp), ALLOCATABLE, DIMENSION(:,:) ::   zsig_I, zsig_II, zsig1_p, zsig2_p          
    184193      !! --- SIMIP diags 
    185194      REAL(wp), ALLOCATABLE, DIMENSION(:,:) ::   zdiag_xmtrp_ice ! X-component of ice mass transport (kg/s) 
     
    192201 
    193202      IF( kt == nit000 .AND. lwp )   WRITE(numout,*) '-- ice_dyn_rhg_eap: EAP sea-ice rheology' 
     203      ! 
     204      ! for diagnostics and convergence tests 
     205      ALLOCATE( zmsk00(jpi,jpj), zmsk15(jpi,jpj) ) 
     206      DO jj = 1, jpj 
     207         DO ji = 1, jpi 
     208            zmsk00(ji,jj) = MAX( 0._wp , SIGN( 1._wp , at_i(ji,jj) - epsi06  ) ) ! 1 if ice    , 0 if no ice 
     209            zmsk15(ji,jj) = MAX( 0._wp , SIGN( 1._wp , at_i(ji,jj) - 0.15_wp ) ) ! 1 if 15% ice, 0 if less 
     210         END DO 
     211      END DO 
    194212      ! 
    195213!!gm for Clem:  OPTIMIZATION:  I think zfmask can be computed one for all at the initialization.... 
     
    206224 
    207225      ! Lateral boundary conditions on velocity (modify zfmask) 
    208       zwf(:,:) = zfmask(:,:) 
    209226      DO jj = 2, jpjm1 
    210227         DO ji = fs_2, fs_jpim1   ! vector opt. 
    211228            IF( zfmask(ji,jj) == 0._wp ) THEN 
    212                zfmask(ji,jj) = rn_ishlat * MIN( 1._wp , MAX( zwf(ji+1,jj), zwf(ji,jj+1), zwf(ji-1,jj), zwf(ji,jj-1) ) ) 
     229               zfmask(ji,jj) = rn_ishlat * MIN( 1._wp , MAX( umask(ji,jj,1), umask(ji,jj+1,1), & 
     230                  &                                          vmask(ji,jj,1), vmask(ji+1,jj,1) ) ) 
    213231            ENDIF 
    214232         END DO 
     
    216234      DO jj = 2, jpjm1 
    217235         IF( zfmask(1,jj) == 0._wp ) THEN 
    218             zfmask(1  ,jj) = rn_ishlat * MIN( 1._wp , MAX( zwf(2,jj), zwf(1,jj+1), zwf(1,jj-1) ) ) 
     236            zfmask(1  ,jj) = rn_ishlat * MIN( 1._wp , MAX( vmask(2,jj,1), umask(1,jj+1,1), umask(1,jj,1) ) ) 
    219237         ENDIF 
    220238         IF( zfmask(jpi,jj) == 0._wp ) THEN 
    221             zfmask(jpi,jj) = rn_ishlat * MIN( 1._wp , MAX( zwf(jpi,jj+1), zwf(jpim1,jj), zwf(jpi,jj-1) ) ) 
     239            zfmask(jpi,jj) = rn_ishlat * MIN( 1._wp , MAX( umask(jpi,jj+1,1), vmask(jpim1,jj,1), umask(jpi,jj-1,1) ) ) 
    222240         ENDIF 
    223241      END DO 
    224242      DO ji = 2, jpim1 
    225243         IF( zfmask(ji,1) == 0._wp ) THEN 
    226             zfmask(ji,1  ) = rn_ishlat * MIN( 1._wp , MAX( zwf(ji+1,1), zwf(ji,2), zwf(ji-1,1) ) ) 
     244            zfmask(ji, 1 ) = rn_ishlat * MIN( 1._wp , MAX( vmask(ji+1,1,1), umask(ji,2,1), vmask(ji,1,1) ) ) 
    227245         ENDIF 
    228246         IF( zfmask(ji,jpj) == 0._wp ) THEN 
    229             zfmask(ji,jpj) = rn_ishlat * MIN( 1._wp , MAX( zwf(ji+1,jpj), zwf(ji-1,jpj), zwf(ji,jpjm1) ) ) 
     247            zfmask(ji,jpj) = rn_ishlat * MIN( 1._wp , MAX( vmask(ji+1,jpj,1), vmask(ji-1,jpj,1), umask(ji,jpjm1,1) ) ) 
    230248         ENDIF 
    231249      END DO 
     
    237255      zrhoco = rau0 * rn_cio  
    238256!extra code for test case boundary conditions 
    239       invw=1._wp/(zrhoco*0.5_wp) 
     257      zinvw=1._wp/(zrhoco*0.5_wp) 
    240258 
    241259      ! ecc2: square of yield ellipse eccenticrity 
     
    243261      z1_ecc2 = 1._wp / ecc2 
    244262 
    245       ! Time step for subcycling 
    246       zdtevp   = rdt_ice / REAL( nn_nevp ) 
    247       z1_dtevp = 1._wp / zdtevp 
    248  
    249263      ! alpha parameters (Bouillon 2009) 
    250264      IF( .NOT. ln_aEVP ) THEN 
    251          zalph1 = ( 2._wp * rn_relast * rdt_ice ) * z1_dtevp 
     265         zdtevp   = rdt_ice / REAL( nn_nevp ) 
     266         zalph1 =   2._wp * rn_relast * REAL( nn_nevp ) 
     267         zalph2 = zalph1 * z1_ecc2 
     268 
    252269         z1_alph1 = 1._wp / ( zalph1 + 1._wp ) 
    253       ENDIF 
     270         z1_alph2 = 1._wp / ( zalph2 + 1._wp ) 
     271      ELSE 
     272         zdtevp   = rdt_ice 
     273         ! zalpha parameters set later on adaptatively 
     274      ENDIF 
     275      z1_dtevp = 1._wp / zdtevp 
    254276          
    255277      ! Initialise stress tensor  
     
    267289 
    268290      ! landfast param from Lemieux(2016): add isotropic tensile strength (following Konig Beatty and Holland, 2010) 
    269       IF( ln_landfast_L16 ) THEN   ;   zkt = rn_tensile 
     291      IF( ln_landfast_L16 ) THEN   ;   zkt = rn_lf_tensile 
    270292      ELSE                         ;   zkt = 0._wp 
    271293      ENDIF 
     
    338360               zvV = 0.5_wp * ( vt_i(ji,jj) * e1e2t(ji,jj) + vt_i(ji,jj+1) * e1e2t(ji,jj+1) ) * r1_e1e2v(ji,jj) * vmask(ji,jj,1) 
    339361               ! ice-bottom stress at U points 
    340                zvCr = zaU(ji,jj) * rn_depfra * hu_n(ji,jj) 
    341                ztaux_base(ji,jj) = - rn_icebfr * MAX( 0._wp, zvU - zvCr ) * EXP( -rn_crhg * ( 1._wp - zaU(ji,jj) ) ) 
     362               zvCr = zaU(ji,jj) * rn_lf_depfra * hu_n(ji,jj) 
     363               ztaux_base(ji,jj) = - rn_lf_bfr * MAX( 0._wp, zvU - zvCr ) * EXP( -rn_crhg * ( 1._wp - zaU(ji,jj) ) ) 
    342364               ! ice-bottom stress at V points 
    343                zvCr = zaV(ji,jj) * rn_depfra * hv_n(ji,jj) 
    344                ztauy_base(ji,jj) = - rn_icebfr * MAX( 0._wp, zvV - zvCr ) * EXP( -rn_crhg * ( 1._wp - zaV(ji,jj) ) ) 
     365               zvCr = zaV(ji,jj) * rn_lf_depfra * hv_n(ji,jj) 
     366               ztauy_base(ji,jj) = - rn_lf_bfr * MAX( 0._wp, zvV - zvCr ) * EXP( -rn_crhg * ( 1._wp - zaV(ji,jj) ) ) 
    345367               ! ice_bottom stress at T points 
    346                zvCr = at_i(ji,jj) * rn_depfra * ht_n(ji,jj) 
    347                tau_icebfr(ji,jj) = - rn_icebfr * MAX( 0._wp, vt_i(ji,jj) - zvCr ) * EXP( -rn_crhg * ( 1._wp - at_i(ji,jj) ) ) 
     368               zvCr = at_i(ji,jj) * rn_lf_depfra * ht_n(ji,jj) 
     369               tau_icebfr(ji,jj) = - rn_lf_bfr * MAX( 0._wp, vt_i(ji,jj) - zvCr ) * EXP( -rn_crhg * ( 1._wp - at_i(ji,jj) ) ) 
    348370            END DO 
    349371         END DO 
     
    368390         l_full_nf_update = jter == nn_nevp   ! false: disable full North fold update (performances) for iter = 1 to nn_nevp-1 
    369391         ! 
    370 !!$         IF(ln_ctl) THEN   ! Convergence test 
    371 !!$            DO jj = 1, jpjm1 
    372 !!$               zu_ice(:,jj) = u_ice(:,jj) ! velocity at previous time step 
    373 !!$               zv_ice(:,jj) = v_ice(:,jj) 
    374 !!$            END DO 
    375 !!$         ENDIF 
     392         ! convergence test 
     393         IF( nn_rhg_chkcvg == 1 .OR. nn_rhg_chkcvg == 2  ) THEN 
     394            DO jj = 1, jpj 
     395               DO ji = 1, jpi 
     396                  zu_ice(ji,jj) = u_ice(ji,jj) * umask(ji,jj,1) ! velocity at previous time step 
     397                  zv_ice(ji,jj) = v_ice(ji,jj) * vmask(ji,jj,1) 
     398               END DO 
     399            END DO 
     400         ENDIF 
    376401 
    377402         ! --- divergence, tension & shear (Appendix B of Hunke & Dukowicz, 2002) --- ! 
    378          DO jj = 1, jpjm1         ! loops start at 1 since there is no boundary condition (lbc_lnk) at i=1 and j=1 for F points 
     403         DO jj = 1, jpjm1 
    379404            DO ji = 1, jpim1 
    380405 
     
    386411            END DO 
    387412         END DO 
    388          CALL lbc_lnk( 'icedyn_rhg_eap', zds, 'F', 1. ) 
    389  
    390          DO jj = 2, jpj    ! loop to jpi,jpj to avoid making a communication for zs1,zs2,zs12 
    391             DO ji = 2, jpi ! no vector loop 
    392  
    393                ! shear at T points  
    394                zdsT = ( zds(ji,jj  ) * e1e2f(ji,jj  ) + zds(ji-1,jj  ) * e1e2f(ji-1,jj  )  & 
    395                   &   + zds(ji,jj-1) * e1e2f(ji,jj-1) + zds(ji-1,jj-1) * e1e2f(ji-1,jj-1)  & 
    396                   &   ) * 0.25_wp * r1_e1e2t(ji,jj) 
    397                !WRITE(numout,*) 'shear output', ji, jj, zdsT 
    398                 
     413         CALL lbc_lnk( 'icedyn_rhg_eap', zds, 'F', 1._wp ) 
     414 
     415         DO jj = 2, jpjm1 
     416            DO ji = 2, jpim1 ! no vector loop 
    399417 
    400418               ! shear**2 at T points (doc eq. A16) 
     
    414432                  &   ) * r1_e1e2t(ji,jj) 
    415433               zdt2 = zdt * zdt 
     434 
     435               ! delta at T points 
     436               zdelta(ji,jj) = SQRT( zdiv2 + ( zdt2 + zds2 ) * z1_ecc2 )   
     437 
     438            END DO 
     439         END DO 
     440         CALL lbc_lnk( 'icedyn_rhg_eap', zdelta, 'T', 1._wp ) 
    416441                
     442         ! P/delta at T points 
     443         DO jj = 1, jpj 
     444            DO ji = 1, jpi 
     445               zp_delt(ji,jj) = strength(ji,jj) / ( zdelta(ji,jj) + rn_creepl ) 
     446            END DO 
     447         END DO 
     448 
     449         DO jj = 2, jpj    ! loop ends at jpi,jpj so that no lbc_lnk are needed for zs1 and zs2 
     450            DO ji = 2, jpi ! no vector loop 
     451 
     452                ! shear at T points  
     453               zdsT = ( zds(ji,jj  ) * e1e2f(ji,jj  ) + zds(ji-1,jj  ) * e1e2f(ji-1,jj  )  & 
     454                  &   + zds(ji,jj-1) * e1e2f(ji,jj-1) + zds(ji-1,jj-1) * e1e2f(ji-1,jj-1)  & 
     455                  &   ) * 0.25_wp * r1_e1e2t(ji,jj) 
     456               !WRITE(numout,*) 'shear output', ji, jj, zdsT 
     457                
     458              ! divergence at T points (duplication to avoid communications) 
     459               zdiv  = ( e2u(ji,jj) * u_ice(ji,jj) - e2u(ji-1,jj) * u_ice(ji-1,jj)   & 
     460                  &    + e1v(ji,jj) * v_ice(ji,jj) - e1v(ji,jj-1) * v_ice(ji,jj-1)   & 
     461                  &    ) * r1_e1e2t(ji,jj) 
     462                
     463               ! tension at T points (duplication to avoid communications) 
     464               zdt  = ( ( u_ice(ji,jj) * r1_e2u(ji,jj) - u_ice(ji-1,jj) * r1_e2u(ji-1,jj) ) * e2t(ji,jj) * e2t(ji,jj)   & 
     465                  &   - ( v_ice(ji,jj) * r1_e1v(ji,jj) - v_ice(ji,jj-1) * r1_e1v(ji,jj-1) ) * e1t(ji,jj) * e1t(ji,jj)   & 
     466                  &   ) * r1_e1e2t(ji,jj) 
     467 
    417468               ! --- anisotropic stress calculation --- ! 
    418                CALL update_stress_rdg (jter, nn_nevp, zdiv, zdt, & 
    419                                        zdsT, paniso_11(ji,jj), paniso_12(ji,jj), & 
    420                                        zstressptmp, zstressmtmp, & 
    421                                        zstress12tmp(ji,jj), strength(ji,jj), & 
    422                                        zalphar, zalphas) 
     469               CALL update_stress_rdg (jter, nn_nevp, zdiv, zdt, zdsT, paniso_11(ji,jj), paniso_12(ji,jj), & 
     470                                       zstressptmp, zstressmtmp, zstress12tmp(ji,jj), strength(ji,jj), zalphar, zalphas) 
    423471 
    424472               ! structure tensor update 
    425                IF (mod(jter,10) == 0) THEN 
    426                   CALL calc_ffrac(zstressptmp, zstressmtmp, zstress12tmp(ji,jj), & 
    427                                   paniso_11(ji,jj), paniso_12(ji,jj),           & 
    428                                   zmresult11,  zmresult12) 
    429  
    430                   paniso_11(ji,jj) = (paniso_11(ji,jj)*z1_dtevp_A  + zp5kth - zmresult11) * z1dtevpkth ! implicit 
    431                   paniso_12(ji,jj) = (paniso_12(ji,jj)*z1_dtevp_A  - zmresult12) * z1dtevpkth ! implicit 
    432                ENDIF 
    433  
     473!!$               IF (mod(jter,10) == 0) THEN 
     474                  CALL calc_ffrac(zstressptmp, zstressmtmp, zstress12tmp(ji,jj), paniso_11(ji,jj), paniso_12(ji,jj), zmresult11,  zmresult12) 
     475 
     476!!$                  paniso_11(ji,jj) = (paniso_11(ji,jj)*z1_dtevp_A  + zp5kth + zmresult11) * z1dtevpkth ! implicit 
     477!!$                  paniso_12(ji,jj) = (paniso_12(ji,jj)*z1_dtevp_A  + zmresult12) * z1dtevpkth ! implicit 
     478                  paniso_11(ji,jj) = (paniso_11(ji,jj)  + 0.5*2.e-5*zdtevp + zmresult11*zdtevp) / (1. + 2.e-5*zdtevp) ! implicit 
     479                  paniso_12(ji,jj) = (paniso_12(ji,jj)                     + zmresult12*zdtevp) / (1. + 2.e-5*zdtevp) ! implicit 
     480!!$               ENDIF 
    434481 
    435482               IF (jter == nn_nevp) THEN 
     
    440487               ENDIF 
    441488 
    442                ! delta at T points 
    443                zdelta = SQRT( zdiv2 + ( zdt2 + zds2 ) * z1_ecc2 )   
    444  
    445                ! P/delta at T points 
    446                zp_delt(ji,jj) = strength(ji,jj) / ( zdelta + rn_creepl ) 
    447  
    448                ! alpha & beta for aEVP 
     489               ! alpha for aEVP 
    449490               !   gamma = 0.5*P/(delta+creepl) * (c*pi)**2/Area * dt/m 
    450491               !   alpha = beta = sqrt(4*gamma) 
    451                !IF( ln_aEVP ) THEN 
    452                !   zalph1   = MAX( 50._wp, rpi * SQRT( 0.5_wp * zp_delt(ji,jj) * r1_e1e2t(ji,jj) * zdt_m(ji,jj) ) ) 
    453                !   z1_alph1 = 1._wp / ( zalph1 + 1._wp ) 
    454                !ENDIF 
    455                 
     492               IF( ln_aEVP ) THEN 
     493                  zalph1   = MAX( 50._wp, rpi * SQRT( 0.5_wp * zp_delt(ji,jj) * r1_e1e2t(ji,jj) * zdt_m(ji,jj) ) ) 
     494                  z1_alph1 = 1._wp / ( zalph1 + 1._wp ) 
     495                  zalph2   = zalph1 
     496                  z1_alph2 = z1_alph1 
     497                  ! explicit: 
     498                  ! z1_alph1 = 1._wp / zalph1 
     499                  ! z1_alph2 = 1._wp / zalph1 
     500                  ! zalph1 = zalph1 - 1._wp 
     501                  ! zalph2 = zalph1 
     502               ENDIF 
     503 
    456504               ! stress at T points (zkt/=0 if landfast) 
    457                !zs1(ji,jj) = ( zs1(ji,jj) * zalph1 + zp_delt(ji,jj) * ( zdiv * (1._wp + zkt) - zdelta * (1._wp - zkt) ) ) * z1_alph1 
    458                !zs2(ji,jj) = ( zs2(ji,jj) * zalph2 + zp_delt(ji,jj) * ( zdt * z1_ecc2 * (1._wp + zkt) ) ) * z1_alph2 
    459                zs1(ji,jj) = ( zs1(ji,jj) + zstressptmp * zalph1  ) * z1_alph1 
    460                zs2(ji,jj) = ( zs2(ji,jj) + zstressmtmp * zalph1  ) * z1_alph1 
     505               !zs1(ji,jj) = ( zs1(ji,jj)*zalph1 + zp_delt(ji,jj) * ( zdiv*(1._wp + zkt) - zdelta(ji,jj)*(1._wp - zkt) ) ) * z1_alph1 
     506               !zs2(ji,jj) = ( zs2(ji,jj)*zalph2 + zp_delt(ji,jj) * ( zdt * z1_ecc2 * (1._wp + zkt) ) ) * z1_alph2 
     507!!$               zs1(ji,jj) = ( zs1(ji,jj) + zstressptmp * zalph1  ) * z1_alph1 
     508!!$               zs2(ji,jj) = ( zs2(ji,jj) + zstressmtmp * zalph1  ) * z1_alph1 
     509               zs1(ji,jj) = ( zs1(ji,jj) * zalph1 + zstressptmp ) * z1_alph1 
     510               zs2(ji,jj) = ( zs2(ji,jj) * zalph1 + zstressmtmp ) * z1_alph1 
    461511               !zs1(ji,jj) = ( stressptmp * zs1(ji,jj) + zalph1  ) * z1_alph1 
    462512               !zs2(ji,jj) = ( stressmtmp * zs2(ji,jj) + zalph1  ) * z1_alph1 
     
    464514            END DO 
    465515         END DO 
    466          !CALL lbc_lnk( 'icedyn_rhg_eap', zp_delt, 'T', 1. ) 
    467516         CALL lbc_lnk_multi( 'icedyn_rhg_eap', zstress12tmp, 'T', 1. , paniso_11, 'T', 1. , paniso_12, 'T', 1.) 
     517 
     518        ! Save beta at T-points for further computations 
     519         IF( ln_aEVP ) THEN 
     520            DO jj = 1, jpj 
     521               DO ji = 1, jpi 
     522                  zbeta(ji,jj) = MAX( 50._wp, rpi * SQRT( 0.5_wp * zp_delt(ji,jj) * r1_e1e2t(ji,jj) * zdt_m(ji,jj) ) ) 
     523               END DO 
     524            END DO 
     525         ENDIF 
    468526 
    469527         DO jj = 1, jpjm1 
     
    471529               ! stress12tmp at F points  
    472530               zstress12tmpF = ( zstress12tmp(ji,jj+1) * e1e2t(ji,jj+1) + zstress12tmp(ji+1,jj+1) * e1e2t(ji+1,jj+1)  & 
    473                   &   + zstress12tmp(ji,jj  ) * e1e2t(ji,jj  ) + zstress12tmp(ji+1,jj  ) * e1e2t(ji+1,jj  )  & 
    474                   &   ) * 0.25_wp * r1_e1e2f(ji,jj) 
    475  
    476                ! alpha & beta for aEVP 
     531                  &            + zstress12tmp(ji,jj  ) * e1e2t(ji,jj  ) + zstress12tmp(ji+1,jj  ) * e1e2t(ji+1,jj  )  & 
     532                  &            ) * 0.25_wp * r1_e1e2f(ji,jj) 
     533 
     534               ! alpha for aEVP 
    477535               IF( ln_aEVP ) THEN 
    478                   zalph1   = MAX( 50._wp, rpi * SQRT( 0.5_wp * zp_delt(ji,jj) * r1_e1e2t(ji,jj) * zdt_m(ji,jj) ) ) 
    479                   z1_alph1 = 1._wp / ( zalph1 + 1._wp ) 
     536                  zalph2   = MAX( zbeta(ji,jj), zbeta(ji+1,jj), zbeta(ji,jj+1), zbeta(ji+1,jj+1) ) 
     537                  z1_alph2 = 1._wp / ( zalph2 + 1._wp ) 
     538                  ! explicit: 
     539                  ! z1_alph2 = 1._wp / zalph2 
     540                  ! zalph2 = zalph2 - 1._wp 
    480541               ENDIF 
    481542                
    482543               ! stress at F points (zkt/=0 if landfast) 
    483544               !zs12(ji,jj)= ( zs12(ji,jj) * zalph2 + zp_delf * ( zds(ji,jj) * z1_ecc2 * (1._wp + zkt) ) * 0.5_wp ) * z1_alph2 
    484                zs12(ji,jj) = ( zs12(ji,jj) + zstress12tmpF * zalph1  ) * z1_alph1 
     545!!$               zs12(ji,jj) = ( zs12(ji,jj) + zstress12tmpF * zalph1  ) * z1_alph1 
     546               zs12(ji,jj) = ( zs12(ji,jj) * zalph1 + zstress12tmpF ) * z1_alph1 
    485547               !zs12(ji,jj) = ( stress12tmpF * zs12(ji,jj) + zalph1  ) * z1_alph1 
    486548 
    487549            END DO 
    488550         END DO 
    489       CALL lbc_lnk_multi( 'icedyn_rhg_eap', zs1, 'T', 1., zs2, 'T', 1., zs12, 'F', 1. ) 
     551         CALL lbc_lnk_multi( 'icedyn_rhg_eap', zs1, 'T', 1., zs2, 'T', 1., zs12, 'F', 1. ) 
    490552 
    491553         ! --- Ice internal stresses (Appendix C of Hunke and Dukowicz, 2002) --- ! 
     
    547609                  ! 
    548610                  IF( ln_aEVP ) THEN !--- ice velocity using aEVP (Kimmritz et al 2016 & 2017) 
    549                      v_ice(ji,jj) = ( (          rswitch * ( zmV_t(ji,jj) * ( zbeta(ji,jj) * v_ice(ji,jj) + v_ice_b(ji,jj) )       & ! previous velocity 
    550                         &                                  + zRHS + zTauO * v_ice(ji,jj) )                                         & ! F + tau_ia + Coriolis + spg + tau_io(only ocean part) 
    551                         &                                  / MAX( zepsi, zmV_t(ji,jj) * ( zbeta(ji,jj) + 1._wp ) + zTauO - zTauB ) & ! m/dt + tau_io(only ice part) + landfast 
    552                         &               + ( 1._wp - rswitch ) * v_ice(ji,jj) * MAX( 0._wp, 1._wp - zdtevp * rn_lfrelax )           & ! static friction => slow decrease to v=0 
    553                         &             ) * zmsk01y(ji,jj) + v_oce(ji,jj) * 0.01_wp * ( 1._wp - zmsk01y(ji,jj) )                     & ! v_ice = v_oce/100 if mass < zmmin & conc < zamin 
     611                     zbetav = MAX( zbeta(ji,jj), zbeta(ji,jj+1) ) 
     612                     v_ice(ji,jj) = ( (          rswitch   * ( zmV_t(ji,jj) * ( zbetav * v_ice(ji,jj) + v_ice_b(ji,jj) )         & ! previous velocity 
     613                        &                                    + zRHS + zTauO * v_ice(ji,jj)                                       & ! F + tau_ia + Coriolis + spg + tau_io(only ocean part) 
     614                        &                                    ) / MAX( zepsi, zmV_t(ji,jj) * ( zbetav + 1._wp ) + zTauO - zTauB ) & ! m/dt + tau_io(only ice part) + landfast 
     615                        &            + ( 1._wp - rswitch ) * (  v_ice_b(ji,jj)                                                   &  
     616                        &                                     + v_ice  (ji,jj) * MAX( 0._wp, zbetav - zdtevp * rn_lf_relax )     & ! static friction => slow decrease to v=0 
     617                        &                                    ) / ( zbetav + 1._wp )                                              & 
     618                        &             ) * zmsk01y(ji,jj) + v_oce(ji,jj) * 0.01_wp * ( 1._wp - zmsk01y(ji,jj) )                   & ! v_ice = v_oce/100 if mass < zmmin & conc < zamin 
    554619                        &           )   * zmsk00y(ji,jj) 
    555620                  ELSE               !--- ice velocity using EVP implicit formulation (cf Madec doc & Bouillon 2009) 
    556                      v_ice(ji,jj) = ( (           rswitch   * ( zmV_t(ji,jj)  * v_ice(ji,jj)                                       & ! previous velocity 
    557                         &                                     + zRHS + zTauO * v_ice(ji,jj) )                                      & ! F + tau_ia + Coriolis + spg + tau_io(only ocean part) 
    558                         &                                     / MAX( zepsi, zmV_t(ji,jj) + zTauO - zTauB )                         & ! m/dt + tau_io(only ice part) + landfast 
    559                         &                + ( 1._wp - rswitch ) * v_ice(ji,jj) * MAX( 0._wp, 1._wp - zdtevp * rn_lfrelax )          & ! static friction => slow decrease to v=0 
    560                         &              ) * zmsk01y(ji,jj) + v_oce(ji,jj) * 0.01_wp * ( 1._wp - zmsk01y(ji,jj) )                    & ! v_ice = v_oce/100 if mass < zmmin & conc < zamin 
     621                     v_ice(ji,jj) = ( (         rswitch   * ( zmV_t(ji,jj)  * v_ice(ji,jj)                                       & ! previous velocity 
     622                        &                                    + zRHS + zTauO * v_ice(ji,jj)                                       & ! F + tau_ia + Coriolis + spg + tau_io(only ocean part) 
     623                        &                                    ) / MAX( zepsi, zmV_t(ji,jj) + zTauO - zTauB )                      & ! m/dt + tau_io(only ice part) + landfast 
     624                        &            + ( 1._wp - rswitch ) *   v_ice(ji,jj) * MAX( 0._wp, 1._wp - zdtevp * rn_lf_relax )         & ! static friction => slow decrease to v=0 
     625                        &              ) * zmsk01y(ji,jj) + v_oce(ji,jj) * 0.01_wp * ( 1._wp - zmsk01y(ji,jj) )                  & ! v_ice = v_oce/100 if mass < zmmin & conc < zamin 
    561626                        &            )   * zmsk00y(ji,jj) 
    562627                  ENDIF 
    563628!extra code for test case boundary conditions 
    564629                  IF (mjg(jj)<25 .or. mjg(jj)>975 .or. mig(ji)<25 .or. mig(ji)>975) THEN 
    565                      v_ice(ji,jj) = invw*(ztauy_ai(ji,jj) + zCorV(ji,jj) + zspgV(ji,jj) + ztauy_oi(ji,jj)) 
     630                     v_ice(ji,jj) = zinvw*(ztauy_ai(ji,jj) + zCorV(ji,jj) + zspgV(ji,jj) + ztauy_oi(ji,jj)) 
    566631                  END IF 
     632 
    567633               END DO 
    568634            END DO 
     
    602668                  ! 
    603669                  IF( ln_aEVP ) THEN !--- ice velocity using aEVP (Kimmritz et al 2016 & 2017) 
    604                      u_ice(ji,jj) = ( (          rswitch * ( zmU_t(ji,jj) * ( zbeta(ji,jj) * u_ice(ji,jj) + u_ice_b(ji,jj) )       & ! previous velocity 
    605                         &                                  + zRHS + zTauO * u_ice(ji,jj) )                                         & ! F + tau_ia + Coriolis + spg + tau_io(only ocean part) 
    606                         &                                  / MAX( zepsi, zmU_t(ji,jj) * ( zbeta(ji,jj) + 1._wp ) + zTauO - zTauB ) & ! m/dt + tau_io(only ice part) + landfast 
    607                         &               + ( 1._wp - rswitch ) * u_ice(ji,jj) * MAX( 0._wp, 1._wp - zdtevp * rn_lfrelax )           & ! static friction => slow decrease to v=0 
    608                         &             ) * zmsk01x(ji,jj) + u_oce(ji,jj) * 0.01_wp * ( 1._wp - zmsk01x(ji,jj) )                     & ! v_ice = v_oce/100 if mass < zmmin & conc < zamin  
     670                     zbetau = MAX( zbeta(ji,jj), zbeta(ji+1,jj) ) 
     671                     u_ice(ji,jj) = ( (          rswitch   * ( zmU_t(ji,jj) * ( zbetau * u_ice(ji,jj) + u_ice_b(ji,jj) )         & ! previous velocity 
     672                        &                                    + zRHS + zTauO * u_ice(ji,jj)                                       & ! F + tau_ia + Coriolis + spg + tau_io(only ocean part) 
     673                        &                                    ) / MAX( zepsi, zmU_t(ji,jj) * ( zbetau + 1._wp ) + zTauO - zTauB ) & ! m/dt + tau_io(only ice part) + landfast 
     674                        &            + ( 1._wp - rswitch ) * (  u_ice_b(ji,jj)                                                   & 
     675                        &                                     + u_ice  (ji,jj) * MAX( 0._wp, zbetau - zdtevp * rn_lf_relax )     & ! static friction => slow decrease to v=0 
     676                        &                                    ) / ( zbetau + 1._wp )                                              & 
     677                        &             ) * zmsk01x(ji,jj) + u_oce(ji,jj) * 0.01_wp * ( 1._wp - zmsk01x(ji,jj) )                   & ! v_ice = v_oce/100 if mass < zmmin & conc < zamin  
    609678                        &           )   * zmsk00x(ji,jj) 
    610679                  ELSE               !--- ice velocity using EVP implicit formulation (cf Madec doc & Bouillon 2009) 
    611                      u_ice(ji,jj) = ( (           rswitch   * ( zmU_t(ji,jj)  * u_ice(ji,jj)                                       & ! previous velocity 
    612                         &                                     + zRHS + zTauO * u_ice(ji,jj) )                                      & ! F + tau_ia + Coriolis + spg + tau_io(only ocean part) 
    613                         &                                     / MAX( zepsi, zmU_t(ji,jj) + zTauO - zTauB )                         & ! m/dt + tau_io(only ice part) + landfast 
    614                         &                + ( 1._wp - rswitch ) * u_ice(ji,jj) * MAX( 0._wp, 1._wp - zdtevp * rn_lfrelax )          & ! static friction => slow decrease to v=0 
    615                         &              ) * zmsk01x(ji,jj) + u_oce(ji,jj) * 0.01_wp * ( 1._wp - zmsk01x(ji,jj) )                    & ! v_ice = v_oce/100 if mass < zmmin & conc < zamin  
     680                     u_ice(ji,jj) = ( (         rswitch   * ( zmU_t(ji,jj)  * u_ice(ji,jj)                                       & ! previous velocity 
     681                        &                                    + zRHS + zTauO * u_ice(ji,jj)                                       & ! F + tau_ia + Coriolis + spg + tau_io(only ocean part) 
     682                        &                                    ) / MAX( zepsi, zmU_t(ji,jj) + zTauO - zTauB )                      & ! m/dt + tau_io(only ice part) + landfast 
     683                        &            + ( 1._wp - rswitch ) *   u_ice(ji,jj) * MAX( 0._wp, 1._wp - zdtevp * rn_lf_relax )         & ! static friction => slow decrease to v=0 
     684                        &              ) * zmsk01x(ji,jj) + u_oce(ji,jj) * 0.01_wp * ( 1._wp - zmsk01x(ji,jj) )                  & ! v_ice = v_oce/100 if mass < zmmin & conc < zamin  
    616685                        &            )   * zmsk00x(ji,jj) 
    617686                  ENDIF 
    618687!extra code for test case boundary conditions 
    619688                  IF (mjg(jj)<25 .or. mjg(jj)>975 .or. mig(ji)<25 .or. mig(ji)>975) THEN 
    620                      u_ice(ji,jj) = invw*(ztaux_ai(ji,jj) + zCorU(ji,jj) + zspgU(ji,jj) + ztaux_oi(ji,jj)) 
     689                     u_ice(ji,jj) = zinvw*(ztaux_ai(ji,jj) + zCorU(ji,jj) + zspgU(ji,jj) + ztaux_oi(ji,jj)) 
    621690                  END IF 
     691 
    622692               END DO 
    623693            END DO 
     
    659729                  ! 
    660730                  IF( ln_aEVP ) THEN !--- ice velocity using aEVP (Kimmritz et al 2016 & 2017) 
    661                      u_ice(ji,jj) = ( (          rswitch * ( zmU_t(ji,jj) * ( zbeta(ji,jj) * u_ice(ji,jj) + u_ice_b(ji,jj) )       & ! previous velocity 
    662                         &                                  + zRHS + zTauO * u_ice(ji,jj) )                                         & ! F + tau_ia + Coriolis + spg + tau_io(only ocean part) 
    663                         &                                  / MAX( zepsi, zmU_t(ji,jj) * ( zbeta(ji,jj) + 1._wp ) + zTauO - zTauB ) & ! m/dt + tau_io(only ice part) + landfast 
    664                         &               + ( 1._wp - rswitch ) * u_ice(ji,jj) * MAX( 0._wp, 1._wp - zdtevp * rn_lfrelax )           & ! static friction => slow decrease to v=0 
    665                         &             ) * zmsk01x(ji,jj) + u_oce(ji,jj) * 0.01_wp * ( 1._wp - zmsk01x(ji,jj) )                     & ! v_ice = v_oce/100 if mass < zmmin & conc < zamin  
     731                     zbetau = MAX( zbeta(ji,jj), zbeta(ji+1,jj) ) 
     732                     u_ice(ji,jj) = ( (          rswitch   * ( zmU_t(ji,jj) * ( zbetau * u_ice(ji,jj) + u_ice_b(ji,jj) )         & ! previous velocity 
     733                        &                                    + zRHS + zTauO * u_ice(ji,jj)                                       & ! F + tau_ia + Coriolis + spg + tau_io(only ocean part) 
     734                        &                                    ) / MAX( zepsi, zmU_t(ji,jj) * ( zbetau + 1._wp ) + zTauO - zTauB ) & ! m/dt + tau_io(only ice part) + landfast 
     735                        &            + ( 1._wp - rswitch ) * (  u_ice_b(ji,jj)                                                   & 
     736                        &                                     + u_ice  (ji,jj) * MAX( 0._wp, zbetau - zdtevp * rn_lf_relax )     & ! static friction => slow decrease to v=0 
     737                        &                                    ) / ( zbetau + 1._wp )                                              & 
     738                        &             ) * zmsk01x(ji,jj) + u_oce(ji,jj) * 0.01_wp * ( 1._wp - zmsk01x(ji,jj) )                   & ! v_ice = v_oce/100 if mass < zmmin & conc < zamin  
    666739                        &           )   * zmsk00x(ji,jj) 
    667740                  ELSE               !--- ice velocity using EVP implicit formulation (cf Madec doc & Bouillon 2009) 
    668                      u_ice(ji,jj) = ( (           rswitch   * ( zmU_t(ji,jj)  * u_ice(ji,jj)                                       & ! previous velocity 
    669                         &                                     + zRHS + zTauO * u_ice(ji,jj) )                                      & ! F + tau_ia + Coriolis + spg + tau_io(only ocean part) 
    670                         &                                     / MAX( zepsi, zmU_t(ji,jj) + zTauO - zTauB )                         & ! m/dt + tau_io(only ice part) + landfast 
    671                         &                + ( 1._wp - rswitch ) * u_ice(ji,jj) * MAX( 0._wp, 1._wp - zdtevp * rn_lfrelax )          & ! static friction => slow decrease to v=0 
    672                         &              ) * zmsk01x(ji,jj) + u_oce(ji,jj) * 0.01_wp * ( 1._wp - zmsk01x(ji,jj) )                    & ! v_ice = v_oce/100 if mass < zmmin & conc < zamin 
     741                     u_ice(ji,jj) = ( (         rswitch   * ( zmU_t(ji,jj)  * u_ice(ji,jj)                                       & ! previous velocity 
     742                        &                                    + zRHS + zTauO * u_ice(ji,jj)                                       & ! F + tau_ia + Coriolis + spg + tau_io(only ocean part) 
     743                        &                                    ) / MAX( zepsi, zmU_t(ji,jj) + zTauO - zTauB )                      & ! m/dt + tau_io(only ice part) + landfast 
     744                        &            + ( 1._wp - rswitch ) *   u_ice(ji,jj) * MAX( 0._wp, 1._wp - zdtevp * rn_lf_relax )         & ! static friction => slow decrease to v=0 
     745                        &              ) * zmsk01x(ji,jj) + u_oce(ji,jj) * 0.01_wp * ( 1._wp - zmsk01x(ji,jj) )                  & ! v_ice = v_oce/100 if mass < zmmin & conc < zamin 
    673746                        &            )   * zmsk00x(ji,jj) 
    674747                  ENDIF 
    675748!extra code for test case boundary conditions 
    676749                  IF (mjg(jj)<25 .or. mjg(jj)>975 .or. mig(ji)<25 .or. mig(ji)>975) THEN 
    677                      u_ice(ji,jj) = invw*(ztaux_ai(ji,jj) + zCorU(ji,jj) + zspgU(ji,jj) + ztaux_oi(ji,jj)) 
     750                     u_ice(ji,jj) = zinvw*(ztaux_ai(ji,jj) + zCorU(ji,jj) + zspgU(ji,jj) + ztaux_oi(ji,jj)) 
    678751                  END IF 
    679752               END DO 
     
    714787                  ! 
    715788                  IF( ln_aEVP ) THEN !--- ice velocity using aEVP (Kimmritz et al 2016 & 2017) 
    716                      v_ice(ji,jj) = ( (          rswitch * ( zmV_t(ji,jj) * ( zbeta(ji,jj) * v_ice(ji,jj) + v_ice_b(ji,jj) )       & ! previous velocity 
    717                         &                                  + zRHS + zTauO * v_ice(ji,jj) )                                         & ! F + tau_ia + Coriolis + spg + tau_io(only ocean part) 
    718                         &                                  / MAX( zepsi, zmV_t(ji,jj) * ( zbeta(ji,jj) + 1._wp ) + zTauO - zTauB ) & ! m/dt + tau_io(only ice part) + landfast 
    719                         &               + ( 1._wp - rswitch ) * v_ice(ji,jj) * MAX( 0._wp, 1._wp - zdtevp * rn_lfrelax )           & ! static friction => slow decrease to v=0 
    720                         &             ) * zmsk01y(ji,jj) + v_oce(ji,jj) * 0.01_wp * ( 1._wp - zmsk01y(ji,jj) )                     & ! v_ice = v_oce/100 if mass < zmmin & conc < zamin 
     789                     zbetav = MAX( zbeta(ji,jj), zbeta(ji,jj+1) ) 
     790                     v_ice(ji,jj) = ( (          rswitch   * ( zmV_t(ji,jj) * ( zbetav * v_ice(ji,jj) + v_ice_b(ji,jj) )         & ! previous velocity 
     791                        &                                    + zRHS + zTauO * v_ice(ji,jj)                                       & ! F + tau_ia + Coriolis + spg + tau_io(only ocean part) 
     792                        &                                    ) / MAX( zepsi, zmV_t(ji,jj) * ( zbetav + 1._wp ) + zTauO - zTauB ) & ! m/dt + tau_io(only ice part) + landfast 
     793                        &            + ( 1._wp - rswitch ) * (  v_ice_b(ji,jj)                                                   & 
     794                        &                                     + v_ice  (ji,jj) * MAX( 0._wp, zbetav - zdtevp * rn_lf_relax )     & ! static friction => slow decrease to v=0 
     795                        &                                    ) / ( zbetav + 1._wp )                                              &  
     796                        &             ) * zmsk01y(ji,jj) + v_oce(ji,jj) * 0.01_wp * ( 1._wp - zmsk01y(ji,jj) )                   & ! v_ice = v_oce/100 if mass < zmmin & conc < zamin 
    721797                        &           )   * zmsk00y(ji,jj) 
    722798                  ELSE               !--- ice velocity using EVP implicit formulation (cf Madec doc & Bouillon 2009) 
    723                      v_ice(ji,jj) = ( (           rswitch   * ( zmV_t(ji,jj)  * v_ice(ji,jj)                                       & ! previous velocity 
    724                         &                                     + zRHS + zTauO * v_ice(ji,jj) )                                      & ! F + tau_ia + Coriolis + spg + tau_io(only ocean part) 
    725                         &                                     / MAX( zepsi, zmV_t(ji,jj) + zTauO - zTauB )                         & ! m/dt + tau_io(only ice part) + landfast 
    726                         &                + ( 1._wp - rswitch ) * v_ice(ji,jj) * MAX( 0._wp, 1._wp - zdtevp * rn_lfrelax )          & ! static friction => slow decrease to v=0 
    727                         &              ) * zmsk01y(ji,jj) + v_oce(ji,jj) * 0.01_wp * ( 1._wp - zmsk01y(ji,jj) )                    & ! v_ice = v_oce/100 if mass < zmmin & conc < zamin 
     799                     v_ice(ji,jj) = ( (         rswitch   * ( zmV_t(ji,jj)  * v_ice(ji,jj)                                       & ! previous velocity 
     800                        &                                    + zRHS + zTauO * v_ice(ji,jj)                                       & ! F + tau_ia + Coriolis + spg + tau_io(only ocean part) 
     801                        &                                    ) / MAX( zepsi, zmV_t(ji,jj) + zTauO - zTauB )                      & ! m/dt + tau_io(only ice part) + landfast 
     802                        &            + ( 1._wp - rswitch ) *   v_ice(ji,jj) * MAX( 0._wp, 1._wp - zdtevp * rn_lf_relax )         & ! static friction => slow decrease to v=0 
     803                        &              ) * zmsk01y(ji,jj) + v_oce(ji,jj) * 0.01_wp * ( 1._wp - zmsk01y(ji,jj) )                  & ! v_ice = v_oce/100 if mass < zmmin & conc < zamin 
    728804                        &            )   * zmsk00y(ji,jj) 
    729805                  ENDIF 
    730806!extra code for test case boundary conditions 
    731807                  IF (mjg(jj)<25 .or. mjg(jj)>975 .or. mig(ji)<25 .or. mig(ji)>975) THEN 
    732                      v_ice(ji,jj) = invw*(ztauy_ai(ji,jj) + zCorV(ji,jj) + zspgV(ji,jj) + ztauy_oi(ji,jj)) 
     808                     v_ice(ji,jj) = zinvw*(ztauy_ai(ji,jj) + zCorV(ji,jj) + zspgV(ji,jj) + ztauy_oi(ji,jj)) 
    733809                  END IF 
    734810               END DO 
     
    744820         ENDIF 
    745821 
    746 !!$         IF(ln_ctl) THEN   ! Convergence test 
    747 !!$            DO jj = 2 , jpjm1 
    748 !!$               zresr(:,jj) = MAX( ABS( u_ice(:,jj) - zu_ice(:,jj) ), ABS( v_ice(:,jj) - zv_ice(:,jj) ) ) 
    749 !!$            END DO 
    750 !!$            zresm = MAXVAL( zresr( 1:jpi, 2:jpjm1 ) ) 
    751 !!$            CALL mpp_max( 'icedyn_rhg_eap', zresm )   ! max over the global domain 
    752 !!$         ENDIF 
     822         ! convergence test 
     823         IF( nn_rhg_chkcvg == 2 )   CALL rhg_cvg( kt, jter, nn_nevp, u_ice, v_ice, zu_ice, zv_ice ) 
    753824         ! 
    754  
    755825         !                                                ! ==================== ! 
    756826      END DO                                              !  end loop over jter  ! 
    757827      !                                                   ! ==================== ! 
     828      IF( ln_aEVP )   CALL iom_put( 'beta_evp' , zbeta ) 
    758829      ! 
    759830      CALL lbc_lnk( 'icedyn_rhg_eap', prdg_conv, 'T', 1. )  ! only need this in ridging module after rheology completed 
     
    782853            zdt2 = zdt * zdt 
    783854             
     855            zten_i(ji,jj) = zdt 
     856 
    784857            ! shear**2 at T points (doc eq. A16) 
    785858            zds2 = ( zds(ji,jj  ) * zds(ji,jj  ) * e1e2f(ji,jj  ) + zds(ji-1,jj  ) * zds(ji-1,jj  ) * e1e2f(ji-1,jj  )  & 
     
    796869             
    797870            ! delta at T points 
    798             zdelta         = SQRT( pdivu_i(ji,jj) * pdivu_i(ji,jj) + ( zdt2 + zds2 ) * z1_ecc2 )   
    799             rswitch        = 1._wp - MAX( 0._wp, SIGN( 1._wp, -zdelta ) ) ! 0 if delta=0 
    800             pdelta_i(ji,jj) = zdelta + rn_creepl * rswitch 
     871            zfac            = SQRT( pdivu_i(ji,jj) * pdivu_i(ji,jj) + ( zdt2 + zds2 ) * z1_ecc2 ) ! delta   
     872            rswitch         = 1._wp - MAX( 0._wp, SIGN( 1._wp, -zfac ) ) ! 0 if delta=0 
     873            pdelta_i(ji,jj) = zfac + rn_creepl * rswitch ! delta+creepl 
    801874 
    802875         END DO 
    803876      END DO 
    804       CALL lbc_lnk_multi( 'icedyn_rhg_eap', pshear_i, 'T', 1., pdivu_i, 'T', 1., pdelta_i, 'T', 1. ) 
    805       !CALL lbc_lnk_multi( 'icedyn_rhg_eap', pshear_i, 'T', 1., pdivu_i, 'T', 1. ) 
     877      CALL lbc_lnk_multi( 'icedyn_rhg_eap', pshear_i, 'T', 1., pdivu_i, 'T', 1., pdelta_i, 'T', 1., zten_i, 'T', 1., & 
     878         &                                  zs1     , 'T', 1., zs2    , 'T', 1., zs12    , 'F', 1. ) 
    806879       
    807880      ! --- Store the stress tensor for the next time step --- ! 
    808       CALL lbc_lnk_multi( 'icedyn_rhg_eap', zs1, 'T', 1., zs2, 'T', 1., zs12, 'F', 1. ) 
    809881      pstress1_i (:,:) = zs1 (:,:) 
    810882      pstress2_i (:,:) = zs2 (:,:) 
     
    815887      ! 5) diagnostics 
    816888      !------------------------------------------------------------------------------! 
    817       DO jj = 1, jpj 
    818          DO ji = 1, jpi 
    819             zmsk00(ji,jj) = MAX( 0._wp , SIGN( 1._wp , at_i(ji,jj) - epsi06 ) ) ! 1 if ice, 0 if no ice 
    820          END DO 
    821       END DO 
    822  
    823889      ! --- ice-ocean, ice-atm. & ice-oceanbottom(landfast) stresses --- ! 
    824890      IF(  iom_use('utau_oi') .OR. iom_use('vtau_oi') .OR. iom_use('utau_ai') .OR. iom_use('vtau_ai') .OR. & 
     
    839905      IF( iom_use('icediv') )   CALL iom_put( 'icediv' , pdivu_i  * zmsk00 )   ! divergence 
    840906      IF( iom_use('iceshe') )   CALL iom_put( 'iceshe' , pshear_i * zmsk00 )   ! shear 
     907      IF( iom_use('icedlt') )   CALL iom_put( 'icedlt' , pdelta_i * zmsk00 )   ! delta 
    841908      IF( iom_use('icestr') )   CALL iom_put( 'icestr' , strength * zmsk00 )   ! strength 
    842909 
    843       ! --- stress tensor --- ! 
    844       IF( iom_use('isig1') .OR. iom_use('isig2') .OR. iom_use('isig3') .OR. iom_use('normstr') .OR. iom_use('sheastr') ) THEN 
     910      ! --- Stress tensor invariants (SIMIP diags) --- ! 
     911      IF( iom_use('normstr') .OR. iom_use('sheastr') ) THEN 
    845912         ! 
    846          ALLOCATE( zsig1(jpi,jpj) , zsig2(jpi,jpj) , zsig3(jpi,jpj) ) 
     913         ALLOCATE( zsig_I(jpi,jpj) , zsig_II(jpi,jpj) ) 
    847914         !          
    848          DO jj = 2, jpjm1 
    849             DO ji = 2, jpim1 
    850                zdum1 = ( zmsk00(ji-1,jj) * pstress12_i(ji-1,jj) + zmsk00(ji  ,jj-1) * pstress12_i(ji  ,jj-1) +  &  ! stress12_i at T-point 
    851                   &      zmsk00(ji  ,jj) * pstress12_i(ji  ,jj) + zmsk00(ji-1,jj-1) * pstress12_i(ji-1,jj-1) )  & 
    852                   &    / MAX( 1._wp, zmsk00(ji-1,jj) + zmsk00(ji,jj-1) + zmsk00(ji,jj) + zmsk00(ji-1,jj-1) ) 
    853  
    854                zshear = SQRT( pstress2_i(ji,jj) * pstress2_i(ji,jj) + 4._wp * zdum1 * zdum1 ) ! shear stress   
    855  
    856                zdum2 = zmsk00(ji,jj) / MAX( 1._wp, strength(ji,jj) ) 
    857  
    858 !!               zsig1(ji,jj) = 0.5_wp * zdum2 * ( pstress1_i(ji,jj) + zshear ) ! principal stress (y-direction, see Hunke & Dukowicz 2002) 
    859 !!               zsig2(ji,jj) = 0.5_wp * zdum2 * ( pstress1_i(ji,jj) - zshear ) ! principal stress (x-direction, see Hunke & Dukowicz 2002) 
    860 !!               zsig3(ji,jj) = zdum2**2 * ( ( pstress1_i(ji,jj) + strength(ji,jj) )**2 + ( rn_ecc * zshear )**2 ) ! quadratic relation linking compressive stress to shear stress 
    861 !!                                                                                                               ! (scheme converges if this value is ~1, see Bouillon et al 2009 (eq. 11)) 
    862                zsig1(ji,jj) = 0.5_wp * zdum2 * ( pstress1_i(ji,jj) )          ! compressive stress, see Bouillon et al. 2015 
    863                zsig2(ji,jj) = 0.5_wp * zdum2 * ( zshear )                     ! shear stress  
    864                zsig3(ji,jj) = zdum2**2 * ( ( pstress1_i(ji,jj) + strength(ji,jj) )**2 + ( rn_ecc * zshear )**2 ) 
     915         DO jj = 1, jpj 
     916            DO ji = 1, jpi 
     917             
     918               ! Ice stresses 
     919               ! sigma1, sigma2, sigma12 are some useful recombination of the stresses (Hunke and Dukowicz MWR 2002, Bouillon et al., OM2013) 
     920               ! These are NOT stress tensor components, neither stress invariants, neither stress principal components 
     921               ! I know, this can be confusing... 
     922               zfac             =   strength(ji,jj) / ( pdelta_i(ji,jj) + rn_creepl )  
     923               zsig1            =   zfac * ( pdivu_i(ji,jj) - pdelta_i(ji,jj) ) 
     924               zsig2            =   zfac * z1_ecc2 * zten_i(ji,jj) 
     925               zsig12           =   zfac * z1_ecc2 * pshear_i(ji,jj) 
     926                
     927               ! Stress invariants (sigma_I, sigma_II, Coon 1974, Feltham 2008) 
     928               zsig_I (ji,jj)   =   zsig1 * 0.5_wp                                           ! 1st stress invariant, aka average normal stress, aka negative pressure 
     929               zsig_II(ji,jj)   =   SQRT ( MAX( 0._wp, zsig2 * zsig2 * 0.25_wp + zsig12 ) )  ! 2nd  ''       '', aka maximum shear stress 
     930                
    865931            END DO 
    866          END DO 
    867          CALL lbc_lnk_multi( 'icedyn_rhg_eap', zsig1, 'T', 1., zsig2, 'T', 1., zsig3, 'T', 1. ) 
     932         END DO          
    868933         ! 
    869          CALL iom_put( 'isig1' , zsig1 ) 
    870          CALL iom_put( 'isig2' , zsig2 ) 
    871          CALL iom_put( 'isig3' , zsig3 ) 
     934         ! Stress tensor invariants (normal and shear stress N/m) - SIMIP diags - definitions following Coon (1974) and Feltham (2008) 
     935         IF( iom_use('normstr') )   CALL iom_put( 'normstr', zsig_I (:,:) * zmsk00(:,:) ) ! Normal stress 
     936         IF( iom_use('sheastr') )   CALL iom_put( 'sheastr', zsig_II(:,:) * zmsk00(:,:) ) ! Maximum shear stress 
     937          
     938         DEALLOCATE ( zsig_I, zsig_II ) 
     939          
     940      ENDIF 
     941 
     942      ! --- Normalized stress tensor principal components --- ! 
     943      ! This are used to plot the normalized yield curve, see Lemieux & Dupont, 2020 
     944      ! Recommendation 1 : we use ice strength, not replacement pressure 
     945      ! Recommendation 2 : need to use deformations at PREVIOUS iterate for viscosities 
     946      IF( iom_use('sig1_pnorm') .OR. iom_use('sig2_pnorm') ) THEN 
    872947         ! 
    873          ! Stress tensor invariants (normal and shear stress N/m) 
    874          IF( iom_use('normstr') )   CALL iom_put( 'normstr' ,       ( zs1(:,:) + zs2(:,:) )                       * zmsk00(:,:) ) ! Normal stress 
    875          IF( iom_use('sheastr') )   CALL iom_put( 'sheastr' , SQRT( ( zs1(:,:) - zs2(:,:) )**2 + 4*zs12(:,:)**2 ) * zmsk00(:,:) ) ! Shear stress  
    876  
    877          DEALLOCATE( zsig1 , zsig2 , zsig3 ) 
     948         ALLOCATE( zsig1_p(jpi,jpj) , zsig2_p(jpi,jpj) , zsig_I(jpi,jpj) , zsig_II(jpi,jpj) )          
     949         !          
     950         DO jj = 1, jpj 
     951            DO ji = 1, jpi 
     952             
     953               ! Ice stresses computed with **viscosities** (delta, p/delta) at **previous** iterates  
     954               !                        and **deformations** at current iterates 
     955               !                        following Lemieux & Dupont (2020) 
     956               zfac             =   zp_delt(ji,jj) 
     957               zsig1            =   zfac * ( pdivu_i(ji,jj) - ( zdelta(ji,jj) + rn_creepl ) ) 
     958               zsig2            =   zfac * z1_ecc2 * zten_i(ji,jj) 
     959               zsig12           =   zfac * z1_ecc2 * pshear_i(ji,jj) 
     960                
     961               ! Stress invariants (sigma_I, sigma_II, Coon 1974, Feltham 2008), T-point 
     962               zsig_I(ji,jj)    =   zsig1 * 0.5_wp                                           ! 1st stress invariant, aka average normal stress, aka negative pressure 
     963               zsig_II(ji,jj)   =   SQRT ( MAX( 0._wp, zsig2 * zsig2 * 0.25_wp + zsig12 ) )  ! 2nd  ''       '', aka maximum shear stress 
     964       
     965               ! Normalized  principal stresses (used to display the ellipse) 
     966               z1_strength      =   1._wp / MAX( 1._wp, strength(ji,jj) ) 
     967               zsig1_p(ji,jj)   =   ( zsig_I(ji,jj) + zsig_II(ji,jj) ) * z1_strength 
     968               zsig2_p(ji,jj)   =   ( zsig_I(ji,jj) - zsig_II(ji,jj) ) * z1_strength 
     969            END DO 
     970         END DO                
     971         ! 
     972         CALL iom_put( 'sig1_pnorm' , zsig1_p )  
     973         CALL iom_put( 'sig2_pnorm' , zsig2_p )  
     974       
     975         DEALLOCATE( zsig1_p , zsig2_p , zsig_I, zsig_II ) 
     976          
    878977      ENDIF 
    879978 
     
    9491048      ENDIF 
    9501049      ! 
     1050      ! --- convergence tests --- ! 
     1051      IF( nn_rhg_chkcvg == 1 .OR. nn_rhg_chkcvg == 2 ) THEN 
     1052         IF( iom_use('uice_cvg') ) THEN 
     1053            IF( ln_aEVP ) THEN   ! output: beta * ( u(t=nn_nevp) - u(t=nn_nevp-1) ) 
     1054               CALL iom_put( 'uice_cvg', MAX( ABS( u_ice(:,:) - zu_ice(:,:) ) * zbeta(:,:) * umask(:,:,1) , & 
     1055                  &                           ABS( v_ice(:,:) - zv_ice(:,:) ) * zbeta(:,:) * vmask(:,:,1) ) * zmsk15(:,:) ) 
     1056            ELSE                 ! output: nn_nevp * ( u(t=nn_nevp) - u(t=nn_nevp-1) ) 
     1057               CALL iom_put( 'uice_cvg', REAL( nn_nevp ) * MAX( ABS( u_ice(:,:) - zu_ice(:,:) ) * umask(:,:,1) , & 
     1058                  &                                             ABS( v_ice(:,:) - zv_ice(:,:) ) * vmask(:,:,1) ) * zmsk15(:,:) ) 
     1059            ENDIF 
     1060         ENDIF 
     1061      ENDIF       
     1062      ! 
     1063      DEALLOCATE( zmsk00, zmsk15 ) 
     1064      ! 
    9511065   END SUBROUTINE ice_dyn_rhg_eap 
    9521066 
    953    SUBROUTINE update_stress_rdg (ksub, kndte, pdivu, ptension, & 
    954                                  pshear, pa11, pa12, & 
    955                                  pstressp,  pstressm, & 
    956                                  pstress12, strength, & 
    957                                  palphar, palphas) 
     1067    
     1068   SUBROUTINE rhg_cvg( kt, kiter, kitermax, pu, pv, pub, pvb ) 
     1069      !!---------------------------------------------------------------------- 
     1070      !!                    ***  ROUTINE rhg_cvg  *** 
     1071      !!                      
     1072      !! ** Purpose :   check convergence of oce rheology 
     1073      !! 
     1074      !! ** Method  :   create a file ice_cvg.nc containing the convergence of ice velocity 
     1075      !!                during the sub timestepping of rheology so as: 
     1076      !!                  uice_cvg = MAX( u(t+1) - u(t) , v(t+1) - v(t) ) 
     1077      !!                This routine is called every sub-iteration, so it is cpu expensive 
     1078      !! 
     1079      !! ** Note    :   for the first sub-iteration, uice_cvg is set to 0 (too large otherwise)    
     1080      !!---------------------------------------------------------------------- 
     1081      INTEGER ,                 INTENT(in) ::   kt, kiter, kitermax       ! ocean time-step index 
     1082      REAL(wp), DIMENSION(:,:), INTENT(in) ::   pu, pv, pub, pvb          ! now and before velocities 
     1083      !! 
     1084      INTEGER           ::   it, idtime, istatus 
     1085      INTEGER           ::   ji, jj          ! dummy loop indices 
     1086      REAL(wp)          ::   zresm           ! local real  
     1087      CHARACTER(len=20) ::   clname 
     1088      REAL(wp), DIMENSION(jpi,jpj) ::   zres           ! check convergence 
     1089      !!---------------------------------------------------------------------- 
     1090 
     1091      ! create file 
     1092      IF( kt == nit000 .AND. kiter == 1 ) THEN 
     1093         ! 
     1094         IF( lwp ) THEN 
     1095            WRITE(numout,*) 
     1096            WRITE(numout,*) 'rhg_cvg : ice rheology convergence control' 
     1097            WRITE(numout,*) '~~~~~~~' 
     1098         ENDIF 
     1099         ! 
     1100         IF( lwm ) THEN 
     1101            clname = 'ice_cvg.nc' 
     1102            IF( .NOT. Agrif_Root() )   clname = TRIM(Agrif_CFixed())//"_"//TRIM(clname) 
     1103            istatus = NF90_CREATE( TRIM(clname), NF90_CLOBBER, ncvgid ) 
     1104            istatus = NF90_DEF_DIM( ncvgid, 'time'  , NF90_UNLIMITED, idtime ) 
     1105            istatus = NF90_DEF_VAR( ncvgid, 'uice_cvg', NF90_DOUBLE   , (/ idtime /), nvarid ) 
     1106            istatus = NF90_ENDDEF(ncvgid) 
     1107         ENDIF 
     1108         ! 
     1109      ENDIF 
     1110 
     1111      ! time 
     1112      it = ( kt - 1 ) * kitermax + kiter 
     1113       
     1114      ! convergence 
     1115      IF( kiter == 1 ) THEN ! remove the first iteration for calculations of convergence (always very large) 
     1116         zresm = 0._wp 
     1117      ELSE 
     1118         DO jj = 1, jpj 
     1119            DO ji = 1, jpi 
     1120               zres(ji,jj) = MAX( ABS( pu(ji,jj) - pub(ji,jj) ) * umask(ji,jj,1), & 
     1121                  &               ABS( pv(ji,jj) - pvb(ji,jj) ) * vmask(ji,jj,1) ) * zmsk15(ji,jj) 
     1122            END DO 
     1123         END DO 
     1124 
     1125         ! cut of the boundary of the box (forced velocities) 
     1126         IF (mjg(jj)<=30 .or. mjg(jj)>970 .or. mig(ji)<=30 .or. mig(ji)>970) THEN 
     1127            zres(ji,jj) = 0._wp 
     1128         END IF 
     1129         zresm = MAXVAL( zres ) 
     1130         CALL mpp_max( 'icedyn_rhg_evp', zresm )   ! max over the global domain 
     1131      ENDIF 
     1132 
     1133      IF( lwm ) THEN 
     1134         ! write variables 
     1135         istatus = NF90_PUT_VAR( ncvgid, nvarid, (/zresm/), (/it/), (/1/) ) 
     1136         ! close file 
     1137         IF( kt == nitend )   istatus = NF90_CLOSE(ncvgid) 
     1138      ENDIF 
     1139       
     1140   END SUBROUTINE rhg_cvg 
     1141 
     1142 
     1143   SUBROUTINE update_stress_rdg( ksub, kndte, pdivu, ptension, pshear, pa11, pa12, & 
     1144      &                          pstressp,  pstressm, pstress12, pstrength, palphar, palphas ) 
    9581145      !!--------------------------------------------------------------------- 
    9591146      !!                   ***  SUBROUTINE update_stress_rdg  *** 
     
    9631150      !!--------------------------------------------------------------------- 
    9641151      INTEGER,  INTENT(in   ) ::   ksub, kndte 
    965       REAL(wp), INTENT(in   ) ::   strength 
     1152      REAL(wp), INTENT(in   ) ::   pstrength 
    9661153      REAL(wp), INTENT(in   ) ::   pdivu, ptension, pshear 
    9671154      REAL(wp), INTENT(in   ) ::   pa11, pa12 
     
    9911178      ! Factor to maintain the same stress as in EVP (see Section 3) 
    9921179      ! Can be set to 1 otherwise 
    993       zinvstressconviso = 1._wp/(1._wp+kfriction*kfriction) 
     1180!      zinvstressconviso = 1._wp/(1._wp+kfriction*kfriction) 
     1181      zinvstressconviso = 1._wp 
    9941182  
    9951183      zinvsin = 1._wp/sin(2._wp*pphi) * zinvstressconviso  
     
    10091197      IF((ABS(pa11 - za22) > rsmall).OR.(ABS(pa12) > rsmall)) THEN       
    10101198         zAngle_denom_gamma = 1._wp/sqrt( ( pa11 - za22 )*( pa11 - za22) + & 
    1011                              4._wp*pa12*pa12 ) 
     1199                              4._wp*pa12*pa12 ) 
    10121200    
    10131201         zQ11Q11 = 0.5_wp + ( pa11 - za22 )*0.5_wp*zAngle_denom_gamma   !Cos^2  
     
    10841272      ! % range in kx 
    10851273      kx  = int((zx-rpi*0.25_wp-rpi)*zinvdx) + 1 
    1086       zkxw = kx - (zx-rpi*0.25_wp-rpi)*zinvdx  
     1274      !!clem kx  = MAX( 1, MIN( nx_yield-1, INT((zx-rpi*0.25_wp-rpi)*zinvdx) + 1  ) ) 
     1275      zkxw = kx - (zx-rpi*0.25_wp-rpi)*zinvdx   
    10871276       
    10881277      ky  = int(zy*zinvdy) + 1 
     1278      !!clem ky  = MAX( 1, MIN( ny_yield-1, INT(zy*zinvdy) + 1 ) ) 
    10891279      kyw = ky - zy*zinvdy  
    10901280       
    10911281      ka  = int((zatempprime-0.5_wp)*zinvda) + 1 
     1282      !!clem ka  = MAX( 1, MIN( na_yield-1, INT((zatempprime-0.5_wp)*zinvda) + 1 ) ) 
    10921283      kaw = ka - (zatempprime-0.5_wp)*zinvda 
    10931284       
    10941285      ! % Determine sigma_r(A1,Zeta,y) and sigma_s (see Section A1 of Tsamados 2013) 
    1095       zstemp11r =  zkxw   * kyw         * kaw         * s11r(kx  ,ky  ,ka  ) & 
    1096         & + (1._wp-zkxw) * kyw         * kaw         * s11r(kx+1,ky  ,ka  ) & 
    1097         & + zkxw         * (1._wp-kyw) * kaw         * s11r(kx  ,ky+1,ka  ) & 
    1098         & + zkxw         * kyw         * (1._wp-kaw) * s11r(kx  ,ky  ,ka+1) & 
    1099         & + (1._wp-zkxw) * (1._wp-kyw) * kaw         * s11r(kx+1,ky+1,ka  ) & 
    1100         & + (1._wp-zkxw) * kyw         * (1._wp-kaw) * s11r(kx+1,ky  ,ka+1) & 
    1101         & + zkxw         * (1._wp-kyw) * (1._wp-kaw) * s11r(kx  ,ky+1,ka+1) & 
    1102         & + (1._wp-zkxw) * (1._wp-kyw) * (1._wp-kaw) * s11r(kx+1,ky+1,ka+1) 
    1103       zstemp12r =  zkxw   * kyw         * kaw         * s12r(kx  ,ky  ,ka  ) & 
    1104         & + (1._wp-zkxw) * kyw         * kaw         * s12r(kx+1,ky  ,ka  ) & 
    1105         & + zkxw         * (1._wp-kyw) * kaw         * s12r(kx  ,ky+1,ka  ) & 
    1106         & + zkxw         * kyw         * (1._wp-kaw) * s12r(kx  ,ky  ,ka+1) & 
    1107         & + (1._wp-zkxw) * (1._wp-kyw) * kaw         * s12r(kx+1,ky+1,ka  ) & 
    1108         & + (1._wp-zkxw) * kyw         * (1._wp-kaw) * s12r(kx+1,ky  ,ka+1) & 
    1109         & + zkxw         * (1._wp-kyw) * (1._wp-kaw) * s12r(kx  ,ky+1,ka+1) & 
    1110         & + (1._wp-zkxw) * (1._wp-kyw) * (1._wp-kaw) * s12r(kx+1,ky+1,ka+1) 
    1111       zstemp22r = zkxw    * kyw         * kaw         * s22r(kx  ,ky  ,ka  ) & 
    1112         & + (1._wp-zkxw) * kyw         * kaw         * s22r(kx+1,ky  ,ka  ) & 
    1113         & + zkxw         * (1._wp-kyw) * kaw         * s22r(kx  ,ky+1,ka  ) & 
    1114         & + zkxw         * kyw         * (1._wp-kaw) * s22r(kx  ,ky  ,ka+1) & 
    1115         & + (1._wp-zkxw) * (1._wp-kyw) * kaw         * s22r(kx+1,ky+1,ka  ) & 
    1116         & + (1._wp-zkxw) * kyw         * (1._wp-kaw) * s22r(kx+1,ky  ,ka+1) & 
    1117         & + zkxw         * (1._wp-kyw) * (1._wp-kaw) * s22r(kx  ,ky+1,ka+1) & 
    1118         & + (1._wp-zkxw) * (1._wp-kyw) * (1._wp-kaw) * s22r(kx+1,ky+1,ka+1) 
     1286!!$      zstemp11r =  zkxw  * kyw         * kaw         * s11r(kx  ,ky  ,ka  ) & 
     1287!!$        & + (1._wp-zkxw) * kyw         * kaw         * s11r(kx+1,ky  ,ka  ) & 
     1288!!$        & + zkxw         * (1._wp-kyw) * kaw         * s11r(kx  ,ky+1,ka  ) & 
     1289!!$        & + zkxw         * kyw         * (1._wp-kaw) * s11r(kx  ,ky  ,ka+1) & 
     1290!!$        & + (1._wp-zkxw) * (1._wp-kyw) * kaw         * s11r(kx+1,ky+1,ka  ) & 
     1291!!$        & + (1._wp-zkxw) * kyw         * (1._wp-kaw) * s11r(kx+1,ky  ,ka+1) & 
     1292!!$        & + zkxw         * (1._wp-kyw) * (1._wp-kaw) * s11r(kx  ,ky+1,ka+1) & 
     1293!!$        & + (1._wp-zkxw) * (1._wp-kyw) * (1._wp-kaw) * s11r(kx+1,ky+1,ka+1) 
     1294!!$      zstemp12r =  zkxw  * kyw         * kaw         * s12r(kx  ,ky  ,ka  ) & 
     1295!!$        & + (1._wp-zkxw) * kyw         * kaw         * s12r(kx+1,ky  ,ka  ) & 
     1296!!$        & + zkxw         * (1._wp-kyw) * kaw         * s12r(kx  ,ky+1,ka  ) & 
     1297!!$        & + zkxw         * kyw         * (1._wp-kaw) * s12r(kx  ,ky  ,ka+1) & 
     1298!!$        & + (1._wp-zkxw) * (1._wp-kyw) * kaw         * s12r(kx+1,ky+1,ka  ) & 
     1299!!$        & + (1._wp-zkxw) * kyw         * (1._wp-kaw) * s12r(kx+1,ky  ,ka+1) & 
     1300!!$        & + zkxw         * (1._wp-kyw) * (1._wp-kaw) * s12r(kx  ,ky+1,ka+1) & 
     1301!!$        & + (1._wp-zkxw) * (1._wp-kyw) * (1._wp-kaw) * s12r(kx+1,ky+1,ka+1) 
     1302!!$      zstemp22r =  zkxw  * kyw         * kaw         * s22r(kx  ,ky  ,ka  ) & 
     1303!!$        & + (1._wp-zkxw) * kyw         * kaw         * s22r(kx+1,ky  ,ka  ) & 
     1304!!$        & + zkxw         * (1._wp-kyw) * kaw         * s22r(kx  ,ky+1,ka  ) & 
     1305!!$        & + zkxw         * kyw         * (1._wp-kaw) * s22r(kx  ,ky  ,ka+1) & 
     1306!!$        & + (1._wp-zkxw) * (1._wp-kyw) * kaw         * s22r(kx+1,ky+1,ka  ) & 
     1307!!$        & + (1._wp-zkxw) * kyw         * (1._wp-kaw) * s22r(kx+1,ky  ,ka+1) & 
     1308!!$        & + zkxw         * (1._wp-kyw) * (1._wp-kaw) * s22r(kx  ,ky+1,ka+1) & 
     1309!!$        & + (1._wp-zkxw) * (1._wp-kyw) * (1._wp-kaw) * s22r(kx+1,ky+1,ka+1) 
     1310!!$       
     1311!!$      zstemp11s =  zkxw  * kyw         * kaw         * s11s(kx  ,ky  ,ka  ) & 
     1312!!$        & + (1._wp-zkxw) * kyw         * kaw         * s11s(kx+1,ky  ,ka  ) & 
     1313!!$        & + zkxw         * (1._wp-kyw) * kaw         * s11s(kx  ,ky+1,ka  ) & 
     1314!!$        & + zkxw         * kyw         * (1._wp-kaw) * s11s(kx  ,ky  ,ka+1) & 
     1315!!$        & + (1._wp-zkxw) * (1._wp-kyw) * kaw         * s11s(kx+1,ky+1,ka  ) & 
     1316!!$        & + (1._wp-zkxw) * kyw         * (1._wp-kaw) * s11s(kx+1,ky  ,ka+1) & 
     1317!!$        & + zkxw         * (1._wp-kyw) * (1._wp-kaw) * s11s(kx  ,ky+1,ka+1) & 
     1318!!$        & + (1._wp-zkxw) * (1._wp-kyw) * (1._wp-kaw) * s11s(kx+1,ky+1,ka+1) 
     1319!!$      zstemp12s =  zkxw  * kyw         * kaw         * s12s(kx  ,ky  ,ka  ) & 
     1320!!$        & + (1._wp-zkxw) * kyw         * kaw         * s12s(kx+1,ky  ,ka  ) & 
     1321!!$        & + zkxw         * (1._wp-kyw) * kaw         * s12s(kx  ,ky+1,ka  ) & 
     1322!!$        & + zkxw         * kyw         * (1._wp-kaw) * s12s(kx  ,ky  ,ka+1) & 
     1323!!$        & + (1._wp-zkxw) * (1._wp-kyw) * kaw         * s12s(kx+1,ky+1,ka  ) & 
     1324!!$        & + (1._wp-zkxw) * kyw         * (1._wp-kaw) * s12s(kx+1,ky  ,ka+1) & 
     1325!!$        & + zkxw         * (1._wp-kyw) * (1._wp-kaw) * s12s(kx  ,ky+1,ka+1) & 
     1326!!$        & + (1._wp-zkxw) * (1._wp-kyw) * (1._wp-kaw) * s12s(kx+1,ky+1,ka+1) 
     1327!!$      zstemp22s =  zkxw  * kyw         * kaw         * s22s(kx  ,ky  ,ka  ) & 
     1328!!$        & + (1._wp-zkxw) * kyw         * kaw         * s22s(kx+1,ky  ,ka  ) & 
     1329!!$        & + zkxw         * (1._wp-kyw) * kaw         * s22s(kx  ,ky+1,ka  ) & 
     1330!!$        & + zkxw         * kyw         * (1._wp-kaw) * s22s(kx  ,ky  ,ka+1) & 
     1331!!$        & + (1._wp-zkxw) * (1._wp-kyw) * kaw         * s22s(kx+1,ky+1,ka  ) & 
     1332!!$        & + (1._wp-zkxw) * kyw         * (1._wp-kaw) * s22s(kx+1,ky  ,ka+1) & 
     1333!!$        & + zkxw         * (1._wp-kyw) * (1._wp-kaw) * s22s(kx  ,ky+1,ka+1) & 
     1334!!$        & + (1._wp-zkxw) * (1._wp-kyw) * (1._wp-kaw) * s22s(kx+1,ky+1,ka+1) 
     1335 
     1336      zstemp11r = s11r(kx,ky,ka) 
     1337      zstemp12r = s12r(kx,ky,ka) 
     1338      zstemp22r = s22r(kx,ky,ka) 
     1339      zstemp11s = s11s(kx,ky,ka) 
     1340      zstemp12s = s12s(kx,ky,ka) 
     1341      zstemp22s = s22s(kx,ky,ka) 
    11191342       
    1120       zstemp11s =  zkxw   * kyw         * kaw         * s11s(kx  ,ky  ,ka  ) & 
    1121         & + (1._wp-zkxw) * kyw         * kaw         * s11s(kx+1,ky  ,ka  ) & 
    1122         & + zkxw         * (1._wp-kyw) * kaw         * s11s(kx  ,ky+1,ka  ) & 
    1123         & + zkxw         * kyw         * (1._wp-kaw) * s11s(kx  ,ky  ,ka+1) & 
    1124         & + (1._wp-zkxw) * (1._wp-kyw) * kaw         * s11s(kx+1,ky+1,ka  ) & 
    1125         & + (1._wp-zkxw) * kyw         * (1._wp-kaw) * s11s(kx+1,ky  ,ka+1) & 
    1126         & + zkxw         * (1._wp-kyw) * (1._wp-kaw) * s11s(kx  ,ky+1,ka+1) & 
    1127         & + (1._wp-zkxw) * (1._wp-kyw) * (1._wp-kaw) * s11s(kx+1,ky+1,ka+1) 
    1128       zstemp12s =  zkxw   * kyw         * kaw         * s12s(kx  ,ky  ,ka  ) & 
    1129         & + (1._wp-zkxw) * kyw         * kaw         * s12s(kx+1,ky  ,ka  ) & 
    1130         & + zkxw         * (1._wp-kyw) * kaw         * s12s(kx  ,ky+1,ka  ) & 
    1131         & + zkxw         * kyw         * (1._wp-kaw) * s12s(kx  ,ky  ,ka+1) & 
    1132         & + (1._wp-zkxw) * (1._wp-kyw) * kaw         * s12s(kx+1,ky+1,ka  ) & 
    1133         & + (1._wp-zkxw) * kyw         * (1._wp-kaw) * s12s(kx+1,ky  ,ka+1) & 
    1134         & + zkxw         * (1._wp-kyw) * (1._wp-kaw) * s12s(kx  ,ky+1,ka+1) & 
    1135         & + (1._wp-zkxw) * (1._wp-kyw) * (1._wp-kaw) * s12s(kx+1,ky+1,ka+1) 
    1136       zstemp22s =  zkxw   * kyw         * kaw         * s22s(kx  ,ky  ,ka  ) & 
    1137         & + (1._wp-zkxw) * kyw         * kaw         * s22s(kx+1,ky  ,ka  ) & 
    1138         & + zkxw         * (1._wp-kyw) * kaw         * s22s(kx  ,ky+1,ka  ) & 
    1139         & + zkxw         * kyw         * (1._wp-kaw) * s22s(kx  ,ky  ,ka+1) & 
    1140         & + (1._wp-zkxw) * (1._wp-kyw) * kaw         * s22s(kx+1,ky+1,ka  ) & 
    1141         & + (1._wp-zkxw) * kyw         * (1._wp-kaw) * s22s(kx+1,ky  ,ka+1) & 
    1142         & + zkxw         * (1._wp-kyw) * (1._wp-kaw) * s22s(kx  ,ky+1,ka+1) & 
    1143         & + (1._wp-zkxw) * (1._wp-kyw) * (1._wp-kaw) * s22s(kx+1,ky+1,ka+1) 
    1144                     
     1343       
    11451344      ! Calculate mean ice stress over a collection of floes (Equation 3 in 
    11461345      ! Tsamados 2013) 
    11471346 
    1148       zsig11  = strength*(zstemp11r + kfriction*zstemp11s) * zinvsin 
    1149       zsig12  = strength*(zstemp12r + kfriction*zstemp12s) * zinvsin 
    1150       zsig22  = strength*(zstemp22r + kfriction*zstemp22s) * zinvsin 
     1347      zsig11  = pstrength*(zstemp11r + kfriction*zstemp11s) * zinvsin 
     1348      zsig12  = pstrength*(zstemp12r + kfriction*zstemp12s) * zinvsin 
     1349      zsig22  = pstrength*(zstemp22r + kfriction*zstemp22s) * zinvsin 
    11511350 
    11521351      !WRITE(numout,*) 'principal axis stress inside loop', sig11, sig12, sig22 
     
    11551354 
    11561355      ! Update stress 
    1157       zsgprm11 = zQ11Q11*zsig11 + zQ12Q12*zsig22 -        2._wp*zQ11Q12 *zsig12 
     1356      zsgprm11 = zQ11Q11*zsig11 + zQ12Q12*zsig22 -      2._wp*zQ11Q12 *zsig12 
    11581357      zsgprm12 = zQ11Q12*zsig11 - zQ11Q12*zsig22 + (zQ11Q11 - zQ12Q12)*zsig12 
    1159       zsgprm22 = zQ12Q12*zsig11 + zQ11Q11*zsig22 +        2._wp*zQ11Q12 *zsig12 
     1358      zsgprm22 = zQ12Q12*zsig11 + zQ11Q11*zsig22 +      2._wp*zQ11Q12 *zsig12 
    11601359 
    11611360      pstressp  = zsgprm11 + zsgprm22 
     
    11671366      IF (ksub == kndte) THEN 
    11681367         zrotstemp11r = zQ11Q11*zstemp11r - 2._wp*zQ11Q12* zstemp12r & 
    1169                      + zQ12Q12*zstemp22r 
    1170          zrotstemp12r = zQ11Q11*zstemp12r +    zQ11Q12*(zstemp11r-zstemp22r) & 
    1171                      - zQ12Q12*zstemp12r 
     1368                      + zQ12Q12*zstemp22r 
     1369         zrotstemp12r = zQ11Q11*zstemp12r +       zQ11Q12*(zstemp11r-zstemp22r) & 
     1370                      - zQ12Q12*zstemp12r 
    11721371         zrotstemp22r = zQ12Q12*zstemp11r + 2._wp*zQ11Q12* zstemp12r &  
    1173                      + zQ11Q11*zstemp22r 
     1372                      + zQ11Q11*zstemp22r 
    11741373 
    11751374         zrotstemp11s = zQ11Q11*zstemp11s - 2._wp*zQ11Q12* zstemp12s & 
    1176                      + zQ12Q12*zstemp22s 
    1177          zrotstemp12s = zQ11Q11*zstemp12s +    zQ11Q12*(zstemp11s-zstemp22s) & 
    1178                      - zQ12Q12*zstemp12s 
     1375                      + zQ12Q12*zstemp22s 
     1376         zrotstemp12s = zQ11Q11*zstemp12s +       zQ11Q12*(zstemp11s-zstemp22s) & 
     1377                      - zQ12Q12*zstemp12s 
    11791378         zrotstemp22s = zQ12Q12*zstemp11s + 2._wp*zQ11Q12* zstemp12s &  
    1180                      + zQ11Q11*zstemp22s 
     1379                      + zQ11Q11*zstemp22s 
    11811380 
    11821381         palphar =  zrotstemp11r*zdtemp11 + 2._wp*zrotstemp12r*zdtemp12 & 
    1183                  + zrotstemp22r*zdtemp22 
     1382                  + zrotstemp22r*zdtemp22 
    11841383         palphas =  zrotstemp11s*zdtemp11 + 2._wp*zrotstemp12s*zdtemp12 & 
    1185                  + zrotstemp22s*zdtemp22 
     1384                  + zrotstemp22s*zdtemp22 
    11861385      ENDIF 
    11871386   END SUBROUTINE update_stress_rdg  
     
    11901389 
    11911390 
    1192    SUBROUTINE calc_ffrac (pstressp, pstressm, pstress12, & 
    1193                           pa11, pa12,                   & 
    1194                           pmresult11, pmresult12) 
     1391   SUBROUTINE calc_ffrac( pstressp, pstressm, pstress12, pa11, pa12, & 
     1392      &                   pmresult11, pmresult12 ) 
    11951393      !!--------------------------------------------------------------------- 
    11961394      !!                   ***  ROUTINE calc_ffrac  *** 
     
    12101408      REAL (wp) ::   zQ11, zQ12, zQ11Q11, zQ11Q12, zQ12Q12 
    12111409 
    1212       REAL (wp), PARAMETER ::   kfrac = 0.0001_wp   ! rate of fracture formation  
     1410!!$      REAL (wp), PARAMETER ::   kfrac = 0.0001_wp   ! rate of fracture formation  
     1411      REAL (wp), PARAMETER ::   kfrac = 1.e-3_wp   ! rate of fracture formation  
    12131412      REAL (wp), PARAMETER ::   threshold = 0.3_wp  ! critical confinement ratio  
    12141413      !!--------------------------------------------------------------- 
     
    12411440      ENDIF 
    12421441 
    1243       zsigma_1 = zQ11Q11*zsigma11 + 2.0_wp*zQ11Q12*zsigma12  & 
    1244               + zQ12Q12*zsigma22 ! S(1,1) 
    1245       zsigma_2 = zQ12Q12*zsigma11 - 2.0_wp*zQ11Q12*zsigma12  & 
    1246               + zQ11Q11*zsigma22 ! S(2,2) 
     1442      zsigma_1 = zQ11Q11*zsigma11 + 2.0_wp*zQ11Q12*zsigma12 + zQ12Q12*zsigma22 ! S(1,1) 
     1443      zsigma_2 = zQ12Q12*zsigma11 - 2.0_wp*zQ11Q12*zsigma12 + zQ11Q11*zsigma22 ! S(2,2) 
    12471444 
    12481445      ! Pure divergence 
     
    12551452      ! which leads to the loss of their shape, so we again model it through diffusion 
    12561453      ELSEIF ((zsigma_1 >= 0.0_wp).AND.(zsigma_2 < 0.0_wp))  THEN 
    1257          pmresult11 = kfrac * (pa11 - zQ12Q12) 
    1258          pmresult12 = kfrac * (pa12 + zQ11Q12) 
     1454         pmresult11 = - kfrac * (pa11 - zQ12Q12) 
     1455         pmresult12 = - kfrac * (pa12 + zQ11Q12) 
    12591456 
    12601457      ! Shear faulting 
     
    12631460         pmresult12 = 0.0_wp 
    12641461      ELSEIF ((zsigma_1 <= 0.0_wp).AND.(zsigma_1/zsigma_2 <= threshold)) THEN 
    1265          pmresult11 = kfrac * (pa11 - zQ12Q12) 
    1266          pmresult12 = kfrac * (pa12 + zQ11Q12) 
     1462         pmresult11 = - kfrac * (pa11 - zQ12Q12) 
     1463         pmresult12 = - kfrac * (pa12 + zQ11Q12) 
    12671464 
    12681465      ! Horizontal spalling 
     
    12951492      REAL(wp) ::   da, dx, dy, dp, dz, a1 
    12961493 
     1494      !!clem 
     1495      REAL(wp) ::   zw1, zw2, zfac, ztemp 
     1496      REAL(wp) ::   idx, idy, idz 
     1497 
    12971498      REAL(wp), PARAMETER           ::   eps6 = 1.0e-6_wp 
    12981499      !!---------------------------------------------------------------------- 
     
    13051506            id2 = iom_varid( numrir, 'stress2_i' , ldstop = .FALSE. ) 
    13061507            id3 = iom_varid( numrir, 'stress12_i', ldstop = .FALSE. ) 
    1307             id4 = iom_varid( numrir, 'aniso_11' , ldstop = .FALSE. ) 
    1308             id5 = iom_varid( numrir, 'aniso_12' , ldstop = .FALSE. ) 
     1508            id4 = iom_varid( numrir, 'aniso_11'  , ldstop = .FALSE. ) 
     1509            id5 = iom_varid( numrir, 'aniso_12'  , ldstop = .FALSE. ) 
    13091510            ! 
    13101511            IF( MIN( id1, id2, id3, id4, id5 ) > 0 ) THEN      ! fields exist 
     
    13121513               CALL iom_get( numrir, jpdom_autoglo, 'stress2_i' , stress2_i  ) 
    13131514               CALL iom_get( numrir, jpdom_autoglo, 'stress12_i', stress12_i ) 
    1314                CALL iom_get( numrir, jpdom_autoglo, 'aniso_11' , aniso_11 ) 
    1315                CALL iom_get( numrir, jpdom_autoglo, 'aniso_12' , aniso_12 ) 
     1515               CALL iom_get( numrir, jpdom_autoglo, 'aniso_11'  , aniso_11  ) 
     1516               CALL iom_get( numrir, jpdom_autoglo, 'aniso_12'  , aniso_12  ) 
    13161517            ELSE                                     ! start rheology from rest 
    13171518               IF(lwp) WRITE(numout,*) 
     
    13201521               stress2_i (:,:) = 0._wp 
    13211522               stress12_i(:,:) = 0._wp 
    1322                aniso_11 (:,:) = 0.5_wp 
    1323                aniso_12 (:,:) = 0._wp 
     1523               aniso_11  (:,:) = 0.5_wp 
     1524               aniso_12  (:,:) = 0._wp 
    13241525            ENDIF 
    13251526         ELSE                                   !* Start from rest 
     
    13291530            stress2_i (:,:) = 0._wp 
    13301531            stress12_i(:,:) = 0._wp 
    1331             aniso_11 (:,:) = 0.5_wp 
    1332             aniso_12 (:,:) = 0._wp 
     1532            aniso_11  (:,:) = 0.5_wp 
     1533            aniso_12  (:,:) = 0._wp 
    13331534         ENDIF 
    13341535         ! 
    13351536 
    1336       da = 0.5_wp/real(na_yield-1,kind=wp) 
    1337       ainit = 0.5_wp - da 
    1338       dx = rpi/real(nx_yield-1,kind=wp) 
    1339       xinit = rpi + 0.25_wp*rpi - dx 
    1340       dz = rpi/real(nz,kind=wp) 
    1341       zinit = -rpi*0.5_wp 
    1342       dy = rpi/real(ny_yield-1,kind=wp) 
    1343       yinit = -dy 
    1344  
    1345       DO ia=1,na_yield 
    1346        DO ix=1,nx_yield 
    1347         DO iy=1,ny_yield 
    1348          s11r(ix,iy,ia) = 0._wp 
    1349          s12r(ix,iy,ia) = 0._wp 
    1350          s22r(ix,iy,ia) = 0._wp 
    1351          s11s(ix,iy,ia) = 0._wp 
    1352          s12s(ix,iy,ia) = 0._wp 
    1353          s22s(ix,iy,ia) = 0._wp 
    1354          IF (ia <= na_yield-1) THEN 
    1355           DO iz=1,nz 
    1356           s11r(ix,iy,ia) = s11r(ix,iy,ia) + 1*w1(ainit+ia*da)* & 
    1357            exp(-w2(ainit+ia*da)*(zinit+iz*dz)*(zinit+iz*dz))* & 
    1358            s11kr(xinit+ix*dx,yinit+iy*dy,zinit+iz*dz)*dz/sin(2._wp*pphi) 
    1359           s12r(ix,iy,ia) = s12r(ix,iy,ia) + 1*w1(ainit+ia*da)* & 
    1360            exp(-w2(ainit+ia*da)*(zinit+iz*dz)*(zinit+iz*dz))* & 
    1361            s12kr(xinit+ix*dx,yinit+iy*dy,zinit+iz*dz)*dz/sin(2._wp*pphi) 
    1362           s22r(ix,iy,ia) = s22r(ix,iy,ia) + 1*w1(ainit+ia*da)* & 
    1363            exp(-w2(ainit+ia*da)*(zinit+iz*dz)*(zinit+iz*dz))* & 
    1364            s22kr(xinit+ix*dx,yinit+iy*dy,zinit+iz*dz)*dz/sin(2._wp*pphi)  
    1365           s11s(ix,iy,ia) = s11s(ix,iy,ia) + 1*w1(ainit+ia*da)* & 
    1366            exp(-w2(ainit+ia*da)*(zinit+iz*dz)*(zinit+iz*dz))* & 
    1367            s11ks(xinit+ix*dx,yinit+iy*dy,zinit+iz*dz)*dz/sin(2._wp*pphi) 
    1368           s12s(ix,iy,ia) = s12s(ix,iy,ia) + 1*w1(ainit+ia*da)* & 
    1369            exp(-w2(ainit+ia*da)*(zinit+iz*dz)*(zinit+iz*dz))* & 
    1370            s12ks(xinit+ix*dx,yinit+iy*dy,zinit+iz*dz)*dz/sin(2._wp*pphi) 
    1371           s22s(ix,iy,ia) = s22s(ix,iy,ia) + 1*w1(ainit+ia*da)* & 
    1372            exp(-w2(ainit+ia*da)*(zinit+iz*dz)*(zinit+iz*dz))* & 
    1373            s22ks(xinit+ix*dx,yinit+iy*dy,zinit+iz*dz)*dz/sin(2._wp*pphi) 
    1374           ENDDO 
    1375           IF (abs(s11r(ix,iy,ia)) < eps6) s11r(ix,iy,ia) = 0._wp 
    1376           IF (abs(s12r(ix,iy,ia)) < eps6) s12r(ix,iy,ia) = 0._wp 
    1377           IF (abs(s22r(ix,iy,ia)) < eps6) s22r(ix,iy,ia) = 0._wp 
    1378           IF (abs(s11s(ix,iy,ia)) < eps6) s11s(ix,iy,ia) = 0._wp 
    1379           IF (abs(s12s(ix,iy,ia)) < eps6) s12s(ix,iy,ia) = 0._wp 
    1380           IF (abs(s22s(ix,iy,ia)) < eps6) s22s(ix,iy,ia) = 0._wp 
    1381          ELSE 
    1382           s11r(ix,iy,ia) = 0.5_wp*s11kr(xinit+ix*dx,yinit+iy*dy,0._wp)/sin(2._wp*pphi) 
    1383           s12r(ix,iy,ia) = 0.5_wp*s12kr(xinit+ix*dx,yinit+iy*dy,0._wp)/sin(2._wp*pphi) 
    1384           s22r(ix,iy,ia) = 0.5_wp*s22kr(xinit+ix*dx,yinit+iy*dy,0._wp)/sin(2._wp*pphi) 
    1385           s11s(ix,iy,ia) = 0.5_wp*s11ks(xinit+ix*dx,yinit+iy*dy,0._wp)/sin(2._wp*pphi) 
    1386           s12s(ix,iy,ia) = 0.5_wp*s12ks(xinit+ix*dx,yinit+iy*dy,0._wp)/sin(2._wp*pphi) 
    1387           s22s(ix,iy,ia) = 0.5_wp*s22ks(xinit+ix*dx,yinit+iy*dy,0._wp)/sin(2._wp*pphi) 
    1388           IF (abs(s11r(ix,iy,ia)) < eps6) s11r(ix,iy,ia) = 0._wp 
    1389           IF (abs(s12r(ix,iy,ia)) < eps6) s12r(ix,iy,ia) = 0._wp 
    1390           IF (abs(s22r(ix,iy,ia)) < eps6) s22r(ix,iy,ia) = 0._wp 
    1391           IF (abs(s11s(ix,iy,ia)) < eps6) s11s(ix,iy,ia) = 0._wp 
    1392           IF (abs(s12s(ix,iy,ia)) < eps6) s12s(ix,iy,ia) = 0._wp 
    1393           IF (abs(s22s(ix,iy,ia)) < eps6) s22s(ix,iy,ia) = 0._wp 
    1394          ENDIF 
    1395         ENDDO 
    1396        ENDDO 
    1397       ENDDO 
     1537         da = 0.5_wp/real(na_yield-1,kind=wp) 
     1538         ainit = 0.5_wp - da 
     1539         dx = rpi/real(nx_yield-1,kind=wp) 
     1540         xinit = rpi + 0.25_wp*rpi - dx 
     1541         dz = rpi/real(nz,kind=wp) 
     1542         zinit = -rpi*0.5_wp 
     1543         dy = rpi/real(ny_yield-1,kind=wp) 
     1544         yinit = -dy 
     1545 
     1546         s11r(:,:,:) = 0._wp 
     1547         s12r(:,:,:) = 0._wp 
     1548         s22r(:,:,:) = 0._wp 
     1549         s11s(:,:,:) = 0._wp 
     1550         s12s(:,:,:) = 0._wp 
     1551         s22s(:,:,:) = 0._wp 
     1552 
     1553!!$         DO ia=1,na_yield 
     1554!!$            DO ix=1,nx_yield 
     1555!!$               DO iy=1,ny_yield 
     1556!!$                  s11r(ix,iy,ia) = 0._wp 
     1557!!$                  s12r(ix,iy,ia) = 0._wp 
     1558!!$                  s22r(ix,iy,ia) = 0._wp 
     1559!!$                  s11s(ix,iy,ia) = 0._wp 
     1560!!$                  s12s(ix,iy,ia) = 0._wp 
     1561!!$                  s22s(ix,iy,ia) = 0._wp 
     1562!!$                  IF (ia <= na_yield-1) THEN 
     1563!!$                     DO iz=1,nz 
     1564!!$                        s11r(ix,iy,ia) = s11r(ix,iy,ia) + 1*w1(ainit+ia*da)* & 
     1565!!$                           exp(-w2(ainit+ia*da)*(zinit+iz*dz)*(zinit+iz*dz))* & 
     1566!!$                           s11kr(xinit+ix*dx,yinit+iy*dy,zinit+iz*dz)*dz/sin(2._wp*pphi) 
     1567!!$                        s12r(ix,iy,ia) = s12r(ix,iy,ia) + 1*w1(ainit+ia*da)* & 
     1568!!$                           exp(-w2(ainit+ia*da)*(zinit+iz*dz)*(zinit+iz*dz))* & 
     1569!!$                           s12kr(xinit+ix*dx,yinit+iy*dy,zinit+iz*dz)*dz/sin(2._wp*pphi) 
     1570!!$                        s22r(ix,iy,ia) = s22r(ix,iy,ia) + 1*w1(ainit+ia*da)* & 
     1571!!$                           exp(-w2(ainit+ia*da)*(zinit+iz*dz)*(zinit+iz*dz))* & 
     1572!!$                           s22kr(xinit+ix*dx,yinit+iy*dy,zinit+iz*dz)*dz/sin(2._wp*pphi)  
     1573!!$                        s11s(ix,iy,ia) = s11s(ix,iy,ia) + 1*w1(ainit+ia*da)* & 
     1574!!$                           exp(-w2(ainit+ia*da)*(zinit+iz*dz)*(zinit+iz*dz))* & 
     1575!!$                           s11ks(xinit+ix*dx,yinit+iy*dy,zinit+iz*dz)*dz/sin(2._wp*pphi) 
     1576!!$                        s12s(ix,iy,ia) = s12s(ix,iy,ia) + 1*w1(ainit+ia*da)* & 
     1577!!$                           exp(-w2(ainit+ia*da)*(zinit+iz*dz)*(zinit+iz*dz))* & 
     1578!!$                           s12ks(xinit+ix*dx,yinit+iy*dy,zinit+iz*dz)*dz/sin(2._wp*pphi) 
     1579!!$                        s22s(ix,iy,ia) = s22s(ix,iy,ia) + 1*w1(ainit+ia*da)* & 
     1580!!$                           exp(-w2(ainit+ia*da)*(zinit+iz*dz)*(zinit+iz*dz))* & 
     1581!!$                           s22ks(xinit+ix*dx,yinit+iy*dy,zinit+iz*dz)*dz/sin(2._wp*pphi) 
     1582!!$                     ENDDO 
     1583!!$                     IF (abs(s11r(ix,iy,ia)) < eps6) s11r(ix,iy,ia) = 0._wp 
     1584!!$                     IF (abs(s12r(ix,iy,ia)) < eps6) s12r(ix,iy,ia) = 0._wp 
     1585!!$                     IF (abs(s22r(ix,iy,ia)) < eps6) s22r(ix,iy,ia) = 0._wp 
     1586!!$                     IF (abs(s11s(ix,iy,ia)) < eps6) s11s(ix,iy,ia) = 0._wp 
     1587!!$                     IF (abs(s12s(ix,iy,ia)) < eps6) s12s(ix,iy,ia) = 0._wp 
     1588!!$                     IF (abs(s22s(ix,iy,ia)) < eps6) s22s(ix,iy,ia) = 0._wp 
     1589!!$                  ELSE 
     1590!!$                     s11r(ix,iy,ia) = 0.5_wp*s11kr(xinit+ix*dx,yinit+iy*dy,0._wp)/sin(2._wp*pphi) 
     1591!!$                     s12r(ix,iy,ia) = 0.5_wp*s12kr(xinit+ix*dx,yinit+iy*dy,0._wp)/sin(2._wp*pphi) 
     1592!!$                     s22r(ix,iy,ia) = 0.5_wp*s22kr(xinit+ix*dx,yinit+iy*dy,0._wp)/sin(2._wp*pphi) 
     1593!!$                     s11s(ix,iy,ia) = 0.5_wp*s11ks(xinit+ix*dx,yinit+iy*dy,0._wp)/sin(2._wp*pphi) 
     1594!!$                     s12s(ix,iy,ia) = 0.5_wp*s12ks(xinit+ix*dx,yinit+iy*dy,0._wp)/sin(2._wp*pphi) 
     1595!!$                     s22s(ix,iy,ia) = 0.5_wp*s22ks(xinit+ix*dx,yinit+iy*dy,0._wp)/sin(2._wp*pphi) 
     1596!!$                     IF (abs(s11r(ix,iy,ia)) < eps6) s11r(ix,iy,ia) = 0._wp 
     1597!!$                     IF (abs(s12r(ix,iy,ia)) < eps6) s12r(ix,iy,ia) = 0._wp 
     1598!!$                     IF (abs(s22r(ix,iy,ia)) < eps6) s22r(ix,iy,ia) = 0._wp 
     1599!!$                     IF (abs(s11s(ix,iy,ia)) < eps6) s11s(ix,iy,ia) = 0._wp 
     1600!!$                     IF (abs(s12s(ix,iy,ia)) < eps6) s12s(ix,iy,ia) = 0._wp 
     1601!!$                     IF (abs(s22s(ix,iy,ia)) < eps6) s22s(ix,iy,ia) = 0._wp 
     1602!!$                  ENDIF 
     1603!!$               ENDDO 
     1604!!$            ENDDO 
     1605!!$         ENDDO 
     1606 
     1607         !! faster but still very slow => to be improved          
     1608         zfac = dz/sin(2._wp*pphi) 
     1609         DO ia = 1, na_yield-1 
     1610            zw1 = w1(ainit+ia*da) 
     1611            zw2 = w2(ainit+ia*da) 
     1612            DO iz = 1, nz 
     1613               idz = zinit+iz*dz 
     1614               ztemp = zw1 * EXP(-zw2*(zinit+iz*dz)*(zinit+iz*dz)) 
     1615               DO iy = 1, ny_yield 
     1616                  idy = yinit+iy*dy 
     1617                  DO ix = 1, nx_yield 
     1618                     idx = xinit+ix*dx 
     1619                     s11r(ix,iy,ia) = s11r(ix,iy,ia) + ztemp * s11kr(idx,idy,idz)*zfac 
     1620                     s12r(ix,iy,ia) = s12r(ix,iy,ia) + ztemp * s12kr(idx,idy,idz)*zfac 
     1621                     s22r(ix,iy,ia) = s22r(ix,iy,ia) + ztemp * s22kr(idx,idy,idz)*zfac  
     1622                     s11s(ix,iy,ia) = s11s(ix,iy,ia) + ztemp * s11ks(idx,idy,idz)*zfac 
     1623                     s12s(ix,iy,ia) = s12s(ix,iy,ia) + ztemp * s12ks(idx,idy,idz)*zfac 
     1624                     s22s(ix,iy,ia) = s22s(ix,iy,ia) + ztemp * s22ks(idx,idy,idz)*zfac 
     1625                  END DO 
     1626               END DO 
     1627            END DO 
     1628         END DO 
     1629 
     1630         zfac = 1._wp/sin(2._wp*pphi) 
     1631         ia = na_yield 
     1632         DO iy = 1, ny_yield 
     1633            idy = yinit+iy*dy 
     1634            DO ix = 1, nx_yield 
     1635               idx = xinit+ix*dx                   
     1636               s11r(ix,iy,ia) = 0.5_wp*s11kr(idx,idy,0._wp)*zfac 
     1637               s12r(ix,iy,ia) = 0.5_wp*s12kr(idx,idy,0._wp)*zfac 
     1638               s22r(ix,iy,ia) = 0.5_wp*s22kr(idx,idy,0._wp)*zfac 
     1639               s11s(ix,iy,ia) = 0.5_wp*s11ks(idx,idy,0._wp)*zfac 
     1640               s12s(ix,iy,ia) = 0.5_wp*s12ks(idx,idy,0._wp)*zfac 
     1641               s22s(ix,iy,ia) = 0.5_wp*s22ks(idx,idy,0._wp)*zfac 
     1642            ENDDO 
     1643         ENDDO 
     1644         WHERE (ABS(s11r(:,:,:)) < eps6) s11r(:,:,:) = 0._wp 
     1645         WHERE (ABS(s12r(:,:,:)) < eps6) s12r(:,:,:) = 0._wp 
     1646         WHERE (ABS(s22r(:,:,:)) < eps6) s22r(:,:,:) = 0._wp 
     1647         WHERE (ABS(s11s(:,:,:)) < eps6) s11s(:,:,:) = 0._wp 
     1648         WHERE (ABS(s12s(:,:,:)) < eps6) s12s(:,:,:) = 0._wp 
     1649         WHERE (ABS(s22s(:,:,:)) < eps6) s22s(:,:,:) = 0._wp 
     1650 
    13981651 
    13991652      ELSEIF( TRIM(cdrw) == 'WRITE' ) THEN   ! Create restart file 
     
    14051658         CALL iom_rstput( iter, nitrst, numriw, 'stress2_i' , stress2_i  ) 
    14061659         CALL iom_rstput( iter, nitrst, numriw, 'stress12_i', stress12_i ) 
    1407          CALL iom_rstput( iter, nitrst, numriw, 'aniso_11' , aniso_11 ) 
    1408          CALL iom_rstput( iter, nitrst, numriw, 'aniso_12' , aniso_12 ) 
     1660         CALL iom_rstput( iter, nitrst, numriw, 'aniso_11'  , aniso_11  ) 
     1661         CALL iom_rstput( iter, nitrst, numriw, 'aniso_12'  , aniso_12  ) 
    14091662         ! 
    14101663      ENDIF 
     
    14211674      !!------------------------------------------------------------------- 
    14221675    
    1423       w1 = - 223.87569446_wp & 
    1424        &   + 2361.2198663_wp*pa & 
     1676      w1 = -   223.87569446_wp & 
     1677       &   +  2361.21986630_wp*pa & 
    14251678       &   - 10606.56079975_wp*pa*pa & 
    14261679       &   + 26315.50025642_wp*pa*pa*pa & 
     
    14281681       &   + 34397.72407466_wp*pa*pa*pa*pa*pa & 
    14291682       &   - 16789.98003081_wp*pa*pa*pa*pa*pa*pa & 
    1430        &   + 3495.82839237_wp*pa*pa*pa*pa*pa*pa*pa 
     1683       &   +  3495.82839237_wp*pa*pa*pa*pa*pa*pa*pa 
    14311684    
    14321685   END FUNCTION w1 
     
    14411694      !!------------------------------------------------------------------- 
    14421695    
    1443       w2 = - 6670.68911883_wp & 
    1444        &   + 70222.33061536_wp*pa & 
    1445        &   - 314871.71525448_wp*pa*pa & 
    1446        &   + 779570.02793492_wp*pa*pa*pa & 
     1696      w2 = -    6670.68911883_wp & 
     1697       &   +   70222.33061536_wp*pa & 
     1698       &   -  314871.71525448_wp*pa*pa & 
     1699       &   +  779570.02793492_wp*pa*pa*pa & 
    14471700       &   - 1151098.82436864_wp*pa*pa*pa*pa & 
    14481701       &   + 1013896.59464498_wp*pa*pa*pa*pa*pa & 
    1449        &   - 493379.44906738_wp*pa*pa*pa*pa*pa*pa & 
    1450        &   + 102356.551518_wp*pa*pa*pa*pa*pa*pa*pa 
     1702       &   -  493379.44906738_wp*pa*pa*pa*pa*pa*pa & 
     1703       &   +  102356.55151800_wp*pa*pa*pa*pa*pa*pa*pa 
    14511704    
    14521705   END FUNCTION w2 
     
    18062059   !!   Default option         Empty module           NO SI3 sea-ice model 
    18072060   !!---------------------------------------------------------------------- 
    1808  
    18092061#endif 
     2062 
    18102063   !!============================================================================== 
    18112064END MODULE icedyn_rhg_eap 
  • NEMO/branches/2019/dev_r11842_SI3-10_EAP/tests/ICE_RHEO/MY_SRC/icedyn_rhg_evp.F90

    r13574 r13746  
    4141   USE prtctl         ! Print control 
    4242 
     43   USE netcdf         ! NetCDF library for convergence test 
    4344   IMPLICIT NONE 
    4445   PRIVATE 
     
    4950   !! * Substitutions 
    5051#  include "vectopt_loop_substitute.h90" 
     52 
     53   !! for convergence tests 
     54   INTEGER ::   ncvgid   ! netcdf file id 
     55   INTEGER ::   nvarid   ! netcdf variable id 
     56   REAL(wp), ALLOCATABLE, DIMENSION(:,:) ::   zmsk00, zmsk15 
    5157   !!---------------------------------------------------------------------- 
    5258   !! NEMO/ICE 4.0 , NEMO Consortium (2018) 
    53    !! $Id: icedyn_rhg_evp.F90 11536 2019-09-11 13:54:18Z smasson $ 
     59   !! $Id: icedyn_rhg_evp.F90 13662 2020-10-22 18:49:56Z clem $ 
    5460   !! Software governed by the CeCILL license (see ./LICENSE) 
    5561   !!---------------------------------------------------------------------- 
     
    119125      REAL(wp) ::   ecc2, z1_ecc2                                       ! square of yield ellipse eccenticity 
    120126      REAL(wp) ::   zalph1, z1_alph1, zalph2, z1_alph2                  ! alpha coef from Bouillon 2009 or Kimmritz 2017 
     127      REAl(wp) ::   zbetau, zbetav 
    121128      REAL(wp) ::   zm1, zm2, zm3, zmassU, zmassV, zvU, zvV             ! ice/snow mass and volume 
    122       REAL(wp) ::   zdelta, zp_delf, zds2, zdt, zdt2, zdiv, zdiv2       ! temporary scalars 
     129      REAL(wp) ::   zp_delf, zds2, zdt, zdt2, zdiv, zdiv2               ! temporary scalars 
    123130      REAL(wp) ::   zTauO, zTauB, zRHS, zvel                            ! temporary scalars 
    124131      REAL(wp) ::   zkt                                                 ! isotropic tensile strength for landfast ice 
    125132      REAL(wp) ::   zvCr                                                ! critical ice volume above which ice is landfast 
    126133      ! 
    127       REAL(wp) ::   zresm                                               ! Maximal error on ice velocity 
    128134      REAL(wp) ::   zintb, zintn                                        ! dummy argument 
    129135      REAL(wp) ::   zfac_x, zfac_y 
    130136      REAL(wp) ::   zshear, zdum1, zdum2 
    131       REAL(wp) ::   invw                                                ! for test case 
    132       ! 
    133       REAL(wp), DIMENSION(jpi,jpj) ::   zp_delt                         ! P/delta at T points 
     137      REAL(wp) ::   zinvw                                                ! for test case 
     138 
     139      ! 
     140      REAL(wp), DIMENSION(jpi,jpj) ::   zdelta, zp_delt                 ! delta and P/delta at T points 
     141      REAL(wp), DIMENSION(jpi,jpj) ::   zten_i                          ! tension 
    134142      REAL(wp), DIMENSION(jpi,jpj) ::   zbeta                           ! beta coef from Kimmritz 2017 
    135143      ! 
     
    138146      REAL(wp), DIMENSION(jpi,jpj) ::   zmU_t, zmV_t                    ! (ice-snow_mass / dt) on U/V points 
    139147      REAL(wp), DIMENSION(jpi,jpj) ::   zmf                             ! coriolis parameter at T points 
    140       REAL(wp), DIMENSION(jpi,jpj) ::   v_oceU, u_oceV, v_iceU, u_iceV  ! ocean/ice u/v component on V/U points                            
     148      REAL(wp), DIMENSION(jpi,jpj) ::   v_oceU, u_oceV, v_iceU, u_iceV  ! ocean/ice u/v component on V/U points 
    141149      ! 
    142150      REAL(wp), DIMENSION(jpi,jpj) ::   zds                             ! shear 
    143151      REAL(wp), DIMENSION(jpi,jpj) ::   zs1, zs2, zs12                  ! stress tensor components 
    144 !!$      REAL(wp), DIMENSION(jpi,jpj) ::   zu_ice, zv_ice, zresr           ! check convergence 
    145152      REAL(wp), DIMENSION(jpi,jpj) ::   zsshdyn                         ! array used for the calculation of ice surface slope: 
    146153      !                                                                 !    ocean surface (ssh_m) if ice is not embedded 
     
    156163      REAL(wp), DIMENSION(jpi,jpj) ::   zmsk01x, zmsk01y                ! dummy arrays 
    157164      REAL(wp), DIMENSION(jpi,jpj) ::   zmsk00x, zmsk00y                ! mask for ice presence 
    158       REAL(wp), DIMENSION(jpi,jpj) ::   zfmask, zwf                     ! mask at F points for the ice 
     165      REAL(wp), DIMENSION(jpi,jpj) ::   zfmask                          ! mask at F points for the ice 
    159166 
    160167      REAL(wp), PARAMETER          ::   zepsi  = 1.0e-20_wp             ! tolerance parameter 
    161168      REAL(wp), PARAMETER          ::   zmmin  = 1._wp                  ! ice mass (kg/m2)  below which ice velocity becomes very small 
    162169      REAL(wp), PARAMETER          ::   zamin  = 0.001_wp               ! ice concentration below which ice velocity becomes very small 
     170      !! --- check convergence 
     171      REAL(wp), DIMENSION(jpi,jpj) ::   zu_ice, zv_ice 
    163172      !! --- diags 
    164       REAL(wp), DIMENSION(jpi,jpj) ::   zmsk00 
    165       REAL(wp), ALLOCATABLE, DIMENSION(:,:) ::   zsig1, zsig2, zsig3 
     173      REAL(wp) ::   zsig1, zsig2, zsig12, zfac, z1_strength 
     174      REAL(wp), ALLOCATABLE, DIMENSION(:,:) ::   zsig_I, zsig_II, zsig1_p, zsig2_p          
    166175      !! --- SIMIP diags 
    167176      REAL(wp), ALLOCATABLE, DIMENSION(:,:) ::   zdiag_xmtrp_ice ! X-component of ice mass transport (kg/s) 
     
    175184      IF( kt == nit000 .AND. lwp )   WRITE(numout,*) '-- ice_dyn_rhg_evp: EVP sea-ice rheology' 
    176185      ! 
    177 !!gm for Clem:  OPTIMIZATION:  I think zfmask can be computed one for all at the initialization.... 
     186      ! for diagnostics and convergence tests 
     187      ALLOCATE( zmsk00(jpi,jpj), zmsk15(jpi,jpj) ) 
     188      DO jj = 1, jpj 
     189         DO ji = 1, jpi 
     190            zmsk00(ji,jj) = MAX( 0._wp , SIGN( 1._wp , at_i(ji,jj) - epsi06  ) ) ! 1 if ice    , 0 if no ice 
     191            zmsk15(ji,jj) = MAX( 0._wp , SIGN( 1._wp , at_i(ji,jj) - 0.15_wp ) ) ! 1 if 15% ice, 0 if less 
     192         END DO 
     193      END DO 
     194      ! 
     195      !!gm for Clem:  OPTIMIZATION:  I think zfmask can be computed one for all at the initialization.... 
    178196      !------------------------------------------------------------------------------! 
    179197      ! 0) mask at F points for the ice 
     
    188206 
    189207      ! Lateral boundary conditions on velocity (modify zfmask) 
    190       zwf(:,:) = zfmask(:,:) 
    191208      DO jj = 2, jpjm1 
    192209         DO ji = fs_2, fs_jpim1   ! vector opt. 
    193210            IF( zfmask(ji,jj) == 0._wp ) THEN 
    194                zfmask(ji,jj) = rn_ishlat * MIN( 1._wp , MAX( zwf(ji+1,jj), zwf(ji,jj+1), zwf(ji-1,jj), zwf(ji,jj-1) ) ) 
     211               zfmask(ji,jj) = rn_ishlat * MIN( 1._wp , MAX( umask(ji,jj,1), umask(ji,jj+1,1), & 
     212                  &                                          vmask(ji,jj,1), vmask(ji+1,jj,1) ) ) 
    195213            ENDIF 
    196214         END DO 
     
    198216      DO jj = 2, jpjm1 
    199217         IF( zfmask(1,jj) == 0._wp ) THEN 
    200             zfmask(1  ,jj) = rn_ishlat * MIN( 1._wp , MAX( zwf(2,jj), zwf(1,jj+1), zwf(1,jj-1) ) ) 
     218            zfmask(1  ,jj) = rn_ishlat * MIN( 1._wp , MAX( vmask(2,jj,1), umask(1,jj+1,1), umask(1,jj,1) ) ) 
    201219         ENDIF 
    202220         IF( zfmask(jpi,jj) == 0._wp ) THEN 
    203             zfmask(jpi,jj) = rn_ishlat * MIN( 1._wp , MAX( zwf(jpi,jj+1), zwf(jpim1,jj), zwf(jpi,jj-1) ) ) 
    204          ENDIF 
     221            zfmask(jpi,jj) = rn_ishlat * MIN( 1._wp , MAX( umask(jpi,jj+1,1), vmask(jpim1,jj,1), umask(jpi,jj-1,1) ) ) 
     222        ENDIF 
    205223      END DO 
    206224      DO ji = 2, jpim1 
    207225         IF( zfmask(ji,1) == 0._wp ) THEN 
    208             zfmask(ji,1  ) = rn_ishlat * MIN( 1._wp , MAX( zwf(ji+1,1), zwf(ji,2), zwf(ji-1,1) ) ) 
     226            zfmask(ji, 1 ) = rn_ishlat * MIN( 1._wp , MAX( vmask(ji+1,1,1), umask(ji,2,1), vmask(ji,1,1) ) ) 
    209227         ENDIF 
    210228         IF( zfmask(ji,jpj) == 0._wp ) THEN 
    211             zfmask(ji,jpj) = rn_ishlat * MIN( 1._wp , MAX( zwf(ji+1,jpj), zwf(ji-1,jpj), zwf(ji,jpjm1) ) ) 
     229            zfmask(ji,jpj) = rn_ishlat * MIN( 1._wp , MAX( vmask(ji+1,jpj,1), vmask(ji-1,jpj,1), umask(ji,jpjm1,1) ) ) 
    212230         ENDIF 
    213231      END DO 
     
    219237      zrhoco = rau0 * rn_cio  
    220238!extra code for test case boundary conditions 
    221       invw=1._wp/(zrhoco*0.5_wp) 
     239      zinvw=1._wp/(zrhoco*0.5_wp) 
    222240 
    223241      ! ecc2: square of yield ellipse eccenticrity 
     
    225243      z1_ecc2 = 1._wp / ecc2 
    226244 
    227       ! Time step for subcycling 
    228       zdtevp   = rdt_ice / REAL( nn_nevp ) 
    229       z1_dtevp = 1._wp / zdtevp 
    230  
    231245      ! alpha parameters (Bouillon 2009) 
    232246      IF( .NOT. ln_aEVP ) THEN 
    233          zalph1 = ( 2._wp * rn_relast * rdt_ice ) * z1_dtevp 
     247         zdtevp   = rdt_ice / REAL( nn_nevp ) 
     248         zalph1 =   2._wp * rn_relast * REAL( nn_nevp ) 
    234249         zalph2 = zalph1 * z1_ecc2 
    235250 
    236251         z1_alph1 = 1._wp / ( zalph1 + 1._wp ) 
    237252         z1_alph2 = 1._wp / ( zalph2 + 1._wp ) 
     253      ELSE 
     254         zdtevp   = rdt_ice 
     255         ! zalpha parameters set later on adaptatively 
    238256      ENDIF 
     257      z1_dtevp = 1._wp / zdtevp 
    239258          
    240259      ! Initialise stress tensor  
     
    247266 
    248267      ! landfast param from Lemieux(2016): add isotropic tensile strength (following Konig Beatty and Holland, 2010) 
    249       IF( ln_landfast_L16 ) THEN   ;   zkt = rn_tensile 
     268      IF( ln_landfast_L16 ) THEN   ;   zkt = rn_lf_tensile 
    250269      ELSE                         ;   zkt = 0._wp 
    251270      ENDIF 
     
    318337               zvV = 0.5_wp * ( vt_i(ji,jj) * e1e2t(ji,jj) + vt_i(ji,jj+1) * e1e2t(ji,jj+1) ) * r1_e1e2v(ji,jj) * vmask(ji,jj,1) 
    319338               ! ice-bottom stress at U points 
    320                zvCr = zaU(ji,jj) * rn_depfra * hu_n(ji,jj) 
    321                ztaux_base(ji,jj) = - rn_icebfr * MAX( 0._wp, zvU - zvCr ) * EXP( -rn_crhg * ( 1._wp - zaU(ji,jj) ) ) 
     339               zvCr = zaU(ji,jj) * rn_lf_depfra * hu_n(ji,jj) 
     340               ztaux_base(ji,jj) = - rn_lf_bfr * MAX( 0._wp, zvU - zvCr ) * EXP( -rn_crhg * ( 1._wp - zaU(ji,jj) ) ) 
    322341               ! ice-bottom stress at V points 
    323                zvCr = zaV(ji,jj) * rn_depfra * hv_n(ji,jj) 
    324                ztauy_base(ji,jj) = - rn_icebfr * MAX( 0._wp, zvV - zvCr ) * EXP( -rn_crhg * ( 1._wp - zaV(ji,jj) ) ) 
     342               zvCr = zaV(ji,jj) * rn_lf_depfra * hv_n(ji,jj) 
     343               ztauy_base(ji,jj) = - rn_lf_bfr * MAX( 0._wp, zvV - zvCr ) * EXP( -rn_crhg * ( 1._wp - zaV(ji,jj) ) ) 
    325344               ! ice_bottom stress at T points 
    326                zvCr = at_i(ji,jj) * rn_depfra * ht_n(ji,jj) 
    327                tau_icebfr(ji,jj) = - rn_icebfr * MAX( 0._wp, vt_i(ji,jj) - zvCr ) * EXP( -rn_crhg * ( 1._wp - at_i(ji,jj) ) ) 
     345               zvCr = at_i(ji,jj) * rn_lf_depfra * ht_n(ji,jj) 
     346               tau_icebfr(ji,jj) = - rn_lf_bfr * MAX( 0._wp, vt_i(ji,jj) - zvCr ) * EXP( -rn_crhg * ( 1._wp - at_i(ji,jj) ) ) 
    328347            END DO 
    329348         END DO 
     
    348367         l_full_nf_update = jter == nn_nevp   ! false: disable full North fold update (performances) for iter = 1 to nn_nevp-1 
    349368         ! 
    350 !!$         IF(ln_ctl) THEN   ! Convergence test 
    351 !!$            DO jj = 1, jpjm1 
    352 !!$               zu_ice(:,jj) = u_ice(:,jj) ! velocity at previous time step 
    353 !!$               zv_ice(:,jj) = v_ice(:,jj) 
    354 !!$            END DO 
    355 !!$         ENDIF 
     369         ! convergence test 
     370         IF( nn_rhg_chkcvg == 1 .OR. nn_rhg_chkcvg == 2  ) THEN 
     371            DO jj = 1, jpj 
     372               DO ji = 1, jpi 
     373                  zu_ice(ji,jj) = u_ice(ji,jj) * umask(ji,jj,1) ! velocity at previous time step 
     374                  zv_ice(ji,jj) = v_ice(ji,jj) * vmask(ji,jj,1) 
     375               END DO 
     376            END DO 
     377         ENDIF 
    356378 
    357379         ! --- divergence, tension & shear (Appendix B of Hunke & Dukowicz, 2002) --- ! 
    358          DO jj = 1, jpjm1         ! loops start at 1 since there is no boundary condition (lbc_lnk) at i=1 and j=1 for F points 
     380         DO jj = 1, jpjm1 
    359381            DO ji = 1, jpim1 
    360382 
     
    366388            END DO 
    367389         END DO 
    368          CALL lbc_lnk( 'icedyn_rhg_evp', zds, 'F', 1. ) 
    369  
    370          DO jj = 2, jpj    ! loop to jpi,jpj to avoid making a communication for zs1,zs2,zs12 
    371             DO ji = 2, jpi ! no vector loop 
     390 
     391         DO jj = 2, jpjm1 
     392            DO ji = 2, jpim1 ! no vector loop 
    372393 
    373394               ! shear**2 at T points (doc eq. A16) 
     
    389410                
    390411               ! delta at T points 
    391                zdelta = SQRT( zdiv2 + ( zdt2 + zds2 ) * z1_ecc2 )   
    392  
    393                ! P/delta at T points 
    394                zp_delt(ji,jj) = strength(ji,jj) / ( zdelta + rn_creepl ) 
    395  
    396                ! alpha & beta for aEVP 
     412               zdelta(ji,jj) = SQRT( zdiv2 + ( zdt2 + zds2 ) * z1_ecc2 )   
     413 
     414            END DO 
     415         END DO 
     416         CALL lbc_lnk( 'icedyn_rhg_evp', zdelta, 'T', 1._wp ) 
     417          
     418         ! P/delta at T points 
     419         DO jj = 1, jpj 
     420            DO ji = 1, jpi 
     421               zp_delt(ji,jj) = strength(ji,jj) / ( zdelta(ji,jj) + rn_creepl ) 
     422            END DO 
     423         END DO 
     424 
     425         DO jj = 2, jpj    ! loop ends at jpi,jpj so that no lbc_lnk are needed for zs1 and zs2 
     426            DO ji = 2, jpi ! no vector loop 
     427 
     428               ! divergence at T points (duplication to avoid communications) 
     429               zdiv  = ( e2u(ji,jj) * u_ice(ji,jj) - e2u(ji-1,jj) * u_ice(ji-1,jj)   & 
     430                  &    + e1v(ji,jj) * v_ice(ji,jj) - e1v(ji,jj-1) * v_ice(ji,jj-1)   & 
     431                  &    ) * r1_e1e2t(ji,jj) 
     432                
     433               ! tension at T points (duplication to avoid communications) 
     434               zdt  = ( ( u_ice(ji,jj) * r1_e2u(ji,jj) - u_ice(ji-1,jj) * r1_e2u(ji-1,jj) ) * e2t(ji,jj) * e2t(ji,jj)   & 
     435                  &   - ( v_ice(ji,jj) * r1_e1v(ji,jj) - v_ice(ji,jj-1) * r1_e1v(ji,jj-1) ) * e1t(ji,jj) * e1t(ji,jj)   & 
     436                  &   ) * r1_e1e2t(ji,jj) 
     437 
     438               ! alpha for aEVP 
    397439               !   gamma = 0.5*P/(delta+creepl) * (c*pi)**2/Area * dt/m 
    398440               !   alpha = beta = sqrt(4*gamma) 
     
    402444                  zalph2   = zalph1 
    403445                  z1_alph2 = z1_alph1 
     446                  ! explicit: 
     447                  ! z1_alph1 = 1._wp / zalph1 
     448                  ! z1_alph2 = 1._wp / zalph1 
     449                  ! zalph1 = zalph1 - 1._wp 
     450                  ! zalph2 = zalph1 
    404451               ENDIF 
    405452                
    406453               ! stress at T points (zkt/=0 if landfast) 
    407                zs1(ji,jj) = ( zs1(ji,jj) * zalph1 + zp_delt(ji,jj) * ( zdiv * (1._wp + zkt) - zdelta * (1._wp - zkt) ) ) * z1_alph1 
    408                zs2(ji,jj) = ( zs2(ji,jj) * zalph2 + zp_delt(ji,jj) * ( zdt * z1_ecc2 * (1._wp + zkt) ) ) * z1_alph2 
     454               zs1(ji,jj) = ( zs1(ji,jj)*zalph1 + zp_delt(ji,jj) * ( zdiv*(1._wp + zkt) - zdelta(ji,jj)*(1._wp - zkt) ) ) * z1_alph1 
     455               zs2(ji,jj) = ( zs2(ji,jj)*zalph2 + zp_delt(ji,jj) * ( zdt * z1_ecc2 * (1._wp + zkt) ) ) * z1_alph2 
    409456              
    410457            END DO 
    411458         END DO 
    412          CALL lbc_lnk( 'icedyn_rhg_evp', zp_delt, 'T', 1. ) 
    413  
     459 
     460         ! Save beta at T-points for further computations 
     461         IF( ln_aEVP ) THEN 
     462            DO jj = 1, jpj 
     463               DO ji = 1, jpi 
     464                  zbeta(ji,jj) = MAX( 50._wp, rpi * SQRT( 0.5_wp * zp_delt(ji,jj) * r1_e1e2t(ji,jj) * zdt_m(ji,jj) ) ) 
     465               END DO 
     466            END DO 
     467         ENDIF 
     468          
    414469         DO jj = 1, jpjm1 
    415470            DO ji = 1, jpim1 
    416471 
    417                ! alpha & beta for aEVP 
     472               ! alpha for aEVP 
    418473               IF( ln_aEVP ) THEN 
    419                   zalph2   = MAX( 50._wp, rpi * SQRT( 0.5_wp * zp_delt(ji,jj) * r1_e1e2t(ji,jj) * zdt_m(ji,jj) ) ) 
     474                  zalph2   = MAX( zbeta(ji,jj), zbeta(ji+1,jj), zbeta(ji,jj+1), zbeta(ji+1,jj+1) ) 
    420475                  z1_alph2 = 1._wp / ( zalph2 + 1._wp ) 
    421                   zbeta(ji,jj) = zalph2 
     476                  ! explicit: 
     477                  ! z1_alph2 = 1._wp / zalph2 
     478                  ! zalph2 = zalph2 - 1._wp 
    422479               ENDIF 
    423480                
     
    489546                  ! 
    490547                  IF( ln_aEVP ) THEN !--- ice velocity using aEVP (Kimmritz et al 2016 & 2017) 
    491                      v_ice(ji,jj) = ( (          rswitch * ( zmV_t(ji,jj) * ( zbeta(ji,jj) * v_ice(ji,jj) + v_ice_b(ji,jj) )       & ! previous velocity 
    492                         &                                  + zRHS + zTauO * v_ice(ji,jj) )                                         & ! F + tau_ia + Coriolis + spg + tau_io(only ocean part) 
    493                         &                                  / MAX( zepsi, zmV_t(ji,jj) * ( zbeta(ji,jj) + 1._wp ) + zTauO - zTauB ) & ! m/dt + tau_io(only ice part) + landfast 
    494                         &               + ( 1._wp - rswitch ) * v_ice(ji,jj) * MAX( 0._wp, 1._wp - zdtevp * rn_lfrelax )           & ! static friction => slow decrease to v=0 
    495                         &             ) * zmsk01y(ji,jj) + v_oce(ji,jj) * 0.01_wp * ( 1._wp - zmsk01y(ji,jj) )                     & ! v_ice = v_oce/100 if mass < zmmin & conc < zamin 
     548                     zbetav = MAX( zbeta(ji,jj), zbeta(ji,jj+1) ) 
     549                     v_ice(ji,jj) = ( (          rswitch   * ( zmV_t(ji,jj) * ( zbetav * v_ice(ji,jj) + v_ice_b(ji,jj) )         & ! previous velocity 
     550                        &                                    + zRHS + zTauO * v_ice(ji,jj)                                       & ! F + tau_ia + Coriolis + spg + tau_io(only ocean part) 
     551                        &                                    ) / MAX( zepsi, zmV_t(ji,jj) * ( zbetav + 1._wp ) + zTauO - zTauB ) & ! m/dt + tau_io(only ice part) + landfast 
     552                        &            + ( 1._wp - rswitch ) * (  v_ice_b(ji,jj)                                                   &  
     553                        &                                     + v_ice  (ji,jj) * MAX( 0._wp, zbetav - zdtevp * rn_lf_relax )     & ! static friction => slow decrease to v=0 
     554                        &                                    ) / ( zbetav + 1._wp )                                              & 
     555                        &             ) * zmsk01y(ji,jj) + v_oce(ji,jj) * 0.01_wp * ( 1._wp - zmsk01y(ji,jj) )                   & ! v_ice = v_oce/100 if mass < zmmin & conc < zamin 
    496556                        &           )   * zmsk00y(ji,jj) 
    497557                  ELSE               !--- ice velocity using EVP implicit formulation (cf Madec doc & Bouillon 2009) 
    498                      v_ice(ji,jj) = ( (           rswitch   * ( zmV_t(ji,jj) * v_ice(ji,jj)                                       & ! previous velocity 
    499                         &                                     + zRHS + zTauO * v_ice(ji,jj) )                                      & ! F + tau_ia + Coriolis + spg + tau_io(only ocean part) 
    500                         &                                     / MAX( zepsi, zmV_t(ji,jj) + zTauO - zTauB )                         & ! m/dt + tau_io(only ice part) + landfast 
    501                         &                + ( 1._wp - rswitch ) * v_ice(ji,jj) * MAX( 0._wp, 1._wp - zdtevp * rn_lfrelax )          & ! static friction => slow decrease to v=0 
    502                         &              ) * zmsk01y(ji,jj) + v_oce(ji,jj) * 0.01_wp * ( 1._wp - zmsk01y(ji,jj) )                    & ! v_ice = v_oce/100 if mass < zmmin & conc < zamin 
    503                         &            )   * zmsk00y(ji,jj) 
     558                     v_ice(ji,jj) = ( (          rswitch   * ( zmV_t(ji,jj) * v_ice(ji,jj)                                       & ! previous velocity 
     559                        &                                    + zRHS + zTauO * v_ice(ji,jj)                                       & ! F + tau_ia + Coriolis + spg + tau_io(only ocean part) 
     560                        &                                    ) / MAX( zepsi, zmV_t(ji,jj) + zTauO - zTauB )                      & ! m/dt + tau_io(only ice part) + landfast 
     561                        &            + ( 1._wp - rswitch ) *   v_ice(ji,jj) * MAX( 0._wp, 1._wp - zdtevp * rn_lf_relax )         & ! static friction => slow decrease to v=0 
     562                        &             ) * zmsk01y(ji,jj) + v_oce(ji,jj) * 0.01_wp * ( 1._wp - zmsk01y(ji,jj) )                   & ! v_ice = v_oce/100 if mass < zmmin & conc < zamin 
     563                        &            )  * zmsk00y(ji,jj) 
    504564                  ENDIF 
    505565!extra code for test case boundary conditions 
    506566                  IF (mjg(jj)<25 .or. mjg(jj)>975 .or. mig(ji)<25 .or. mig(ji)>975) THEN 
    507                      v_ice(ji,jj) = invw*(ztauy_ai(ji,jj) + zCorV(ji,jj) + zspgV(ji,jj) + ztauy_oi(ji,jj)) 
     567                     v_ice(ji,jj) = zinvw*(ztauy_ai(ji,jj) + zCorV(ji,jj) + zspgV(ji,jj) + ztauy_oi(ji,jj)) 
    508568                  END IF 
    509569               END DO 
     
    544604                  ! 
    545605                  IF( ln_aEVP ) THEN !--- ice velocity using aEVP (Kimmritz et al 2016 & 2017) 
    546                      u_ice(ji,jj) = ( (          rswitch * ( zmU_t(ji,jj) * ( zbeta(ji,jj) * u_ice(ji,jj) + u_ice_b(ji,jj) )       & ! previous velocity 
    547                         &                                  + zRHS + zTauO * u_ice(ji,jj) )                                         & ! F + tau_ia + Coriolis + spg + tau_io(only ocean part) 
    548                         &                                  / MAX( zepsi, zmU_t(ji,jj) * ( zbeta(ji,jj) + 1._wp ) + zTauO - zTauB ) & ! m/dt + tau_io(only ice part) + landfast 
    549                         &               + ( 1._wp - rswitch ) * u_ice(ji,jj) * MAX( 0._wp, 1._wp - zdtevp * rn_lfrelax )           & ! static friction => slow decrease to v=0 
    550                         &             ) * zmsk01x(ji,jj) + u_oce(ji,jj) * 0.01_wp * ( 1._wp - zmsk01x(ji,jj) )                     & ! v_ice = v_oce/100 if mass < zmmin & conc < zamin  
     606                     zbetau = MAX( zbeta(ji,jj), zbeta(ji+1,jj) ) 
     607                     u_ice(ji,jj) = ( (          rswitch   * ( zmU_t(ji,jj) * ( zbetau * u_ice(ji,jj) + u_ice_b(ji,jj) )         & ! previous velocity 
     608                        &                                    + zRHS + zTauO * u_ice(ji,jj)                                       & ! F + tau_ia + Coriolis + spg + tau_io(only ocean part) 
     609                        &                                    ) / MAX( zepsi, zmU_t(ji,jj) * ( zbetau + 1._wp ) + zTauO - zTauB ) & ! m/dt + tau_io(only ice part) + landfast 
     610                        &            + ( 1._wp - rswitch ) * (  u_ice_b(ji,jj)                                                   & 
     611                        &                                     + u_ice  (ji,jj) * MAX( 0._wp, zbetau - zdtevp * rn_lf_relax )     & ! static friction => slow decrease to v=0 
     612                        &                                    ) / ( zbetau + 1._wp )                                              & 
     613                        &             ) * zmsk01x(ji,jj) + u_oce(ji,jj) * 0.01_wp * ( 1._wp - zmsk01x(ji,jj) )                   & ! v_ice = v_oce/100 if mass < zmmin & conc < zamin  
    551614                        &           )   * zmsk00x(ji,jj) 
    552615                  ELSE               !--- ice velocity using EVP implicit formulation (cf Madec doc & Bouillon 2009) 
    553                      u_ice(ji,jj) = ( (           rswitch   * ( zmU_t(ji,jj) * u_ice(ji,jj)                                       & ! previous velocity 
    554                         &                                     + zRHS + zTauO * u_ice(ji,jj) )                                      & ! F + tau_ia + Coriolis + spg + tau_io(only ocean part) 
    555                         &                                     / MAX( zepsi, zmU_t(ji,jj) + zTauO - zTauB )                         & ! m/dt + tau_io(only ice part) + landfast 
    556                         &                + ( 1._wp - rswitch ) * u_ice(ji,jj) * MAX( 0._wp, 1._wp - zdtevp * rn_lfrelax )          & ! static friction => slow decrease to v=0 
    557                         &              ) * zmsk01x(ji,jj) + u_oce(ji,jj) * 0.01_wp * ( 1._wp - zmsk01x(ji,jj) )                    & ! v_ice = v_oce/100 if mass < zmmin & conc < zamin  
    558                         &            )   * zmsk00x(ji,jj) 
     616                     u_ice(ji,jj) = ( (          rswitch   * ( zmU_t(ji,jj) * u_ice(ji,jj)                                       & ! previous velocity 
     617                        &                                    + zRHS + zTauO * u_ice(ji,jj)                                       & ! F + tau_ia + Coriolis + spg + tau_io(only ocean part) 
     618                        &                                    ) / MAX( zepsi, zmU_t(ji,jj) + zTauO - zTauB )                      & ! m/dt + tau_io(only ice part) + landfast 
     619                        &            + ( 1._wp - rswitch ) *   u_ice(ji,jj) * MAX( 0._wp, 1._wp - zdtevp * rn_lf_relax )         & ! static friction => slow decrease to v=0 
     620                        &             ) * zmsk01x(ji,jj) + u_oce(ji,jj) * 0.01_wp * ( 1._wp - zmsk01x(ji,jj) )                   & ! v_ice = v_oce/100 if mass < zmmin & conc < zamin  
     621                        &           )   * zmsk00x(ji,jj) 
    559622                  ENDIF 
    560623!extra code for test case boundary conditions 
    561624                  IF (mjg(jj)<25 .or. mjg(jj)>975 .or. mig(ji)<25 .or. mig(ji)>975) THEN 
    562                      u_ice(ji,jj) = invw*(ztaux_ai(ji,jj) + zCorU(ji,jj) + zspgU(ji,jj) + ztaux_oi(ji,jj)) 
     625                     u_ice(ji,jj) = zinvw*(ztaux_ai(ji,jj) + zCorU(ji,jj) + zspgU(ji,jj) + ztaux_oi(ji,jj)) 
    563626                  END IF 
    564627               END DO 
     
    601664                  ! 
    602665                  IF( ln_aEVP ) THEN !--- ice velocity using aEVP (Kimmritz et al 2016 & 2017) 
    603                      u_ice(ji,jj) = ( (          rswitch * ( zmU_t(ji,jj) * ( zbeta(ji,jj) * u_ice(ji,jj) + u_ice_b(ji,jj) )       & ! previous velocity 
    604                         &                                  + zRHS + zTauO * u_ice(ji,jj) )                                         & ! F + tau_ia + Coriolis + spg + tau_io(only ocean part) 
    605                         &                                  / MAX( zepsi, zmU_t(ji,jj) * ( zbeta(ji,jj) + 1._wp ) + zTauO - zTauB ) & ! m/dt + tau_io(only ice part) + landfast 
    606                         &               + ( 1._wp - rswitch ) * u_ice(ji,jj) * MAX( 0._wp, 1._wp - zdtevp * rn_lfrelax )           & ! static friction => slow decrease to v=0 
    607                         &             ) * zmsk01x(ji,jj) + u_oce(ji,jj) * 0.01_wp * ( 1._wp - zmsk01x(ji,jj) )                     & ! v_ice = v_oce/100 if mass < zmmin & conc < zamin  
     666                     zbetau = MAX( zbeta(ji,jj), zbeta(ji+1,jj) ) 
     667                     u_ice(ji,jj) = ( (          rswitch   * ( zmU_t(ji,jj) * ( zbetau * u_ice(ji,jj) + u_ice_b(ji,jj) )         & ! previous velocity 
     668                        &                                    + zRHS + zTauO * u_ice(ji,jj)                                       & ! F + tau_ia + Coriolis + spg + tau_io(only ocean part) 
     669                        &                                    ) / MAX( zepsi, zmU_t(ji,jj) * ( zbetau + 1._wp ) + zTauO - zTauB ) & ! m/dt + tau_io(only ice part) + landfast 
     670                        &            + ( 1._wp - rswitch ) * (  u_ice_b(ji,jj)                                                   & 
     671                        &                                     + u_ice  (ji,jj) * MAX( 0._wp, zbetau - zdtevp * rn_lf_relax )     & ! static friction => slow decrease to v=0 
     672                        &                                    ) / ( zbetau + 1._wp )                                              & 
     673                        &             ) * zmsk01x(ji,jj) + u_oce(ji,jj) * 0.01_wp * ( 1._wp - zmsk01x(ji,jj) )                   & ! v_ice = v_oce/100 if mass < zmmin & conc < zamin  
    608674                        &           )   * zmsk00x(ji,jj) 
    609675                  ELSE               !--- ice velocity using EVP implicit formulation (cf Madec doc & Bouillon 2009) 
    610                      u_ice(ji,jj) = ( (           rswitch   * ( zmU_t(ji,jj) * u_ice(ji,jj)                                       & ! previous velocity 
    611                         &                                     + zRHS + zTauO * u_ice(ji,jj) )                                      & ! F + tau_ia + Coriolis + spg + tau_io(only ocean part) 
    612                         &                                     / MAX( zepsi, zmU_t(ji,jj) + zTauO - zTauB )                         & ! m/dt + tau_io(only ice part) + landfast 
    613                         &                + ( 1._wp - rswitch ) * u_ice(ji,jj) * MAX( 0._wp, 1._wp - zdtevp * rn_lfrelax )          & ! static friction => slow decrease to v=0 
    614                         &              ) * zmsk01x(ji,jj) + u_oce(ji,jj) * 0.01_wp * ( 1._wp - zmsk01x(ji,jj) )                    & ! v_ice = v_oce/100 if mass < zmmin & conc < zamin 
    615                         &            )   * zmsk00x(ji,jj) 
     676                     u_ice(ji,jj) = ( (          rswitch   * ( zmU_t(ji,jj) * u_ice(ji,jj)                                       & ! previous velocity 
     677                        &                                    + zRHS + zTauO * u_ice(ji,jj)                                       & ! F + tau_ia + Coriolis + spg + tau_io(only ocean part) 
     678                        &                                    ) / MAX( zepsi, zmU_t(ji,jj) + zTauO - zTauB )                      & ! m/dt + tau_io(only ice part) + landfast 
     679                        &            + ( 1._wp - rswitch ) *   u_ice(ji,jj) * MAX( 0._wp, 1._wp - zdtevp * rn_lf_relax )         & ! static friction => slow decrease to v=0 
     680                        &             ) * zmsk01x(ji,jj) + u_oce(ji,jj) * 0.01_wp * ( 1._wp - zmsk01x(ji,jj) )                   & ! v_ice = v_oce/100 if mass < zmmin & conc < zamin 
     681                        &           )   * zmsk00x(ji,jj) 
    616682                  ENDIF 
    617683!extra code for test case boundary conditions 
    618684                  IF (mjg(jj)<25 .or. mjg(jj)>975 .or. mig(ji)<25 .or. mig(ji)>975) THEN 
    619                      u_ice(ji,jj) = invw*(ztaux_ai(ji,jj) + zCorU(ji,jj) + zspgU(ji,jj) + ztaux_oi(ji,jj)) 
     685                     u_ice(ji,jj) = zinvw*(ztaux_ai(ji,jj) + zCorU(ji,jj) + zspgU(ji,jj) + ztaux_oi(ji,jj)) 
    620686                  END IF 
    621687               END DO 
     
    656722                  ! 
    657723                  IF( ln_aEVP ) THEN !--- ice velocity using aEVP (Kimmritz et al 2016 & 2017) 
    658                      v_ice(ji,jj) = ( (          rswitch * ( zmV_t(ji,jj) * ( zbeta(ji,jj) * v_ice(ji,jj) + v_ice_b(ji,jj) )       & ! previous velocity 
    659                         &                                  + zRHS + zTauO * v_ice(ji,jj) )                                         & ! F + tau_ia + Coriolis + spg + tau_io(only ocean part) 
    660                         &                                  / MAX( zepsi, zmV_t(ji,jj) * ( zbeta(ji,jj) + 1._wp ) + zTauO - zTauB ) & ! m/dt + tau_io(only ice part) + landfast 
    661                         &               + ( 1._wp - rswitch ) * v_ice(ji,jj) * MAX( 0._wp, 1._wp - zdtevp * rn_lfrelax )           & ! static friction => slow decrease to v=0 
    662                         &             ) * zmsk01y(ji,jj) + v_oce(ji,jj) * 0.01_wp * ( 1._wp - zmsk01y(ji,jj) )                     & ! v_ice = v_oce/100 if mass < zmmin & conc < zamin 
     724                     zbetav = MAX( zbeta(ji,jj), zbeta(ji,jj+1) ) 
     725                     v_ice(ji,jj) = ( (          rswitch   * ( zmV_t(ji,jj) * ( zbetav * v_ice(ji,jj) + v_ice_b(ji,jj) )         & ! previous velocity 
     726                        &                                    + zRHS + zTauO * v_ice(ji,jj)                                       & ! F + tau_ia + Coriolis + spg + tau_io(only ocean part) 
     727                        &                                    ) / MAX( zepsi, zmV_t(ji,jj) * ( zbetav + 1._wp ) + zTauO - zTauB ) & ! m/dt + tau_io(only ice part) + landfast 
     728                        &            + ( 1._wp - rswitch ) * (  v_ice_b(ji,jj)                                                   & 
     729                        &                                     + v_ice  (ji,jj) * MAX( 0._wp, zbetav - zdtevp * rn_lf_relax )     & ! static friction => slow decrease to v=0 
     730                        &                                    ) / ( zbetav + 1._wp )                                              &  
     731                        &             ) * zmsk01y(ji,jj) + v_oce(ji,jj) * 0.01_wp * ( 1._wp - zmsk01y(ji,jj) )                   & ! v_ice = v_oce/100 if mass < zmmin & conc < zamin 
    663732                        &           )   * zmsk00y(ji,jj) 
    664733                  ELSE               !--- ice velocity using EVP implicit formulation (cf Madec doc & Bouillon 2009) 
    665                      v_ice(ji,jj) = ( (           rswitch   * ( zmV_t(ji,jj) * v_ice(ji,jj)                                       & ! previous velocity 
    666                         &                                     + zRHS + zTauO * v_ice(ji,jj) )                                      & ! F + tau_ia + Coriolis + spg + tau_io(only ocean part) 
    667                         &                                     / MAX( zepsi, zmV_t(ji,jj) + zTauO - zTauB )                         & ! m/dt + tau_io(only ice part) + landfast 
    668                         &                + ( 1._wp - rswitch ) * v_ice(ji,jj) * MAX( 0._wp, 1._wp - zdtevp * rn_lfrelax )          & ! static friction => slow decrease to v=0 
    669                         &              ) * zmsk01y(ji,jj) + v_oce(ji,jj) * 0.01_wp * ( 1._wp - zmsk01y(ji,jj) )                    & ! v_ice = v_oce/100 if mass < zmmin & conc < zamin 
    670                         &            )   * zmsk00y(ji,jj) 
     734                     v_ice(ji,jj) = ( (          rswitch   * ( zmV_t(ji,jj) * v_ice(ji,jj)                                       & ! previous velocity 
     735                        &                                    + zRHS + zTauO * v_ice(ji,jj)                                       & ! F + tau_ia + Coriolis + spg + tau_io(only ocean part) 
     736                        &                                    ) / MAX( zepsi, zmV_t(ji,jj) + zTauO - zTauB )                      & ! m/dt + tau_io(only ice part) + landfast 
     737                        &            + ( 1._wp - rswitch ) *   v_ice(ji,jj) * MAX( 0._wp, 1._wp - zdtevp * rn_lf_relax )         & ! static friction => slow decrease to v=0 
     738                        &             ) * zmsk01y(ji,jj) + v_oce(ji,jj) * 0.01_wp * ( 1._wp - zmsk01y(ji,jj) )                   & ! v_ice = v_oce/100 if mass < zmmin & conc < zamin 
     739                        &           )   * zmsk00y(ji,jj) 
    671740                  ENDIF 
    672741!extra code for test case boundary conditions 
    673742                  IF (mjg(jj)<25 .or. mjg(jj)>975 .or. mig(ji)<25 .or. mig(ji)>975) THEN 
    674                      v_ice(ji,jj) = invw*(ztauy_ai(ji,jj) + zCorV(ji,jj) + zspgV(ji,jj) + ztauy_oi(ji,jj)) 
     743                     v_ice(ji,jj) = zinvw*(ztauy_ai(ji,jj) + zCorV(ji,jj) + zspgV(ji,jj) + ztauy_oi(ji,jj)) 
    675744                  END IF 
    676745               END DO 
     
    686755         ENDIF 
    687756 
    688 !!$         IF(ln_ctl) THEN   ! Convergence test 
    689 !!$            DO jj = 2 , jpjm1 
    690 !!$               zresr(:,jj) = MAX( ABS( u_ice(:,jj) - zu_ice(:,jj) ), ABS( v_ice(:,jj) - zv_ice(:,jj) ) ) 
    691 !!$            END DO 
    692 !!$            zresm = MAXVAL( zresr( 1:jpi, 2:jpjm1 ) ) 
    693 !!$            CALL mpp_max( 'icedyn_rhg_evp', zresm )   ! max over the global domain 
    694 !!$         ENDIF 
     757         ! convergence test 
     758         IF( nn_rhg_chkcvg == 2 )   CALL rhg_cvg( kt, jter, nn_nevp, u_ice, v_ice, zu_ice, zv_ice ) 
    695759         ! 
    696760         !                                                ! ==================== ! 
    697761      END DO                                              !  end loop over jter  ! 
    698762      !                                                   ! ==================== ! 
     763      IF( ln_aEVP )   CALL iom_put( 'beta_evp' , zbeta ) 
    699764      ! 
    700765      !------------------------------------------------------------------------------! 
     
    721786            zdt2 = zdt * zdt 
    722787             
     788            zten_i(ji,jj) = zdt 
     789 
    723790            ! shear**2 at T points (doc eq. A16) 
    724791            zds2 = ( zds(ji,jj  ) * zds(ji,jj  ) * e1e2f(ji,jj  ) + zds(ji-1,jj  ) * zds(ji-1,jj  ) * e1e2f(ji-1,jj  )  & 
     
    735802             
    736803            ! delta at T points 
    737             zdelta         = SQRT( pdivu_i(ji,jj) * pdivu_i(ji,jj) + ( zdt2 + zds2 ) * z1_ecc2 )   
    738             rswitch        = 1._wp - MAX( 0._wp, SIGN( 1._wp, -zdelta ) ) ! 0 if delta=0 
    739             pdelta_i(ji,jj) = zdelta + rn_creepl * rswitch 
     804            zfac            = SQRT( pdivu_i(ji,jj) * pdivu_i(ji,jj) + ( zdt2 + zds2 ) * z1_ecc2 ) ! delta   
     805            rswitch         = 1._wp - MAX( 0._wp, SIGN( 1._wp, -zfac ) ) ! 0 if delta=0 
     806            pdelta_i(ji,jj) = zfac + rn_creepl * rswitch ! delta+creepl 
    740807 
    741808         END DO 
    742809      END DO 
    743       CALL lbc_lnk_multi( 'icedyn_rhg_evp', pshear_i, 'T', 1., pdivu_i, 'T', 1., pdelta_i, 'T', 1. ) 
     810      CALL lbc_lnk_multi( 'icedyn_rhg_evp', pshear_i, 'T', 1., pdivu_i, 'T', 1., pdelta_i, 'T', 1., zten_i, 'T', 1., & 
     811         &                                  zs1     , 'T', 1., zs2    , 'T', 1., zs12    , 'F', 1. ) 
    744812       
    745813      ! --- Store the stress tensor for the next time step --- ! 
    746       CALL lbc_lnk_multi( 'icedyn_rhg_evp', zs1, 'T', 1., zs2, 'T', 1., zs12, 'F', 1. ) 
    747814      pstress1_i (:,:) = zs1 (:,:) 
    748815      pstress2_i (:,:) = zs2 (:,:) 
     
    753820      ! 5) diagnostics 
    754821      !------------------------------------------------------------------------------! 
    755       DO jj = 1, jpj 
    756          DO ji = 1, jpi 
    757             zmsk00(ji,jj) = MAX( 0._wp , SIGN( 1._wp , at_i(ji,jj) - epsi06 ) ) ! 1 if ice, 0 if no ice 
    758          END DO 
    759       END DO 
    760  
    761822      ! --- ice-ocean, ice-atm. & ice-oceanbottom(landfast) stresses --- ! 
    762823      IF(  iom_use('utau_oi') .OR. iom_use('vtau_oi') .OR. iom_use('utau_ai') .OR. iom_use('vtau_ai') .OR. & 
     
    777838      IF( iom_use('icediv') )   CALL iom_put( 'icediv' , pdivu_i  * zmsk00 )   ! divergence 
    778839      IF( iom_use('iceshe') )   CALL iom_put( 'iceshe' , pshear_i * zmsk00 )   ! shear 
     840      IF( iom_use('icedlt') )   CALL iom_put( 'icedlt' , pdelta_i * zmsk00 )   ! delta 
    779841      IF( iom_use('icestr') )   CALL iom_put( 'icestr' , strength * zmsk00 )   ! strength 
    780842 
    781       ! --- stress tensor --- ! 
    782       IF( iom_use('isig1') .OR. iom_use('isig2') .OR. iom_use('isig3') .OR. iom_use('normstr') .OR. iom_use('sheastr') ) THEN 
    783          ! 
    784          ALLOCATE( zsig1(jpi,jpj) , zsig2(jpi,jpj) , zsig3(jpi,jpj) ) 
     843      ! --- Stress tensor invariants (SIMIP diags) --- ! 
     844      IF( iom_use('normstr') .OR. iom_use('sheastr') ) THEN 
     845         ! 
     846         ALLOCATE( zsig_I(jpi,jpj) , zsig_II(jpi,jpj) ) 
    785847         !          
    786          DO jj = 2, jpjm1 
    787             DO ji = 2, jpim1 
    788                zdum1 = ( zmsk00(ji-1,jj) * pstress12_i(ji-1,jj) + zmsk00(ji  ,jj-1) * pstress12_i(ji  ,jj-1) +  &  ! stress12_i at T-point 
    789                   &      zmsk00(ji  ,jj) * pstress12_i(ji  ,jj) + zmsk00(ji-1,jj-1) * pstress12_i(ji-1,jj-1) )  & 
    790                   &    / MAX( 1._wp, zmsk00(ji-1,jj) + zmsk00(ji,jj-1) + zmsk00(ji,jj) + zmsk00(ji-1,jj-1) ) 
    791  
    792                zshear = SQRT( pstress2_i(ji,jj) * pstress2_i(ji,jj) + 4._wp * zdum1 * zdum1 ) ! shear stress   
    793  
    794                zdum2 = zmsk00(ji,jj) / MAX( 1._wp, strength(ji,jj) ) 
    795  
    796 !!               zsig1(ji,jj) = 0.5_wp * zdum2 * ( pstress1_i(ji,jj) + zshear ) ! principal stress (y-direction, see Hunke & Dukowicz 2002) 
    797 !!               zsig2(ji,jj) = 0.5_wp * zdum2 * ( pstress1_i(ji,jj) - zshear ) ! principal stress (x-direction, see Hunke & Dukowicz 2002) 
    798 !!               zsig3(ji,jj) = zdum2**2 * ( ( pstress1_i(ji,jj) + strength(ji,jj) )**2 + ( rn_ecc * zshear )**2 ) ! quadratic relation linking compressive stress to shear stress 
    799 !!                                                                                                               ! (scheme converges if this value is ~1, see Bouillon et al 2009 (eq. 11)) 
    800                zsig1(ji,jj) = 0.5_wp * zdum2 * ( pstress1_i(ji,jj) )          ! compressive stress, see Bouillon et al. 2015 
    801                zsig2(ji,jj) = 0.5_wp * zdum2 * ( zshear )                     ! shear stress 
    802                zsig3(ji,jj) = zdum2**2 * ( ( pstress1_i(ji,jj) + strength(ji,jj) )**2 + ( rn_ecc * zshear )**2 ) 
    803             END DO 
    804          END DO 
    805          CALL lbc_lnk_multi( 'icedyn_rhg_evp', zsig1, 'T', 1., zsig2, 'T', 1., zsig3, 'T', 1. ) 
    806          ! 
    807          CALL iom_put( 'isig1' , zsig1 ) 
    808          CALL iom_put( 'isig2' , zsig2 ) 
    809          CALL iom_put( 'isig3' , zsig3 ) 
    810          ! 
    811          ! Stress tensor invariants (normal and shear stress N/m) 
    812          IF( iom_use('normstr') )   CALL iom_put( 'normstr' ,       ( zs1(:,:) + zs2(:,:) )                       * zmsk00(:,:) ) ! Normal stress 
    813          IF( iom_use('sheastr') )   CALL iom_put( 'sheastr' , SQRT( ( zs1(:,:) - zs2(:,:) )**2 + 4*zs12(:,:)**2 ) * zmsk00(:,:) ) ! Shear stress 
    814  
    815          DEALLOCATE( zsig1 , zsig2 , zsig3 ) 
     848         DO jj = 1, jpj 
     849            DO ji = 1, jpi 
     850             
     851               ! Ice stresses 
     852               ! sigma1, sigma2, sigma12 are some useful recombination of the stresses (Hunke and Dukowicz MWR 2002, Bouillon et al., OM2013) 
     853               ! These are NOT stress tensor components, neither stress invariants, neither stress principal components 
     854               ! I know, this can be confusing... 
     855               zfac             =   strength(ji,jj) / ( pdelta_i(ji,jj) + rn_creepl )  
     856               zsig1            =   zfac * ( pdivu_i(ji,jj) - pdelta_i(ji,jj) ) 
     857               zsig2            =   zfac * z1_ecc2 * zten_i(ji,jj) 
     858               zsig12           =   zfac * z1_ecc2 * pshear_i(ji,jj) 
     859                
     860               ! Stress invariants (sigma_I, sigma_II, Coon 1974, Feltham 2008) 
     861               zsig_I (ji,jj)   =   zsig1 * 0.5_wp                                           ! 1st stress invariant, aka average normal stress, aka negative pressure 
     862               zsig_II(ji,jj)   =   SQRT ( MAX( 0._wp, zsig2 * zsig2 * 0.25_wp + zsig12 ) )  ! 2nd  ''       '', aka maximum shear stress 
     863                
     864            END DO 
     865         END DO          
     866         ! 
     867         ! Stress tensor invariants (normal and shear stress N/m) - SIMIP diags - definitions following Coon (1974) and Feltham (2008) 
     868         IF( iom_use('normstr') )   CALL iom_put( 'normstr', zsig_I (:,:) * zmsk00(:,:) ) ! Normal stress 
     869         IF( iom_use('sheastr') )   CALL iom_put( 'sheastr', zsig_II(:,:) * zmsk00(:,:) ) ! Maximum shear stress 
     870          
     871         DEALLOCATE ( zsig_I, zsig_II ) 
     872          
    816873      ENDIF 
     874 
     875      ! --- Normalized stress tensor principal components --- ! 
     876      ! This are used to plot the normalized yield curve, see Lemieux & Dupont, 2020 
     877      ! Recommendation 1 : we use ice strength, not replacement pressure 
     878      ! Recommendation 2 : need to use deformations at PREVIOUS iterate for viscosities 
     879      IF( iom_use('sig1_pnorm') .OR. iom_use('sig2_pnorm') ) THEN 
     880         ! 
     881         ALLOCATE( zsig1_p(jpi,jpj) , zsig2_p(jpi,jpj) , zsig_I(jpi,jpj) , zsig_II(jpi,jpj) )          
     882         !          
     883         DO jj = 1, jpj 
     884            DO ji = 1, jpi 
     885             
     886               ! Ice stresses computed with **viscosities** (delta, p/delta) at **previous** iterates  
     887               !                        and **deformations** at current iterates 
     888               !                        following Lemieux & Dupont (2020) 
     889               zfac             =   zp_delt(ji,jj) 
     890               zsig1            =   zfac * ( pdivu_i(ji,jj) - ( zdelta(ji,jj) + rn_creepl ) ) 
     891               zsig2            =   zfac * z1_ecc2 * zten_i(ji,jj) 
     892               zsig12           =   zfac * z1_ecc2 * pshear_i(ji,jj) 
     893                
     894               ! Stress invariants (sigma_I, sigma_II, Coon 1974, Feltham 2008), T-point 
     895               zsig_I(ji,jj)    =   zsig1 * 0.5_wp                                           ! 1st stress invariant, aka average normal stress, aka negative pressure 
     896               zsig_II(ji,jj)   =   SQRT ( MAX( 0._wp, zsig2 * zsig2 * 0.25_wp + zsig12 ) )  ! 2nd  ''       '', aka maximum shear stress 
    817897       
     898               ! Normalized  principal stresses (used to display the ellipse) 
     899               z1_strength      =   1._wp / MAX( 1._wp, strength(ji,jj) ) 
     900               zsig1_p(ji,jj)   =   ( zsig_I(ji,jj) + zsig_II(ji,jj) ) * z1_strength 
     901               zsig2_p(ji,jj)   =   ( zsig_I(ji,jj) - zsig_II(ji,jj) ) * z1_strength 
     902            END DO 
     903         END DO                
     904         ! 
     905         CALL iom_put( 'sig1_pnorm' , zsig1_p )  
     906         CALL iom_put( 'sig2_pnorm' , zsig2_p )  
     907       
     908         DEALLOCATE( zsig1_p , zsig2_p , zsig_I, zsig_II ) 
     909          
     910      ENDIF 
     911 
    818912      ! --- SIMIP --- ! 
    819913      IF(  iom_use('dssh_dx') .OR. iom_use('dssh_dy') .OR. & 
     
    871965      ENDIF 
    872966      ! 
     967      ! --- convergence tests --- ! 
     968      IF( nn_rhg_chkcvg == 1 .OR. nn_rhg_chkcvg == 2 ) THEN 
     969         IF( iom_use('uice_cvg') ) THEN 
     970            IF( ln_aEVP ) THEN   ! output: beta * ( u(t=nn_nevp) - u(t=nn_nevp-1) ) 
     971               CALL iom_put( 'uice_cvg', MAX( ABS( u_ice(:,:) - zu_ice(:,:) ) * zbeta(:,:) * umask(:,:,1) , & 
     972                  &                           ABS( v_ice(:,:) - zv_ice(:,:) ) * zbeta(:,:) * vmask(:,:,1) ) * zmsk15(:,:) ) 
     973            ELSE                 ! output: nn_nevp * ( u(t=nn_nevp) - u(t=nn_nevp-1) ) 
     974               CALL iom_put( 'uice_cvg', REAL( nn_nevp ) * MAX( ABS( u_ice(:,:) - zu_ice(:,:) ) * umask(:,:,1) , & 
     975                  &                                             ABS( v_ice(:,:) - zv_ice(:,:) ) * vmask(:,:,1) ) * zmsk15(:,:) ) 
     976            ENDIF 
     977         ENDIF 
     978      ENDIF       
     979      ! 
     980      DEALLOCATE( zmsk00, zmsk15 ) 
     981      ! 
    873982   END SUBROUTINE ice_dyn_rhg_evp 
     983 
     984 
     985   SUBROUTINE rhg_cvg( kt, kiter, kitermax, pu, pv, pub, pvb ) 
     986      !!---------------------------------------------------------------------- 
     987      !!                    ***  ROUTINE rhg_cvg  *** 
     988      !!                      
     989      !! ** Purpose :   check convergence of oce rheology 
     990      !! 
     991      !! ** Method  :   create a file ice_cvg.nc containing the convergence of ice velocity 
     992      !!                during the sub timestepping of rheology so as: 
     993      !!                  uice_cvg = MAX( u(t+1) - u(t) , v(t+1) - v(t) ) 
     994      !!                This routine is called every sub-iteration, so it is cpu expensive 
     995      !! 
     996      !! ** Note    :   for the first sub-iteration, uice_cvg is set to 0 (too large otherwise)    
     997      !!---------------------------------------------------------------------- 
     998      INTEGER ,                 INTENT(in) ::   kt, kiter, kitermax       ! ocean time-step index 
     999      REAL(wp), DIMENSION(:,:), INTENT(in) ::   pu, pv, pub, pvb          ! now and before velocities 
     1000      !! 
     1001      INTEGER           ::   it, idtime, istatus 
     1002      INTEGER           ::   ji, jj          ! dummy loop indices 
     1003      REAL(wp)          ::   zresm           ! local real  
     1004      CHARACTER(len=20) ::   clname 
     1005      REAL(wp), DIMENSION(jpi,jpj) ::   zres           ! check convergence 
     1006      !!---------------------------------------------------------------------- 
     1007 
     1008      ! create file 
     1009      IF( kt == nit000 .AND. kiter == 1 ) THEN 
     1010         ! 
     1011         IF( lwp ) THEN 
     1012            WRITE(numout,*) 
     1013            WRITE(numout,*) 'rhg_cvg : ice rheology convergence control' 
     1014            WRITE(numout,*) '~~~~~~~' 
     1015         ENDIF 
     1016         ! 
     1017         IF( lwm ) THEN 
     1018            clname = 'ice_cvg.nc' 
     1019            IF( .NOT. Agrif_Root() )   clname = TRIM(Agrif_CFixed())//"_"//TRIM(clname) 
     1020            istatus = NF90_CREATE( TRIM(clname), NF90_CLOBBER, ncvgid ) 
     1021            istatus = NF90_DEF_DIM( ncvgid, 'time'  , NF90_UNLIMITED, idtime ) 
     1022            istatus = NF90_DEF_VAR( ncvgid, 'uice_cvg', NF90_DOUBLE   , (/ idtime /), nvarid ) 
     1023            istatus = NF90_ENDDEF(ncvgid) 
     1024         ENDIF 
     1025         ! 
     1026      ENDIF 
     1027 
     1028      ! time 
     1029      it = ( kt - 1 ) * kitermax + kiter 
     1030       
     1031      ! convergence 
     1032      IF( kiter == 1 ) THEN ! remove the first iteration for calculations of convergence (always very large) 
     1033         zresm = 0._wp 
     1034      ELSE 
     1035         DO jj = 1, jpj 
     1036            DO ji = 1, jpi 
     1037               zres(ji,jj) = MAX( ABS( pu(ji,jj) - pub(ji,jj) ) * umask(ji,jj,1), & 
     1038                  &               ABS( pv(ji,jj) - pvb(ji,jj) ) * vmask(ji,jj,1) ) * zmsk15(ji,jj) 
     1039            END DO 
     1040         END DO 
     1041 
     1042         ! cut of the boundary of the box (forced velocities) 
     1043         IF (mjg(jj)<=30 .or. mjg(jj)>970 .or. mig(ji)<=30 .or. mig(ji)>970) THEN 
     1044            zres(ji,jj) = 0._wp 
     1045         END IF 
     1046 
     1047         zresm = MAXVAL( zres ) 
     1048         CALL mpp_max( 'icedyn_rhg_evp', zresm )   ! max over the global domain 
     1049      ENDIF 
     1050 
     1051      IF( lwm ) THEN 
     1052         ! write variables 
     1053         istatus = NF90_PUT_VAR( ncvgid, nvarid, (/zresm/), (/it/), (/1/) ) 
     1054         ! close file 
     1055         IF( kt == nitend - nn_fsbc + 1 )   istatus = NF90_CLOSE(ncvgid) 
     1056      ENDIF 
     1057       
     1058   END SUBROUTINE rhg_cvg 
    8741059 
    8751060 
     
    9291114   END SUBROUTINE rhg_evp_rst 
    9301115 
     1116    
    9311117#else 
    9321118   !!---------------------------------------------------------------------- 
  • NEMO/branches/2019/dev_r11842_SI3-10_EAP/tests/ICE_RHEO/MY_SRC/usrdef_sbc.F90

    r12263 r13746  
    208208 
    209209      ! --- shortwave radiation transmitted below the surface (W/m2, see Grenfell Maykut 77) --- ! 
    210       zfr1 = ( 0.18 * ( 1.0 - cldf_ice ) + 0.35 * cldf_ice )            ! transmission when hi>10cm 
    211       zfr2 = ( 0.82 * ( 1.0 - cldf_ice ) + 0.65 * cldf_ice )            ! zfr2 such that zfr1 + zfr2 to equal 1 
     210      zfr1 = ( 0.18 * ( 1.0 - pp_cldf ) + 0.35 * pp_cldf )            ! transmission when hi>10cm 
     211      zfr2 = ( 0.82 * ( 1.0 - pp_cldf ) + 0.65 * pp_cldf )            ! zfr2 such that zfr1 + zfr2 to equal 1 
    212212      ! 
    213213      WHERE    ( phs(:,:,:) <= 0._wp .AND. phi(:,:,:) <  0.1_wp )       ! linear decrease from hi=0 to 10cm   
Note: See TracChangeset for help on using the changeset viewer.