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

source: branches/2016/dev_r6522_SIMPLIF_3/NEMOGCM/NEMO/LIM_SRC_3/limrhg.F90 @ 6862

Last change on this file since 6862 was 6862, checked in by lovato, 8 years ago

#1729 - trunk: removed key_bdy from the code and set usage of ln_bdy. Tested with SETTE.

  • Property svn:keywords set to Id
File size: 36.3 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   !!----------------------------------------------------------------------
13#if defined key_lim3 || (  defined key_lim2 && ! defined key_lim2_vp )
14   !!----------------------------------------------------------------------
15   !!   'key_lim3'               OR                     LIM-3 sea-ice model
16   !!   'key_lim2' AND NOT 'key_lim2_vp'            EVP LIM-2 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#if defined key_lim3
27   USE ice            ! LIM-3: ice variables
28   USE dom_ice        ! LIM-3: ice domain
29   USE limitd_me      ! LIM-3:
30#else
31   USE ice_2          ! LIM-2: ice variables
32   USE dom_ice_2      ! LIM-2: ice domain
33#endif
34   USE lbclnk         ! Lateral Boundary Condition / MPP link
35   USE lib_mpp        ! MPP library
36   USE wrk_nemo       ! work arrays
37   USE in_out_manager ! I/O manager
38   USE prtctl         ! Print control
39   USE lib_fortran    ! Fortran utilities (allows no signed zero when 'key_nosignedzero' defined) 
40#if defined key_agrif && defined key_lim2
41   USE agrif_lim2_interp
42#endif
43   USE bdy_oce   , ONLY: ln_bdy
44   USE bdyice_lim
45
46   IMPLICIT NONE
47   PRIVATE
48
49   PUBLIC   lim_rhg        ! routine called by lim_dyn (or lim_dyn_2)
50
51   !! * Substitutions
52#  include "vectopt_loop_substitute.h90"
53   !!----------------------------------------------------------------------
54   !! NEMO/LIM3 4.0 , UCL - NEMO Consortium (2011)
55   !! $Id$
56   !! Software governed by the CeCILL licence     (NEMOGCM/NEMO_CeCILL.txt)
57   !!----------------------------------------------------------------------
58CONTAINS
59
60   SUBROUTINE lim_rhg( k_j1, k_jpj )
61      !!-------------------------------------------------------------------
62      !!                 ***  SUBROUTINE lim_rhg  ***
63      !!                          EVP-C-grid
64      !!
65      !! ** purpose : determines sea ice drift from wind stress, ice-ocean
66      !!  stress and sea-surface slope. Ice-ice interaction is described by
67      !!  a non-linear elasto-viscous-plastic (EVP) law including shear
68      !!  strength and a bulk rheology (Hunke and Dukowicz, 2002).   
69      !!
70      !!  The points in the C-grid look like this, dear reader
71      !!
72      !!                              (ji,jj)
73      !!                                 |
74      !!                                 |
75      !!                      (ji-1,jj)  |  (ji,jj)
76      !!                             ---------   
77      !!                            |         |
78      !!                            | (ji,jj) |------(ji,jj)
79      !!                            |         |
80      !!                             ---------   
81      !!                     (ji-1,jj-1)     (ji,jj-1)
82      !!
83      !! ** Inputs  : - wind forcing (stress), oceanic currents
84      !!                ice total volume (vt_i) per unit area
85      !!                snow total volume (vt_s) per unit area
86      !!
87      !! ** Action  : - compute u_ice, v_ice : the components of the
88      !!                sea-ice velocity vector
89      !!              - compute delta_i, shear_i, divu_i, which are inputs
90      !!                of the ice thickness distribution
91      !!
92      !! ** Steps   : 1) Compute ice snow mass, ice strength
93      !!              2) Compute wind, oceanic stresses, mass terms and
94      !!                 coriolis terms of the momentum equation
95      !!              3) Solve the momentum equation (iterative procedure)
96      !!              4) Prevent high velocities if the ice is thin
97      !!              5) Recompute invariants of the strain rate tensor
98      !!                 which are inputs of the ITD, store stress
99      !!                 for the next time step
100      !!              6) Control prints of residual (convergence)
101      !!                 and charge ellipse.
102      !!                 The user should make sure that the parameters
103      !!                 nn_nevp, elastic time scale and rn_creepl maintain stress state
104      !!                 on the charge ellipse for plastic flow
105      !!                 e.g. in the Canadian Archipelago
106      !!
107      !! References : Hunke and Dukowicz, JPO97
108      !!              Bouillon et al., Ocean Modelling 2009
109      !!-------------------------------------------------------------------
110      INTEGER, INTENT(in) ::   k_j1    ! southern j-index for ice computation
111      INTEGER, INTENT(in) ::   k_jpj   ! northern j-index for ice computation
112      !!
113      INTEGER ::   ji, jj   ! dummy loop indices
114      INTEGER ::   jter     ! local integers
115      CHARACTER (len=50) ::   charout
116      REAL(wp) ::   zt11, zt12, zt21, zt22, ztagnx, ztagny, delta                         !
117      REAL(wp) ::   za, zstms          ! local scalars
118      REAL(wp) ::   zc1, zc2, zc3      ! ice mass
119
120      REAL(wp) ::   dtevp , z1_dtevp              ! time step for subcycling
121      REAL(wp) ::   dtotel, z1_dtotel, ecc2, ecci ! square of yield ellipse eccenticity
122      REAL(wp) ::   z0, zr, zcca, zccb            ! temporary scalars
123      REAL(wp) ::   zu_ice2, zv_ice1              !
124      REAL(wp) ::   zddc, zdtc                    ! delta on corners and on centre
125      REAL(wp) ::   zdst                          ! shear at the center of the grid point
126      REAL(wp) ::   zdsshx, zdsshy                ! term for the gradient of ocean surface
127      REAL(wp) ::   sigma1, sigma2                ! internal ice stress
128
129      REAL(wp) ::   zresm         ! Maximal error on ice velocity
130      REAL(wp) ::   zintb, zintn  ! dummy argument
131
132      REAL(wp), POINTER, DIMENSION(:,:) ::   zpresh           ! temporary array for ice strength
133      REAL(wp), POINTER, DIMENSION(:,:) ::   zpreshc          ! Ice strength on grid cell corners (zpreshc)
134      REAL(wp), POINTER, DIMENSION(:,:) ::   zfrld1, zfrld2   ! lead fraction on U/V points
135      REAL(wp), POINTER, DIMENSION(:,:) ::   zmass1, zmass2   ! ice/snow mass on U/V points
136      REAL(wp), POINTER, DIMENSION(:,:) ::   zcorl1, zcorl2   ! coriolis parameter on U/V points
137      REAL(wp), POINTER, DIMENSION(:,:) ::   za1ct , za2ct    ! temporary arrays
138      REAL(wp), POINTER, DIMENSION(:,:) ::   v_oce1           ! ocean u/v component on U points                           
139      REAL(wp), POINTER, DIMENSION(:,:) ::   u_oce2           ! ocean u/v component on V points
140      REAL(wp), POINTER, DIMENSION(:,:) ::   u_ice2, v_ice1   ! ice u/v component on V/U point
141      REAL(wp), POINTER, DIMENSION(:,:) ::   zf1   , zf2      ! arrays for internal stresses
142      REAL(wp), POINTER, DIMENSION(:,:) ::   zmask            ! mask ocean grid points
143     
144      REAL(wp), POINTER, DIMENSION(:,:) ::   zdt              ! tension at centre of grid cells
145      REAL(wp), POINTER, DIMENSION(:,:) ::   zds              ! Shear on northeast corner of grid cells
146      REAL(wp), POINTER, DIMENSION(:,:) ::   zs1   , zs2      ! Diagonal stress tensor components zs1 and zs2
147      REAL(wp), POINTER, DIMENSION(:,:) ::   zs12             ! Non-diagonal stress tensor component zs12
148      REAL(wp), POINTER, DIMENSION(:,:) ::   zu_ice, zv_ice, zresr   ! Local error on velocity
149      REAL(wp), POINTER, DIMENSION(:,:) ::   zpice            ! array used for the calculation of ice surface slope:
150                                                              !   ocean surface (ssh_m) if ice is not embedded
151                                                              !   ice top surface if ice is embedded   
152
153      REAL(wp), PARAMETER               ::   zepsi = 1.0e-20_wp ! tolerance parameter
154      REAL(wp), PARAMETER               ::   zvmin = 1.0e-03_wp ! ice volume below which ice velocity equals ocean velocity
155      !!-------------------------------------------------------------------
156
157      CALL wrk_alloc( jpi,jpj, zpresh, zfrld1, zmass1, zcorl1, za1ct , zpreshc, zfrld2, zmass2, zcorl2, za2ct )
158      CALL wrk_alloc( jpi,jpj, u_oce2, u_ice2, v_oce1 , v_ice1 , zmask               )
159      CALL wrk_alloc( jpi,jpj, zf1   , zu_ice, zf2   , zv_ice , zdt    , zds  )
160      CALL wrk_alloc( jpi,jpj, zs1   , zs2   , zs12   , zresr , zpice                 )
161
162#if  defined key_lim2 && ! defined key_lim2_vp
163# if defined key_agrif
164      USE ice_2, vt_s => hsnm
165      USE ice_2, vt_i => hicm
166# else
167      vt_s => hsnm
168      vt_i => hicm
169# endif
170      at_i(:,:) = 1. - frld(:,:)
171#endif
172#if defined key_agrif && defined key_lim2 
173      CALL agrif_rhg_lim2_load      ! First interpolation of coarse values
174#endif
175      !
176      !------------------------------------------------------------------------------!
177      ! 1) Ice strength (zpresh)                                !
178      !------------------------------------------------------------------------------!
179      !
180      ! Put every vector to 0
181      delta_i(:,:) = 0._wp   ;
182      zpresh (:,:) = 0._wp   ; 
183      zpreshc(:,:) = 0._wp
184      u_ice2 (:,:) = 0._wp   ;   v_ice1(:,:) = 0._wp
185      divu_i (:,:) = 0._wp   ;   zdt   (:,:) = 0._wp   ;   zds(:,:) = 0._wp
186      shear_i(:,:) = 0._wp
187
188#if defined key_lim3
189      CALL lim_itd_me_icestrength( nn_icestr )      ! LIM-3: Ice strength on T-points
190#endif
191
192      DO jj = k_j1 , k_jpj       ! Ice mass and temp variables
193         DO ji = 1 , jpi
194#if defined key_lim3
195            zpresh(ji,jj) = tmask(ji,jj,1) *  strength(ji,jj)
196#endif
197#if defined key_lim2
198            zpresh(ji,jj) = tmask(ji,jj,1) *  pstar * vt_i(ji,jj) * EXP( -c_rhg * (1. - at_i(ji,jj) ) )
199#endif
200            ! zmask = 1 where there is ice or on land
201            zmask(ji,jj)    = 1._wp - ( 1._wp - MAX( 0._wp , SIGN ( 1._wp , vt_i(ji,jj) - zepsi ) ) ) * tmask(ji,jj,1)
202         END DO
203      END DO
204
205      ! Ice strength on grid cell corners (zpreshc)
206      ! needed for calculation of shear stress
207      DO jj = k_j1+1, k_jpj-1
208         DO ji = 2, jpim1 !RB caution no fs_ (ji+1,jj+1)
209            zstms          =  tmask(ji+1,jj+1,1) * wght(ji+1,jj+1,2,2) + tmask(ji,jj+1,1) * wght(ji+1,jj+1,1,2) +   &
210               &              tmask(ji+1,jj,1)   * wght(ji+1,jj+1,2,1) + tmask(ji,jj,1)   * wght(ji+1,jj+1,1,1)
211            zpreshc(ji,jj) = ( zpresh(ji+1,jj+1) * wght(ji+1,jj+1,2,2) + zpresh(ji,jj+1) * wght(ji+1,jj+1,1,2) +   &
212               &               zpresh(ji+1,jj)   * wght(ji+1,jj+1,2,1) + zpresh(ji,jj)   * wght(ji+1,jj+1,1,1)     &
213               &             ) / MAX( zstms, zepsi )
214         END DO
215      END DO
216      CALL lbc_lnk( zpreshc(:,:), 'F', 1. )
217      !
218      !------------------------------------------------------------------------------!
219      ! 2) Wind / ocean stress, mass terms, coriolis terms
220      !------------------------------------------------------------------------------!
221      !
222      !  Wind stress, coriolis and mass terms on the sides of the squares       
223      !  zfrld1: lead fraction on U-points                                     
224      !  zfrld2: lead fraction on V-points                                     
225      !  zmass1: ice/snow mass on U-points                                   
226      !  zmass2: ice/snow mass on V-points                                   
227      !  zcorl1: Coriolis parameter on U-points                             
228      !  zcorl2: Coriolis parameter on V-points                           
229      !  (ztagnx,ztagny): wind stress on U/V points                       
230      !  v_oce1: ocean v component on u points                         
231      !  u_oce2: ocean u component on v points                         
232
233      IF( nn_ice_embd == 2 ) THEN             !== embedded sea ice: compute representative ice top surface ==!
234         !                                           
235         ! average interpolation coeff as used in dynspg = (1/nn_fsbc) * {SUM[n/nn_fsbc], n=0,nn_fsbc-1}
236         !                                               = (1/nn_fsbc)^2 * {SUM[n], n=0,nn_fsbc-1}
237         zintn = REAL( nn_fsbc - 1 ) / REAL( nn_fsbc ) * 0.5_wp     
238         !
239         ! average interpolation coeff as used in dynspg = (1/nn_fsbc) * {SUM[1-n/nn_fsbc], n=0,nn_fsbc-1}
240         !                                               = (1/nn_fsbc)^2 * (nn_fsbc^2 - {SUM[n], n=0,nn_fsbc-1})
241         zintb = REAL( nn_fsbc + 1 ) / REAL( nn_fsbc ) * 0.5_wp
242         !
243         zpice(:,:) = ssh_m(:,:) + (  zintn * snwice_mass(:,:) +  zintb * snwice_mass_b(:,:)  ) * r1_rau0
244         !
245      ELSE                                    !== non-embedded sea ice: use ocean surface for slope calculation ==!
246         zpice(:,:) = ssh_m(:,:)
247      ENDIF
248
249      DO jj = k_j1+1, k_jpj-1
250         DO ji = fs_2, fs_jpim1
251
252            zc1 = tmask(ji  ,jj  ,1) * ( rhosn * vt_s(ji  ,jj  ) + rhoic * vt_i(ji  ,jj  ) )
253            zc2 = tmask(ji+1,jj  ,1) * ( rhosn * vt_s(ji+1,jj  ) + rhoic * vt_i(ji+1,jj  ) )
254            zc3 = tmask(ji  ,jj+1,1) * ( rhosn * vt_s(ji  ,jj+1) + rhoic * vt_i(ji  ,jj+1) )
255
256            zt11 = tmask(ji  ,jj,1) * e1t(ji  ,jj)
257            zt12 = tmask(ji+1,jj,1) * e1t(ji+1,jj)
258            zt21 = tmask(ji,jj  ,1) * e2t(ji,jj  )
259            zt22 = tmask(ji,jj+1,1) * e2t(ji,jj+1)
260
261            ! Leads area.
262            zfrld1(ji,jj) = ( zt12 * ( 1.0 - at_i(ji,jj) ) + zt11 * ( 1.0 - at_i(ji+1,jj) ) ) / ( zt11 + zt12 + zepsi )
263            zfrld2(ji,jj) = ( zt22 * ( 1.0 - at_i(ji,jj) ) + zt21 * ( 1.0 - at_i(ji,jj+1) ) ) / ( zt21 + zt22 + zepsi )
264
265            ! Mass, coriolis coeff. and currents
266            zmass1(ji,jj) = ( zt12 * zc1 + zt11 * zc2 ) / ( zt11 + zt12 + zepsi )
267            zmass2(ji,jj) = ( zt22 * zc1 + zt21 * zc3 ) / ( zt21 + zt22 + zepsi )
268            zcorl1(ji,jj) = zmass1(ji,jj) * ( e1t(ji+1,jj) * fcor(ji,jj) + e1t(ji,jj) * fcor(ji+1,jj) )   &
269               &                          / ( e1t(ji,jj) + e1t(ji+1,jj) + zepsi )
270            zcorl2(ji,jj) = zmass2(ji,jj) * ( e2t(ji,jj+1) * fcor(ji,jj) + e2t(ji,jj) * fcor(ji,jj+1) )   &
271               &                          / ( e2t(ji,jj+1) + e2t(ji,jj) + zepsi )
272            !
273            ! Ocean has no slip boundary condition
274            v_oce1(ji,jj)  = 0.5 * ( ( v_oce(ji  ,jj) + v_oce(ji  ,jj-1) ) * e1t(ji,jj)      &
275               &                   + ( v_oce(ji+1,jj) + v_oce(ji+1,jj-1) ) * e1t(ji+1,jj) )  &
276               &                   / ( e1t(ji+1,jj) + e1t(ji,jj) ) * umask(ji,jj,1) 
277
278            u_oce2(ji,jj)  = 0.5 * ( ( u_oce(ji,jj  ) + u_oce(ji-1,jj  ) ) * e2t(ji,jj)      &
279               &                   + ( u_oce(ji,jj+1) + u_oce(ji-1,jj+1) ) * e2t(ji,jj+1) )  &
280               &                   / ( e2t(ji,jj+1) + e2t(ji,jj) ) * vmask(ji,jj,1)
281
282            ! Wind stress at U,V-point
283            ztagnx = ( 1. - zfrld1(ji,jj) ) * utau_ice(ji,jj)
284            ztagny = ( 1. - zfrld2(ji,jj) ) * vtau_ice(ji,jj)
285
286            ! Computation of the velocity field taking into account the ice internal interaction.
287            ! Terms that are independent of the velocity field.
288
289            ! SB On utilise maintenant le gradient de la pente de l'ocean
290            ! include it later
291
292            zdsshx =  ( zpice(ji+1,jj) - zpice(ji,jj) ) * r1_e1u(ji,jj)
293            zdsshy =  ( zpice(ji,jj+1) - zpice(ji,jj) ) * r1_e2v(ji,jj)
294
295            za1ct(ji,jj) = ztagnx - zmass1(ji,jj) * grav * zdsshx
296            za2ct(ji,jj) = ztagny - zmass2(ji,jj) * grav * zdsshy
297
298         END DO
299      END DO
300
301      !
302      !------------------------------------------------------------------------------!
303      ! 3) Solution of the momentum equation, iterative procedure
304      !------------------------------------------------------------------------------!
305      !
306      ! Time step for subcycling
307      dtevp  = rdt_ice / nn_nevp
308#if defined key_lim3
309      dtotel = dtevp / ( 2._wp * rn_relast * rdt_ice )
310#else
311      dtotel = dtevp / ( 2._wp * telast )
312#endif
313      z1_dtotel = 1._wp / ( 1._wp + dtotel )
314      z1_dtevp  = 1._wp / dtevp
315      !-ecc2: square of yield ellipse eccenticrity (reminder: must become a namelist parameter)
316      ecc2 = rn_ecc * rn_ecc
317      ecci = 1. / ecc2
318
319      !-Initialise stress tensor
320      zs1 (:,:) = stress1_i (:,:) 
321      zs2 (:,:) = stress2_i (:,:)
322      zs12(:,:) = stress12_i(:,:)
323
324      !                                               !----------------------!
325      DO jter = 1 , nn_nevp                           !    loop over jter    !
326         !                                            !----------------------!       
327         DO jj = k_j1, k_jpj-1
328            zu_ice(:,jj) = u_ice(:,jj)    ! velocity at previous time step
329            zv_ice(:,jj) = v_ice(:,jj)
330         END DO
331
332         DO jj = k_j1+1, k_jpj-1
333            DO ji = fs_2, fs_jpim1   !RB bug no vect opt due to zmask
334
335               
336               !- Divergence, tension and shear (Section a. Appendix B of Hunke & Dukowicz, 2002)
337               !- divu_i(:,:), zdt(:,:): divergence and tension at centre of grid cells
338               !- zds(:,:): shear on northeast corner of grid cells
339               !
340               !- IMPORTANT REMINDER: Dear Gurvan, note that, the way these terms are coded,
341               !                      there are many repeated calculations.
342               !                      Speed could be improved by regrouping terms. For
343               !                      the moment, however, the stress is on clarity of coding to avoid
344               !                      bugs (Martin, for Miguel).
345               !
346               !- ALSO: arrays zdt, zds and delta could
347               !  be removed in the future to minimise memory demand.
348               !
349               !- MORE NOTES: Note that we are calculating deformation rates and stresses on the corners of
350               !              grid cells, exactly as in the B grid case. For simplicity, the indexation on
351               !              the corners is the same as in the B grid.
352               !
353               !
354               divu_i(ji,jj) = (  e2u(ji,jj) * u_ice(ji,jj) - e2u(ji-1,jj) * u_ice(ji-1,jj)   &
355                  &             + e1v(ji,jj) * v_ice(ji,jj) - e1v(ji,jj-1) * v_ice(ji,jj-1)   &
356                  &            ) * r1_e1e2t(ji,jj)
357
358               zdt(ji,jj) = ( ( 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
362               !
363               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)   &
364                  &         + ( v_ice(ji+1,jj) * r1_e2v(ji+1,jj) - v_ice(ji,jj) * r1_e2v(ji,jj) ) * e2f(ji,jj) * e2f(ji,jj)   &
365                  &         ) * r1_e1e2f(ji,jj) * ( 2._wp - fmask(ji,jj,1) )   &
366                  &         * zmask(ji,jj) * zmask(ji,jj+1) * zmask(ji+1,jj) * zmask(ji+1,jj+1)
367
368
369               v_ice1(ji,jj)  = 0.5_wp * ( ( v_ice(ji  ,jj) + v_ice(ji  ,jj-1) ) * e1t(ji+1,jj)     &
370                  &                      + ( v_ice(ji+1,jj) + v_ice(ji+1,jj-1) ) * e1t(ji  ,jj) )   &
371                  &                      / ( e1t(ji+1,jj) + e1t(ji,jj) ) * umask(ji,jj,1) 
372
373               u_ice2(ji,jj)  = 0.5_wp * ( ( u_ice(ji,jj  ) + u_ice(ji-1,jj  ) ) * e2t(ji,jj+1)     &
374                  &                      + ( u_ice(ji,jj+1) + u_ice(ji-1,jj+1) ) * e2t(ji,jj  ) )   &
375                  &                      / ( e2t(ji,jj+1) + e2t(ji,jj) ) * vmask(ji,jj,1)
376            END DO
377         END DO
378
379         CALL lbc_lnk_multi( v_ice1, 'U', -1., u_ice2, 'V', -1. )      ! lateral boundary cond.
380         
381         DO jj = k_j1+1, k_jpj-1
382            DO ji = fs_2, fs_jpim1
383
384               !- Calculate Delta at centre of grid cells
385               zdst          = ( e2u(ji,jj) * v_ice1(ji,jj) - e2u(ji-1,jj  ) * v_ice1(ji-1,jj  )   &
386                  &            + e1v(ji,jj) * u_ice2(ji,jj) - e1v(ji  ,jj-1) * u_ice2(ji  ,jj-1)   &
387                  &            ) * r1_e1e2t(ji,jj)
388
389               delta          = SQRT( divu_i(ji,jj)**2 + ( zdt(ji,jj)**2 + zdst**2 ) * usecc2 ) 
390               delta_i(ji,jj) = delta + rn_creepl
391
392               !- Calculate Delta on corners
393               zddc  = (  ( v_ice1(ji,jj+1) * r1_e1u(ji,jj+1) - v_ice1(ji,jj) * r1_e1u(ji,jj) ) * e1f(ji,jj) * e1f(ji,jj)  &
394                  &     + ( u_ice2(ji+1,jj) * r1_e2v(ji+1,jj) - u_ice2(ji,jj) * r1_e2v(ji,jj) ) * e2f(ji,jj) * e2f(ji,jj)  &
395                  &    ) * r1_e1e2f(ji,jj)
396
397               zdtc  = (- ( v_ice1(ji,jj+1) * r1_e1u(ji,jj+1) - v_ice1(ji,jj) * r1_e1u(ji,jj) ) * e1f(ji,jj) * e1f(ji,jj)  &
398                  &     + ( u_ice2(ji+1,jj) * r1_e2v(ji+1,jj) - u_ice2(ji,jj) * r1_e2v(ji,jj) ) * e2f(ji,jj) * e2f(ji,jj)  &
399                  &    ) * r1_e1e2f(ji,jj)
400
401               zddc = SQRT( zddc**2 + ( zdtc**2 + zds(ji,jj)**2 ) * usecc2 ) + rn_creepl
402
403               !-Calculate stress tensor components zs1 and zs2 at centre of grid cells (see section 3.5 of CICE user's guide).
404               zs1(ji,jj)  = ( zs1 (ji,jj) + dtotel * ( divu_i(ji,jj) - delta ) / delta_i(ji,jj)   * zpresh(ji,jj)   &
405                  &          ) * z1_dtotel
406               zs2(ji,jj)  = ( zs2 (ji,jj) + dtotel *         ecci * zdt(ji,jj) / delta_i(ji,jj)   * zpresh(ji,jj)   &
407                  &          ) * z1_dtotel
408               !-Calculate stress tensor component zs12 at corners
409               zs12(ji,jj) = ( zs12(ji,jj) + dtotel *         ecci * zds(ji,jj) / ( 2._wp * zddc ) * zpreshc(ji,jj)  &
410                  &          ) * z1_dtotel 
411
412            END DO
413         END DO
414
415         CALL lbc_lnk_multi( zs1 , 'T', 1., zs2, 'T', 1., zs12, 'F', 1. )
416 
417         ! Ice internal stresses (Appendix C of Hunke and Dukowicz, 2002)
418         DO jj = k_j1+1, k_jpj-1
419            DO ji = fs_2, fs_jpim1
420               !- contribution of zs1, zs2 and zs12 to zf1
421               zf1(ji,jj) = 0.5 * ( ( zs1(ji+1,jj) - zs1(ji,jj) ) * e2u(ji,jj)  &
422                  &             + ( zs2(ji+1,jj) * e2t(ji+1,jj)**2 - zs2(ji,jj) * e2t(ji,jj)**2 ) * r1_e2u(ji,jj)          &
423                  &             + 2.0 * ( zs12(ji,jj) * e1f(ji,jj)**2 - zs12(ji,jj-1) * e1f(ji,jj-1)**2 ) * r1_e1u(ji,jj)  &
424                  &                ) * r1_e1e2u(ji,jj)
425               ! contribution of zs1, zs2 and zs12 to zf2
426               zf2(ji,jj) = 0.5 * ( ( zs1(ji,jj+1) - zs1(ji,jj) ) * e1v(ji,jj)  &
427                  &             - ( zs2(ji,jj+1) * e1t(ji,jj+1)**2 - zs2(ji,jj) * e1t(ji,jj)**2 ) * r1_e1v(ji,jj)          &
428                  &             + 2.0 * ( zs12(ji,jj) * e2f(ji,jj)**2 - zs12(ji-1,jj) * e2f(ji-1,jj)**2 ) * r1_e2v(ji,jj)  &
429                  &               )  * r1_e1e2v(ji,jj)
430            END DO
431         END DO
432         !
433         ! Computation of ice velocity
434         !
435         ! Both the Coriolis term and the ice-ocean drag are solved semi-implicitly.
436         !
437         IF (MOD(jter,2).eq.0) THEN
438
439            DO jj = k_j1+1, k_jpj-1
440               DO ji = fs_2, fs_jpim1
441                  rswitch      = ( 1.0 - MAX( 0._wp, SIGN( 1._wp, -zmass1(ji,jj) ) ) ) * umask(ji,jj,1)
442                  z0           = zmass1(ji,jj) * z1_dtevp
443
444                  ! SB modif because ocean has no slip boundary condition
445                  zv_ice1      = 0.5 * ( ( v_ice(ji  ,jj) + v_ice(ji  ,jj-1) ) * e1t(ji  ,jj)     &
446                     &                 + ( v_ice(ji+1,jj) + v_ice(ji+1,jj-1) ) * e1t(ji+1,jj) )   &
447                     &                 / ( e1t(ji+1,jj) + e1t(ji,jj) ) * umask(ji,jj,1)
448                  za           = rhoco * SQRT( ( u_ice(ji,jj) - u_oce(ji,jj) )**2 +  &
449                     &                         ( zv_ice1 - v_oce1(ji,jj) )**2 ) * ( 1.0 - zfrld1(ji,jj) )
450                  zr           = z0 * u_ice(ji,jj) + zf1(ji,jj) + za1ct(ji,jj) + za * u_oce(ji,jj)
451                  zcca         = z0 + za
452                  zccb         = zcorl1(ji,jj)
453                  u_ice(ji,jj) = ( zr + zccb * zv_ice1 ) / ( zcca + zepsi ) * rswitch 
454               END DO
455            END DO
456
457            CALL lbc_lnk( u_ice(:,:), 'U', -1. )
458#if defined key_agrif && defined key_lim2
459            CALL agrif_rhg_lim2( jter, nn_nevp, 'U' )
460#endif
461         IF( ln_bdy ) CALL bdy_ice_lim_dyn( 'U' )
462
463            DO jj = k_j1+1, k_jpj-1
464               DO ji = fs_2, fs_jpim1
465
466                  rswitch      = ( 1.0 - MAX( 0._wp, SIGN( 1._wp, -zmass2(ji,jj) ) ) ) * vmask(ji,jj,1)
467                  z0           = zmass2(ji,jj) * z1_dtevp
468                  ! SB modif because ocean has no slip boundary condition
469                  zu_ice2      = 0.5 * ( ( u_ice(ji,jj  ) + u_ice(ji-1,jj  ) ) * e2t(ji,jj)       &
470                     &                 + ( u_ice(ji,jj+1) + u_ice(ji-1,jj+1) ) * e2t(ji,jj+1) )   &
471                     &                 / ( e2t(ji,jj+1) + e2t(ji,jj) ) * vmask(ji,jj,1)
472                  za           = rhoco * SQRT( ( zu_ice2 - u_oce2(ji,jj) )**2 +  & 
473                     &                         ( v_ice(ji,jj) - v_oce(ji,jj))**2 ) * ( 1.0 - zfrld2(ji,jj) )
474                  zr           = z0 * v_ice(ji,jj) + zf2(ji,jj) + za2ct(ji,jj) + za * v_oce(ji,jj)
475                  zcca         = z0 + za
476                  zccb         = zcorl2(ji,jj)
477                  v_ice(ji,jj) = ( zr - zccb * zu_ice2 ) / ( zcca + zepsi ) * rswitch
478               END DO
479            END DO
480
481            CALL lbc_lnk( v_ice(:,:), 'V', -1. )
482#if defined key_agrif && defined key_lim2
483            CALL agrif_rhg_lim2( jter, nn_nevp, 'V' )
484#endif
485         IF( ln_bdy ) CALL bdy_ice_lim_dyn( 'V' )
486
487         ELSE
488            DO jj = k_j1+1, k_jpj-1
489               DO ji = fs_2, fs_jpim1
490                  rswitch      = ( 1.0 - MAX( 0._wp, SIGN( 1._wp, -zmass2(ji,jj) ) ) ) * vmask(ji,jj,1)
491                  z0           = zmass2(ji,jj) * z1_dtevp
492                  ! SB modif because ocean has no slip boundary condition
493                  zu_ice2      = 0.5 * ( ( u_ice(ji,jj  ) + u_ice(ji-1,jj  ) ) * e2t(ji,jj)       &
494                     &                  +( u_ice(ji,jj+1) + u_ice(ji-1,jj+1) ) * e2t(ji,jj+1) )   &
495                     &                 / ( e2t(ji,jj+1) + e2t(ji,jj) ) * vmask(ji,jj,1)   
496
497                  za           = rhoco * SQRT( ( zu_ice2 - u_oce2(ji,jj) )**2 +  &
498                     &                         ( v_ice(ji,jj) - v_oce(ji,jj) )**2 ) * ( 1.0 - zfrld2(ji,jj) )
499                  zr           = z0 * v_ice(ji,jj) + zf2(ji,jj) + za2ct(ji,jj) + za * v_oce(ji,jj)
500                  zcca         = z0 + za
501                  zccb         = zcorl2(ji,jj)
502                  v_ice(ji,jj) = ( zr - zccb * zu_ice2 ) / ( zcca + zepsi ) * rswitch
503               END DO
504            END DO
505
506            CALL lbc_lnk( v_ice(:,:), 'V', -1. )
507#if defined key_agrif && defined key_lim2
508            CALL agrif_rhg_lim2( jter, nn_nevp, 'V' )
509#endif
510         IF( ln_bdy ) CALL bdy_ice_lim_dyn( 'V' )
511
512            DO jj = k_j1+1, k_jpj-1
513               DO ji = fs_2, fs_jpim1
514                  rswitch      = ( 1.0 - MAX( 0._wp, SIGN( 1._wp, -zmass1(ji,jj) ) ) ) * umask(ji,jj,1)
515                  z0           = zmass1(ji,jj) * z1_dtevp
516                  zv_ice1      = 0.5 * ( ( v_ice(ji  ,jj) + v_ice(ji  ,jj-1) ) * e1t(ji,jj)       &
517                     &                 + ( v_ice(ji+1,jj) + v_ice(ji+1,jj-1) ) * e1t(ji+1,jj) )   &
518                     &                 / ( e1t(ji+1,jj) + e1t(ji,jj) ) * umask(ji,jj,1)
519
520                  za           = rhoco * SQRT( ( u_ice(ji,jj) - u_oce(ji,jj) )**2 +  &
521                     &                         ( zv_ice1 - v_oce1(ji,jj) )**2 ) * ( 1.0 - zfrld1(ji,jj) )
522                  zr           = z0 * u_ice(ji,jj) + zf1(ji,jj) + za1ct(ji,jj) + za * u_oce(ji,jj)
523                  zcca         = z0 + za
524                  zccb         = zcorl1(ji,jj)
525                  u_ice(ji,jj) = ( zr + zccb * zv_ice1 ) / ( zcca + zepsi ) * rswitch 
526               END DO
527            END DO
528
529            CALL lbc_lnk( u_ice(:,:), 'U', -1. )
530#if defined key_agrif && defined key_lim2
531            CALL agrif_rhg_lim2( jter, nn_nevp, 'U' )
532#endif
533         IF( ln_bdy ) CALL bdy_ice_lim_dyn( 'U' )
534
535         ENDIF
536         
537         IF(ln_ctl) THEN
538            !---  Convergence test.
539            DO jj = k_j1+1 , k_jpj-1
540               zresr(:,jj) = MAX( ABS( u_ice(:,jj) - zu_ice(:,jj) ), ABS( v_ice(:,jj) - zv_ice(:,jj) ) )
541            END DO
542            zresm = MAXVAL( zresr( 1:jpi, k_j1+1:k_jpj-1 ) )
543            IF( lk_mpp )   CALL mpp_max( zresm )   ! max over the global domain
544         ENDIF
545
546         !                                                ! ==================== !
547      END DO                                              !  end loop over jter  !
548      !                                                   ! ==================== !
549      !
550      !------------------------------------------------------------------------------!
551      ! 4) Prevent ice velocities when the ice is thin
552      !------------------------------------------------------------------------------!
553      ! If the ice volume is below zvmin then ice velocity should equal the
554      ! ocean velocity. This prevents high velocity when ice is thin
555      DO jj = k_j1+1, k_jpj-1
556         DO ji = fs_2, fs_jpim1
557            IF ( vt_i(ji,jj) <= zvmin ) THEN
558               u_ice(ji,jj) = u_oce(ji,jj)
559               v_ice(ji,jj) = v_oce(ji,jj)
560            ENDIF
561         END DO
562      END DO
563
564      CALL lbc_lnk_multi( u_ice(:,:), 'U', -1., v_ice(:,:), 'V', -1. )
565
566#if defined key_agrif && defined key_lim2
567      CALL agrif_rhg_lim2( nn_nevp , nn_nevp, 'U' )
568      CALL agrif_rhg_lim2( nn_nevp , nn_nevp, 'V' )
569#endif
570      IF( ln_bdy ) THEN
571         CALL bdy_ice_lim_dyn( 'U' ) ; CALL bdy_ice_lim_dyn( 'V' )
572      ENDIF
573
574      DO jj = k_j1+1, k_jpj-1 
575         DO ji = fs_2, fs_jpim1
576            IF ( vt_i(ji,jj) <= zvmin ) THEN
577               v_ice1(ji,jj)  = 0.5_wp * ( ( v_ice(ji  ,jj) + v_ice(ji,  jj-1) ) * e1t(ji+1,jj)     &
578                  &                      + ( v_ice(ji+1,jj) + v_ice(ji+1,jj-1) ) * e1t(ji  ,jj) )   &
579                  &                      / ( e1t(ji+1,jj) + e1t(ji,jj) ) * umask(ji,jj,1)
580
581               u_ice2(ji,jj)  = 0.5_wp * ( ( u_ice(ji,jj  ) + u_ice(ji-1,jj  ) ) * e2t(ji,jj+1)     &
582                  &                      + ( u_ice(ji,jj+1) + u_ice(ji-1,jj+1) ) * e2t(ji,jj  ) )   &
583                  &                      / ( e2t(ji,jj+1) + e2t(ji,jj) ) * vmask(ji,jj,1)
584            ENDIF
585         END DO
586      END DO
587
588      CALL lbc_lnk_multi( u_ice2(:,:), 'V', -1., v_ice1(:,:), 'U', -1. )
589
590      ! Recompute delta, shear and div, inputs for mechanical redistribution
591      DO jj = k_j1+1, k_jpj-1
592         DO ji = fs_2, jpim1   !RB bug no vect opt due to zmask
593            !- divu_i(:,:), zdt(:,:): divergence and tension at centre
594            !- zds(:,:): shear on northeast corner of grid cells
595            IF ( vt_i(ji,jj) <= zvmin ) THEN
596
597               divu_i(ji,jj) = (  e2u(ji,jj) * u_ice(ji,jj) - e2u(ji-1,jj  ) * u_ice(ji-1,jj  )   &
598                  &             + e1v(ji,jj) * v_ice(ji,jj) - e1v(ji  ,jj-1) * v_ice(ji  ,jj-1)   &
599                  &            ) * r1_e1e2t(ji,jj)
600
601               zdt(ji,jj) = ( ( u_ice(ji,jj) * r1_e2u(ji,jj) - u_ice(ji-1,jj) * r1_e2u(ji-1,jj) ) * e2t(ji,jj) * e2t(ji,jj)  &
602                  &          -( v_ice(ji,jj) * r1_e1v(ji,jj) - v_ice(ji,jj-1) * r1_e1v(ji,jj-1) ) * e1t(ji,jj) * e1t(ji,jj)  &
603                  &         ) * r1_e1e2t(ji,jj)
604               !
605               ! SB modif because ocean has no slip boundary condition
606               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)  &
607                  &          +( v_ice(ji+1,jj) * r1_e2v(ji+1,jj) - v_ice(ji,jj) * r1_e2v(ji,jj) ) * e2f(ji,jj) * e2f(ji,jj)  &
608                  &         ) * r1_e1e2f(ji,jj) * ( 2.0 - fmask(ji,jj,1) )                                     &
609                  &         * zmask(ji,jj) * zmask(ji,jj+1) * zmask(ji+1,jj) * zmask(ji+1,jj+1)
610
611               zdst = ( e2u(ji,jj) * v_ice1(ji,jj) - e2u(ji-1,jj  ) * v_ice1(ji-1,jj  )    &
612                  &   + e1v(ji,jj) * u_ice2(ji,jj) - e1v(ji  ,jj-1) * u_ice2(ji  ,jj-1) ) * r1_e1e2t(ji,jj)
613
614               delta = SQRT( divu_i(ji,jj)**2 + ( zdt(ji,jj)**2 + zdst**2 ) * usecc2 ) 
615               delta_i(ji,jj) = delta + rn_creepl
616           
617            ENDIF
618         END DO
619      END DO
620      !
621      !------------------------------------------------------------------------------!
622      ! 5) Store stress tensor and its invariants
623      !------------------------------------------------------------------------------!
624      ! * Invariants of the stress tensor are required for limitd_me
625      !   (accelerates convergence and improves stability)
626      DO jj = k_j1+1, k_jpj-1
627         DO ji = fs_2, fs_jpim1
628            zdst           = (  e2u(ji,jj) * v_ice1(ji,jj) - e2u( ji-1, jj   ) * v_ice1(ji-1,jj)  &   
629               &              + e1v(ji,jj) * u_ice2(ji,jj) - e1v( ji  , jj-1 ) * u_ice2(ji,jj-1) ) * r1_e1e2t(ji,jj) 
630            shear_i(ji,jj) = SQRT( zdt(ji,jj) * zdt(ji,jj) + zdst * zdst )
631         END DO
632      END DO
633
634      ! Lateral boundary condition
635      CALL lbc_lnk_multi( divu_i (:,:), 'T', 1., delta_i(:,:), 'T', 1.,  shear_i(:,:), 'T', 1. )
636
637      ! * Store the stress tensor for the next time step
638      stress1_i (:,:) = zs1 (:,:)
639      stress2_i (:,:) = zs2 (:,:)
640      stress12_i(:,:) = zs12(:,:)
641
642      !
643      !------------------------------------------------------------------------------!
644      ! 6) Control prints of residual and charge ellipse
645      !------------------------------------------------------------------------------!
646      !
647      ! print the residual for convergence
648      IF(ln_ctl) THEN
649         WRITE(charout,FMT="('lim_rhg  : res =',D23.16, ' iter =',I4)") zresm, jter
650         CALL prt_ctl_info(charout)
651         CALL prt_ctl(tab2d_1=u_ice, clinfo1=' lim_rhg  : u_ice :', tab2d_2=v_ice, clinfo2=' v_ice :')
652      ENDIF
653
654      ! print charge ellipse
655      ! This can be desactivated once the user is sure that the stress state
656      ! lie on the charge ellipse. See Bouillon et al. 08 for more details
657      IF(ln_ctl) THEN
658         CALL prt_ctl_info('lim_rhg  : numit  :',ivar1=numit)
659         CALL prt_ctl_info('lim_rhg  : nwrite :',ivar1=nwrite)
660         CALL prt_ctl_info('lim_rhg  : MOD    :',ivar1=MOD(numit,nwrite))
661         IF( MOD(numit,nwrite) .EQ. 0 ) THEN
662            WRITE(charout,FMT="('lim_rhg  :', I4, I6, I1, I1, A10)") 1000, numit, 0, 0, ' ch. ell. '
663            CALL prt_ctl_info(charout)
664            DO jj = k_j1+1, k_jpj-1
665               DO ji = 2, jpim1
666                  IF (zpresh(ji,jj) > 1.0) THEN
667                     sigma1 = ( zs1(ji,jj) + (zs2(ji,jj)**2 + 4*zs12(ji,jj)**2 )**0.5 ) / ( 2*zpresh(ji,jj) ) 
668                     sigma2 = ( zs1(ji,jj) - (zs2(ji,jj)**2 + 4*zs12(ji,jj)**2 )**0.5 ) / ( 2*zpresh(ji,jj) )
669                     WRITE(charout,FMT="('lim_rhg  :', I4, I4, D23.16, D23.16, D23.16, D23.16, A10)")
670                     CALL prt_ctl_info(charout)
671                  ENDIF
672               END DO
673            END DO
674            WRITE(charout,FMT="('lim_rhg  :', I4, I6, I1, I1, A10)") 2000, numit, 0, 0, ' ch. ell. '
675            CALL prt_ctl_info(charout)
676         ENDIF
677      ENDIF
678      !
679      CALL wrk_dealloc( jpi,jpj, zpresh, zfrld1, zmass1, zcorl1, za1ct , zpreshc, zfrld2, zmass2, zcorl2, za2ct )
680      CALL wrk_dealloc( jpi,jpj, u_oce2, u_ice2, v_oce1 , v_ice1 , zmask               )
681      CALL wrk_dealloc( jpi,jpj, zf1   , zu_ice, zf2   , zv_ice , zdt    , zds  )
682      CALL wrk_dealloc( jpi,jpj, zs1   , zs2   , zs12   , zresr , zpice                 )
683
684   END SUBROUTINE lim_rhg
685
686#else
687   !!----------------------------------------------------------------------
688   !!   Default option          Dummy module           NO LIM sea-ice model
689   !!----------------------------------------------------------------------
690CONTAINS
691   SUBROUTINE lim_rhg( k1 , k2 )         ! Dummy routine
692      WRITE(*,*) 'lim_rhg: You should not have seen this print! error?', k1, k2
693   END SUBROUTINE lim_rhg
694#endif
695
696   !!==============================================================================
697END MODULE limrhg
Note: See TracBrowser for help on using the repository browser.