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

source: trunk/NEMO/LIM_SRC_3/limrhg.F90 @ 868

Last change on this file since 868 was 868, checked in by rblod, 16 years ago

First optimisation of LIM3, limrhg optimisation induces computation change

File size: 36.8 KB
Line 
1MODULE limrhg
2   !!======================================================================
3   !!                     ***  MODULE  limrhg  ***
4   !!   Ice rheology : sea ice rheology
5   !!======================================================================
6#if defined key_lim3
7   !!----------------------------------------------------------------------
8   !!   'key_lim3'                                      LIM3 sea-ice model
9   !!----------------------------------------------------------------------
10   !!   lim_rhg   : computes ice velocities
11   !!----------------------------------------------------------------------
12   !! * Modules used
13   USE phycst
14   USE par_oce
15   USE ice_oce         ! ice variables
16   USE dom_oce
17   USE dom_ice
18   USE ice
19   USE iceini
20   USE lbclnk
21   USE lib_mpp
22   USE in_out_manager  ! I/O manager
23   USE limitd_me
24   USE prtctl          ! Print control
25
26
27   IMPLICIT NONE
28   PRIVATE
29
30   !! * Routine accessibility
31   PUBLIC lim_rhg  ! routine called by lim_dyn
32
33   !! * Substitutions
34#  include "vectopt_loop_substitute.h90"
35
36   !! * Module variables
37   REAL(wp)  ::           &  ! constant values
38      rzero   = 0.e0   ,  &
39      rone    = 1.e0
40   !!----------------------------------------------------------------------
41   !!   LIM 3.0,  UCL-LOCEAN-IPSL (2008)
42   !! $Header: /home/opalod/NEMOCVSROOT/NEMO/LIM_SRC/limrhg.F90,v 1.5 2005/03/27 18:34:42 opalod Exp $
43   !! This software is governed by the CeCILL licence see modipsl/doc/NEMO_CeCILL.txt
44   !!----------------------------------------------------------------------
45
46CONTAINS
47
48   SUBROUTINE lim_rhg( k_j1, k_jpj )
49
50      !!-------------------------------------------------------------------
51      !!                 ***  SUBROUTINE lim_rhg  ***
52      !!                          EVP-C-grid
53      !!
54      !! ** purpose : determines sea ice drift from wind stress, ice-ocean
55      !!  stress and sea-surface slope. Ice-ice interaction is described by
56      !!  a non-linear elasto-viscous-plastic (EVP) law including shear
57      !!  strength and a bulk rheology (Hunke and Dukowicz, 2002).   
58      !!
59      !!  The points in the C-grid look like this, dear reader
60      !!
61      !!                              (ji,jj)
62      !!                                 |
63      !!                                 |
64      !!                      (ji-1,jj)  |  (ji,jj)
65      !!                             ---------   
66      !!                            |         |
67      !!                            | (ji,jj) |------(ji,jj)
68      !!                            |         |
69      !!                             ---------   
70      !!                     (ji-1,jj-1)     (ji,jj-1)
71      !!
72      !! ** Inputs  : - wind forcing (stress), oceanic currents
73      !!                ice total volume (vt_i) per unit area
74      !!                snow total volume (vt_s) per unit area
75      !!
76      !! ** Action  : - compute u_ice, v_ice : the components of the
77      !!                sea-ice velocity vector
78      !!              - compute delta_i, shear_i, divu_i, which are inputs
79      !!                of the ice thickness distribution
80      !!
81      !! ** Steps   : 1) Compute ice snow mass, ice strength
82      !!              2) Compute wind, oceanic stresses, mass terms and
83      !!                 coriolis terms of the momentum equation
84      !!              3) Solve the momentum equation (iterative procedure)
85      !!              4) Prevent high velocities if the ice is thin
86      !!              5) Recompute invariants of the strain rate tensor
87      !!                 which are inputs of the ITD, store stress
88      !!                 for the next time step
89      !!              6) Control prints of residual (convergence)
90      !!                 and charge ellipse.
91      !!                 The user should make sure that the parameters
92      !!                 nevp, telast and creepl maintain stress state
93      !!                 on the charge ellipse for plastic flow
94      !!                 e.g. in the Canadian Archipelago
95      !!
96      !! ** References : Hunke and Dukowicz, JPO97
97      !!                 Bouillon et al., 08, in prep (update this when
98      !!                 published)
99      !!                 Vancoppenolle et al., OM08
100      !!
101      !! History :
102      !!   1.0  !  07-03  (M.A. Morales Maqueda, S. Bouillon)
103      !!   2.0  !  08-03  M. Vancoppenolle : LIM3
104      !!
105      !!-------------------------------------------------------------------
106      ! * Arguments
107      !
108      INTEGER, INTENT(in) :: &
109         k_j1 ,                      & !: southern j-index for ice computation
110         k_jpj                         !: northern j-index for ice computation
111
112      ! * Local variables
113      INTEGER ::   ji, jj              !: dummy loop indices
114
115      INTEGER  :: &
116         jter                          !: temporary integers
117
118      CHARACTER (len=50) ::   charout
119
120      REAL(wp) :: &
121         zt11, zt12, zt21, zt22,     & !: temporary scalars
122         ztagnx, ztagny,             & !: wind stress on U/V points                       
123         delta                         !
124
125      REAL(wp) :: &
126         za,                         & !:
127         zstms,                      & !: temporary scalar for ice strength
128         zsang,                      & !: temporary scalar for coriolis term
129         zmask                         !: mask for the computation of ice mass
130
131      REAL(wp),DIMENSION(jpi,jpj) :: &
132         zpresh        ,             & !: temporary array for ice strength
133         zpreshc       ,             & !: Ice strength on grid cell corners (zpreshc)
134         zfrld1, zfrld2,             & !: lead fraction on U/V points                                   
135         zmass1, zmass2,             & !: ice/snow mass on U/V points                                   
136         zcorl1, zcorl2,             & !: coriolis parameter on U/V points
137         za1ct, za2ct  ,             & !: temporary arrays
138         zc1           ,             & !: ice mass
139         zusw          ,             & !: temporary weight for the computation
140                                       !: of ice strength
141         u_oce1, v_oce1,             & !: ocean u/v component on U points                           
142         u_oce2, v_oce2,             & !: ocean u/v component on V points
143         u_ice2,                     & !: ice u component on V point
144         v_ice1                        !: ice v component on U point
145
146      REAL(wp) :: &
147         dtevp,                      & !: time step for subcycling
148         dtotel,                     & !:
149         ecc2,                       & !: square of yield ellipse eccenticity
150         z0,                         & !: temporary scalar
151         zr,                         & !: temporary scalar
152         zcca, zccb,                 & !: temporary scalars
153         zu_ice2,                    & !:
154         zv_ice1,                    & !:
155         zddc, zdtc,                 & !: temporary array for delta on corners
156         zdst,                       & !: temporary array for delta on centre
157         zdsshx, zdsshy,             & !: term for the gradient of ocean surface
158         sigma1, sigma2                !: internal ice stress
159
160      REAL(wp),DIMENSION(jpi,jpj) :: &
161         zf1, zf2                      !: arrays for internal stresses
162
163      REAL(wp),DIMENSION(jpi,jpj) :: &
164         zdd, zdt,                   & !: Divergence and tension at centre of grid cells
165         zds,                        & !: Shear on northeast corner of grid cells
166         deltat,                     & !: Delta at centre of grid cells
167         deltac,                     & !: Delta on corners
168         zs1, zs2,                   & !: Diagonal stress tensor components zs1 and zs2
169         zs12                          !: Non-diagonal stress tensor component zs12
170
171      REAL(wp) :: &
172         zresm            ,          & !: Maximal error on ice velocity
173         zindb            ,          & !: ice (1) or not (0)     
174         zdummy                        !: dummy argument
175
176      REAL(wp),DIMENSION(jpi,jpj) :: &
177         zu_ice           ,          & !: Ice velocity on previous time step
178         zv_ice           ,          &
179         zresr                         !: Local error on velocity
180
181!
182!------------------------------------------------------------------------------!
183! 1) Ice-Snow mass (zc1), ice strength (zpresh)                                !
184!------------------------------------------------------------------------------!
185!
186      ! Put every vector to 0
187      zpresh(:,:) = 0.0 ; zc1(:,:) = 0.0
188      zpreshc(:,:) = 0.0
189      u_ice2(:,:)  = 0.0 ; v_ice1(:,:)  = 0.0
190      zdd(:,:)     = 0.0 ; zdt(:,:)     = 0.0 ; zds(:,:)     = 0.0
191
192      ! Ice strength on T-points
193      CALL lim_itd_me_icestrength(ridge_scheme_swi)
194
195      ! Ice mass and temp variables
196!CDIR NOVERRCHK
197      DO jj = k_j1 , k_jpj
198!CDIR NOVERRCHK
199         DO ji = 1 , jpi
200            zc1(ji,jj)    = tms(ji,jj) * ( rhosn * vt_s(ji,jj) + rhoic * vt_i(ji,jj) )
201            zpresh(ji,jj) = tms(ji,jj) *  strength(ji,jj) / 2.
202            ! tmi = 1 where there is ice or on land
203            tmi(ji,jj)    = 1.0 - ( 1.0 - MAX( 0.0 , SIGN ( 1.0 , vt_i(ji,jj) - &
204                                    epsd ) ) ) * tms(ji,jj)
205         END DO
206      END DO
207
208      ! Ice strength on grid cell corners (zpreshc)
209      ! needed for calculation of shear stress
210!CDIR NOVERRCHK
211      DO jj = k_j1+1, k_jpj-1
212!CDIR NOVERRCHK
213         DO ji = 2, jpim1 !RB caution no fs_ (ji+1,jj+1)
214             zstms          =  tms(ji+1,jj+1) * wght(ji+1,jj+1,2,2) + &
215                &              tms(ji,jj+1)   * wght(ji+1,jj+1,1,2) + &
216                &              tms(ji+1,jj)   * wght(ji+1,jj+1,2,1) + &
217                &              tms(ji,jj)     * wght(ji+1,jj+1,1,1)
218             zusw(ji,jj)    = 1.0 / MAX( zstms, epsd )
219             zpreshc(ji,jj) = (  zpresh(ji+1,jj+1) * wght(ji+1,jj+1,2,2) + &
220                &                zpresh(ji,jj+1)   * wght(ji+1,jj+1,1,2) + &
221                &                zpresh(ji+1,jj)   * wght(ji+1,jj+1,2,1) + & 
222                &                zpresh(ji,jj)     * wght(ji+1,jj+1,1,1)   &
223                &             ) * zusw(ji,jj)
224         END DO
225      END DO
226
227      CALL lbc_lnk( zpreshc(:,:), 'F', 1. )
228!
229!------------------------------------------------------------------------------!
230! 2) Wind / ocean stress, mass terms, coriolis terms
231!------------------------------------------------------------------------------!
232!
233      !  Wind stress, coriolis and mass terms on the sides of the squares       
234      !  zfrld1: lead fraction on U-points                                     
235      !  zfrld2: lead fraction on V-points                                     
236      !  zmass1: ice/snow mass on U-points                                   
237      !  zmass2: ice/snow mass on V-points                                   
238      !  zcorl1: Coriolis parameter on U-points                             
239      !  zcorl2: Coriolis parameter on V-points                           
240      !  (ztagnx,ztagny): wind stress on U/V points                       
241      !  u_oce1: ocean u component on u points                           
242      !  v_oce1: ocean v component on u points                         
243      !  u_oce2: ocean u component on v points                         
244      !  v_oce2: ocean v component on v points                       
245         
246      DO jj = k_j1+1, k_jpj-1
247         DO ji = fs_2, fs_jpim1
248
249            zt11 = tms(ji,jj)*e1t(ji,jj)
250            zt12 = tms(ji+1,jj)*e1t(ji+1,jj)
251            zt21 = tms(ji,jj)*e2t(ji,jj)
252            zt22 = tms(ji,jj+1)*e2t(ji,jj+1)
253
254            ! Leads area.
255            zfrld1(ji,jj) = ( zt12 * ( 1.0 - at_i(ji,jj) ) + &
256     &                        zt11 * ( 1.0 - at_i(ji+1,jj) ) ) / ( zt11 + zt12 + epsd )
257            zfrld2(ji,jj) = ( zt22 * ( 1.0 - at_i(ji,jj) ) + &
258     &                        zt21 * ( 1.0 - at_i(ji,jj+1) ) ) / ( zt21 + zt22 + epsd )
259
260            ! Mass, coriolis coeff. and currents
261            zmass1(ji,jj) = ( zt12*zc1(ji,jj) + zt11*zc1(ji+1,jj) ) / (zt11+zt12+epsd)
262            zmass2(ji,jj) = ( zt22*zc1(ji,jj) + zt21*zc1(ji,jj+1) ) / (zt21+zt22+epsd)
263            zcorl1(ji,jj) = zmass1(ji,jj) * ( e1t(ji+1,jj)*fcor(ji,jj) + &
264                                              e1t(ji,jj)*fcor(ji+1,jj) ) &
265                                           / (e1t(ji,jj) + e1t(ji+1,jj) + epsd )
266            zcorl2(ji,jj) = zmass2(ji,jj) * ( e2t(ji,jj+1)*fcor(ji,jj) + &
267                                              e2t(ji,jj)*fcor(ji,jj+1) ) &
268                                          / ( e2t(ji,jj+1) + e2t(ji,jj) + epsd )
269            !
270            u_oce1(ji,jj)  = u_io(ji,jj)
271            v_oce2(ji,jj)  = v_io(ji,jj)
272
273            ! Ocean has no slip boundary condition
274            v_oce1(ji,jj)  = 0.5*( (v_io(ji,jj)+v_io(ji,jj-1))*e1t(ji,jj)    &
275                &                 +(v_io(ji+1,jj)+v_io(ji+1,jj-1))*e1t(ji+1,jj)) &
276                &               /(e1t(ji+1,jj)+e1t(ji,jj)) * tmu(ji,jj) 
277
278            u_oce2(ji,jj)  = 0.5*((u_io(ji,jj)+u_io(ji-1,jj))*e2t(ji,jj)     &
279                &                 +(u_io(ji,jj+1)+u_io(ji-1,jj+1))*e2t(ji,jj+1)) &
280                &                / (e2t(ji,jj+1)+e2t(ji,jj)) * tmv(ji,jj)
281
282            ! Wind stress.
283            ztagnx = ( 1. - zfrld1(ji,jj) ) * gtaux(ji,jj)
284            ztagny = ( 1. - zfrld2(ji,jj) ) * gtauy(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            !    zdsshx =  (ssh_io(ji+1,jj) - ssh_io(ji,jj))/e1u(ji,jj)
292            !    zdsshy =  (ssh_io(ji,jj+1) - ssh_io(ji,jj))/e2v(ji,jj) 
293
294            zdsshx = 0.0
295            zdsshy = 0.0 
296
297            za1ct(ji,jj) = ztagnx - zmass1(ji,jj) * grav * zdsshx
298            za2ct(ji,jj) = ztagny - zmass2(ji,jj) * grav * zdsshy
299
300         END DO
301      END DO
302
303!
304!------------------------------------------------------------------------------!
305! 3) Solution of the momentum equation, iterative procedure
306!------------------------------------------------------------------------------!
307!
308      ! Time step for subcycling
309      dtevp  = rdt_ice / nevp
310      dtotel = dtevp / ( 2.0 * telast )
311
312      !-ecc2: square of yield ellipse eccenticrity (reminder: must become a namelist parameter)
313      ecc2 = ecc*ecc
314
315      !-Initialise stress tensor
316      zs1(:,:)  = stress1_i(:,:)
317      zs2(:,:)  = stress2_i(:,:)
318      zs12(:,:) = stress12_i(:,:)
319
320                                                      !----------------------!
321      DO jter = 1 , nevp                              !    loop over jter    !
322                                                      !----------------------!       
323         DO jj = k_j1, k_jpj-1
324            zu_ice(:,jj) = u_ice(:,jj) ! velocity at previous time step
325            zv_ice(:,jj) = v_ice(:,jj)
326         END DO     
327
328         DO jj = k_j1+1, k_jpj-1
329            DO ji = fs_2, fs_jpim1
330
331         
332         !- Divergence, tension and shear (Section a. Appendix B of Hunke & Dukowicz, 2002)
333         !- zdd(:,:), zdt(:,:): divergence and tension at centre of grid cells
334         !- zds(:,:): shear on northeast corner of grid cells
335                 !
336                 !- IMPORTANT REMINDER: Dear Gurvan, note that, the way these terms are coded,
337                 !                      there are many repeated calculations.
338                 !                      Speed could be improved by regrouping terms. For
339                 !                      the moment, however, the stress is on clarity of coding to avoid
340                 !                      bugs (Martin, for Miguel).
341                 !
342                 !- ALSO: arrays zdd, zdt, zds and delta could
343                 !  be removed in the future to minimise memory demand.
344                 !
345                 !- MORE NOTES: Note that we are calculating deformation rates and stresses on the corners of
346                 !              grid cells, exactly as in the B grid case. For simplicity, the indexation on
347                 !              the corners is the same as in the B grid.
348                 !
349                 !
350                 zdd(ji,jj) = ( e2u(ji,jj)*u_ice(ji,jj)                      &
351                    &          -e2u(ji-1,jj)*u_ice(ji-1,jj)                  &
352                    &          +e1v(ji,jj)*v_ice(ji,jj)                      &
353                    &          -e1v(ji,jj-1)*v_ice(ji,jj-1)                  &
354                    &          )                                             &
355                    &         / area(ji,jj)
356
357                 zdt(ji,jj) = ( ( u_ice(ji,jj)/e2u(ji,jj)                    &
358                    &            -u_ice(ji-1,jj)/e2u(ji-1,jj)                &
359                    &           )*e2t(ji,jj)*e2t(ji,jj)                      &
360                    &          -( v_ice(ji,jj)/e1v(ji,jj)                    &
361                    &            -v_ice(ji,jj-1)/e1v(ji,jj-1)                &
362                    &           )*e1t(ji,jj)*e1t(ji,jj)                      &
363                    &         )                                              &
364                    &        / area(ji,jj)
365
366                 !
367                 zds(ji,jj) = ( ( u_ice(ji,jj+1)/e1u(ji,jj+1)                &
368                    &            -u_ice(ji,jj)/e1u(ji,jj)                    &
369                    &           )*e1f(ji,jj)*e1f(ji,jj)                      &
370                    &          +( v_ice(ji+1,jj)/e2v(ji+1,jj)                &
371                    &            -v_ice(ji,jj)/e2v(ji,jj)                    &
372                    &           )*e2f(ji,jj)*e2f(ji,jj)                      &
373                    &         )                                              &
374                    &        / ( e1f(ji,jj) * e2f(ji,jj) ) * ( 2.0 - tmf(ji,jj) ) &
375                    &        * tmi(ji,jj) * tmi(ji,jj+1)                     &
376                    &        * tmi(ji+1,jj) * tmi(ji+1,jj+1)
377
378 
379                 v_ice1(ji,jj)  = 0.5*( (v_ice(ji,jj)+v_ice(ji,jj-1))*e1t(ji+1,jj)   &
380                    &                 +(v_ice(ji+1,jj)+v_ice(ji+1,jj-1))*e1t(ji,jj)) &
381                    &               /(e1t(ji+1,jj)+e1t(ji,jj)) * tmu(ji,jj) 
382
383                 u_ice2(ji,jj)  = 0.5*( (u_ice(ji,jj)+u_ice(ji-1,jj))*e2t(ji,jj+1)   &
384                    &                 +(u_ice(ji,jj+1)+u_ice(ji-1,jj+1))*e2t(ji,jj)) &
385                    &               /(e2t(ji,jj+1)+e2t(ji,jj)) * tmv(ji,jj)
386
387              END DO
388           END DO
389
390!CDIR NOVERRCHK
391           DO jj = k_j1+1, k_jpj-1
392!CDIR NOVERRCHK
393              DO ji = fs_2, fs_jpim1
394
395                 !- Calculate Delta at centre of grid cells
396                 zdst       = (  e2u( ji  , jj   ) * v_ice1(ji,jj)            &
397                    &          - e2u( ji-1, jj   ) * v_ice1(ji-1,jj)          &
398                    &          + e1v( ji  , jj   ) * u_ice2(ji,jj)            &
399                    &          - e1v( ji  , jj-1 ) * u_ice2(ji,jj-1)          &
400                    &          )                                              &
401                    &         / area(ji,jj)
402
403                 delta = SQRT( zdd(ji,jj)*zdd(ji,jj) +                        & 
404     &                       ( zdt(ji,jj)*zdt(ji,jj) + zdst*zdst ) * usecc2 ) 
405                 deltat(ji,jj) = MAX( SQRT(zdd(ji,jj)**2 +                    &
406                                 (zdt(ji,jj)**2 + zdst**2)*usecc2), creepl )
407
408                 !-Calculate stress tensor components zs1 and zs2
409                 !-at centre of grid cells (see section 3.5 of CICE user's guide).
410                 zs1(ji,jj) = ( zs1(ji,jj) &
411                    &          - dtotel*( ( 1.0 - alphaevp) * zs1(ji,jj) +    &
412                    &            ( delta / deltat(ji,jj) - zdd(ji,jj) / deltat(ji,jj) ) &
413                                 * zpresh(ji,jj) ) )                          &       
414                    &        / ( 1.0 + alphaevp * dtotel )
415
416                 zs2(ji,jj) = ( zs2(ji,jj)   &
417                    &          - dtotel*((1.0-alphaevp)*ecc2*zs2(ji,jj) -  &
418                                 zdt(ji,jj)/deltat(ji,jj)*zpresh(ji,jj)) ) &
419                    &        / ( 1.0 + alphaevp*ecc2*dtotel )
420
421              END DO
422           END DO
423
424           CALL lbc_lnk( zs1(:,:), 'T', 1. )
425           CALL lbc_lnk( zs2(:,:), 'T', 1. )
426
427!CDIR NOVERRCHK
428           DO jj = k_j1+1, k_jpj-1
429!CDIR NOVERRCHK
430              DO ji = fs_2, fs_jpim1
431                 !- Calculate Delta on corners
432                 zddc  =      ( ( v_ice1(ji,jj+1)/e1u(ji,jj+1)                &
433                    &            -v_ice1(ji,jj)/e1u(ji,jj)                    &
434                    &           )*e1f(ji,jj)*e1f(ji,jj)                       &
435                    &          +( u_ice2(ji+1,jj)/e2v(ji+1,jj)                &
436                    &            -u_ice2(ji,jj)/e2v(ji,jj)                    &
437                    &           )*e2f(ji,jj)*e2f(ji,jj)                       &
438                    &         )                                               &
439                    &        / ( e1f(ji,jj) * e2f(ji,jj) )
440
441                 zdtc  =      (-( v_ice1(ji,jj+1)/e1u(ji,jj+1)                &
442                    &            -v_ice1(ji,jj)/e1u(ji,jj)                    &
443                    &           )*e1f(ji,jj)*e1f(ji,jj)                       &
444                    &          +( u_ice2(ji+1,jj)/e2v(ji+1,jj)                &
445                    &            -u_ice2(ji,jj)/e2v(ji,jj)                    &
446                    &           )*e2f(ji,jj)*e2f(ji,jj)                       &
447                    &         )                                               &
448                    &        / ( e1f(ji,jj) * e2f(ji,jj) )
449
450                 deltac(ji,jj) = SQRT(zddc**2+(zdtc**2+zds(ji,jj)**2)*usecc2) + creepl
451
452                 !-Calculate stress tensor component zs12 at corners (see section 3.5 of CICE user's guide).
453                 zs12(ji,jj) = ( zs12(ji,jj)      &
454                    &        - dtotel*( (1.0-alphaevp)*ecc2*zs12(ji,jj) - zds(ji,jj) / &
455                    &          ( 2.0*deltac(ji,jj) ) * zpreshc(ji,jj))) &
456                    &         / ( 1.0 + alphaevp*ecc2*dtotel )
457
458              END DO ! ji
459           END DO ! jj
460
461           CALL lbc_lnk( zs12(:,:), 'F', 1. )
462
463           ! Ice internal stresses (Appendix C of Hunke and Dukowicz, 2002)
464           DO jj = k_j1+1, k_jpj-1
465              DO ji = fs_2, fs_jpim1
466                !- contribution of zs1, zs2 and zs12 to zf1
467                zf1(ji,jj) = 0.5*( (zs1(ji+1,jj)-zs1(ji,jj))*e2u(ji,jj) &
468                   &              +(zs2(ji+1,jj)*e2t(ji+1,jj)**2-zs2(ji,jj)*e2t(ji,jj)**2)/e2u(ji,jj) &
469                   &              +2.0*(zs12(ji,jj)*e1f(ji,jj)**2-zs12(ji,jj-1)*e1f(ji,jj-1)**2)/e1u(ji,jj) &
470                   &             ) / ( e1u(ji,jj)*e2u(ji,jj) )
471                ! contribution of zs1, zs2 and zs12 to zf2
472                zf2(ji,jj) = 0.5*( (zs1(ji,jj+1)-zs1(ji,jj))*e1v(ji,jj) &
473                   &              -(zs2(ji,jj+1)*e1t(ji,jj+1)**2 - zs2(ji,jj)*e1t(ji,jj)**2)/e1v(ji,jj) &
474                   &              + 2.0*(zs12(ji,jj)*e2f(ji,jj)**2 -    &
475                                    zs12(ji-1,jj)*e2f(ji-1,jj)**2)/e2v(ji,jj) &
476                   &             ) / ( e1v(ji,jj)*e2v(ji,jj) )
477              END DO
478           END DO
479         !
480         ! Computation of ice velocity
481         !
482         ! Both the Coriolis term and the ice-ocean drag are solved semi-implicitly.
483         !
484           IF (MOD(jter,2).eq.0) THEN 
485
486!CDIR NOVERRCHK
487              DO jj = k_j1+1, k_jpj-1
488!CDIR NOVERRCHK
489                 DO ji = fs_2, fs_jpim1
490                    zmask        = (1.0-MAX(rzero,SIGN(rone,-zmass1(ji,jj))))*tmu(ji,jj)
491                    zsang        = SIGN ( 1.0 , fcor(ji,jj) ) * sangvg
492                    z0           = zmass1(ji,jj)/dtevp
493
494                    ! SB modif because ocean has no slip boundary condition
495                    zv_ice1       = 0.5*( (v_ice(ji,jj)+v_ice(ji,jj-1))*e1t(ji,jj)         &
496                      &                 +(v_ice(ji+1,jj)+v_ice(ji+1,jj-1))*e1t(ji+1,jj))   &
497                      &               /(e1t(ji+1,jj)+e1t(ji,jj)) * tmu(ji,jj)
498                    za           = rhoco*SQRT((u_ice(ji,jj)-u_oce1(ji,jj))**2 + &
499                                              (zv_ice1-v_oce1(ji,jj))**2) * (1.0-zfrld1(ji,jj))
500                    zr           = z0*u_ice(ji,jj) + zf1(ji,jj) + za1ct(ji,jj) + &
501                                   za*(cangvg*u_oce1(ji,jj)-zsang*v_oce1(ji,jj))
502                    zcca         = z0+za*cangvg
503                    zccb         = zcorl1(ji,jj)+za*zsang
504                    u_ice(ji,jj) = (zr+zccb*zv_ice1)/(zcca+epsd)*zmask 
505
506                 END DO
507              END DO
508
509              CALL lbc_lnk( u_ice(:,:), 'U', -1. )
510
511!CDIR NOVERRCHK
512              DO jj = k_j1+1, k_jpj-1
513!CDIR NOVERRCHK
514                 DO ji = fs_2, fs_jpim1
515
516                    zmask        = (1.0-MAX(rzero,SIGN(rone,-zmass2(ji,jj))))*tmv(ji,jj)
517                    zsang        = SIGN(1.0,fcor(ji,jj))*sangvg
518                    z0           = zmass2(ji,jj)/dtevp
519                    ! SB modif because ocean has no slip boundary condition
520                    zu_ice2       = 0.5*( (u_ice(ji,jj)+u_ice(ji-1,jj))*e2t(ji,jj)     &
521                &                 + (u_ice(ji,jj+1)+u_ice(ji-1,jj+1))*e2t(ji,jj+1))   &
522                &               /(e2t(ji,jj+1)+e2t(ji,jj)) * tmv(ji,jj)
523                    za           = rhoco*SQRT((zu_ice2-u_oce2(ji,jj))**2 + & 
524                                   (v_ice(ji,jj)-v_oce2(ji,jj))**2)*(1.0-zfrld2(ji,jj))
525                    zr           = z0*v_ice(ji,jj) + zf2(ji,jj) + &
526                                   za2ct(ji,jj) + za*(cangvg*v_oce2(ji,jj)+zsang*u_oce2(ji,jj))
527                    zcca         = z0+za*cangvg
528                    zccb         = zcorl2(ji,jj)+za*zsang
529                    v_ice(ji,jj) = (zr-zccb*zu_ice2)/(zcca+epsd)*zmask
530
531                 END DO
532              END DO
533
534              CALL lbc_lnk( v_ice(:,:), 'V', -1. )
535
536         ELSE 
537!CDIR NOVERRCHK
538              DO jj = k_j1+1, k_jpj-1
539!CDIR NOVERRCHK
540                 DO ji = fs_2, fs_jpim1
541                    zmask        = (1.0-MAX(rzero,SIGN(rone,-zmass2(ji,jj))))*tmv(ji,jj)
542                    zsang        = SIGN(1.0,fcor(ji,jj))*sangvg
543                    z0           = zmass2(ji,jj)/dtevp
544                    ! SB modif because ocean has no slip boundary condition
545                    zu_ice2       = 0.5*( (u_ice(ji,jj)+u_ice(ji-1,jj))*e2t(ji,jj)      &
546                       &                 +(u_ice(ji,jj+1)+u_ice(ji-1,jj+1))*e2t(ji,jj+1))   &
547                       &               /(e2t(ji,jj+1)+e2t(ji,jj)) * tmv(ji,jj)   
548
549                    za           = rhoco*SQRT((zu_ice2-u_oce2(ji,jj))**2 + &
550                                   (v_ice(ji,jj)-v_oce2(ji,jj))**2)*(1.0-zfrld2(ji,jj))
551                    zr           = z0*v_ice(ji,jj) + zf2(ji,jj) + &
552                                   za2ct(ji,jj) + za*(cangvg*v_oce2(ji,jj)+zsang*u_oce2(ji,jj))
553                    zcca         = z0+za*cangvg
554                    zccb         = zcorl2(ji,jj)+za*zsang
555                    v_ice(ji,jj) = (zr-zccb*zu_ice2)/(zcca+epsd)*zmask
556
557                 END DO
558              END DO
559
560              CALL lbc_lnk( v_ice(:,:), 'V', -1. )
561
562!CDIR NOVERRCHK
563              DO jj = k_j1+1, k_jpj-1
564!CDIR NOVERRCHK
565                 DO ji = fs_2, fs_jpim1
566                    zmask        = (1.0-MAX(rzero,SIGN(rone,-zmass1(ji,jj))))*tmu(ji,jj)
567                    zsang        = SIGN(1.0,fcor(ji,jj))*sangvg
568                    z0           = zmass1(ji,jj)/dtevp
569                    ! SB modif because ocean has no slip boundary condition
570! GG Bug
571!                   zv_ice1       = 0.5*( (v_ice(ji,jj)+v_ice(ji,jj-1))*e1t(ji+1,jj)      &
572!                      &                 +(v_ice(ji+1,jj)+v_ice(ji+1,jj-1))*e1t(ji,jj))   &
573!                      &               /(e1t(ji+1,jj)+e1t(ji,jj)) * tmu(ji,jj)
574                    zv_ice1       = 0.5*( (v_ice(ji,jj)+v_ice(ji,jj-1))*e1t(ji,jj)      &
575                       &                 +(v_ice(ji+1,jj)+v_ice(ji+1,jj-1))*e1t(ji+1,jj))   &
576                       &               /(e1t(ji+1,jj)+e1t(ji,jj)) * tmu(ji,jj)
577   
578                    za           = rhoco*SQRT((u_ice(ji,jj)-u_oce1(ji,jj))**2 + &
579                                   (zv_ice1-v_oce1(ji,jj))**2)*(1.0-zfrld1(ji,jj))
580                    zr           = z0*u_ice(ji,jj) + zf1(ji,jj) + za1ct(ji,jj) + &
581                                   za*(cangvg*u_oce1(ji,jj)-zsang*v_oce1(ji,jj))
582                    zcca         = z0+za*cangvg
583                    zccb         = zcorl1(ji,jj)+za*zsang
584                    u_ice(ji,jj) = (zr+zccb*zv_ice1)/(zcca+epsd)*zmask 
585                 END DO ! ji
586              END DO ! jj
587
588              CALL lbc_lnk( u_ice(:,:), 'U', -1. )
589
590      ENDIF
591
592      IF(ln_ctl) THEN
593         !---  Convergence test.
594         DO jj = k_j1+1 , k_jpj-1
595            zresr(:,jj) = MAX( ABS( u_ice(:,jj) - zu_ice(:,jj) ) ,           &
596                          ABS( v_ice(:,jj) - zv_ice(:,jj) ) )
597         END DO
598         zresm = MAXVAL( zresr( 1:jpi , k_j1+1:k_jpj-1 ) )
599         IF( lk_mpp )   CALL mpp_max( zresm )   ! max over the global domain
600      ENDIF
601
602      !                                                   ! ==================== !
603      END DO                                              !  end loop over jter  !
604      !                                                   ! ==================== !
605
606!
607!------------------------------------------------------------------------------!
608! 4) Prevent ice velocities when the ice is thin
609!------------------------------------------------------------------------------!
610!
611      ! If the ice thickness is below 1cm then ice velocity should equal the
612      ! ocean velocity,
613      ! This prevents high velocity when ice is thin
614!CDIR NOVERRCHK
615      DO jj = k_j1+1, k_jpj-1
616!CDIR NOVERRCHK
617         DO ji = fs_2, fs_jpim1
618            zindb  = MAX( 0.0, SIGN( 1.0, at_i(ji,jj) - 1.0e-6 ) ) 
619            zdummy = zindb * vt_i(ji,jj) / MAX(at_i(ji,jj) , 1.0e-06 )
620            IF ( zdummy .LE. 5.0e-2 ) THEN
621               u_ice(ji,jj) = u_io(ji,jj)
622               v_ice(ji,jj) = v_io(ji,jj)
623            ENDIF ! zdummy
624         END DO
625      END DO
626
627      DO jj = k_j1+1, k_jpj-1 
628         DO ji = fs_2, fs_jpim1
629            zindb  = MAX( 0.0, SIGN( 1.0, at_i(ji,jj) - 1.0e-6 ) ) 
630            zdummy = zindb * vt_i(ji,jj) / MAX(at_i(ji,jj) , 1.0e-06 )
631            IF ( zdummy .LE. 5.0e-2 ) THEN
632                v_ice1(ji,jj)  = 0.5*( (v_ice(ji,jj)+v_ice(ji,jj-1))*e1t(ji+1,jj)   &
633                   &                 +(v_ice(ji+1,jj)+v_ice(ji+1,jj-1))*e1t(ji,jj)) &
634                   &               /(e1t(ji+1,jj)+e1t(ji,jj)) * tmu(ji,jj)
635
636                u_ice2(ji,jj)  = 0.5*( (u_ice(ji,jj)+u_ice(ji-1,jj))*e2t(ji,jj+1)   &
637                   &                 +(u_ice(ji,jj+1)+u_ice(ji-1,jj+1))*e2t(ji,jj)) &
638                   &               /(e2t(ji,jj+1)+e2t(ji,jj)) * tmv(ji,jj)
639             ENDIF ! zdummy
640         END DO
641      END DO
642
643      CALL lbc_lnk( u_ice2(:,:), 'U', -1. ) 
644      CALL lbc_lnk( v_ice1(:,:), 'V', -1. )
645
646      ! Recompute delta, shear and div, inputs for mechanical redistribution
647!CDIR NOVERRCHK
648      DO jj = k_j1+1, k_jpj-1
649!CDIR NOVERRCHK
650         DO ji = fs_2, fs_jpim1
651            !- zdd(:,:), zdt(:,:): divergence and tension at centre
652            !- zds(:,:): shear on northeast corner of grid cells
653            zindb  = MAX( 0.0, SIGN( 1.0, at_i(ji,jj) - 1.0e-6 ) ) 
654            zdummy = zindb * vt_i(ji,jj) / MAX(at_i(ji,jj) , 1.0e-06 )
655
656            IF ( zdummy .LE. 5.0e-2 ) THEN
657
658            zdd(ji,jj) = ( e2u(ji,jj)*u_ice(ji,jj)                      &
659               &          -e2u(ji-1,jj)*u_ice(ji-1,jj)                  &
660               &          +e1v(ji,jj)*v_ice(ji,jj)                      &
661               &          -e1v(ji,jj-1)*v_ice(ji,jj-1)                  &
662               &         )                                              &
663               &         / area(ji,jj)
664
665            zdt(ji,jj) = ( ( u_ice(ji,jj)/e2u(ji,jj)                    &
666               &            -u_ice(ji-1,jj)/e2u(ji-1,jj)                &
667               &           )*e2t(ji,jj)*e2t(ji,jj)                      &
668               &          -( v_ice(ji,jj)/e1v(ji,jj)                    &
669               &            -v_ice(ji,jj-1)/e1v(ji,jj-1)                &
670               &           )*e1t(ji,jj)*e1t(ji,jj)                      &
671               &         )                                              &
672               &        / area(ji,jj)
673            !
674            ! SB modif because ocean has no slip boundary condition
675            zds(ji,jj) = ( ( u_ice(ji,jj+1) / e1u(ji,jj+1)              &
676               &           - u_ice(ji,jj)   / e1u(ji,jj) )              &
677               &           * e1f(ji,jj) * e1f(ji,jj)                    &
678               &          + ( v_ice(ji+1,jj) / e2v(ji+1,jj)             &
679               &            - v_ice(ji,jj)  / e2v(ji,jj) )              &
680               &           * e2f(ji,jj) * e2f(ji,jj) )                  &
681               &        / ( e1f(ji,jj) * e2f(ji,jj) ) * ( 2.0 - tmf(ji,jj) ) &
682               &        * tmi(ji,jj) * tmi(ji,jj+1)                     &
683               &        * tmi(ji+1,jj) * tmi(ji+1,jj+1)
684
685             zdst       = (  e2u( ji  , jj   ) * v_ice1(ji,jj)          &
686               &          - e2u( ji-1, jj   ) * v_ice1(ji-1,jj)         &
687               &          + e1v( ji  , jj   ) * u_ice2(ji,jj)           &
688               &          - e1v( ji  , jj-1 ) * u_ice2(ji,jj-1)         & 
689               &          )                                             &
690               &         / area(ji,jj)
691
692             deltat(ji,jj) = SQRT( zdd(ji,jj)*zdd(ji,jj) + & 
693     &                          ( zdt(ji,jj)*zdt(ji,jj) + zdst*zdst ) * usecc2 & 
694     &                          ) + creepl
695
696             ENDIF ! zdummy
697
698         END DO !jj
699      END DO !ji
700!
701!------------------------------------------------------------------------------!
702! 5) Store stress tensor and its invariants
703!------------------------------------------------------------------------------!
704!
705      ! * Invariants of the stress tensor are required for limitd_me
706      ! accelerates convergence and improves stability
707      DO jj = k_j1+1, k_jpj-1
708         DO ji = fs_2, fs_jpim1
709            divu_i (ji,jj) = zdd   (ji,jj)
710            delta_i(ji,jj) = deltat(ji,jj)
711            shear_i(ji,jj) = zds   (ji,jj)
712         END DO
713      END DO
714
715      ! Lateral boundary condition
716      CALL lbc_lnk( divu_i (:,:), 'T', 1. )
717      CALL lbc_lnk( delta_i(:,:), 'T', 1. )
718      CALL lbc_lnk( shear_i(:,:), 'F', 1. )
719
720      ! * Store the stress tensor for the next time step
721      stress1_i (:,:) = zs1 (:,:)
722      stress2_i (:,:) = zs2 (:,:)
723      stress12_i(:,:) = zs12(:,:)
724
725!
726!------------------------------------------------------------------------------!
727! 6) Control prints of residual and charge ellipse
728!------------------------------------------------------------------------------!
729!
730      ! print the residual for convergence
731      IF(ln_ctl) THEN
732         WRITE(charout,FMT="('lim_rhg  : res =',D23.16, ' iter =',I4)") zresm, jter
733         CALL prt_ctl_info(charout)
734         CALL prt_ctl(tab2d_1=u_ice, clinfo1=' lim_rhg  : u_ice :', tab2d_2=v_ice, clinfo2=' v_ice :')
735      ENDIF
736
737      ! print charge ellipse
738      ! This can be desactivated once the user is sure that the stress state
739      ! lie on the charge ellipse. See Bouillon et al. 08 for more details
740      IF(ln_ctl) THEN
741         CALL prt_ctl_info('lim_rhg  : numit  :',ivar1=numit)
742         CALL prt_ctl_info('lim_rhg  : nwrite :',ivar1=nwrite)
743         CALL prt_ctl_info('lim_rhg  : MOD    :',ivar1=MOD(numit,nwrite))
744         IF( MOD(numit,nwrite) .EQ. 0 ) THEN
745            WRITE(charout,FMT="('lim_rhg  :', I4, I6, I1, I1, A10)") 1000, numit, 0, 0, ' ch. ell. '
746            CALL prt_ctl_info(charout)
747            DO jj = k_j1+1, k_jpj-1
748               DO ji = 2, jpim1
749                  IF (zpresh(ji,jj) .GT. 1.0) THEN
750                     sigma1 = ( zs1(ji,jj) + (zs2(ji,jj)**2 + 4*zs12(ji,jj)**2 )**0.5 ) / ( 2*zpresh(ji,jj) ) 
751                     sigma2 = ( zs1(ji,jj) - (zs2(ji,jj)**2 + 4*zs12(ji,jj)**2 )**0.5 ) / ( 2*zpresh(ji,jj) )
752                     WRITE(charout,FMT="('lim_rhg  :', I4, I4, D23.16, D23.16, D23.16, D23.16, A10)")
753                     CALL prt_ctl_info(charout)
754                  ENDIF
755               END DO
756            END DO
757            WRITE(charout,FMT="('lim_rhg  :', I4, I6, I1, I1, A10)") 2000, numit, 0, 0, ' ch. ell. '
758            CALL prt_ctl_info(charout)
759         ENDIF
760      ENDIF
761
762   END SUBROUTINE lim_rhg
763
764#else
765   !!----------------------------------------------------------------------
766   !!   Default option          Dummy module           NO LIM sea-ice model
767   !!----------------------------------------------------------------------
768CONTAINS
769   SUBROUTINE lim_rhg( k1 , k2 )         ! Dummy routine
770      WRITE(*,*) 'lim_rhg: You should not have seen this print! error?', k1, k2
771   END SUBROUTINE lim_rhg
772#endif
773
774   !!==============================================================================
775END MODULE limrhg
Note: See TracBrowser for help on using the repository browser.