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

source: branches/2016/v3_6_CMIP6_ice_diagnostics/NEMOGCM/NEMO/LIM_SRC_3/limrhg.F90 @ 8156

Last change on this file since 8156 was 8156, checked in by vancop, 7 years ago

SIMIP outputs, phase 2, commit #4

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