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/tests/ICE_RHEO/MY_SRC – NEMO

source: NEMO/trunk/tests/ICE_RHEO/MY_SRC/icedyn_rhg_evp.F90

Last change on this file was 15026, checked in by smasson, 3 years ago

trunk: missing part in [15014] for tests, #2693

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