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/2019/dev_r11842_SI3-10_EAP/tests/ICE_RHEO/MY_SRC – NEMO

source: NEMO/branches/2019/dev_r11842_SI3-10_EAP/tests/ICE_RHEO/MY_SRC/icedyn_rhg_eap.F90 @ 13574

Last change on this file since 13574 was 13574, checked in by stefryn, 4 years ago

corrected bug in shear calculation, updated testcase (example output figs for EVP and EAP included)

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