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

source: trunk/NEMOGCM/NEMO/LIM_SRC_3/limthd_dh.F90 @ 2528

Last change on this file since 2528 was 2528, checked in by rblod, 14 years ago

Update NEMOGCM from branch nemo_v3_3_beta

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