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 @ 15148

Last change on this file since 15148 was 15062, checked in by jchanut, 3 years ago

Suppress time varying scale factors and depths declarations with key_qco and key_linssh. Remove spaces that preclude from correct replacement of some scale factor arrays during preprocessing stage (at least with Apple clang version 11.0.3, this is problem).

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