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

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

STEP3 (2): clean separation between sea-ice and ocean

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