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

source: branches/2015/dev_r5044_CNRS_LIM3CLEAN/NEMOGCM/NEMO/LIM_SRC_3/limthd_dif.F90 @ 5070

Last change on this file since 5070 was 5070, checked in by clem, 9 years ago

LIM3 cosmetic changes

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