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/2016/dev_v3_6_STABLE_r6506_AGRIF_LIM3/NEMOGCM/NEMO/LIM_SRC_3 – NEMO

source: branches/2016/dev_v3_6_STABLE_r6506_AGRIF_LIM3/NEMOGCM/NEMO/LIM_SRC_3/limrhg.F90 @ 6853

Last change on this file since 6853 was 6853, checked in by clem, 8 years ago

correct bugs on LIM3 rheology and outputs. Make sure the ice thickness distribution (used in initialization and bdy boundary conditions) is a gaussian.

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