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.
limthd_2.F90 in trunk/NEMO/LIM_SRC_2 – NEMO

source: trunk/NEMO/LIM_SRC_2/limthd_2.F90 @ 1218

Last change on this file since 1218 was 1218, checked in by smasson, 16 years ago

first implementation of the new coupling interface in the trunk, see ticket:155

  • Property svn:eol-style set to native
  • Property svn:keywords set to Id
File size: 26.3 KB
Line 
1MODULE limthd_2
2   !!======================================================================
3   !!                  ***  MODULE limthd_2   ***
4   !!              LIM thermo ice model : ice thermodynamic
5   !!======================================================================
6   !! History :  1.0  !  00-01 (LIM)
7   !!            2.0  !  02-07 (C. Ethe, G. Madec) F90
8   !!            2.0  !  03-08 (C. Ethe)  add lim_thd_init
9   !!             -   !  08-2008  (A. Caubel, G. Madec, E. Maisonnave, S. Masson ) generic coupled interface
10   !!---------------------------------------------------------------------
11#if defined key_lim2
12   !!----------------------------------------------------------------------
13   !!   'key_lim2' :                                  LIM 2.0 sea-ice model
14   !!----------------------------------------------------------------------
15   !!   lim_thd_2      : thermodynamic of sea ice
16   !!   lim_thd_init_2 : initialisation of sea-ice thermodynamic
17   !!----------------------------------------------------------------------
18   USE phycst          ! physical constants
19   USE dom_oce         ! ocean space and time domain variables
20   USE lbclnk
21   USE in_out_manager  ! I/O manager
22   USE ice_2           ! LIM sea-ice variables
23   USE ice_oce         ! sea-ice/ocean variables
24   USE sbc_oce         !
25   USE sbc_ice         !
26   USE thd_ice_2       ! LIM thermodynamic sea-ice variables
27   USE dom_ice_2       ! LIM sea-ice domain
28   USE iceini_2
29   USE limthd_zdf_2
30   USE limthd_lac_2
31   USE limtab_2
32   USE prtctl          ! Print control
33   USE cpl_oasis3, ONLY : lk_cpl
34     
35   IMPLICIT NONE
36   PRIVATE
37
38   PUBLIC   lim_thd_2  ! called by lim_step
39
40   REAL(wp) ::   epsi20 = 1.e-20   ! constant values
41   REAL(wp) ::   epsi16 = 1.e-16   !
42   REAL(wp) ::   epsi04 = 1.e-04   !
43   REAL(wp) ::   rzero  = 0.e0     !
44   REAL(wp) ::   rone   = 1.e0     !
45
46   !! * Substitutions
47#  include "domzgr_substitute.h90"
48#  include "vectopt_loop_substitute.h90"
49   !!-------- -------------------------------------------------------------
50   !! NEMO/LIM 2.0,  UCL-LOCEAN-IPSL (2008)
51   !! $Id$
52   !! Software governed by the CeCILL licence (modipsl/doc/NEMO_CeCILL.txt)
53   !!----------------------------------------------------------------------
54
55CONTAINS
56
57   SUBROUTINE lim_thd_2( kt )
58      !!-------------------------------------------------------------------
59      !!                ***  ROUTINE lim_thd_2  ***       
60      !! 
61      !! ** Purpose : This routine manages the ice thermodynamic.
62      !!         
63      !! ** Action : - Initialisation of some variables
64      !!             - Some preliminary computation (oceanic heat flux
65      !!               at the ice base, snow acc.,heat budget of the leads)
66      !!             - selection of the icy points and put them in an array
67      !!             - call lim_vert_ther for vert ice thermodynamic
68      !!             - back to the geographic grid
69      !!             - selection of points for lateral accretion
70      !!             - call lim_lat_acc  for the ice accretion
71      !!             - back to the geographic grid
72      !!
73      !! References :   Goosse et al. 1996, Bul. Soc. Roy. Sc. Liege, 65, 87-90
74      !!---------------------------------------------------------------------
75      INTEGER, INTENT(in) ::   kt     ! number of iteration
76      !!
77      INTEGER  ::   ji, jj               ! dummy loop indices
78      INTEGER  ::   nbpb                 ! nb of icy pts for thermo. cal.
79      INTEGER  ::   nbpac                ! nb of pts for lateral accretion
80      CHARACTER (len=22) :: charout
81      REAL(wp) ::   zfric_umin = 5e-03   ! lower bound for the friction velocity
82      REAL(wp) ::   zfric_umax = 2e-02   ! upper bound for the friction velocity
83      REAL(wp) ::   zinda                ! switch for test. the val. of concen.
84      REAL(wp) ::   zindb, zindg         ! switches for test. the val of arg
85      REAL(wp) ::   za , zh, zthsnice    !
86      REAL(wp) ::   zfric_u              ! friction velocity
87      REAL(wp) ::   zfnsol               ! total non solar heat
88      REAL(wp) ::   zfontn               ! heat flux from snow thickness
89      REAL(wp) ::   zfntlat, zpareff     ! test. the val. of lead heat budget
90      REAL(wp) ::   zfi                  ! temporary scalar
91      REAL(wp), DIMENSION(jpi,jpj)     ::   zhicifp   ! ice thickness for outputs
92      REAL(wp), DIMENSION(jpi,jpj)     ::   zqlbsbq   ! link with lead energy budget qldif
93      REAL(wp), DIMENSION(jpi,jpj,jpk) ::   zmsk      ! working array
94      !!-------------------------------------------------------------------
95
96      IF( kt == nit000 )   CALL lim_thd_init_2  ! Initialization (first time-step only)
97   
98      !-------------------------------------------!
99      !   Initilization of diagnostic variables   !
100      !-------------------------------------------!
101     
102!!gm needed?  yes at least for some of these arrays
103      rdvosif(:,:) = 0.e0   ! variation of ice volume at surface
104      rdvobif(:,:) = 0.e0   ! variation of ice volume at bottom
105      fdvolif(:,:) = 0.e0   ! total variation of ice volume
106      rdvonif(:,:) = 0.e0   ! lateral variation of ice volume
107      fstric (:,:) = 0.e0   ! part of solar radiation absorbing inside the ice
108      fscmbq (:,:) = 0.e0   ! linked with fstric
109      ffltbif(:,:) = 0.e0   ! linked with fstric
110      qfvbq  (:,:) = 0.e0   ! linked with fstric
111      rdmsnif(:,:) = 0.e0   ! variation of snow mass per unit area
112      rdmicif(:,:) = 0.e0   ! variation of ice mass per unit area
113      hicifp (:,:) = 0.e0   ! daily thermodynamic ice production.
114      zmsk (:,:,:) = 0.e0
115
116      ! set to zero snow thickness smaller than epsi04
117      DO jj = 1, jpj
118         DO ji = 1, jpi
119            hsnif(ji,jj)  = hsnif(ji,jj) *  MAX( rzero, SIGN( rone , hsnif(ji,jj) - epsi04 ) )
120         END DO
121      END DO
122!!gm better coded (do not use SIGN...)
123!     WHERE( hsnif(:,:) < epsi04 )   hsnif(:,:) = 0.e0
124!!gm
125
126      IF(ln_ctl)   CALL prt_ctl( tab2d_1=hsnif, clinfo1=' lim_thd: hsnif   : ' )
127     
128      !-----------------------------------!
129      !   Treatment of particular cases   !
130      !-----------------------------------!
131     
132      DO jj = 1, jpj
133         DO ji = 1, jpi
134            !  snow is transformed into ice if the original ice cover disappears.
135            zindg         = tms(ji,jj) *  MAX( rzero , SIGN( rone , -hicif(ji,jj) ) )
136            hicif(ji,jj)  = hicif(ji,jj) + zindg * rhosn * hsnif(ji,jj) / rau0
137            hsnif(ji,jj)  = ( rone - zindg ) * hsnif(ji,jj) + zindg * hicif(ji,jj) * ( rau0 - rhoic ) / rhosn
138            dmgwi(ji,jj)  = zindg * (1.0 - frld(ji,jj)) * rhoic * hicif(ji,jj)   ! snow/ice mass
139           
140            !  the lead fraction, frld, must be little than or equal to amax (ice ridging).
141            zthsnice      = hsnif(ji,jj) + hicif(ji,jj)
142            zindb         = tms(ji,jj) * ( 1.0 - MAX( rzero , SIGN( rone , - zthsnice ) ) ) 
143            za            = zindb * MIN( rone, ( 1.0 - frld(ji,jj) ) * uscomi )
144            hsnif (ji,jj) = hsnif(ji,jj)  * za
145            hicif (ji,jj) = hicif(ji,jj)  * za
146            qstoif(ji,jj) = qstoif(ji,jj) * za
147            frld  (ji,jj) = 1.0 - zindb * ( 1.0 - frld(ji,jj) ) / MAX( za, epsi20 )
148           
149            !  the in situ ice thickness, hicif, must be equal to or greater than hiclim.
150            zh            = MAX( rone , zindb * hiclim  / MAX( hicif(ji,jj), epsi20 ) )
151            hsnif (ji,jj) = hsnif(ji,jj)  * zh
152            hicif (ji,jj) = hicif(ji,jj)  * zh
153            qstoif(ji,jj) = qstoif(ji,jj) * zh
154            frld  (ji,jj) = ( frld(ji,jj) + ( zh - 1.0 ) ) / zh
155         END DO
156      END DO
157
158      IF(ln_ctl) THEN
159         CALL prt_ctl( tab2d_1=hicif , clinfo1=' lim_thd: hicif   : ' )
160         CALL prt_ctl( tab2d_1=hsnif , clinfo1=' lim_thd: hsnif   : ' )
161         CALL prt_ctl( tab2d_1=dmgwi , clinfo1=' lim_thd: dmgwi   : ' )
162         CALL prt_ctl( tab2d_1=qstoif, clinfo1=' lim_thd: qstoif  : ' )
163         CALL prt_ctl( tab2d_1=frld  , clinfo1=' lim_thd: frld    : ' )
164      ENDIF
165
166     
167      !-------------------------------!
168      !   Thermodynamics of sea ice   !
169      !-------------------------------!
170     
171      !      Partial computation of forcing for the thermodynamic sea ice model.
172      !--------------------------------------------------------------------------
173
174      sst_m(:,:) = sst_m(:,:) + rt0
175
176      !CDIR NOVERRCHK
177      DO jj = 1, jpj
178         !CDIR NOVERRCHK
179         DO ji = 1, jpi
180            zthsnice       = hsnif(ji,jj) + hicif(ji,jj)
181            zindb          = tms(ji,jj) * ( 1.0 - MAX( rzero , SIGN( rone , - zthsnice ) ) ) 
182            pfrld(ji,jj)   = frld(ji,jj)
183            zinda          = 1.0 - MAX( rzero , SIGN( rone , - ( 1.0 - pfrld(ji,jj) ) ) )
184           
185            !  solar irradiance transmission at the mixed layer bottom and used in the lead heat budget
186            thcm(ji,jj)    = 0.e0 
187           
188            !  net downward heat flux from the ice to the ocean, expressed as a function of ocean
189            !  temperature and turbulent mixing (McPhee, 1992)
190            zfric_u        = MAX ( MIN( SQRT( ust2s(ji,jj) ) , zfric_umax ) , zfric_umin )  ! friction velocity
191            fdtcn(ji,jj)  = zindb * rau0 * rcp * 0.006  * zfric_u * ( sst_m(ji,jj) - tfu(ji,jj) ) 
192            qdtcn(ji,jj)  = zindb * fdtcn(ji,jj) * frld(ji,jj) * rdt_ice
193                       
194            !  partial computation of the lead energy budget (qldif)
195#if defined key_coupled 
196            zfi = 1.0 - pfrld(ji,jj)
197            qldif(ji,jj)   = tms(ji,jj) * rdt_ice                                             &
198               &    * (   ( qsr_tot(ji,jj) - qsr_ice(ji,jj) * zfi ) * ( 1.0 - thcm(ji,jj) )   &
199               &        + ( qns_tot(ji,jj) - qns_ice(ji,jj) * zfi )                           &
200               &        + frld(ji,jj) * ( fdtcn(ji,jj) + ( 1.0 - zindb ) * fsbbq(ji,jj) )   )
201#else
202            zfontn         = ( sprecip(ji,jj) / rhosn ) * xlsn  !   energy for melting solid precipitation
203            zfnsol         = qns(ji,jj)                         !  total non solar flux over the ocean
204            qldif(ji,jj)   = tms(ji,jj) * ( qsr(ji,jj) * ( 1.0 - thcm(ji,jj) )   &
205               &                               + zfnsol + fdtcn(ji,jj) - zfontn     &
206               &                               + ( 1.0 - zindb ) * fsbbq(ji,jj) )   &
207               &                        * frld(ji,jj) * rdt_ice   
208!!$            qldif(ji,jj)   = tms(ji,jj) * rdt_ice * frld(ji,jj)
209!!$               &           * ( qsr(ji,jj) * ( 1.0 - thcm(ji,jj) )      &
210!!$               &             + qns(ji,jj)  + fdtcn(ji,jj) - zfontn     &
211!!$               &             + ( 1.0 - zindb ) * fsbbq(ji,jj)      )   &
212#endif
213            !  parlat : percentage of energy used for lateral ablation (0.0)
214            zfntlat        = 1.0 - MAX( rzero , SIGN( rone ,  - qldif(ji,jj) ) )
215            zpareff        = 1.0 + ( parlat - 1.0 ) * zinda * zfntlat
216            zqlbsbq(ji,jj) = qldif(ji,jj) * ( 1.0 - zpareff ) / MAX( (1.0 - frld(ji,jj)) * rdt_ice , epsi16 )
217            qldif  (ji,jj) = zpareff *  qldif(ji,jj)
218            qdtcn  (ji,jj) = zpareff * qdtcn(ji,jj)
219           
220            !  energy needed to bring ocean surface layer until its freezing
221            qcmif  (ji,jj) =  rau0 * rcp * fse3t(ji,jj,1) * ( tfu(ji,jj) - sst_m(ji,jj) ) * ( 1 - zinda )
222           
223            !  calculate oceanic heat flux.
224            fbif   (ji,jj) = zindb * (  fsbbq(ji,jj) / MAX( (1.0 - frld(ji,jj)) , epsi20 ) + fdtcn(ji,jj) )
225           
226            ! computation of the daily thermodynamic ice production (only needed for output)
227            zhicifp(ji,jj) = hicif(ji,jj) * ( 1.0 - frld(ji,jj) )
228         END DO
229      END DO
230     
231      sst_m(:,:) = sst_m(:,:) - rt0
232     
233      !         Select icy points and fulfill arrays for the vectorial grid.
234      !----------------------------------------------------------------------
235      nbpb = 0
236      DO jj = 1, jpj
237         DO ji = 1, jpi
238            IF ( frld(ji,jj) < 1.0 ) THEN     
239               nbpb      = nbpb + 1
240               npb(nbpb) = (jj - 1) * jpi + ji
241            ENDIF
242         END DO
243      END DO
244
245      IF(ln_ctl) THEN
246         CALL prt_ctl(tab2d_1=pfrld, clinfo1=' lim_thd: pfrld   : ', tab2d_2=thcm   , clinfo2='  thcm    : ')
247         CALL prt_ctl(tab2d_1=fdtcn, clinfo1=' lim_thd: fdtcn   : ', tab2d_2=qdtcn  , clinfo2='  qdtcn   : ')
248         CALL prt_ctl(tab2d_1=qldif, clinfo1=' lim_thd: qldif   : ', tab2d_2=zqlbsbq, clinfo2='  zqlbsbq : ')
249         CALL prt_ctl(tab2d_1=qcmif, clinfo1=' lim_thd: qcmif   : ', tab2d_2=fbif   , clinfo2='  fbif    : ')
250         zmsk(:,:,1) = tms(:,:)
251         CALL prt_ctl(tab2d_1=qcmif  , clinfo1=' lim_thd: qcmif   : ', mask1=zmsk)
252         CALL prt_ctl(tab2d_1=zhicifp, clinfo1=' lim_thd: zhicifp : ')
253         WRITE(charout, FMT="('lim_thd: nbpb = ',I4)") nbpb
254         CALL prt_ctl_info(charout)
255      ENDIF
256     
257     
258      ! If there is no ice, do nothing. Otherwise, compute Top and Bottom accretion/ablation
259      !------------------------------------------------------------------------------------
260
261      IF( nbpb > 0 ) THEN
262         !   
263         !  put the variable in a 1-D array for thermodynamics process
264         CALL tab_2d_1d_2( nbpb, frld_1d    (1:nbpb)     , frld       , jpi, jpj, npb(1:nbpb) )
265         CALL tab_2d_1d_2( nbpb, h_ice_1d   (1:nbpb)     , hicif      , jpi, jpj, npb(1:nbpb) )
266         CALL tab_2d_1d_2( nbpb, h_snow_1d  (1:nbpb)     , hsnif      , jpi, jpj, npb(1:nbpb) )
267         CALL tab_2d_1d_2( nbpb, sist_1d    (1:nbpb)     , sist       , jpi, jpj, npb(1:nbpb) )
268         CALL tab_2d_1d_2( nbpb, tbif_1d    (1:nbpb , 1 ), tbif(:,:,1), jpi, jpj, npb(1:nbpb) )
269         CALL tab_2d_1d_2( nbpb, tbif_1d    (1:nbpb , 2 ), tbif(:,:,2), jpi, jpj, npb(1:nbpb) )
270         CALL tab_2d_1d_2( nbpb, tbif_1d    (1:nbpb , 3 ), tbif(:,:,3), jpi, jpj, npb(1:nbpb) )
271         CALL tab_2d_1d_2( nbpb, qsr_ice_1d (1:nbpb)     , qsr_ice    , jpi, jpj, npb(1:nbpb) )
272         CALL tab_2d_1d_2( nbpb, fr1_i0_1d  (1:nbpb)     , fr1_i0     , jpi, jpj, npb(1:nbpb) )
273         CALL tab_2d_1d_2( nbpb, fr2_i0_1d  (1:nbpb)     , fr2_i0     , jpi, jpj, npb(1:nbpb) )
274         CALL tab_2d_1d_2( nbpb, qns_ice_1d (1:nbpb)     , qns_ice    , jpi, jpj, npb(1:nbpb) )
275         IF( .NOT. lk_cpl ) THEN
276            CALL tab_2d_1d_2( nbpb, qla_ice_1d (1:nbpb)     , qla_ice    , jpi, jpj, npb(1:nbpb) )
277            CALL tab_2d_1d_2( nbpb, dqla_ice_1d(1:nbpb)     , dqla_ice   , jpi, jpj, npb(1:nbpb) )
278         ENDIF
279         CALL tab_2d_1d_2( nbpb, dqns_ice_1d(1:nbpb)     , dqns_ice   , jpi, jpj, npb(1:nbpb) )
280         CALL tab_2d_1d_2( nbpb, tfu_1d     (1:nbpb)     , tfu        , jpi, jpj, npb(1:nbpb) )
281         CALL tab_2d_1d_2( nbpb, sprecip_1d (1:nbpb)     , sprecip    , jpi, jpj, npb(1:nbpb) ) 
282         CALL tab_2d_1d_2( nbpb, fbif_1d    (1:nbpb)     , fbif       , jpi, jpj, npb(1:nbpb) )
283         CALL tab_2d_1d_2( nbpb, thcm_1d    (1:nbpb)     , thcm       , jpi, jpj, npb(1:nbpb) )
284         CALL tab_2d_1d_2( nbpb, qldif_1d   (1:nbpb)     , qldif      , jpi, jpj, npb(1:nbpb) )
285         CALL tab_2d_1d_2( nbpb, qstbif_1d  (1:nbpb)     , qstoif     , jpi, jpj, npb(1:nbpb) )
286         CALL tab_2d_1d_2( nbpb, rdmicif_1d (1:nbpb)     , rdmicif    , jpi, jpj, npb(1:nbpb) )
287         CALL tab_2d_1d_2( nbpb, dmgwi_1d   (1:nbpb)     , dmgwi      , jpi, jpj, npb(1:nbpb) )
288         CALL tab_2d_1d_2( nbpb, qlbbq_1d   (1:nbpb)     , zqlbsbq    , jpi, jpj, npb(1:nbpb) )
289         !
290         CALL lim_thd_zdf_2( 1, nbpb )       !  compute ice growth
291         !
292         !  back to the geographic grid.
293         CALL tab_1d_2d_2( nbpb, frld       , npb, frld_1d   (1:nbpb)     , jpi, jpj )
294         CALL tab_1d_2d_2( nbpb, hicif      , npb, h_ice_1d  (1:nbpb)     , jpi, jpj )
295         CALL tab_1d_2d_2( nbpb, hsnif      , npb, h_snow_1d (1:nbpb)     , jpi, jpj )
296         CALL tab_1d_2d_2( nbpb, sist       , npb, sist_1d   (1:nbpb)     , jpi, jpj )
297         CALL tab_1d_2d_2( nbpb, tbif(:,:,1), npb, tbif_1d   (1:nbpb , 1 ), jpi, jpj )   
298         CALL tab_1d_2d_2( nbpb, tbif(:,:,2), npb, tbif_1d   (1:nbpb , 2 ), jpi, jpj )   
299         CALL tab_1d_2d_2( nbpb, tbif(:,:,3), npb, tbif_1d   (1:nbpb , 3 ), jpi, jpj )   
300         CALL tab_1d_2d_2( nbpb, fscmbq     , npb, fscbq_1d  (1:nbpb)     , jpi, jpj )
301         CALL tab_1d_2d_2( nbpb, ffltbif    , npb, fltbif_1d (1:nbpb)     , jpi, jpj )
302         CALL tab_1d_2d_2( nbpb, fstric     , npb, fstbif_1d (1:nbpb)     , jpi, jpj )
303         CALL tab_1d_2d_2( nbpb, qldif      , npb, qldif_1d  (1:nbpb)     , jpi, jpj )
304         CALL tab_1d_2d_2( nbpb, qfvbq      , npb, qfvbq_1d  (1:nbpb)     , jpi, jpj )
305         CALL tab_1d_2d_2( nbpb, qstoif     , npb, qstbif_1d (1:nbpb)     , jpi, jpj )
306         CALL tab_1d_2d_2( nbpb, rdmicif    , npb, rdmicif_1d(1:nbpb)     , jpi, jpj )
307         CALL tab_1d_2d_2( nbpb, dmgwi      , npb, dmgwi_1d  (1:nbpb)     , jpi, jpj )
308         CALL tab_1d_2d_2( nbpb, rdmsnif    , npb, rdmsnif_1d(1:nbpb)     , jpi, jpj )
309         CALL tab_1d_2d_2( nbpb, rdvosif    , npb, dvsbq_1d  (1:nbpb)     , jpi, jpj )
310         CALL tab_1d_2d_2( nbpb, rdvobif    , npb, dvbbq_1d  (1:nbpb)     , jpi, jpj )
311         CALL tab_1d_2d_2( nbpb, fdvolif    , npb, dvlbq_1d  (1:nbpb)     , jpi, jpj )
312         CALL tab_1d_2d_2( nbpb, rdvonif    , npb, dvnbq_1d  (1:nbpb)     , jpi, jpj ) 
313         !
314      ENDIF
315
316     
317      ! Up-date sea ice thickness
318      !--------------------------
319      DO jj = 1, jpj
320         DO ji = 1, jpi
321            phicif(ji,jj) = hicif(ji,jj) 
322            hicif(ji,jj)  = hicif(ji,jj) *  ( rone -  MAX( rzero, SIGN( rone, - ( 1.0 - frld(ji,jj) ) ) ) )
323         END DO
324      END DO
325
326     
327      ! Tricky trick : add 2 to frld in the Southern Hemisphere
328      !--------------------------------------------------------
329      IF( fcor(1,1) < 0.e0 ) THEN
330         DO jj = 1, njeqm1
331            DO ji = 1, jpi
332               frld(ji,jj) = frld(ji,jj) + 2.0
333            END DO
334         END DO
335      ENDIF
336     
337     
338      ! Select points for lateral accretion (this occurs when heat exchange
339      ! between ice and ocean is negative; ocean losing heat)
340      !-----------------------------------------------------------------
341      nbpac = 0
342      DO jj = 1, jpj
343         DO ji = 1, jpi
344!i yes!     IF ( ( qcmif(ji,jj) - qldif(ji,jj) ) > 0.e0 ) THEN
345            IF ( tms(ji,jj) * ( qcmif(ji,jj) - qldif(ji,jj) ) > 0.e0 ) THEN
346               nbpac = nbpac + 1
347               npac( nbpac ) = (jj - 1) * jpi + ji
348            ENDIF
349         END DO
350      END DO
351     
352      IF(ln_ctl) THEN
353         CALL prt_ctl(tab2d_1=phicif, clinfo1=' lim_thd: phicif  : ', tab2d_2=hicif, clinfo2=' hicif : ')
354         WRITE(charout, FMT="('lim_thd: nbpac = ',I4)") nbpac
355         CALL prt_ctl_info(charout)
356      ENDIF
357
358
359      ! If ocean gains heat do nothing ; otherwise, one performs lateral accretion
360      !--------------------------------------------------------------------------------
361      IF( nbpac > 0 ) THEN
362         !
363         !...Put the variable in a 1-D array for lateral accretion
364         CALL tab_2d_1d_2( nbpac, frld_1d   (1:nbpac)     , frld       , jpi, jpj, npac(1:nbpac) )
365         CALL tab_2d_1d_2( nbpac, h_snow_1d (1:nbpac)     , hsnif      , jpi, jpj, npac(1:nbpac) )
366         CALL tab_2d_1d_2( nbpac, h_ice_1d  (1:nbpac)     , hicif      , jpi, jpj, npac(1:nbpac) )
367         CALL tab_2d_1d_2( nbpac, tbif_1d   (1:nbpac , 1 ), tbif(:,:,1), jpi, jpj, npac(1:nbpac) )   
368         CALL tab_2d_1d_2( nbpac, tbif_1d   (1:nbpac , 2 ), tbif(:,:,2), jpi, jpj, npac(1:nbpac) )   
369         CALL tab_2d_1d_2( nbpac, tbif_1d   (1:nbpac , 3 ), tbif(:,:,3), jpi, jpj, npac(1:nbpac) )   
370         CALL tab_2d_1d_2( nbpac, qldif_1d  (1:nbpac)     , qldif      , jpi, jpj, npac(1:nbpac) )
371         CALL tab_2d_1d_2( nbpac, qcmif_1d  (1:nbpac)     , qcmif      , jpi, jpj, npac(1:nbpac) )
372         CALL tab_2d_1d_2( nbpac, qstbif_1d (1:nbpac)     , qstoif     , jpi, jpj, npac(1:nbpac) )
373         CALL tab_2d_1d_2( nbpac, rdmicif_1d(1:nbpac)     , rdmicif    , jpi, jpj, npac(1:nbpac) )
374         CALL tab_2d_1d_2( nbpac, dvlbq_1d  (1:nbpac)     , fdvolif    , jpi, jpj, npac(1:nbpac) )
375         CALL tab_2d_1d_2( nbpac, tfu_1d    (1:nbpac)     , tfu        , jpi, jpj, npac(1:nbpac) )
376         !
377         CALL lim_thd_lac_2( 1 , nbpac )         ! lateral accretion routine.
378         !
379         !   back to the geographic grid
380         CALL tab_1d_2d_2( nbpac, frld       , npac(1:nbpac), frld_1d   (1:nbpac)     , jpi, jpj )
381         CALL tab_1d_2d_2( nbpac, hsnif      , npac(1:nbpac), h_snow_1d (1:nbpac)     , jpi, jpj )
382         CALL tab_1d_2d_2( nbpac, hicif      , npac(1:nbpac), h_ice_1d  (1:nbpac)     , jpi, jpj )
383         CALL tab_1d_2d_2( nbpac, tbif(:,:,1), npac(1:nbpac), tbif_1d   (1:nbpac , 1 ), jpi, jpj )
384         CALL tab_1d_2d_2( nbpac, tbif(:,:,2), npac(1:nbpac), tbif_1d   (1:nbpac , 2 ), jpi, jpj )
385         CALL tab_1d_2d_2( nbpac, tbif(:,:,3), npac(1:nbpac), tbif_1d   (1:nbpac , 3 ), jpi, jpj )
386         CALL tab_1d_2d_2( nbpac, qstoif     , npac(1:nbpac), qstbif_1d (1:nbpac)     , jpi, jpj )
387         CALL tab_1d_2d_2( nbpac, rdmicif    , npac(1:nbpac), rdmicif_1d(1:nbpac)     , jpi, jpj )
388         CALL tab_1d_2d_2( nbpac, fdvolif    , npac(1:nbpac), dvlbq_1d  (1:nbpac)     , jpi, jpj )
389         !
390      ENDIF
391       
392       
393      ! Recover frld values between 0 and 1 in the Southern Hemisphere (tricky trick)
394      ! Update daily thermodynamic ice production.   
395      !------------------------------------------------------------------------------
396      DO jj = 1, jpj
397         DO ji = 1, jpi
398            frld  (ji,jj) = MIN( frld(ji,jj), ABS( frld(ji,jj) - 2.0 ) )
399            hicifp(ji,jj) =  hicif(ji,jj) * ( 1.0 - frld(ji,jj) ) - zhicifp(ji,jj) + hicifp(ji,jj)
400         END DO
401      END DO
402
403      IF(ln_ctl) THEN
404         CALL prt_ctl_info(' lim_thd  end  ')
405         CALL prt_ctl( tab2d_1=hicif      , clinfo1=' lim_thd: hicif   : ', tab2d_2=hsnif , clinfo2=' hsnif  : ' )
406         CALL prt_ctl( tab2d_1=frld       , clinfo1=' lim_thd: frld    : ', tab2d_2=hicifp, clinfo2=' hicifp : ' )
407         CALL prt_ctl( tab2d_1=phicif     , clinfo1=' lim_thd: phicif  : ', tab2d_2=pfrld , clinfo2=' pfrld  : ' )
408         CALL prt_ctl( tab2d_1=sist       , clinfo1=' lim_thd: sist    : ' )
409         CALL prt_ctl( tab2d_1=tbif(:,:,1), clinfo1=' lim_thd: tbif 1  : ' )
410         CALL prt_ctl( tab2d_1=tbif(:,:,2), clinfo1=' lim_thd: tbif 2  : ' )
411         CALL prt_ctl( tab2d_1=tbif(:,:,3), clinfo1=' lim_thd: tbif 3  : ' )
412         CALL prt_ctl( tab2d_1=fdtcn      , clinfo1=' lim_thd: fdtcn   : ', tab2d_2=qdtcn , clinfo2=' qdtcn  : ' )
413         CALL prt_ctl( tab2d_1=qstoif     , clinfo1=' lim_thd: qstoif  : ', tab2d_2=fsbbq , clinfo2=' fsbbq  : ' )
414      ENDIF
415       !
416    END SUBROUTINE lim_thd_2
417
418
419    SUBROUTINE lim_thd_init_2
420      !!-------------------------------------------------------------------
421      !!                   ***  ROUTINE lim_thd_init_2 ***
422      !!                 
423      !! ** Purpose :   Physical constants and parameters linked to the ice
424      !!      thermodynamics
425      !!
426      !! ** Method  :   Read the namicethd namelist and check the ice-thermo
427      !!       parameter values called at the first timestep (nit000)
428      !!
429      !! ** input   :   Namelist namicether
430      !!-------------------------------------------------------------------
431      NAMELIST/namicethd/ hmelt , hiccrit, hicmin, hiclim, amax  ,        &
432         &                swiqst, sbeta  , parlat, hakspl, hibspl, exld,  &
433         &                hakdif, hnzst  , thth  , parsub, alphs
434      !!-------------------------------------------------------------------
435      !
436      REWIND( numnam_ice )                  ! read namelist
437      READ  ( numnam_ice , namicethd )
438      IF( lk_cpl .AND. parsub /= 0.0 )   CALL ctl_stop( 'In coupled mode, use parsub = 0. or send dqla' )
439      !
440      IF(lwp) THEN                          ! control print
441         WRITE(numout,*)
442         WRITE(numout,*)'lim_thd_init_2: ice parameters for ice thermodynamic computation '
443         WRITE(numout,*)'~~~~~~~~~~~~~~'
444         WRITE(numout,*)'       maximum melting at the bottom                           hmelt        = ', hmelt
445         WRITE(numout,*)'       ice thick. for lateral accretion in NH (SH)             hiccrit(1/2) = ', hiccrit
446         WRITE(numout,*)'       ice thick. corr. to max. energy stored in brine pocket  hicmin       = ', hicmin 
447         WRITE(numout,*)'       minimum ice thickness                                   hiclim       = ', hiclim 
448         WRITE(numout,*)'       maximum lead fraction                                   amax         = ', amax
449         WRITE(numout,*)'       energy stored in brine pocket (=1) or not (=0)          swiqst       = ', swiqst 
450         WRITE(numout,*)'       numerical carac. of the scheme for diffusion in ice '
451         WRITE(numout,*)'       Cranck-Nicholson (=0.5), implicit (=1), explicit (=0)   sbeta        = ', sbeta
452         WRITE(numout,*)'       percentage of energy used for lateral ablation          parlat       = ', parlat
453         WRITE(numout,*)'       slope of distr. for Hakkinen-Mellor lateral melting     hakspl       = ', hakspl 
454         WRITE(numout,*)'       slope of distribution for Hibler lateral melting        hibspl       = ', hibspl
455         WRITE(numout,*)'       exponent for leads-closure rate                         exld         = ', exld
456         WRITE(numout,*)'       coefficient for diffusions of ice and snow              hakdif       = ', hakdif
457         WRITE(numout,*)'       threshold thick. for comp. of eq. thermal conductivity  zhth         = ', thth 
458         WRITE(numout,*)'       thickness of the surf. layer in temp. computation       hnzst        = ', hnzst
459         WRITE(numout,*)'       switch for snow sublimation  (=1) or not (=0)           parsub       = ', parsub 
460         WRITE(numout,*)'       coefficient for snow density when snow ice formation    alphs        = ', alphs
461      ENDIF
462      !         
463      uscomi = 1.0 / ( 1.0 - amax )   ! inverse of minimum lead fraction
464      rcdsn = hakdif * rcdsn 
465      rcdic = hakdif * rcdic
466      !
467      IF( hsndif > 100.e0 .OR. hicdif > 100.e0 ) THEN
468         cnscg = 0.e0
469      ELSE
470         cnscg = rcpsn / rcpic   ! ratio  rcpsn/rcpic
471      ENDIF
472      !
473   END SUBROUTINE lim_thd_init_2
474
475#else
476   !!----------------------------------------------------------------------
477   !!   Default option          Dummy module       NO LIM 2.0 sea-ice model
478   !!----------------------------------------------------------------------
479CONTAINS
480   SUBROUTINE lim_thd_2         ! Dummy routine
481   END SUBROUTINE lim_thd_2
482#endif
483
484   !!======================================================================
485END MODULE limthd_2
Note: See TracBrowser for help on using the repository browser.