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.
icedyn_rhg_evp.F90 in NEMO/trunk/src/ICE – NEMO

source: NEMO/trunk/src/ICE/icedyn_rhg_evp.F90 @ 13601

Last change on this file since 13601 was 13601, checked in by clem, 4 years ago

trunk: rewrite heat budget of sea ice to make it perfectly conservative by construction. Also, activating ln_icediachk now gives an ascii file (icedrift_diagnostics.ascii) containing mass, salt and heat global conservation issues (if any). In addition, 2D drift files can be outputed (icedrift_mass…) and field_def is changed accordingly. Note that advection schemes are not yet commited since there is still a restartability issue that I do not understand.

  • Property svn:keywords set to Id
File size: 61.7 KB
Line 
1MODULE icedyn_rhg_evp
2   !!======================================================================
3   !!                     ***  MODULE  icedyn_rhg_evp  ***
4   !!   Sea-Ice dynamics : rheology Elasto-Viscous-Plastic
5   !!======================================================================
6   !! History :   -   !  2007-03  (M.A. Morales Maqueda, S. Bouillon) Original code
7   !!            3.0  !  2008-03  (M. Vancoppenolle) adaptation to new model
8   !!             -   !  2008-11  (M. Vancoppenolle, S. Bouillon, Y. Aksenov) add surface tilt in ice rheolohy
9   !!            3.3  !  2009-05  (G.Garric)    addition of the evp case
10   !!            3.4  !  2011-01  (A. Porter)   dynamical allocation
11   !!            3.5  !  2012-08  (R. Benshila) AGRIF
12   !!            3.6  !  2016-06  (C. Rousset)  Rewriting + landfast ice + mEVP (Bouillon 2013)
13   !!            3.7  !  2017     (C. Rousset)  add aEVP (Kimmritz 2016-2017)
14   !!            4.0  !  2018     (many people) SI3 [aka Sea Ice cube]
15   !!----------------------------------------------------------------------
16#if defined key_si3
17   !!----------------------------------------------------------------------
18   !!   'key_si3'                                       SI3 sea-ice model
19   !!----------------------------------------------------------------------
20   !!   ice_dyn_rhg_evp : computes ice velocities from EVP rheology
21   !!   rhg_evp_rst     : read/write EVP fields in ice restart
22   !!----------------------------------------------------------------------
23   USE phycst         ! Physical constant
24   USE dom_oce        ! Ocean domain
25   USE sbc_oce , ONLY : ln_ice_embd, nn_fsbc, ssh_m
26   USE sbc_ice , ONLY : utau_ice, vtau_ice, snwice_mass, snwice_mass_b
27   USE ice            ! sea-ice: ice variables
28   USE icevar         ! ice_var_sshdyn
29   USE icedyn_rdgrft  ! sea-ice: ice strength
30   USE bdy_oce , ONLY : ln_bdy 
31   USE bdyice 
32#if defined key_agrif
33   USE agrif_ice_interp
34#endif
35   !
36   USE in_out_manager ! I/O manager
37   USE iom            ! I/O manager library
38   USE lib_mpp        ! MPP library
39   USE lib_fortran    ! fortran utilities (glob_sum + no signed zero)
40   USE lbclnk         ! lateral boundary conditions (or mpp links)
41   USE prtctl         ! Print control
42
43   USE netcdf         ! NetCDF library for convergence test
44   IMPLICIT NONE
45   PRIVATE
46
47   PUBLIC   ice_dyn_rhg_evp   ! called by icedyn_rhg.F90
48   PUBLIC   rhg_evp_rst       ! called by icedyn_rhg.F90
49
50   !! * Substitutions
51#  include "do_loop_substitute.h90"
52#  include "domzgr_substitute.h90"
53
54   !! for convergence tests
55   INTEGER ::   ncvgid   ! netcdf file id
56   INTEGER ::   nvarid   ! netcdf variable id
57   REAL(wp), ALLOCATABLE, DIMENSION(:,:) ::   zmsk00, zmsk15
58   !!----------------------------------------------------------------------
59   !! NEMO/ICE 4.0 , NEMO Consortium (2018)
60   !! $Id$
61   !! Software governed by the CeCILL license (see ./LICENSE)
62   !!----------------------------------------------------------------------
63CONTAINS
64
65   SUBROUTINE ice_dyn_rhg_evp( kt, Kmm, pstress1_i, pstress2_i, pstress12_i, pshear_i, pdivu_i, pdelta_i )
66      !!-------------------------------------------------------------------
67      !!                 ***  SUBROUTINE ice_dyn_rhg_evp  ***
68      !!                             EVP-C-grid
69      !!
70      !! ** purpose : determines sea ice drift from wind stress, ice-ocean
71      !!  stress and sea-surface slope. Ice-ice interaction is described by
72      !!  a non-linear elasto-viscous-plastic (EVP) law including shear
73      !!  strength and a bulk rheology (Hunke and Dukowicz, 2002).   
74      !!
75      !!  The points in the C-grid look like this, dear reader
76      !!
77      !!                              (ji,jj)
78      !!                                 |
79      !!                                 |
80      !!                      (ji-1,jj)  |  (ji,jj)
81      !!                             ---------   
82      !!                            |         |
83      !!                            | (ji,jj) |------(ji,jj)
84      !!                            |         |
85      !!                             ---------   
86      !!                     (ji-1,jj-1)     (ji,jj-1)
87      !!
88      !! ** Inputs  : - wind forcing (stress), oceanic currents
89      !!                ice total volume (vt_i) per unit area
90      !!                snow total volume (vt_s) per unit area
91      !!
92      !! ** Action  : - compute u_ice, v_ice : the components of the
93      !!                sea-ice velocity vector
94      !!              - compute delta_i, shear_i, divu_i, which are inputs
95      !!                of the ice thickness distribution
96      !!
97      !! ** Steps   : 0) compute mask at F point
98      !!              1) Compute ice snow mass, ice strength
99      !!              2) Compute wind, oceanic stresses, mass terms and
100      !!                 coriolis terms of the momentum equation
101      !!              3) Solve the momentum equation (iterative procedure)
102      !!              4) Recompute delta, shear and divergence
103      !!                 (which are inputs of the ITD) & store stress
104      !!                 for the next time step
105      !!              5) Diagnostics including charge ellipse
106      !!
107      !! ** Notes   : There is the possibility to use aEVP from the nice work of Kimmritz et al. (2016 & 2017)
108      !!              by setting up ln_aEVP=T (i.e. changing alpha and beta parameters).
109      !!              This is an upgraded version of mEVP from Bouillon et al. 2013
110      !!              (i.e. more stable and better convergence)
111      !!
112      !! References : Hunke and Dukowicz, JPO97
113      !!              Bouillon et al., Ocean Modelling 2009
114      !!              Bouillon et al., Ocean Modelling 2013
115      !!              Kimmritz et al., Ocean Modelling 2016 & 2017
116      !!-------------------------------------------------------------------
117      INTEGER                 , INTENT(in   ) ::   kt                                    ! time step
118      INTEGER                 , INTENT(in   ) ::   Kmm                                   ! ocean time level index
119      REAL(wp), DIMENSION(:,:), INTENT(inout) ::   pstress1_i, pstress2_i, pstress12_i   !
120      REAL(wp), DIMENSION(:,:), INTENT(  out) ::   pshear_i  , pdivu_i   , pdelta_i      !
121      !!
122      INTEGER ::   ji, jj       ! dummy loop indices
123      INTEGER ::   jter         ! local integers
124      !
125      REAL(wp) ::   zrhoco                                              ! rho0 * rn_cio
126      REAL(wp) ::   zdtevp, z1_dtevp                                    ! time step for subcycling
127      REAL(wp) ::   ecc2, z1_ecc2                                       ! square of yield ellipse eccenticity
128      REAL(wp) ::   zalph1, z1_alph1, zalph2, z1_alph2                  ! alpha coef from Bouillon 2009 or Kimmritz 2017
129      REAl(wp) ::   zbetau, zbetav
130      REAL(wp) ::   zm1, zm2, zm3, zmassU, zmassV, zvU, zvV             ! ice/snow mass and volume
131      REAL(wp) ::   zp_delf, zds2, zdt, zdt2, zdiv, zdiv2               ! temporary scalars
132      REAL(wp) ::   zTauO, zTauB, zRHS, zvel                            ! temporary scalars
133      REAL(wp) ::   zkt                                                 ! isotropic tensile strength for landfast ice
134      REAL(wp) ::   zvCr                                                ! critical ice volume above which ice is landfast
135      !
136      REAL(wp) ::   zintb, zintn                                        ! dummy argument
137      REAL(wp) ::   zfac_x, zfac_y
138      REAL(wp) ::   zshear, zdum1, zdum2
139      !
140      REAL(wp), DIMENSION(jpi,jpj) ::   zdelta, zp_delt                 ! delta and P/delta at T points
141      REAL(wp), DIMENSION(jpi,jpj) ::   zbeta                           ! beta coef from Kimmritz 2017
142      !
143      REAL(wp), DIMENSION(jpi,jpj) ::   zdt_m                           ! (dt / ice-snow_mass) on T points
144      REAL(wp), DIMENSION(jpi,jpj) ::   zaU  , zaV                      ! ice fraction on U/V points
145      REAL(wp), DIMENSION(jpi,jpj) ::   zmU_t, zmV_t                    ! (ice-snow_mass / dt) on U/V points
146      REAL(wp), DIMENSION(jpi,jpj) ::   zmf                             ! coriolis parameter at T points
147      REAL(wp), DIMENSION(jpi,jpj) ::   v_oceU, u_oceV, v_iceU, u_iceV  ! ocean/ice u/v component on V/U points
148      !
149      REAL(wp), DIMENSION(jpi,jpj) ::   zds                             ! shear
150      REAL(wp), DIMENSION(jpi,jpj) ::   zs1, zs2, zs12                  ! stress tensor components
151      REAL(wp), DIMENSION(jpi,jpj) ::   zsshdyn                         ! array used for the calculation of ice surface slope:
152      !                                                                 !    ocean surface (ssh_m) if ice is not embedded
153      !                                                                 !    ice bottom surface if ice is embedded   
154      REAL(wp), DIMENSION(jpi,jpj) ::   zfU  , zfV                      ! internal stresses
155      REAL(wp), DIMENSION(jpi,jpj) ::   zspgU, zspgV                    ! surface pressure gradient at U/V points
156      REAL(wp), DIMENSION(jpi,jpj) ::   zCorU, zCorV                    ! Coriolis stress array
157      REAL(wp), DIMENSION(jpi,jpj) ::   ztaux_ai, ztauy_ai              ! ice-atm. stress at U-V points
158      REAL(wp), DIMENSION(jpi,jpj) ::   ztaux_oi, ztauy_oi              ! ice-ocean stress at U-V points
159      REAL(wp), DIMENSION(jpi,jpj) ::   ztaux_bi, ztauy_bi              ! ice-OceanBottom stress at U-V points (landfast)
160      REAL(wp), DIMENSION(jpi,jpj) ::   ztaux_base, ztauy_base          ! ice-bottom stress at U-V points (landfast)
161      !
162      REAL(wp), DIMENSION(jpi,jpj) ::   zmsk01x, zmsk01y                ! dummy arrays
163      REAL(wp), DIMENSION(jpi,jpj) ::   zmsk00x, zmsk00y                ! mask for ice presence
164      REAL(wp), DIMENSION(jpi,jpj) ::   zfmask                          ! mask at F points for the ice
165
166      REAL(wp), PARAMETER          ::   zepsi  = 1.0e-20_wp             ! tolerance parameter
167      REAL(wp), PARAMETER          ::   zmmin  = 1._wp                  ! ice mass (kg/m2)  below which ice velocity becomes very small
168      REAL(wp), PARAMETER          ::   zamin  = 0.001_wp               ! ice concentration below which ice velocity becomes very small
169      !! --- check convergence
170      REAL(wp), DIMENSION(jpi,jpj) ::   zu_ice, zv_ice
171      !! --- diags
172      REAL(wp) ::   zsig1, zsig2, zsig12, zfac, z1_strength
173      REAL(wp), ALLOCATABLE, DIMENSION(:,:) ::   zsig_I, zsig_II, zsig1_p, zsig2_p, zten_i         
174      !! --- SIMIP diags
175      REAL(wp), ALLOCATABLE, DIMENSION(:,:) ::   zdiag_xmtrp_ice ! X-component of ice mass transport (kg/s)
176      REAL(wp), ALLOCATABLE, DIMENSION(:,:) ::   zdiag_ymtrp_ice ! Y-component of ice mass transport (kg/s)
177      REAL(wp), ALLOCATABLE, DIMENSION(:,:) ::   zdiag_xmtrp_snw ! X-component of snow mass transport (kg/s)
178      REAL(wp), ALLOCATABLE, DIMENSION(:,:) ::   zdiag_ymtrp_snw ! Y-component of snow mass transport (kg/s)
179      REAL(wp), ALLOCATABLE, DIMENSION(:,:) ::   zdiag_xatrp     ! X-component of area transport (m2/s)
180      REAL(wp), ALLOCATABLE, DIMENSION(:,:) ::   zdiag_yatrp     ! Y-component of area transport (m2/s)     
181      !!-------------------------------------------------------------------
182
183      IF( kt == nit000 .AND. lwp )   WRITE(numout,*) '-- ice_dyn_rhg_evp: EVP sea-ice rheology'
184      !
185      ! for diagnostics and convergence tests
186      ALLOCATE( zmsk00(jpi,jpj), zmsk15(jpi,jpj) )
187      DO_2D( 1, 1, 1, 1 )
188         zmsk00(ji,jj) = MAX( 0._wp , SIGN( 1._wp , at_i(ji,jj) - epsi06  ) ) ! 1 if ice    , 0 if no ice
189         zmsk15(ji,jj) = MAX( 0._wp , SIGN( 1._wp , at_i(ji,jj) - 0.15_wp ) ) ! 1 if 15% ice, 0 if less
190      END_2D
191      !
192      !!gm for Clem:  OPTIMIZATION:  I think zfmask can be computed one for all at the initialization....
193      !------------------------------------------------------------------------------!
194      ! 0) mask at F points for the ice
195      !------------------------------------------------------------------------------!
196      ! ocean/land mask
197      DO_2D( 1, 0, 1, 0 )
198         zfmask(ji,jj) = tmask(ji,jj,1) * tmask(ji+1,jj,1) * tmask(ji,jj+1,1) * tmask(ji+1,jj+1,1)
199      END_2D
200      CALL lbc_lnk( 'icedyn_rhg_evp', zfmask, 'F', 1._wp )
201
202      ! Lateral boundary conditions on velocity (modify zfmask)
203      DO_2D( 0, 0, 0, 0 )
204         IF( zfmask(ji,jj) == 0._wp ) THEN
205            zfmask(ji,jj) = rn_ishlat * MIN( 1._wp , MAX( umask(ji,jj,1), umask(ji,jj+1,1), &
206               &                                          vmask(ji,jj,1), vmask(ji+1,jj,1) ) )
207         ENDIF
208      END_2D
209      DO jj = 2, jpjm1
210         IF( zfmask(1,jj) == 0._wp ) THEN
211            zfmask(1  ,jj) = rn_ishlat * MIN( 1._wp , MAX( vmask(2,jj,1), umask(1,jj+1,1), umask(1,jj,1) ) )
212         ENDIF
213         IF( zfmask(jpi,jj) == 0._wp ) THEN
214            zfmask(jpi,jj) = rn_ishlat * MIN( 1._wp , MAX( umask(jpi,jj+1,1), vmask(jpim1,jj,1), umask(jpi,jj-1,1) ) )
215        ENDIF
216      END DO
217      DO ji = 2, jpim1
218         IF( zfmask(ji,1) == 0._wp ) THEN
219            zfmask(ji, 1 ) = rn_ishlat * MIN( 1._wp , MAX( vmask(ji+1,1,1), umask(ji,2,1), vmask(ji,1,1) ) )
220         ENDIF
221         IF( zfmask(ji,jpj) == 0._wp ) THEN
222            zfmask(ji,jpj) = rn_ishlat * MIN( 1._wp , MAX( vmask(ji+1,jpj,1), vmask(ji-1,jpj,1), umask(ji,jpjm1,1) ) )
223         ENDIF
224      END DO
225      CALL lbc_lnk( 'icedyn_rhg_evp', zfmask, 'F', 1._wp )
226
227      !------------------------------------------------------------------------------!
228      ! 1) define some variables and initialize arrays
229      !------------------------------------------------------------------------------!
230      zrhoco = rho0 * rn_cio 
231
232      ! ecc2: square of yield ellipse eccenticrity
233      ecc2    = rn_ecc * rn_ecc
234      z1_ecc2 = 1._wp / ecc2
235
236      ! alpha parameters (Bouillon 2009)
237      IF( .NOT. ln_aEVP ) THEN
238         zdtevp   = rDt_ice / REAL( nn_nevp )
239         zalph1 =   2._wp * rn_relast * REAL( nn_nevp )
240         zalph2 = zalph1 * z1_ecc2
241
242         z1_alph1 = 1._wp / ( zalph1 + 1._wp )
243         z1_alph2 = 1._wp / ( zalph2 + 1._wp )
244      ELSE
245         zdtevp   = rdt_ice
246         ! zalpha parameters set later on adaptatively
247      ENDIF
248      z1_dtevp = 1._wp / zdtevp
249         
250      ! Initialise stress tensor
251      zs1 (:,:) = pstress1_i (:,:) 
252      zs2 (:,:) = pstress2_i (:,:)
253      zs12(:,:) = pstress12_i(:,:)
254
255      ! Ice strength
256      CALL ice_strength
257
258      ! landfast param from Lemieux(2016): add isotropic tensile strength (following Konig Beatty and Holland, 2010)
259      IF( ln_landfast_L16 ) THEN   ;   zkt = rn_lf_tensile
260      ELSE                         ;   zkt = 0._wp
261      ENDIF
262      !
263      !------------------------------------------------------------------------------!
264      ! 2) Wind / ocean stress, mass terms, coriolis terms
265      !------------------------------------------------------------------------------!
266      ! sea surface height
267      !    embedded sea ice: compute representative ice top surface
268      !    non-embedded sea ice: use ocean surface for slope calculation
269      zsshdyn(:,:) = ice_var_sshdyn( ssh_m, snwice_mass, snwice_mass_b)
270
271      DO_2D( 0, 0, 0, 0 )
272
273         ! ice fraction at U-V points
274         zaU(ji,jj) = 0.5_wp * ( at_i(ji,jj) * e1e2t(ji,jj) + at_i(ji+1,jj) * e1e2t(ji+1,jj) ) * r1_e1e2u(ji,jj) * umask(ji,jj,1)
275         zaV(ji,jj) = 0.5_wp * ( at_i(ji,jj) * e1e2t(ji,jj) + at_i(ji,jj+1) * e1e2t(ji,jj+1) ) * r1_e1e2v(ji,jj) * vmask(ji,jj,1)
276
277         ! Ice/snow mass at U-V points
278         zm1 = ( rhos * vt_s(ji  ,jj  ) + rhoi * vt_i(ji  ,jj  ) )
279         zm2 = ( rhos * vt_s(ji+1,jj  ) + rhoi * vt_i(ji+1,jj  ) )
280         zm3 = ( rhos * vt_s(ji  ,jj+1) + rhoi * vt_i(ji  ,jj+1) )
281         zmassU = 0.5_wp * ( zm1 * e1e2t(ji,jj) + zm2 * e1e2t(ji+1,jj) ) * r1_e1e2u(ji,jj) * umask(ji,jj,1)
282         zmassV = 0.5_wp * ( zm1 * e1e2t(ji,jj) + zm3 * e1e2t(ji,jj+1) ) * r1_e1e2v(ji,jj) * vmask(ji,jj,1)
283
284         ! Ocean currents at U-V points
285         v_oceU(ji,jj)   = 0.25_wp * ( v_oce(ji,jj) + v_oce(ji,jj-1) + v_oce(ji+1,jj) + v_oce(ji+1,jj-1) ) * umask(ji,jj,1)
286         u_oceV(ji,jj)   = 0.25_wp * ( u_oce(ji,jj) + u_oce(ji-1,jj) + u_oce(ji,jj+1) + u_oce(ji-1,jj+1) ) * vmask(ji,jj,1)
287
288         ! Coriolis at T points (m*f)
289         zmf(ji,jj)      = zm1 * ff_t(ji,jj)
290
291         ! dt/m at T points (for alpha and beta coefficients)
292         zdt_m(ji,jj)    = zdtevp / MAX( zm1, zmmin )
293         
294         ! m/dt
295         zmU_t(ji,jj)    = zmassU * z1_dtevp
296         zmV_t(ji,jj)    = zmassV * z1_dtevp
297         
298         ! Drag ice-atm.
299         ztaux_ai(ji,jj) = zaU(ji,jj) * utau_ice(ji,jj)
300         ztauy_ai(ji,jj) = zaV(ji,jj) * vtau_ice(ji,jj)
301
302         ! Surface pressure gradient (- m*g*GRAD(ssh)) at U-V points
303         zspgU(ji,jj)    = - zmassU * grav * ( zsshdyn(ji+1,jj) - zsshdyn(ji,jj) ) * r1_e1u(ji,jj)
304         zspgV(ji,jj)    = - zmassV * grav * ( zsshdyn(ji,jj+1) - zsshdyn(ji,jj) ) * r1_e2v(ji,jj)
305
306         ! masks
307         zmsk00x(ji,jj) = 1._wp - MAX( 0._wp, SIGN( 1._wp, -zmassU ) )  ! 0 if no ice
308         zmsk00y(ji,jj) = 1._wp - MAX( 0._wp, SIGN( 1._wp, -zmassV ) )  ! 0 if no ice
309
310         ! switches
311         IF( zmassU <= zmmin .AND. zaU(ji,jj) <= zamin ) THEN   ;   zmsk01x(ji,jj) = 0._wp
312         ELSE                                                   ;   zmsk01x(ji,jj) = 1._wp   ;   ENDIF
313         IF( zmassV <= zmmin .AND. zaV(ji,jj) <= zamin ) THEN   ;   zmsk01y(ji,jj) = 0._wp
314         ELSE                                                   ;   zmsk01y(ji,jj) = 1._wp   ;   ENDIF
315
316      END_2D
317      CALL lbc_lnk_multi( 'icedyn_rhg_evp', zmf, 'T', 1.0_wp, zdt_m, 'T', 1.0_wp )
318      !
319      !                                  !== Landfast ice parameterization ==!
320      !
321      IF( ln_landfast_L16 ) THEN         !-- Lemieux 2016
322         DO_2D( 0, 0, 0, 0 )
323            ! ice thickness at U-V points
324            zvU = 0.5_wp * ( vt_i(ji,jj) * e1e2t(ji,jj) + vt_i(ji+1,jj) * e1e2t(ji+1,jj) ) * r1_e1e2u(ji,jj) * umask(ji,jj,1)
325            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)
326            ! ice-bottom stress at U points
327            zvCr = zaU(ji,jj) * rn_lf_depfra * hu(ji,jj,Kmm)
328            ztaux_base(ji,jj) = - rn_lf_bfr * MAX( 0._wp, zvU - zvCr ) * EXP( -rn_crhg * ( 1._wp - zaU(ji,jj) ) )
329            ! ice-bottom stress at V points
330            zvCr = zaV(ji,jj) * rn_lf_depfra * hv(ji,jj,Kmm)
331            ztauy_base(ji,jj) = - rn_lf_bfr * MAX( 0._wp, zvV - zvCr ) * EXP( -rn_crhg * ( 1._wp - zaV(ji,jj) ) )
332            ! ice_bottom stress at T points
333            zvCr = at_i(ji,jj) * rn_lf_depfra * ht(ji,jj)
334            tau_icebfr(ji,jj) = - rn_lf_bfr * MAX( 0._wp, vt_i(ji,jj) - zvCr ) * EXP( -rn_crhg * ( 1._wp - at_i(ji,jj) ) )
335         END_2D
336         CALL lbc_lnk( 'icedyn_rhg_evp', tau_icebfr(:,:), 'T', 1.0_wp )
337         !
338      ELSE                               !-- no landfast
339         DO_2D( 0, 0, 0, 0 )
340            ztaux_base(ji,jj) = 0._wp
341            ztauy_base(ji,jj) = 0._wp
342         END_2D
343      ENDIF
344
345      !------------------------------------------------------------------------------!
346      ! 3) Solution of the momentum equation, iterative procedure
347      !------------------------------------------------------------------------------!
348      !
349      !                                               ! ==================== !
350      DO jter = 1 , nn_nevp                           !    loop over jter    !
351         !                                            ! ==================== !       
352         l_full_nf_update = jter == nn_nevp   ! false: disable full North fold update (performances) for iter = 1 to nn_nevp-1
353         !
354         ! convergence test
355         IF( nn_rhg_chkcvg == 1 .OR. nn_rhg_chkcvg == 2  ) THEN
356            DO_2D( nn_hls, nn_hls, nn_hls, nn_hls )
357               zu_ice(ji,jj) = u_ice(ji,jj) * umask(ji,jj,1) ! velocity at previous time step
358               zv_ice(ji,jj) = v_ice(ji,jj) * vmask(ji,jj,1)
359            END_2D
360         ENDIF
361
362         ! --- divergence, tension & shear (Appendix B of Hunke & Dukowicz, 2002) --- !
363         DO_2D( 1, 0, 1, 0 )
364
365            ! shear at F points
366            zds(ji,jj) = ( ( u_ice(ji,jj+1) * r1_e1u(ji,jj+1) - u_ice(ji,jj) * r1_e1u(ji,jj) ) * e1f(ji,jj) * e1f(ji,jj)   &
367               &         + ( v_ice(ji+1,jj) * r1_e2v(ji+1,jj) - v_ice(ji,jj) * r1_e2v(ji,jj) ) * e2f(ji,jj) * e2f(ji,jj)   &
368               &         ) * r1_e1e2f(ji,jj) * zfmask(ji,jj)
369
370         END_2D
371
372         DO_2D( 0, 0, 0, 0 )
373
374            ! shear**2 at T points (doc eq. A16)
375            zds2 = ( zds(ji,jj  ) * zds(ji,jj  ) * e1e2f(ji,jj  ) + zds(ji-1,jj  ) * zds(ji-1,jj  ) * e1e2f(ji-1,jj  )  &
376               &   + zds(ji,jj-1) * zds(ji,jj-1) * e1e2f(ji,jj-1) + zds(ji-1,jj-1) * zds(ji-1,jj-1) * e1e2f(ji-1,jj-1)  &
377               &   ) * 0.25_wp * r1_e1e2t(ji,jj)
378           
379            ! divergence at T points
380            zdiv  = ( e2u(ji,jj) * u_ice(ji,jj) - e2u(ji-1,jj) * u_ice(ji-1,jj)   &
381               &    + e1v(ji,jj) * v_ice(ji,jj) - e1v(ji,jj-1) * v_ice(ji,jj-1)   &
382               &    ) * r1_e1e2t(ji,jj)
383            zdiv2 = zdiv * zdiv
384           
385            ! tension at T points
386            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)   &
387               &   - ( v_ice(ji,jj) * r1_e1v(ji,jj) - v_ice(ji,jj-1) * r1_e1v(ji,jj-1) ) * e1t(ji,jj) * e1t(ji,jj)   &
388               &   ) * r1_e1e2t(ji,jj)
389            zdt2 = zdt * zdt
390           
391            ! delta at T points
392            zdelta(ji,jj) = SQRT( zdiv2 + ( zdt2 + zds2 ) * z1_ecc2 ) 
393
394         END_2D
395         CALL lbc_lnk( 'icedyn_rhg_evp', zdelta, 'T', 1.0_wp )
396
397         ! P/delta at T points
398         DO_2D( 1, 1, 1, 1 )
399            zp_delt(ji,jj) = strength(ji,jj) / ( zdelta(ji,jj) + rn_creepl )
400         END_2D
401
402         DO_2D( 0, 1, 0, 1 )   ! loop ends at jpi,jpj so that no lbc_lnk are needed for zs1 and zs2
403
404            ! divergence at T points (duplication to avoid communications)
405            zdiv  = ( e2u(ji,jj) * u_ice(ji,jj) - e2u(ji-1,jj) * u_ice(ji-1,jj)   &
406               &    + e1v(ji,jj) * v_ice(ji,jj) - e1v(ji,jj-1) * v_ice(ji,jj-1)   &
407               &    ) * r1_e1e2t(ji,jj)
408           
409            ! tension at T points (duplication to avoid communications)
410            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)   &
411               &   - ( v_ice(ji,jj) * r1_e1v(ji,jj) - v_ice(ji,jj-1) * r1_e1v(ji,jj-1) ) * e1t(ji,jj) * e1t(ji,jj)   &
412               &   ) * r1_e1e2t(ji,jj)
413           
414            ! alpha for aEVP
415            !   gamma = 0.5*P/(delta+creepl) * (c*pi)**2/Area * dt/m
416            !   alpha = beta = sqrt(4*gamma)
417            IF( ln_aEVP ) THEN
418               zalph1   = MAX( 50._wp, rpi * SQRT( 0.5_wp * zp_delt(ji,jj) * r1_e1e2t(ji,jj) * zdt_m(ji,jj) ) )
419               z1_alph1 = 1._wp / ( zalph1 + 1._wp )
420               zalph2   = zalph1
421               z1_alph2 = z1_alph1
422               ! explicit:
423               ! z1_alph1 = 1._wp / zalph1
424               ! z1_alph2 = 1._wp / zalph1
425               ! zalph1 = zalph1 - 1._wp
426               ! zalph2 = zalph1
427            ENDIF
428           
429            ! stress at T points (zkt/=0 if landfast)
430            zs1(ji,jj) = ( zs1(ji,jj)*zalph1 + zp_delt(ji,jj) * ( zdiv*(1._wp + zkt) - zdelta(ji,jj)*(1._wp - zkt) ) ) * z1_alph1
431            zs2(ji,jj) = ( zs2(ji,jj)*zalph2 + zp_delt(ji,jj) * ( zdt * z1_ecc2 * (1._wp + zkt) ) ) * z1_alph2
432         
433         END_2D
434
435         ! Save beta at T-points for further computations
436         IF( ln_aEVP ) THEN
437            DO_2D( 1, 1, 1, 1 )
438               zbeta(ji,jj) = MAX( 50._wp, rpi * SQRT( 0.5_wp * zp_delt(ji,jj) * r1_e1e2t(ji,jj) * zdt_m(ji,jj) ) )
439            END_2D
440         ENDIF
441         
442         DO_2D( 1, 0, 1, 0 )
443
444            ! alpha for aEVP
445            IF( ln_aEVP ) THEN
446               zalph2   = MAX( zbeta(ji,jj), zbeta(ji+1,jj), zbeta(ji,jj+1), zbeta(ji+1,jj+1) )
447               z1_alph2 = 1._wp / ( zalph2 + 1._wp )
448               ! explicit:
449               ! z1_alph2 = 1._wp / zalph2
450               ! zalph2 = zalph2 - 1._wp
451            ENDIF
452           
453            ! P/delta at F points
454            zp_delf = 0.25_wp * ( zp_delt(ji,jj) + zp_delt(ji+1,jj) + zp_delt(ji,jj+1) + zp_delt(ji+1,jj+1) )
455           
456            ! stress at F points (zkt/=0 if landfast)
457            zs12(ji,jj)= ( zs12(ji,jj) * zalph2 + zp_delf * ( zds(ji,jj) * z1_ecc2 * (1._wp + zkt) ) * 0.5_wp ) * z1_alph2
458
459         END_2D
460
461         ! --- Ice internal stresses (Appendix C of Hunke and Dukowicz, 2002) --- !
462         DO_2D( 0, 0, 0, 0 )
463            !                   !--- U points
464            zfU(ji,jj) = 0.5_wp * ( ( zs1(ji+1,jj) - zs1(ji,jj) ) * e2u(ji,jj)                                             &
465               &                  + ( zs2(ji+1,jj) * e2t(ji+1,jj) * e2t(ji+1,jj) - zs2(ji,jj) * e2t(ji,jj) * e2t(ji,jj)    &
466               &                    ) * r1_e2u(ji,jj)                                                                      &
467               &                  + ( zs12(ji,jj) * e1f(ji,jj) * e1f(ji,jj) - zs12(ji,jj-1) * e1f(ji,jj-1) * e1f(ji,jj-1)  &
468               &                    ) * 2._wp * r1_e1u(ji,jj)                                                              &
469               &                  ) * r1_e1e2u(ji,jj)
470            !
471            !                !--- V points
472            zfV(ji,jj) = 0.5_wp * ( ( zs1(ji,jj+1) - zs1(ji,jj) ) * e1v(ji,jj)                                             &
473               &                  - ( zs2(ji,jj+1) * e1t(ji,jj+1) * e1t(ji,jj+1) - zs2(ji,jj) * e1t(ji,jj) * e1t(ji,jj)    &
474               &                    ) * r1_e1v(ji,jj)                                                                      &
475               &                  + ( zs12(ji,jj) * e2f(ji,jj) * e2f(ji,jj) - zs12(ji-1,jj) * e2f(ji-1,jj) * e2f(ji-1,jj)  &
476               &                    ) * 2._wp * r1_e2v(ji,jj)                                                              &
477               &                  ) * r1_e1e2v(ji,jj)
478            !
479            !                !--- ice currents at U-V point
480            v_iceU(ji,jj) = 0.25_wp * ( v_ice(ji,jj) + v_ice(ji,jj-1) + v_ice(ji+1,jj) + v_ice(ji+1,jj-1) ) * umask(ji,jj,1)
481            u_iceV(ji,jj) = 0.25_wp * ( u_ice(ji,jj) + u_ice(ji-1,jj) + u_ice(ji,jj+1) + u_ice(ji-1,jj+1) ) * vmask(ji,jj,1)
482            !
483         END_2D
484         !
485         ! --- Computation of ice velocity --- !
486         !  Bouillon et al. 2013 (eq 47-48) => unstable unless alpha, beta vary as in Kimmritz 2016 & 2017
487         !  Bouillon et al. 2009 (eq 34-35) => stable
488         IF( MOD(jter,2) == 0 ) THEN ! even iterations
489            !
490            DO_2D( 0, 0, 0, 0 )
491               !                 !--- tau_io/(v_oce - v_ice)
492               zTauO = zaV(ji,jj) * zrhoco * SQRT( ( v_ice (ji,jj) - v_oce (ji,jj) ) * ( v_ice (ji,jj) - v_oce (ji,jj) )  &
493                  &                              + ( u_iceV(ji,jj) - u_oceV(ji,jj) ) * ( u_iceV(ji,jj) - u_oceV(ji,jj) ) )
494               !                 !--- Ocean-to-Ice stress
495               ztauy_oi(ji,jj) = zTauO * ( v_oce(ji,jj) - v_ice(ji,jj) )
496               !
497               !                 !--- tau_bottom/v_ice
498               zvel  = 5.e-05_wp + SQRT( v_ice(ji,jj) * v_ice(ji,jj) + u_iceV(ji,jj) * u_iceV(ji,jj) )
499               zTauB = ztauy_base(ji,jj) / zvel
500               !                 !--- OceanBottom-to-Ice stress
501               ztauy_bi(ji,jj) = zTauB * v_ice(ji,jj)
502               !
503               !                 !--- Coriolis at V-points (energy conserving formulation)
504               zCorV(ji,jj)  = - 0.25_wp * r1_e2v(ji,jj) *  &
505                  &    ( zmf(ji,jj  ) * ( e2u(ji,jj  ) * u_ice(ji,jj  ) + e2u(ji-1,jj  ) * u_ice(ji-1,jj  ) )  &
506                  &    + zmf(ji,jj+1) * ( e2u(ji,jj+1) * u_ice(ji,jj+1) + e2u(ji-1,jj+1) * u_ice(ji-1,jj+1) ) )
507               !
508               !                 !--- Sum of external forces (explicit solution) = F + tau_ia + Coriolis + spg + tau_io
509               zRHS = zfV(ji,jj) + ztauy_ai(ji,jj) + zCorV(ji,jj) + zspgV(ji,jj) + ztauy_oi(ji,jj)
510               !
511               !                 !--- landfast switch => 0 = static  friction : TauB > RHS & sign(TauB) /= sign(RHS)
512               !                                         1 = sliding friction : TauB < RHS
513               rswitch = 1._wp - MIN( 1._wp, ABS( SIGN( 1._wp, zRHS + ztauy_base(ji,jj) ) - SIGN( 1._wp, zRHS ) ) )
514               !
515               IF( ln_aEVP ) THEN !--- ice velocity using aEVP (Kimmritz et al 2016 & 2017)
516                  zbetav = MAX( zbeta(ji,jj), zbeta(ji,jj+1) )
517                  v_ice(ji,jj) = ( (          rswitch   * ( zmV_t(ji,jj) * ( zbetav * v_ice(ji,jj) + v_ice_b(ji,jj) )         & ! previous velocity
518                     &                                    + zRHS + zTauO * v_ice(ji,jj)                                       & ! F + tau_ia + Coriolis + spg + tau_io(only ocean part)
519                     &                                    ) / MAX( zepsi, zmV_t(ji,jj) * ( zbetav + 1._wp ) + zTauO - zTauB ) & ! m/dt + tau_io(only ice part) + landfast
520                     &            + ( 1._wp - rswitch ) * (  v_ice_b(ji,jj)                                                   & 
521                     &                                     + v_ice  (ji,jj) * MAX( 0._wp, zbetav - zdtevp * rn_lf_relax )     & ! static friction => slow decrease to v=0
522                     &                                    ) / ( zbetav + 1._wp )                                              &
523                     &             ) * 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
524                     &           )   * zmsk00y(ji,jj)
525               ELSE               !--- ice velocity using EVP implicit formulation (cf Madec doc & Bouillon 2009)
526                  v_ice(ji,jj) = ( (          rswitch   * ( zmV_t(ji,jj) * v_ice(ji,jj)                                       & ! previous velocity
527                     &                                    + zRHS + zTauO * v_ice(ji,jj)                                       & ! F + tau_ia + Coriolis + spg + tau_io(only ocean part)
528                     &                                    ) / MAX( zepsi, zmV_t(ji,jj) + zTauO - zTauB )                      & ! m/dt + tau_io(only ice part) + landfast
529                     &            + ( 1._wp - rswitch ) *   v_ice(ji,jj) * MAX( 0._wp, 1._wp - zdtevp * rn_lf_relax )         & ! static friction => slow decrease to v=0
530                     &             ) * 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
531                     &            )  * zmsk00y(ji,jj)
532               ENDIF
533            END_2D
534            CALL lbc_lnk( 'icedyn_rhg_evp', v_ice, 'V', -1.0_wp )
535            !
536#if defined key_agrif
537!!            CALL agrif_interp_ice( 'V', jter, nn_nevp )
538            CALL agrif_interp_ice( 'V' )
539#endif
540            IF( ln_bdy )   CALL bdy_ice_dyn( 'V' )
541            !
542            DO_2D( 0, 0, 0, 0 )
543               !                 !--- tau_io/(u_oce - u_ice)
544               zTauO = zaU(ji,jj) * zrhoco * SQRT( ( u_ice (ji,jj) - u_oce (ji,jj) ) * ( u_ice (ji,jj) - u_oce (ji,jj) )  &
545                  &                              + ( v_iceU(ji,jj) - v_oceU(ji,jj) ) * ( v_iceU(ji,jj) - v_oceU(ji,jj) ) )
546               !                 !--- Ocean-to-Ice stress
547               ztaux_oi(ji,jj) = zTauO * ( u_oce(ji,jj) - u_ice(ji,jj) )
548               !
549               !                 !--- tau_bottom/u_ice
550               zvel  = 5.e-05_wp + SQRT( v_iceU(ji,jj) * v_iceU(ji,jj) + u_ice(ji,jj) * u_ice(ji,jj) )
551               zTauB = ztaux_base(ji,jj) / zvel
552               !                 !--- OceanBottom-to-Ice stress
553               ztaux_bi(ji,jj) = zTauB * u_ice(ji,jj)
554               !
555               !                 !--- Coriolis at U-points (energy conserving formulation)
556               zCorU(ji,jj)  =   0.25_wp * r1_e1u(ji,jj) *  &
557                  &    ( zmf(ji  ,jj) * ( e1v(ji  ,jj) * v_ice(ji  ,jj) + e1v(ji  ,jj-1) * v_ice(ji  ,jj-1) )  &
558                  &    + zmf(ji+1,jj) * ( e1v(ji+1,jj) * v_ice(ji+1,jj) + e1v(ji+1,jj-1) * v_ice(ji+1,jj-1) ) )
559               !
560               !                 !--- Sum of external forces (explicit solution) = F + tau_ia + Coriolis + spg + tau_io
561               zRHS = zfU(ji,jj) + ztaux_ai(ji,jj) + zCorU(ji,jj) + zspgU(ji,jj) + ztaux_oi(ji,jj)
562               !
563               !                 !--- landfast switch => 0 = static  friction : TauB > RHS & sign(TauB) /= sign(RHS)
564               !                                         1 = sliding friction : TauB < RHS
565               rswitch = 1._wp - MIN( 1._wp, ABS( SIGN( 1._wp, zRHS + ztaux_base(ji,jj) ) - SIGN( 1._wp, zRHS ) ) )
566               !
567               IF( ln_aEVP ) THEN !--- ice velocity using aEVP (Kimmritz et al 2016 & 2017)
568                  zbetau = MAX( zbeta(ji,jj), zbeta(ji+1,jj) )
569                  u_ice(ji,jj) = ( (          rswitch   * ( zmU_t(ji,jj) * ( zbetau * u_ice(ji,jj) + u_ice_b(ji,jj) )         & ! previous velocity
570                     &                                    + zRHS + zTauO * u_ice(ji,jj)                                       & ! F + tau_ia + Coriolis + spg + tau_io(only ocean part)
571                     &                                    ) / MAX( zepsi, zmU_t(ji,jj) * ( zbetau + 1._wp ) + zTauO - zTauB ) & ! m/dt + tau_io(only ice part) + landfast
572                     &            + ( 1._wp - rswitch ) * (  u_ice_b(ji,jj)                                                   &
573                     &                                     + u_ice  (ji,jj) * MAX( 0._wp, zbetau - zdtevp * rn_lf_relax )     & ! static friction => slow decrease to v=0
574                     &                                    ) / ( zbetau + 1._wp )                                              &
575                     &             ) * 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
576                     &           )   * zmsk00x(ji,jj)
577               ELSE               !--- ice velocity using EVP implicit formulation (cf Madec doc & Bouillon 2009)
578                  u_ice(ji,jj) = ( (          rswitch   * ( zmU_t(ji,jj) * u_ice(ji,jj)                                       & ! previous velocity
579                     &                                    + zRHS + zTauO * u_ice(ji,jj)                                       & ! F + tau_ia + Coriolis + spg + tau_io(only ocean part)
580                     &                                    ) / MAX( zepsi, zmU_t(ji,jj) + zTauO - zTauB )                      & ! m/dt + tau_io(only ice part) + landfast
581                     &            + ( 1._wp - rswitch ) *   u_ice(ji,jj) * MAX( 0._wp, 1._wp - zdtevp * rn_lf_relax )         & ! static friction => slow decrease to v=0
582                     &             ) * 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
583                     &           )   * zmsk00x(ji,jj)
584               ENDIF
585            END_2D
586            CALL lbc_lnk( 'icedyn_rhg_evp', u_ice, 'U', -1.0_wp )
587            !
588#if defined key_agrif
589!!            CALL agrif_interp_ice( 'U', jter, nn_nevp )
590            CALL agrif_interp_ice( 'U' )
591#endif
592            IF( ln_bdy )   CALL bdy_ice_dyn( 'U' )
593            !
594         ELSE ! odd iterations
595            !
596            DO_2D( 0, 0, 0, 0 )
597               !                 !--- tau_io/(u_oce - u_ice)
598               zTauO = zaU(ji,jj) * zrhoco * SQRT( ( u_ice (ji,jj) - u_oce (ji,jj) ) * ( u_ice (ji,jj) - u_oce (ji,jj) )  &
599                  &                              + ( v_iceU(ji,jj) - v_oceU(ji,jj) ) * ( v_iceU(ji,jj) - v_oceU(ji,jj) ) )
600               !                 !--- Ocean-to-Ice stress
601               ztaux_oi(ji,jj) = zTauO * ( u_oce(ji,jj) - u_ice(ji,jj) )
602               !
603               !                 !--- tau_bottom/u_ice
604               zvel  = 5.e-05_wp + SQRT( v_iceU(ji,jj) * v_iceU(ji,jj) + u_ice(ji,jj) * u_ice(ji,jj) )
605               zTauB = ztaux_base(ji,jj) / zvel
606               !                 !--- OceanBottom-to-Ice stress
607               ztaux_bi(ji,jj) = zTauB * u_ice(ji,jj)
608               !
609               !                 !--- Coriolis at U-points (energy conserving formulation)
610               zCorU(ji,jj)  =   0.25_wp * r1_e1u(ji,jj) *  &
611                  &    ( zmf(ji  ,jj) * ( e1v(ji  ,jj) * v_ice(ji  ,jj) + e1v(ji  ,jj-1) * v_ice(ji  ,jj-1) )  &
612                  &    + zmf(ji+1,jj) * ( e1v(ji+1,jj) * v_ice(ji+1,jj) + e1v(ji+1,jj-1) * v_ice(ji+1,jj-1) ) )
613               !
614               !                 !--- Sum of external forces (explicit solution) = F + tau_ia + Coriolis + spg + tau_io
615               zRHS = zfU(ji,jj) + ztaux_ai(ji,jj) + zCorU(ji,jj) + zspgU(ji,jj) + ztaux_oi(ji,jj)
616               !
617               !                 !--- landfast switch => 0 = static  friction : TauB > RHS & sign(TauB) /= sign(RHS)
618               !                                         1 = sliding friction : TauB < RHS
619               rswitch = 1._wp - MIN( 1._wp, ABS( SIGN( 1._wp, zRHS + ztaux_base(ji,jj) ) - SIGN( 1._wp, zRHS ) ) )
620               !
621               IF( ln_aEVP ) THEN !--- ice velocity using aEVP (Kimmritz et al 2016 & 2017)
622                  zbetau = MAX( zbeta(ji,jj), zbeta(ji+1,jj) )
623                  u_ice(ji,jj) = ( (          rswitch   * ( zmU_t(ji,jj) * ( zbetau * u_ice(ji,jj) + u_ice_b(ji,jj) )         & ! previous velocity
624                     &                                    + zRHS + zTauO * u_ice(ji,jj)                                       & ! F + tau_ia + Coriolis + spg + tau_io(only ocean part)
625                     &                                    ) / MAX( zepsi, zmU_t(ji,jj) * ( zbetau + 1._wp ) + zTauO - zTauB ) & ! m/dt + tau_io(only ice part) + landfast
626                     &            + ( 1._wp - rswitch ) * (  u_ice_b(ji,jj)                                                   &
627                     &                                     + u_ice  (ji,jj) * MAX( 0._wp, zbetau - zdtevp * rn_lf_relax )     & ! static friction => slow decrease to v=0
628                     &                                    ) / ( zbetau + 1._wp )                                              &
629                     &             ) * 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
630                     &           )   * zmsk00x(ji,jj)
631               ELSE               !--- ice velocity using EVP implicit formulation (cf Madec doc & Bouillon 2009)
632                  u_ice(ji,jj) = ( (          rswitch   * ( zmU_t(ji,jj) * u_ice(ji,jj)                                       & ! previous velocity
633                     &                                    + zRHS + zTauO * u_ice(ji,jj)                                       & ! F + tau_ia + Coriolis + spg + tau_io(only ocean part)
634                     &                                    ) / MAX( zepsi, zmU_t(ji,jj) + zTauO - zTauB )                      & ! m/dt + tau_io(only ice part) + landfast
635                     &            + ( 1._wp - rswitch ) *   u_ice(ji,jj) * MAX( 0._wp, 1._wp - zdtevp * rn_lf_relax )         & ! static friction => slow decrease to v=0
636                     &             ) * 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
637                     &           )   * zmsk00x(ji,jj)
638               ENDIF
639            END_2D
640            CALL lbc_lnk( 'icedyn_rhg_evp', u_ice, 'U', -1.0_wp )
641            !
642#if defined key_agrif
643!!            CALL agrif_interp_ice( 'U', jter, nn_nevp )
644            CALL agrif_interp_ice( 'U' )
645#endif
646            IF( ln_bdy )   CALL bdy_ice_dyn( 'U' )
647            !
648            DO_2D( 0, 0, 0, 0 )
649               !                 !--- tau_io/(v_oce - v_ice)
650               zTauO = zaV(ji,jj) * zrhoco * SQRT( ( v_ice (ji,jj) - v_oce (ji,jj) ) * ( v_ice (ji,jj) - v_oce (ji,jj) )  &
651                  &                              + ( u_iceV(ji,jj) - u_oceV(ji,jj) ) * ( u_iceV(ji,jj) - u_oceV(ji,jj) ) )
652               !                 !--- Ocean-to-Ice stress
653               ztauy_oi(ji,jj) = zTauO * ( v_oce(ji,jj) - v_ice(ji,jj) )
654               !
655               !                 !--- tau_bottom/v_ice
656               zvel  = 5.e-05_wp + SQRT( v_ice(ji,jj) * v_ice(ji,jj) + u_iceV(ji,jj) * u_iceV(ji,jj) )
657               zTauB = ztauy_base(ji,jj) / zvel
658               !                 !--- OceanBottom-to-Ice stress
659               ztauy_bi(ji,jj) = zTauB * v_ice(ji,jj)
660               !
661               !                 !--- Coriolis at v-points (energy conserving formulation)
662               zCorV(ji,jj)  = - 0.25_wp * r1_e2v(ji,jj) *  &
663                  &    ( zmf(ji,jj  ) * ( e2u(ji,jj  ) * u_ice(ji,jj  ) + e2u(ji-1,jj  ) * u_ice(ji-1,jj  ) )  &
664                  &    + zmf(ji,jj+1) * ( e2u(ji,jj+1) * u_ice(ji,jj+1) + e2u(ji-1,jj+1) * u_ice(ji-1,jj+1) ) )
665               !
666               !                 !--- Sum of external forces (explicit solution) = F + tau_ia + Coriolis + spg + tau_io
667               zRHS = zfV(ji,jj) + ztauy_ai(ji,jj) + zCorV(ji,jj) + zspgV(ji,jj) + ztauy_oi(ji,jj)
668               !
669               !                 !--- landfast switch => 0 = static  friction : TauB > RHS & sign(TauB) /= sign(RHS)
670               !                                         1 = sliding friction : TauB < RHS
671               rswitch = 1._wp - MIN( 1._wp, ABS( SIGN( 1._wp, zRHS + ztauy_base(ji,jj) ) - SIGN( 1._wp, zRHS ) ) )
672               !
673               IF( ln_aEVP ) THEN !--- ice velocity using aEVP (Kimmritz et al 2016 & 2017)
674                  zbetav = MAX( zbeta(ji,jj), zbeta(ji,jj+1) )
675                  v_ice(ji,jj) = ( (          rswitch   * ( zmV_t(ji,jj) * ( zbetav * v_ice(ji,jj) + v_ice_b(ji,jj) )         & ! previous velocity
676                     &                                    + zRHS + zTauO * v_ice(ji,jj)                                       & ! F + tau_ia + Coriolis + spg + tau_io(only ocean part)
677                     &                                    ) / MAX( zepsi, zmV_t(ji,jj) * ( zbetav + 1._wp ) + zTauO - zTauB ) & ! m/dt + tau_io(only ice part) + landfast
678                     &            + ( 1._wp - rswitch ) * (  v_ice_b(ji,jj)                                                   &
679                     &                                     + v_ice  (ji,jj) * MAX( 0._wp, zbetav - zdtevp * rn_lf_relax )     & ! static friction => slow decrease to v=0
680                     &                                    ) / ( zbetav + 1._wp )                                              & 
681                     &             ) * 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
682                     &           )   * zmsk00y(ji,jj)
683               ELSE               !--- ice velocity using EVP implicit formulation (cf Madec doc & Bouillon 2009)
684                  v_ice(ji,jj) = ( (          rswitch   * ( zmV_t(ji,jj) * v_ice(ji,jj)                                       & ! previous velocity
685                     &                                    + zRHS + zTauO * v_ice(ji,jj)                                       & ! F + tau_ia + Coriolis + spg + tau_io(only ocean part)
686                     &                                    ) / MAX( zepsi, zmV_t(ji,jj) + zTauO - zTauB )                      & ! m/dt + tau_io(only ice part) + landfast
687                     &            + ( 1._wp - rswitch ) *   v_ice(ji,jj) * MAX( 0._wp, 1._wp - zdtevp * rn_lf_relax )         & ! static friction => slow decrease to v=0
688                     &             ) * 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
689                     &           )   * zmsk00y(ji,jj)
690               ENDIF
691            END_2D
692            CALL lbc_lnk( 'icedyn_rhg_evp', v_ice, 'V', -1.0_wp )
693            !
694#if defined key_agrif
695!!            CALL agrif_interp_ice( 'V', jter, nn_nevp )
696            CALL agrif_interp_ice( 'V' )
697#endif
698            IF( ln_bdy )   CALL bdy_ice_dyn( 'V' )
699            !
700         ENDIF
701
702         ! convergence test
703         IF( nn_rhg_chkcvg == 2 )   CALL rhg_cvg( kt, jter, nn_nevp, u_ice, v_ice, zu_ice, zv_ice )
704         !
705         !                                                ! ==================== !
706      END DO                                              !  end loop over jter  !
707      !                                                   ! ==================== !
708      IF( ln_aEVP )   CALL iom_put( 'beta_evp' , zbeta )
709      !
710      !------------------------------------------------------------------------------!
711      ! 4) Recompute delta, shear and div (inputs for mechanical redistribution)
712      !------------------------------------------------------------------------------!
713      DO_2D( 1, 0, 1, 0 )
714
715         ! shear at F points
716         zds(ji,jj) = ( ( u_ice(ji,jj+1) * r1_e1u(ji,jj+1) - u_ice(ji,jj) * r1_e1u(ji,jj) ) * e1f(ji,jj) * e1f(ji,jj)   &
717            &         + ( v_ice(ji+1,jj) * r1_e2v(ji+1,jj) - v_ice(ji,jj) * r1_e2v(ji,jj) ) * e2f(ji,jj) * e2f(ji,jj)   &
718            &         ) * r1_e1e2f(ji,jj) * zfmask(ji,jj)
719
720      END_2D
721     
722      DO_2D( 0, 0, 0, 0 )   ! no vector loop
723         
724         ! tension**2 at T points
725         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)   &
726            &   - ( v_ice(ji,jj) * r1_e1v(ji,jj) - v_ice(ji,jj-1) * r1_e1v(ji,jj-1) ) * e1t(ji,jj) * e1t(ji,jj)   &
727            &   ) * r1_e1e2t(ji,jj)
728         zdt2 = zdt * zdt
729
730         zten_i(ji,jj) = zdt
731         
732         ! shear**2 at T points (doc eq. A16)
733         zds2 = ( zds(ji,jj  ) * zds(ji,jj  ) * e1e2f(ji,jj  ) + zds(ji-1,jj  ) * zds(ji-1,jj  ) * e1e2f(ji-1,jj  )  &
734            &   + zds(ji,jj-1) * zds(ji,jj-1) * e1e2f(ji,jj-1) + zds(ji-1,jj-1) * zds(ji-1,jj-1) * e1e2f(ji-1,jj-1)  &
735            &   ) * 0.25_wp * r1_e1e2t(ji,jj)
736         
737         ! shear at T points
738         pshear_i(ji,jj) = SQRT( zdt2 + zds2 )
739
740         ! divergence at T points
741         pdivu_i(ji,jj) = ( e2u(ji,jj) * u_ice(ji,jj) - e2u(ji-1,jj) * u_ice(ji-1,jj)   &
742            &             + e1v(ji,jj) * v_ice(ji,jj) - e1v(ji,jj-1) * v_ice(ji,jj-1)   &
743            &             ) * r1_e1e2t(ji,jj)
744         
745         ! delta at T points
746         zfac            = SQRT( pdivu_i(ji,jj) * pdivu_i(ji,jj) + ( zdt2 + zds2 ) * z1_ecc2 ) ! delta 
747         rswitch         = 1._wp - MAX( 0._wp, SIGN( 1._wp, -zfac ) ) ! 0 if delta=0
748         pdelta_i(ji,jj) = zfac + rn_creepl * rswitch ! delta+creepl
749
750      END_2D
751      CALL lbc_lnk_multi( 'icedyn_rhg_evp', pshear_i, 'T', 1._wp, pdivu_i, 'T', 1._wp, pdelta_i, 'T', 1._wp, zten_i, 'T', 1._wp, &
752         &                                  zs1     , 'T', 1._wp, zs2    , 'T', 1._wp, zs12    , 'F', 1._wp )
753     
754      ! --- Store the stress tensor for the next time step --- !
755      pstress1_i (:,:) = zs1 (:,:)
756      pstress2_i (:,:) = zs2 (:,:)
757      pstress12_i(:,:) = zs12(:,:)
758      !
759
760      !------------------------------------------------------------------------------!
761      ! 5) diagnostics
762      !------------------------------------------------------------------------------!
763      ! --- ice-ocean, ice-atm. & ice-oceanbottom(landfast) stresses --- !
764      IF(  iom_use('utau_oi') .OR. iom_use('vtau_oi') .OR. iom_use('utau_ai') .OR. iom_use('vtau_ai') .OR. &
765         & iom_use('utau_bi') .OR. iom_use('vtau_bi') ) THEN
766         !
767         CALL lbc_lnk_multi( 'icedyn_rhg_evp', ztaux_oi, 'U', -1.0_wp, ztauy_oi, 'V', -1.0_wp, ztaux_ai, 'U', -1.0_wp, ztauy_ai, 'V', -1.0_wp, &
768            &                                  ztaux_bi, 'U', -1.0_wp, ztauy_bi, 'V', -1.0_wp )
769         !
770         CALL iom_put( 'utau_oi' , ztaux_oi * zmsk00 )
771         CALL iom_put( 'vtau_oi' , ztauy_oi * zmsk00 )
772         CALL iom_put( 'utau_ai' , ztaux_ai * zmsk00 )
773         CALL iom_put( 'vtau_ai' , ztauy_ai * zmsk00 )
774         CALL iom_put( 'utau_bi' , ztaux_bi * zmsk00 )
775         CALL iom_put( 'vtau_bi' , ztauy_bi * zmsk00 )
776      ENDIF
777       
778      ! --- divergence, shear and strength --- !
779      IF( iom_use('icediv') )   CALL iom_put( 'icediv' , pdivu_i  * zmsk00 )   ! divergence
780      IF( iom_use('iceshe') )   CALL iom_put( 'iceshe' , pshear_i * zmsk00 )   ! shear
781      IF( iom_use('icestr') )   CALL iom_put( 'icestr' , strength * zmsk00 )   ! strength
782
783      ! --- Stress tensor invariants (SIMIP diags) --- !
784      IF( iom_use('normstr') .OR. iom_use('sheastr') ) THEN
785         !
786         ALLOCATE( zsig_I(jpi,jpj) , zsig_II(jpi,jpj) )
787         !         
788         DO_2D( 1, 1, 1, 1 )
789           
790            ! Ice stresses
791            ! sigma1, sigma2, sigma12 are some useful recombination of the stresses (Hunke and Dukowicz MWR 2002, Bouillon et al., OM2013)
792            ! These are NOT stress tensor components, neither stress invariants, neither stress principal components
793            ! I know, this can be confusing...
794            zfac             =   strength(ji,jj) / ( pdelta_i(ji,jj) + rn_creepl ) 
795            zsig1            =   zfac * ( pdivu_i(ji,jj) - pdelta_i(ji,jj) )
796            zsig2            =   zfac * z1_ecc2 * zten_i(ji,jj)
797            zsig12           =   zfac * z1_ecc2 * pshear_i(ji,jj)
798           
799            ! Stress invariants (sigma_I, sigma_II, Coon 1974, Feltham 2008)
800            zsig_I (ji,jj)   =   zsig1 * 0.5_wp                              ! 1st stress invariant, aka average normal stress, aka negative pressure
801            zsig_II(ji,jj)   =   SQRT ( zsig2 * zsig2 * 0.25_wp + zsig12 )   ! 2nd  ''       '', aka maximum shear stress
802               
803         END_2D         
804         !
805         ! Stress tensor invariants (normal and shear stress N/m) - SIMIP diags - definitions following Coon (1974) and Feltham (2008)
806         IF( iom_use('normstr') )   CALL iom_put( 'normstr', zsig_I (:,:) * zmsk00(:,:) ) ! Normal stress
807         IF( iom_use('sheastr') )   CALL iom_put( 'sheastr', zsig_II(:,:) * zmsk00(:,:) ) ! Maximum shear stress
808         
809         DEALLOCATE ( zsig_I, zsig_II )
810         
811      ENDIF
812
813      ! --- Normalized stress tensor principal components --- !
814      ! This are used to plot the normalized yield curve, see Lemieux & Dupont, 2020
815      ! Recommendation 1 : we use ice strength, not replacement pressure
816      ! Recommendation 2 : need to use deformations at PREVIOUS iterate for viscosities
817      IF( iom_use('sig1_pnorm') .OR. iom_use('sig2_pnorm') ) THEN
818         !
819         ALLOCATE( zsig1_p(jpi,jpj) , zsig2_p(jpi,jpj) , zsig_I(jpi,jpj) , zsig_II(jpi,jpj) )         
820         !         
821         DO_2D( 1, 1, 1, 1 )
822           
823            ! Ice stresses computed with **viscosities** (delta, p/delta) at **previous** iterates
824            !                        and **deformations** at current iterates
825            !                        following Lemieux & Dupont (2020)
826            zfac             =   zp_delt(ji,jj)
827            zsig1            =   zfac * ( pdivu_i(ji,jj) - ( zdelta(ji,jj) + rn_creepl ) )
828            zsig2            =   zfac * z1_ecc2 * zten_i(ji,jj)
829            zsig12           =   zfac * z1_ecc2 * pshear_i(ji,jj)
830           
831            ! Stress invariants (sigma_I, sigma_II, Coon 1974, Feltham 2008), T-point
832            zsig_I(ji,jj)    =   zsig1 * 0.5_wp                              ! 1st stress invariant, aka average normal stress, aka negative pressure
833            zsig_II(ji,jj)   =   SQRT ( zsig2 * zsig2 * 0.25_wp + zsig12 )   ! 2nd  ''       '', aka maximum shear stress
834           
835            ! Normalized  principal stresses (used to display the ellipse)
836            z1_strength      =   1._wp / MAX( 1._wp, strength(ji,jj) )
837            zsig1_p(ji,jj)   =   ( zsig_I(ji,jj) + zsig_II(ji,jj) ) * z1_strength
838            zsig2_p(ji,jj)   =   ( zsig_I(ji,jj) - zsig_II(ji,jj) ) * z1_strength
839         END_2D             
840         !
841         CALL iom_put( 'sig1_pnorm' , zsig1_p ) 
842         CALL iom_put( 'sig2_pnorm' , zsig2_p ) 
843
844         DEALLOCATE( zsig1_p , zsig2_p , zsig_I, zsig_II )
845         
846      ENDIF
847
848      ! --- SIMIP --- !
849      IF(  iom_use('dssh_dx') .OR. iom_use('dssh_dy') .OR. &
850         & iom_use('corstrx') .OR. iom_use('corstry') .OR. iom_use('intstrx') .OR. iom_use('intstry') ) THEN
851         !
852         CALL lbc_lnk_multi( 'icedyn_rhg_evp', zspgU, 'U', -1.0_wp, zspgV, 'V', -1.0_wp, &
853            &                                  zCorU, 'U', -1.0_wp, zCorV, 'V', -1.0_wp, zfU, 'U', -1.0_wp, zfV, 'V', -1.0_wp )
854
855         CALL iom_put( 'dssh_dx' , zspgU * zmsk00 )   ! Sea-surface tilt term in force balance (x)
856         CALL iom_put( 'dssh_dy' , zspgV * zmsk00 )   ! Sea-surface tilt term in force balance (y)
857         CALL iom_put( 'corstrx' , zCorU * zmsk00 )   ! Coriolis force term in force balance (x)
858         CALL iom_put( 'corstry' , zCorV * zmsk00 )   ! Coriolis force term in force balance (y)
859         CALL iom_put( 'intstrx' , zfU   * zmsk00 )   ! Internal force term in force balance (x)
860         CALL iom_put( 'intstry' , zfV   * zmsk00 )   ! Internal force term in force balance (y)
861      ENDIF
862
863      IF(  iom_use('xmtrpice') .OR. iom_use('ymtrpice') .OR. &
864         & iom_use('xmtrpsnw') .OR. iom_use('ymtrpsnw') .OR. iom_use('xatrp') .OR. iom_use('yatrp') ) THEN
865         !
866         ALLOCATE( zdiag_xmtrp_ice(jpi,jpj) , zdiag_ymtrp_ice(jpi,jpj) , &
867            &      zdiag_xmtrp_snw(jpi,jpj) , zdiag_ymtrp_snw(jpi,jpj) , zdiag_xatrp(jpi,jpj) , zdiag_yatrp(jpi,jpj) )
868         !
869         DO_2D( 0, 0, 0, 0 )
870            ! 2D ice mass, snow mass, area transport arrays (X, Y)
871            zfac_x = 0.5 * u_ice(ji,jj) * e2u(ji,jj) * zmsk00(ji,jj)
872            zfac_y = 0.5 * v_ice(ji,jj) * e1v(ji,jj) * zmsk00(ji,jj)
873
874            zdiag_xmtrp_ice(ji,jj) = rhoi * zfac_x * ( vt_i(ji+1,jj) + vt_i(ji,jj) ) ! ice mass transport, X-component
875            zdiag_ymtrp_ice(ji,jj) = rhoi * zfac_y * ( vt_i(ji,jj+1) + vt_i(ji,jj) ) !        ''           Y-   ''
876
877            zdiag_xmtrp_snw(ji,jj) = rhos * zfac_x * ( vt_s(ji+1,jj) + vt_s(ji,jj) ) ! snow mass transport, X-component
878            zdiag_ymtrp_snw(ji,jj) = rhos * zfac_y * ( vt_s(ji,jj+1) + vt_s(ji,jj) ) !          ''          Y-   ''
879
880            zdiag_xatrp(ji,jj)     = zfac_x * ( at_i(ji+1,jj) + at_i(ji,jj) )        ! area transport,      X-component
881            zdiag_yatrp(ji,jj)     = zfac_y * ( at_i(ji,jj+1) + at_i(ji,jj) )        !        ''            Y-   ''
882
883         END_2D
884
885         CALL lbc_lnk_multi( 'icedyn_rhg_evp', zdiag_xmtrp_ice, 'U', -1.0_wp, zdiag_ymtrp_ice, 'V', -1.0_wp, &
886            &                                  zdiag_xmtrp_snw, 'U', -1.0_wp, zdiag_ymtrp_snw, 'V', -1.0_wp, &
887            &                                  zdiag_xatrp    , 'U', -1.0_wp, zdiag_yatrp    , 'V', -1.0_wp )
888
889         CALL iom_put( 'xmtrpice' , zdiag_xmtrp_ice )   ! X-component of sea-ice mass transport (kg/s)
890         CALL iom_put( 'ymtrpice' , zdiag_ymtrp_ice )   ! Y-component of sea-ice mass transport
891         CALL iom_put( 'xmtrpsnw' , zdiag_xmtrp_snw )   ! X-component of snow mass transport (kg/s)
892         CALL iom_put( 'ymtrpsnw' , zdiag_ymtrp_snw )   ! Y-component of snow mass transport
893         CALL iom_put( 'xatrp'    , zdiag_xatrp     )   ! X-component of ice area transport
894         CALL iom_put( 'yatrp'    , zdiag_yatrp     )   ! Y-component of ice area transport
895
896         DEALLOCATE( zdiag_xmtrp_ice , zdiag_ymtrp_ice , &
897            &        zdiag_xmtrp_snw , zdiag_ymtrp_snw , zdiag_xatrp , zdiag_yatrp )
898
899      ENDIF
900      !
901      ! --- convergence tests --- !
902      IF( nn_rhg_chkcvg == 1 .OR. nn_rhg_chkcvg == 2 ) THEN
903         IF( iom_use('uice_cvg') ) THEN
904            IF( ln_aEVP ) THEN   ! output: beta * ( u(t=nn_nevp) - u(t=nn_nevp-1) )
905               CALL iom_put( 'uice_cvg', MAX( ABS( u_ice(:,:) - zu_ice(:,:) ) * zbeta(:,:) * umask(:,:,1) , &
906                  &                           ABS( v_ice(:,:) - zv_ice(:,:) ) * zbeta(:,:) * vmask(:,:,1) ) * zmsk15(:,:) )
907            ELSE                 ! output: nn_nevp * ( u(t=nn_nevp) - u(t=nn_nevp-1) )
908               CALL iom_put( 'uice_cvg', REAL( nn_nevp ) * MAX( ABS( u_ice(:,:) - zu_ice(:,:) ) * umask(:,:,1) , &
909                  &                                             ABS( v_ice(:,:) - zv_ice(:,:) ) * vmask(:,:,1) ) * zmsk15(:,:) )
910            ENDIF
911         ENDIF
912      ENDIF     
913      !
914      DEALLOCATE( zmsk00, zmsk15 )
915      !
916   END SUBROUTINE ice_dyn_rhg_evp
917
918
919   SUBROUTINE rhg_cvg( kt, kiter, kitermax, pu, pv, pub, pvb )
920      !!----------------------------------------------------------------------
921      !!                    ***  ROUTINE rhg_cvg  ***
922      !!                     
923      !! ** Purpose :   check convergence of oce rheology
924      !!
925      !! ** Method  :   create a file ice_cvg.nc containing the convergence of ice velocity
926      !!                during the sub timestepping of rheology so as:
927      !!                  uice_cvg = MAX( u(t+1) - u(t) , v(t+1) - v(t) )
928      !!                This routine is called every sub-iteration, so it is cpu expensive
929      !!
930      !! ** Note    :   for the first sub-iteration, uice_cvg is set to 0 (too large otherwise)   
931      !!----------------------------------------------------------------------
932      INTEGER ,                 INTENT(in) ::   kt, kiter, kitermax       ! ocean time-step index
933      REAL(wp), DIMENSION(:,:), INTENT(in) ::   pu, pv, pub, pvb          ! now and before velocities
934      !!
935      INTEGER           ::   it, idtime, istatus
936      INTEGER           ::   ji, jj          ! dummy loop indices
937      REAL(wp)          ::   zresm           ! local real
938      CHARACTER(len=20) ::   clname
939      REAL(wp), DIMENSION(jpi,jpj) ::   zres           ! check convergence
940      !!----------------------------------------------------------------------
941
942      ! create file
943      IF( kt == nit000 .AND. kiter == 1 ) THEN
944         !
945         IF( lwp ) THEN
946            WRITE(numout,*)
947            WRITE(numout,*) 'rhg_cvg : ice rheology convergence control'
948            WRITE(numout,*) '~~~~~~~'
949         ENDIF
950         !
951         IF( lwm ) THEN
952            clname = 'ice_cvg.nc'
953            IF( .NOT. Agrif_Root() )   clname = TRIM(Agrif_CFixed())//"_"//TRIM(clname)
954            istatus = NF90_CREATE( TRIM(clname), NF90_CLOBBER, ncvgid )
955            istatus = NF90_DEF_DIM( ncvgid, 'time'  , NF90_UNLIMITED, idtime )
956            istatus = NF90_DEF_VAR( ncvgid, 'uice_cvg', NF90_DOUBLE   , (/ idtime /), nvarid )
957            istatus = NF90_ENDDEF(ncvgid)
958         ENDIF
959         !
960      ENDIF
961
962      ! time
963      it = ( kt - 1 ) * kitermax + kiter
964     
965      ! convergence
966      IF( kiter == 1 ) THEN ! remove the first iteration for calculations of convergence (always very large)
967         zresm = 0._wp
968      ELSE
969         DO_2D( 1, 1, 1, 1 )
970            zres(ji,jj) = MAX( ABS( pu(ji,jj) - pub(ji,jj) ) * umask(ji,jj,1), &
971               &               ABS( pv(ji,jj) - pvb(ji,jj) ) * vmask(ji,jj,1) ) * zmsk15(ji,jj)
972         END_2D
973         zresm = MAXVAL( zres )
974         CALL mpp_max( 'icedyn_rhg_evp', zresm )   ! max over the global domain
975      ENDIF
976
977      IF( lwm ) THEN
978         ! write variables
979         istatus = NF90_PUT_VAR( ncvgid, nvarid, (/zresm/), (/it/), (/1/) )
980         ! close file
981         IF( kt == nitend - nn_fsbc + 1 )   istatus = NF90_CLOSE(ncvgid)
982      ENDIF
983     
984   END SUBROUTINE rhg_cvg
985
986
987   SUBROUTINE rhg_evp_rst( cdrw, kt )
988      !!---------------------------------------------------------------------
989      !!                   ***  ROUTINE rhg_evp_rst  ***
990      !!                     
991      !! ** Purpose :   Read or write RHG file in restart file
992      !!
993      !! ** Method  :   use of IOM library
994      !!----------------------------------------------------------------------
995      CHARACTER(len=*) , INTENT(in) ::   cdrw   ! "READ"/"WRITE" flag
996      INTEGER, OPTIONAL, INTENT(in) ::   kt     ! ice time-step
997      !
998      INTEGER  ::   iter            ! local integer
999      INTEGER  ::   id1, id2, id3   ! local integers
1000      !!----------------------------------------------------------------------
1001      !
1002      IF( TRIM(cdrw) == 'READ' ) THEN        ! Read/initialize
1003         !                                   ! ---------------
1004         IF( ln_rstart ) THEN                   !* Read the restart file
1005            !
1006            id1 = iom_varid( numrir, 'stress1_i' , ldstop = .FALSE. )
1007            id2 = iom_varid( numrir, 'stress2_i' , ldstop = .FALSE. )
1008            id3 = iom_varid( numrir, 'stress12_i', ldstop = .FALSE. )
1009            !
1010            IF( MIN( id1, id2, id3 ) > 0 ) THEN      ! fields exist
1011               CALL iom_get( numrir, jpdom_auto, 'stress1_i' , stress1_i , cd_type = 'T' )
1012               CALL iom_get( numrir, jpdom_auto, 'stress2_i' , stress2_i , cd_type = 'T' )
1013               CALL iom_get( numrir, jpdom_auto, 'stress12_i', stress12_i, cd_type = 'F' )
1014            ELSE                                     ! start rheology from rest
1015               IF(lwp) WRITE(numout,*)
1016               IF(lwp) WRITE(numout,*) '   ==>>>   previous run without rheology, set stresses to 0'
1017               stress1_i (:,:) = 0._wp
1018               stress2_i (:,:) = 0._wp
1019               stress12_i(:,:) = 0._wp
1020            ENDIF
1021         ELSE                                   !* Start from rest
1022            IF(lwp) WRITE(numout,*)
1023            IF(lwp) WRITE(numout,*) '   ==>>>   start from rest: set stresses to 0'
1024            stress1_i (:,:) = 0._wp
1025            stress2_i (:,:) = 0._wp
1026            stress12_i(:,:) = 0._wp
1027         ENDIF
1028         !
1029      ELSEIF( TRIM(cdrw) == 'WRITE' ) THEN   ! Create restart file
1030         !                                   ! -------------------
1031         IF(lwp) WRITE(numout,*) '---- rhg-rst ----'
1032         iter = kt + nn_fsbc - 1             ! ice restarts are written at kt == nitrst - nn_fsbc + 1
1033         !
1034         CALL iom_rstput( iter, nitrst, numriw, 'stress1_i' , stress1_i  )
1035         CALL iom_rstput( iter, nitrst, numriw, 'stress2_i' , stress2_i  )
1036         CALL iom_rstput( iter, nitrst, numriw, 'stress12_i', stress12_i )
1037         !
1038      ENDIF
1039      !
1040   END SUBROUTINE rhg_evp_rst
1041
1042   
1043#else
1044   !!----------------------------------------------------------------------
1045   !!   Default option         Empty module           NO SI3 sea-ice model
1046   !!----------------------------------------------------------------------
1047#endif
1048
1049   !!==============================================================================
1050END MODULE icedyn_rhg_evp
Note: See TracBrowser for help on using the repository browser.