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

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

STEP2 (2): remove obsolete features

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