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_dif.F90 in branches/2017/dev_r8183_ICEMODEL/NEMOGCM/NEMO/LIM_SRC_3 – NEMO

source: branches/2017/dev_r8183_ICEMODEL/NEMOGCM/NEMO/LIM_SRC_3/limthd_dif.F90 @ 8342

Last change on this file since 8342 was 8342, checked in by clem, 7 years ago

simplify the code

  • Property svn:keywords set to Id
File size: 42.7 KB
Line 
1MODULE limthd_dif
2   !!======================================================================
3   !!                       ***  MODULE limthd_dif ***
4   !!                       heat diffusion in sea ice
5   !!                   computation of surface and inner T 
6   !!======================================================================
7   !! History :  LIM  ! 02-2003 (M. Vancoppenolle) original 1D code
8   !!                 ! 06-2005 (M. Vancoppenolle) 3d version
9   !!                 ! 11-2006 (X Fettweis) Vectorization by Xavier
10   !!                 ! 04-2007 (M. Vancoppenolle) Energy conservation
11   !!            4.0  ! 2011-02 (G. Madec) dynamical allocation
12   !!             -   ! 2012-05 (C. Rousset) add penetration solar flux
13   !!----------------------------------------------------------------------
14#if defined key_lim3
15   !!----------------------------------------------------------------------
16   !!   'key_lim3'                                      LIM3 sea-ice model
17   !!----------------------------------------------------------------------
18   USE par_oce        ! ocean parameters
19   USE phycst         ! physical constants (ocean directory)
20   USE ice            ! LIM-3 variables
21   USE thd_ice        ! LIM-3: thermodynamics
22   USE in_out_manager ! I/O manager
23   USE lib_mpp        ! MPP library
24   USE wrk_nemo       ! work arrays
25   USE lib_fortran    ! Fortran utilities (allows no signed zero when 'key_nosignedzero' defined) 
26
27   IMPLICIT NONE
28   PRIVATE
29
30   PUBLIC   lim_thd_dif   ! called by lim_thd
31
32   !!----------------------------------------------------------------------
33   !! NEMO/LIM3 4.0 , UCL - NEMO Consortium (2011)
34   !! $Id$
35   !! Software governed by the CeCILL licence     (NEMOGCM/NEMO_CeCILL.txt)
36   !!----------------------------------------------------------------------
37CONTAINS
38
39   SUBROUTINE lim_thd_dif
40      !!------------------------------------------------------------------
41      !!                ***  ROUTINE lim_thd_dif  ***
42      !! ** Purpose :
43      !!           This routine determines the time evolution of snow and sea-ice
44      !!           temperature profiles.
45      !! ** Method  :
46      !!           This is done by solving the heat equation diffusion with
47      !!           a Neumann boundary condition at the surface and a Dirichlet one
48      !!           at the bottom. Solar radiation is partially absorbed into the ice.
49      !!           The specific heat and thermal conductivities depend on ice salinity
50      !!           and temperature to take into account brine pocket melting. The
51      !!           numerical
52      !!           scheme is an iterative Crank-Nicolson on a non-uniform multilayer grid
53      !!           in the ice and snow system.
54      !!
55      !!           The successive steps of this routine are
56      !!           1.  Thermal conductivity at the interfaces of the ice layers
57      !!           2.  Internal absorbed radiation
58      !!           3.  Scale factors due to non-uniform grid
59      !!           4.  Kappa factors
60      !!           Then iterative procedure begins
61      !!           5.  specific heat in the ice
62      !!           6.  eta factors
63      !!           7.  surface flux computation
64      !!           8.  tridiagonal system terms
65      !!           9.  solving the tridiagonal system with Gauss elimination
66      !!           Iterative procedure ends according to a criterion on evolution
67      !!           of temperature
68      !!
69      !!
70      !! ** Inputs / Ouputs : (global commons)
71      !!           surface temperature : t_su_1d
72      !!           ice/snow temperatures   : t_i_1d, t_s_1d
73      !!           ice salinities          : s_i_1d
74      !!           number of layers in the ice/snow: nlay_i, nlay_s
75      !!           profile of the ice/snow layers : z_i, z_s
76      !!           total ice/snow thickness : ht_i_1d, ht_s_1d
77      !!
78      !! ** External :
79      !!
80      !! ** References :
81      !!
82      !! ** History :
83      !!           (02-2003) Martin Vancoppenolle, Louvain-la-Neuve, Belgium
84      !!           (06-2005) Martin Vancoppenolle, 3d version
85      !!           (11-2006) Vectorized by Xavier Fettweis (UCL-ASTR)
86      !!           (04-2007) Energy conservation tested by M. Vancoppenolle
87      !!------------------------------------------------------------------
88      !! * Local variables
89      INTEGER ::   ji             ! spatial loop index
90      INTEGER ::   ii, ij         ! temporary dummy loop index
91      INTEGER ::   numeq          ! current reference number of equation
92      INTEGER ::   jk             ! vertical dummy loop index
93      INTEGER ::   minnumeqmin, maxnumeqmax
94      INTEGER ::   iconv          ! number of iterations in iterative procedure
95      INTEGER ::   iconv_max = 50 ! max number of iterations in iterative procedure
96     
97      INTEGER, POINTER, DIMENSION(:) ::   numeqmin   ! reference number of top equation
98      INTEGER, POINTER, DIMENSION(:) ::   numeqmax   ! reference number of bottom equation
99     
100      REAL(wp) ::   zg1s      =  2._wp        ! for the tridiagonal system
101      REAL(wp) ::   zg1       =  2._wp        !
102      REAL(wp) ::   zgamma    =  18009._wp    ! for specific heat
103      REAL(wp) ::   zbeta     =  0.117_wp     ! for thermal conductivity (could be 0.13)
104      REAL(wp) ::   zraext_s  =  10._wp       ! extinction coefficient of radiation in the snow
105      REAL(wp) ::   zkimin    =  0.10_wp      ! minimum ice thermal conductivity
106      REAL(wp) ::   ztsu_err  =  1.e-5_wp     ! range around which t_su is considered at 0C
107      REAL(wp) ::   ztmelt_i                  ! ice melting temperature
108      REAL(wp) ::   zhsu
109      REAL(wp) ::   zdti_max                  ! current maximal error on temperature
110      REAL(wp) ::   zdti_bnd = 1.e-4_wp       ! maximal authorized error on temperature
111     
112      REAL(wp), POINTER, DIMENSION(:)     ::   isnow       ! switch for presence (1) or absence (0) of snow
113      REAL(wp), POINTER, DIMENSION(:)     ::   ztsub       ! old surface temperature (before the iterative procedure )
114      REAL(wp), POINTER, DIMENSION(:)     ::   ztsubit     ! surface temperature at previous iteration
115      REAL(wp), POINTER, DIMENSION(:)     ::   zh_i        ! ice layer thickness
116      REAL(wp), POINTER, DIMENSION(:)     ::   zh_s        ! snow layer thickness
117      REAL(wp), POINTER, DIMENSION(:)     ::   zfsw        ! solar radiation absorbed at the surface
118      REAL(wp), POINTER, DIMENSION(:)     ::   zqns_ice_b  ! solar radiation absorbed at the surface
119      REAL(wp), POINTER, DIMENSION(:)     ::   zf          ! surface flux function
120      REAL(wp), POINTER, DIMENSION(:)     ::   dzf         ! derivative of the surface flux function
121      REAL(wp), POINTER, DIMENSION(:)     ::   zdti        ! current error on temperature
122      REAL(wp), POINTER, DIMENSION(:)     ::   zdifcase    ! case of the equation resolution (1->4)
123      REAL(wp), POINTER, DIMENSION(:)     ::   zftrice     ! solar radiation transmitted through the ice
124      REAL(wp), POINTER, DIMENSION(:)     ::   zihic
125     
126      REAL(wp), POINTER, DIMENSION(:,:)   ::   ztcond_i    ! Ice thermal conductivity
127      REAL(wp), POINTER, DIMENSION(:,:)   ::   zradtr_i    ! Radiation transmitted through the ice
128      REAL(wp), POINTER, DIMENSION(:,:)   ::   zradab_i    ! Radiation absorbed in the ice
129      REAL(wp), POINTER, DIMENSION(:,:)   ::   zkappa_i    ! Kappa factor in the ice
130      REAL(wp), POINTER, DIMENSION(:,:)   ::   ztib        ! Old temperature in the ice
131      REAL(wp), POINTER, DIMENSION(:,:)   ::   zeta_i      ! Eta factor in the ice
132      REAL(wp), POINTER, DIMENSION(:,:)   ::   ztitemp     ! Temporary temperature in the ice to check the convergence
133      REAL(wp), POINTER, DIMENSION(:,:)   ::   zspeche_i   ! Ice specific heat
134      REAL(wp), POINTER, DIMENSION(:,:)   ::   z_i         ! Vertical cotes of the layers in the ice
135      REAL(wp), POINTER, DIMENSION(:,:)   ::   zradtr_s    ! Radiation transmited through the snow
136      REAL(wp), POINTER, DIMENSION(:,:)   ::   zradab_s    ! Radiation absorbed in the snow
137      REAL(wp), POINTER, DIMENSION(:,:)   ::   zkappa_s    ! Kappa factor in the snow
138      REAL(wp), POINTER, DIMENSION(:,:)   ::   zeta_s      ! Eta factor in the snow
139      REAL(wp), POINTER, DIMENSION(:,:)   ::   ztstemp     ! Temporary temperature in the snow to check the convergence
140      REAL(wp), POINTER, DIMENSION(:,:)   ::   ztsb        ! Temporary temperature in the snow
141      REAL(wp), POINTER, DIMENSION(:,:)   ::   z_s         ! Vertical cotes of the layers in the snow
142      REAL(wp), POINTER, DIMENSION(:,:)   ::   zindterm    ! 'Ind'ependent term
143      REAL(wp), POINTER, DIMENSION(:,:)   ::   zindtbis    ! Temporary 'ind'ependent term
144      REAL(wp), POINTER, DIMENSION(:,:)   ::   zdiagbis    ! Temporary 'dia'gonal term
145      REAL(wp), POINTER, DIMENSION(:,:,:) ::   ztrid       ! Tridiagonal system terms
146     
147      ! diag errors on heat
148      REAL(wp), POINTER, DIMENSION(:)     :: zdq, zq_ini, zhfx_err
149     
150      ! Mono-category
151      REAL(wp)                            :: zepsilon      ! determines thres. above which computation of G(h) is done
152      REAL(wp)                            :: zratio_s      ! dummy factor
153      REAL(wp)                            :: zratio_i      ! dummy factor
154      REAL(wp)                            :: zh_thres      ! thickness thres. for G(h) computation
155      REAL(wp)                            :: zhe           ! dummy factor
156      REAL(wp)                            :: zkimean       ! mean sea ice thermal conductivity
157      REAL(wp)                            :: zfac          ! dummy factor
158      REAL(wp)                            :: zihe          ! dummy factor
159      REAL(wp)                            :: zheshth       ! dummy factor
160     
161      REAL(wp), POINTER, DIMENSION(:)     :: zghe          ! G(he), th. conduct enhancement factor, mono-cat
162     
163      !!------------------------------------------------------------------     
164      !
165      CALL wrk_alloc( jpij, numeqmin, numeqmax )
166      CALL wrk_alloc( jpij, isnow, ztsub, ztsubit, zh_i, zh_s, zfsw )
167      CALL wrk_alloc( jpij, zf, dzf, zqns_ice_b, zdti, zdifcase, zftrice, zihic, zghe )
168      CALL wrk_alloc( jpij,nlay_i+1, ztcond_i, zradtr_i, zradab_i, zkappa_i, ztib, zeta_i, ztitemp, z_i, zspeche_i, kjstart=0 )
169      CALL wrk_alloc( jpij,nlay_s+1,           zradtr_s, zradab_s, zkappa_s, ztsb, zeta_s, ztstemp, z_s, kjstart=0 )
170      CALL wrk_alloc( jpij,nlay_i+3, zindterm, zindtbis, zdiagbis  )
171      CALL wrk_alloc( jpij,nlay_i+3,3, ztrid )
172
173      CALL wrk_alloc( jpij, zdq, zq_ini, zhfx_err )
174
175      ! --- diag error on heat diffusion - PART 1 --- !
176      zdq(:) = 0._wp ; zq_ini(:) = 0._wp     
177      DO ji = 1, nidx
178         zq_ini(ji) = ( SUM( e_i_1d(ji,1:nlay_i) ) * ht_i_1d(ji) * r1_nlay_i +  &
179            &           SUM( e_s_1d(ji,1:nlay_s) ) * ht_s_1d(ji) * r1_nlay_s ) 
180      END DO
181
182      !------------------------------------------------------------------------------!
183      ! 1) Initialization                                                            !
184      !------------------------------------------------------------------------------!
185      DO ji = 1 , nidx
186         isnow(ji)= 1._wp - MAX( 0._wp , SIGN(1._wp, - ht_s_1d(ji) ) )  ! is there snow or not
187         ! layer thickness
188         zh_i(ji) = ht_i_1d(ji) * r1_nlay_i
189         zh_s(ji) = ht_s_1d(ji) * r1_nlay_s
190      END DO
191
192      !--------------------
193      ! Ice / snow layers
194      !--------------------
195
196      z_s(:,0) = 0._wp   ! vert. coord. of the up. lim. of the 1st snow layer
197      z_i(:,0) = 0._wp   ! vert. coord. of the up. lim. of the 1st ice layer
198
199      DO jk = 1, nlay_s            ! vert. coord of the up. lim. of the layer-th snow layer
200         DO ji = 1 , nidx
201            z_s(ji,jk) = z_s(ji,jk-1) + ht_s_1d(ji) * r1_nlay_s
202         END DO
203      END DO
204
205      DO jk = 1, nlay_i            ! vert. coord of the up. lim. of the layer-th ice layer
206         DO ji = 1 , nidx
207            z_i(ji,jk) = z_i(ji,jk-1) + ht_i_1d(ji) * r1_nlay_i
208         END DO
209      END DO
210      !
211      !------------------------------------------------------------------------------|
212      ! 2) Radiation                                                       |
213      !------------------------------------------------------------------------------|
214      !
215      !-------------------
216      ! Computation of i0
217      !-------------------
218      ! i0 describes the fraction of solar radiation which does not contribute
219      ! to the surface energy budget but rather penetrates inside the ice.
220      ! We assume that no radiation is transmitted through the snow
221      ! If there is no no snow
222      ! zfsw    = (1-i0).qsr_ice   is absorbed at the surface
223      ! zftrice = io.qsr_ice       is below the surface
224      ! ftr_ice = io.qsr_ice.exp(-k(h_i)) transmitted below the ice
225      ! fr1_i0_1d = i0 for a thin ice cover, fr1_i0_2d = i0 for a thick ice cover
226      zhsu = 0.1_wp ! threshold for the computation of i0
227      DO ji = 1 , nidx
228         ! switches
229         isnow(ji) = 1._wp - MAX( 0._wp , SIGN( 1._wp , - ht_s_1d(ji) ) ) 
230         ! hs > 0, isnow = 1
231         zihic(ji) = MAX( 0._wp , 1._wp - ( ht_i_1d(ji) / zhsu ) )     
232
233         i0(ji)    = ( 1._wp - isnow(ji) ) * ( fr1_i0_1d(ji) + zihic(ji) * fr2_i0_1d(ji) )
234      END DO
235
236      !-------------------------------------------------------
237      ! Solar radiation absorbed / transmitted at the surface
238      ! Derivative of the non solar flux
239      !-------------------------------------------------------
240      DO ji = 1 , nidx
241         zfsw   (ji)    =  qsr_ice_1d(ji) * ( 1 - i0(ji) )   ! Shortwave radiation absorbed at surface
242         zftrice(ji)    =  qsr_ice_1d(ji) *       i0(ji)     ! Solar radiation transmitted below the surface layer
243         dzf    (ji)    = dqns_ice_1d(ji)                    ! derivative of incoming nonsolar flux
244         zqns_ice_b(ji) = qns_ice_1d(ji)                     ! store previous qns_ice_1d value
245      END DO
246
247      !---------------------------------------------------------
248      ! Transmission - absorption of solar radiation in the ice
249      !---------------------------------------------------------
250
251      DO ji = 1, nidx           ! snow initialization
252         zradtr_s(ji,0) = zftrice(ji)     ! radiation penetrating through snow
253      END DO
254
255      DO jk = 1, nlay_s          ! Radiation through snow
256         DO ji = 1, nidx
257            !                             ! radiation transmitted below the layer-th snow layer
258            zradtr_s(ji,jk) = zradtr_s(ji,0) * EXP( - zraext_s * ( MAX ( 0._wp , z_s(ji,jk) ) ) )
259            !                             ! radiation absorbed by the layer-th snow layer
260            zradab_s(ji,jk) = zradtr_s(ji,jk-1) - zradtr_s(ji,jk)
261         END DO
262      END DO
263
264      DO ji = 1, nidx           ! ice initialization
265         zradtr_i(ji,0) = zradtr_s(ji,nlay_s) * isnow(ji) + zftrice(ji) * ( 1._wp - isnow(ji) )
266      END DO
267
268      DO jk = 1, nlay_i          ! Radiation through ice
269         DO ji = 1, nidx
270            !                             ! radiation transmitted below the layer-th ice layer
271            zradtr_i(ji,jk) = zradtr_i(ji,0) * EXP( - rn_kappa_i * ( MAX ( 0._wp , z_i(ji,jk) ) ) )
272            !                             ! radiation absorbed by the layer-th ice layer
273            zradab_i(ji,jk) = zradtr_i(ji,jk-1) - zradtr_i(ji,jk)
274         END DO
275      END DO
276
277      DO ji = 1, nidx           ! Radiation transmitted below the ice
278         ftr_ice_1d(ji) = zradtr_i(ji,nlay_i) 
279      END DO
280
281      !------------------------------------------------------------------------------|
282      !  3) Iterative procedure begins                                               |
283      !------------------------------------------------------------------------------|
284      !
285      DO ji = 1, nidx        ! Old surface temperature
286         ztsub  (ji) =  t_su_1d(ji)                              ! temperature at the beg of iter pr.
287         ztsubit(ji) =  t_su_1d(ji)                              ! temperature at the previous iter
288         t_su_1d(ji) =  MIN( t_su_1d(ji), rt0 - ztsu_err )       ! necessary
289         zdti   (ji) =  1000._wp                                 ! initial value of error
290      END DO
291
292      DO jk = 1, nlay_s       ! Old snow temperature
293         DO ji = 1 , nidx
294            ztsb(ji,jk) =  t_s_1d(ji,jk)
295         END DO
296      END DO
297
298      DO jk = 1, nlay_i       ! Old ice temperature
299         DO ji = 1 , nidx
300            ztib(ji,jk) =  t_i_1d(ji,jk)
301         END DO
302      END DO
303
304      iconv    =  0           ! number of iterations
305      zdti_max =  1000._wp    ! maximal value of error on all points
306
307      DO WHILE ( zdti_max > zdti_bnd .AND. iconv < iconv_max )
308         !
309         iconv = iconv + 1
310         !
311         !------------------------------------------------------------------------------|
312         ! 4) Sea ice thermal conductivity                                              |
313         !------------------------------------------------------------------------------|
314         !
315         IF( nn_ice_thcon == 0 ) THEN      ! Untersteiner (1964) formula
316            DO ji = 1 , nidx
317               ztcond_i(ji,0) = rcdic + zbeta * s_i_1d(ji,1) / MIN( -epsi10, t_i_1d(ji,1) - rt0 )
318               ztcond_i(ji,0) = MAX( ztcond_i(ji,0), zkimin )
319            END DO
320            DO jk = 1, nlay_i-1
321               DO ji = 1 , nidx
322                  ztcond_i(ji,jk) = rcdic + zbeta * ( s_i_1d(ji,jk) + s_i_1d(ji,jk+1) ) /  &
323                     MIN(-2.0_wp * epsi10, t_i_1d(ji,jk) + t_i_1d(ji,jk+1) - 2.0_wp * rt0)
324                  ztcond_i(ji,jk) = MAX( ztcond_i(ji,jk), zkimin )
325               END DO
326            END DO
327         ENDIF
328
329         IF( nn_ice_thcon == 1 ) THEN      ! Pringle et al formula included: 2.11 + 0.09 S/T - 0.011.T
330            DO ji = 1 , nidx
331               ztcond_i(ji,0) = rcdic + 0.090_wp * s_i_1d(ji,1) / MIN( -epsi10, t_i_1d(ji,1) - rt0 )   &
332                  &                   - 0.011_wp * ( t_i_1d(ji,1) - rt0 ) 
333               ztcond_i(ji,0) = MAX( ztcond_i(ji,0), zkimin )
334            END DO
335            DO jk = 1, nlay_i-1
336               DO ji = 1 , nidx
337                  ztcond_i(ji,jk) = rcdic +                                                                       & 
338                     &                 0.09_wp * ( s_i_1d(ji,jk) + s_i_1d(ji,jk+1) )                              &
339                     &                 / MIN( -2._wp * epsi10, t_i_1d(ji,jk) + t_i_1d(ji,jk+1) - 2.0_wp * rt0 )   &
340                     &               - 0.0055_wp * ( t_i_1d(ji,jk) + t_i_1d(ji,jk+1) - 2.0 * rt0 ) 
341                  ztcond_i(ji,jk) = MAX( ztcond_i(ji,jk), zkimin )
342               END DO
343            END DO
344            DO ji = 1 , nidx
345               ztcond_i(ji,nlay_i) = rcdic + 0.090_wp * s_i_1d(ji,nlay_i) / MIN( -epsi10, t_bo_1d(ji) - rt0 )   &
346                  &                        - 0.011_wp * ( t_bo_1d(ji) - rt0 ) 
347               ztcond_i(ji,nlay_i) = MAX( ztcond_i(ji,nlay_i), zkimin )
348            END DO
349         ENDIF
350         
351         !
352         !------------------------------------------------------------------------------|
353         !  5) G(he) - enhancement of thermal conductivity in mono-category case        |
354         !------------------------------------------------------------------------------|
355         !
356         ! Computation of effective thermal conductivity G(h)
357         ! Used in mono-category case only to simulate an ITD implicitly
358         ! Fichefet and Morales Maqueda, JGR 1997
359
360         zghe(:) = 1._wp
361
362         SELECT CASE ( nn_monocat )
363
364         CASE (1,3) ! LIM3
365
366            zepsilon = 0.1_wp
367            zh_thres = EXP( 1._wp ) * zepsilon * 0.5_wp
368
369            DO ji = 1, nidx
370   
371               ! Mean sea ice thermal conductivity
372               zkimean  = SUM( ztcond_i(ji,0:nlay_i) ) / REAL( nlay_i+1, wp )
373
374               ! Effective thickness he (zhe)
375               zfac     = 1._wp / ( rn_cdsn + zkimean )
376               zratio_s = rn_cdsn   * zfac
377               zratio_i = zkimean * zfac
378               zhe      = zratio_s * ht_i_1d(ji) + zratio_i * ht_s_1d(ji)
379
380               ! G(he)
381               rswitch  = MAX( 0._wp , SIGN( 1._wp , zhe - zh_thres ) )  ! =0 if zhe < zh_thres, if >
382               zghe(ji) = ( 1._wp - rswitch ) + rswitch * 0.5_wp * ( 1._wp + LOG( 2._wp * zhe / zepsilon ) )
383   
384               ! Impose G(he) < 2.
385               zghe(ji) = MIN( zghe(ji), 2._wp )
386
387            END DO
388
389         END SELECT
390
391         !
392         !------------------------------------------------------------------------------|
393         !  6) kappa factors                                                            |
394         !------------------------------------------------------------------------------|
395         !
396         !--- Snow
397         DO ji = 1, nidx
398            zfac                  =  1. / MAX( epsi10 , zh_s(ji) )
399            zkappa_s(ji,0)        = zghe(ji) * rn_cdsn * zfac
400            zkappa_s(ji,nlay_s)   = zghe(ji) * rn_cdsn * zfac
401         END DO
402
403         DO jk = 1, nlay_s-1
404            DO ji = 1 , nidx
405               zkappa_s(ji,jk)    = zghe(ji) * 2.0 * rn_cdsn / MAX( epsi10, 2.0 * zh_s(ji) )
406            END DO
407         END DO
408
409         !--- Ice
410         DO jk = 1, nlay_i-1
411            DO ji = 1 , nidx
412               zkappa_i(ji,jk)    = zghe(ji) * 2.0 * ztcond_i(ji,jk) / MAX( epsi10 , 2.0 * zh_i(ji) )
413            END DO
414         END DO
415
416         !--- Snow-ice interface
417         DO ji = 1 , nidx
418            zfac                  = 1./ MAX( epsi10 , zh_i(ji) )
419            zkappa_i(ji,0)        = zghe(ji) * ztcond_i(ji,0) * zfac
420            zkappa_i(ji,nlay_i)   = zghe(ji) * ztcond_i(ji,nlay_i) * zfac
421            zkappa_s(ji,nlay_s)   = zghe(ji) * zghe(ji) * 2.0 * rn_cdsn * ztcond_i(ji,0) / & 
422           &                        MAX( epsi10, ( zghe(ji) * ztcond_i(ji,0) * zh_s(ji) + zghe(ji) * rn_cdsn * zh_i(ji) ) )
423            zkappa_i(ji,0)        = zkappa_s(ji,nlay_s) * isnow(ji) + zkappa_i(ji,0) * ( 1._wp - isnow(ji) )
424         END DO
425
426         !
427         !------------------------------------------------------------------------------|
428         ! 7) Sea ice specific heat, eta factors                                        |
429         !------------------------------------------------------------------------------|
430         !
431         DO jk = 1, nlay_i
432            DO ji = 1 , nidx
433               ztitemp(ji,jk)   = t_i_1d(ji,jk)
434               zspeche_i(ji,jk) = cpic + zgamma * s_i_1d(ji,jk) / MAX( ( t_i_1d(ji,jk) - rt0 ) * ( ztib(ji,jk) - rt0 ), epsi10 )
435               zeta_i(ji,jk)    = rdt_ice / MAX( rhoic * zspeche_i(ji,jk) * zh_i(ji), epsi10 )
436            END DO
437         END DO
438
439         DO jk = 1, nlay_s
440            DO ji = 1 , nidx
441               ztstemp(ji,jk) = t_s_1d(ji,jk)
442               zeta_s(ji,jk)  = rdt_ice / MAX( rhosn * cpic * zh_s(ji), epsi10 )
443            END DO
444         END DO
445
446         !
447         !------------------------------------------------------------------------------|
448         ! 8) surface flux computation                                                  |
449         !------------------------------------------------------------------------------|
450         !
451         IF ( ln_dqnsice ) THEN
452            DO ji = 1 , nidx
453               ! update of the non solar flux according to the update in T_su
454               qns_ice_1d(ji) = qns_ice_1d(ji) + dqns_ice_1d(ji) * ( t_su_1d(ji) - ztsubit(ji) )
455            END DO
456         ENDIF
457
458         ! Update incoming flux
459         DO ji = 1 , nidx
460            ! update incoming flux
461            zf(ji)    =          zfsw(ji)              & ! net absorbed solar radiation
462               &         + qns_ice_1d(ji)                ! non solar total flux (LWup, LWdw, SH, LH)
463         END DO
464
465         !
466         !------------------------------------------------------------------------------|
467         ! 9) tridiagonal system terms                                                  |
468         !------------------------------------------------------------------------------|
469         !
470         !!layer denotes the number of the layer in the snow or in the ice
471         !!numeq denotes the reference number of the equation in the tridiagonal
472         !!system, terms of tridiagonal system are indexed as following :
473         !!1 is subdiagonal term, 2 is diagonal and 3 is superdiagonal one
474
475         !!ice interior terms (top equation has the same form as the others)
476
477         DO numeq=1,nlay_i+3
478            DO ji = 1 , nidx
479               ztrid(ji,numeq,1) = 0.
480               ztrid(ji,numeq,2) = 0.
481               ztrid(ji,numeq,3) = 0.
482               zindterm(ji,numeq)= 0.
483               zindtbis(ji,numeq)= 0.
484               zdiagbis(ji,numeq)= 0.
485            ENDDO
486         ENDDO
487
488         DO numeq = nlay_s + 2, nlay_s + nlay_i 
489            DO ji = 1 , nidx
490               jk                 = numeq - nlay_s - 1
491               ztrid(ji,numeq,1)  =  - zeta_i(ji,jk) * zkappa_i(ji,jk-1)
492               ztrid(ji,numeq,2)  =  1.0 + zeta_i(ji,jk) * ( zkappa_i(ji,jk-1) + zkappa_i(ji,jk) )
493               ztrid(ji,numeq,3)  =  - zeta_i(ji,jk) * zkappa_i(ji,jk)
494               zindterm(ji,numeq) =  ztib(ji,jk) + zeta_i(ji,jk) * zradab_i(ji,jk)
495            END DO
496         ENDDO
497
498         numeq =  nlay_s + nlay_i + 1
499         DO ji = 1 , nidx
500            !!ice bottom term
501            ztrid(ji,numeq,1)  =  - zeta_i(ji,nlay_i)*zkappa_i(ji,nlay_i-1)   
502            ztrid(ji,numeq,2)  =  1.0 + zeta_i(ji,nlay_i) * ( zkappa_i(ji,nlay_i) * zg1 + zkappa_i(ji,nlay_i-1) )
503            ztrid(ji,numeq,3)  =  0.0
504            zindterm(ji,numeq) =  ztib(ji,nlay_i) + zeta_i(ji,nlay_i) *  &
505               &                  ( zradab_i(ji,nlay_i) + zkappa_i(ji,nlay_i) * zg1 *  t_bo_1d(ji) ) 
506         ENDDO
507
508
509         DO ji = 1 , nidx
510            IF ( ht_s_1d(ji) > 0.0 ) THEN
511               !
512               !------------------------------------------------------------------------------|
513               !  snow-covered cells                                                          |
514               !------------------------------------------------------------------------------|
515               !
516               !!snow interior terms (bottom equation has the same form as the others)
517               DO numeq = 3, nlay_s + 1
518                  jk                  =  numeq - 1
519                  ztrid(ji,numeq,1)   =  - zeta_s(ji,jk) * zkappa_s(ji,jk-1)
520                  ztrid(ji,numeq,2)   =  1.0 + zeta_s(ji,jk) * ( zkappa_s(ji,jk-1) + zkappa_s(ji,jk) )
521                  ztrid(ji,numeq,3)   =  - zeta_s(ji,jk)*zkappa_s(ji,jk)
522                  zindterm(ji,numeq)  =  ztsb(ji,jk) + zeta_s(ji,jk) * zradab_s(ji,jk)
523               END DO
524
525               !!case of only one layer in the ice (ice equation is altered)
526               IF ( nlay_i.eq.1 ) THEN
527                  ztrid(ji,nlay_s+2,3)    =  0.0
528                  zindterm(ji,nlay_s+2)   =  zindterm(ji,nlay_s+2) + zkappa_i(ji,1) * t_bo_1d(ji) 
529               ENDIF
530
531               IF ( t_su_1d(ji) < rt0 ) THEN
532
533                  !------------------------------------------------------------------------------|
534                  !  case 1 : no surface melting - snow present                                  |
535                  !------------------------------------------------------------------------------|
536                  zdifcase(ji)    =  1.0
537                  numeqmin(ji)    =  1
538                  numeqmax(ji)    =  nlay_i + nlay_s + 1
539
540                  !!surface equation
541                  ztrid(ji,1,1)  = 0.0
542                  ztrid(ji,1,2)  = dzf(ji) - zg1s * zkappa_s(ji,0)
543                  ztrid(ji,1,3)  = zg1s * zkappa_s(ji,0)
544                  zindterm(ji,1) = dzf(ji) * t_su_1d(ji) - zf(ji)
545
546                  !!first layer of snow equation
547                  ztrid(ji,2,1)  =  - zkappa_s(ji,0) * zg1s * zeta_s(ji,1)
548                  ztrid(ji,2,2)  =  1.0 + zeta_s(ji,1) * ( zkappa_s(ji,1) + zkappa_s(ji,0) * zg1s )
549                  ztrid(ji,2,3)  =  - zeta_s(ji,1)* zkappa_s(ji,1)
550                  zindterm(ji,2) =  ztsb(ji,1) + zeta_s(ji,1) * zradab_s(ji,1)
551
552               ELSE 
553                  !
554                  !------------------------------------------------------------------------------|
555                  !  case 2 : surface is melting - snow present                                  |
556                  !------------------------------------------------------------------------------|
557                  !
558                  zdifcase(ji)    =  2.0
559                  numeqmin(ji)    =  2
560                  numeqmax(ji)    =  nlay_i + nlay_s + 1
561
562                  !!first layer of snow equation
563                  ztrid(ji,2,1)  =  0.0
564                  ztrid(ji,2,2)  =  1.0 + zeta_s(ji,1) * ( zkappa_s(ji,1) + zkappa_s(ji,0) * zg1s )
565                  ztrid(ji,2,3)  =  - zeta_s(ji,1)*zkappa_s(ji,1) 
566                  zindterm(ji,2) = ztsb(ji,1) + zeta_s(ji,1) *  &
567                     &             ( zradab_s(ji,1) + zkappa_s(ji,0) * zg1s * t_su_1d(ji) ) 
568               ENDIF
569            ELSE
570               !
571               !------------------------------------------------------------------------------|
572               !  cells without snow                                                          |
573               !------------------------------------------------------------------------------|
574               !
575               IF ( t_su_1d(ji) < rt0 ) THEN
576                  !
577                  !------------------------------------------------------------------------------|
578                  !  case 3 : no surface melting - no snow                                       |
579                  !------------------------------------------------------------------------------|
580                  !
581                  zdifcase(ji)      =  3.0
582                  numeqmin(ji)      =  nlay_s + 1
583                  numeqmax(ji)      =  nlay_i + nlay_s + 1
584
585                  !!surface equation   
586                  ztrid(ji,numeqmin(ji),1)   =  0.0
587                  ztrid(ji,numeqmin(ji),2)   =  dzf(ji) - zkappa_i(ji,0)*zg1   
588                  ztrid(ji,numeqmin(ji),3)   =  zkappa_i(ji,0)*zg1
589                  zindterm(ji,numeqmin(ji))  =  dzf(ji)*t_su_1d(ji) - zf(ji)
590
591                  !!first layer of ice equation
592                  ztrid(ji,numeqmin(ji)+1,1) =  - zkappa_i(ji,0) * zg1 * zeta_i(ji,1)
593                  ztrid(ji,numeqmin(ji)+1,2) =  1.0 + zeta_i(ji,1) * ( zkappa_i(ji,1) + zkappa_i(ji,0) * zg1 )
594                  ztrid(ji,numeqmin(ji)+1,3) =  - zeta_i(ji,1) * zkappa_i(ji,1) 
595                  zindterm(ji,numeqmin(ji)+1)=  ztib(ji,1) + zeta_i(ji,1) * zradab_i(ji,1) 
596
597                  !!case of only one layer in the ice (surface & ice equations are altered)
598
599                  IF ( nlay_i == 1 ) THEN
600                     ztrid(ji,numeqmin(ji),1)    =  0.0
601                     ztrid(ji,numeqmin(ji),2)    =  dzf(ji) - zkappa_i(ji,0) * 2.0
602                     ztrid(ji,numeqmin(ji),3)    =  zkappa_i(ji,0) * 2.0
603                     ztrid(ji,numeqmin(ji)+1,1)  =  -zkappa_i(ji,0) * 2.0 * zeta_i(ji,1)
604                     ztrid(ji,numeqmin(ji)+1,2)  =  1.0 + zeta_i(ji,1) * ( zkappa_i(ji,0) * 2.0 + zkappa_i(ji,1) )
605                     ztrid(ji,numeqmin(ji)+1,3)  =  0.0
606
607                     zindterm(ji,numeqmin(ji)+1) =  ztib(ji,1) + zeta_i(ji,1) *  &
608                        &                          ( zradab_i(ji,1) + zkappa_i(ji,1) * t_bo_1d(ji) )
609                  ENDIF
610
611               ELSE
612
613                  !
614                  !------------------------------------------------------------------------------|
615                  ! case 4 : surface is melting - no snow                                        |
616                  !------------------------------------------------------------------------------|
617                  !
618                  zdifcase(ji)    =  4.0
619                  numeqmin(ji)    =  nlay_s + 2
620                  numeqmax(ji)    =  nlay_i + nlay_s + 1
621
622                  !!first layer of ice equation
623                  ztrid(ji,numeqmin(ji),1)      =  0.0
624                  ztrid(ji,numeqmin(ji),2)      =  1.0 + zeta_i(ji,1) * ( zkappa_i(ji,1) + zkappa_i(ji,0) * zg1 ) 
625                  ztrid(ji,numeqmin(ji),3)      =  - zeta_i(ji,1) * zkappa_i(ji,1)
626                  zindterm(ji,numeqmin(ji))     =  ztib(ji,1) + zeta_i(ji,1) *  &
627                     &                             ( zradab_i(ji,1) + zkappa_i(ji,0) * zg1 * t_su_1d(ji) ) 
628
629                  !!case of only one layer in the ice (surface & ice equations are altered)
630                  IF ( nlay_i == 1 ) THEN
631                     ztrid(ji,numeqmin(ji),1)  =  0.0
632                     ztrid(ji,numeqmin(ji),2)  =  1.0 + zeta_i(ji,1) * ( zkappa_i(ji,0) * 2.0 + zkappa_i(ji,1) )
633                     ztrid(ji,numeqmin(ji),3)  =  0.0
634                     zindterm(ji,numeqmin(ji)) =  ztib(ji,1) + zeta_i(ji,1) * ( zradab_i(ji,1) + zkappa_i(ji,1) * t_bo_1d(ji) )  &
635                        &                       + t_su_1d(ji) * zeta_i(ji,1) * zkappa_i(ji,0) * 2.0
636                  ENDIF
637
638               ENDIF
639            ENDIF
640
641         END DO
642
643         !
644         !------------------------------------------------------------------------------|
645         ! 10) tridiagonal system solving                                               |
646         !------------------------------------------------------------------------------|
647         !
648
649         ! Solve the tridiagonal system with Gauss elimination method.
650         ! Thomas algorithm, from Computational fluid Dynamics, J.D. ANDERSON,
651         ! McGraw-Hill 1984. 
652
653         maxnumeqmax = 0
654         minnumeqmin = nlay_i+5
655
656         DO ji = 1 , nidx
657            zindtbis(ji,numeqmin(ji)) =  zindterm(ji,numeqmin(ji))
658            zdiagbis(ji,numeqmin(ji)) =  ztrid(ji,numeqmin(ji),2)
659            minnumeqmin               =  MIN(numeqmin(ji),minnumeqmin)
660            maxnumeqmax               =  MAX(numeqmax(ji),maxnumeqmax)
661         END DO
662
663         DO jk = minnumeqmin+1, maxnumeqmax
664            DO ji = 1 , nidx
665               numeq               =  min(max(numeqmin(ji)+1,jk),numeqmax(ji))
666               zdiagbis(ji,numeq)  =  ztrid(ji,numeq,2)  - ztrid(ji,numeq,1) * ztrid(ji,numeq-1,3)  / zdiagbis(ji,numeq-1)
667               zindtbis(ji,numeq)  =  zindterm(ji,numeq) - ztrid(ji,numeq,1) * zindtbis(ji,numeq-1) / zdiagbis(ji,numeq-1)
668            END DO
669         END DO
670
671         DO ji = 1 , nidx
672            ! ice temperatures
673            t_i_1d(ji,nlay_i)    =  zindtbis(ji,numeqmax(ji)) / zdiagbis(ji,numeqmax(ji))
674         END DO
675
676         DO numeq = nlay_i + nlay_s, nlay_s + 2, -1
677            DO ji = 1 , nidx
678               jk    =  numeq - nlay_s - 1
679               t_i_1d(ji,jk)  =  ( zindtbis(ji,numeq) - ztrid(ji,numeq,3) * t_i_1d(ji,jk+1) ) / zdiagbis(ji,numeq)
680            END DO
681         END DO
682
683         DO ji = 1 , nidx
684            ! snow temperatures     
685            IF (ht_s_1d(ji) > 0._wp) &
686               t_s_1d(ji,nlay_s)     =  ( zindtbis(ji,nlay_s+1) - ztrid(ji,nlay_s+1,3) * t_i_1d(ji,1) )  &
687               &                        / zdiagbis(ji,nlay_s+1) * MAX( 0.0, SIGN( 1.0, ht_s_1d(ji) ) ) 
688
689            ! surface temperature
690            isnow(ji)   = 1._wp - MAX( 0._wp , SIGN( 1._wp , -ht_s_1d(ji) ) )
691            ztsubit(ji) = t_su_1d(ji)
692            IF( t_su_1d(ji) < rt0 ) &
693               t_su_1d(ji) = ( zindtbis(ji,numeqmin(ji)) - ztrid(ji,numeqmin(ji),3) *  &
694               &             ( isnow(ji) * t_s_1d(ji,1) + ( 1._wp - isnow(ji) ) * t_i_1d(ji,1) ) ) / zdiagbis(ji,numeqmin(ji)) 
695         END DO
696         !
697         !--------------------------------------------------------------------------
698         !  11) Has the scheme converged ?, end of the iterative procedure         |
699         !--------------------------------------------------------------------------
700         !
701         ! check that nowhere it has started to melt
702         ! zdti(ji) is a measure of error, it has to be under zdti_bnd
703         DO ji = 1 , nidx
704            t_su_1d(ji) =  MAX(  MIN( t_su_1d(ji) , rt0 ) , 190._wp  )
705            zdti   (ji) =  ABS( t_su_1d(ji) - ztsubit(ji) )     
706         END DO
707
708         DO jk  =  1, nlay_s
709            DO ji = 1 , nidx
710               t_s_1d(ji,jk) = MAX(  MIN( t_s_1d(ji,jk), rt0 ), 190._wp  )
711               zdti  (ji)    = MAX( zdti(ji), ABS( t_s_1d(ji,jk) - ztstemp(ji,jk) ) )
712            END DO
713         END DO
714
715         DO jk  =  1, nlay_i
716            DO ji = 1 , nidx
717               ztmelt_i      = -tmut * s_i_1d(ji,jk) + rt0 
718               t_i_1d(ji,jk) =  MAX( MIN( t_i_1d(ji,jk), ztmelt_i ), 190._wp )
719               zdti  (ji)    =  MAX( zdti(ji), ABS( t_i_1d(ji,jk) - ztitemp(ji,jk) ) )
720            END DO
721         END DO
722
723         ! Compute spatial maximum over all errors
724         ! note that this could be optimized substantially by iterating only the non-converging points
725         zdti_max = 0._wp
726         DO ji = 1, nidx
727            zdti_max = MAX( zdti_max, zdti(ji) )   
728         END DO
729         IF( lk_mpp ) CALL mpp_max( zdti_max, kcom=ncomm_ice )
730
731      END DO  ! End of the do while iterative procedure
732
733      ! MV SIMIP 2016
734      !--- Snow-ice interfacial temperature (diagnostic SIMIP)
735      DO ji = 1, nidx
736         zfac        = 1. / MAX( epsi10 , rn_cdsn * zh_i(ji) + ztcond_i(ji,1) * zh_s(ji) )
737         t_si_1d(ji) = ( rn_cdsn        * zh_i(ji) * t_s_1d(ji,1) + &
738            &            ztcond_i(ji,1) * zh_s(ji) * t_i_1d(ji,1) ) * zfac
739      END DO
740      WHERE( ( zh_s < 1.0e-3 ) ) ; t_si_1d(:) = t_su_1d(:) ; END WHERE
741      ! END MV SIMIP 2016
742
743      IF( ln_limctl .AND. lwp ) THEN
744         WRITE(numout,*) ' zdti_max : ', zdti_max
745         WRITE(numout,*) ' iconv    : ', iconv
746      ENDIF
747
748      !
749      !-------------------------------------------------------------------------!
750      !   12) Fluxes at the interfaces                                          !
751      !-------------------------------------------------------------------------!
752      DO ji = 1, nidx
753         !                                ! surface ice conduction flux
754         isnow(ji)       = 1._wp - MAX( 0._wp, SIGN( 1._wp, -ht_s_1d(ji) ) )
755         fc_su(ji)       =  -           isnow(ji)   * zkappa_s(ji,0) * zg1s * (t_s_1d(ji,1) - t_su_1d(ji))   &
756            &               - ( 1._wp - isnow(ji) ) * zkappa_i(ji,0) * zg1  * (t_i_1d(ji,1) - t_su_1d(ji))
757         !                                ! bottom ice conduction flux
758         fc_bo_i(ji)     =  - zkappa_i(ji,nlay_i) * ( zg1*(t_bo_1d(ji) - t_i_1d(ji,nlay_i)) )
759      END DO
760
761      ! MV SIMIP 2016
762      !--- Conduction fluxes (positive downwards)
763      diag_fc_bo_1d(:)   = diag_fc_bo_1d(:) + fc_bo_i(:) * a_i_1d(:) / at_i_1d(:)
764      diag_fc_su_1d(:)   = diag_fc_su_1d(:) + fc_su(:)   * a_i_1d(:) / at_i_1d(:)
765      ! END MV SIMIP 2016
766
767      ! --- computes sea ice energy of melting compulsory for limthd_dh --- !
768      CALL lim_thd_enmelt
769
770      ! --- diagnose the change in non-solar flux due to surface temperature change --- !
771      IF ( ln_dqnsice ) THEN
772         DO ji = 1, nidx
773            hfx_err_dif_1d(ji) = hfx_err_dif_1d(ji) - ( qns_ice_1d(ji)  - zqns_ice_b(ji) ) * a_i_1d(ji) 
774         END DO
775      END IF
776
777      ! --- diag conservation imbalance on heat diffusion - PART 2 --- !
778      DO ji = 1, nidx
779         zdq(ji)        = - zq_ini(ji) + ( SUM( e_i_1d(ji,1:nlay_i) ) * ht_i_1d(ji) * r1_nlay_i +  &
780            &                              SUM( e_s_1d(ji,1:nlay_s) ) * ht_s_1d(ji) * r1_nlay_s )
781         IF( t_su_1d(ji) < rt0 ) THEN  ! case T_su < 0degC
782            zhfx_err(ji) = qns_ice_1d(ji) + qsr_ice_1d(ji) - zradtr_i(ji,nlay_i) - fc_bo_i(ji) + zdq(ji) * r1_rdtice 
783         ELSE                          ! case T_su = 0degC
784            zhfx_err(ji) = fc_su(ji) + i0(ji) * qsr_ice_1d(ji) - zradtr_i(ji,nlay_i) - fc_bo_i(ji) + zdq(ji) * r1_rdtice 
785         ENDIF
786         hfx_err_1d(ji) = hfx_err_1d(ji) + zhfx_err(ji) * a_i_1d(ji)
787
788         ! total heat that is sent to the ocean (i.e. not used in the heat diffusion equation)
789         hfx_err_dif_1d(ji) = hfx_err_dif_1d(ji) + zhfx_err(ji) * a_i_1d(ji)
790      END DO 
791
792      !-----------------------------------------
793      ! Heat flux used to warm/cool ice in W.m-2
794      !-----------------------------------------
795      DO ji = 1, nidx
796         IF( t_su_1d(ji) < rt0 ) THEN  ! case T_su < 0degC
797            hfx_dif_1d(ji) = hfx_dif_1d(ji)  +   &
798               &            ( qns_ice_1d(ji) + qsr_ice_1d(ji) - zradtr_i(ji,nlay_i) - fc_bo_i(ji) ) * a_i_1d(ji)
799         ELSE                          ! case T_su = 0degC
800            hfx_dif_1d(ji) = hfx_dif_1d(ji) +    &
801               &             ( fc_su(ji) + i0(ji) * qsr_ice_1d(ji) - zradtr_i(ji,nlay_i) - fc_bo_i(ji) ) * a_i_1d(ji)
802         ENDIF
803         ! correction on the diagnosed heat flux due to non-convergence of the algorithm used to solve heat equation
804         hfx_dif_1d(ji) = hfx_dif_1d(ji) - zhfx_err(ji) * a_i_1d(ji)
805      END DO   
806      !
807      CALL wrk_dealloc( jpij, numeqmin, numeqmax )
808      CALL wrk_dealloc( jpij, isnow, ztsub, ztsubit, zh_i, zh_s, zfsw )
809      CALL wrk_dealloc( jpij, zf, dzf, zqns_ice_b, zdti, zdifcase, zftrice, zihic, zghe )
810      CALL wrk_dealloc( jpij,nlay_i+1, ztcond_i, zradtr_i, zradab_i, zkappa_i, ztib, zeta_i, ztitemp, z_i, zspeche_i, kjstart = 0 )
811      CALL wrk_dealloc( jpij,nlay_s+1,           zradtr_s, zradab_s, zkappa_s, ztsb, zeta_s, ztstemp, z_s, kjstart = 0 )
812      CALL wrk_dealloc( jpij,nlay_i+3, zindterm, zindtbis, zdiagbis )
813      CALL wrk_dealloc( jpij,nlay_i+3,3, ztrid )
814      CALL wrk_dealloc( jpij, zdq, zq_ini, zhfx_err )
815
816   END SUBROUTINE lim_thd_dif
817
818   SUBROUTINE lim_thd_enmelt
819      !!-----------------------------------------------------------------------
820      !!                   ***  ROUTINE lim_thd_enmelt ***
821      !!                 
822      !! ** Purpose :   Computes sea ice energy of melting q_i (J.m-3) from temperature
823      !!
824      !! ** Method  :   Formula (Bitz and Lipscomb, 1999)
825      !!-------------------------------------------------------------------
826      INTEGER  ::   ji, jk   ! dummy loop indices
827      REAL(wp) ::   ztmelts  ! local scalar
828      !!-------------------------------------------------------------------
829      !
830      DO jk = 1, nlay_i             ! Sea ice energy of melting
831         DO ji = 1, nidx
832            ztmelts      = - tmut  * s_i_1d(ji,jk) + rt0
833            t_i_1d(ji,jk) = MIN( t_i_1d(ji,jk), ztmelts ) ! Force t_i_1d to be lower than melting point
834                                                          !   (sometimes dif scheme produces abnormally high temperatures)   
835            e_i_1d(ji,jk) = rhoic * ( cpic * ( ztmelts - t_i_1d(ji,jk) )                           &
836               &                    + lfus * ( 1.0 - ( ztmelts-rt0 ) / ( t_i_1d(ji,jk) - rt0 ) )   &
837               &                    - rcp  *         ( ztmelts-rt0 )  ) 
838         END DO
839      END DO
840      DO jk = 1, nlay_s             ! Snow energy of melting
841         DO ji = 1, nidx
842            e_s_1d(ji,jk) = rhosn * ( cpic * ( rt0 - t_s_1d(ji,jk) ) + lfus )
843         END DO
844      END DO
845      !
846   END SUBROUTINE lim_thd_enmelt
847
848#else
849   !!----------------------------------------------------------------------
850   !!                   Dummy Module                 No LIM-3 sea-ice model
851   !!----------------------------------------------------------------------
852CONTAINS
853   SUBROUTINE lim_thd_dif          ! Empty routine
854   END SUBROUTINE lim_thd_dif
855#endif
856   !!======================================================================
857END MODULE limthd_dif
Note: See TracBrowser for help on using the repository browser.