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.
limistate.F90 in trunk/NEMOGCM/NEMO/LIM_SRC_3 – NEMO

source: trunk/NEMOGCM/NEMO/LIM_SRC_3/limistate.F90 @ 4688

Last change on this file since 4688 was 4688, checked in by clem, 10 years ago

new version of LIM3 with perfect conservation of heat, see ticket #1352

  • Property svn:keywords set to Id
File size: 24.2 KB
Line 
1MODULE limistate
2   !!======================================================================
3   !!                     ***  MODULE  limistate  ***
4   !!              Initialisation of diagnostics ice variables
5   !!======================================================================
6   !! History :  2.0  ! 2004-01 (C. Ethe, G. Madec)  Original code
7   !!            4.0  ! 2011-02 (G. Madec) dynamical allocation
8   !!             -   ! 2012    (C. Rousset) add par_oce (for jp_sal)...bug?
9   !!----------------------------------------------------------------------
10#if defined key_lim3
11   !!----------------------------------------------------------------------
12   !!   'key_lim3' :                                    LIM3 sea-ice model
13   !!----------------------------------------------------------------------
14   !!   lim_istate      :  Initialisation of diagnostics ice variables
15   !!   lim_istate_init :  initialization of ice state and namelist read
16   !!----------------------------------------------------------------------
17   USE phycst           ! physical constant
18   USE oce              ! dynamics and tracers variables
19   USE dom_oce          ! ocean domain
20   USE sbc_oce          ! Surface boundary condition: ocean fields
21   USE sbc_ice          ! Surface boundary condition: ice fields
22   USE eosbn2           ! equation of state
23   USE ice              ! sea-ice variables
24   USE par_ice          ! ice parameters
25   USE par_oce          ! ocean parameters
26   USE dom_ice          ! sea-ice domain
27   USE in_out_manager   ! I/O manager
28   USE lib_mpp          ! MPP library
29   USE lib_fortran      ! Fortran utilities (allows no signed zero when 'key_nosignedzero' defined) 
30   USE wrk_nemo         ! work arrays
31   USE cpl_oasis3, ONLY : lk_cpl
32
33   IMPLICIT NONE
34   PRIVATE
35
36   PUBLIC   lim_istate      ! routine called by lim_init.F90
37
38   !! * Module variables
39   !                          !!** init namelist (namiceini) **
40   REAL(wp) ::   thres_sst   ! threshold water temperature for initial sea ice
41   REAL(wp) ::   hts_ini_n   ! initial snow thickness in the north
42   REAL(wp) ::   hts_ini_s   ! initial snow thickness in the south
43   REAL(wp) ::   hti_ini_n   ! initial ice thickness in the north
44   REAL(wp) ::   hti_ini_s   ! initial ice thickness in the south
45   REAL(wp) ::   ati_ini_n   ! initial leads area in the north
46   REAL(wp) ::   ati_ini_s   ! initial leads area in the south
47   REAL(wp) ::   smi_ini_n   ! initial salinity
48   REAL(wp) ::   smi_ini_s   ! initial salinity
49   REAL(wp) ::   tmi_ini_n   ! initial temperature
50   REAL(wp) ::   tmi_ini_s   ! initial temperature
51
52   LOGICAL  ::  ln_limini    ! initialization or not
53   !!----------------------------------------------------------------------
54   !!   LIM 3.0,  UCL-LOCEAN-IPSL (2008)
55   !! $Id$
56   !! Software governed by the CeCILL licence (modipsl/doc/NEMO_CeCILL.txt)
57   !!----------------------------------------------------------------------
58
59CONTAINS
60
61   SUBROUTINE lim_istate
62      !!-------------------------------------------------------------------
63      !!                    ***  ROUTINE lim_istate  ***
64      !!
65      !! ** Purpose :   defined the sea-ice initial state
66      !!
67      !! ** Method  :   
68      !!                This routine will put some ice where ocean
69      !!                is at the freezing point, then fill in ice
70      !!                state variables using prescribed initial
71      !!                values in the namelist           
72      !!
73      !! ** Steps   :   
74      !!                1) Read namelist
75      !!                2) Basal temperature; ice and hemisphere masks
76      !!                3) Fill in the ice thickness distribution using gaussian
77      !!                4) Fill in space-dependent arrays for state variables
78      !!                5) Diagnostic arrays
79      !!                6) Lateral boundary conditions
80      !!
81      !! ** Notes   : o_i, t_su, t_s, t_i, s_i must be filled everywhere, even
82      !!              where there is no ice (clem: I do not know why but it is mandatory)
83      !!
84      !! History :
85      !!   2.0  !  01-04  (C. Ethe, G. Madec)  Original code
86      !!   3.0  !  2007   (M. Vancoppenolle)   Rewrite for ice cats
87      !!   4.0  !  09-11  (M. Vancoppenolle)   Enhanced version for ice cats
88      !!--------------------------------------------------------------------
89
90      !! * Local variables
91      INTEGER    :: ji, jj, jk, jl             ! dummy loop indices
92      REAL(wp)   :: epsi20, ztmelts, zdh
93      INTEGER    :: i_hemis, i_fill, jl0 
94      REAL(wp)   :: ztest_1, ztest_2, ztest_3, ztest_4, ztests, zsigma, zarg, zA, zV, zA_cons, zV_cons, zconv
95      REAL(wp), POINTER, DIMENSION(:)     :: zht_i_ini, zat_i_ini, zvt_i_ini, zht_s_ini, zsm_i_ini, ztm_i_ini
96      REAL(wp), POINTER, DIMENSION(:,:)   :: zh_i_ini, za_i_ini, zv_i_ini
97      REAL(wp), POINTER, DIMENSION(:,:)   :: zswitch    ! ice indicator
98      INTEGER,  POINTER, DIMENSION(:,:)   :: zhemis   ! hemispheric index
99      !--------------------------------------------------------------------
100
101      CALL wrk_alloc( jpi, jpj, zswitch )
102      CALL wrk_alloc( jpi, jpj, zhemis )
103      CALL wrk_alloc( jpl,   2, zh_i_ini,  za_i_ini,  zv_i_ini )
104      CALL wrk_alloc(   2,      zht_i_ini, zat_i_ini, zvt_i_ini, zht_s_ini, zsm_i_ini, ztm_i_ini )
105
106      epsi20   = 1.e-20_wp
107
108      IF(lwp) WRITE(numout,*)
109      IF(lwp) WRITE(numout,*) 'lim_istate : Ice initialization '
110      IF(lwp) WRITE(numout,*) '~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ '
111
112      !--------------------------------------------------------------------
113      ! 1) Read namelist
114      !--------------------------------------------------------------------
115
116      CALL lim_istate_init     !  reading the initials parameters of the ice
117
118# if defined key_coupled
119      albege(:,:)   = 0.8 * tms(:,:)
120# endif
121
122      ! surface temperature
123      DO jl = 1, jpl ! loop over categories
124         t_su  (:,:,jl) = rtt * tms(:,:)
125         tn_ice(:,:,jl) = rtt * tms(:,:)
126      END DO
127      ! Basal temperature is set to the freezing point of seawater in Kelvin
128      t_bo(:,:) = ( tfreez( tsn(:,:,1,jp_sal) ) + rt0 ) * tms(:,:) 
129
130      IF( ln_limini ) THEN
131
132      !--------------------------------------------------------------------
133      ! 2) Basal temperature, ice mask and hemispheric index
134      !--------------------------------------------------------------------
135      ! ice if sst <= t-freez + thres_sst
136      DO jj = 1, jpj                                       
137         DO ji = 1, jpi
138            IF( ( tsn(ji,jj,1,jp_tem)  - ( t_bo(ji,jj) - rt0 ) ) * tms(ji,jj) >= thres_sst ) THEN  ; zswitch(ji,jj) = 0._wp * tms(ji,jj)    ! no ice
139            ELSE                                                                                   ; zswitch(ji,jj) = 1._wp * tms(ji,jj)    !    ice
140            ENDIF
141         END DO
142      END DO
143
144
145      ! Hemispheric index
146      ! MV 2011 new initialization
147      DO jj = 1, jpj
148         DO ji = 1, jpi
149            IF( fcor(ji,jj) >= 0._wp ) THEN   
150               zhemis(ji,jj) = 1 ! Northern hemisphere
151            ELSE
152               zhemis(ji,jj) = 2 ! Southern hemisphere
153            ENDIF
154         END DO
155      END DO
156      ! END MV 2011 new initialization
157
158      !--------------------------------------------------------------------
159      ! 3) Initialization of sea ice state variables
160      !--------------------------------------------------------------------
161
162      !-----------------------------
163      ! 3.1) Hemisphere-dependent arrays
164      !-----------------------------
165      ! assign initial thickness, concentration, snow depth and salinity to an hemisphere-dependent array
166      zht_i_ini(1) = hti_ini_n ; zht_i_ini(2) = hti_ini_s  ! ice thickness
167      zht_s_ini(1) = hts_ini_n ; zht_s_ini(2) = hts_ini_s  ! snow depth
168      zat_i_ini(1) = ati_ini_n ; zat_i_ini(2) = ati_ini_s  ! ice concentration
169      zsm_i_ini(1) = smi_ini_n ; zsm_i_ini(2) = smi_ini_s  ! bulk ice salinity
170      ztm_i_ini(1) = tmi_ini_n ; ztm_i_ini(2) = tmi_ini_s  ! temperature (ice and snow)
171
172      zvt_i_ini(:) = zht_i_ini(:) * zat_i_ini(:)   ! ice volume
173
174      !---------------------------------------------------------------------
175      ! 3.2) Distribute ice concentration and thickness into the categories
176      !---------------------------------------------------------------------
177      ! a gaussian distribution for ice concentration is used
178      ! then we check whether the distribution fullfills
179      ! volume and area conservation, positivity and ice categories bounds
180      DO i_hemis = 1, 2
181
182      ztest_1 = 0 ; ztest_2 = 0 ; ztest_3 = 0 ; ztest_4 = 0
183
184      ! note for the great nemo engineers:
185      ! only very few of the WRITE statements are necessary for the reference version
186      ! they were one day useful, but now i personally doubt of their
187      ! potential for bringing anything useful
188
189      DO i_fill = jpl, 1, -1
190         IF ( ( ztest_1 + ztest_2 + ztest_3 + ztest_4 ) .NE. 4 ) THEN
191            !----------------------------
192            ! fill the i_fill categories
193            !----------------------------
194            ! *** 1 category to fill
195            IF ( i_fill .EQ. 1 ) THEN
196               zh_i_ini(1,i_hemis)       = zht_i_ini(i_hemis)
197               za_i_ini(1,i_hemis)       = zat_i_ini(i_hemis)
198               zh_i_ini(2:jpl,i_hemis)   = 0._wp
199               za_i_ini(2:jpl,i_hemis)   = 0._wp
200            ELSE
201
202               ! *** >1 categores to fill
203               !--- Ice thicknesses in the i_fill - 1 first categories
204               DO jl = 1, i_fill - 1
205                  zh_i_ini(jl,i_hemis)    = 0.5 * ( hi_max(jl) + hi_max(jl-1) )
206               END DO
207               
208               !--- jl0: most likely index where cc will be maximum
209               DO jl = 1, jpl
210                  IF ( ( zht_i_ini(i_hemis) .GT. hi_max(jl-1) ) .AND. &
211                     ( zht_i_ini(i_hemis) .LE. hi_max(jl)   ) ) THEN
212                     jl0 = jl
213                  ENDIF
214               END DO
215               jl0 = MIN(jl0, i_fill)
216               
217               !--- Concentrations
218               za_i_ini(jl0,i_hemis)      = zat_i_ini(i_hemis) / SQRT(REAL(jpl))
219               DO jl = 1, i_fill - 1
220                  IF ( jl .NE. jl0 ) THEN
221                     zsigma               = 0.5 * zht_i_ini(i_hemis)
222                     zarg                 = ( zh_i_ini(jl,i_hemis) - zht_i_ini(i_hemis) ) / zsigma
223                     za_i_ini(jl,i_hemis) = za_i_ini(jl0,i_hemis) * EXP(-zarg**2)
224                  ENDIF
225               END DO
226               
227               zA = 0. ! sum of the areas in the jpl categories
228               DO jl = 1, i_fill - 1
229                 zA = zA + za_i_ini(jl,i_hemis)
230               END DO
231               za_i_ini(i_fill,i_hemis)   = zat_i_ini(i_hemis) - zA ! ice conc in the last category
232               IF ( i_fill .LT. jpl ) za_i_ini(i_fill+1:jpl, i_hemis) = 0._wp
233         
234               !--- Ice thickness in the last category
235               zV = 0. ! sum of the volumes of the N-1 categories
236               DO jl = 1, i_fill - 1
237                  zV = zV + za_i_ini(jl,i_hemis)*zh_i_ini(jl,i_hemis)
238               END DO
239               zh_i_ini(i_fill,i_hemis) = ( zvt_i_ini(i_hemis) - zV ) / za_i_ini(i_fill,i_hemis) 
240               IF ( i_fill .LT. jpl ) zh_i_ini(i_fill+1:jpl, i_hemis) = 0._wp
241
242               !--- volumes
243               zv_i_ini(:,i_hemis) = za_i_ini(:,i_hemis) * zh_i_ini(:,i_hemis)
244               IF ( i_fill .LT. jpl ) zv_i_ini(i_fill+1:jpl, i_hemis) = 0._wp
245
246            ENDIF ! i_fill
247
248            !---------------------
249            ! Compatibility tests
250            !---------------------
251            ! Test 1: area conservation
252            zA_cons = SUM(za_i_ini(:,i_hemis)) ; zconv = ABS(zat_i_ini(i_hemis) - zA_cons )
253            IF ( zconv .LT. 1.0e-6 ) THEN
254               ztest_1 = 1
255            ELSE 
256              ! this write is useful
257              IF(lwp)  WRITE(numout,*) ' * TEST1 AREA NOT CONSERVED *** zA_cons = ', zA_cons,' zat_i_ini = ',zat_i_ini(i_hemis) 
258               ztest_1 = 0
259            ENDIF
260
261            ! Test 2: volume conservation
262            zV_cons = SUM(zv_i_ini(:,i_hemis))
263            zconv = ABS(zvt_i_ini(i_hemis) - zV_cons)
264
265            IF ( zconv .LT. 1.0e-6 ) THEN
266               ztest_2 = 1
267            ELSE
268              ! this write is useful
269              IF(lwp)  WRITE(numout,*) ' * TEST2 VOLUME NOT CONSERVED *** zV_cons = ', zV_cons, &
270                            ' zvt_i_ini = ', zvt_i_ini(i_hemis)
271               ztest_2 = 0
272            ENDIF
273
274            ! Test 3: thickness of the last category is in-bounds ?
275            IF ( zh_i_ini(i_fill, i_hemis) .GT. hi_max(i_fill-1) ) THEN
276               ztest_3 = 1
277            ELSE
278               ! this write is useful
279               IF(lwp) WRITE(numout,*) ' * TEST 3 THICKNESS OF THE LAST CATEGORY OUT OF BOUNDS *** zh_i_ini(i_fill,i_hemis) = ', &
280               zh_i_ini(i_fill,i_hemis), ' hi_max(jpl-1) = ', hi_max(i_fill-1)
281               ztest_3 = 0
282            ENDIF
283
284            ! Test 4: positivity of ice concentrations
285            ztest_4 = 1
286            DO jl = 1, jpl
287               IF ( za_i_ini(jl,i_hemis) .LT. 0._wp ) THEN 
288                  ! this write is useful
289                  IF(lwp) WRITE(numout,*) ' * TEST 4 POSITIVITY NOT OK FOR CAT ', jl, ' WITH A = ', za_i_ini(jl,i_hemis)
290                  ztest_4 = 0
291               ENDIF
292            END DO
293
294         ENDIF ! ztest_1 + ztest_2 + ztest_3 + ztest_4
295 
296         ztests = ztest_1 + ztest_2 + ztest_3 + ztest_4
297
298      END DO ! i_fill
299
300      IF(lwp) THEN
301         WRITE(numout,*), ' ztests : ', ztests
302         IF ( ztests .NE. 4 ) THEN
303            WRITE(numout,*)
304            WRITE(numout,*), ' !!!! ALERT                  !!! '
305            WRITE(numout,*), ' !!!! Something is wrong in the LIM3 initialization procedure '
306            WRITE(numout,*)
307            WRITE(numout,*), ' *** ztests is not equal to 4 '
308            WRITE(numout,*), ' *** ztest_i (i=1,4) = ', ztest_1, ztest_2, ztest_3, ztest_4
309            WRITE(numout,*), ' zat_i_ini : ', zat_i_ini(i_hemis)
310            WRITE(numout,*), ' zht_i_ini : ', zht_i_ini(i_hemis)
311         ENDIF ! ztests .NE. 4
312      ENDIF
313     
314      END DO ! i_hemis
315
316      !---------------------------------------------------------------------
317      ! 3.3) Space-dependent arrays for ice state variables
318      !---------------------------------------------------------------------
319
320      ! Ice concentration, thickness and volume, ice salinity, ice age, surface temperature
321      DO jl = 1, jpl ! loop over categories
322         DO jj = 1, jpj
323            DO ji = 1, jpi
324               a_i(ji,jj,jl)   = zswitch(ji,jj) * za_i_ini (jl,zhemis(ji,jj))  ! concentration
325               ht_i(ji,jj,jl)  = zswitch(ji,jj) * zh_i_ini(jl,zhemis(ji,jj))  ! ice thickness
326               ht_s(ji,jj,jl)  = ht_i(ji,jj,jl) * ( zht_s_ini( zhemis(ji,jj) ) / zht_i_ini( zhemis(ji,jj) ) )  ! snow depth
327               sm_i(ji,jj,jl)  = zswitch(ji,jj) * zsm_i_ini(zhemis(ji,jj)) !+ ( 1._wp - zswitch(ji,jj) ) * s_i_min ! salinity
328               o_i(ji,jj,jl)   = zswitch(ji,jj) * 1._wp + ( 1._wp - zswitch(ji,jj) ) ! age
329               t_su(ji,jj,jl)  = zswitch(ji,jj) * ztm_i_ini(zhemis(ji,jj)) + ( 1._wp - zswitch(ji,jj) ) * rtt ! surf temp
330
331               ! This case below should not be used if (ht_s/ht_i) is ok in namelist
332               ! In case snow load is in excess that would lead to transformation from snow to ice
333               ! Then, transfer the snow excess into the ice (different from limthd_dh)
334               zdh = MAX( 0._wp, ( rhosn * ht_s(ji,jj,jl) + ( rhoic - rau0 ) * ht_i(ji,jj,jl) ) * r1_rau0 ) 
335               ! recompute ht_i, ht_s avoiding out of bounds values
336               ht_i(ji,jj,jl) = MIN( hi_max(jl), ht_i(ji,jj,jl) + zdh )
337               ht_s(ji,jj,jl) = MAX( 0._wp, ht_s(ji,jj,jl) - zdh * rhoic / rhosn )
338
339               ! ice volume, salt content, age content
340               v_i(ji,jj,jl)   = ht_i(ji,jj,jl) * a_i(ji,jj,jl)              ! ice volume
341               v_s(ji,jj,jl)   = ht_s(ji,jj,jl) * a_i(ji,jj,jl)              ! snow volume
342               smv_i(ji,jj,jl) = MIN( sm_i(ji,jj,jl) , sss_m(ji,jj) ) * v_i(ji,jj,jl) ! salt content
343               oa_i(ji,jj,jl)  = o_i(ji,jj,jl) * a_i(ji,jj,jl)               ! age content
344            END DO ! ji
345         END DO ! jj
346      END DO ! jl
347
348      ! Snow temperature and heat content
349      DO jk = 1, nlay_s
350         DO jl = 1, jpl ! loop over categories
351            DO jj = 1, jpj
352               DO ji = 1, jpi
353                   t_s(ji,jj,jk,jl) = zswitch(ji,jj) * ztm_i_ini(zhemis(ji,jj)) + ( 1._wp - zswitch(ji,jj) ) * rtt
354                   ! Snow energy of melting
355                   e_s(ji,jj,jk,jl) = zswitch(ji,jj) * rhosn * ( cpic * ( rtt - t_s(ji,jj,jk,jl) ) + lfus )
356                   ! Change dimensions
357                   e_s(ji,jj,jk,jl) = e_s(ji,jj,jk,jl) / unit_fac
358                   ! Multiply by volume, so that heat content in Joules
359                   e_s(ji,jj,jk,jl) = e_s(ji,jj,jk,jl) * area(ji,jj) * v_s(ji,jj,jl) / nlay_s
360               END DO ! ji
361            END DO ! jj
362         END DO ! jl
363      END DO ! jk
364
365      ! Ice salinity, temperature and heat content
366      DO jk = 1, nlay_i
367         DO jl = 1, jpl ! loop over categories
368            DO jj = 1, jpj
369               DO ji = 1, jpi
370                   t_i(ji,jj,jk,jl) = zswitch(ji,jj) * ztm_i_ini(zhemis(ji,jj)) + ( 1._wp - zswitch(ji,jj) ) * rtt 
371                   s_i(ji,jj,jk,jl) = zswitch(ji,jj) * zsm_i_ini(zhemis(ji,jj)) !+ ( 1._wp - zswitch(ji,jj) ) * s_i_min
372                   ztmelts          = - tmut * s_i(ji,jj,jk,jl) + rtt !Melting temperature in K
373
374                   ! heat content per unit volume
375                   e_i(ji,jj,jk,jl) = zswitch(ji,jj) * rhoic * (   cpic    * ( ztmelts - t_i(ji,jj,jk,jl) ) &
376                      +   lfus    * ( 1._wp - (ztmelts-rtt) / MIN((t_i(ji,jj,jk,jl)-rtt),-epsi20) ) &
377                      -   rcp     * ( ztmelts - rtt ) )
378
379                   ! Correct dimensions to avoid big values
380                   e_i(ji,jj,jk,jl) = e_i(ji,jj,jk,jl) / unit_fac 
381
382                   ! Mutliply by ice volume, and divide by number of layers to get heat content in J
383                   e_i(ji,jj,jk,jl) = e_i(ji,jj,jk,jl) * area(ji,jj) * v_i(ji,jj,jl) / nlay_i
384               END DO ! ji
385            END DO ! jj
386         END DO ! jl
387      END DO ! jk
388
389      tn_ice (:,:,:) = t_su (:,:,:)
390
391      ELSE 
392         ! if ln_limini=false
393         a_i  (:,:,:) = 0._wp
394         v_i  (:,:,:) = 0._wp
395         v_s  (:,:,:) = 0._wp
396         smv_i(:,:,:) = 0._wp
397         oa_i (:,:,:) = 0._wp
398         ht_i (:,:,:) = 0._wp
399         ht_s (:,:,:) = 0._wp
400         sm_i (:,:,:) = 0._wp
401         o_i  (:,:,:) = 0._wp
402
403         e_i(:,:,:,:) = 0._wp
404         e_s(:,:,:,:) = 0._wp
405
406         DO jl = 1, jpl
407            DO jk = 1, nlay_i
408               t_i(:,:,jk,jl) = rtt * tms(:,:)
409            END DO
410            DO jk = 1, nlay_s
411               t_s(:,:,jk,jl) = rtt * tms(:,:)
412            END DO
413         END DO
414     
415      ENDIF ! ln_limini
416     
417      at_i (:,:) = 0.0_wp
418      DO jl = 1, jpl
419         at_i (:,:) = at_i (:,:) + a_i (:,:,jl)
420      END DO
421      !
422      !--------------------------------------------------------------------
423      ! 4) Global ice variables for output diagnostics                    |
424      !--------------------------------------------------------------------
425      u_ice (:,:)     = 0._wp
426      v_ice (:,:)     = 0._wp
427      stress1_i(:,:)  = 0._wp
428      stress2_i(:,:)  = 0._wp
429      stress12_i(:,:) = 0._wp
430
431      !--------------------------------------------------------------------
432      ! 5) Moments for advection
433      !--------------------------------------------------------------------
434
435      sxopw (:,:) = 0._wp 
436      syopw (:,:) = 0._wp 
437      sxxopw(:,:) = 0._wp 
438      syyopw(:,:) = 0._wp 
439      sxyopw(:,:) = 0._wp
440
441      sxice (:,:,:)  = 0._wp   ;   sxsn (:,:,:)  = 0._wp   ;   sxa  (:,:,:)  = 0._wp
442      syice (:,:,:)  = 0._wp   ;   sysn (:,:,:)  = 0._wp   ;   sya  (:,:,:)  = 0._wp
443      sxxice(:,:,:)  = 0._wp   ;   sxxsn(:,:,:)  = 0._wp   ;   sxxa (:,:,:)  = 0._wp
444      syyice(:,:,:)  = 0._wp   ;   syysn(:,:,:)  = 0._wp   ;   syya (:,:,:)  = 0._wp
445      sxyice(:,:,:)  = 0._wp   ;   sxysn(:,:,:)  = 0._wp   ;   sxya (:,:,:)  = 0._wp
446
447      sxc0  (:,:,:)  = 0._wp   ;   sxe  (:,:,:,:)= 0._wp   
448      syc0  (:,:,:)  = 0._wp   ;   sye  (:,:,:,:)= 0._wp   
449      sxxc0 (:,:,:)  = 0._wp   ;   sxxe (:,:,:,:)= 0._wp   
450      syyc0 (:,:,:)  = 0._wp   ;   syye (:,:,:,:)= 0._wp   
451      sxyc0 (:,:,:)  = 0._wp   ;   sxye (:,:,:,:)= 0._wp   
452
453      sxsal  (:,:,:)  = 0._wp
454      sysal  (:,:,:)  = 0._wp
455      sxxsal (:,:,:)  = 0._wp
456      syysal (:,:,:)  = 0._wp
457      sxysal (:,:,:)  = 0._wp
458
459      sxage  (:,:,:)  = 0._wp
460      syage  (:,:,:)  = 0._wp
461      sxxage (:,:,:)  = 0._wp
462      syyage (:,:,:)  = 0._wp
463      sxyage (:,:,:)  = 0._wp
464
465
466      CALL wrk_dealloc( jpi, jpj, zswitch )
467      CALL wrk_dealloc( jpi, jpj, zhemis )
468      CALL wrk_dealloc( jpl,   2, zh_i_ini,  za_i_ini,  zv_i_ini )
469      CALL wrk_dealloc(   2,      zht_i_ini, zat_i_ini, zvt_i_ini, zht_s_ini, zsm_i_ini, ztm_i_ini )
470
471   END SUBROUTINE lim_istate
472
473   SUBROUTINE lim_istate_init
474      !!-------------------------------------------------------------------
475      !!                   ***  ROUTINE lim_istate_init  ***
476      !!       
477      !! ** Purpose : Definition of initial state of the ice
478      !!
479      !! ** Method : Read the namiceini namelist and check the parameter
480      !!       values called at the first timestep (nit000)
481      !!
482      !! ** input :
483      !!        Namelist namiceini
484      !!
485      !! history :
486      !!  8.5  ! 03-08 (C. Ethe) original code
487      !!  8.5  ! 07-11 (M. Vancoppenolle) rewritten initialization
488      !!-----------------------------------------------------------------------------
489      NAMELIST/namiceini/ ln_limini, thres_sst, hts_ini_n, hts_ini_s, hti_ini_n, hti_ini_s,  &
490         &                                      ati_ini_n, ati_ini_s, smi_ini_n, smi_ini_s, tmi_ini_n, tmi_ini_s
491      INTEGER :: ios                 ! Local integer output status for namelist read
492      !!-----------------------------------------------------------------------------
493      !
494      REWIND( numnam_ice_ref )              ! Namelist namiceini in reference namelist : Ice initial state
495      READ  ( numnam_ice_ref, namiceini, IOSTAT = ios, ERR = 901)
496901   IF( ios /= 0 ) CALL ctl_nam ( ios , 'namiceini in reference namelist', lwp )
497
498      REWIND( numnam_ice_cfg )              ! Namelist namiceini in configuration namelist : Ice initial state
499      READ  ( numnam_ice_cfg, namiceini, IOSTAT = ios, ERR = 902 )
500902   IF( ios /= 0 ) CALL ctl_nam ( ios , 'namiceini in configuration namelist', lwp )
501      IF(lwm) WRITE ( numoni, namiceini )
502
503      ! Define the initial parameters
504      ! -------------------------
505
506      IF(lwp) THEN
507         WRITE(numout,*)
508         WRITE(numout,*) 'lim_istate_init : ice parameters inititialisation '
509         WRITE(numout,*) '~~~~~~~~~~~~~~~'
510         WRITE(numout,*) '   initialization with ice (T) or not (F)       ln_limini   = ', ln_limini
511         WRITE(numout,*) '   threshold water temp. for initial sea-ice    thres_sst  = ', thres_sst
512         WRITE(numout,*) '   initial snow thickness in the north          hts_ini_n  = ', hts_ini_n
513         WRITE(numout,*) '   initial snow thickness in the south          hts_ini_s  = ', hts_ini_s 
514         WRITE(numout,*) '   initial ice thickness  in the north          hti_ini_n  = ', hti_ini_n
515         WRITE(numout,*) '   initial ice thickness  in the south          hti_ini_s  = ', hti_ini_s
516         WRITE(numout,*) '   initial ice concentr.  in the north          ati_ini_n  = ', ati_ini_n
517         WRITE(numout,*) '   initial ice concentr.  in the north          ati_ini_s  = ', ati_ini_s
518         WRITE(numout,*) '   initial  ice salinity  in the north          smi_ini_n  = ', smi_ini_n
519         WRITE(numout,*) '   initial  ice salinity  in the south          smi_ini_s  = ', smi_ini_s
520         WRITE(numout,*) '   initial  ice/snw temp  in the north          tmi_ini_n  = ', tmi_ini_n
521         WRITE(numout,*) '   initial  ice/snw temp  in the south          tmi_ini_s  = ', tmi_ini_s
522      ENDIF
523
524   END SUBROUTINE lim_istate_init
525
526#else
527   !!----------------------------------------------------------------------
528   !!   Default option :         Empty module          NO LIM sea-ice model
529   !!----------------------------------------------------------------------
530CONTAINS
531   SUBROUTINE lim_istate          ! Empty routine
532   END SUBROUTINE lim_istate
533#endif
534
535   !!======================================================================
536END MODULE limistate
Note: See TracBrowser for help on using the repository browser.