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 branches/2013/dev_r4028_CNRS_LIM3/NEMOGCM/NEMO/LIM_SRC_3 – NEMO

source: branches/2013/dev_r4028_CNRS_LIM3/NEMOGCM/NEMO/LIM_SRC_3/limistate.F90 @ 4634

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

major changes in heat budget

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