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_dh.F90 in NEMO/releases/release-3.4/NEMOGCM/NEMO/LIM_SRC_3 – NEMO

source: NEMO/releases/release-3.4/NEMOGCM/NEMO/LIM_SRC_3/limthd_dh.F90 @ 11534

Last change on this file since 11534 was 3807, checked in by gm, 11 years ago

dev_v3_4_STABLE_2012: #997 and #898: in LIM3, no use of qla_ice in coupled mode and its capping in forced mode

  • Property svn:keywords set to Id
File size: 35.7 KB
Line 
1MODULE limthd_dh
2   !!======================================================================
3   !!                       ***  MODULE limthd_dh ***
4   !!  LIM-3 :   thermodynamic growth and decay of the ice
5   !!======================================================================
6   !! History :  LIM  ! 2003-05 (M. Vancoppenolle) Original code in 1D
7   !!                 ! 2005-06 (M. Vancoppenolle) 3D version
8   !!            3.2  ! 2009-07 (M. Vancoppenolle, Y. Aksenov, G. Madec) bug correction in rdmsnif & rdmicif
9   !!            4.0  ! 2011-02 (G. Madec) dynamical allocation
10   !!----------------------------------------------------------------------
11#if defined key_lim3
12   !!----------------------------------------------------------------------
13   !!   'key_lim3'                                      LIM3 sea-ice model
14   !!----------------------------------------------------------------------
15   !!   lim_thd_dh  : vertical accr./abl. and lateral ablation of sea ice
16   !!----------------------------------------------------------------------
17   USE par_oce          ! ocean parameters
18   USE phycst           ! physical constants (OCE directory)
19   USE sbc_oce          ! Surface boundary condition: ocean fields
20   USE ice              ! LIM variables
21   USE par_ice          ! LIM parameters
22   USE thd_ice          ! LIM thermodynamics
23   USE in_out_manager   ! I/O manager
24   USE lib_mpp          ! MPP library
25   USE wrk_nemo         ! work arrays
26   USE lib_fortran      ! Fortran utilities (allows no signed zero when 'key_nosignedzero' defined)
27
28   IMPLICIT NONE
29   PRIVATE
30
31   PUBLIC   lim_thd_dh   ! called by lim_thd
32
33   REAL(wp) ::   epsi20 = 1e-20   ! constant values
34   REAL(wp) ::   epsi13 = 1e-13   !
35   REAL(wp) ::   epsi16 = 1e-16   !
36   REAL(wp) ::   zzero  = 0.e0    !
37   REAL(wp) ::   zone   = 1.e0    !
38
39   !!----------------------------------------------------------------------
40   !! NEMO/LIM3 3.4 , UCL - NEMO Consortium (2010)
41   !! $Id$
42   !! Software governed by the CeCILL licence     (NEMOGCM/NEMO_CeCILL.txt)
43   !!----------------------------------------------------------------------
44CONTAINS
45
46   SUBROUTINE lim_thd_dh( kideb, kiut, jl )
47      !!------------------------------------------------------------------
48      !!                ***  ROUTINE lim_thd_dh  ***
49      !!
50      !! ** Purpose :   determines variations of ice and snow thicknesses.
51      !!
52      !! ** Method  :   Ice/Snow surface melting arises from imbalance in surface fluxes
53      !!              Bottom accretion/ablation arises from flux budget
54      !!              Snow thickness can increase by precipitation and decrease by sublimation
55      !!              If snow load excesses Archmiede limit, snow-ice is formed by
56      !!              the flooding of sea-water in the snow
57      !!
58      !!                 1) Compute available flux of heat for surface ablation
59      !!                 2) Compute snow and sea ice enthalpies
60      !!                 3) Surface ablation and sublimation
61      !!                 4) Bottom accretion/ablation
62      !!                 5) Case of Total ablation
63      !!                 6) Snow ice formation
64      !!
65      !! References : Bitz and Lipscomb, 1999, J. Geophys. Res.
66      !!              Fichefet T. and M. Maqueda 1997, J. Geophys. Res., 102(C6), 12609-12646   
67      !!              Vancoppenolle, Fichefet and Bitz, 2005, Geophys. Res. Let.
68      !!              Vancoppenolle et al.,2009, Ocean Modelling
69      !!------------------------------------------------------------------
70      INTEGER , INTENT(in) ::   kideb, kiut   ! Start/End point on which the  the computation is applied
71      INTEGER , INTENT(in) ::   jl            ! Thickness cateogry number
72      !!
73      INTEGER  ::   ji , jk        ! dummy loop indices
74      INTEGER  ::   zji, zjj       ! 2D corresponding indices to ji
75      INTEGER  ::   isnow          ! switch for presence (1) or absence (0) of snow
76      INTEGER  ::   isnowic        ! snow ice formation not
77      INTEGER  ::   i_ice_switch   ! ice thickness above a certain treshold or not
78      INTEGER  ::   iter
79
80      REAL(wp) ::   zzfmass_i, zihgnew                     ! local scalar
81      REAL(wp) ::   zzfmass_s, zhsnew, ztmelts             ! local scalar
82      REAL(wp) ::   zhn, zdhcf, zdhbf, zhni, zhnfi, zihg   !
83      REAL(wp) ::   zdhnm, zhnnew, zhisn, zihic, zzc       !
84      REAL(wp) ::   zfracs       ! fractionation coefficient for bottom salt entrapment
85      REAL(wp) ::   zds          ! increment of bottom ice salinity
86      REAL(wp) ::   zcoeff       ! dummy argument for snowfall partitioning over ice and leads
87      REAL(wp) ::   zsm_snowice  ! snow-ice salinity
88      REAL(wp) ::   zswi1        ! switch for computation of bottom salinity
89      REAL(wp) ::   zswi12       ! switch for computation of bottom salinity
90      REAL(wp) ::   zswi2        ! switch for computation of bottom salinity
91      REAL(wp) ::   zgrr         ! bottom growth rate
92      REAL(wp) ::   ztform       ! bottom formation temperature
93      !
94      REAL(wp), POINTER, DIMENSION(:) ::   zh_i        ! ice layer thickness
95      REAL(wp), POINTER, DIMENSION(:) ::   zh_s        ! snow layer thickness
96      REAL(wp), POINTER, DIMENSION(:) ::   ztfs        ! melting point
97      REAL(wp), POINTER, DIMENSION(:) ::   zhsold      ! old snow thickness
98      REAL(wp), POINTER, DIMENSION(:) ::   zqprec      ! energy of fallen snow
99      REAL(wp), POINTER, DIMENSION(:) ::   zqfont_su   ! incoming, remaining surface energy
100      REAL(wp), POINTER, DIMENSION(:) ::   zqfont_bo   ! incoming, bottom energy
101      REAL(wp), POINTER, DIMENSION(:) ::   z_f_surf    ! surface heat for ablation
102      REAL(wp), POINTER, DIMENSION(:) ::   zhgnew      ! new ice thickness
103      REAL(wp), POINTER, DIMENSION(:) ::   zfmass_i    !
104
105      REAL(wp), POINTER, DIMENSION(:) ::   zdh_s_mel     ! snow melt
106      REAL(wp), POINTER, DIMENSION(:) ::   zdh_s_pre     ! snow precipitation
107      REAL(wp), POINTER, DIMENSION(:) ::   zdh_s_sub     ! snow sublimation
108      REAL(wp), POINTER, DIMENSION(:) ::   zfsalt_melt   ! salt flux due to ice melt
109
110      REAL(wp), POINTER, DIMENSION(:,:) ::   zdeltah
111
112      ! Pathological cases
113      REAL(wp), POINTER, DIMENSION(:) ::   zfdt_init   ! total incoming heat for ice melt
114      REAL(wp), POINTER, DIMENSION(:) ::   zfdt_final  ! total remaing heat for ice melt
115      REAL(wp), POINTER, DIMENSION(:) ::   zqt_i       ! total ice heat content
116      REAL(wp), POINTER, DIMENSION(:) ::   zqt_s       ! total snow heat content
117      REAL(wp), POINTER, DIMENSION(:) ::   zqt_dummy   ! dummy heat content
118
119      REAL(wp), POINTER, DIMENSION(:,:) ::   zqt_i_lay   ! total ice heat content
120
121      ! Heat conservation
122      INTEGER  ::   num_iter_max, numce_dh
123      REAL(wp) ::   meance_dh
124      REAL(wp), POINTER, DIMENSION(:) ::   zinnermelt
125      REAL(wp), POINTER, DIMENSION(:) ::   zfbase, zdq_i
126      !!------------------------------------------------------------------
127
128      CALL wrk_alloc( jpij, zh_i, zh_s, ztfs, zhsold, zqprec, zqfont_su, zqfont_bo, z_f_surf, zhgnew, zfmass_i )
129      CALL wrk_alloc( jpij, zdh_s_mel, zdh_s_pre, zdh_s_sub, zfsalt_melt, zfdt_init, zfdt_final, zqt_i, zqt_s, zqt_dummy )
130      CALL wrk_alloc( jpij, zinnermelt, zfbase, zdq_i )
131      CALL wrk_alloc( jpij, jkmax, zdeltah, zqt_i_lay )
132
133      zfsalt_melt(:)  = 0._wp
134      ftotal_fin(:)   = 0._wp
135      zfdt_init(:)    = 0._wp
136      zfdt_final(:)   = 0._wp
137
138      DO ji = kideb, kiut
139         old_ht_i_b(ji) = ht_i_b(ji)
140         old_ht_s_b(ji) = ht_s_b(ji)
141      END DO
142      !
143      !------------------------------------------------------------------------------!
144      !  1) Calculate available heat for surface ablation                            !
145      !------------------------------------------------------------------------------!
146      !
147      DO ji = kideb, kiut
148         isnow         = INT( 1.0 - MAX ( 0.0 , SIGN ( 1.0 , - ht_s_b(ji) ) ) )
149         ztfs(ji)      = isnow * rtt + ( 1.0 - isnow ) * rtt
150         z_f_surf(ji)  = qnsr_ice_1d(ji) + ( 1.0 - i0(ji) ) * qsr_ice_1d(ji) - fc_su(ji)
151         z_f_surf(ji)  = MAX( zzero , z_f_surf(ji) ) * MAX( zzero , SIGN( zone , t_su_b(ji) - ztfs(ji) ) )
152         zfdt_init(ji) = ( z_f_surf(ji) + MAX( fbif_1d(ji) + qlbbq_1d(ji) + fc_bo_i(ji),0.0 ) ) * rdt_ice
153      END DO ! ji
154
155      zqfont_su  (:) = 0._wp
156      zqfont_bo  (:) = 0._wp
157      dsm_i_se_1d(:) = 0._wp     
158      dsm_i_si_1d(:) = 0._wp   
159      !
160      !------------------------------------------------------------------------------!
161      !  2) Computing layer thicknesses and  snow and sea-ice enthalpies.            !
162      !------------------------------------------------------------------------------!
163      !
164      DO ji = kideb, kiut     ! Layer thickness
165         zh_i(ji) = ht_i_b(ji) / nlay_i
166         zh_s(ji) = ht_s_b(ji) / nlay_s
167      END DO
168      !
169      zqt_s(:) = 0._wp        ! Total enthalpy of the snow
170      DO jk = 1, nlay_s
171         DO ji = kideb, kiut
172            zqt_s(ji) =  zqt_s(ji) + q_s_b(ji,jk) * ht_s_b(ji) / nlay_s
173         END DO
174      END DO
175      !
176      zqt_i(:) = 0._wp        ! Total enthalpy of the ice
177      DO jk = 1, nlay_i
178         DO ji = kideb, kiut
179            zzc = q_i_b(ji,jk) * ht_i_b(ji) / nlay_i
180            zqt_i(ji)        =  zqt_i(ji) + zzc
181            zqt_i_lay(ji,jk) =              zzc
182         END DO
183      END DO
184      !
185      !------------------------------------------------------------------------------|
186      !  3) Surface ablation and sublimation                                         |
187      !------------------------------------------------------------------------------|
188      !
189      !-------------------------
190      ! 3.1 Snow precips / melt
191      !-------------------------
192      ! Snow accumulation in one thermodynamic time step
193      ! snowfall is partitionned between leads and ice
194      ! if snow fall was uniform, a fraction (1-at_i) would fall into leads
195      ! but because of the winds, more snow falls on leads than on sea ice
196      ! and a greater fraction (1-at_i)^beta of the total mass of snow
197      ! (beta < 1) falls in leads.
198      ! In reality, beta depends on wind speed,
199      ! and should decrease with increasing wind speed but here, it is
200      ! considered as a constant. an average value is 0.66
201      ! Martin Vancoppenolle, December 2006
202
203      ! Snow fall
204      DO ji = kideb, kiut
205         zcoeff = ( 1.0 - ( 1.0 - at_i_b(ji) )**betas ) / at_i_b(ji) 
206         zdh_s_pre(ji) = zcoeff * sprecip_1d(ji) * rdt_ice / rhosn
207      END DO
208      zdh_s_mel(:) =  0._wp
209
210      ! Melt of fallen snow
211      DO ji = kideb, kiut
212         ! tatm_ice is now in K
213         zqprec   (ji)   =  rhosn * ( cpic * ( rtt - tatm_ice_1d(ji) ) + lfus ) 
214         zqfont_su(ji)   =  z_f_surf(ji) * rdt_ice
215         zdeltah  (ji,1) =  MIN( 0.e0 , - zqfont_su(ji) / MAX( zqprec(ji) , epsi13 ) )
216         zqfont_su(ji)   =  MAX( 0.e0 , - zdh_s_pre(ji) - zdeltah(ji,1)              ) * zqprec(ji)
217         zdeltah  (ji,1) =  MAX( - zdh_s_pre(ji) , zdeltah(ji,1) )
218         zdh_s_mel(ji)   =  zdh_s_mel(ji) + zdeltah(ji,1)
219         ! heat conservation
220         qt_s_in(ji,jl)  =  qt_s_in(ji,jl) + zqprec(ji) * zdh_s_pre(ji)
221         zqt_s  (ji)     =  zqt_s  (ji)    + zqprec(ji) * zdh_s_pre(ji)
222         zqt_s  (ji)     =  MAX( zqt_s(ji) - zqfont_su(ji) , 0.e0 ) 
223      END DO
224
225
226      ! Snow melt due to surface heat imbalance
227      DO jk = 1, nlay_s
228         DO ji = kideb, kiut
229            zdeltah  (ji,jk) = - zqfont_su(ji) / q_s_b(ji,jk)
230            zqfont_su(ji)    =  MAX( 0.0 , - zh_s(ji) - zdeltah(ji,jk) ) * q_s_b(ji,jk) 
231            zdeltah  (ji,jk) =  MAX( zdeltah(ji,jk) , - zh_s(ji) )
232            zdh_s_mel(ji)    =  zdh_s_mel(ji) + zdeltah(ji,jk)        ! resulting melt of snow   
233         END DO
234      END DO
235
236      ! Apply snow melt to snow depth
237      DO ji = kideb, kiut
238         dh_s_tot(ji)   =  zdh_s_mel(ji) + zdh_s_pre(ji)
239         ! Old and new snow depths
240         zhsold(ji)     =  ht_s_b(ji)
241         zhsnew         =  ht_s_b(ji) + dh_s_tot(ji)
242         ! If snow is still present zhn = 1, else zhn = 0
243         zhn            =  1.0 - MAX( zzero , SIGN( zone , - zhsnew ) )
244         ht_s_b(ji)     =  MAX( zzero , zhsnew )
245         ! Volume and mass variations of snow
246         dvsbq_1d  (ji) =  a_i_b(ji) * ( ht_s_b(ji) - zhsold(ji) - zdh_s_pre(ji) )
247         dvsbq_1d  (ji) =  MIN( zzero, dvsbq_1d(ji) )
248         rdmsnif_1d(ji) =  rdmsnif_1d(ji) + rhosn * dvsbq_1d(ji)
249      END DO ! ji
250
251      !--------------------------
252      ! 3.2 Surface ice ablation
253      !--------------------------
254      DO ji = kideb, kiut 
255         dh_i_surf(ji) =  0._wp
256         z_f_surf (ji) =  zqfont_su(ji) / rdt_ice ! heat conservation test
257         zdq_i    (ji) =  0._wp
258      END DO ! ji
259
260      DO jk = 1, nlay_i
261         DO ji = kideb, kiut 
262            !                                                    ! melt of layer jk
263            zdeltah  (ji,jk) = - zqfont_su(ji) / q_i_b(ji,jk)
264            !                                                    ! recompute heat available
265            zqfont_su(ji)    = MAX( 0.0 , - zh_i(ji) - zdeltah(ji,jk) ) * q_i_b(ji,jk) 
266            !                                                    ! melt of layer jk cannot be higher than its thickness
267            zdeltah  (ji,jk) = MAX( zdeltah(ji,jk) , - zh_i(ji) )
268            !                                                    ! update surface melt
269            dh_i_surf(ji)    = dh_i_surf(ji) + zdeltah(ji,jk) 
270            !                                                    ! for energy conservation
271            zdq_i    (ji)    = zdq_i(ji) + zdeltah(ji,jk) * q_i_b(ji,jk) / rdt_ice
272            !
273            ! contribution to ice-ocean salt flux
274            zji = MOD( npb(ji) - 1 , jpi ) + 1
275            zjj =    ( npb(ji) - 1 ) / jpi + 1
276            zfsalt_melt(ji) = zfsalt_melt(ji) + ( sss_m(zji,zjj) - sm_i_b(ji) ) * a_i_b(ji)    &
277               &                              * MIN( zdeltah(ji,jk) , 0.e0 ) * rhoic / rdt_ice 
278         END DO
279      END DO
280
281      !                     !-------------------
282      IF( con_i ) THEN      ! Conservation test
283         !                  !-------------------
284         numce_dh  = 0
285         meance_dh = 0._wp
286         DO ji = kideb, kiut
287            IF ( ( z_f_surf(ji) + zdq_i(ji) ) .GE. 1.0e-3 ) THEN
288               numce_dh  = numce_dh + 1
289               meance_dh = meance_dh + z_f_surf(ji) + zdq_i(ji)
290            ENDIF
291            IF( z_f_surf(ji) + zdq_i(ji) .GE. 1.0e-3  ) THEN!
292               WRITE(numout,*) ' ALERTE heat loss for surface melt '
293               WRITE(numout,*) ' zji, zjj, jl :', zji, zjj, jl
294               WRITE(numout,*) ' ht_i_b       : ', ht_i_b(ji)
295               WRITE(numout,*) ' z_f_surf     : ', z_f_surf(ji)
296               WRITE(numout,*) ' zdq_i        : ', zdq_i(ji)
297               WRITE(numout,*) ' ht_i_b       : ', ht_i_b(ji)
298               WRITE(numout,*) ' fc_bo_i      : ', fc_bo_i(ji)
299               WRITE(numout,*) ' fbif_1d      : ', fbif_1d(ji)
300               WRITE(numout,*) ' qlbbq_1d     : ', qlbbq_1d(ji)
301               WRITE(numout,*) ' s_i_new      : ', s_i_new(ji)
302               WRITE(numout,*) ' sss_m        : ', sss_m(zji,zjj)
303            ENDIF
304         END DO
305         !
306         IF( numce_dh > 0 )   meance_dh = meance_dh / numce_dh
307         WRITE(numout,*) ' Error report - Category : ', jl
308         WRITE(numout,*) ' ~~~~~~~~~~~~ '
309         WRITE(numout,*) ' Number of points where there is sur. me. error : ', numce_dh
310         WRITE(numout,*) ' Mean basal growth error on error points : ', meance_dh
311         !
312      ENDIF
313
314      !----------------------
315      ! 3.3 Snow sublimation
316      !----------------------
317
318      DO ji = kideb, kiut
319         ! qla_ice is always >=0 (upwards), heat goes to the atmosphere, therefore snow sublimates
320#if defined key_coupled
321         zdh_s_sub(ji)    =  0._wp      ! coupled mode: sublimation already included in emp_ice (to do in limsbc_ice)
322#else
323         !                              ! forced  mode: snow thickness change due to sublimation
324         zdh_s_sub(ji)    =  - parsub * qla_ice_1d(ji) / ( rhosn * lsub ) * rdt_ice
325#endif
326         dh_s_tot (ji)    =  dh_s_tot(ji) + zdh_s_sub(ji)
327         zdhcf            =  ht_s_b(ji) + zdh_s_sub(ji) 
328         ht_s_b   (ji)    =  MAX( zzero , zdhcf )
329         ! we recompute dh_s_tot
330         dh_s_tot (ji)    =  ht_s_b(ji) - zhsold(ji)
331         qt_s_in  (ji,jl) =  qt_s_in(ji,jl) + zdh_s_sub(ji)*q_s_b(ji,1)
332      END DO
333
334      zqt_dummy(:) = 0.e0
335      DO jk = 1, nlay_s
336         DO ji = kideb,kiut
337            q_s_b    (ji,jk) = rhosn * ( cpic * ( rtt - t_s_b(ji,jk) ) + lfus )
338            zqt_dummy(ji)    =  zqt_dummy(ji) + q_s_b(ji,jk) * ht_s_b(ji) / nlay_s            ! heat conservation
339         END DO
340      END DO
341
342      DO jk = 1, nlay_s
343         DO ji = kideb, kiut
344            ! In case of disparition of the snow, we have to update the snow temperatures
345            zhisn  =  MAX( zzero , SIGN( zone, - ht_s_b(ji) ) )
346            t_s_b(ji,jk) = ( 1.0 - zhisn ) * t_s_b(ji,jk) + zhisn * rtt
347            q_s_b(ji,jk) = ( 1.0 - zhisn ) * q_s_b(ji,jk)
348         END DO
349      END DO
350
351      !
352      !------------------------------------------------------------------------------!
353      ! 4) Basal growth / melt                                                       !
354      !------------------------------------------------------------------------------!
355      !
356      ! Ice basal growth / melt is given by the ratio of heat budget over basal
357      ! ice heat content.  Basal heat budget is given by the difference between
358      ! the inner conductive flux  (fc_bo_i), from the open water heat flux
359      ! (qlbbqb) and the turbulent ocean flux (fbif).
360      ! fc_bo_i is positive downwards. fbif and qlbbq are positive to the ice
361
362      !-----------------------------------------------------
363      ! 4.1 Basal growth - (a) salinity not varying in time
364      !-----------------------------------------------------
365      IF(  num_sal /= 2  .AND.  num_sal /= 4  ) THEN
366         DO ji = kideb, kiut
367            IF(  ( fc_bo_i(ji) + fbif_1d(ji) + qlbbq_1d(ji) ) < 0.0  ) THEN
368               s_i_new(ji)         =  sm_i_b(ji)
369               ! Melting point in K
370               ztmelts             =  - tmut * s_i_new(ji) + rtt 
371               ! New ice heat content (Bitz and Lipscomb, 1999)
372               ztform              =  t_i_b(ji,nlay_i)  ! t_bo_b crashes in the
373               ! Baltic
374               q_i_b(ji,nlay_i+1)  = rhoic * (  cpic * ( ztmelts - ztform )                                &
375                  &                           + lfus * (  1.0 - ( ztmelts - rtt ) / ( ztform - rtt )  )    &
376                  &                           - rcp  * ( ztmelts - rtt )                                 )
377               ! Basal growth rate = - F*dt / q
378               dh_i_bott(ji)       =  - rdt_ice*( fc_bo_i(ji) + fbif_1d(ji) + qlbbq_1d(ji) ) / q_i_b(ji,nlay_i+1) 
379            ENDIF
380         END DO
381      ENDIF
382
383      !-------------------------------------------------
384      ! 4.1 Basal growth - (b) salinity varying in time
385      !-------------------------------------------------
386      IF(  num_sal == 2 .OR.  num_sal == 4  ) THEN
387         ! the growth rate (dh_i_bott) is function of the new ice
388         ! heat content (q_i_b(nlay_i+1)). q_i_b depends on the new ice
389         ! salinity (snewice). snewice depends on dh_i_bott
390         ! it converges quickly, so, no problem
391         ! See Vancoppenolle et al., OM08 for more info on this
392
393         ! Initial value (tested 1D, can be anything between 1 and 20)
394         num_iter_max = 4
395         s_i_new(:)   = 4.0
396
397         ! Iterative procedure
398         DO iter = 1, num_iter_max
399            DO ji = kideb, kiut
400               IF(  fc_bo_i(ji) + fbif_1d(ji) + qlbbq_1d(ji) < 0.e0  ) THEN
401                  zji = MOD( npb(ji) - 1, jpi ) + 1
402                  zjj = ( npb(ji) - 1 ) / jpi + 1
403                  ! Melting point in K
404                  ztmelts             =   - tmut * s_i_new(ji) + rtt 
405                  ! New ice heat content (Bitz and Lipscomb, 1999)
406                  q_i_b(ji,nlay_i+1)  =  rhoic * (  cpic * ( ztmelts - t_bo_b(ji) )                             &
407                     &                            + lfus * ( 1.0 - ( ztmelts - rtt ) / ( t_bo_b(ji) - rtt ) )   &
408                     &                            - rcp * ( ztmelts-rtt )                                     )
409                  ! Bottom growth rate = - F*dt / q
410                  dh_i_bott(ji) =  - rdt_ice * ( fc_bo_i(ji) + fbif_1d(ji) + qlbbq_1d(ji) ) / q_i_b(ji,nlay_i+1)
411                  ! New ice salinity ( Cox and Weeks, JGR, 1988 )
412                  ! zswi2  (1) if dh_i_bott/rdt .GT. 3.6e-7
413                  ! zswi12 (1) if dh_i_bott/rdt .LT. 3.6e-7 and .GT. 2.0e-8
414                  ! zswi1  (1) if dh_i_bott/rdt .LT. 2.0e-8
415                  zgrr   = MIN( 1.0e-3, MAX ( dh_i_bott(ji) / rdt_ice , epsi13 ) )
416                  zswi2  = MAX( zzero , SIGN( zone , zgrr - 3.6e-7 ) ) 
417                  zswi12 = MAX( zzero , SIGN( zone , zgrr - 2.0e-8 ) ) * ( 1.0 - zswi2 )
418                  zswi1  = 1. - zswi2 * zswi12 
419                  zfracs = zswi1  * 0.12 + zswi12 * ( 0.8925 + 0.0568 * LOG( 100.0 * zgrr ) )   &
420                     &                   + zswi2  * 0.26 / ( 0.26 + 0.74 * EXP ( - 724300.0 * zgrr ) ) 
421                  zds         = zfracs * sss_m(zji,zjj) - s_i_new(ji)
422                  s_i_new(ji) = zfracs * sss_m(zji,zjj)
423               ENDIF ! fc_bo_i
424            END DO ! ji
425         END DO ! iter
426
427         ! Final values
428         DO ji = kideb, kiut
429            IF( ( fc_bo_i(ji) + fbif_1d(ji) + qlbbq_1d(ji) ) .LT. 0.0  ) THEN
430               ! New ice salinity must not exceed 15 psu
431               s_i_new(ji) = MIN( s_i_new(ji), s_i_max )
432               ! Metling point in K
433               ztmelts     =   - tmut * s_i_new(ji) + rtt 
434               ! New ice heat content (Bitz and Lipscomb, 1999)
435               q_i_b(ji,nlay_i+1)  =  rhoic * (  cpic * ( ztmelts - t_bo_b(ji) )                              &
436                  &                            + lfus * ( 1.0 - ( ztmelts - rtt ) / ( t_bo_b(ji) - rtt ) )    &
437                  &                            - rcp * ( ztmelts - rtt )                                    )
438               ! Basal growth rate = - F*dt / q
439               dh_i_bott(ji)       =  - rdt_ice*( fc_bo_i(ji) + fbif_1d(ji) + qlbbq_1d(ji) ) / q_i_b(ji,nlay_i+1) 
440               ! Salinity update
441               ! entrapment during bottom growth
442               dsm_i_se_1d(ji) = ( s_i_new(ji) * dh_i_bott(ji) + sm_i_b(ji) * ht_i_b(ji) )    &
443                  &            / MAX( ht_i_b(ji) + dh_i_bott(ji) ,epsi13 ) - sm_i_b(ji)
444            ENDIF ! heat budget
445         END DO
446      ENDIF
447
448      !----------------
449      ! 4.2 Basal melt
450      !----------------
451      meance_dh = 0._wp
452      numce_dh  = 0
453      zinnermelt(:) = 0._wp
454
455      DO ji = kideb, kiut
456         ! heat convergence at the surface > 0
457         IF(  ( fc_bo_i(ji) + fbif_1d(ji) + qlbbq_1d(ji) ) >= 0._wp  ) THEN
458            s_i_new(ji)   =  s_i_b(ji,nlay_i)
459            zqfont_bo(ji) =  rdt_ice * ( fc_bo_i(ji) + fbif_1d(ji) + qlbbq_1d(ji) )
460            zfbase(ji)    =  zqfont_bo(ji) / rdt_ice     ! heat conservation test
461            zdq_i(ji)     =  0._wp
462            dh_i_bott(ji) =  0._wp
463         ENDIF
464      END DO
465
466      DO jk = nlay_i, 1, -1
467         DO ji = kideb, kiut
468            IF (  ( fc_bo_i(ji) + fbif_1d(ji) + qlbbq_1d(ji) ) .GE. 0.0  ) THEN
469               ztmelts            =   - tmut * s_i_b(ji,jk) + rtt 
470               IF( t_i_b(ji,jk) >= ztmelts ) THEN
471                  zdeltah(ji,jk)  = - zh_i(ji)
472                  dh_i_bott(ji)   = dh_i_bott(ji) + zdeltah(ji,jk)
473                  zinnermelt(ji)   = 1._wp
474               ELSE  ! normal ablation
475                  zdeltah(ji,jk)  = - zqfont_bo(ji) / q_i_b(ji,jk)
476                  zqfont_bo(ji)   = MAX( 0.0 , - zh_i(ji) - zdeltah(ji,jk) ) * q_i_b(ji,jk)
477                  zdeltah(ji,jk)  = MAX(zdeltah(ji,jk), - zh_i(ji) )
478                  dh_i_bott(ji)   = dh_i_bott(ji) + zdeltah(ji,jk)
479                  zdq_i(ji)       = zdq_i(ji) + zdeltah(ji,jk) * q_i_b(ji,jk) / rdt_ice
480                  ! contribution to salt flux
481                  zji             = MOD( npb(ji) - 1, jpi ) + 1
482                  zjj             = ( npb(ji) - 1 ) / jpi + 1
483                  zfsalt_melt(ji) = zfsalt_melt(ji) + ( sss_m(zji,zjj) - sm_i_b(ji)   ) * a_i_b(ji)   &
484                     &                              * MIN( zdeltah(ji,jk) , 0.0 ) * rhoic / rdt_ice 
485               ENDIF
486            ENDIF
487         END DO ! ji
488      END DO ! jk
489
490      !                     !-------------------
491      IF( con_i ) THEN      ! Conservation test
492      !                     !-------------------
493         DO ji = kideb, kiut
494            IF(  ( fc_bo_i(ji) + fbif_1d(ji) + qlbbq_1d(ji) ) >= 0.e0  ) THEN
495               IF( ( zfbase(ji) + zdq_i(ji) ) >= 1.e-3 ) THEN
496                  numce_dh  = numce_dh + 1
497                  meance_dh = meance_dh + zfbase(ji) + zdq_i(ji)
498               ENDIF
499               IF ( zfbase(ji) + zdq_i(ji) .GE. 1.0e-3  ) THEN
500                  WRITE(numout,*) ' ALERTE heat loss for basal melt : zji, zjj, jl :', zji, zjj, jl
501                  WRITE(numout,*) ' ht_i_b    : ', ht_i_b(ji)
502                  WRITE(numout,*) ' zfbase    : ', zfbase(ji)
503                  WRITE(numout,*) ' zdq_i     : ', zdq_i(ji)
504                  WRITE(numout,*) ' ht_i_b    : ', ht_i_b(ji)
505                  WRITE(numout,*) ' fc_bo_i   : ', fc_bo_i(ji)
506                  WRITE(numout,*) ' fbif_1d   : ', fbif_1d(ji)
507                  WRITE(numout,*) ' qlbbq_1d  : ', qlbbq_1d(ji)
508                  WRITE(numout,*) ' s_i_new   : ', s_i_new(ji)
509                  WRITE(numout,*) ' sss_m     : ', sss_m(zji,zjj)
510                  WRITE(numout,*) ' dh_i_bott : ', dh_i_bott(ji)
511                  WRITE(numout,*) ' innermelt : ', INT( zinnermelt(ji) )
512               ENDIF
513            ENDIF
514         END DO
515         IF( numce_dh > 0 )   meance_dh = meance_dh / numce_dh
516         WRITE(numout,*) ' Number of points where there is bas. me. error : ', numce_dh
517         WRITE(numout,*) ' Mean basal melt error on error points : ', meance_dh
518         WRITE(numout,*) ' Remaining bottom heat : ', zqfont_bo(jiindex_1d)
519         !
520      ENDIF
521
522      !
523      !------------------------------------------------------------------------------!
524      !  5) Pathological cases                                                       !
525      !------------------------------------------------------------------------------!
526      !
527      !----------------------------------------------
528      ! 5.1 Excessive ablation in a 1-category model
529      !----------------------------------------------
530
531      DO ji = kideb, kiut
532         !                     ! in a 1-category sea ice model, bottom ablation must not exceed hmelt (-0.15)
533         IF( jpl == 1 ) THEN   ;   zdhbf = MAX( hmelt , dh_i_bott(ji) )
534         ELSE                  ;   zdhbf =              dh_i_bott(ji) 
535         ENDIF
536         !                     ! excessive energy is sent to lateral ablation
537         fsup     (ji) =  rhoic * lfus * at_i_b(ji) / MAX( 1.0 - at_i_b(ji) , epsi13 )   &
538            &                          * ( zdhbf - dh_i_bott(ji) ) / rdt_ice
539         dh_i_bott(ji)  = zdhbf
540         !                     !since ice volume is only used for outputs, we keep it global for all categories
541         dvbbq_1d (ji) = a_i_b(ji) * dh_i_bott(ji)
542         !                     !new ice thickness
543         zhgnew   (ji) = ht_i_b(ji) + dh_i_surf(ji) + dh_i_bott(ji)
544         !                     ! diagnostic ( bottom ice growth )
545         zji = MOD( npb(ji) - 1, jpi ) + 1
546         zjj = ( npb(ji) - 1 ) / jpi + 1
547         diag_bot_gr(zji,zjj) = diag_bot_gr(zji,zjj) + MAX(dh_i_bott(ji),0.0)*a_i_b(ji) / rdt_ice
548         diag_sur_me(zji,zjj) = diag_sur_me(zji,zjj) + MIN(dh_i_surf(ji),0.0)*a_i_b(ji) / rdt_ice
549         diag_bot_me(zji,zjj) = diag_bot_me(zji,zjj) + MIN(dh_i_bott(ji),0.0)*a_i_b(ji) / rdt_ice
550      END DO
551
552      !-----------------------------------
553      ! 5.2 More than available ice melts
554      !-----------------------------------
555      ! then heat applied minus heat content at previous time step
556      ! should equal heat remaining
557      !
558      DO ji = kideb, kiut
559         ! Adapt the remaining energy if too much ice melts
560         !--------------------------------------------------
561         zihgnew    =  1.0 - MAX( zzero , SIGN( zone , - zhgnew(ji) ) ) !1 if ice
562         ! 0 if no more ice
563         zhgnew    (ji) =         zihgnew   * zhgnew(ji)      ! ice thickness is put to 0
564         ! remaining heat
565         zfdt_final(ji) = ( 1.0 - zihgnew ) * ( zqfont_su(ji) +  zqfont_bo(ji) ) 
566
567         ! If snow remains, energy is used to melt snow
568         zhni =  ht_s_b(ji)      ! snow depth at previous time step
569         zihg =  MAX( zzero , SIGN ( zone , - ht_s_b(ji) ) ) ! 0 if snow
570
571         ! energy of melting of remaining snow
572         zqt_s(ji) =    ( 1. - zihg ) * zqt_s(ji) / MAX( zhni, epsi13 )
573         zdhnm     =  - ( 1. - zihg ) * ( 1. - zihgnew ) * zfdt_final(ji) / MAX( zqt_s(ji) , epsi13 )
574         zhnfi          =  zhni + zdhnm
575         zfdt_final(ji) =  MAX( zfdt_final(ji) + zqt_s(ji) * zdhnm , 0.0 )
576         ht_s_b(ji)     =  MAX( zzero , zhnfi )
577         zqt_s(ji)      =  zqt_s(ji) * ht_s_b(ji)
578
579         ! Mass variations of ice and snow
580         !---------------------------------
581         !                                              ! mass variation of the jl category
582         zzfmass_s = - a_i_b(ji) * ( zhni       - ht_s_b(ji) ) * rhosn   ! snow
583         zzfmass_i =   a_i_b(ji) * ( zhgnew(ji) - ht_i_b(ji) ) * rhoic   ! ice 
584         !
585         zfmass_i(ji) = zzfmass_i                       ! ice variation saved to compute salt flux (see below)
586         !
587         !                                              ! mass variation cumulated over category
588         rdmsnif_1d(ji) = rdmsnif_1d(ji) + zzfmass_s                     ! snow
589         rdmicif_1d(ji) = rdmicif_1d(ji) + zzfmass_i                     ! ice
590
591         ! Remaining heat to the ocean
592         !---------------------------------
593         focea(ji)  = - zfdt_final(ji) / rdt_ice         ! focea is in W.m-2 * dt
594
595      END DO
596
597      ftotal_fin (:) = zfdt_final(:)  / rdt_ice
598
599      !---------------------------
600      ! Salt flux and heat fluxes                   
601      !---------------------------
602      DO ji = kideb, kiut
603         zihgnew    =  1.0 - MAX( zzero , SIGN( zone , - zhgnew(ji) ) )   !1 if ice
604
605         ! Salt flux
606         zji = MOD( npb(ji) - 1, jpi ) + 1
607         zjj = ( npb(ji) - 1 ) / jpi + 1
608         ! new lines
609         IF( num_sal == 4 ) THEN
610            fseqv_1d(ji) = fseqv_1d(ji) +        zihgnew  * zfsalt_melt(ji)                                &
611               &                        + (1.0 - zihgnew) * zfmass_i(ji) * ( sss_m(zji,zjj) - bulk_sal   ) / rdt_ice
612         ELSE
613            fseqv_1d(ji) = fseqv_1d(ji) +        zihgnew  * zfsalt_melt(ji)                                &
614               &                        + (1.0 - zihgnew) * zfmass_i(ji) * ( sss_m(zji,zjj) - sm_i_b(ji) ) / rdt_ice
615         ENDIF
616         ! Heat flux
617         ! excessive bottom ablation energy (fsup) - 0 except if jpl = 1
618         ! excessive total ablation energy (focea) sent to the ocean
619         qfvbq_1d(ji)  = qfvbq_1d(ji) + fsup(ji) + ( 1.0 - zihgnew ) * focea(ji) * a_i_b(ji) * rdt_ice
620
621         zihic   = 1.0 - MAX( zzero , SIGN( zone , -ht_i_b(ji) ) )
622         ! equals 0 if ht_i = 0, 1 if ht_i gt 0
623         fscbq_1d(ji) =  a_i_b(ji) * fstbif_1d(ji)
624         qldif_1d(ji)  = qldif_1d(ji) + fsup(ji) + ( 1.0 - zihgnew ) * focea(ji)    * a_i_b(ji) * rdt_ice   &
625            &                                    + ( 1.0 - zihic   ) * fscbq_1d(ji)             * rdt_ice
626      END DO  ! ji
627
628      !-------------------------------------------
629      ! Correct temperature, energy and thickness
630      !-------------------------------------------
631      DO ji = kideb, kiut
632         zihgnew    =  1.0 - MAX( zzero , SIGN( zone , - zhgnew(ji) ) ) 
633         t_su_b(ji) =  zihgnew * t_su_b(ji) + ( 1.0 - zihgnew ) * rtt
634      END DO  ! ji
635
636      DO jk = 1, nlay_i
637         DO ji = kideb, kiut
638            zihgnew      =  1.0 - MAX( zzero , SIGN( zone , - zhgnew(ji) ) ) 
639            t_i_b(ji,jk) =  zihgnew * t_i_b(ji,jk) + ( 1.0 - zihgnew ) * rtt
640            q_i_b(ji,jk) =  zihgnew * q_i_b(ji,jk)
641         END DO
642      END DO  ! ji
643
644      DO ji = kideb, kiut
645         ht_i_b(ji) = zhgnew(ji)
646      END DO  ! ji
647      !
648      !------------------------------------------------------------------------------|
649      !  6) Snow-Ice formation                                                       |
650      !------------------------------------------------------------------------------|
651      ! When snow load excesses Archimede's limit, snow-ice interface goes down under sea-level,
652      ! flooding of seawater transforms snow into ice dh_snowice is positive for the ice
653      DO ji = kideb, kiut
654         !
655         dh_snowice(ji) = MAX(  zzero , ( rhosn * ht_s_b(ji) + (rhoic-rau0) * ht_i_b(ji) ) / ( rhosn+rau0-rhoic )  )
656         zhgnew(ji)     = MAX(  zhgnew(ji) , zhgnew(ji) + dh_snowice(ji)  )
657         zhnnew         = MIN(  ht_s_b(ji) , ht_s_b(ji) - dh_snowice(ji)  )
658
659         !  Changes in ice volume and ice mass.
660         dvnbq_1d  (ji) =                a_i_b(ji) * ( zhgnew(ji)-ht_i_b(ji) )
661         dmgwi_1d  (ji) = dmgwi_1d(ji) + a_i_b(ji) * ( ht_s_b(ji) - zhnnew ) * rhosn
662
663         rdmicif_1d(ji) = rdmicif_1d(ji) + a_i_b(ji) * ( zhgnew(ji) - ht_i_b(ji) ) * rhoic 
664         rdmsnif_1d(ji) = rdmsnif_1d(ji) + a_i_b(ji) * ( zhnnew     - ht_s_b(ji) ) * rhosn
665
666         !        Equivalent salt flux (1) Snow-ice formation component
667         !        -----------------------------------------------------
668         zji = MOD( npb(ji) - 1, jpi ) + 1
669         zjj =    ( npb(ji) - 1 ) / jpi + 1
670
671         IF( num_sal /= 2 ) THEN   ;   zsm_snowice = sm_i_b(ji)
672         ELSE                      ;   zsm_snowice = ( rhoic - rhosn ) / rhoic * sss_m(zji,zjj) 
673         ENDIF
674         IF( num_sal == 4 ) THEN
675            fseqv_1d(ji) = fseqv_1d(ji) + ( sss_m(zji,zjj) - bulk_sal    ) * a_i_b(ji)   &
676               &                        * ( zhgnew(ji) - ht_i_b(ji) ) * rhoic / rdt_ice
677         ELSE
678            fseqv_1d(ji) = fseqv_1d(ji) + ( sss_m(zji,zjj) - zsm_snowice ) * a_i_b(ji)   &
679               &                        * ( zhgnew(ji) - ht_i_b(ji) ) * rhoic / rdt_ice
680         ENDIF
681         ! entrapment during snow ice formation
682         i_ice_switch = 1.0 - MAX( 0.e0 , SIGN( 1.0 , - ht_i_b(ji) + 1.0e-6 ) )
683         isnowic      = 1.0 - MAX( 0.e0 , SIGN( 1.0 , - dh_snowice(ji)      ) ) * i_ice_switch
684         IF(  num_sal == 2  .OR.  num_sal == 4  )   &
685            dsm_i_si_1d(ji) = ( zsm_snowice*dh_snowice(ji) &
686            &               + sm_i_b(ji) * ht_i_b(ji) / MAX( ht_i_b(ji) + dh_snowice(ji), epsi13)   &
687            &               - sm_i_b(ji) ) * isnowic     
688
689         !  Actualize new snow and ice thickness.
690         ht_s_b(ji)  = zhnnew
691         ht_i_b(ji)  = zhgnew(ji)
692
693         ! Total ablation ! new lines added to debug
694         IF( ht_i_b(ji) <= 0._wp )   a_i_b(ji) = 0._wp
695
696         ! diagnostic ( snow ice growth )
697         zji = MOD( npb(ji) - 1, jpi ) + 1
698         zjj =    ( npb(ji) - 1 ) / jpi + 1
699         diag_sni_gr(zji,zjj)  = diag_sni_gr(zji,zjj) + dh_snowice(ji)*a_i_b(ji) / rdt_ice
700         !
701      END DO !ji
702      !
703      CALL wrk_dealloc( jpij, zh_i, zh_s, ztfs, zhsold, zqprec, zqfont_su, zqfont_bo, z_f_surf, zhgnew, zfmass_i )
704      CALL wrk_dealloc( jpij, zdh_s_mel, zdh_s_pre, zdh_s_sub, zfsalt_melt, zfdt_init, zfdt_final, zqt_i, zqt_s, zqt_dummy )
705      CALL wrk_dealloc( jpij, zinnermelt, zfbase, zdq_i )
706      CALL wrk_dealloc( jpij, jkmax, zdeltah, zqt_i_lay )
707      !
708   END SUBROUTINE lim_thd_dh
709   
710#else
711   !!----------------------------------------------------------------------
712   !!   Default option                               NO  LIM3 sea-ice model
713   !!----------------------------------------------------------------------
714CONTAINS
715   SUBROUTINE lim_thd_dh          ! Empty routine
716   END SUBROUTINE lim_thd_dh
717#endif
718
719   !!======================================================================
720END MODULE limthd_dh
Note: See TracBrowser for help on using the repository browser.