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

source: trunk/NEMO/LIM_SRC_3/limthd_dh.F90 @ 869

Last change on this file since 869 was 869, checked in by rblod, 16 years ago

Parallelisation of LIM3. This commit seems to ensure the reproducibility mono/mpp. See ticket #77.

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