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.
limrhg.F90 in branches/2017/dev_r8183_ICEMODEL/NEMOGCM/NEMO/LIM_SRC_3 – NEMO

source: branches/2017/dev_r8183_ICEMODEL/NEMOGCM/NEMO/LIM_SRC_3/limrhg.F90 @ 8373

Last change on this file since 8373 was 8373, checked in by clem, 7 years ago

remove most of wrk_alloc

  • Property svn:keywords set to Id
File size: 41.5 KB
Line 
1MODULE limrhg
2   !!======================================================================
3   !!                     ***  MODULE  limrhg  ***
4   !!   Ice rheology : sea ice rheology
5   !!======================================================================
6   !! History :   -   !  2007-03  (M.A. Morales Maqueda, S. Bouillon) Original code
7   !!            3.0  !  2008-03  (M. Vancoppenolle) LIM3
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 cas
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 + possibility to use mEVP (Bouillon 2013)
13   !!----------------------------------------------------------------------
14#if defined key_lim3
15   !!----------------------------------------------------------------------
16   !!   'key_lim3'                                      LIM-3 sea-ice model
17   !!----------------------------------------------------------------------
18   !!   lim_rhg       : computes ice velocities
19   !!----------------------------------------------------------------------
20   USE phycst         ! Physical constant
21   USE par_oce        ! Ocean parameters
22   USE dom_oce        ! Ocean domain
23   USE sbc_oce , ONLY : ln_ice_embd, nn_fsbc, ssh_m
24   USE sbc_ice , ONLY : utau_ice, vtau_ice, snwice_mass, snwice_mass_b
25   USE ice            ! ice variables
26   USE limitd_me      ! ice strength
27   USE lbclnk         ! Lateral Boundary Condition / MPP link
28   USE lib_mpp        ! MPP library
29   USE wrk_nemo       ! work arrays
30   USE in_out_manager ! I/O manager
31   USE prtctl         ! Print control
32   USE lib_fortran    ! Fortran utilities (allows no signed zero when 'key_nosignedzero' defined) 
33#if defined key_agrif
34   USE agrif_lim3_interp
35#endif
36   USE bdy_oce   , ONLY: ln_bdy 
37   USE bdyice_lim 
38
39   IMPLICIT NONE
40   PRIVATE
41
42   PUBLIC   lim_rhg        ! routine called by lim_dyn
43
44   !! * Substitutions
45#  include "vectopt_loop_substitute.h90"
46   !!----------------------------------------------------------------------
47   !! NEMO/LIM3 4.0 , UCL - NEMO Consortium (2011)
48   !! $Id$
49   !! Software governed by the CeCILL licence     (NEMOGCM/NEMO_CeCILL.txt)
50   !!----------------------------------------------------------------------
51CONTAINS
52
53   SUBROUTINE lim_rhg
54      !!-------------------------------------------------------------------
55      !!                 ***  SUBROUTINE lim_rhg  ***
56      !!                          EVP-C-grid
57      !!
58      !! ** purpose : determines sea ice drift from wind stress, ice-ocean
59      !!  stress and sea-surface slope. Ice-ice interaction is described by
60      !!  a non-linear elasto-viscous-plastic (EVP) law including shear
61      !!  strength and a bulk rheology (Hunke and Dukowicz, 2002).   
62      !!
63      !!  The points in the C-grid look like this, dear reader
64      !!
65      !!                              (ji,jj)
66      !!                                 |
67      !!                                 |
68      !!                      (ji-1,jj)  |  (ji,jj)
69      !!                             ---------   
70      !!                            |         |
71      !!                            | (ji,jj) |------(ji,jj)
72      !!                            |         |
73      !!                             ---------   
74      !!                     (ji-1,jj-1)     (ji,jj-1)
75      !!
76      !! ** Inputs  : - wind forcing (stress), oceanic currents
77      !!                ice total volume (vt_i) per unit area
78      !!                snow total volume (vt_s) per unit area
79      !!
80      !! ** Action  : - compute u_ice, v_ice : the components of the
81      !!                sea-ice velocity vector
82      !!              - compute delta_i, shear_i, divu_i, which are inputs
83      !!                of the ice thickness distribution
84      !!
85      !! ** Steps   : 1) Compute ice snow mass, ice strength
86      !!              2) Compute wind, oceanic stresses, mass terms and
87      !!                 coriolis terms of the momentum equation
88      !!              3) Solve the momentum equation (iterative procedure)
89      !!              4) Prevent high velocities if the ice is thin
90      !!              5) Recompute invariants of the strain rate tensor
91      !!                 which are inputs of the ITD, store stress
92      !!                 for the next time step
93      !!              6) Control prints of residual (convergence)
94      !!                 and charge ellipse.
95      !!                 The user should make sure that the parameters
96      !!                 nn_nevp, elastic time scale and rn_creepl maintain stress state
97      !!                 on the charge ellipse for plastic flow
98      !!                 e.g. in the Canadian Archipelago
99      !!
100      !! ** Notes   : There is the possibility to use mEVP from Bouillon 2013
101      !!              (by uncommenting some lines in part 3 and changing alpha and beta parameters)
102      !!              but this solution appears very unstable (see Kimmritz et al 2016)
103      !!
104      !! References : Hunke and Dukowicz, JPO97
105      !!              Bouillon et al., Ocean Modelling 2009
106      !!              Bouillon et al., Ocean Modelling 2013
107      !!-------------------------------------------------------------------
108      INTEGER ::   ji, jj       ! dummy loop indices
109      INTEGER ::   jter         ! local integers
110      CHARACTER (len=50) ::   charout
111
112      REAL(wp) ::   zrhoco                                                   ! rau0 * rn_cio
113      REAL(wp) ::   zdtevp, z1_dtevp                                         ! time step for subcycling
114      REAL(wp) ::   ecc2, z1_ecc2                                            ! square of yield ellipse eccenticity
115      REAL(wp) ::   zbeta, zalph1, z1_alph1, zalph2, z1_alph2                ! alpha and beta from Bouillon 2009 and 2013
116      REAL(wp) ::   zm1, zm2, zm3, zmassU, zmassV                            ! ice/snow mass
117      REAL(wp) ::   zdelta, zp_delf, zds2, zdt, zdt2, zdiv, zdiv2            ! temporary scalars
118      REAL(wp) ::   zTauO, zTauB, zTauE, zvel                                ! temporary scalars
119
120      REAL(wp) ::   zsig1, zsig2                                             ! internal ice stress
121      REAL(wp) ::   zresm                                                    ! Maximal error on ice velocity
122      REAL(wp) ::   zintb, zintn                                             ! dummy argument
123      REAL(wp) ::   zfac_x, zfac_y
124     
125      REAL(wp), DIMENSION(jpi,jpj) ::   z1_e1t0, z1_e2t0                ! scale factors
126      REAL(wp), DIMENSION(jpi,jpj) ::   zp_delt                         ! P/delta at T points
127      !
128      REAL(wp), DIMENSION(jpi,jpj) ::   zaU   , zaV                     ! ice fraction on U/V points
129      REAL(wp), DIMENSION(jpi,jpj) ::   zmU_t, zmV_t                    ! ice/snow mass/dt on U/V points
130      REAL(wp), DIMENSION(jpi,jpj) ::   zmf                             ! coriolis parameter at T points
131      REAL(wp), DIMENSION(jpi,jpj) ::   zTauU_ia , ztauV_ia             ! ice-atm. stress at U-V points
132      REAL(wp), DIMENSION(jpi,jpj) ::   zspgU , zspgV                   ! surface pressure gradient at U/V points
133      REAL(wp), DIMENSION(jpi,jpj) ::   v_oceU, u_oceV, v_iceU, u_iceV  ! ocean/ice u/v component on V/U points                           
134      REAL(wp), DIMENSION(jpi,jpj) ::   zfU   , zfV                     ! internal stresses
135     
136      REAL(wp), DIMENSION(jpi,jpj) ::   zds                             ! shear
137      REAL(wp), DIMENSION(jpi,jpj) ::   zs1, zs2, zs12                  ! stress tensor components
138      REAL(wp), DIMENSION(jpi,jpj) ::   zu_ice, zv_ice, zresr           ! check convergence
139      REAL(wp), DIMENSION(jpi,jpj) ::   zpice                           ! array used for the calculation of ice surface slope:
140                                                                             !   ocean surface (ssh_m) if ice is not embedded
141                                                                             !   ice top surface if ice is embedded   
142      REAL(wp), DIMENSION(jpi,jpj) ::   zCorx, zCory                    ! Coriolis stress array
143      REAL(wp), DIMENSION(jpi,jpj) ::   ztaux_oi, ztauy_oi              ! Ocean-to-ice stress array
144
145      REAL(wp), DIMENSION(jpi,jpj) ::   zswitchU, zswitchV              ! dummy arrays
146      REAL(wp), DIMENSION(jpi,jpj) ::   zmaskU, zmaskV                  ! mask for ice presence
147      REAL(wp), DIMENSION(jpi,jpj) ::   zfmask, zwf                     ! mask at F points for the ice
148
149      REAL(wp), PARAMETER          ::   zepsi  = 1.0e-20_wp             ! tolerance parameter
150      REAL(wp), PARAMETER          ::   zmmin  = 1._wp                  ! ice mass (kg/m2) below which ice velocity equals ocean velocity
151      !!-------------------------------------------------------------------
152
153#if defined key_agrif 
154      CALL agrif_interp_lim3( 'U', 0, nn_nevp )   ! First interpolation of coarse values
155      CALL agrif_interp_lim3( 'V', 0, nn_nevp )
156#endif
157      !
158      !------------------------------------------------------------------------------!
159      ! 0) mask at F points for the ice
160      !------------------------------------------------------------------------------!
161      ! ocean/land mask
162      DO jj = 1, jpjm1
163         DO ji = 1, jpim1      ! NO vector opt.
164            zfmask(ji,jj) = tmask(ji,jj,1) * tmask(ji+1,jj,1) * tmask(ji,jj+1,1) * tmask(ji+1,jj+1,1)
165         END DO
166      END DO
167      CALL lbc_lnk( zfmask, 'F', 1._wp )
168
169      ! Lateral boundary conditions on velocity (modify zfmask)
170      zwf(:,:) = zfmask(:,:)
171      DO jj = 2, jpjm1
172         DO ji = fs_2, fs_jpim1   ! vector opt.
173            IF( zfmask(ji,jj) == 0._wp ) THEN
174               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) ) )
175            ENDIF
176         END DO
177      END DO
178      DO jj = 2, jpjm1
179         IF( zfmask(1,jj) == 0._wp ) THEN
180            zfmask(1  ,jj) = rn_ishlat * MIN( 1._wp , MAX( zwf(2,jj), zwf(1,jj+1), zwf(1,jj-1) ) )
181         ENDIF
182         IF( zfmask(jpi,jj) == 0._wp ) THEN
183            zfmask(jpi,jj) = rn_ishlat * MIN( 1._wp , MAX( zwf(jpi,jj+1), zwf(jpim1,jj), zwf(jpi,jj-1) ) )
184         ENDIF
185      END DO
186      DO ji = 2, jpim1
187         IF( zfmask(ji,1) == 0._wp ) THEN
188            zfmask(ji,1  ) = rn_ishlat * MIN( 1._wp , MAX( zwf(ji+1,1), zwf(ji,2), zwf(ji-1,1) ) )
189         ENDIF
190         IF( zfmask(ji,jpj) == 0._wp ) THEN
191            zfmask(ji,jpj) = rn_ishlat * MIN( 1._wp , MAX( zwf(ji+1,jpj), zwf(ji-1,jpj), zwf(ji,jpjm1) ) )
192         ENDIF
193      END DO
194      CALL lbc_lnk( zfmask, 'F', 1._wp )
195
196      !------------------------------------------------------------------------------!
197      ! 1) define some variables and initialize arrays
198      !------------------------------------------------------------------------------!
199      zrhoco = rau0 * rn_cio 
200
201      ! ecc2: square of yield ellipse eccenticrity
202      ecc2    = rn_ecc * rn_ecc
203      z1_ecc2 = 1._wp / ecc2
204
205      ! Time step for subcycling
206      zdtevp   = rdt_ice / REAL( nn_nevp )
207      z1_dtevp = 1._wp / zdtevp
208
209      ! alpha parameters (Bouillon 2009)
210      zalph1 = ( 2._wp * rn_relast * rdt_ice ) * z1_dtevp
211      zalph2 = zalph1 * z1_ecc2
212
213      ! alpha and beta parameters (Bouillon 2013)
214      !!zalph1 = 40.
215      !!zalph2 = 40.
216      !!zbeta  = 3000.
217      !!zbeta = REAL( nn_nevp )   ! close to classical EVP of Hunke (2001)
218
219      z1_alph1 = 1._wp / ( zalph1 + 1._wp )
220      z1_alph2 = 1._wp / ( zalph2 + 1._wp )
221
222      ! Initialise stress tensor
223      zs1 (:,:) = stress1_i (:,:) 
224      zs2 (:,:) = stress2_i (:,:)
225      zs12(:,:) = stress12_i(:,:)
226
227      ! Ice strength
228      CALL lim_itd_me_icestrength( nn_icestr )
229
230      ! scale factors
231      DO jj = 2, jpjm1
232         DO ji = fs_2, fs_jpim1
233            z1_e1t0(ji,jj) = 1._wp / ( e1t(ji+1,jj  ) + e1t(ji,jj  ) )
234            z1_e2t0(ji,jj) = 1._wp / ( e2t(ji  ,jj+1) + e2t(ji,jj  ) )
235         END DO
236      END DO
237           
238      !
239      !------------------------------------------------------------------------------!
240      ! 2) Wind / ocean stress, mass terms, coriolis terms
241      !------------------------------------------------------------------------------!
242
243      IF( ln_ice_embd ) THEN             !== embedded sea ice: compute representative ice top surface ==!
244         !                                           
245         ! average interpolation coeff as used in dynspg = (1/nn_fsbc) * {SUM[n/nn_fsbc], n=0,nn_fsbc-1}
246         !                                               = (1/nn_fsbc)^2 * {SUM[n], n=0,nn_fsbc-1}
247         zintn = REAL( nn_fsbc - 1 ) / REAL( nn_fsbc ) * 0.5_wp     
248         !
249         ! average interpolation coeff as used in dynspg = (1/nn_fsbc) * {SUM[1-n/nn_fsbc], n=0,nn_fsbc-1}
250         !                                               = (1/nn_fsbc)^2 * (nn_fsbc^2 - {SUM[n], n=0,nn_fsbc-1})
251         zintb = REAL( nn_fsbc + 1 ) / REAL( nn_fsbc ) * 0.5_wp
252         !
253         zpice(:,:) = ssh_m(:,:) + ( zintn * snwice_mass(:,:) + zintb * snwice_mass_b(:,:) ) * r1_rau0
254         !
255      ELSE                                    !== non-embedded sea ice: use ocean surface for slope calculation ==!
256         zpice(:,:) = ssh_m(:,:)
257      ENDIF
258
259      DO jj = 2, jpjm1
260         DO ji = fs_2, fs_jpim1
261
262            ! ice fraction at U-V points
263            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)
264            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)
265
266            ! Ice/snow mass at U-V points
267            zm1 = ( rhosn * vt_s(ji  ,jj  ) + rhoic * vt_i(ji  ,jj  ) )
268            zm2 = ( rhosn * vt_s(ji+1,jj  ) + rhoic * vt_i(ji+1,jj  ) )
269            zm3 = ( rhosn * vt_s(ji  ,jj+1) + rhoic * vt_i(ji  ,jj+1) )
270            zmassU = 0.5_wp * ( zm1 * e1e2t(ji,jj) + zm2 * e1e2t(ji+1,jj) ) * r1_e1e2u(ji,jj) * umask(ji,jj,1)
271            zmassV = 0.5_wp * ( zm1 * e1e2t(ji,jj) + zm3 * e1e2t(ji,jj+1) ) * r1_e1e2v(ji,jj) * vmask(ji,jj,1)
272
273            ! Ocean currents at U-V points
274            v_oceU(ji,jj)   = 0.5_wp * ( ( v_oce(ji  ,jj) + v_oce(ji  ,jj-1) ) * e1t(ji+1,jj)    &
275               &                       + ( v_oce(ji+1,jj) + v_oce(ji+1,jj-1) ) * e1t(ji  ,jj) ) * z1_e1t0(ji,jj) * umask(ji,jj,1)
276           
277            u_oceV(ji,jj)   = 0.5_wp * ( ( u_oce(ji,jj  ) + u_oce(ji-1,jj  ) ) * e2t(ji,jj+1)    &
278               &                       + ( u_oce(ji,jj+1) + u_oce(ji-1,jj+1) ) * e2t(ji,jj  ) ) * z1_e2t0(ji,jj) * vmask(ji,jj,1)
279
280            ! Coriolis at T points (m*f)
281            zmf(ji,jj)      = zm1 * ff_t(ji,jj)
282
283            ! m/dt
284            zmU_t(ji,jj)    = zmassU * z1_dtevp
285            zmV_t(ji,jj)    = zmassV * z1_dtevp
286
287            ! Drag ice-atm.
288            zTauU_ia(ji,jj) = zaU(ji,jj) * utau_ice(ji,jj)
289            zTauV_ia(ji,jj) = zaV(ji,jj) * vtau_ice(ji,jj)
290
291            ! Surface pressure gradient (- m*g*GRAD(ssh)) at U-V points
292            zspgU(ji,jj)    = - zmassU * grav * ( zpice(ji+1,jj) - zpice(ji,jj) ) * r1_e1u(ji,jj)
293            zspgV(ji,jj)    = - zmassV * grav * ( zpice(ji,jj+1) - zpice(ji,jj) ) * r1_e2v(ji,jj)
294
295            ! masks
296            zmaskU(ji,jj) = 1._wp - MAX( 0._wp, SIGN( 1._wp, -zmassU ) )  ! 0 if no ice
297            zmaskV(ji,jj) = 1._wp - MAX( 0._wp, SIGN( 1._wp, -zmassV ) )  ! 0 if no ice
298
299            ! switches
300            zswitchU(ji,jj) = MAX( 0._wp, SIGN( 1._wp, zmassU - zmmin ) ) ! 0 if ice mass < zmmin
301            zswitchV(ji,jj) = MAX( 0._wp, SIGN( 1._wp, zmassV - zmmin ) ) ! 0 if ice mass < zmmin
302
303         END DO
304      END DO
305      CALL lbc_lnk( zmf, 'T', 1. )
306      !
307      !------------------------------------------------------------------------------!
308      ! 3) Solution of the momentum equation, iterative procedure
309      !------------------------------------------------------------------------------!
310      !
311      !                                               !----------------------!
312      DO jter = 1 , nn_nevp                           !    loop over jter    !
313         !                                            !----------------------!       
314         IF(ln_ctl) THEN   ! Convergence test
315            DO jj = 1, jpjm1
316               zu_ice(:,jj) = u_ice(:,jj) ! velocity at previous time step
317               zv_ice(:,jj) = v_ice(:,jj)
318            END DO
319         ENDIF
320
321         ! --- divergence, tension & shear (Appendix B of Hunke & Dukowicz, 2002) --- !
322         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
323            DO ji = 1, jpim1
324
325               ! shear at F points
326               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)   &
327                  &         + ( v_ice(ji+1,jj) * r1_e2v(ji+1,jj) - v_ice(ji,jj) * r1_e2v(ji,jj) ) * e2f(ji,jj) * e2f(ji,jj)   &
328                  &         ) * r1_e1e2f(ji,jj) * zfmask(ji,jj)
329
330            END DO
331         END DO
332         CALL lbc_lnk( zds, 'F', 1. )
333
334         DO jj = 2, jpjm1
335            DO ji = 2, jpim1 ! no vector loop
336
337               ! shear**2 at T points (doc eq. A16)
338               zds2 = ( zds(ji,jj  ) * zds(ji,jj  ) * e1e2f(ji,jj  ) + zds(ji-1,jj  ) * zds(ji-1,jj  ) * e1e2f(ji-1,jj  )  &
339                  &   + 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)  &
340                  &   ) * 0.25_wp * r1_e1e2t(ji,jj)
341             
342               ! divergence at T points
343               zdiv  = ( e2u(ji,jj) * u_ice(ji,jj) - e2u(ji-1,jj) * u_ice(ji-1,jj)   &
344                  &    + e1v(ji,jj) * v_ice(ji,jj) - e1v(ji,jj-1) * v_ice(ji,jj-1)   &
345                  &    ) * r1_e1e2t(ji,jj)
346               zdiv2 = zdiv * zdiv
347               
348               ! tension at T points
349               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)   &
350                  &   - ( v_ice(ji,jj) * r1_e1v(ji,jj) - v_ice(ji,jj-1) * r1_e1v(ji,jj-1) ) * e1t(ji,jj) * e1t(ji,jj)   &
351                  &   ) * r1_e1e2t(ji,jj)
352               zdt2 = zdt * zdt
353               
354               ! delta at T points
355               zdelta = SQRT( zdiv2 + ( zdt2 + zds2 ) * z1_ecc2 ) 
356
357               ! P/delta at T points
358               zp_delt(ji,jj) = strength(ji,jj) / ( zdelta + rn_creepl )
359               
360               ! stress at T points
361               zs1(ji,jj) = ( zs1(ji,jj) * zalph1 + zp_delt(ji,jj) * ( zdiv - zdelta ) ) * z1_alph1
362               zs2(ji,jj) = ( zs2(ji,jj) * zalph2 + zp_delt(ji,jj) * ( zdt * z1_ecc2 ) ) * z1_alph2
363             
364            END DO
365         END DO
366         CALL lbc_lnk( zp_delt, 'T', 1. )
367
368         DO jj = 1, jpjm1
369            DO ji = 1, jpim1
370
371               ! P/delta at F points
372               zp_delf = 0.25_wp * ( zp_delt(ji,jj) + zp_delt(ji+1,jj) + zp_delt(ji,jj+1) + zp_delt(ji+1,jj+1) )
373               
374               ! stress at F points
375               zs12(ji,jj)= ( zs12(ji,jj) * zalph2 + zp_delf * ( zds(ji,jj) * z1_ecc2 ) * 0.5_wp ) * z1_alph2
376
377            END DO
378         END DO
379         CALL lbc_lnk_multi( zs1, 'T', 1., zs2, 'T', 1., zs12, 'F', 1. )
380 
381
382         ! --- Ice internal stresses (Appendix C of Hunke and Dukowicz, 2002) --- !
383         DO jj = 2, jpjm1
384            DO ji = fs_2, fs_jpim1               
385
386               ! U points
387               zfU(ji,jj) = 0.5_wp * ( ( zs1(ji+1,jj) - zs1(ji,jj) ) * e2u(ji,jj)                                             &
388                  &                  + ( zs2(ji+1,jj) * e2t(ji+1,jj) * e2t(ji+1,jj) - zs2(ji,jj) * e2t(ji,jj) * e2t(ji,jj)    &
389                  &                    ) * r1_e2u(ji,jj)                                                                      &
390                  &                  + ( zs12(ji,jj) * e1f(ji,jj) * e1f(ji,jj) - zs12(ji,jj-1) * e1f(ji,jj-1) * e1f(ji,jj-1)  &
391                  &                    ) * 2._wp * r1_e1u(ji,jj)                                                              &
392                  &                  ) * r1_e1e2u(ji,jj)
393
394               ! V points
395               zfV(ji,jj) = 0.5_wp * ( ( zs1(ji,jj+1) - zs1(ji,jj) ) * e1v(ji,jj)                                             &
396                  &                  - ( zs2(ji,jj+1) * e1t(ji,jj+1) * e1t(ji,jj+1) - zs2(ji,jj) * e1t(ji,jj) * e1t(ji,jj)    &
397                  &                    ) * r1_e1v(ji,jj)                                                                      &
398                  &                  + ( zs12(ji,jj) * e2f(ji,jj) * e2f(ji,jj) - zs12(ji-1,jj) * e2f(ji-1,jj) * e2f(ji-1,jj)  &
399                  &                    ) * 2._wp * r1_e2v(ji,jj)                                                              &
400                  &                  ) * r1_e1e2v(ji,jj)
401
402               ! u_ice at V point
403               u_iceV(ji,jj) = 0.5_wp * ( ( u_ice(ji,jj  ) + u_ice(ji-1,jj  ) ) * e2t(ji,jj+1)     &
404                  &                     + ( u_ice(ji,jj+1) + u_ice(ji-1,jj+1) ) * e2t(ji,jj  ) ) * z1_e2t0(ji,jj) * vmask(ji,jj,1)
405               
406               ! v_ice at U point
407               v_iceU(ji,jj) = 0.5_wp * ( ( v_ice(ji  ,jj) + v_ice(ji  ,jj-1) ) * e1t(ji+1,jj)     &
408                  &                     + ( v_ice(ji+1,jj) + v_ice(ji+1,jj-1) ) * e1t(ji  ,jj) ) * z1_e1t0(ji,jj) * umask(ji,jj,1)
409
410            END DO
411         END DO
412         !
413         ! --- Computation of ice velocity --- !
414         !  Bouillon et al. 2013 (eq 47-48) => unstable unless alpha, beta are chosen wisely and large nn_nevp
415         !  Bouillon et al. 2009 (eq 34-35) => stable
416         IF( MOD(jter,2) .EQ. 0 ) THEN ! even iterations
417           
418            DO jj = 2, jpjm1
419               DO ji = fs_2, fs_jpim1
420
421                  ! tau_io/(v_oce - v_ice)
422                  zTauO = zaV(ji,jj) * zrhoco * SQRT( ( v_ice (ji,jj) - v_oce (ji,jj) ) * ( v_ice (ji,jj) - v_oce (ji,jj) )  &
423                     &                              + ( u_iceV(ji,jj) - u_oceV(ji,jj) ) * ( u_iceV(ji,jj) - u_oceV(ji,jj) ) )
424
425                  ! Ocean-to-Ice stress
426                  ztauy_oi(ji,jj) = zTauO * ( v_oce(ji,jj) - v_ice(ji,jj) )
427
428                  ! tau_bottom/v_ice
429                  zvel  = MAX( zepsi, SQRT( v_ice(ji,jj) * v_ice(ji,jj) + u_iceV(ji,jj) * u_iceV(ji,jj) ) )
430                  zTauB = - tau_icebfr(ji,jj) / zvel
431
432                  ! Coriolis at V-points (energy conserving formulation)
433                  zCory(ji,jj)  = - 0.25_wp * r1_e2v(ji,jj) *  &
434                     &    ( zmf(ji,jj  ) * ( e2u(ji,jj  ) * u_ice(ji,jj  ) + e2u(ji-1,jj  ) * u_ice(ji-1,jj  ) )  &
435                     &    + zmf(ji,jj+1) * ( e2u(ji,jj+1) * u_ice(ji,jj+1) + e2u(ji-1,jj+1) * u_ice(ji-1,jj+1) ) )
436
437                  ! Sum of external forces (explicit solution) = F + tau_ia + Coriolis + spg + tau_io
438                  zTauE = zfV(ji,jj) + zTauV_ia(ji,jj) + zCory(ji,jj) + zspgV(ji,jj) + ztauy_oi(ji,jj)
439
440                  ! landfast switch => 0 = static friction ; 1 = sliding friction
441                  rswitch = 1._wp - MIN( 1._wp, ABS( SIGN( 1._wp, ztauE - tau_icebfr(ji,jj) ) - SIGN( 1._wp, zTauE ) ) )
442                 
443                  ! ice velocity using implicit formulation (cf Madec doc & Bouillon 2009)
444                  v_ice(ji,jj) = ( (           rswitch   * ( zmV_t(ji,jj) * v_ice(ji,jj)                   &  ! previous velocity
445                     &                                     + zTauE + zTauO * v_ice(ji,jj)                  &  ! F + tau_ia + Coriolis + spg + tau_io(only ocean part)
446                     &                                     ) / MAX( zepsi, zmV_t(ji,jj) + zTauO - zTauB )  &  ! m/dt + tau_io(only ice part) + landfast
447                     &             + ( 1._wp - rswitch ) * v_ice(ji,jj) * MAX( 0._wp, 1._wp - zdtevp * rn_lfrelax )  &  ! static friction => slow decrease to v=0
448                     &             ) * zswitchV(ji,jj) + v_oce(ji,jj) * ( 1._wp - zswitchV(ji,jj) )        &  ! v_ice = v_oce if mass < zmmin
449                     &           ) * zmaskV(ji,jj)
450                  ! Bouillon 2013
451                  !!v_ice(ji,jj) = ( zmV_t(ji,jj) * ( zbeta * v_ice(ji,jj) + v_ice_b(ji,jj) )                  &
452                  !!   &           + zfV(ji,jj) + zCory(ji,jj) + zTauV_ia(ji,jj) + zTauO * v_oce(ji,jj) + zspgV(ji,jj)  &
453                  !!   &           ) / MAX( zmV_t(ji,jj) * ( zbeta + 1._wp ) + zTauO - zTauB, zepsi ) * zswitchV(ji,jj)
454
455               END DO
456            END DO
457            CALL lbc_lnk( v_ice, 'V', -1. )
458           
459#if defined key_agrif
460!!            CALL agrif_interp_lim3( 'V', jter, nn_nevp )
461            CALL agrif_interp_lim3( 'V' )
462#endif
463            IF( ln_bdy ) CALL bdy_ice_lim_dyn( 'V' )
464
465            DO jj = 2, jpjm1
466               DO ji = fs_2, fs_jpim1
467                               
468                  ! tau_io/(u_oce - u_ice)
469                  zTauO = zaU(ji,jj) * zrhoco * SQRT( ( u_ice (ji,jj) - u_oce (ji,jj) ) * ( u_ice (ji,jj) - u_oce (ji,jj) )  &
470                     &                              + ( v_iceU(ji,jj) - v_oceU(ji,jj) ) * ( v_iceU(ji,jj) - v_oceU(ji,jj) ) )
471
472                  ! Ocean-to-Ice stress
473                  ztaux_oi(ji,jj) = zTauO * ( u_oce(ji,jj) - u_ice(ji,jj) )
474
475                  ! tau_bottom/u_ice
476                  zvel  = MAX( zepsi, SQRT( v_iceU(ji,jj) * v_iceU(ji,jj) + u_ice(ji,jj) * u_ice(ji,jj) ) )
477                  zTauB = - tau_icebfr(ji,jj) / zvel
478
479                  ! Coriolis at U-points (energy conserving formulation)
480                  zCorx(ji,jj)  =   0.25_wp * r1_e1u(ji,jj) *  &
481                     &    ( zmf(ji  ,jj) * ( e1v(ji  ,jj) * v_ice(ji  ,jj) + e1v(ji  ,jj-1) * v_ice(ji  ,jj-1) )  &
482                     &    + zmf(ji+1,jj) * ( e1v(ji+1,jj) * v_ice(ji+1,jj) + e1v(ji+1,jj-1) * v_ice(ji+1,jj-1) ) )
483                 
484                  ! Sum of external forces (explicit solution) = F + tau_ia + Coriolis + spg + tau_io
485                  zTauE = zfU(ji,jj) + zTauU_ia(ji,jj) + zCorx(ji,jj) + zspgU(ji,jj) + ztaux_oi(ji,jj)
486
487                  ! landfast switch => 0 = static friction ; 1 = sliding friction
488                  rswitch = 1._wp - MIN( 1._wp, ABS( SIGN( 1._wp, ztauE - tau_icebfr(ji,jj) ) - SIGN( 1._wp, zTauE ) ) )
489
490                  ! ice velocity using implicit formulation (cf Madec doc & Bouillon 2009)
491                  u_ice(ji,jj) = ( (           rswitch   * ( zmU_t(ji,jj) * u_ice(ji,jj)                   &  ! previous velocity
492                     &                                     + zTauE + zTauO * u_ice(ji,jj)                  &  ! F + tau_ia + Coriolis + spg + tau_io(only ocean part)
493                     &                                     ) / MAX( zepsi, zmU_t(ji,jj) + zTauO - zTauB )  &  ! m/dt + tau_io(only ice part) + landfast
494                     &             + ( 1._wp - rswitch ) * u_ice(ji,jj) * MAX( 0._wp, 1._wp - zdtevp * rn_lfrelax )  &  ! static friction => slow decrease to v=0
495                     &             ) * zswitchU(ji,jj) + u_oce(ji,jj) * ( 1._wp - zswitchU(ji,jj) )        &  ! v_ice = v_oce if mass < zmmin
496                     &           ) * zmaskU(ji,jj)
497                  ! Bouillon 2013
498                  !!u_ice(ji,jj) = ( zmU_t(ji,jj) * ( zbeta * u_ice(ji,jj) + u_ice_b(ji,jj) )                  &
499                  !!   &           + zfU(ji,jj) + zCorx(ji,jj) + zTauU_ia(ji,jj) + zTauO * u_oce(ji,jj) + zspgU(ji,jj)  &
500                  !!   &           ) / MAX( zmU_t(ji,jj) * ( zbeta + 1._wp ) + zTauO - zTauB, zepsi ) * zswitchU(ji,jj)
501               END DO
502            END DO
503            CALL lbc_lnk( u_ice, 'U', -1. )
504           
505#if defined key_agrif
506!!            CALL agrif_interp_lim3( 'U', jter, nn_nevp )
507            CALL agrif_interp_lim3( 'U' )
508#endif
509            IF( ln_bdy ) CALL bdy_ice_lim_dyn( 'U' )
510
511         ELSE ! odd iterations
512
513            DO jj = 2, jpjm1
514               DO ji = fs_2, fs_jpim1
515
516                  ! tau_io/(u_oce - u_ice)
517                  zTauO = zaU(ji,jj) * zrhoco * SQRT( ( u_ice (ji,jj) - u_oce (ji,jj) ) * ( u_ice (ji,jj) - u_oce (ji,jj) )  &
518                     &                              + ( v_iceU(ji,jj) - v_oceU(ji,jj) ) * ( v_iceU(ji,jj) - v_oceU(ji,jj) ) )
519
520                  ! Ocean-to-Ice stress
521                  ztaux_oi(ji,jj) = zTauO * ( u_oce(ji,jj) - u_ice(ji,jj) )
522
523                  ! tau_bottom/u_ice
524                  zvel  = MAX( zepsi, SQRT( v_iceU(ji,jj) * v_iceU(ji,jj) + u_ice(ji,jj) * u_ice(ji,jj) ) )
525                  zTauB = - tau_icebfr(ji,jj) / zvel
526
527                  ! Coriolis at U-points (energy conserving formulation)
528                  zCorx(ji,jj)  =   0.25_wp * r1_e1u(ji,jj) *  &
529                     &    ( zmf(ji  ,jj) * ( e1v(ji  ,jj) * v_ice(ji  ,jj) + e1v(ji  ,jj-1) * v_ice(ji  ,jj-1) )  &
530                     &    + zmf(ji+1,jj) * ( e1v(ji+1,jj) * v_ice(ji+1,jj) + e1v(ji+1,jj-1) * v_ice(ji+1,jj-1) ) )
531
532                  ! Sum of external forces (explicit solution) = F + tau_ia + Coriolis + spg + tau_io
533                  zTauE = zfU(ji,jj) + zTauU_ia(ji,jj) + zCorx(ji,jj) + zspgU(ji,jj) + ztaux_oi(ji,jj)
534
535                  ! landfast switch => 0 = static friction ; 1 = sliding friction
536                  rswitch = 1._wp - MIN( 1._wp, ABS( SIGN( 1._wp, ztauE - tau_icebfr(ji,jj) ) - SIGN( 1._wp, zTauE ) ) )
537
538                  ! ice velocity using implicit formulation (cf Madec doc & Bouillon 2009)
539                  u_ice(ji,jj) = ( (           rswitch   * ( zmU_t(ji,jj) * u_ice(ji,jj)                   &  ! previous velocity
540                     &                                     + zTauE + zTauO * u_ice(ji,jj)                  &  ! F + tau_ia + Coriolis + spg + tau_io(only ocean part)
541                     &                                     ) / MAX( zepsi, zmU_t(ji,jj) + zTauO - zTauB )  &  ! m/dt + tau_io(only ice part) + landfast
542                     &             + ( 1._wp - rswitch ) * u_ice(ji,jj) * MAX( 0._wp, 1._wp - zdtevp * rn_lfrelax )  &  ! static friction => slow decrease to v=0
543                     &             ) * zswitchU(ji,jj) + u_oce(ji,jj) * ( 1._wp - zswitchU(ji,jj) )        &  ! v_ice = v_oce if mass < zmmin
544                     &           ) * zmaskU(ji,jj)
545                  ! Bouillon 2013
546                  !!u_ice(ji,jj) = ( zmU_t(ji,jj) * ( zbeta * u_ice(ji,jj) + u_ice_b(ji,jj) )                  &
547                  !!   &           + zfU(ji,jj) + zCorx(ji,jj) + zTauU_ia(ji,jj) + zTauO * u_oce(ji,jj) + zspgU(ji,jj)  &
548                  !!   &           ) / MAX( zmU_t(ji,jj) * ( zbeta + 1._wp ) + zTauO - zTauB, zepsi ) * zswitchU(ji,jj)
549               END DO
550            END DO
551            CALL lbc_lnk( u_ice, 'U', -1. )
552           
553#if defined key_agrif
554!!            CALL agrif_interp_lim3( 'U', jter, nn_nevp )
555            CALL agrif_interp_lim3( 'U' )
556#endif
557            IF( ln_bdy ) CALL bdy_ice_lim_dyn( 'U' )
558
559            DO jj = 2, jpjm1
560               DO ji = fs_2, fs_jpim1
561         
562                  ! tau_io/(v_oce - v_ice)
563                  zTauO = zaV(ji,jj) * zrhoco * SQRT( ( v_ice (ji,jj) - v_oce (ji,jj) ) * ( v_ice (ji,jj) - v_oce (ji,jj) )  &
564                     &                              + ( u_iceV(ji,jj) - u_oceV(ji,jj) ) * ( u_iceV(ji,jj) - u_oceV(ji,jj) ) )
565
566                  ! Ocean-to-Ice stress
567                  ztauy_oi(ji,jj) = zTauO * ( v_oce(ji,jj) - v_ice(ji,jj) )
568
569                  ! tau_bottom/v_ice
570                  zvel  = MAX( zepsi, SQRT( v_ice(ji,jj) * v_ice(ji,jj) + u_iceV(ji,jj) * u_iceV(ji,jj) ) )
571                  ztauB = - tau_icebfr(ji,jj) / zvel
572                 
573                  ! Coriolis at V-points (energy conserving formulation)
574                  zCory(ji,jj)  = - 0.25_wp * r1_e2v(ji,jj) *  &
575                     &    ( zmf(ji,jj  ) * ( e2u(ji,jj  ) * u_ice(ji,jj  ) + e2u(ji-1,jj  ) * u_ice(ji-1,jj  ) )  &
576                     &    + zmf(ji,jj+1) * ( e2u(ji,jj+1) * u_ice(ji,jj+1) + e2u(ji-1,jj+1) * u_ice(ji-1,jj+1) ) )
577
578                  ! Sum of external forces (explicit solution) = F + tau_ia + Coriolis + spg + tau_io
579                  zTauE = zfV(ji,jj) + zTauV_ia(ji,jj) + zCory(ji,jj) + zspgV(ji,jj) + ztauy_oi(ji,jj)
580
581                  ! landfast switch => 0 = static friction (tau_icebfr > zTauE); 1 = sliding friction
582                  rswitch = 1._wp - MIN( 1._wp, ABS( SIGN( 1._wp, zTauE - tau_icebfr(ji,jj) ) - SIGN( 1._wp, zTauE ) ) )
583                 
584                  ! ice velocity using implicit formulation (cf Madec doc & Bouillon 2009)
585                  v_ice(ji,jj) = ( (           rswitch   * ( zmV_t(ji,jj) * v_ice(ji,jj)                   &  ! previous velocity
586                     &                                     + zTauE + zTauO * v_ice(ji,jj)                  &  ! F + tau_ia + Coriolis + spg + tau_io(only ocean part)
587                     &                                     ) / MAX( zepsi, zmV_t(ji,jj) + zTauO - zTauB )  &  ! m/dt + tau_io(only ice part) + landfast
588                     &             + ( 1._wp - rswitch ) * v_ice(ji,jj) * MAX( 0._wp, 1._wp - zdtevp * rn_lfrelax )  &  ! static friction => slow decrease to v=0
589                     &             ) * zswitchV(ji,jj) + v_oce(ji,jj) * ( 1._wp - zswitchV(ji,jj) )        &  ! v_ice = v_oce if mass < zmmin
590                     &           ) * zmaskV(ji,jj)
591                  ! Bouillon 2013
592                  !!v_ice(ji,jj) = ( zmV_t(ji,jj) * ( zbeta * v_ice(ji,jj) + v_ice_b(ji,jj) )                  &
593                  !!   &           + zfV(ji,jj) + zCory(ji,jj) + zTauV_ia(ji,jj) + zTauO * v_oce(ji,jj) + zspgV(ji,jj)  &
594                  !!   &           ) / MAX( zmV_t(ji,jj) * ( zbeta + 1._wp ) + zTauO - zTauB, zepsi ) * zswitchV(ji,jj)
595               END DO
596            END DO
597            CALL lbc_lnk( v_ice, 'V', -1. )
598           
599#if defined key_agrif
600!!            CALL agrif_interp_lim3( 'V', jter, nn_nevp )
601            CALL agrif_interp_lim3( 'V' )
602#endif
603            IF( ln_bdy ) CALL bdy_ice_lim_dyn( 'V' )
604
605         ENDIF
606         
607         IF(ln_ctl) THEN   ! Convergence test
608            DO jj = 2 , jpjm1
609               zresr(:,jj) = MAX( ABS( u_ice(:,jj) - zu_ice(:,jj) ), ABS( v_ice(:,jj) - zv_ice(:,jj) ) )
610            END DO
611            zresm = MAXVAL( zresr( 1:jpi, 2:jpjm1 ) )
612            IF( lk_mpp )   CALL mpp_max( zresm )   ! max over the global domain
613         ENDIF
614         !
615         !                                                ! ==================== !
616      END DO                                              !  end loop over jter  !
617      !                                                   ! ==================== !
618      !
619      !------------------------------------------------------------------------------!
620      ! 4) Recompute delta, shear and div (inputs for mechanical redistribution)
621      !------------------------------------------------------------------------------!
622      DO jj = 1, jpjm1
623         DO ji = 1, jpim1
624
625            ! shear at F points
626            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)   &
627               &         + ( v_ice(ji+1,jj) * r1_e2v(ji+1,jj) - v_ice(ji,jj) * r1_e2v(ji,jj) ) * e2f(ji,jj) * e2f(ji,jj)   &
628               &         ) * r1_e1e2f(ji,jj) * zfmask(ji,jj)
629
630         END DO
631      END DO           
632      CALL lbc_lnk( zds, 'F', 1. )
633     
634      DO jj = 2, jpjm1
635         DO ji = 2, jpim1 ! no vector loop
636           
637            ! tension**2 at T points
638            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)   &
639               &   - ( v_ice(ji,jj) * r1_e1v(ji,jj) - v_ice(ji,jj-1) * r1_e1v(ji,jj-1) ) * e1t(ji,jj) * e1t(ji,jj)   &
640               &   ) * r1_e1e2t(ji,jj)
641            zdt2 = zdt * zdt
642           
643            ! shear**2 at T points (doc eq. A16)
644            zds2 = ( zds(ji,jj  ) * zds(ji,jj  ) * e1e2f(ji,jj  ) + zds(ji-1,jj  ) * zds(ji-1,jj  ) * e1e2f(ji-1,jj  )  &
645               &   + 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)  &
646               &   ) * 0.25_wp * r1_e1e2t(ji,jj)
647           
648            ! shear at T points
649            shear_i(ji,jj) = SQRT( zdt2 + zds2 )
650
651            ! divergence at T points
652            divu_i(ji,jj) = ( e2u(ji,jj) * u_ice(ji,jj) - e2u(ji-1,jj) * u_ice(ji-1,jj)   &
653               &            + e1v(ji,jj) * v_ice(ji,jj) - e1v(ji,jj-1) * v_ice(ji,jj-1)   &
654               &            ) * r1_e1e2t(ji,jj)
655           
656            ! delta at T points
657            zdelta         = SQRT( divu_i(ji,jj) * divu_i(ji,jj) + ( zdt2 + zds2 ) * z1_ecc2 ) 
658            rswitch        = 1._wp - MAX( 0._wp, SIGN( 1._wp, -zdelta ) ) ! 0 if delta=0
659            delta_i(ji,jj) = zdelta + rn_creepl * rswitch
660
661         END DO
662      END DO
663      CALL lbc_lnk_multi( shear_i, 'T', 1., divu_i, 'T', 1., delta_i, 'T', 1. )
664     
665      ! --- Store the stress tensor for the next time step --- !
666      stress1_i (:,:) = zs1 (:,:)
667      stress2_i (:,:) = zs2 (:,:)
668      stress12_i(:,:) = zs12(:,:)
669      !
670
671      !------------------------------------------------------------------------------!
672      ! 5) SIMIP diagnostics
673      !------------------------------------------------------------------------------!
674                           
675      DO jj = 2, jpjm1
676         DO ji = 2, jpim1
677             rswitch  = MAX( 0._wp , SIGN( 1._wp , at_i(ji,jj) - epsi06 ) ) ! 1 if ice, 0 if no ice
678
679             ! Stress tensor invariants (normal and shear stress N/m)
680             diag_sig1(ji,jj) = ( zs1(ji,jj) + zs2(ji,jj) ) * rswitch                                 ! normal stress
681             diag_sig2(ji,jj) = SQRT( ( zs1(ji,jj) - zs2(ji,jj) )**2 + 4*zs12(ji,jj)**2 ) * rswitch   ! shear stress
682
683             ! Stress terms of the momentum equation (N/m2)
684             diag_dssh_dx(ji,jj) = zspgU(ji,jj) * rswitch    ! sea surface slope stress term
685             diag_dssh_dy(ji,jj) = zspgV(ji,jj) * rswitch
686
687             diag_corstrx(ji,jj) = zCorx(ji,jj) * rswitch    ! Coriolis stress term
688             diag_corstry(ji,jj) = zCory(ji,jj) * rswitch
689
690             diag_intstrx(ji,jj) = zfU(ji,jj)   * rswitch    ! internal stress term
691             diag_intstry(ji,jj) = zfV(ji,jj)   * rswitch
692           
693             diag_utau_oi(ji,jj) = ztaux_oi(ji,jj) * rswitch  ! oceanic stress
694             diag_vtau_oi(ji,jj) = ztauy_oi(ji,jj) * rswitch
695
696             ! 2D ice mass, snow mass, area transport arrays (X, Y)
697             zfac_x = 0.5 * u_ice(ji,jj) * e2u(ji,jj) * rswitch
698             zfac_y = 0.5 * v_ice(ji,jj) * e1v(ji,jj) * rswitch
699
700             diag_xmtrp_ice(ji,jj) = rhoic * zfac_x * ( vt_i(ji+1,jj) + vt_i(ji,jj) ) ! ice mass transport, X-component
701             diag_ymtrp_ice(ji,jj) = rhoic * zfac_y * ( vt_i(ji,jj+1) + vt_i(ji,jj) ) !        ''           Y-   ''
702
703             diag_xmtrp_snw(ji,jj) = rhosn * zfac_x * ( vt_s(ji+1,jj) + vt_s(ji,jj) ) ! snow mass transport, X-component
704             diag_ymtrp_snw(ji,jj) = rhosn * zfac_y * ( vt_s(ji,jj+1) + vt_s(ji,jj) ) !          ''          Y-   ''
705
706             diag_xatrp(ji,jj)     = zfac_x * ( at_i(ji+1,jj) + at_i(ji,jj) )         ! area transport,      X-component
707             diag_yatrp(ji,jj)     = zfac_y * ( at_i(ji,jj+1) + at_i(ji,jj) )         !        ''            Y-   ''
708
709         END DO
710      END DO
711
712      CALL lbc_lnk_multi(   diag_sig1   , 'T',  1., diag_sig2   , 'T',  1.,   &
713                 &          diag_dssh_dx, 'U', -1., diag_dssh_dy, 'V', -1.,   &
714                 &          diag_corstrx, 'U', -1., diag_corstry, 'V', -1.,   & 
715                 &          diag_intstrx, 'U', -1., diag_intstry, 'V', -1.    )
716
717      CALL lbc_lnk_multi(   diag_utau_oi, 'U', -1., diag_vtau_oi, 'V', -1.    )
718
719      CALL lbc_lnk_multi(   diag_xmtrp_ice, 'U', -1., diag_xmtrp_snw, 'U', -1., &
720                 &          diag_xatrp    , 'U', -1., diag_ymtrp_ice, 'V', -1., &
721                 &          diag_ymtrp_snw, 'V', -1., diag_yatrp    , 'V', -1.  )
722
723      !
724      !------------------------------------------------------------------------------!
725      ! 6) Control prints of residual and charge ellipse
726      !------------------------------------------------------------------------------!
727      !
728      ! print the residual for convergence
729      IF(ln_ctl) THEN
730         WRITE(charout,FMT="('lim_rhg  : res =',D23.16, ' iter =',I4)") zresm, jter
731         CALL prt_ctl_info(charout)
732         CALL prt_ctl(tab2d_1=u_ice, clinfo1=' lim_rhg  : u_ice :', tab2d_2=v_ice, clinfo2=' v_ice :')
733      ENDIF
734
735      ! print charge ellipse
736      ! This can be desactivated once the user is sure that the stress state
737      ! lie on the charge ellipse. See Bouillon et al. 08 for more details
738      IF(ln_ctl) THEN
739         IF( MOD(kt_ice+nn_fsbc-1,nwrite) == 0 ) THEN
740            WRITE(charout,FMT="('lim_rhg  :', I4, I6, I1, I1, A10)") 1000, kt_ice, 0, 0, ' ch. ell. '
741            CALL prt_ctl_info(charout)
742            DO jj = 2, jpjm1
743               DO ji = 2, jpim1
744                  IF (strength(ji,jj) > 1.0) THEN
745                     zsig1 = ( zs1(ji,jj) + SQRT(zs2(ji,jj)**2 + 4*zs12(ji,jj)**2 ) ) / ( 2*strength(ji,jj) ) 
746                     zsig2 = ( zs1(ji,jj) - SQRT(zs2(ji,jj)**2 + 4*zs12(ji,jj)**2 ) ) / ( 2*strength(ji,jj) )
747                     WRITE(charout,FMT="('lim_rhg  :', I4, I4, D23.16, D23.16, D23.16, D23.16, A10)")
748                     CALL prt_ctl_info(charout)
749                  ENDIF
750               END DO
751            END DO
752            WRITE(charout,FMT="('lim_rhg  :', I4, I6, I1, I1, A10)") 2000, kt_ice, 0, 0, ' ch. ell. '
753            CALL prt_ctl_info(charout)
754         ENDIF
755      ENDIF
756      !
757   END SUBROUTINE lim_rhg
758
759#else
760   !!----------------------------------------------------------------------
761   !!   Default option          Dummy module           NO LIM sea-ice model
762   !!----------------------------------------------------------------------
763CONTAINS
764   SUBROUTINE lim_rhg         ! Dummy routine
765      WRITE(*,*) 'lim_rhg: You should not have seen this print! error?'
766   END SUBROUTINE lim_rhg
767#endif
768
769   !!==============================================================================
770END MODULE limrhg
Note: See TracBrowser for help on using the repository browser.