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 tags/nemo_v3_2/nemo_v3_2/NEMO/LIM_SRC_3 – NEMO

source: tags/nemo_v3_2/nemo_v3_2/NEMO/LIM_SRC_3/limthd_dh.F90 @ 1878

Last change on this file since 1878 was 1878, checked in by flavoni, 14 years ago

initial test for nemogcm

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