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 @ 8289

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

correct outputs

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