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

source: NEMO/trunk/src/ICE/icedyn_rhg_eap.F90 @ 15014

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

trunk: simplify F point halo computation, #2693

File size: 93.2 KB
Line 
1MODULE icedyn_rhg_eap
2   !!======================================================================
3   !!                     ***  MODULE  icedyn_rhg_eap  ***
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   !!                 !  2019     (S. Rynders, Y. Aksenov, C. Rousset)  change into eap rheology from
16   !!                                           CICE code (Tsamados, Heorton)
17   !!----------------------------------------------------------------------
18#if defined key_si3
19   !!----------------------------------------------------------------------
20   !!   'key_si3'                                       SI3 sea-ice model
21   !!----------------------------------------------------------------------
22   !!   ice_dyn_rhg_eap : computes ice velocities from EVP rheology
23   !!   rhg_eap_rst     : read/write EVP fields in ice restart
24   !!----------------------------------------------------------------------
25   USE phycst         ! Physical constant
26   USE dom_oce        ! Ocean domain
27   USE sbc_oce , ONLY : ln_ice_embd, nn_fsbc, ssh_m
28   USE sbc_ice , ONLY : utau_ice, vtau_ice, snwice_mass, snwice_mass_b
29   USE ice            ! sea-ice: ice variables
30   USE icevar         ! ice_var_sshdyn
31   USE icedyn_rdgrft  ! sea-ice: ice strength
32   USE bdy_oce , ONLY : ln_bdy
33   USE bdyice
34#if defined key_agrif
35   USE agrif_ice_interp
36#endif
37   !
38   USE in_out_manager ! I/O manager
39   USE iom            ! I/O manager library
40   USE lib_mpp        ! MPP library
41   USE lib_fortran    ! fortran utilities (glob_sum + no signed zero)
42   USE lbclnk         ! lateral boundary conditions (or mpp links)
43   USE prtctl         ! Print control
44
45   USE netcdf         ! NetCDF library for convergence test
46   IMPLICIT NONE
47   PRIVATE
48
49   PUBLIC   ice_dyn_rhg_eap   ! called by icedyn_rhg.F90
50   PUBLIC   rhg_eap_rst       ! called by icedyn_rhg.F90
51
52   REAL(wp), PARAMETER ::   pphi = 3.141592653589793_wp/12._wp    ! diamond shaped floe smaller angle (default phi = 30 deg)
53
54   ! look-up table for calculating structure tensor
55   INTEGER, PARAMETER ::   nx_yield = 41
56   INTEGER, PARAMETER ::   ny_yield = 41
57   INTEGER, PARAMETER ::   na_yield = 21
58
59   REAL(wp), DIMENSION(nx_yield, ny_yield, na_yield) ::   s11r, s12r, s22r, s11s, s12s, s22s
60   REAL(wp), DIMENSION(:,:), ALLOCATABLE ::   fimask   ! mask at F points for the ice
61
62   !! for convergence tests
63   INTEGER ::   ncvgid   ! netcdf file id
64   INTEGER ::   nvarid   ! netcdf variable id
65
66   !! * Substitutions
67#  include "do_loop_substitute.h90"
68   !!----------------------------------------------------------------------
69   !! NEMO/ICE 4.0 , NEMO Consortium (2018)
70   !! $Id: icedyn_rhg_eap.F90 11536 2019-09-11 13:54:18Z smasson $
71   !! Software governed by the CeCILL license (see ./LICENSE)
72   !!----------------------------------------------------------------------
73CONTAINS
74
75   SUBROUTINE ice_dyn_rhg_eap( kt, Kmm, pstress1_i, pstress2_i, pstress12_i, pshear_i, pdivu_i, pdelta_i, paniso_11, paniso_12, prdg_conv )
76      !!-------------------------------------------------------------------
77      !!                 ***  SUBROUTINE ice_dyn_rhg_eap  ***
78      !!                             EAP-C-grid
79      !!
80      !! ** purpose : determines sea ice drift from wind stress, ice-ocean
81      !!  stress and sea-surface slope. Ice-ice interaction is described by
82      !!  a non-linear elasto-anisotropic-plastic (EAP) law including shear
83      !!  strength and a bulk rheology .
84      !!
85      !!  The points in the C-grid look like this, dear reader
86      !!
87      !!                              (ji,jj)
88      !!                                 |
89      !!                                 |
90      !!                      (ji-1,jj)  |  (ji,jj)
91      !!                             ---------
92      !!                            |         |
93      !!                            | (ji,jj) |------(ji,jj)
94      !!                            |         |
95      !!                             ---------
96      !!                     (ji-1,jj-1)     (ji,jj-1)
97      !!
98      !! ** Inputs  : - wind forcing (stress), oceanic currents
99      !!                ice total volume (vt_i) per unit area
100      !!                snow total volume (vt_s) per unit area
101      !!
102      !! ** Action  : - compute u_ice, v_ice : the components of the
103      !!                sea-ice velocity vector
104      !!              - compute delta_i, shear_i, divu_i, which are inputs
105      !!                of the ice thickness distribution
106      !!
107      !! ** Steps   : 0) compute mask at F point
108      !!              1) Compute ice snow mass, ice strength
109      !!              2) Compute wind, oceanic stresses, mass terms and
110      !!                 coriolis terms of the momentum equation
111      !!              3) Solve the momentum equation (iterative procedure)
112      !!              4) Recompute delta, shear and divergence
113      !!                 (which are inputs of the ITD) & store stress
114      !!                 for the next time step
115      !!              5) Diagnostics including charge ellipse
116      !!
117      !! ** Notes   : There is the possibility to use aEVP from the nice work of Kimmritz et al. (2016 & 2017)
118      !!              by setting up ln_aEVP=T (i.e. changing alpha and beta parameters).
119      !!              This is an upgraded version of mEVP from Bouillon et al. 2013
120      !!              (i.e. more stable and better convergence)
121      !!
122      !! References : Hunke and Dukowicz, JPO97
123      !!              Bouillon et al., Ocean Modelling 2009
124      !!              Bouillon et al., Ocean Modelling 2013
125      !!              Kimmritz et al., Ocean Modelling 2016 & 2017
126      !!-------------------------------------------------------------------
127      INTEGER                 , INTENT(in   ) ::   kt                                    ! time step
128      INTEGER                 , INTENT(in   ) ::   Kmm                                   ! ocean time level index
129      REAL(wp), DIMENSION(:,:), INTENT(inout) ::   pstress1_i, pstress2_i, pstress12_i   !
130      REAL(wp), DIMENSION(:,:), INTENT(  out) ::   pshear_i  , pdivu_i   , pdelta_i      !
131      REAL(wp), DIMENSION(:,:), INTENT(inout) ::   paniso_11 , paniso_12                 ! structure tensor components
132      REAL(wp), DIMENSION(:,:), INTENT(inout) ::   prdg_conv                             ! for ridging
133      !!
134      INTEGER ::   ji, jj       ! dummy loop indices
135      INTEGER ::   jter         ! local integers
136      !
137      REAL(wp) ::   zrhoco                                              ! rau0 * rn_cio
138      REAL(wp) ::   zdtevp, z1_dtevp                                    ! time step for subcycling
139      REAL(wp) ::   ecc2, z1_ecc2                                       ! square of yield ellipse eccenticity
140      REAL(wp) ::   zalph1, z1_alph1, zalph2, z1_alph2                  ! alpha coef from Bouillon 2009 or Kimmritz 2017
141      REAl(wp) ::   zbetau, zbetav
142      REAL(wp) ::   zm1, zm2, zm3, zmassU, zmassV, zvU, zvV             ! ice/snow mass and volume
143      REAL(wp) ::   zds2, zdt, zdt2, zdiv, zdiv2, zdsT                  ! temporary scalars
144      REAL(wp) ::   zTauO, zTauB, zRHS, zvel                            ! temporary scalars
145      REAL(wp) ::   zkt                                                 ! isotropic tensile strength for landfast ice
146      REAL(wp) ::   zvCr                                                ! critical ice volume above which ice is landfast
147      !
148      REAL(wp) ::   zintb, zintn                                        ! dummy argument
149      REAL(wp) ::   zfac_x, zfac_y
150      REAL(wp) ::   zshear, zdum1, zdum2
151      REAL(wp) ::   zstressptmp, zstressmtmp, zstress12tmpF             ! anisotropic stress tensor components
152      REAL(wp) ::   zalphar, zalphas                                    ! for mechanical redistribution
153      REAL(wp) ::   zmresult11, zmresult12, z1dtevpkth, zp5kth, z1_dtevp_A  ! for structure tensor evolution
154      !
155      REAL(wp), DIMENSION(jpi,jpj) ::   zstress12tmp                    ! anisotropic stress tensor component for regridding
156      REAL(wp), DIMENSION(jpi,jpj) ::   zyield11, zyield22, zyield12    ! yield surface tensor for history
157      REAL(wp), DIMENSION(jpi,jpj) ::   zdelta, zp_delt                 ! delta and P/delta at T points
158      REAL(wp), DIMENSION(jpi,jpj) ::   zten_i                          ! tension
159      REAL(wp), DIMENSION(jpi,jpj) ::   zbeta                           ! beta coef from Kimmritz 2017
160      !
161      REAL(wp), DIMENSION(jpi,jpj) ::   zdt_m                           ! (dt / ice-snow_mass) on T points
162      REAL(wp), DIMENSION(jpi,jpj) ::   zaU  , zaV                      ! ice fraction on U/V points
163      REAL(wp), DIMENSION(jpi,jpj) ::   zmU_t, zmV_t                    ! (ice-snow_mass / dt) on U/V points
164      REAL(wp), DIMENSION(jpi,jpj) ::   zmf                             ! coriolis parameter at T points
165      REAL(wp), DIMENSION(jpi,jpj) ::   v_oceU, u_oceV, v_iceU, u_iceV  ! ocean/ice u/v component on V/U points
166      !
167      REAL(wp), DIMENSION(jpi,jpj) ::   zds                             ! shear
168      REAL(wp), DIMENSION(jpi,jpj) ::   zs1, zs2, zs12                  ! stress tensor components
169      REAL(wp), DIMENSION(jpi,jpj) ::   zsshdyn                         ! array used for the calculation of ice surface slope:
170      !                                                                 !    ocean surface (ssh_m) if ice is not embedded
171      !                                                                 !    ice bottom surface if ice is embedded
172      REAL(wp), DIMENSION(jpi,jpj) ::   zfU  , zfV                      ! internal stresses
173      REAL(wp), DIMENSION(jpi,jpj) ::   zspgU, zspgV                    ! surface pressure gradient at U/V points
174      REAL(wp), DIMENSION(jpi,jpj) ::   zCorU, zCorV                    ! Coriolis stress array
175      REAL(wp), DIMENSION(jpi,jpj) ::   ztaux_ai, ztauy_ai              ! ice-atm. stress at U-V points
176      REAL(wp), DIMENSION(jpi,jpj) ::   ztaux_oi, ztauy_oi              ! ice-ocean stress at U-V points
177      REAL(wp), DIMENSION(jpi,jpj) ::   ztaux_bi, ztauy_bi              ! ice-OceanBottom stress at U-V points (landfast)
178      REAL(wp), DIMENSION(jpi,jpj) ::   ztaux_base, ztauy_base          ! ice-bottom stress at U-V points (landfast)
179      !
180      REAL(wp), DIMENSION(jpi,jpj) ::   zmsk00, zmsk15
181      REAL(wp), DIMENSION(jpi,jpj) ::   zmsk01x, zmsk01y                ! dummy arrays
182      REAL(wp), DIMENSION(jpi,jpj) ::   zmsk00x, zmsk00y                ! mask for ice presence
183
184      REAL(wp), PARAMETER          ::   zepsi  = 1.0e-20_wp             ! tolerance parameter
185      REAL(wp), PARAMETER          ::   zmmin  = 1._wp                  ! ice mass (kg/m2)  below which ice velocity becomes very small
186      REAL(wp), PARAMETER          ::   zamin  = 0.001_wp               ! ice concentration below which ice velocity becomes very small
187      !! --- check convergence
188      REAL(wp), DIMENSION(jpi,jpj) ::   zu_ice, zv_ice
189      !! --- diags
190      REAL(wp) ::   zsig1, zsig2, zsig12, zfac, z1_strength
191      REAL(wp), ALLOCATABLE, DIMENSION(:,:) ::   zsig_I, zsig_II, zsig1_p, zsig2_p
192      !! --- SIMIP diags
193      REAL(wp), ALLOCATABLE, DIMENSION(:,:) ::   zdiag_xmtrp_ice ! X-component of ice mass transport (kg/s)
194      REAL(wp), ALLOCATABLE, DIMENSION(:,:) ::   zdiag_ymtrp_ice ! Y-component of ice mass transport (kg/s)
195      REAL(wp), ALLOCATABLE, DIMENSION(:,:) ::   zdiag_xmtrp_snw ! X-component of snow mass transport (kg/s)
196      REAL(wp), ALLOCATABLE, DIMENSION(:,:) ::   zdiag_ymtrp_snw ! Y-component of snow mass transport (kg/s)
197      REAL(wp), ALLOCATABLE, DIMENSION(:,:) ::   zdiag_xatrp     ! X-component of area transport (m2/s)
198      REAL(wp), ALLOCATABLE, DIMENSION(:,:) ::   zdiag_yatrp     ! Y-component of area transport (m2/s)
199      !!-------------------------------------------------------------------
200
201      IF( kt == nit000 .AND. lwp )   WRITE(numout,*) '-- ice_dyn_rhg_eap: EAP sea-ice rheology'
202      !
203      ! for diagnostics and convergence tests
204      DO_2D( 1, 1, 1, 1 )
205         zmsk00(ji,jj) = MAX( 0._wp , SIGN( 1._wp , at_i(ji,jj) - epsi06  ) ) ! 1 if ice    , 0 if no ice
206      END_2D
207      IF( nn_rhg_chkcvg > 0 ) THEN
208         DO_2D( 1, 1, 1, 1 )
209            zmsk15(ji,jj) = MAX( 0._wp , SIGN( 1._wp , at_i(ji,jj) - 0.15_wp ) ) ! 1 if 15% ice, 0 if less
210         END_2D
211      ENDIF
212      !
213      !------------------------------------------------------------------------------!
214      ! 0) mask at F points for the ice
215      !------------------------------------------------------------------------------!
216      IF( kt == nit000 ) THEN
217         ! ocean/land mask
218         ALLOCATE( fimask(jpi,jpj) )
219         IF( rn_ishlat == 0._wp ) THEN
220            DO_2D( 0, 0, 0, 0 )
221               fimask(ji,jj) = tmask(ji,jj,1) * tmask(ji+1,jj,1) * tmask(ji,jj+1,1) * tmask(ji+1,jj+1,1)
222            END_2D
223         ELSE
224            DO_2D( 0, 0, 0, 0 )
225               fimask(ji,jj) = tmask(ji,jj,1) * tmask(ji+1,jj,1) * tmask(ji,jj+1,1) * tmask(ji+1,jj+1,1)
226               ! Lateral boundary conditions on velocity (modify fimask)
227               IF( fimask(ji,jj) == 0._wp ) THEN
228                  fimask(ji,jj) = rn_ishlat * MIN( 1._wp , MAX( umask(ji,jj,1), umask(ji,jj+1,1), &
229                     &                                          vmask(ji,jj,1), vmask(ji+1,jj,1) ) )
230               ENDIF
231            END_2D
232         ENDIF
233         CALL lbc_lnk( 'icedyn_rhg_eap', fimask, 'F', 1.0_wp )
234      ENDIF
235
236      !------------------------------------------------------------------------------!
237      ! 1) define some variables and initialize arrays
238      !------------------------------------------------------------------------------!
239      zrhoco = rho0 * rn_cio
240
241      ! ecc2: square of yield ellipse eccenticrity
242      ecc2    = rn_ecc * rn_ecc
243      z1_ecc2 = 1._wp / ecc2
244
245      ! alpha parameters (Bouillon 2009)
246      IF( .NOT. ln_aEVP ) THEN
247         zdtevp   = rDt_ice / REAL( nn_nevp )
248         zalph1 =   2._wp * rn_relast * REAL( nn_nevp )
249         zalph2 = zalph1 * z1_ecc2
250
251         z1_alph1 = 1._wp / ( zalph1 + 1._wp )
252         z1_alph2 = 1._wp / ( zalph2 + 1._wp )
253      ELSE
254         zdtevp   = rdt_ice
255         ! zalpha parameters set later on adaptatively
256      ENDIF
257      z1_dtevp = 1._wp / zdtevp
258
259      ! Initialise stress tensor
260      zs1 (:,:) = pstress1_i (:,:)
261      zs2 (:,:) = pstress2_i (:,:)
262      zs12(:,:) = pstress12_i(:,:)
263
264      ! constants for structure tensor
265      z1_dtevp_A = z1_dtevp/10.0_wp
266      z1dtevpkth = 1._wp / (z1_dtevp_A + 0.00002_wp)
267      zp5kth = 0.5_wp * 0.00002_wp
268
269      ! Ice strength
270      CALL ice_strength
271
272      ! landfast param from Lemieux(2016): add isotropic tensile strength (following Konig Beatty and Holland, 2010)
273      IF( ln_landfast_L16 ) THEN   ;   zkt = rn_lf_tensile
274      ELSE                         ;   zkt = 0._wp
275      ENDIF
276      !
277      !------------------------------------------------------------------------------!
278      ! 2) Wind / ocean stress, mass terms, coriolis terms
279      !------------------------------------------------------------------------------!
280      ! sea surface height
281      !    embedded sea ice: compute representative ice top surface
282      !    non-embedded sea ice: use ocean surface for slope calculation
283      zsshdyn(:,:) = ice_var_sshdyn( ssh_m, snwice_mass, snwice_mass_b)
284
285      DO_2D( 0, 0, 0, 0 )
286
287         ! ice fraction at U-V points
288         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)
289         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)
290
291         ! Ice/snow mass at U-V points
292         zm1 = ( rhos * vt_s(ji  ,jj  ) + rhoi * vt_i(ji  ,jj  ) )
293         zm2 = ( rhos * vt_s(ji+1,jj  ) + rhoi * vt_i(ji+1,jj  ) )
294         zm3 = ( rhos * vt_s(ji  ,jj+1) + rhoi * vt_i(ji  ,jj+1) )
295         zmassU = 0.5_wp * ( zm1 * e1e2t(ji,jj) + zm2 * e1e2t(ji+1,jj) ) * r1_e1e2u(ji,jj) * umask(ji,jj,1)
296         zmassV = 0.5_wp * ( zm1 * e1e2t(ji,jj) + zm3 * e1e2t(ji,jj+1) ) * r1_e1e2v(ji,jj) * vmask(ji,jj,1)
297
298         ! Ocean currents at U-V points
299         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)
300         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)
301
302         ! Coriolis at T points (m*f)
303         zmf(ji,jj)      = zm1 * ff_t(ji,jj)
304
305         ! dt/m at T points (for alpha and beta coefficients)
306         zdt_m(ji,jj)    = zdtevp / MAX( zm1, zmmin )
307
308         ! m/dt
309         zmU_t(ji,jj)    = zmassU * z1_dtevp
310         zmV_t(ji,jj)    = zmassV * z1_dtevp
311
312         ! Drag ice-atm.
313         ztaux_ai(ji,jj) = zaU(ji,jj) * utau_ice(ji,jj)
314         ztauy_ai(ji,jj) = zaV(ji,jj) * vtau_ice(ji,jj)
315
316         ! Surface pressure gradient (- m*g*GRAD(ssh)) at U-V points
317         zspgU(ji,jj)    = - zmassU * grav * ( zsshdyn(ji+1,jj) - zsshdyn(ji,jj) ) * r1_e1u(ji,jj)
318         zspgV(ji,jj)    = - zmassV * grav * ( zsshdyn(ji,jj+1) - zsshdyn(ji,jj) ) * r1_e2v(ji,jj)
319
320         ! masks
321         zmsk00x(ji,jj) = 1._wp - MAX( 0._wp, SIGN( 1._wp, -zmassU ) )  ! 0 if no ice
322         zmsk00y(ji,jj) = 1._wp - MAX( 0._wp, SIGN( 1._wp, -zmassV ) )  ! 0 if no ice
323
324         ! switches
325         IF( zmassU <= zmmin .AND. zaU(ji,jj) <= zamin ) THEN   ;   zmsk01x(ji,jj) = 0._wp
326         ELSE                                                   ;   zmsk01x(ji,jj) = 1._wp   ;   ENDIF
327         IF( zmassV <= zmmin .AND. zaV(ji,jj) <= zamin ) THEN   ;   zmsk01y(ji,jj) = 0._wp
328         ELSE                                                   ;   zmsk01y(ji,jj) = 1._wp   ;   ENDIF
329
330      END_2D
331      CALL lbc_lnk( 'icedyn_rhg_eap', zmf, 'T', 1.0_wp, zdt_m, 'T', 1.0_wp )
332      !
333      !                                  !== Landfast ice parameterization ==!
334      !
335      IF( ln_landfast_L16 ) THEN         !-- Lemieux 2016
336         DO_2D( 0, 0, 0, 0 )
337            ! ice thickness at U-V points
338            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)
339            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)
340            ! ice-bottom stress at U points
341            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
342            ztaux_base(ji,jj) = - rn_lf_bfr * MAX( 0._wp, zvU - zvCr ) * EXP( -rn_crhg * ( 1._wp - zaU(ji,jj) ) )
343            ! ice-bottom stress at V points
344            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
345            ztauy_base(ji,jj) = - rn_lf_bfr * MAX( 0._wp, zvV - zvCr ) * EXP( -rn_crhg * ( 1._wp - zaV(ji,jj) ) )
346            ! ice_bottom stress at T points
347            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
348            tau_icebfr(ji,jj) = - rn_lf_bfr * MAX( 0._wp, vt_i(ji,jj) - zvCr ) * EXP( -rn_crhg * ( 1._wp - at_i(ji,jj) ) )
349         END_2D
350         CALL lbc_lnk( 'icedyn_rhg_eap', tau_icebfr(:,:), 'T', 1.0_wp )
351         !
352      ELSE                               !-- no landfast
353         DO_2D( 0, 0, 0, 0 )
354            ztaux_base(ji,jj) = 0._wp
355            ztauy_base(ji,jj) = 0._wp
356         END_2D
357      ENDIF
358
359      !------------------------------------------------------------------------------!
360      ! 3) Solution of the momentum equation, iterative procedure
361      !------------------------------------------------------------------------------!
362      !
363      !                                               ! ==================== !
364      DO jter = 1 , nn_nevp                           !    loop over jter    !
365         !                                            ! ==================== !
366         l_full_nf_update = jter == nn_nevp   ! false: disable full North fold update (performances) for iter = 1 to nn_nevp-1
367         !
368         ! convergence test
369         IF( nn_rhg_chkcvg == 1 .OR. nn_rhg_chkcvg == 2  ) THEN
370            DO_2D( nn_hls, nn_hls, nn_hls, nn_hls )
371               zu_ice(ji,jj) = u_ice(ji,jj) * umask(ji,jj,1) ! velocity at previous time step
372               zv_ice(ji,jj) = v_ice(ji,jj) * vmask(ji,jj,1)
373            END_2D
374         ENDIF
375
376         ! --- divergence, tension & shear (Appendix B of Hunke & Dukowicz, 2002) --- !
377         DO_2D( 1, 0, 1, 0 )
378
379            ! shear at F points
380            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)   &
381               &         + ( v_ice(ji+1,jj) * r1_e2v(ji+1,jj) - v_ice(ji,jj) * r1_e2v(ji,jj) ) * e2f(ji,jj) * e2f(ji,jj)   &
382               &         ) * r1_e1e2f(ji,jj) * fimask(ji,jj)
383
384         END_2D
385
386         DO_2D( 0, 0, 0, 0 )
387
388            ! shear**2 at T points (doc eq. A16)
389            zds2 = ( zds(ji,jj  ) * zds(ji,jj  ) * e1e2f(ji,jj  ) + zds(ji-1,jj  ) * zds(ji-1,jj  ) * e1e2f(ji-1,jj  )  &
390               &   + 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)  &
391               &   ) * 0.25_wp * r1_e1e2t(ji,jj)
392
393            ! divergence at T points
394            zdiv  = ( e2u(ji,jj) * u_ice(ji,jj) - e2u(ji-1,jj) * u_ice(ji-1,jj)   &
395               &    + e1v(ji,jj) * v_ice(ji,jj) - e1v(ji,jj-1) * v_ice(ji,jj-1)   &
396               &    ) * r1_e1e2t(ji,jj)
397            zdiv2 = zdiv * zdiv
398
399            ! tension at T points
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            zdt2 = zdt * zdt
404
405            ! delta at T points
406            zdelta(ji,jj) = SQRT( zdiv2 + ( zdt2 + zds2 ) * z1_ecc2 )
407
408         END_2D
409         CALL lbc_lnk( 'icedyn_rhg_eap', zdelta, 'T', 1.0_wp )
410
411         ! P/delta at T points
412         DO_2D( 1, 1, 1, 1 )
413            zp_delt(ji,jj) = strength(ji,jj) / ( zdelta(ji,jj) + rn_creepl )
414         END_2D
415
416         DO_2D( 0, 1, 0, 1 )   ! loop ends at jpi,jpj so that no lbc_lnk are needed for zs1 and zs2
417
418             ! shear at T points
419            zdsT = ( zds(ji,jj  ) * e1e2f(ji,jj  ) + zds(ji-1,jj  ) * e1e2f(ji-1,jj  )  &
420               &   + zds(ji,jj-1) * e1e2f(ji,jj-1) + zds(ji-1,jj-1) * e1e2f(ji-1,jj-1)  &
421               &   ) * 0.25_wp * r1_e1e2t(ji,jj)
422
423           ! divergence at T points (duplication to avoid communications)
424            zdiv  = ( e2u(ji,jj) * u_ice(ji,jj) - e2u(ji-1,jj) * u_ice(ji-1,jj)   &
425               &    + e1v(ji,jj) * v_ice(ji,jj) - e1v(ji,jj-1) * v_ice(ji,jj-1)   &
426               &    ) * r1_e1e2t(ji,jj)
427
428            ! tension at T points (duplication to avoid communications)
429            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)   &
430               &   - ( v_ice(ji,jj) * r1_e1v(ji,jj) - v_ice(ji,jj-1) * r1_e1v(ji,jj-1) ) * e1t(ji,jj) * e1t(ji,jj)   &
431               &   ) * r1_e1e2t(ji,jj)
432
433            ! --- anisotropic stress calculation --- !
434            CALL update_stress_rdg (jter, nn_nevp, zdiv, zdt, zdsT, paniso_11(ji,jj), paniso_12(ji,jj), &
435                                    zstressptmp, zstressmtmp, zstress12tmp(ji,jj), strength(ji,jj), zalphar, zalphas)
436
437            ! structure tensor update
438               CALL calc_ffrac(zstressptmp, zstressmtmp, zstress12tmp(ji,jj), paniso_11(ji,jj), paniso_12(ji,jj), zmresult11,  zmresult12)
439
440               paniso_11(ji,jj) = (paniso_11(ji,jj)  + 0.5*2.e-5*zdtevp + zmresult11*zdtevp) / (1. + 2.e-5*zdtevp) ! implicit
441               paniso_12(ji,jj) = (paniso_12(ji,jj)                     + zmresult12*zdtevp) / (1. + 2.e-5*zdtevp) ! implicit
442
443            IF (jter == nn_nevp) THEN
444               zyield11(ji,jj) = 0.5_wp * (zstressptmp + zstressmtmp)
445               zyield22(ji,jj) = 0.5_wp * (zstressptmp - zstressmtmp)
446               zyield12(ji,jj) = zstress12tmp(ji,jj)
447               prdg_conv(ji,jj) = -min( zalphar, 0._wp)
448            ENDIF
449
450            ! alpha for aEVP
451            !   gamma = 0.5*P/(delta+creepl) * (c*pi)**2/Area * dt/m
452            !   alpha = beta = sqrt(4*gamma)
453            IF( ln_aEVP ) THEN
454               zalph1   = MAX( 50._wp, rpi * SQRT( 0.5_wp * zp_delt(ji,jj) * r1_e1e2t(ji,jj) * zdt_m(ji,jj) ) )
455               z1_alph1 = 1._wp / ( zalph1 + 1._wp )
456               zalph2   = zalph1
457               z1_alph2 = z1_alph1
458               ! explicit:
459               ! z1_alph1 = 1._wp / zalph1
460               ! z1_alph2 = 1._wp / zalph1
461               ! zalph1 = zalph1 - 1._wp
462               ! zalph2 = zalph1
463            ENDIF
464
465            ! stress at T points (zkt/=0 if landfast)
466            zs1(ji,jj) = ( zs1(ji,jj) * zalph1 + zstressptmp ) * z1_alph1
467            zs2(ji,jj) = ( zs2(ji,jj) * zalph1 + zstressmtmp ) * z1_alph1
468         END_2D
469         CALL lbc_lnk( 'icedyn_rhg_eap', zstress12tmp, 'T', 1.0_wp , paniso_11, 'T', 1.0_wp , paniso_12, 'T', 1.0_wp)
470
471        ! Save beta at T-points for further computations
472         IF( ln_aEVP ) THEN
473            DO_2D( 1, 1, 1, 1 )
474               zbeta(ji,jj) = MAX( 50._wp, rpi * SQRT( 0.5_wp * zp_delt(ji,jj) * r1_e1e2t(ji,jj) * zdt_m(ji,jj) ) )
475            END_2D
476         ENDIF
477
478         DO_2D( 1, 0, 1, 0 )
479            ! stress12tmp at F points
480            zstress12tmpF = ( zstress12tmp(ji,jj+1) * e1e2t(ji,jj+1) + zstress12tmp(ji+1,jj+1) * e1e2t(ji+1,jj+1)  &
481               &            + zstress12tmp(ji,jj  ) * e1e2t(ji,jj  ) + zstress12tmp(ji+1,jj  ) * e1e2t(ji+1,jj  )  &
482               &            ) * 0.25_wp * r1_e1e2f(ji,jj)
483
484            ! alpha for aEVP
485            IF( ln_aEVP ) THEN
486               zalph2   = MAX( zbeta(ji,jj), zbeta(ji+1,jj), zbeta(ji,jj+1), zbeta(ji+1,jj+1) )
487               z1_alph2 = 1._wp / ( zalph2 + 1._wp )
488               ! explicit:
489               ! z1_alph2 = 1._wp / zalph2
490               ! zalph2 = zalph2 - 1._wp
491            ENDIF
492
493            ! stress at F points (zkt/=0 if landfast)
494            zs12(ji,jj) = ( zs12(ji,jj) * zalph1 + zstress12tmpF ) * z1_alph1
495
496         END_2D
497         CALL lbc_lnk( 'icedyn_rhg_eap', zs1, 'T', 1.0_wp, zs2, 'T', 1.0_wp, zs12, 'F', 1.0_wp )
498
499         ! --- Ice internal stresses (Appendix C of Hunke and Dukowicz, 2002) --- !
500         DO_2D( 0, 0, 0, 0 )
501            !                   !--- U points
502            zfU(ji,jj) = 0.5_wp * ( ( zs1(ji+1,jj) - zs1(ji,jj) ) * e2u(ji,jj)                                             &
503               &                  + ( zs2(ji+1,jj) * e2t(ji+1,jj) * e2t(ji+1,jj) - zs2(ji,jj) * e2t(ji,jj) * e2t(ji,jj)    &
504               &                    ) * r1_e2u(ji,jj)                                                                      &
505               &                  + ( zs12(ji,jj) * e1f(ji,jj) * e1f(ji,jj) - zs12(ji,jj-1) * e1f(ji,jj-1) * e1f(ji,jj-1)  &
506               &                    ) * 2._wp * r1_e1u(ji,jj)                                                              &
507               &                  ) * r1_e1e2u(ji,jj)
508            !
509            !                !--- V points
510            zfV(ji,jj) = 0.5_wp * ( ( zs1(ji,jj+1) - zs1(ji,jj) ) * e1v(ji,jj)                                             &
511               &                  - ( zs2(ji,jj+1) * e1t(ji,jj+1) * e1t(ji,jj+1) - zs2(ji,jj) * e1t(ji,jj) * e1t(ji,jj)    &
512               &                    ) * r1_e1v(ji,jj)                                                                      &
513               &                  + ( zs12(ji,jj) * e2f(ji,jj) * e2f(ji,jj) - zs12(ji-1,jj) * e2f(ji-1,jj) * e2f(ji-1,jj)  &
514               &                    ) * 2._wp * r1_e2v(ji,jj)                                                              &
515               &                  ) * r1_e1e2v(ji,jj)
516            !
517            !                !--- ice currents at U-V point
518            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)
519            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)
520            !
521         END_2D
522         !
523         ! --- Computation of ice velocity --- !
524         !  Bouillon et al. 2013 (eq 47-48) => unstable unless alpha, beta vary as in Kimmritz 2016 & 2017
525         !  Bouillon et al. 2009 (eq 34-35) => stable
526         IF( MOD(jter,2) == 0 ) THEN ! even iterations
527            !
528            DO_2D( 0, 0, 0, 0 )
529               !                 !--- tau_io/(v_oce - v_ice)
530               zTauO = zaV(ji,jj) * zrhoco * SQRT( ( v_ice (ji,jj) - v_oce (ji,jj) ) * ( v_ice (ji,jj) - v_oce (ji,jj) )  &
531                  &                              + ( u_iceV(ji,jj) - u_oceV(ji,jj) ) * ( u_iceV(ji,jj) - u_oceV(ji,jj) ) )
532               !                 !--- Ocean-to-Ice stress
533               ztauy_oi(ji,jj) = zTauO * ( v_oce(ji,jj) - v_ice(ji,jj) )
534               !
535               !                 !--- tau_bottom/v_ice
536               zvel  = 5.e-05_wp + SQRT( v_ice(ji,jj) * v_ice(ji,jj) + u_iceV(ji,jj) * u_iceV(ji,jj) )
537               zTauB = ztauy_base(ji,jj) / zvel
538               !                 !--- OceanBottom-to-Ice stress
539               ztauy_bi(ji,jj) = zTauB * v_ice(ji,jj)
540               !
541               !                 !--- Coriolis at V-points (energy conserving formulation)
542               zCorV(ji,jj)  = - 0.25_wp * r1_e2v(ji,jj) *  &
543                  &    ( zmf(ji,jj  ) * ( e2u(ji,jj  ) * u_ice(ji,jj  ) + e2u(ji-1,jj  ) * u_ice(ji-1,jj  ) )  &
544                  &    + zmf(ji,jj+1) * ( e2u(ji,jj+1) * u_ice(ji,jj+1) + e2u(ji-1,jj+1) * u_ice(ji-1,jj+1) ) )
545               !
546               !                 !--- Sum of external forces (explicit solution) = F + tau_ia + Coriolis + spg + tau_io
547               zRHS = zfV(ji,jj) + ztauy_ai(ji,jj) + zCorV(ji,jj) + zspgV(ji,jj) + ztauy_oi(ji,jj)
548               !
549               !                 !--- landfast switch => 0 = static  friction : TauB > RHS & sign(TauB) /= sign(RHS)
550               !                                         1 = sliding friction : TauB < RHS
551               rswitch = 1._wp - MIN( 1._wp, ABS( SIGN( 1._wp, zRHS + ztauy_base(ji,jj) ) - SIGN( 1._wp, zRHS ) ) )
552               !
553               IF( ln_aEVP ) THEN !--- ice velocity using aEVP (Kimmritz et al 2016 & 2017)
554                  zbetav = MAX( zbeta(ji,jj), zbeta(ji,jj+1) )
555                  v_ice(ji,jj) = ( (          rswitch   * ( zmV_t(ji,jj) * ( zbetav * v_ice(ji,jj) + v_ice_b(ji,jj) )         & ! previous velocity
556                     &                                    + zRHS + zTauO * v_ice(ji,jj)                                       & ! F + tau_ia + Coriolis + spg + tau_io(only ocean part)
557                     &                                    ) / MAX( zepsi, zmV_t(ji,jj) * ( zbetav + 1._wp ) + zTauO - zTauB ) & ! m/dt + tau_io(only ice part) + landfast
558                     &            + ( 1._wp - rswitch ) * (  v_ice_b(ji,jj)                                                   &
559                     &                                     + v_ice  (ji,jj) * MAX( 0._wp, zbetav - zdtevp * rn_lf_relax )     & ! static friction => slow decrease to v=0
560                     &                                    ) / ( zbetav + 1._wp )                                              &
561                     &             ) * 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
562                     &           )   * zmsk00y(ji,jj)
563               ELSE               !--- ice velocity using EVP implicit formulation (cf Madec doc & Bouillon 2009)
564                  v_ice(ji,jj) = ( (         rswitch   * ( zmV_t(ji,jj)  * v_ice(ji,jj)                                       & ! previous velocity
565                     &                                    + zRHS + zTauO * v_ice(ji,jj)                                       & ! F + tau_ia + Coriolis + spg + tau_io(only ocean part)
566                     &                                    ) / MAX( zepsi, zmV_t(ji,jj) + zTauO - zTauB )                      & ! m/dt + tau_io(only ice part) + landfast
567                     &            + ( 1._wp - rswitch ) *   v_ice(ji,jj) * MAX( 0._wp, 1._wp - zdtevp * rn_lf_relax )         & ! static friction => slow decrease to v=0
568                     &              ) * 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
569                     &            )   * zmsk00y(ji,jj)
570               ENDIF
571            END_2D
572            CALL lbc_lnk( 'icedyn_rhg_eap', v_ice, 'V', -1.0_wp )
573            !
574#if defined key_agrif
575!!          CALL agrif_interp_ice( 'V', jter, nn_nevp )
576            CALL agrif_interp_ice( 'V' )
577#endif
578            IF( ln_bdy )   CALL bdy_ice_dyn( 'V' )
579            !
580            DO_2D( 0, 0, 0, 0 )
581               !                 !--- tau_io/(u_oce - u_ice)
582               zTauO = zaU(ji,jj) * zrhoco * SQRT( ( u_ice (ji,jj) - u_oce (ji,jj) ) * ( u_ice (ji,jj) - u_oce (ji,jj) )  &
583                  &                              + ( v_iceU(ji,jj) - v_oceU(ji,jj) ) * ( v_iceU(ji,jj) - v_oceU(ji,jj) ) )
584               !                 !--- Ocean-to-Ice stress
585               ztaux_oi(ji,jj) = zTauO * ( u_oce(ji,jj) - u_ice(ji,jj) )
586               !
587               !                 !--- tau_bottom/u_ice
588               zvel  = 5.e-05_wp + SQRT( v_iceU(ji,jj) * v_iceU(ji,jj) + u_ice(ji,jj) * u_ice(ji,jj) )
589               zTauB = ztaux_base(ji,jj) / zvel
590               !                 !--- OceanBottom-to-Ice stress
591               ztaux_bi(ji,jj) = zTauB * u_ice(ji,jj)
592               !
593               !                 !--- Coriolis at U-points (energy conserving formulation)
594               zCorU(ji,jj)  =   0.25_wp * r1_e1u(ji,jj) *  &
595                  &    ( zmf(ji  ,jj) * ( e1v(ji  ,jj) * v_ice(ji  ,jj) + e1v(ji  ,jj-1) * v_ice(ji  ,jj-1) )  &
596                  &    + zmf(ji+1,jj) * ( e1v(ji+1,jj) * v_ice(ji+1,jj) + e1v(ji+1,jj-1) * v_ice(ji+1,jj-1) ) )
597               !
598               !                 !--- Sum of external forces (explicit solution) = F + tau_ia + Coriolis + spg + tau_io
599               zRHS = zfU(ji,jj) + ztaux_ai(ji,jj) + zCorU(ji,jj) + zspgU(ji,jj) + ztaux_oi(ji,jj)
600               !
601               !                 !--- landfast switch => 0 = static  friction : TauB > RHS & sign(TauB) /= sign(RHS)
602               !                                         1 = sliding friction : TauB < RHS
603               rswitch = 1._wp - MIN( 1._wp, ABS( SIGN( 1._wp, zRHS + ztaux_base(ji,jj) ) - SIGN( 1._wp, zRHS ) ) )
604               !
605               IF( ln_aEVP ) THEN !--- ice velocity using aEVP (Kimmritz et al 2016 & 2017)
606                  zbetau = MAX( zbeta(ji,jj), zbeta(ji+1,jj) )
607                  u_ice(ji,jj) = ( (          rswitch   * ( zmU_t(ji,jj) * ( zbetau * u_ice(ji,jj) + u_ice_b(ji,jj) )         & ! previous velocity
608                     &                                    + zRHS + zTauO * u_ice(ji,jj)                                       & ! F + tau_ia + Coriolis + spg + tau_io(only ocean part)
609                     &                                    ) / MAX( zepsi, zmU_t(ji,jj) * ( zbetau + 1._wp ) + zTauO - zTauB ) & ! m/dt + tau_io(only ice part) + landfast
610                     &            + ( 1._wp - rswitch ) * (  u_ice_b(ji,jj)                                                   &
611                     &                                     + u_ice  (ji,jj) * MAX( 0._wp, zbetau - zdtevp * rn_lf_relax )     & ! static friction => slow decrease to v=0
612                     &                                    ) / ( zbetau + 1._wp )                                              &
613                     &             ) * zmsk01x(ji,jj) + u_oce(ji,jj) * 0.01_wp * ( 1._wp - zmsk01x(ji,jj) )                   & ! v_ice = v_oce/100 if mass < zmmin & conc < zamin
614                     &           )   * zmsk00x(ji,jj)
615               ELSE               !--- ice velocity using EVP implicit formulation (cf Madec doc & Bouillon 2009)
616                  u_ice(ji,jj) = ( (         rswitch   * ( zmU_t(ji,jj)  * u_ice(ji,jj)                                       & ! previous velocity
617                     &                                    + zRHS + zTauO * u_ice(ji,jj)                                       & ! F + tau_ia + Coriolis + spg + tau_io(only ocean part)
618                     &                                    ) / MAX( zepsi, zmU_t(ji,jj) + zTauO - zTauB )                      & ! m/dt + tau_io(only ice part) + landfast
619                     &            + ( 1._wp - rswitch ) *   u_ice(ji,jj) * MAX( 0._wp, 1._wp - zdtevp * rn_lf_relax )         & ! static friction => slow decrease to v=0
620                     &              ) * zmsk01x(ji,jj) + u_oce(ji,jj) * 0.01_wp * ( 1._wp - zmsk01x(ji,jj) )                  & ! v_ice = v_oce/100 if mass < zmmin & conc < zamin
621                     &            )   * zmsk00x(ji,jj)
622               ENDIF
623            END_2D
624            CALL lbc_lnk( 'icedyn_rhg_eap', u_ice, 'U', -1.0_wp )
625            !
626#if defined key_agrif
627!!          CALL agrif_interp_ice( 'U', jter, nn_nevp )
628            CALL agrif_interp_ice( 'U' )
629#endif
630            IF( ln_bdy )   CALL bdy_ice_dyn( 'U' )
631            !
632         ELSE ! odd iterations
633            !
634            DO_2D( 0, 0, 0, 0 )
635               !                 !--- tau_io/(u_oce - u_ice)
636               zTauO = zaU(ji,jj) * zrhoco * SQRT( ( u_ice (ji,jj) - u_oce (ji,jj) ) * ( u_ice (ji,jj) - u_oce (ji,jj) )  &
637                  &                              + ( v_iceU(ji,jj) - v_oceU(ji,jj) ) * ( v_iceU(ji,jj) - v_oceU(ji,jj) ) )
638               !                 !--- Ocean-to-Ice stress
639               ztaux_oi(ji,jj) = zTauO * ( u_oce(ji,jj) - u_ice(ji,jj) )
640               !
641               !                 !--- tau_bottom/u_ice
642               zvel  = 5.e-05_wp + SQRT( v_iceU(ji,jj) * v_iceU(ji,jj) + u_ice(ji,jj) * u_ice(ji,jj) )
643               zTauB = ztaux_base(ji,jj) / zvel
644               !                 !--- OceanBottom-to-Ice stress
645               ztaux_bi(ji,jj) = zTauB * u_ice(ji,jj)
646               !
647               !                 !--- Coriolis at U-points (energy conserving formulation)
648               zCorU(ji,jj)  =   0.25_wp * r1_e1u(ji,jj) *  &
649                  &    ( zmf(ji  ,jj) * ( e1v(ji  ,jj) * v_ice(ji  ,jj) + e1v(ji  ,jj-1) * v_ice(ji  ,jj-1) )  &
650                  &    + zmf(ji+1,jj) * ( e1v(ji+1,jj) * v_ice(ji+1,jj) + e1v(ji+1,jj-1) * v_ice(ji+1,jj-1) ) )
651               !
652               !                 !--- Sum of external forces (explicit solution) = F + tau_ia + Coriolis + spg + tau_io
653               zRHS = zfU(ji,jj) + ztaux_ai(ji,jj) + zCorU(ji,jj) + zspgU(ji,jj) + ztaux_oi(ji,jj)
654               !
655               !                 !--- landfast switch => 0 = static  friction : TauB > RHS & sign(TauB) /= sign(RHS)
656               !                                         1 = sliding friction : TauB < RHS
657               rswitch = 1._wp - MIN( 1._wp, ABS( SIGN( 1._wp, zRHS + ztaux_base(ji,jj) ) - SIGN( 1._wp, zRHS ) ) )
658               !
659               IF( ln_aEVP ) THEN !--- ice velocity using aEVP (Kimmritz et al 2016 & 2017)
660                  zbetau = MAX( zbeta(ji,jj), zbeta(ji+1,jj) )
661                  u_ice(ji,jj) = ( (          rswitch   * ( zmU_t(ji,jj) * ( zbetau * u_ice(ji,jj) + u_ice_b(ji,jj) )         & ! previous velocity
662                     &                                    + zRHS + zTauO * u_ice(ji,jj)                                       & ! F + tau_ia + Coriolis + spg + tau_io(only ocean part)
663                     &                                    ) / MAX( zepsi, zmU_t(ji,jj) * ( zbetau + 1._wp ) + zTauO - zTauB ) & ! m/dt + tau_io(only ice part) + landfast
664                     &            + ( 1._wp - rswitch ) * (  u_ice_b(ji,jj)                                                   &
665                     &                                     + u_ice  (ji,jj) * MAX( 0._wp, zbetau - zdtevp * rn_lf_relax )     & ! static friction => slow decrease to v=0
666                     &                                    ) / ( zbetau + 1._wp )                                              &
667                     &             ) * 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
668                     &           )   * zmsk00x(ji,jj)
669               ELSE               !--- ice velocity using EVP implicit formulation (cf Madec doc & Bouillon 2009)
670                  u_ice(ji,jj) = ( (         rswitch   * ( zmU_t(ji,jj)  * u_ice(ji,jj)                                       & ! previous velocity
671                     &                                    + zRHS + zTauO * u_ice(ji,jj)                                       & ! F + tau_ia + Coriolis + spg + tau_io(only ocean part)
672                     &                                    ) / MAX( zepsi, zmU_t(ji,jj) + zTauO - zTauB )                      & ! m/dt + tau_io(only ice part) + landfast
673                     &            + ( 1._wp - rswitch ) *   u_ice(ji,jj) * MAX( 0._wp, 1._wp - zdtevp * rn_lf_relax )         & ! static friction => slow decrease to v=0
674                     &              ) * 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
675                     &            )   * zmsk00x(ji,jj)
676               ENDIF
677            END_2D
678            CALL lbc_lnk( 'icedyn_rhg_eap', u_ice, 'U', -1.0_wp )
679            !
680#if defined key_agrif
681!!          CALL agrif_interp_ice( 'U', jter, nn_nevp )
682            CALL agrif_interp_ice( 'U' )
683#endif
684            IF( ln_bdy )   CALL bdy_ice_dyn( 'U' )
685            !
686            DO_2D( 0, 0, 0, 0 )
687               !                 !--- tau_io/(v_oce - v_ice)
688               zTauO = zaV(ji,jj) * zrhoco * SQRT( ( v_ice (ji,jj) - v_oce (ji,jj) ) * ( v_ice (ji,jj) - v_oce (ji,jj) )  &
689                  &                              + ( u_iceV(ji,jj) - u_oceV(ji,jj) ) * ( u_iceV(ji,jj) - u_oceV(ji,jj) ) )
690               !                 !--- Ocean-to-Ice stress
691               ztauy_oi(ji,jj) = zTauO * ( v_oce(ji,jj) - v_ice(ji,jj) )
692               !
693               !                 !--- tau_bottom/v_ice
694               zvel  = 5.e-05_wp + SQRT( v_ice(ji,jj) * v_ice(ji,jj) + u_iceV(ji,jj) * u_iceV(ji,jj) )
695               zTauB = ztauy_base(ji,jj) / zvel
696               !                 !--- OceanBottom-to-Ice stress
697               ztauy_bi(ji,jj) = zTauB * v_ice(ji,jj)
698               !
699               !                 !--- Coriolis at v-points (energy conserving formulation)
700               zCorV(ji,jj)  = - 0.25_wp * r1_e2v(ji,jj) *  &
701                  &    ( zmf(ji,jj  ) * ( e2u(ji,jj  ) * u_ice(ji,jj  ) + e2u(ji-1,jj  ) * u_ice(ji-1,jj  ) )  &
702                  &    + zmf(ji,jj+1) * ( e2u(ji,jj+1) * u_ice(ji,jj+1) + e2u(ji-1,jj+1) * u_ice(ji-1,jj+1) ) )
703               !
704               !                 !--- Sum of external forces (explicit solution) = F + tau_ia + Coriolis + spg + tau_io
705               zRHS = zfV(ji,jj) + ztauy_ai(ji,jj) + zCorV(ji,jj) + zspgV(ji,jj) + ztauy_oi(ji,jj)
706               !
707               !                 !--- landfast switch => 0 = static  friction : TauB > RHS & sign(TauB) /= sign(RHS)
708               !                                         1 = sliding friction : TauB < RHS
709               rswitch = 1._wp - MIN( 1._wp, ABS( SIGN( 1._wp, zRHS + ztauy_base(ji,jj) ) - SIGN( 1._wp, zRHS ) ) )
710               !
711               IF( ln_aEVP ) THEN !--- ice velocity using aEVP (Kimmritz et al 2016 & 2017)
712                  zbetav = MAX( zbeta(ji,jj), zbeta(ji,jj+1) )
713                  v_ice(ji,jj) = ( (          rswitch   * ( zmV_t(ji,jj) * ( zbetav * v_ice(ji,jj) + v_ice_b(ji,jj) )         & ! previous velocity
714                     &                                    + zRHS + zTauO * v_ice(ji,jj)                                       & ! F + tau_ia + Coriolis + spg + tau_io(only ocean part)
715                     &                                    ) / MAX( zepsi, zmV_t(ji,jj) * ( zbetav + 1._wp ) + zTauO - zTauB ) & ! m/dt + tau_io(only ice part) + landfast
716                     &            + ( 1._wp - rswitch ) * (  v_ice_b(ji,jj)                                                   &
717                     &                                     + v_ice  (ji,jj) * MAX( 0._wp, zbetav - zdtevp * rn_lf_relax )     & ! static friction => slow decrease to v=0
718                     &                                    ) / ( zbetav + 1._wp )                                              &
719                     &             ) * 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
720                     &           )   * zmsk00y(ji,jj)
721               ELSE               !--- ice velocity using EVP implicit formulation (cf Madec doc & Bouillon 2009)
722                  v_ice(ji,jj) = ( (         rswitch   * ( zmV_t(ji,jj)  * v_ice(ji,jj)                                       & ! previous velocity
723                     &                                    + zRHS + zTauO * v_ice(ji,jj)                                       & ! F + tau_ia + Coriolis + spg + tau_io(only ocean part)
724                     &                                    ) / MAX( zepsi, zmV_t(ji,jj) + zTauO - zTauB )                      & ! m/dt + tau_io(only ice part) + landfast
725                     &            + ( 1._wp - rswitch ) *   v_ice(ji,jj) * MAX( 0._wp, 1._wp - zdtevp * rn_lf_relax )         & ! static friction => slow decrease to v=0
726                     &              ) * 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
727                     &            )   * zmsk00y(ji,jj)
728               ENDIF
729            END_2D
730            CALL lbc_lnk( 'icedyn_rhg_eap', v_ice, 'V', -1.0_wp )
731            !
732#if defined key_agrif
733!!          CALL agrif_interp_ice( 'V', jter, nn_nevp )
734            CALL agrif_interp_ice( 'V' )
735#endif
736            IF( ln_bdy )   CALL bdy_ice_dyn( 'V' )
737            !
738         ENDIF
739
740         ! convergence test
741         IF( nn_rhg_chkcvg == 2 )   CALL rhg_cvg_eap( kt, jter, nn_nevp, u_ice, v_ice, zu_ice, zv_ice, zmsk15 )
742         !
743         !                                                ! ==================== !
744      END DO                                              !  end loop over jter  !
745      !                                                   ! ==================== !
746      IF( ln_aEVP )   CALL iom_put( 'beta_evp' , zbeta )
747      !
748      CALL lbc_lnk( 'icedyn_rhg_eap', prdg_conv, 'T', 1.0_wp )  ! only need this in ridging module after rheology completed
749      !
750      !------------------------------------------------------------------------------!
751      ! 4) Recompute delta, shear and div (inputs for mechanical redistribution)
752      !------------------------------------------------------------------------------!
753      DO_2D( 1, 0, 1, 0 )
754
755         ! shear at F points
756         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)   &
757            &         + ( v_ice(ji+1,jj) * r1_e2v(ji+1,jj) - v_ice(ji,jj) * r1_e2v(ji,jj) ) * e2f(ji,jj) * e2f(ji,jj)   &
758            &         ) * r1_e1e2f(ji,jj) * fimask(ji,jj)
759
760      END_2D
761
762      DO_2D( 0, 0, 0, 0 )
763
764         ! tension**2 at T points
765         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)   &
766            &   - ( v_ice(ji,jj) * r1_e1v(ji,jj) - v_ice(ji,jj-1) * r1_e1v(ji,jj-1) ) * e1t(ji,jj) * e1t(ji,jj)   &
767            &   ) * r1_e1e2t(ji,jj)
768         zdt2 = zdt * zdt
769
770         zten_i(ji,jj) = zdt
771
772         ! shear**2 at T points (doc eq. A16)
773         zds2 = ( zds(ji,jj  ) * zds(ji,jj  ) * e1e2f(ji,jj  ) + zds(ji-1,jj  ) * zds(ji-1,jj  ) * e1e2f(ji-1,jj  )  &
774            &   + 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)  &
775            &   ) * 0.25_wp * r1_e1e2t(ji,jj)
776
777         ! shear at T points
778         pshear_i(ji,jj) = SQRT( zdt2 + zds2 )
779
780         ! divergence at T points
781         pdivu_i(ji,jj) = ( e2u(ji,jj) * u_ice(ji,jj) - e2u(ji-1,jj) * u_ice(ji-1,jj)   &
782            &             + e1v(ji,jj) * v_ice(ji,jj) - e1v(ji,jj-1) * v_ice(ji,jj-1)   &
783            &             ) * r1_e1e2t(ji,jj)
784
785         ! delta at T points
786         zfac            = SQRT( pdivu_i(ji,jj) * pdivu_i(ji,jj) + ( zdt2 + zds2 ) * z1_ecc2 ) ! delta
787         rswitch         = 1._wp - MAX( 0._wp, SIGN( 1._wp, -zfac ) ) ! 0 if delta=0
788         pdelta_i(ji,jj) = zfac + rn_creepl * rswitch ! delta+creepl
789
790      END_2D
791      CALL lbc_lnk( 'icedyn_rhg_eap', pshear_i, 'T', 1.0_wp, pdivu_i, 'T', 1.0_wp, pdelta_i, 'T', 1.0_wp, &
792         &                              zten_i, 'T', 1.0_wp, zs1    , 'T', 1.0_wp, zs2     , 'T', 1.0_wp, &
793         &                                zs12, 'F', 1.0_wp )
794
795      ! --- Store the stress tensor for the next time step --- !
796      pstress1_i (:,:) = zs1 (:,:)
797      pstress2_i (:,:) = zs2 (:,:)
798      pstress12_i(:,:) = zs12(:,:)
799      !
800
801      !------------------------------------------------------------------------------!
802      ! 5) diagnostics
803      !------------------------------------------------------------------------------!
804      ! --- ice-ocean, ice-atm. & ice-oceanbottom(landfast) stresses --- !
805      IF(  iom_use('utau_oi') .OR. iom_use('vtau_oi') .OR. iom_use('utau_ai') .OR. iom_use('vtau_ai') .OR. &
806         & iom_use('utau_bi') .OR. iom_use('vtau_bi') ) THEN
807         !
808         CALL lbc_lnk( 'icedyn_rhg_eap', ztaux_oi, 'U', -1.0_wp, ztauy_oi, 'V', -1.0_wp, ztaux_ai, 'U', -1.0_wp, &
809            &                            ztauy_ai, 'V', -1.0_wp, ztaux_bi, 'U', -1.0_wp, ztauy_bi, 'V', -1.0_wp )
810         !
811         CALL iom_put( 'utau_oi' , ztaux_oi * zmsk00 )
812         CALL iom_put( 'vtau_oi' , ztauy_oi * zmsk00 )
813         CALL iom_put( 'utau_ai' , ztaux_ai * zmsk00 )
814         CALL iom_put( 'vtau_ai' , ztauy_ai * zmsk00 )
815         CALL iom_put( 'utau_bi' , ztaux_bi * zmsk00 )
816         CALL iom_put( 'vtau_bi' , ztauy_bi * zmsk00 )
817      ENDIF
818
819      ! --- divergence, shear and strength --- !
820      IF( iom_use('icediv') )   CALL iom_put( 'icediv' , pdivu_i  * zmsk00 )   ! divergence
821      IF( iom_use('iceshe') )   CALL iom_put( 'iceshe' , pshear_i * zmsk00 )   ! shear
822      IF( iom_use('icedlt') )   CALL iom_put( 'icedlt' , pdelta_i * zmsk00 )   ! delta
823      IF( iom_use('icestr') )   CALL iom_put( 'icestr' , strength * zmsk00 )   ! strength
824
825      ! --- Stress tensor invariants (SIMIP diags) --- !
826      IF( iom_use('normstr') .OR. iom_use('sheastr') ) THEN
827         !
828         ALLOCATE( zsig_I(jpi,jpj) , zsig_II(jpi,jpj) )
829         !
830         DO_2D( 1, 1, 1, 1 )
831
832            ! Ice stresses
833            ! sigma1, sigma2, sigma12 are some useful recombination of the stresses (Hunke and Dukowicz MWR 2002, Bouillon et al., OM2013)
834            ! These are NOT stress tensor components, neither stress invariants, neither stress principal components
835            ! I know, this can be confusing...
836            zfac             =   strength(ji,jj) / ( pdelta_i(ji,jj) + rn_creepl )
837            zsig1            =   zfac * ( pdivu_i(ji,jj) - pdelta_i(ji,jj) )
838            zsig2            =   zfac * z1_ecc2 * zten_i(ji,jj)
839            zsig12           =   zfac * z1_ecc2 * pshear_i(ji,jj)
840
841            ! Stress invariants (sigma_I, sigma_II, Coon 1974, Feltham 2008)
842            zsig_I (ji,jj)   =   zsig1 * 0.5_wp                                           ! 1st stress invariant, aka average normal stress, aka negative pressure
843            zsig_II(ji,jj)   =   SQRT ( MAX( 0._wp, zsig2 * zsig2 * 0.25_wp + zsig12 ) )  ! 2nd  ''       '', aka maximum shear stress
844
845         END_2D
846         !
847         ! Stress tensor invariants (normal and shear stress N/m) - SIMIP diags - definitions following Coon (1974) and Feltham (2008)
848         IF( iom_use('normstr') )   CALL iom_put( 'normstr', zsig_I (:,:) * zmsk00(:,:) ) ! Normal stress
849         IF( iom_use('sheastr') )   CALL iom_put( 'sheastr', zsig_II(:,:) * zmsk00(:,:) ) ! Maximum shear stress
850
851         DEALLOCATE ( zsig_I, zsig_II )
852
853      ENDIF
854
855      ! --- Normalized stress tensor principal components --- !
856      ! This are used to plot the normalized yield curve, see Lemieux & Dupont, 2020
857      ! Recommendation 1 : we use ice strength, not replacement pressure
858      ! Recommendation 2 : need to use deformations at PREVIOUS iterate for viscosities
859      IF( iom_use('sig1_pnorm') .OR. iom_use('sig2_pnorm') ) THEN
860         !
861         ALLOCATE( zsig1_p(jpi,jpj) , zsig2_p(jpi,jpj) , zsig_I(jpi,jpj) , zsig_II(jpi,jpj) )
862         !
863         DO_2D( 1, 1, 1, 1 )
864
865            ! Ice stresses computed with **viscosities** (delta, p/delta) at **previous** iterates
866            !                        and **deformations** at current iterates
867            !                        following Lemieux & Dupont (2020)
868            zfac             =   zp_delt(ji,jj)
869            zsig1            =   zfac * ( pdivu_i(ji,jj) - ( zdelta(ji,jj) + rn_creepl ) )
870            zsig2            =   zfac * z1_ecc2 * zten_i(ji,jj)
871            zsig12           =   zfac * z1_ecc2 * pshear_i(ji,jj)
872
873            ! Stress invariants (sigma_I, sigma_II, Coon 1974, Feltham 2008), T-point
874            zsig_I(ji,jj)    =   zsig1 * 0.5_wp                                           ! 1st stress invariant, aka average normal stress, aka negative pressure
875            zsig_II(ji,jj)   =   SQRT ( MAX( 0._wp, zsig2 * zsig2 * 0.25_wp + zsig12 ) )  ! 2nd  ''       '', aka maximum shear stress
876
877            ! Normalized  principal stresses (used to display the ellipse)
878            z1_strength      =   1._wp / MAX( 1._wp, strength(ji,jj) )
879            zsig1_p(ji,jj)   =   ( zsig_I(ji,jj) + zsig_II(ji,jj) ) * z1_strength
880            zsig2_p(ji,jj)   =   ( zsig_I(ji,jj) - zsig_II(ji,jj) ) * z1_strength
881         END_2D
882         !
883         CALL iom_put( 'sig1_pnorm' , zsig1_p )
884         CALL iom_put( 'sig2_pnorm' , zsig2_p )
885
886         DEALLOCATE( zsig1_p , zsig2_p , zsig_I, zsig_II )
887
888      ENDIF
889
890      ! --- yieldcurve --- !
891      IF( iom_use('yield11') .OR. iom_use('yield12') .OR. iom_use('yield22')) THEN
892
893         CALL lbc_lnk( 'icedyn_rhg_eap', zyield11, 'T', 1.0_wp, zyield22, 'T', 1.0_wp, zyield12, 'T', 1.0_wp )
894
895         CALL iom_put( 'yield11', zyield11 * zmsk00 )
896         CALL iom_put( 'yield22', zyield22 * zmsk00 )
897         CALL iom_put( 'yield12', zyield12 * zmsk00 )
898      ENDIF
899
900      ! --- anisotropy tensor --- !
901      IF( iom_use('aniso') ) THEN
902         CALL lbc_lnk( 'icedyn_rhg_eap', paniso_11, 'T', 1.0_wp )
903         CALL iom_put( 'aniso' , paniso_11 * zmsk00 )
904      ENDIF
905
906      ! --- SIMIP --- !
907      IF(  iom_use('dssh_dx') .OR. iom_use('dssh_dy') .OR. &
908         & iom_use('corstrx') .OR. iom_use('corstry') .OR. iom_use('intstrx') .OR. iom_use('intstry') ) THEN
909         !
910         CALL lbc_lnk( 'icedyn_rhg_eap', zspgU, 'U', -1.0_wp, zspgV, 'V', -1.0_wp, &
911            &                            zCorU, 'U', -1.0_wp, zCorV, 'V', -1.0_wp, &
912            &                              zfU, 'U', -1.0_wp,   zfV, 'V', -1.0_wp )
913
914         CALL iom_put( 'dssh_dx' , zspgU * zmsk00 )   ! Sea-surface tilt term in force balance (x)
915         CALL iom_put( 'dssh_dy' , zspgV * zmsk00 )   ! Sea-surface tilt term in force balance (y)
916         CALL iom_put( 'corstrx' , zCorU * zmsk00 )   ! Coriolis force term in force balance (x)
917         CALL iom_put( 'corstry' , zCorV * zmsk00 )   ! Coriolis force term in force balance (y)
918         CALL iom_put( 'intstrx' , zfU   * zmsk00 )   ! Internal force term in force balance (x)
919         CALL iom_put( 'intstry' , zfV   * zmsk00 )   ! Internal force term in force balance (y)
920      ENDIF
921
922      IF(  iom_use('xmtrpice') .OR. iom_use('ymtrpice') .OR. &
923         & iom_use('xmtrpsnw') .OR. iom_use('ymtrpsnw') .OR. iom_use('xatrp') .OR. iom_use('yatrp') ) THEN
924         !
925         ALLOCATE( zdiag_xmtrp_ice(jpi,jpj) , zdiag_ymtrp_ice(jpi,jpj) , &
926            &      zdiag_xmtrp_snw(jpi,jpj) , zdiag_ymtrp_snw(jpi,jpj) , zdiag_xatrp(jpi,jpj) , zdiag_yatrp(jpi,jpj) )
927         !
928         DO_2D( 0, 0, 0, 0 )
929            ! 2D ice mass, snow mass, area transport arrays (X, Y)
930            zfac_x = 0.5 * u_ice(ji,jj) * e2u(ji,jj) * zmsk00(ji,jj)
931            zfac_y = 0.5 * v_ice(ji,jj) * e1v(ji,jj) * zmsk00(ji,jj)
932
933            zdiag_xmtrp_ice(ji,jj) = rhoi * zfac_x * ( vt_i(ji+1,jj) + vt_i(ji,jj) ) ! ice mass transport, X-component
934            zdiag_ymtrp_ice(ji,jj) = rhoi * zfac_y * ( vt_i(ji,jj+1) + vt_i(ji,jj) ) !        ''           Y-   ''
935
936            zdiag_xmtrp_snw(ji,jj) = rhos * zfac_x * ( vt_s(ji+1,jj) + vt_s(ji,jj) ) ! snow mass transport, X-component
937            zdiag_ymtrp_snw(ji,jj) = rhos * zfac_y * ( vt_s(ji,jj+1) + vt_s(ji,jj) ) !          ''          Y-   ''
938
939            zdiag_xatrp(ji,jj)     = zfac_x * ( at_i(ji+1,jj) + at_i(ji,jj) )        ! area transport,      X-component
940            zdiag_yatrp(ji,jj)     = zfac_y * ( at_i(ji,jj+1) + at_i(ji,jj) )        !        ''            Y-   ''
941
942         END_2D
943
944         CALL lbc_lnk( 'icedyn_rhg_eap', zdiag_xmtrp_ice, 'U', -1.0_wp, zdiag_ymtrp_ice, 'V', -1.0_wp, &
945            &                            zdiag_xmtrp_snw, 'U', -1.0_wp, zdiag_ymtrp_snw, 'V', -1.0_wp, &
946            &                            zdiag_xatrp    , 'U', -1.0_wp, zdiag_yatrp    , 'V', -1.0_wp )
947
948         CALL iom_put( 'xmtrpice' , zdiag_xmtrp_ice )   ! X-component of sea-ice mass transport (kg/s)
949         CALL iom_put( 'ymtrpice' , zdiag_ymtrp_ice )   ! Y-component of sea-ice mass transport
950         CALL iom_put( 'xmtrpsnw' , zdiag_xmtrp_snw )   ! X-component of snow mass transport (kg/s)
951         CALL iom_put( 'ymtrpsnw' , zdiag_ymtrp_snw )   ! Y-component of snow mass transport
952         CALL iom_put( 'xatrp'    , zdiag_xatrp     )   ! X-component of ice area transport
953         CALL iom_put( 'yatrp'    , zdiag_yatrp     )   ! Y-component of ice area transport
954
955         DEALLOCATE( zdiag_xmtrp_ice , zdiag_ymtrp_ice , &
956            &        zdiag_xmtrp_snw , zdiag_ymtrp_snw , zdiag_xatrp , zdiag_yatrp )
957
958      ENDIF
959      !
960      ! --- convergence tests --- !
961      IF( nn_rhg_chkcvg == 1 .OR. nn_rhg_chkcvg == 2 ) THEN
962         IF( iom_use('uice_cvg') ) THEN
963            IF( ln_aEVP ) THEN   ! output: beta * ( u(t=nn_nevp) - u(t=nn_nevp-1) )
964               CALL iom_put( 'uice_cvg', MAX( ABS( u_ice(:,:) - zu_ice(:,:) ) * zbeta(:,:) * umask(:,:,1) , &
965                  &                           ABS( v_ice(:,:) - zv_ice(:,:) ) * zbeta(:,:) * vmask(:,:,1) ) * zmsk15(:,:) )
966            ELSE                 ! output: nn_nevp * ( u(t=nn_nevp) - u(t=nn_nevp-1) )
967               CALL iom_put( 'uice_cvg', REAL( nn_nevp ) * MAX( ABS( u_ice(:,:) - zu_ice(:,:) ) * umask(:,:,1) , &
968                  &                                             ABS( v_ice(:,:) - zv_ice(:,:) ) * vmask(:,:,1) ) * zmsk15(:,:) )
969            ENDIF
970         ENDIF
971      ENDIF
972      !
973   END SUBROUTINE ice_dyn_rhg_eap
974
975
976   SUBROUTINE rhg_cvg_eap( kt, kiter, kitermax, pu, pv, pub, pvb, pmsk15 )
977      !!----------------------------------------------------------------------
978      !!                    ***  ROUTINE rhg_cvg_eap  ***
979      !!
980      !! ** Purpose :   check convergence of oce rheology
981      !!
982      !! ** Method  :   create a file ice_cvg.nc containing the convergence of ice velocity
983      !!                during the sub timestepping of rheology so as:
984      !!                  uice_cvg = MAX( u(t+1) - u(t) , v(t+1) - v(t) )
985      !!                This routine is called every sub-iteration, so it is cpu expensive
986      !!
987      !! ** Note    :   for the first sub-iteration, uice_cvg is set to 0 (too large otherwise)
988      !!----------------------------------------------------------------------
989      INTEGER ,                 INTENT(in) ::   kt, kiter, kitermax       ! ocean time-step index
990      REAL(wp), DIMENSION(:,:), INTENT(in) ::   pu, pv, pub, pvb          ! now and before velocities
991      REAL(wp), DIMENSION(:,:), INTENT(in) ::   pmsk15
992      !!
993      INTEGER           ::   it, idtime, istatus
994      INTEGER           ::   ji, jj          ! dummy loop indices
995      REAL(wp)          ::   zresm           ! local real
996      CHARACTER(len=20) ::   clname
997      !!----------------------------------------------------------------------
998
999      ! create file
1000      IF( kt == nit000 .AND. kiter == 1 ) THEN
1001         !
1002         IF( lwp ) THEN
1003            WRITE(numout,*)
1004            WRITE(numout,*) 'rhg_cvg_eap : ice rheology convergence control'
1005            WRITE(numout,*) '~~~~~~~'
1006         ENDIF
1007         !
1008         IF( lwm ) THEN
1009            clname = 'ice_cvg.nc'
1010            IF( .NOT. Agrif_Root() )   clname = TRIM(Agrif_CFixed())//"_"//TRIM(clname)
1011            istatus = NF90_CREATE( TRIM(clname), NF90_CLOBBER, ncvgid )
1012            istatus = NF90_DEF_DIM( ncvgid, 'time'  , NF90_UNLIMITED, idtime )
1013            istatus = NF90_DEF_VAR( ncvgid, 'uice_cvg', NF90_DOUBLE   , (/ idtime /), nvarid )
1014            istatus = NF90_ENDDEF(ncvgid)
1015         ENDIF
1016         !
1017      ENDIF
1018
1019      ! time
1020      it = ( kt - 1 ) * kitermax + kiter
1021
1022      ! convergence
1023      IF( kiter == 1 ) THEN ! remove the first iteration for calculations of convergence (always very large)
1024         zresm = 0._wp
1025      ELSE
1026         zresm = 0._wp
1027         DO_2D( 0, 0, 0, 0 )
1028            zresm = MAX( zresm, MAX( ABS( pu(ji,jj) - pub(ji,jj) ) * umask(ji,jj,1), &
1029               &                     ABS( pv(ji,jj) - pvb(ji,jj) ) * vmask(ji,jj,1) ) * pmsk15(ji,jj) )
1030         END_2D
1031         CALL mpp_max( 'icedyn_rhg_evp', zresm )   ! max over the global domain
1032      ENDIF
1033
1034      IF( lwm ) THEN
1035         ! write variables
1036         istatus = NF90_PUT_VAR( ncvgid, nvarid, (/zresm/), (/it/), (/1/) )
1037         ! close file
1038         IF( kt == nitend )   istatus = NF90_CLOSE(ncvgid)
1039      ENDIF
1040
1041   END SUBROUTINE rhg_cvg_eap
1042
1043
1044   SUBROUTINE update_stress_rdg( ksub, kndte, pdivu, ptension, pshear, pa11, pa12, &
1045      &                          pstressp,  pstressm, pstress12, pstrength, palphar, palphas )
1046      !!---------------------------------------------------------------------
1047      !!                   ***  SUBROUTINE update_stress_rdg  ***
1048      !!
1049      !! ** Purpose :   Updates the stress depending on values of strain rate and structure
1050      !!                tensor and for the last subcycle step it computes closing and sliding rate
1051      !!---------------------------------------------------------------------
1052      INTEGER,  INTENT(in   ) ::   ksub, kndte
1053      REAL(wp), INTENT(in   ) ::   pstrength
1054      REAL(wp), INTENT(in   ) ::   pdivu, ptension, pshear
1055      REAL(wp), INTENT(in   ) ::   pa11, pa12
1056      REAL(wp), INTENT(  out) ::   pstressp, pstressm, pstress12
1057      REAL(wp), INTENT(  out) ::   palphar, palphas
1058
1059      INTEGER  ::   kx ,ky, ka
1060
1061      REAL(wp) ::   zstemp11r, zstemp12r, zstemp22r
1062      REAL(wp) ::   zstemp11s, zstemp12s, zstemp22s
1063      REAL(wp) ::   za22, zQd11Qd11, zQd11Qd12, zQd12Qd12
1064      REAL(wp) ::   zQ11Q11, zQ11Q12, zQ12Q12
1065      REAL(wp) ::   zdtemp11, zdtemp12, zdtemp22
1066      REAL(wp) ::   zrotstemp11r, zrotstemp12r, zrotstemp22r
1067      REAL(wp) ::   zrotstemp11s, zrotstemp12s, zrotstemp22s
1068      REAL(wp) ::   zsig11, zsig12, zsig22
1069      REAL(wp) ::   zsgprm11, zsgprm12, zsgprm22
1070      REAL(wp) ::   zAngle_denom_gamma,  zAngle_denom_alpha
1071      REAL(wp) ::   zTany_1, zTany_2
1072      REAL(wp) ::   zx, zy, zkxw, kyw, kaw
1073      REAL(wp) ::   zinvdx, zinvdy, zinvda
1074      REAL(wp) ::   zdtemp1, zdtemp2, zatempprime
1075
1076      REAL(wp), PARAMETER ::   ppkfriction = 0.45_wp
1077      ! Factor to maintain the same stress as in EVP (see Section 3)
1078      ! Can be set to 1 otherwise
1079!     REAL(wp), PARAMETER ::   ppinvstressconviso = 1._wp/(1._wp+ppkfriction*ppkfriction)
1080      REAL(wp), PARAMETER ::   ppinvstressconviso = 1._wp
1081
1082      ! next statement uses pphi set in main module (icedyn_rhg_eap)
1083      REAL(wp), PARAMETER ::   ppinvsin = 1._wp/sin(2._wp*pphi) * ppinvstressconviso
1084
1085      ! compute eigenvalues, eigenvectors and angles for structure tensor, strain
1086      ! rates
1087
1088      ! 1) structure tensor
1089      za22 = 1._wp-pa11
1090      zQ11Q11 = 1._wp
1091      zQ12Q12 = rsmall
1092      zQ11Q12 = rsmall
1093
1094      ! gamma: angle between general coordiantes and principal axis of A
1095      ! here Tan2gamma = 2 a12 / (a11 - a22)
1096      IF((ABS(pa11 - za22) > rsmall).OR.(ABS(pa12) > rsmall)) THEN
1097         zAngle_denom_gamma = 1._wp/sqrt( ( pa11 - za22 )*( pa11 - za22) + &
1098                              4._wp*pa12*pa12 )
1099
1100         zQ11Q11 = 0.5_wp + ( pa11 - za22 )*0.5_wp*zAngle_denom_gamma   !Cos^2
1101         zQ12Q12 = 0.5_wp - ( pa11 - za22 )*0.5_wp*zAngle_denom_gamma   !Sin^2
1102         zQ11Q12 = pa12*zAngle_denom_gamma                     !CosSin
1103      ENDIF
1104
1105      ! rotation Q*atemp*Q^T
1106      zatempprime = zQ11Q11*pa11 + 2.0_wp*zQ11Q12*pa12 + zQ12Q12*za22
1107
1108      ! make first principal value the largest
1109      zatempprime = max(zatempprime, 1.0_wp - zatempprime)
1110
1111      ! 2) strain rate
1112      zdtemp11 = 0.5_wp*(pdivu + ptension)
1113      zdtemp12 = pshear*0.5_wp
1114      zdtemp22 = 0.5_wp*(pdivu - ptension)
1115
1116      ! here Tan2alpha = 2 dtemp12 / (dtemp11 - dtemp22)
1117
1118      zQd11Qd11 = 1.0_wp
1119      zQd12Qd12 = rsmall
1120      zQd11Qd12 = rsmall
1121
1122      IF((ABS( zdtemp11 - zdtemp22) > rsmall).OR. (ABS(zdtemp12) > rsmall)) THEN
1123
1124         zAngle_denom_alpha = 1.0_wp/sqrt( ( zdtemp11 - zdtemp22 )* &
1125                             ( zdtemp11 - zdtemp22 ) + 4.0_wp*zdtemp12*zdtemp12)
1126
1127         zQd11Qd11 = 0.5_wp + ( zdtemp11 - zdtemp22 )*0.5_wp*zAngle_denom_alpha !Cos^2
1128         zQd12Qd12 = 0.5_wp - ( zdtemp11 - zdtemp22 )*0.5_wp*zAngle_denom_alpha !Sin^2
1129         zQd11Qd12 = zdtemp12*zAngle_denom_alpha !CosSin
1130      ENDIF
1131
1132      zdtemp1 = zQd11Qd11*zdtemp11 + 2.0_wp*zQd11Qd12*zdtemp12 + zQd12Qd12*zdtemp22
1133      zdtemp2 = zQd12Qd12*zdtemp11 - 2.0_wp*zQd11Qd12*zdtemp12 + zQd11Qd11*zdtemp22
1134      ! In cos and sin values
1135      zx = 0._wp
1136      IF ((ABS(zdtemp1) > rsmall).OR.(ABS(zdtemp2) > rsmall)) THEN
1137         zx = atan2(zdtemp2,zdtemp1)
1138      ENDIF
1139
1140      ! to ensure the angle lies between pi/4 and 9 pi/4
1141      IF (zx < rpi*0.25_wp) zx = zx + rpi*2.0_wp
1142
1143      ! y: angle between major principal axis of strain rate and structure
1144      ! tensor
1145      ! y = gamma - alpha
1146      ! Expressesed componently with
1147      ! Tany = (Singamma*Cosgamma - Sinalpha*Cosgamma)/(Cos^2gamma - Sin^alpha)
1148
1149      zTany_1 = zQ11Q12 - zQd11Qd12
1150      zTany_2 = zQ11Q11 - zQd12Qd12
1151
1152      zy = 0._wp
1153
1154      IF ((ABS(zTany_1) > rsmall).OR.(ABS(zTany_2) > rsmall)) THEN
1155         zy = atan2(zTany_1,zTany_2)
1156      ENDIF
1157
1158      ! to make sure y is between 0 and pi
1159      IF (zy > rpi) zy = zy - rpi
1160      IF (zy < 0)  zy = zy + rpi
1161
1162      ! 3) update anisotropic stress tensor
1163      zinvdx = real(nx_yield-1,kind=wp)/rpi
1164      zinvdy = real(ny_yield-1,kind=wp)/rpi
1165      zinvda = 2._wp*real(na_yield-1,kind=wp)
1166
1167      ! % need 8 coords and 8 weights
1168      ! % range in kx
1169      kx  = int((zx-rpi*0.25_wp-rpi)*zinvdx) + 1
1170      !!clem kx  = MAX( 1, MIN( nx_yield-1, INT((zx-rpi*0.25_wp-rpi)*zinvdx) + 1  ) )
1171      zkxw = kx - (zx-rpi*0.25_wp-rpi)*zinvdx
1172
1173      ky  = int(zy*zinvdy) + 1
1174      !!clem ky  = MAX( 1, MIN( ny_yield-1, INT(zy*zinvdy) + 1 ) )
1175      kyw = ky - zy*zinvdy
1176
1177      ka  = int((zatempprime-0.5_wp)*zinvda) + 1
1178      !!clem ka  = MAX( 1, MIN( na_yield-1, INT((zatempprime-0.5_wp)*zinvda) + 1 ) )
1179      kaw = ka - (zatempprime-0.5_wp)*zinvda
1180
1181      ! % Determine sigma_r(A1,Zeta,y) and sigma_s (see Section A1 of Tsamados 2013)
1182!!$      zstemp11r =  zkxw  * kyw         * kaw         * s11r(kx  ,ky  ,ka  ) &
1183!!$        & + (1._wp-zkxw) * kyw         * kaw         * s11r(kx+1,ky  ,ka  ) &
1184!!$        & + zkxw         * (1._wp-kyw) * kaw         * s11r(kx  ,ky+1,ka  ) &
1185!!$        & + zkxw         * kyw         * (1._wp-kaw) * s11r(kx  ,ky  ,ka+1) &
1186!!$        & + (1._wp-zkxw) * (1._wp-kyw) * kaw         * s11r(kx+1,ky+1,ka  ) &
1187!!$        & + (1._wp-zkxw) * kyw         * (1._wp-kaw) * s11r(kx+1,ky  ,ka+1) &
1188!!$        & + zkxw         * (1._wp-kyw) * (1._wp-kaw) * s11r(kx  ,ky+1,ka+1) &
1189!!$        & + (1._wp-zkxw) * (1._wp-kyw) * (1._wp-kaw) * s11r(kx+1,ky+1,ka+1)
1190!!$      zstemp12r =  zkxw  * kyw         * kaw         * s12r(kx  ,ky  ,ka  ) &
1191!!$        & + (1._wp-zkxw) * kyw         * kaw         * s12r(kx+1,ky  ,ka  ) &
1192!!$        & + zkxw         * (1._wp-kyw) * kaw         * s12r(kx  ,ky+1,ka  ) &
1193!!$        & + zkxw         * kyw         * (1._wp-kaw) * s12r(kx  ,ky  ,ka+1) &
1194!!$        & + (1._wp-zkxw) * (1._wp-kyw) * kaw         * s12r(kx+1,ky+1,ka  ) &
1195!!$        & + (1._wp-zkxw) * kyw         * (1._wp-kaw) * s12r(kx+1,ky  ,ka+1) &
1196!!$        & + zkxw         * (1._wp-kyw) * (1._wp-kaw) * s12r(kx  ,ky+1,ka+1) &
1197!!$        & + (1._wp-zkxw) * (1._wp-kyw) * (1._wp-kaw) * s12r(kx+1,ky+1,ka+1)
1198!!$      zstemp22r =  zkxw  * kyw         * kaw         * s22r(kx  ,ky  ,ka  ) &
1199!!$        & + (1._wp-zkxw) * kyw         * kaw         * s22r(kx+1,ky  ,ka  ) &
1200!!$        & + zkxw         * (1._wp-kyw) * kaw         * s22r(kx  ,ky+1,ka  ) &
1201!!$        & + zkxw         * kyw         * (1._wp-kaw) * s22r(kx  ,ky  ,ka+1) &
1202!!$        & + (1._wp-zkxw) * (1._wp-kyw) * kaw         * s22r(kx+1,ky+1,ka  ) &
1203!!$        & + (1._wp-zkxw) * kyw         * (1._wp-kaw) * s22r(kx+1,ky  ,ka+1) &
1204!!$        & + zkxw         * (1._wp-kyw) * (1._wp-kaw) * s22r(kx  ,ky+1,ka+1) &
1205!!$        & + (1._wp-zkxw) * (1._wp-kyw) * (1._wp-kaw) * s22r(kx+1,ky+1,ka+1)
1206!!$
1207!!$      zstemp11s =  zkxw  * kyw         * kaw         * s11s(kx  ,ky  ,ka  ) &
1208!!$        & + (1._wp-zkxw) * kyw         * kaw         * s11s(kx+1,ky  ,ka  ) &
1209!!$        & + zkxw         * (1._wp-kyw) * kaw         * s11s(kx  ,ky+1,ka  ) &
1210!!$        & + zkxw         * kyw         * (1._wp-kaw) * s11s(kx  ,ky  ,ka+1) &
1211!!$        & + (1._wp-zkxw) * (1._wp-kyw) * kaw         * s11s(kx+1,ky+1,ka  ) &
1212!!$        & + (1._wp-zkxw) * kyw         * (1._wp-kaw) * s11s(kx+1,ky  ,ka+1) &
1213!!$        & + zkxw         * (1._wp-kyw) * (1._wp-kaw) * s11s(kx  ,ky+1,ka+1) &
1214!!$        & + (1._wp-zkxw) * (1._wp-kyw) * (1._wp-kaw) * s11s(kx+1,ky+1,ka+1)
1215!!$      zstemp12s =  zkxw  * kyw         * kaw         * s12s(kx  ,ky  ,ka  ) &
1216!!$        & + (1._wp-zkxw) * kyw         * kaw         * s12s(kx+1,ky  ,ka  ) &
1217!!$        & + zkxw         * (1._wp-kyw) * kaw         * s12s(kx  ,ky+1,ka  ) &
1218!!$        & + zkxw         * kyw         * (1._wp-kaw) * s12s(kx  ,ky  ,ka+1) &
1219!!$        & + (1._wp-zkxw) * (1._wp-kyw) * kaw         * s12s(kx+1,ky+1,ka  ) &
1220!!$        & + (1._wp-zkxw) * kyw         * (1._wp-kaw) * s12s(kx+1,ky  ,ka+1) &
1221!!$        & + zkxw         * (1._wp-kyw) * (1._wp-kaw) * s12s(kx  ,ky+1,ka+1) &
1222!!$        & + (1._wp-zkxw) * (1._wp-kyw) * (1._wp-kaw) * s12s(kx+1,ky+1,ka+1)
1223!!$      zstemp22s =  zkxw  * kyw         * kaw         * s22s(kx  ,ky  ,ka  ) &
1224!!$        & + (1._wp-zkxw) * kyw         * kaw         * s22s(kx+1,ky  ,ka  ) &
1225!!$        & + zkxw         * (1._wp-kyw) * kaw         * s22s(kx  ,ky+1,ka  ) &
1226!!$        & + zkxw         * kyw         * (1._wp-kaw) * s22s(kx  ,ky  ,ka+1) &
1227!!$        & + (1._wp-zkxw) * (1._wp-kyw) * kaw         * s22s(kx+1,ky+1,ka  ) &
1228!!$        & + (1._wp-zkxw) * kyw         * (1._wp-kaw) * s22s(kx+1,ky  ,ka+1) &
1229!!$        & + zkxw         * (1._wp-kyw) * (1._wp-kaw) * s22s(kx  ,ky+1,ka+1) &
1230!!$        & + (1._wp-zkxw) * (1._wp-kyw) * (1._wp-kaw) * s22s(kx+1,ky+1,ka+1)
1231
1232      zstemp11r = s11r(kx,ky,ka)
1233      zstemp12r = s12r(kx,ky,ka)
1234      zstemp22r = s22r(kx,ky,ka)
1235      zstemp11s = s11s(kx,ky,ka)
1236      zstemp12s = s12s(kx,ky,ka)
1237      zstemp22s = s22s(kx,ky,ka)
1238
1239
1240      ! Calculate mean ice stress over a collection of floes (Equation 3 in
1241      ! Tsamados 2013)
1242
1243      zsig11  = pstrength*(zstemp11r + ppkfriction*zstemp11s) * ppinvsin
1244      zsig12  = pstrength*(zstemp12r + ppkfriction*zstemp12s) * ppinvsin
1245      zsig22  = pstrength*(zstemp22r + ppkfriction*zstemp22s) * ppinvsin
1246
1247      ! Back - rotation of the stress from principal axes into general coordinates
1248
1249      ! Update stress
1250      zsgprm11 = zQ11Q11*zsig11 + zQ12Q12*zsig22 -      2._wp*zQ11Q12 *zsig12
1251      zsgprm12 = zQ11Q12*zsig11 - zQ11Q12*zsig22 + (zQ11Q11 - zQ12Q12)*zsig12
1252      zsgprm22 = zQ12Q12*zsig11 + zQ11Q11*zsig22 +      2._wp*zQ11Q12 *zsig12
1253
1254      pstressp  = zsgprm11 + zsgprm22
1255      pstress12 = zsgprm12
1256      pstressm  = zsgprm11 - zsgprm22
1257
1258      ! Compute ridging and sliding functions in general coordinates
1259      ! (Equation 11 in Tsamados 2013)
1260      IF (ksub == kndte) THEN
1261         zrotstemp11r = zQ11Q11*zstemp11r - 2._wp*zQ11Q12* zstemp12r &
1262                      + zQ12Q12*zstemp22r
1263         zrotstemp12r = zQ11Q11*zstemp12r +       zQ11Q12*(zstemp11r-zstemp22r) &
1264                      - zQ12Q12*zstemp12r
1265         zrotstemp22r = zQ12Q12*zstemp11r + 2._wp*zQ11Q12* zstemp12r &
1266                      + zQ11Q11*zstemp22r
1267
1268         zrotstemp11s = zQ11Q11*zstemp11s - 2._wp*zQ11Q12* zstemp12s &
1269                      + zQ12Q12*zstemp22s
1270         zrotstemp12s = zQ11Q11*zstemp12s +       zQ11Q12*(zstemp11s-zstemp22s) &
1271                      - zQ12Q12*zstemp12s
1272         zrotstemp22s = zQ12Q12*zstemp11s + 2._wp*zQ11Q12* zstemp12s &
1273                      + zQ11Q11*zstemp22s
1274
1275         palphar =  zrotstemp11r*zdtemp11 + 2._wp*zrotstemp12r*zdtemp12 &
1276                  + zrotstemp22r*zdtemp22
1277         palphas =  zrotstemp11s*zdtemp11 + 2._wp*zrotstemp12s*zdtemp12 &
1278                  + zrotstemp22s*zdtemp22
1279      ENDIF
1280   END SUBROUTINE update_stress_rdg
1281
1282!=======================================================================
1283
1284
1285   SUBROUTINE calc_ffrac( pstressp, pstressm, pstress12, pa11, pa12, &
1286      &                   pmresult11, pmresult12 )
1287      !!---------------------------------------------------------------------
1288      !!                   ***  ROUTINE calc_ffrac  ***
1289      !!
1290      !! ** Purpose :   Computes term in evolution equation for structure tensor
1291      !!                which determines the ice floe re-orientation due to fracture
1292      !! ** Method :    Eq. 7: Ffrac = -kf(A-S) or = 0 depending on sigma_1 and sigma_2
1293      !!---------------------------------------------------------------------
1294      REAL (wp), INTENT(in)  ::   pstressp, pstressm, pstress12, pa11, pa12
1295      REAL (wp), INTENT(out) ::   pmresult11, pmresult12
1296
1297      ! local variables
1298
1299      REAL (wp) ::   zsigma11, zsigma12, zsigma22  ! stress tensor elements
1300      REAL (wp) ::   zAngle_denom        ! angle with principal component axis
1301      REAL (wp) ::   zsigma_1, zsigma_2   ! principal components of stress
1302      REAL (wp) ::   zQ11, zQ12, zQ11Q11, zQ11Q12, zQ12Q12
1303
1304!!$   REAL (wp), PARAMETER ::   ppkfrac = 0.0001_wp   ! rate of fracture formation
1305      REAL (wp), PARAMETER ::   ppkfrac = 1.e-3_wp    ! rate of fracture formation
1306      REAL (wp), PARAMETER ::   ppthreshold = 0.3_wp  ! critical confinement ratio
1307      !!---------------------------------------------------------------
1308      !
1309      zsigma11 = 0.5_wp*(pstressp+pstressm)
1310      zsigma12 = pstress12
1311      zsigma22 = 0.5_wp*(pstressp-pstressm)
1312
1313      ! Here's the change - no longer calculate gamma,
1314      ! use trig formulation, angle signs are kept correct, don't worry
1315
1316      ! rotate tensor to get into sigma principal axis
1317
1318      ! here Tan2gamma = 2 sig12 / (sig11 - sig12)
1319      ! add rsmall to the denominator to stop 1/0 errors, makes very little
1320      ! error to the calculated angles < rsmall
1321
1322      zQ11Q11 = 0.1_wp
1323      zQ12Q12 = rsmall
1324      zQ11Q12 = rsmall
1325
1326      IF((ABS( zsigma11 - zsigma22) > rsmall).OR.(ABS(zsigma12) > rsmall)) THEN
1327
1328         zAngle_denom = 1.0_wp/sqrt( ( zsigma11 - zsigma22 )*( zsigma11 - &
1329                       zsigma22 ) + 4.0_wp*zsigma12*zsigma12)
1330
1331         zQ11Q11 = 0.5_wp + ( zsigma11 - zsigma22 )*0.5_wp*zAngle_denom   !Cos^2
1332         zQ12Q12 = 0.5_wp - ( zsigma11 - zsigma22 )*0.5_wp*zAngle_denom   !Sin^2
1333         zQ11Q12 = zsigma12*zAngle_denom                      !CosSin
1334      ENDIF
1335
1336      zsigma_1 = zQ11Q11*zsigma11 + 2.0_wp*zQ11Q12*zsigma12 + zQ12Q12*zsigma22 ! S(1,1)
1337      zsigma_2 = zQ12Q12*zsigma11 - 2.0_wp*zQ11Q12*zsigma12 + zQ11Q11*zsigma22 ! S(2,2)
1338
1339      ! Pure divergence
1340      IF ((zsigma_1 >= 0.0_wp).AND.(zsigma_2 >= 0.0_wp))  THEN
1341         pmresult11 = 0.0_wp
1342         pmresult12 = 0.0_wp
1343
1344      ! Unconfined compression: cracking of blocks not along the axial splitting
1345      ! direction
1346      ! which leads to the loss of their shape, so we again model it through diffusion
1347      ELSEIF ((zsigma_1 >= 0.0_wp).AND.(zsigma_2 < 0.0_wp))  THEN
1348         pmresult11 = - ppkfrac * (pa11 - zQ12Q12)
1349         pmresult12 = - ppkfrac * (pa12 + zQ11Q12)
1350
1351      ! Shear faulting
1352      ELSEIF (zsigma_2 == 0.0_wp) THEN
1353         pmresult11 = 0.0_wp
1354         pmresult12 = 0.0_wp
1355      ELSEIF ((zsigma_1 <= 0.0_wp).AND.(zsigma_1/zsigma_2 <= ppthreshold)) THEN
1356         pmresult11 = - ppkfrac * (pa11 - zQ12Q12)
1357         pmresult12 = - ppkfrac * (pa12 + zQ11Q12)
1358
1359      ! Horizontal spalling
1360      ELSE
1361         pmresult11 = 0.0_wp
1362         pmresult12 = 0.0_wp
1363      ENDIF
1364
1365   END SUBROUTINE calc_ffrac
1366
1367
1368   SUBROUTINE rhg_eap_rst( cdrw, kt )
1369      !!---------------------------------------------------------------------
1370      !!                   ***  ROUTINE rhg_eap_rst  ***
1371      !!
1372      !! ** Purpose :   Read or write RHG file in restart file
1373      !!
1374      !! ** Method  :   use of IOM library
1375      !!----------------------------------------------------------------------
1376      CHARACTER(len=*) , INTENT(in) ::   cdrw   ! "READ"/"WRITE" flag
1377      INTEGER, OPTIONAL, INTENT(in) ::   kt     ! ice time-step
1378      !
1379      INTEGER  ::   iter                      ! local integer
1380      INTEGER  ::   id1, id2, id3, id4, id5   ! local integers
1381      INTEGER  ::   ix, iy, ip, iz, n, ia     ! local integers
1382
1383      INTEGER, PARAMETER            ::    nz = 100
1384
1385      REAL(wp) ::   ainit, xinit, yinit, pinit, zinit
1386      REAL(wp) ::   da, dx, dy, dp, dz, a1
1387
1388      !!clem
1389      REAL(wp) ::   zw1, zw2, zfac, ztemp
1390      REAL(wp) ::   zidx, zidy, zidz
1391      REAL(wp) ::   zsaak(6)                  ! temporary array
1392
1393      REAL(wp), PARAMETER           ::   eps6 = 1.0e-6_wp
1394      !!----------------------------------------------------------------------
1395      !
1396      IF( TRIM(cdrw) == 'READ' ) THEN        ! Read/initialize
1397         !                                   ! ---------------
1398         IF( ln_rstart ) THEN                   !* Read the restart file
1399            !
1400            id1 = iom_varid( numrir, 'stress1_i' , ldstop = .FALSE. )
1401            id2 = iom_varid( numrir, 'stress2_i' , ldstop = .FALSE. )
1402            id3 = iom_varid( numrir, 'stress12_i', ldstop = .FALSE. )
1403            id4 = iom_varid( numrir, 'aniso_11'  , ldstop = .FALSE. )
1404            id5 = iom_varid( numrir, 'aniso_12'  , ldstop = .FALSE. )
1405            !
1406            IF( MIN( id1, id2, id3, id4, id5 ) > 0 ) THEN      ! fields exist
1407               CALL iom_get( numrir, jpdom_auto, 'stress1_i' , stress1_i , cd_type = 'T' )
1408               CALL iom_get( numrir, jpdom_auto, 'stress2_i' , stress2_i , cd_type = 'T' )
1409               CALL iom_get( numrir, jpdom_auto, 'stress12_i', stress12_i, cd_type = 'F' )
1410               CALL iom_get( numrir, jpdom_auto, 'aniso_11'  , aniso_11  , cd_type = 'T' )
1411               CALL iom_get( numrir, jpdom_auto, 'aniso_12'  , aniso_12  , cd_type = 'T' )
1412            ELSE                                     ! start rheology from rest
1413               IF(lwp) WRITE(numout,*)
1414               IF(lwp) WRITE(numout,*) '   ==>>>   previous run without rheology, set stresses to 0'
1415               stress1_i (:,:) = 0._wp
1416               stress2_i (:,:) = 0._wp
1417               stress12_i(:,:) = 0._wp
1418               aniso_11  (:,:) = 0.5_wp
1419               aniso_12  (:,:) = 0._wp
1420            ENDIF
1421         ELSE                                   !* Start from rest
1422            IF(lwp) WRITE(numout,*)
1423            IF(lwp) WRITE(numout,*) '   ==>>>   start from rest: set stresses to 0'
1424            stress1_i (:,:) = 0._wp
1425            stress2_i (:,:) = 0._wp
1426            stress12_i(:,:) = 0._wp
1427            aniso_11  (:,:) = 0.5_wp
1428            aniso_12  (:,:) = 0._wp
1429         ENDIF
1430         !
1431
1432         da = 0.5_wp/real(na_yield-1,kind=wp)
1433         ainit = 0.5_wp - da
1434         dx = rpi/real(nx_yield-1,kind=wp)
1435         xinit = rpi + 0.25_wp*rpi - dx
1436         dz = rpi/real(nz,kind=wp)
1437         zinit = -rpi*0.5_wp
1438         dy = rpi/real(ny_yield-1,kind=wp)
1439         yinit = -dy
1440
1441         s11r(:,:,:) = 0._wp
1442         s12r(:,:,:) = 0._wp
1443         s22r(:,:,:) = 0._wp
1444         s11s(:,:,:) = 0._wp
1445         s12s(:,:,:) = 0._wp
1446         s22s(:,:,:) = 0._wp
1447
1448!!$         DO ia=1,na_yield
1449!!$            DO ix=1,nx_yield
1450!!$               DO iy=1,ny_yield
1451!!$                  s11r(ix,iy,ia) = 0._wp
1452!!$                  s12r(ix,iy,ia) = 0._wp
1453!!$                  s22r(ix,iy,ia) = 0._wp
1454!!$                  s11s(ix,iy,ia) = 0._wp
1455!!$                  s12s(ix,iy,ia) = 0._wp
1456!!$                  s22s(ix,iy,ia) = 0._wp
1457!!$                  IF (ia <= na_yield-1) THEN
1458!!$                     DO iz=1,nz
1459!!$                        s11r(ix,iy,ia) = s11r(ix,iy,ia) + 1*w1(ainit+ia*da)* &
1460!!$                           exp(-w2(ainit+ia*da)*(zinit+iz*dz)*(zinit+iz*dz))* &
1461!!$                           s11kr(xinit+ix*dx,yinit+iy*dy,zinit+iz*dz)*dz/sin(2._wp*pphi)
1462!!$                        s12r(ix,iy,ia) = s12r(ix,iy,ia) + 1*w1(ainit+ia*da)* &
1463!!$                           exp(-w2(ainit+ia*da)*(zinit+iz*dz)*(zinit+iz*dz))* &
1464!!$                           s12kr(xinit+ix*dx,yinit+iy*dy,zinit+iz*dz)*dz/sin(2._wp*pphi)
1465!!$                        s22r(ix,iy,ia) = s22r(ix,iy,ia) + 1*w1(ainit+ia*da)* &
1466!!$                           exp(-w2(ainit+ia*da)*(zinit+iz*dz)*(zinit+iz*dz))* &
1467!!$                           s22kr(xinit+ix*dx,yinit+iy*dy,zinit+iz*dz)*dz/sin(2._wp*pphi)
1468!!$                        s11s(ix,iy,ia) = s11s(ix,iy,ia) + 1*w1(ainit+ia*da)* &
1469!!$                           exp(-w2(ainit+ia*da)*(zinit+iz*dz)*(zinit+iz*dz))* &
1470!!$                           s11ks(xinit+ix*dx,yinit+iy*dy,zinit+iz*dz)*dz/sin(2._wp*pphi)
1471!!$                        s12s(ix,iy,ia) = s12s(ix,iy,ia) + 1*w1(ainit+ia*da)* &
1472!!$                           exp(-w2(ainit+ia*da)*(zinit+iz*dz)*(zinit+iz*dz))* &
1473!!$                           s12ks(xinit+ix*dx,yinit+iy*dy,zinit+iz*dz)*dz/sin(2._wp*pphi)
1474!!$                        s22s(ix,iy,ia) = s22s(ix,iy,ia) + 1*w1(ainit+ia*da)* &
1475!!$                           exp(-w2(ainit+ia*da)*(zinit+iz*dz)*(zinit+iz*dz))* &
1476!!$                           s22ks(xinit+ix*dx,yinit+iy*dy,zinit+iz*dz)*dz/sin(2._wp*pphi)
1477!!$                     ENDDO
1478!!$                     IF (abs(s11r(ix,iy,ia)) < eps6) s11r(ix,iy,ia) = 0._wp
1479!!$                     IF (abs(s12r(ix,iy,ia)) < eps6) s12r(ix,iy,ia) = 0._wp
1480!!$                     IF (abs(s22r(ix,iy,ia)) < eps6) s22r(ix,iy,ia) = 0._wp
1481!!$                     IF (abs(s11s(ix,iy,ia)) < eps6) s11s(ix,iy,ia) = 0._wp
1482!!$                     IF (abs(s12s(ix,iy,ia)) < eps6) s12s(ix,iy,ia) = 0._wp
1483!!$                     IF (abs(s22s(ix,iy,ia)) < eps6) s22s(ix,iy,ia) = 0._wp
1484!!$                  ELSE
1485!!$                     s11r(ix,iy,ia) = 0.5_wp*s11kr(xinit+ix*dx,yinit+iy*dy,0._wp)/sin(2._wp*pphi)
1486!!$                     s12r(ix,iy,ia) = 0.5_wp*s12kr(xinit+ix*dx,yinit+iy*dy,0._wp)/sin(2._wp*pphi)
1487!!$                     s22r(ix,iy,ia) = 0.5_wp*s22kr(xinit+ix*dx,yinit+iy*dy,0._wp)/sin(2._wp*pphi)
1488!!$                     s11s(ix,iy,ia) = 0.5_wp*s11ks(xinit+ix*dx,yinit+iy*dy,0._wp)/sin(2._wp*pphi)
1489!!$                     s12s(ix,iy,ia) = 0.5_wp*s12ks(xinit+ix*dx,yinit+iy*dy,0._wp)/sin(2._wp*pphi)
1490!!$                     s22s(ix,iy,ia) = 0.5_wp*s22ks(xinit+ix*dx,yinit+iy*dy,0._wp)/sin(2._wp*pphi)
1491!!$                     IF (abs(s11r(ix,iy,ia)) < eps6) s11r(ix,iy,ia) = 0._wp
1492!!$                     IF (abs(s12r(ix,iy,ia)) < eps6) s12r(ix,iy,ia) = 0._wp
1493!!$                     IF (abs(s22r(ix,iy,ia)) < eps6) s22r(ix,iy,ia) = 0._wp
1494!!$                     IF (abs(s11s(ix,iy,ia)) < eps6) s11s(ix,iy,ia) = 0._wp
1495!!$                     IF (abs(s12s(ix,iy,ia)) < eps6) s12s(ix,iy,ia) = 0._wp
1496!!$                     IF (abs(s22s(ix,iy,ia)) < eps6) s22s(ix,iy,ia) = 0._wp
1497!!$                  ENDIF
1498!!$               ENDDO
1499!!$            ENDDO
1500!!$         ENDDO
1501
1502         !! faster but still very slow => to be improved
1503         zfac = dz/sin(2._wp*pphi)
1504         DO ia = 1, na_yield-1
1505            zw1 = w1(ainit+ia*da)
1506            zw2 = w2(ainit+ia*da)
1507            DO iz = 1, nz
1508               zidz = zinit+iz*dz
1509               ztemp = zw1 * EXP(-zw2*(zinit+iz*dz)*(zinit+iz*dz))
1510               DO iy = 1, ny_yield
1511                  zidy = yinit+iy*dy
1512                  DO ix = 1, nx_yield
1513                     zidx = xinit+ix*dx
1514                     call all_skr_sks(zidx,zidy,zidz,zsaak)
1515                     zsaak = ztemp*zsaak*zfac
1516                     s11r(ix,iy,ia) = s11r(ix,iy,ia) + zsaak(1)
1517                     s12r(ix,iy,ia) = s12r(ix,iy,ia) + zsaak(2)
1518                     s22r(ix,iy,ia) = s22r(ix,iy,ia) + zsaak(3)
1519                     s11s(ix,iy,ia) = s11s(ix,iy,ia) + zsaak(4)
1520                     s12s(ix,iy,ia) = s12s(ix,iy,ia) + zsaak(5)
1521                     s22s(ix,iy,ia) = s22s(ix,iy,ia) + zsaak(6)
1522                  END DO
1523               END DO
1524            END DO
1525         END DO
1526         zfac = 1._wp/sin(2._wp*pphi)
1527         ia = na_yield
1528         DO iy = 1, ny_yield
1529            zidy = yinit+iy*dy
1530            DO ix = 1, nx_yield
1531               zidx = xinit+ix*dx
1532               call all_skr_sks(zidx,zidy,0._wp,zsaak)
1533               zsaak = 0.5_wp*zsaak*zfac
1534               s11r(ix,iy,ia) = zsaak(1)
1535               s12r(ix,iy,ia) = zsaak(2)
1536               s22r(ix,iy,ia) = zsaak(3)
1537               s11s(ix,iy,ia) = zsaak(4)
1538               s12s(ix,iy,ia) = zsaak(5)
1539               s22s(ix,iy,ia) = zsaak(6)
1540            ENDDO
1541         ENDDO
1542         WHERE (ABS(s11r(:,:,:)) < eps6) s11r(:,:,:) = 0._wp
1543         WHERE (ABS(s12r(:,:,:)) < eps6) s12r(:,:,:) = 0._wp
1544         WHERE (ABS(s22r(:,:,:)) < eps6) s22r(:,:,:) = 0._wp
1545         WHERE (ABS(s11s(:,:,:)) < eps6) s11s(:,:,:) = 0._wp
1546         WHERE (ABS(s12s(:,:,:)) < eps6) s12s(:,:,:) = 0._wp
1547         WHERE (ABS(s22s(:,:,:)) < eps6) s22s(:,:,:) = 0._wp
1548
1549
1550      ELSEIF( TRIM(cdrw) == 'WRITE' ) THEN   ! Create restart file
1551         !                                   ! -------------------
1552         IF(lwp) WRITE(numout,*) '---- rhg-rst ----'
1553         iter = kt + nn_fsbc - 1             ! ice restarts are written at kt == nitrst - nn_fsbc + 1
1554         !
1555         CALL iom_rstput( iter, nitrst, numriw, 'stress1_i' , stress1_i  )
1556         CALL iom_rstput( iter, nitrst, numriw, 'stress2_i' , stress2_i  )
1557         CALL iom_rstput( iter, nitrst, numriw, 'stress12_i', stress12_i )
1558         CALL iom_rstput( iter, nitrst, numriw, 'aniso_11'  , aniso_11   )
1559         CALL iom_rstput( iter, nitrst, numriw, 'aniso_12'  , aniso_12   )
1560         !
1561      ENDIF
1562      !
1563   END SUBROUTINE rhg_eap_rst
1564
1565
1566   FUNCTION w1(pa)
1567      !!-------------------------------------------------------------------
1568      !! Function : w1 (see Gaussian function psi in Tsamados et al 2013)
1569      !!-------------------------------------------------------------------
1570      REAL(wp), INTENT(in   ) ::   pa
1571      REAL(wp) ::   w1
1572      !!-------------------------------------------------------------------
1573
1574      w1 = -   223.87569446_wp &
1575       &   +  2361.21986630_wp*pa &
1576       &   - 10606.56079975_wp*pa*pa &
1577       &   + 26315.50025642_wp*pa*pa*pa &
1578       &   - 38948.30444297_wp*pa*pa*pa*pa &
1579       &   + 34397.72407466_wp*pa*pa*pa*pa*pa &
1580       &   - 16789.98003081_wp*pa*pa*pa*pa*pa*pa &
1581       &   +  3495.82839237_wp*pa*pa*pa*pa*pa*pa*pa
1582
1583   END FUNCTION w1
1584
1585
1586   FUNCTION w2(pa)
1587      !!-------------------------------------------------------------------
1588      !! Function : w2 (see Gaussian function psi in Tsamados et al 2013)
1589      !!-------------------------------------------------------------------
1590      REAL(wp), INTENT(in   ) ::   pa
1591      REAL(wp) ::   w2
1592      !!-------------------------------------------------------------------
1593
1594      w2 = -    6670.68911883_wp &
1595       &   +   70222.33061536_wp*pa &
1596       &   -  314871.71525448_wp*pa*pa &
1597       &   +  779570.02793492_wp*pa*pa*pa &
1598       &   - 1151098.82436864_wp*pa*pa*pa*pa &
1599       &   + 1013896.59464498_wp*pa*pa*pa*pa*pa &
1600       &   -  493379.44906738_wp*pa*pa*pa*pa*pa*pa &
1601       &   +  102356.55151800_wp*pa*pa*pa*pa*pa*pa*pa
1602
1603   END FUNCTION w2
1604
1605   SUBROUTINE all_skr_sks( px, py, pz, allsk )
1606      REAL(wp), INTENT(in   ) ::   px,py,pz
1607      REAL(wp), INTENT(out  ) ::   allsk(6)
1608
1609      REAL(wp) ::   zs12r0, zs21r0
1610      REAL(wp) ::   zs12s0, zs21s0
1611
1612      REAL(wp) ::   zpih
1613      REAL(wp) ::   zn1t2i11, zn1t2i12, zn1t2i21, zn1t2i22
1614      REAL(wp) ::   zn2t1i11, zn2t1i12, zn2t1i21, zn2t1i22
1615      REAL(wp) ::   zt1t2i11, zt1t2i12, zt1t2i21, zt1t2i22
1616      REAL(wp) ::   zt2t1i11, zt2t1i12, zt2t1i21, zt2t1i22
1617      REAL(wp) ::   zd11, zd12, zd22
1618      REAL(wp) ::   zIIn1t2, zIIn2t1, zIIt1t2
1619      REAL(wp) ::   zHen1t2, zHen2t1
1620      !!-------------------------------------------------------------------
1621
1622      zpih = 0.5_wp*rpi
1623
1624      zn1t2i11 = cos(pz+zpih-pphi) * cos(pz+pphi)
1625      zn1t2i12 = cos(pz+zpih-pphi) * sin(pz+pphi)
1626      zn1t2i21 = sin(pz+zpih-pphi) * cos(pz+pphi)
1627      zn1t2i22 = sin(pz+zpih-pphi) * sin(pz+pphi)
1628      zn2t1i11 = cos(pz-zpih+pphi) * cos(pz-pphi)
1629      zn2t1i12 = cos(pz-zpih+pphi) * sin(pz-pphi)
1630      zn2t1i21 = sin(pz-zpih+pphi) * cos(pz-pphi)
1631      zn2t1i22 = sin(pz-zpih+pphi) * sin(pz-pphi)
1632      zt1t2i11 = cos(pz-pphi) * cos(pz+pphi)
1633      zt1t2i12 = cos(pz-pphi) * sin(pz+pphi)
1634      zt1t2i21 = sin(pz-pphi) * cos(pz+pphi)
1635      zt1t2i22 = sin(pz-pphi) * sin(pz+pphi)
1636      zt2t1i11 = cos(pz+pphi) * cos(pz-pphi)
1637      zt2t1i12 = cos(pz+pphi) * sin(pz-pphi)
1638      zt2t1i21 = sin(pz+pphi) * cos(pz-pphi)
1639      zt2t1i22 = sin(pz+pphi) * sin(pz-pphi)
1640   ! In expression of tensor d, with this formulatin d(x)=-d(x+pi)
1641   ! Solution, when diagonalizing always check sgn(a11-a22) if > then keep x else
1642   ! x=x-pi/2
1643      zd11 = cos(py)*cos(py)*(cos(px)+sin(px)*tan(py)*tan(py))
1644      zd12 = cos(py)*cos(py)*tan(py)*(-cos(px)+sin(px))
1645      zd22 = cos(py)*cos(py)*(sin(px)+cos(px)*tan(py)*tan(py))
1646      zIIn1t2 = zn1t2i11 * zd11 + (zn1t2i12 + zn1t2i21) * zd12 + zn1t2i22 * zd22
1647      zIIn2t1 = zn2t1i11 * zd11 + (zn2t1i12 + zn2t1i21) * zd12 + zn2t1i22 * zd22
1648      zIIt1t2 = zt1t2i11 * zd11 + (zt1t2i12 + zt1t2i21) * zd12 + zt1t2i22 * zd22
1649
1650      IF (-zIIn1t2>=rsmall) THEN
1651      zHen1t2 = 1._wp
1652      ELSE
1653      zHen1t2 = 0._wp
1654      ENDIF
1655
1656      IF (-zIIn2t1>=rsmall) THEN
1657      zHen2t1 = 1._wp
1658      ELSE
1659      zHen2t1 = 0._wp
1660      ENDIF
1661
1662      !!-------------------------------------------------------------------
1663      !! Function : s11kr
1664      !!-------------------------------------------------------------------
1665      allsk(1) = (- zHen1t2 * zn1t2i11 - zHen2t1 * zn2t1i11)
1666      !!-------------------------------------------------------------------
1667      !! Function : s12kr
1668      !!-------------------------------------------------------------------
1669      zs12r0 = (- zHen1t2 * zn1t2i12 - zHen2t1 * zn2t1i12)
1670      zs21r0 = (- zHen1t2 * zn1t2i21 - zHen2t1 * zn2t1i21)
1671      allsk(2)=0.5_wp*(zs12r0+zs21r0)
1672      !!-------------------------------------------------------------------
1673      !! Function : s22kr
1674      !!-------------------------------------------------------------------
1675      allsk(3) = (- zHen1t2 * zn1t2i22 - zHen2t1 * zn2t1i22)
1676      !!-------------------------------------------------------------------
1677      !! Function : s11ks
1678      !!-------------------------------------------------------------------
1679
1680      allsk(4) = sign(1._wp,zIIt1t2+rsmall)*(zHen1t2 * zt1t2i11 + zHen2t1 * zt2t1i11)
1681      !!-------------------------------------------------------------------
1682      !! Function : s12ks
1683      !!-------------------------------------------------------------------
1684      zs12s0 = sign(1._wp,zIIt1t2+rsmall)*(zHen1t2 * zt1t2i12 + zHen2t1 * zt2t1i12)
1685      zs21s0 = sign(1._wp,zIIt1t2+rsmall)*(zHen1t2 * zt1t2i21 + zHen2t1 * zt2t1i21)
1686      allsk(5)=0.5_wp*(zs12s0+zs21s0)
1687      !!-------------------------------------------------------------------
1688      !! Function : s22ks
1689      !!-------------------------------------------------------------------
1690      allsk(6) = sign(1._wp,zIIt1t2+rsmall)*(zHen1t2 * zt1t2i22 + zHen2t1 * zt2t1i22)
1691   END SUBROUTINE all_skr_sks
1692
1693#else
1694   !!----------------------------------------------------------------------
1695   !!   Default option         Empty module           NO SI3 sea-ice model
1696   !!----------------------------------------------------------------------
1697   USE par_kind
1698   USE lib_mpp
1699   CONTAINS
1700   SUBROUTINE ice_dyn_rhg_eap( kt, Kmm, pstress1_i, pstress2_i, pstress12_i, pshear_i, pdivu_i, pdelta_i, paniso_11, paniso_12, prdg_conv )
1701      INTEGER                 , INTENT(in   ) ::   kt                                    ! time step
1702      INTEGER                 , INTENT(in   ) ::   Kmm                                   ! ocean time level index
1703      REAL(wp), DIMENSION(:,:), INTENT(in   ) ::   pstress1_i, pstress2_i, pstress12_i   !
1704      REAL(wp), DIMENSION(:,:), INTENT(in   ) ::   pshear_i  , pdivu_i   , pdelta_i      !
1705      REAL(wp), DIMENSION(:,:), INTENT(in   ) ::   paniso_11 , paniso_12                 ! structure tensor components
1706      REAL(wp), DIMENSION(:,:), INTENT(in   ) ::   prdg_conv                             ! for ridging
1707      CALL ctl_stop('EAP rheology is currently dsabled due to issues with AGRIF preprocessing')
1708   END SUBROUTINE ice_dyn_rhg_eap
1709   SUBROUTINE rhg_eap_rst( cdrw, kt )
1710      CHARACTER(len=*) , INTENT(in) ::   cdrw   ! "READ"/"WRITE" flag
1711      INTEGER, OPTIONAL, INTENT(in) ::   kt     ! ice time-step
1712   END SUBROUTINE rhg_eap_rst
1713#endif
1714
1715   !!==============================================================================
1716END MODULE icedyn_rhg_eap
Note: See TracBrowser for help on using the repository browser.