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

source: NEMO/branches/2021/dev_r14318_RK3_stage1/tests/ICE_RHEO/MY_SRC/icedyn_rhg_eap.F90 @ 15574

Last change on this file since 15574 was 15574, checked in by techene, 3 years ago

#2605 #2715 trunk merged into dev_r14318_RK3_stage1

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