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.
limdyn.F90 in branches/dev_001_SBC/NEMO/LIM_SRC – NEMO

source: branches/dev_001_SBC/NEMO/LIM_SRC/limdyn.F90 @ 755

Last change on this file since 755 was 717, checked in by smasson, 17 years ago

finalize the first set of modifications related to ticket:3

  • Property svn:eol-style set to native
  • Property svn:keywords set to Id
File size: 13.0 KB
Line 
1MODULE limdyn
2   !!======================================================================
3   !!                     ***  MODULE  limdyn  ***
4   !!   Sea-Ice dynamics : 
5   !!======================================================================
6   !! History :   1.0  !  01-04  (LIM)  Original code
7   !!             2.0  !  02-08  (C. Ethe, G. Madec)  F90, mpp
8   !!             2.0  !  03-08  (C. Ethe) add lim_dyn_init
9   !!             2.0  !  06-07  (G. Madec)  Surface module
10   !!---------------------------------------------------------------------
11#if defined key_ice_lim
12   !!----------------------------------------------------------------------
13   !!   'key_ice_lim' :                                   LIM sea-ice model
14   !!----------------------------------------------------------------------
15   !!    lim_dyn      : computes ice velocities
16   !!    lim_dyn_init : initialization and namelist read
17   !!----------------------------------------------------------------------
18   USE dom_oce        ! ocean space and time domain
19   USE sbc_oce        !
20   USE phycst         !
21   USE ice            !
22   USE ice_oce        !
23   USE dom_ice        !
24   USE iceini         !
25   USE limistate      !
26   USE limrhg         ! ice rheology
27
28   USE lbclnk         !
29   USE lib_mpp        !
30   USE in_out_manager ! I/O manager
31   USE prtctl         ! Print control
32
33   IMPLICIT NONE
34   PRIVATE
35
36   PUBLIC   lim_dyn   ! routine called by ice_step
37
38   REAL(wp)  ::  rone    = 1.e0   ! constant value
39
40#  include "vectopt_loop_substitute.h90"
41   !!----------------------------------------------------------------------
42   !!   LIM 2.0,  UCL-LOCEAN-IPSL (2006)
43   !! $Id$
44   !! Software governed by the CeCILL licence (modipsl/doc/NEMO_CeCILL.txt)
45   !!----------------------------------------------------------------------
46
47CONTAINS
48
49   SUBROUTINE lim_dyn( kt )
50      !!-------------------------------------------------------------------
51      !!               ***  ROUTINE lim_dyn  ***
52      !!               
53      !! ** Purpose :   compute ice velocity and ocean-ice stress
54      !!               
55      !! ** Method  :
56      !!
57      !! ** Action  : - Initialisation
58      !!              - Call of the dynamic routine for each hemisphere
59      !!              - computation of the stress at the ocean surface         
60      !!              - treatment of the case if no ice dynamic
61      !!---------------------------------------------------------------------
62      INTEGER, INTENT(in) ::   kt     ! number of iteration
63      !!
64      INTEGER  ::   ji, jj             ! dummy loop indices
65      INTEGER  ::   i_j1, i_jpj        ! Starting/ending j-indices for rheology
66      REAL(wp) ::   zcoef              ! temporary scalar
67      REAL(wp), DIMENSION(jpj)     ::   zind           ! i-averaged indicator of sea-ice
68      REAL(wp), DIMENSION(jpj)     ::   zmsk           ! i-averaged of tmask
69      REAL(wp), DIMENSION(jpi,jpj) ::   zu_io, zv_io   ! ice-ocean velocity
70!!$      INTEGER ::   ji, jj             ! dummy loop indices
71!!$      INTEGER ::   i_j1, i_jpj        ! Starting/ending j-indices for rheology
72!!$      REAL(wp) ::   &
73!!$         ztairx, ztairy,           &  ! tempory scalars
74!!$         zsang , zrhomod,             &
75!!$         ztglx , ztgly ,           &
76!!$         zt11, zt12, zt21, zt22 ,  &
77!!$         zustm, zsfrld, zsfrldm4,  &
78!!$         zu_ice, zv_ice, ztair2
79!!$      REAL(wp),DIMENSION(jpi,jpj) ::   zmod
80!!$      REAL(wp),DIMENSION(jpj) ::   &
81!!$         zind,                     &  ! i-averaged indicator of sea-ice
82!!$         zmsk                         ! i-averaged of tmask
83      !!---------------------------------------------------------------------
84
85      IF( kt == nit000 )   CALL lim_dyn_init   ! Initialization (first time-step only)
86     
87      IF( ln_limdyn ) THEN
88
89         ! Mean ice and snow thicknesses.         
90         hsnm(:,:)  = ( 1.0 - frld(:,:) ) * hsnif(:,:)
91         hicm(:,:)  = ( 1.0 - frld(:,:) ) * hicif(:,:)
92
93         !                                         ! Rheology (ice dynamics)
94         !                                         ! ========
95         
96         !  Define the j-limits where ice rheology is computed
97         ! ---------------------------------------------------
98         
99         IF( lk_mpp .OR. nbit_cmp == 1 ) THEN                    ! mpp: compute over the whole domain
100            i_j1 = 1   
101            i_jpj = jpj
102            IF(ln_ctl)   CALL prt_ctl_info( 'lim_dyn  :    i_j1 = ', ivar1=i_j1, clinfo2=' ij_jpj = ', ivar2=i_jpj )
103            CALL lim_rhg( i_j1, i_jpj )
104
105         ELSE                                 ! optimization of the computational area
106
107            DO jj = 1, jpj
108               zind(jj) = SUM( frld (:,jj  ) )   ! = FLOAT(jpj) if ocean everywhere on a j-line
109               zmsk(jj) = SUM( tmask(:,jj,1) )   ! = 0          if land  everywhere on a j-line
110            END DO
111
112            IF( l_jeq ) THEN                     ! local domain include both hemisphere
113               !                                 ! Rheology is computed in each hemisphere
114               !                                 ! only over the ice cover latitude strip
115               ! Northern hemisphere
116               i_j1  = njeq
117               i_jpj = jpj
118               DO WHILE ( i_j1 <= jpj .AND. zind(i_j1) == FLOAT(jpi) .AND. zmsk(i_j1) /=0 )
119                  i_j1 = i_j1 + 1
120               END DO
121               i_j1 = MAX( 1, i_j1-1 )
122               IF(ln_ctl)   WRITE(numout,*) 'lim_dyn : NH i_j1 = ', i_j1, ' ij_jpj = ', i_jpj
123   
124               CALL lim_rhg( i_j1, i_jpj )
125   
126               ! Southern hemisphere
127               i_j1  =  1 
128               i_jpj = njeq
129               DO WHILE ( i_jpj >= 1 .AND. zind(i_jpj) == FLOAT(jpi) .AND. zmsk(i_jpj) /=0 )
130                  i_jpj = i_jpj - 1
131               END DO
132               i_jpj = MIN( jpj, i_jpj+2 )
133               IF(ln_ctl)   WRITE(numout,*) 'lim_dyn : SH i_j1 = ', i_j1, ' ij_jpj = ', i_jpj
134   
135               CALL lim_rhg( i_j1, i_jpj )
136   
137            ELSE                                 ! local domain extends over one hemisphere only
138               !                                 ! Rheology is computed only over the ice cover
139               !                                 ! latitude strip
140               i_j1  = 1
141               DO WHILE ( i_j1 <= jpj .AND. zind(i_j1) == FLOAT(jpi) .AND. zmsk(i_j1) /=0 )
142                  i_j1 = i_j1 + 1
143               END DO
144               i_j1 = MAX( 1, i_j1-1 )
145   
146               i_jpj  = jpj
147               DO WHILE ( i_jpj >= 1  .AND. zind(i_jpj) == FLOAT(jpi) .AND. zmsk(i_jpj) /=0 )
148                  i_jpj = i_jpj - 1
149               END DO
150               i_jpj = MIN( jpj, i_jpj+2)
151   
152               IF(ln_ctl)   WRITE(numout,*) 'lim_dyn : one hemisphere: i_j1 = ', i_j1, ' ij_jpj = ', i_jpj
153   
154               CALL lim_rhg( i_j1, i_jpj )
155
156            ENDIF
157
158         ENDIF
159
160         IF(ln_ctl)   CALL prt_ctl(tab2d_1=ui_ice , clinfo1=' lim_dyn  : ui_ice :', tab2d_2=vi_ice , clinfo2=' vi_ice :')
161         
162!!$         !                                         ! Ice-Ocean stress
163!!$         !                                         ! ================       
164!!$         DO jj = 1, jpj
165!!$            DO ji = 1, jpi
166!!$!!              zsang  = SIGN(1.e0, gphif(ji-1,jj-1) ) * sangvg    ! do the full loop and avoid lbc_lnk
167!!$               zsang  = SIGN(1.e0, gphif(ji,jj) ) * sangvg
168!!$               zu_ice   = u_ice(ji,jj) - u_io(ji,jj)
169!!$               zv_ice   = v_ice(ji,jj) - v_io(ji,jj)
170!!$               zrhomod  = zu_ice * zu_ice + zv_ice * zv_ice
171!!$               zmod (ji,jj) = zrhomod
172!!$               zrhomod  = rhoco * SQRT( zrhomod )
173!!$               ftaux(ji,jj) = zrhomod * ( cangvg * zu_ice - zsang * zv_ice )
174!!$               ftauy(ji,jj) = zrhomod * ( cangvg * zv_ice + zsang * zu_ice )
175!!$            END DO
176!!$         END DO
177
178         ! computation of friction velocity
179         ! --------------------------------
180         ! ice-ocean velocity at U & V-points (ui_ice vi_ice at I-point ; ssu_m, ssv_m at U- & V-points)
181         
182         DO jj = 1, jpjm1
183            DO ji = 1, fs_jpim1   ! vector opt.
184               zu_io(ji,jj) = 0.5 * ( ui_ice(ji+1,jj+1) + ui_ice(ji+1,jj  ) ) - ssu_m(ji,jj)
185               zv_io(ji,jj) = 0.5 * ( vi_ice(ji+1,jj+1) + vi_ice(ji  ,jj+1) ) - ssv_m(ji,jj)
186            END DO
187         END DO
188         ! frictional velocity at T-point
189         DO jj = 2, jpjm1
190            DO ji = fs_2, fs_jpim1   ! vector opt.
191               ust2s(ji,jj) = 0.5 * cw                                                          &
192                  &         * (  zu_io(ji,jj) * zu_io(ji,jj) + zu_io(ji-1,jj) * zu_io(ji-1,jj)   &
193                  &            + zv_io(ji,jj) * zv_io(ji,jj) + zv_io(ji,jj-1) * zv_io(ji,jj-1)   ) * tms(ji,jj)
194            END DO
195         END DO
196!!$         DO jj = 2, jpjm1
197!!$            DO ji = fs_2, fs_jpim1     ! vector opt.
198!!$               ust2s(ji,jj) = 0.25 * cw * ( zmod(ji,jj+1) + zmod(ji+1,jj+1) +    &
199!!$                  &                         zmod(ji,jj  ) + zmod(ji+1,jj  ) ) * tms(ji,jj)
200!!$            END DO
201!!$         END DO
202         !
203      ELSE      ! no ice dynamics : transmit directly the atmospheric stress to the ocean
204         !
205         zcoef = SQRT( 0.5 ) / rau0
206         DO jj = 2, jpjm1
207            DO ji = fs_2, fs_jpim1   ! vector opt.
208               ust2s(ji,jj) = zcoef * tms(ji,jj) * SQRT(  utau(ji,jj) * utau(ji,jj) + utau(ji-1,jj) * utau(ji-1,jj)   &
209                  &                                     + vtau(ji,jj) * vtau(ji,jj) + vtau(ji,jj-1) * vtau(ji,jj-1) )
210            END DO
211         END DO
212         !
213      ENDIF
214
215      CALL lbc_lnk( ust2s, 'T',  1. )   ! T-point
216
217      IF(ln_ctl)   CALL prt_ctl(tab2d_1=ust2s , clinfo1=' lim_dyn  : ust2s :')
218
219   END SUBROUTINE lim_dyn
220
221
222   SUBROUTINE lim_dyn_init
223      !!-------------------------------------------------------------------
224      !!                  ***  ROUTINE lim_dyn_init  ***
225      !!
226      !! ** Purpose :   Physical constants and parameters linked to the ice
227      !!              dynamics
228      !!
229      !! ** Method  :   Read the namicedyn namelist and check the ice-dynamic
230      !!              parameter values
231      !!
232      !! ** input   :   Namelist namicedyn
233      !!-------------------------------------------------------------------
234      NAMELIST/namicedyn/ epsd, alpha,     &
235         &                dm, nbiter, nbitdr, om, resl, cw, angvg, pstar,   &
236         &                c_rhg, etamn, creepl, ecc, ahi0
237      !!-------------------------------------------------------------------
238
239      REWIND ( numnam_ice )                       ! Read Namelist namicedyn
240      READ   ( numnam_ice  , namicedyn )
241
242      IF(lwp) THEN                                ! Control print
243         WRITE(numout,*)
244         WRITE(numout,*) 'lim_dyn_init : ice parameters for ice dynamics '
245         WRITE(numout,*) '~~~~~~~~~~~~'
246         WRITE(numout,*) '       tolerance parameter                              epsd   = ', epsd
247         WRITE(numout,*) '       coefficient for semi-implicit coriolis           alpha  = ', alpha
248         WRITE(numout,*) '       diffusion constant for dynamics                  dm     = ', dm
249         WRITE(numout,*) '       number of sub-time steps for relaxation          nbiter = ', nbiter
250         WRITE(numout,*) '       maximum number of iterations for relaxation      nbitdr = ', nbitdr
251         WRITE(numout,*) '       relaxation constant                              om     = ', om
252         WRITE(numout,*) '       maximum value for the residual of relaxation     resl   = ', resl
253         WRITE(numout,*) '       drag coefficient for oceanic stress              cw     = ', cw
254         WRITE(numout,*) '       turning angle for oceanic stress                 angvg  = ', angvg, ' degrees'
255         WRITE(numout,*) '       first bulk-rheology parameter                    pstar  = ', pstar
256         WRITE(numout,*) '       second bulk-rhelogy parameter                    c_rhg  = ', c_rhg
257         WRITE(numout,*) '       minimun value for viscosity                      etamn  = ', etamn
258         WRITE(numout,*) '       creep limit                                      creepl = ', creepl
259         WRITE(numout,*) '       eccentricity of the elliptical yield curve       ecc    = ', ecc
260         WRITE(numout,*) '       horizontal diffusivity coeff. for sea-ice        ahi0   = ', ahi0
261      ENDIF
262
263      usecc2 = 1.0 / ( ecc * ecc )
264      rhoco  = rau0 * cw
265      angvg  = angvg * rad      ! convert angvg from degree to radian
266      sangvg = SIN( angvg )
267      cangvg = COS( angvg )
268      pstarh = pstar / 2.0
269      !
270      ahiu(:,:) = ahi0 * umask(:,:,1)            ! Ice eddy Diffusivity coefficients.
271      ahiv(:,:) = ahi0 * vmask(:,:,1)
272      !
273   END SUBROUTINE lim_dyn_init
274
275#else
276   !!----------------------------------------------------------------------
277   !!   Default option          Empty module           NO LIM sea-ice model
278   !!----------------------------------------------------------------------
279CONTAINS
280   SUBROUTINE lim_dyn         ! Empty routine
281   END SUBROUTINE lim_dyn
282#endif 
283
284   !!======================================================================
285END MODULE limdyn
Note: See TracBrowser for help on using the repository browser.