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

source: branches/2012/dev_r3385_NOCS04_HAMF/NEMOGCM/NEMO/LIM_SRC_3/limthd_dh.F90 @ 3524

Last change on this file since 3524 was 3524, checked in by gm, 12 years ago

Branch: dev_r3385_NOCS04_HAMF; #665. add USE lib_fortran when SIGN is used (TOP,OPA,LIM2&3) ; salt flux names start with sfx_ in LIM3

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