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.
icethd_zdf_bl99.F90 in NEMO/branches/2020/r4.0-HEAD_r12713_clem_dan_fixcpl/src/ICE – NEMO

source: NEMO/branches/2020/r4.0-HEAD_r12713_clem_dan_fixcpl/src/ICE/icethd_zdf_bl99.F90 @ 12915

Last change on this file since 12915 was 12915, checked in by clem, 4 years ago

implement a convergence check on heat diffusion scheme

  • Property svn:keywords set to Id
File size: 46.3 KB
Line 
1MODULE icethd_zdf_BL99
2   !!======================================================================
3   !!                       ***  MODULE icethd_zdf_BL99 ***
4   !!   sea-ice: vertical heat diffusion in sea ice (computation of temperatures)
5   !!======================================================================
6   !! History :       !  2003-02  (M. Vancoppenolle) original 1D code
7   !!                 !  2005-06  (M. Vancoppenolle) 3d version
8   !!            4.0  !  2018     (many people)      SI3 [aka Sea Ice cube]
9   !!----------------------------------------------------------------------
10#if defined key_si3
11   !!----------------------------------------------------------------------
12   !!   'key_si3'                                       SI3 sea-ice model
13   !!----------------------------------------------------------------------
14   !!  ice_thd_zdf_BL99 : vertical diffusion computation
15   !!----------------------------------------------------------------------
16   USE dom_oce        ! ocean space and time domain
17   USE phycst         ! physical constants (ocean directory)
18   USE ice            ! sea-ice: variables
19   USE ice1D          ! sea-ice: thermodynamics variables
20   USE icevar         ! sea-ice: operations
21   !
22   USE in_out_manager ! I/O manager
23   USE lib_mpp        ! MPP library
24   USE lib_fortran    ! fortran utilities (glob_sum + no signed zero)
25
26   IMPLICIT NONE
27   PRIVATE
28
29   PUBLIC   ice_thd_zdf_BL99   ! called by icethd_zdf
30
31   !!----------------------------------------------------------------------
32   !! NEMO/ICE 4.0 , NEMO Consortium (2018)
33   !! $Id$
34   !! Software governed by the CeCILL license (see ./LICENSE)
35   !!----------------------------------------------------------------------
36CONTAINS
37
38   SUBROUTINE ice_thd_zdf_BL99( k_cnd )
39      !!-------------------------------------------------------------------
40      !!                ***  ROUTINE ice_thd_zdf_BL99  ***
41      !!
42      !! ** Purpose : computes the time evolution of snow and sea-ice temperature
43      !!              profiles, using the original Bitz and Lipscomb (1999) algorithm
44      !!
45      !! ** Method  : solves the heat equation diffusion with a Neumann boundary
46      !!              condition at the surface and a Dirichlet one at the bottom.
47      !!              Solar radiation is partially absorbed into the ice.
48      !!              The specific heat and thermal conductivities depend on ice
49      !!              salinity and temperature to take into account brine pocket   
50      !!              melting. The numerical scheme is an iterative Crank-Nicolson
51      !!              on a non-uniform multilayer grid in the ice and snow system.
52      !!
53      !!           The successive steps of this routine are
54      !!           1.  initialization of ice-snow layers thicknesses
55      !!           2.  Internal absorbed and transmitted radiation
56      !!           Then iterative procedure begins
57      !!           3.  Thermal conductivity
58      !!           4.  Kappa factors
59      !!           5.  specific heat in the ice
60      !!           6.  eta factors
61      !!           7.  surface flux computation
62      !!           8.  tridiagonal system terms
63      !!           9.  solving the tridiagonal system with Gauss elimination
64      !!           Iterative procedure ends according to a criterion on evolution
65      !!           of temperature
66      !!           10. Fluxes at the interfaces
67      !!
68      !! ** Inputs / Ouputs : (global commons)
69      !!           surface temperature              : t_su_1d
70      !!           ice/snow temperatures            : t_i_1d, t_s_1d
71      !!           ice salinities                   : sz_i_1d
72      !!           number of layers in the ice/snow : nlay_i, nlay_s
73      !!           total ice/snow thickness         : h_i_1d, h_s_1d
74      !!-------------------------------------------------------------------
75      INTEGER, INTENT(in) ::   k_cnd     ! conduction flux (off, on, emulated)
76      !
77      INTEGER ::   ji, jk         ! spatial loop index
78      INTEGER ::   jm             ! current reference number of equation
79      INTEGER ::   jm_mint, jm_maxt
80      INTEGER ::   iconv          ! number of iterations in iterative procedure
81      INTEGER ::   iconv_max = 50 ! max number of iterations in iterative procedure
82      !
83      INTEGER, DIMENSION(jpij) ::   jm_min    ! reference number of top equation
84      INTEGER, DIMENSION(jpij) ::   jm_max    ! reference number of bottom equation
85
86      LOGICAL, DIMENSION(jpij) ::   l_T_converged   ! true when T converges (per grid point)
87      !
88      REAL(wp) ::   zg1s      =  2._wp        ! for the tridiagonal system
89      REAL(wp) ::   zg1       =  2._wp        !
90      REAL(wp) ::   zgamma    =  18009._wp    ! for specific heat
91      REAL(wp) ::   zbeta     =  0.117_wp     ! for thermal conductivity (could be 0.13)
92      REAL(wp) ::   zkimin    =  0.10_wp      ! minimum ice thermal conductivity
93      REAL(wp) ::   ztsu_err  =  1.e-5_wp     ! range around which t_su is considered at 0C
94      REAL(wp) ::   zdti_bnd  =  1.e-4_wp     ! maximal authorized error on temperature
95      REAL(wp) ::   zhs_ssl   =  0.03_wp      ! surface scattering layer in the snow
96      REAL(wp) ::   zhi_ssl   =  0.10_wp      ! surface scattering layer in the ice
97      REAL(wp) ::   ztmelts                   ! ice melting temperature
98      REAL(wp) ::   zdti_max                  ! current maximal error on temperature
99      REAL(wp) ::   zcpi                      ! Ice specific heat
100      REAL(wp) ::   zhfx_err, zdq             ! diag errors on heat
101      !
102      REAL(wp), DIMENSION(jpij) ::   zraext_s     ! extinction coefficient of radiation in the snow
103      REAL(wp), DIMENSION(jpij) ::   ztsub        ! surface temperature at previous iteration
104      REAL(wp), DIMENSION(jpij) ::   zh_i, z1_h_i ! ice layer thickness
105      REAL(wp), DIMENSION(jpij) ::   zh_s, z1_h_s ! snow layer thickness
106      REAL(wp), DIMENSION(jpij) ::   zqns_ice_b   ! solar radiation absorbed at the surface
107      REAL(wp), DIMENSION(jpij) ::   zfnet        ! surface flux function
108      REAL(wp), DIMENSION(jpij) ::   zdqns_ice_b  ! derivative of the surface flux function
109      !
110      REAL(wp), DIMENSION(jpij       )     ::   ztsuold     ! Old surface temperature in the ice
111      REAL(wp), DIMENSION(jpij,nlay_i)     ::   ztiold      ! Old temperature in the ice
112      REAL(wp), DIMENSION(jpij,nlay_s)     ::   ztsold      ! Old temperature in the snow
113      REAL(wp), DIMENSION(jpij,nlay_i)     ::   ztib        ! Temporary temperature in the ice to check the convergence
114      REAL(wp), DIMENSION(jpij,nlay_s)     ::   ztsb        ! Temporary temperature in the snow to check the convergence
115      REAL(wp), DIMENSION(jpij,0:nlay_i)   ::   ztcond_i    ! Ice thermal conductivity
116      REAL(wp), DIMENSION(jpij,0:nlay_i)   ::   ztcond_i_cp ! copy
117      REAL(wp), DIMENSION(jpij,0:nlay_i)   ::   zradtr_i    ! Radiation transmitted through the ice
118      REAL(wp), DIMENSION(jpij,0:nlay_i)   ::   zradab_i    ! Radiation absorbed in the ice
119      REAL(wp), DIMENSION(jpij,0:nlay_i)   ::   zkappa_i    ! Kappa factor in the ice
120      REAL(wp), DIMENSION(jpij,0:nlay_i)   ::   zeta_i      ! Eta factor in the ice
121      REAL(wp), DIMENSION(jpij,0:nlay_s)   ::   zradtr_s    ! Radiation transmited through the snow
122      REAL(wp), DIMENSION(jpij,0:nlay_s)   ::   zradab_s    ! Radiation absorbed in the snow
123      REAL(wp), DIMENSION(jpij,0:nlay_s)   ::   zkappa_s    ! Kappa factor in the snow
124      REAL(wp), DIMENSION(jpij,0:nlay_s)   ::   zeta_s      ! Eta factor in the snow
125      REAL(wp), DIMENSION(jpij,nlay_i+3)   ::   zindterm    ! 'Ind'ependent term
126      REAL(wp), DIMENSION(jpij,nlay_i+3)   ::   zindtbis    ! Temporary 'ind'ependent term
127      REAL(wp), DIMENSION(jpij,nlay_i+3)   ::   zdiagbis    ! Temporary 'dia'gonal term
128      REAL(wp), DIMENSION(jpij,nlay_i+3,3) ::   ztrid       ! Tridiagonal system terms
129      REAL(wp), DIMENSION(jpij)            ::   zq_ini      ! diag errors on heat
130      REAL(wp), DIMENSION(jpij)            ::   zghe        ! G(he), th. conduct enhancement factor, mono-cat
131      REAL(wp), DIMENSION(jpij)            ::   za_s_fra    ! ice fraction covered by snow
132      !
133      ! Mono-category
134      REAL(wp) ::   zepsilon   ! determines thres. above which computation of G(h) is done
135      REAL(wp) ::   zhe        ! dummy factor
136      REAL(wp) ::   zcnd_i     ! mean sea ice thermal conductivity
137      !!------------------------------------------------------------------     
138
139      ! --- diag error on heat diffusion - PART 1 --- !
140      DO ji = 1, npti
141         zq_ini(ji) = ( SUM( e_i_1d(ji,1:nlay_i) ) * h_i_1d(ji) * r1_nlay_i +  &
142            &           SUM( e_s_1d(ji,1:nlay_s) ) * h_s_1d(ji) * r1_nlay_s ) 
143      END DO
144
145      CALL ice_var_snwfra( h_s_1d(1:npti), za_s_fra(1:npti) )   ! calculate ice fraction covered by snow
146     
147      !------------------
148      ! 1) Initialization
149      !------------------
150      !
151      ! extinction radiation in the snow
152      IF    ( nn_qtrice == 0 ) THEN   ! constant
153         zraext_s(1:npti) = rn_kappa_s
154      ELSEIF( nn_qtrice == 1 ) THEN   ! depends on melting/freezing conditions
155         WHERE( t_su_1d(1:npti) < rt0 )   ;   zraext_s(1:npti) = rn_kappa_sdry   ! no surface melting
156         ELSEWHERE                        ;   zraext_s(1:npti) = rn_kappa_smlt   !    surface melting
157         END WHERE
158      ENDIF
159      !
160      ! layers thicknesses
161      DO ji = 1, npti
162         zh_s(ji) = MAX( zhs_ssl , h_s_1d(ji) ) * r1_nlay_s ! set a minimum snw thickness for conduction
163         zh_i(ji) = MAX( zhi_ssl , h_i_1d(ji) ) * r1_nlay_i ! set a minimum ice thickness for conduction
164      END DO
165      !
166      WHERE( h_i_1d(1:npti) >= zhi_ssl )   ;   z1_h_i(1:npti) = 1._wp / zh_i(1:npti)
167      ELSEWHERE                            ;   z1_h_i(1:npti) = 0._wp ! put 0 if ice thick < scattering layer
168      END WHERE
169      !
170      WHERE( h_s_1d(1:npti) >= zhs_ssl )   ;   z1_h_s(1:npti) = 1._wp / zh_s(1:npti)
171      ELSEWHERE                            ;   z1_h_s(1:npti) = 0._wp ! put 0 if snw thick < scattering layer
172      END WHERE
173      !
174      ! Store initial temperatures and non solar heat fluxes
175      IF( k_cnd == np_cnd_OFF .OR. k_cnd == np_cnd_EMU ) THEN
176         !
177         ztsub      (1:npti) = t_su_1d(1:npti)                          ! surface temperature at iteration n-1
178         ztsuold    (1:npti) = t_su_1d(1:npti)                          ! surface temperature initial value
179         t_su_1d    (1:npti) = MIN( t_su_1d(1:npti), rt0 - ztsu_err )   ! required to leave the choice between melting or not
180         zdqns_ice_b(1:npti) = dqns_ice_1d(1:npti)                      ! derivative of incoming nonsolar flux
181         zqns_ice_b (1:npti) = qns_ice_1d(1:npti)                       ! store previous qns_ice_1d value
182         !
183      ENDIF
184      !
185      ztsold (1:npti,:) = t_s_1d(1:npti,:)   ! Old snow temperature
186      ztiold (1:npti,:) = t_i_1d(1:npti,:)   ! Old ice temperature
187
188      !-------------
189      ! 2) Radiation
190      !-------------
191      ! --- Transmission/absorption of solar radiation in the ice --- !
192      zradtr_s(1:npti,0) = qtr_ice_top_1d(1:npti)
193      DO jk = 1, nlay_s
194         DO ji = 1, npti
195            !                             ! radiation transmitted below the layer-th snow layer
196            zradtr_s(ji,jk) = zradtr_s(ji,0) * EXP( - zraext_s(ji) * MAX( 0._wp, zh_s(ji) * REAL(jk) - zhs_ssl ) )
197            !                             ! radiation absorbed by the layer-th snow layer
198            zradab_s(ji,jk) = zradtr_s(ji,jk-1) - zradtr_s(ji,jk)
199         END DO
200      END DO
201      !
202      zradtr_i(1:npti,0) = zradtr_s(1:npti,nlay_s) * za_s_fra(1:npti) + qtr_ice_top_1d(1:npti) * (1._wp - za_s_fra(1:npti))
203      DO jk = 1, nlay_i 
204         DO ji = 1, npti
205            !                             ! radiation transmitted below the layer-th ice layer
206            zradtr_i(ji,jk) =           za_s_fra(ji)   * zradtr_s(ji,nlay_s)                       &   ! part covered by snow
207               &                                       * EXP( - rn_kappa_i * zh_i(ji) * REAL(jk) ) &
208               &            + ( 1._wp - za_s_fra(ji) ) * qtr_ice_top_1d(ji)                        &   ! part snow free
209               &                                       * EXP( - rn_kappa_i * MAX( 0._wp, zh_i(ji) * REAL(jk) - zhi_ssl ) )
210           
211            zradtr_i(ji,jk) = zradtr_i(ji,0) * EXP( - rn_kappa_i * MAX( 0._wp, zh_i(ji) * REAL(jk) - zhi_ssl ) )
212            !                             ! radiation absorbed by the layer-th ice layer
213            zradab_i(ji,jk) = zradtr_i(ji,jk-1) - zradtr_i(ji,jk)
214         END DO
215      END DO
216      !
217      qtr_ice_bot_1d(1:npti) = zradtr_i(1:npti,nlay_i)   ! record radiation transmitted below the ice
218      !
219      iconv = 0          ! number of iterations
220      !
221      l_T_converged(:) = .FALSE.
222      ! Convergence calculated until all sub-domain grid points have converged
223      ! Calculations keep going for all grid points until sub-domain convergence (vectorisation optimisation)
224      ! but values are not taken into account (results independant of MPI partitioning)
225      !
226      !                                                                            !============================!
227      DO WHILE ( ( .NOT. ALL (l_T_converged(1:npti)) ) .AND. iconv < iconv_max )   ! Iterative procedure begins !
228         !                                                                         !============================!
229         iconv = iconv + 1
230         !
231         ztib(1:npti,:) = t_i_1d(1:npti,:)
232         ztsb(1:npti,:) = t_s_1d(1:npti,:)
233         !
234         !--------------------------------
235         ! 3) Sea ice thermal conductivity
236         !--------------------------------
237         IF( ln_cndi_U64 ) THEN         !-- Untersteiner (1964) formula: k = k0 + beta.S/T
238            !
239            DO ji = 1, npti
240               ztcond_i_cp(ji,0)      = rcnd_i + zbeta * sz_i_1d(ji,1)      / MIN( -epsi10, t_i_1d(ji,1) - rt0 )
241               ztcond_i_cp(ji,nlay_i) = rcnd_i + zbeta * sz_i_1d(ji,nlay_i) / MIN( -epsi10, t_bo_1d(ji)  - rt0 )
242            END DO
243            DO jk = 1, nlay_i-1
244               DO ji = 1, npti
245                  ztcond_i_cp(ji,jk) = rcnd_i + zbeta * 0.5_wp * ( sz_i_1d(ji,jk) + sz_i_1d(ji,jk+1) ) /  &
246                     &                    MIN( -epsi10, 0.5_wp * (  t_i_1d(ji,jk) +  t_i_1d(ji,jk+1) ) - rt0 )
247               END DO
248            END DO
249            !
250         ELSEIF( ln_cndi_P07 ) THEN     !-- Pringle et al formula: k = k0 + beta1.S/T - beta2.T
251            !
252            DO ji = 1, npti
253               ztcond_i_cp(ji,0)      = rcnd_i + 0.09_wp  *  sz_i_1d(ji,1)      / MIN( -epsi10, t_i_1d(ji,1) - rt0 )  &
254                  &                            - 0.011_wp * ( t_i_1d(ji,1) - rt0 )
255               ztcond_i_cp(ji,nlay_i) = rcnd_i + 0.09_wp  *  sz_i_1d(ji,nlay_i) / MIN( -epsi10, t_bo_1d(ji)  - rt0 )  &
256                  &                            - 0.011_wp * ( t_bo_1d(ji) - rt0 )
257            END DO
258            DO jk = 1, nlay_i-1
259               DO ji = 1, npti
260                  ztcond_i_cp(ji,jk) = rcnd_i + 0.09_wp  *   0.5_wp * ( sz_i_1d(ji,jk) + sz_i_1d(ji,jk+1) ) /       &
261                     &                         MIN( -epsi10, 0.5_wp * (  t_i_1d(ji,jk) +  t_i_1d(ji,jk+1) ) - rt0 ) &
262                     &                        - 0.011_wp * ( 0.5_wp * (  t_i_1d(ji,jk) +  t_i_1d(ji,jk+1) ) - rt0 )
263               END DO
264            END DO
265            !
266         ENDIF
267
268         ! Variable used after iterations
269         ! Value must be frozen after convergence for MPP independance reason
270         DO ji = 1, npti
271            IF ( .NOT. l_T_converged(ji) ) &
272               ztcond_i(ji,:) = MAX( zkimin, ztcond_i_cp(ji,:) )       
273         END DO
274         !
275         !--- G(he) : enhancement of thermal conductivity in mono-category case
276         ! Computation of effective thermal conductivity G(h)
277         ! Used in mono-category case only to simulate an ITD implicitly
278         ! Fichefet and Morales Maqueda, JGR 1997
279         zghe(1:npti) = 1._wp
280         !
281         IF( ln_virtual_itd ) THEN
282            !
283            zepsilon = 0.1_wp
284            DO ji = 1, npti
285               zcnd_i = SUM( ztcond_i(ji,:) ) / REAL( nlay_i+1, wp )                                ! Mean sea ice thermal conductivity
286               zhe = ( rn_cnd_s * h_i_1d(ji) + zcnd_i * h_s_1d(ji) ) / ( rn_cnd_s + zcnd_i )        ! Effective thickness he (zhe)
287               IF( zhe >=  zepsilon * 0.5_wp * EXP(1._wp) )  &
288                  &   zghe(ji) = MIN( 2._wp, 0.5_wp * ( 1._wp + LOG( 2._wp * zhe / zepsilon ) ) )   ! G(he)
289            END DO
290            !
291         ENDIF
292         !
293         !-----------------
294         ! 4) kappa factors
295         !-----------------
296         !--- Snow
297         ! Variable used after iterations
298         ! Value must be frozen after convergence for MPP independance reason
299         DO jk = 0, nlay_s-1
300            DO ji = 1, npti
301               IF ( .NOT. l_T_converged(ji) ) &
302                  zkappa_s(ji,jk) = zghe(ji) * rn_cnd_s * z1_h_s(ji)
303            END DO
304         END DO
305         DO ji = 1, npti   ! Snow-ice interface
306            IF ( .NOT. l_T_converged(ji) ) THEN
307               IF( h_s_1d(ji) >= zhs_ssl ) THEN
308                  zkappa_s(ji,nlay_s) =   zghe(ji) * rn_cnd_s * ztcond_i(ji,0) / &
309                     &                  ( 0.5_wp * ( ztcond_i(ji,0) * zh_s(ji) + rn_cnd_s * zh_i(ji) ) )
310               ELSE
311                  zkappa_s(ji,nlay_s) = 0._wp
312               ENDIF
313            ENDIF
314         END DO
315
316         !--- Ice
317         ! Variable used after iterations
318         ! Value must be frozen after convergence for MPP independance reason
319         DO jk = 0, nlay_i
320            DO ji = 1, npti
321               IF ( .NOT. l_T_converged(ji) ) &
322                  zkappa_i(ji,jk) = zghe(ji) * ztcond_i(ji,jk) * z1_h_i(ji)
323            END DO
324         END DO
325         DO ji = 1, npti   ! Snow-ice interface
326            IF ( .NOT. l_T_converged(ji) ) &
327               zkappa_i(ji,0) = zkappa_s(ji,nlay_s) * za_s_fra(ji) + zkappa_i(ji,0) * (1._wp - za_s_fra(ji))
328         END DO
329         !
330         !--------------------------------------
331         ! 5) Sea ice specific heat, eta factors
332         !--------------------------------------
333         DO jk = 1, nlay_i
334            DO ji = 1, npti
335               zcpi = rcpi + zgamma * sz_i_1d(ji,jk) / MAX( ( t_i_1d(ji,jk) - rt0 ) * ( ztiold(ji,jk) - rt0 ), epsi10 )
336               zeta_i(ji,jk) = rdt_ice * r1_rhoi * z1_h_i(ji) / MAX( epsi10, zcpi ) 
337            END DO
338         END DO
339
340         DO jk = 1, nlay_s
341            DO ji = 1, npti
342               zeta_s(ji,jk) = rdt_ice * r1_rhos * r1_rcpi * z1_h_s(ji)
343            END DO
344         END DO
345         !
346         !----------------------------------------!
347         !                                        !
348         !   Conduction flux is off or emulated   !
349         !                                        !
350         !----------------------------------------!
351         !
352         IF( k_cnd == np_cnd_OFF .OR. k_cnd == np_cnd_EMU ) THEN
353            !
354            ! ==> The original BL99 temperature computation is used
355            !       (with qsr_ice, qns_ice and dqns_ice as inputs)
356            !
357            !----------------------------
358            ! 6) surface flux computation
359            !----------------------------
360            ! update of the non solar flux according to the update in T_su
361            DO ji = 1, npti
362               ! Variable used after iterations
363               ! Value must be frozen after convergence for MPP independance reason
364               IF ( .NOT. l_T_converged(ji) ) &
365                  qns_ice_1d(ji) = qns_ice_1d(ji) + dqns_ice_1d(ji) * ( t_su_1d(ji) - ztsub(ji) )
366            END DO
367
368            DO ji = 1, npti
369               zfnet(ji) = qsr_ice_1d(ji) - qtr_ice_top_1d(ji) + qns_ice_1d(ji) ! net heat flux = net - transmitted solar + non solar
370            END DO
371            !
372            !----------------------------
373            ! 7) tridiagonal system terms
374            !----------------------------
375            ! layer denotes the number of the layer in the snow or in the ice
376            ! jm denotes the reference number of the equation in the tridiagonal
377            ! system, terms of tridiagonal system are indexed as following :
378            ! 1 is subdiagonal term, 2 is diagonal and 3 is superdiagonal one
379
380            ! ice interior terms (top equation has the same form as the others)
381            ztrid   (1:npti,:,:) = 0._wp
382            zindterm(1:npti,:)   = 0._wp
383            zindtbis(1:npti,:)   = 0._wp
384            zdiagbis(1:npti,:)   = 0._wp
385
386            DO jm = nlay_s + 2, nlay_s + nlay_i 
387               DO ji = 1, npti
388                  jk = jm - nlay_s - 1
389                  ztrid   (ji,jm,1) =       - zeta_i(ji,jk) *   zkappa_i(ji,jk-1)
390                  ztrid   (ji,jm,2) = 1._wp + zeta_i(ji,jk) * ( zkappa_i(ji,jk-1) + zkappa_i(ji,jk) )
391                  ztrid   (ji,jm,3) =       - zeta_i(ji,jk) *                       zkappa_i(ji,jk)
392                  zindterm(ji,jm)   = ztiold(ji,jk) + zeta_i(ji,jk) * zradab_i(ji,jk)
393               END DO
394            END DO
395
396            jm =  nlay_s + nlay_i + 1
397            DO ji = 1, npti
398               ! ice bottom term
399               ztrid   (ji,jm,1) =       - zeta_i(ji,nlay_i) *   zkappa_i(ji,nlay_i-1)   
400               ztrid   (ji,jm,2) = 1._wp + zeta_i(ji,nlay_i) * ( zkappa_i(ji,nlay_i-1) + zkappa_i(ji,nlay_i) * zg1 )
401               ztrid   (ji,jm,3) = 0._wp
402               zindterm(ji,jm)   = ztiold(ji,nlay_i) + zeta_i(ji,nlay_i) *  &
403                  &              ( zradab_i(ji,nlay_i) + zkappa_i(ji,nlay_i) * zg1 * t_bo_1d(ji) ) 
404            END DO
405
406            DO ji = 1, npti
407               !                               !---------------------!
408               IF( h_s_1d(ji) > 0._wp ) THEN   !  snow-covered cells !
409                  !                            !---------------------!
410                  ! snow interior terms (bottom equation has the same form as the others)
411                  DO jm = 3, nlay_s + 1
412                     jk = jm - 1
413                     ztrid   (ji,jm,1) =       - zeta_s(ji,jk) *   zkappa_s(ji,jk-1)
414                     ztrid   (ji,jm,2) = 1._wp + zeta_s(ji,jk) * ( zkappa_s(ji,jk-1) + zkappa_s(ji,jk) )
415                     ztrid   (ji,jm,3) =       - zeta_s(ji,jk) *                       zkappa_s(ji,jk)
416                     zindterm(ji,jm)   = ztsold(ji,jk) + zeta_s(ji,jk) * zradab_s(ji,jk)
417                  END DO
418                 
419                  ! case of only one layer in the ice (ice equation is altered)
420                  IF( nlay_i == 1 ) THEN
421                     ztrid   (ji,nlay_s+2,3) = 0._wp
422                     zindterm(ji,nlay_s+2)   = zindterm(ji,nlay_s+2) + zeta_i(ji,1) * zkappa_i(ji,1) * t_bo_1d(ji) 
423                  ENDIF
424                 
425                  IF( t_su_1d(ji) < rt0 ) THEN   !--  case 1 : no surface melting
426                     
427                     jm_min(ji) = 1
428                     jm_max(ji) = nlay_i + nlay_s + 1
429                     
430                     ! surface equation
431                     ztrid   (ji,1,1) = 0._wp
432                     ztrid   (ji,1,2) = zdqns_ice_b(ji) - zg1s * zkappa_s(ji,0)
433                     ztrid   (ji,1,3) =                   zg1s * zkappa_s(ji,0)
434                     zindterm(ji,1)   = zdqns_ice_b(ji) * t_su_1d(ji) - zfnet(ji)
435                     
436                     ! first layer of snow equation
437                     ztrid   (ji,2,1) =       - zeta_s(ji,1) *                    zkappa_s(ji,0) * zg1s
438                     ztrid   (ji,2,2) = 1._wp + zeta_s(ji,1) * ( zkappa_s(ji,1) + zkappa_s(ji,0) * zg1s )
439                     ztrid   (ji,2,3) =       - zeta_s(ji,1) *   zkappa_s(ji,1)
440                     zindterm(ji,2)   = ztsold(ji,1) + zeta_s(ji,1) * zradab_s(ji,1)
441                     
442                  ELSE                            !--  case 2 : surface is melting
443                     !
444                     jm_min(ji) = 2
445                     jm_max(ji) = nlay_i + nlay_s + 1
446                     
447                     ! first layer of snow equation
448                     ztrid   (ji,2,1) = 0._wp
449                     ztrid   (ji,2,2) = 1._wp + zeta_s(ji,1) * ( zkappa_s(ji,1) + zkappa_s(ji,0) * zg1s )
450                     ztrid   (ji,2,3) =       - zeta_s(ji,1) *   zkappa_s(ji,1) 
451                     zindterm(ji,2)   = ztsold(ji,1) + zeta_s(ji,1) * ( zradab_s(ji,1) + zkappa_s(ji,0) * zg1s * t_su_1d(ji) ) 
452                  ENDIF
453                  !                            !---------------------!
454               ELSE                            ! cells without snow  !
455                  !                            !---------------------!
456                  !
457                  IF( t_su_1d(ji) < rt0 ) THEN   !--  case 1 : no surface melting
458                     !
459                     jm_min(ji) = nlay_s + 1
460                     jm_max(ji) = nlay_i + nlay_s + 1
461                     
462                     ! surface equation   
463                     ztrid   (ji,jm_min(ji),1) = 0._wp
464                     ztrid   (ji,jm_min(ji),2) = zdqns_ice_b(ji) - zkappa_i(ji,0) * zg1   
465                     ztrid   (ji,jm_min(ji),3) =                   zkappa_i(ji,0) * zg1
466                     zindterm(ji,jm_min(ji))   = zdqns_ice_b(ji) * t_su_1d(ji) - zfnet(ji)
467                     
468                     ! first layer of ice equation
469                     ztrid   (ji,jm_min(ji)+1,1) =       - zeta_i(ji,1) *                    zkappa_i(ji,0) * zg1
470                     ztrid   (ji,jm_min(ji)+1,2) = 1._wp + zeta_i(ji,1) * ( zkappa_i(ji,1) + zkappa_i(ji,0) * zg1 )
471                     ztrid   (ji,jm_min(ji)+1,3) =       - zeta_i(ji,1) *   zkappa_i(ji,1) 
472                     zindterm(ji,jm_min(ji)+1)   = ztiold(ji,1) + zeta_i(ji,1) * zradab_i(ji,1) 
473                     
474                     ! case of only one layer in the ice (surface & ice equations are altered)
475                     IF( nlay_i == 1 ) THEN
476                        ztrid   (ji,jm_min(ji),1)   = 0._wp
477                        ztrid   (ji,jm_min(ji),2)   = zdqns_ice_b(ji)      -   zkappa_i(ji,0) * 2._wp
478                        ztrid   (ji,jm_min(ji),3)   =                          zkappa_i(ji,0) * 2._wp
479                        ztrid   (ji,jm_min(ji)+1,1) =       - zeta_i(ji,1) *   zkappa_i(ji,0) * 2._wp
480                        ztrid   (ji,jm_min(ji)+1,2) = 1._wp + zeta_i(ji,1) * ( zkappa_i(ji,0) * 2._wp + zkappa_i(ji,1) )
481                        ztrid   (ji,jm_min(ji)+1,3) = 0._wp
482                        zindterm(ji,jm_min(ji)+1)   = ztiold(ji,1) + zeta_i(ji,1) * (zradab_i(ji,1) + zkappa_i(ji,1) * t_bo_1d(ji))
483                     ENDIF
484                     
485                  ELSE                            !--  case 2 : surface is melting
486                     
487                     jm_min(ji) = nlay_s + 2
488                     jm_max(ji) = nlay_i + nlay_s + 1
489                     
490                     ! first layer of ice equation
491                     ztrid   (ji,jm_min(ji),1) = 0._wp
492                     ztrid   (ji,jm_min(ji),2) = 1._wp + zeta_i(ji,1) * ( zkappa_i(ji,1) + zkappa_i(ji,0) * zg1 ) 
493                     ztrid   (ji,jm_min(ji),3) =       - zeta_i(ji,1) *   zkappa_i(ji,1)
494                     zindterm(ji,jm_min(ji))   = ztiold(ji,1) + zeta_i(ji,1) * (zradab_i(ji,1) + zkappa_i(ji,0) * zg1 * t_su_1d(ji)) 
495                     
496                     ! case of only one layer in the ice (surface & ice equations are altered)
497                     IF( nlay_i == 1 ) THEN
498                        ztrid   (ji,jm_min(ji),1) = 0._wp
499                        ztrid   (ji,jm_min(ji),2) = 1._wp + zeta_i(ji,1) * ( zkappa_i(ji,0) * 2._wp + zkappa_i(ji,1) )
500                        ztrid   (ji,jm_min(ji),3) = 0._wp
501                        zindterm(ji,jm_min(ji))   = ztiold(ji,1) + zeta_i(ji,1) * ( zradab_i(ji,1) + zkappa_i(ji,1) * t_bo_1d(ji) ) &
502                           &                      + t_su_1d(ji) * zeta_i(ji,1) * zkappa_i(ji,0) * 2._wp
503                     ENDIF
504                     
505                  ENDIF
506               ENDIF
507               !
508               zindtbis(ji,jm_min(ji)) = zindterm(ji,jm_min(ji))
509               zdiagbis(ji,jm_min(ji)) = ztrid   (ji,jm_min(ji),2)
510               !
511            END DO
512            !
513            !------------------------------
514            ! 8) tridiagonal system solving
515            !------------------------------
516            ! Solve the tridiagonal system with Gauss elimination method.
517            ! Thomas algorithm, from Computational fluid Dynamics, J.D. ANDERSON, McGraw-Hill 1984
518            jm_maxt = 0
519            jm_mint = nlay_i+5
520            DO ji = 1, npti
521               jm_mint = MIN(jm_min(ji),jm_mint)
522               jm_maxt = MAX(jm_max(ji),jm_maxt)
523            END DO
524
525            DO jk = jm_mint+1, jm_maxt
526               DO ji = 1, npti
527                  jm = MIN(MAX(jm_min(ji)+1,jk),jm_max(ji))
528                  zdiagbis(ji,jm) = ztrid   (ji,jm,2) - ztrid(ji,jm,1) * ztrid   (ji,jm-1,3) / zdiagbis(ji,jm-1)
529                  zindtbis(ji,jm) = zindterm(ji,jm  ) - ztrid(ji,jm,1) * zindtbis(ji,jm-1  ) / zdiagbis(ji,jm-1)
530               END DO
531            END DO
532
533            ! ice temperatures
534            DO ji = 1, npti
535               ! Variable used after iterations
536               ! Value must be frozen after convergence for MPP independance reason
537               IF ( .NOT. l_T_converged(ji) ) &
538                  t_i_1d(ji,nlay_i) = zindtbis(ji,jm_max(ji)) / zdiagbis(ji,jm_max(ji))
539            END DO
540
541            DO jm = nlay_i + nlay_s, nlay_s + 2, -1
542               DO ji = 1, npti
543                  jk = jm - nlay_s - 1
544                  IF ( .NOT. l_T_converged(ji) ) &
545                     t_i_1d(ji,jk) = ( zindtbis(ji,jm) - ztrid(ji,jm,3) * t_i_1d(ji,jk+1) ) / zdiagbis(ji,jm)
546               END DO
547            END DO
548
549            DO ji = 1, npti
550               ! Variables used after iterations
551               ! Value must be frozen after convergence for MPP independance reason
552               IF ( .NOT. l_T_converged(ji) ) THEN
553                  ! snow temperatures     
554                  IF( h_s_1d(ji) > 0._wp ) THEN
555                     t_s_1d(ji,nlay_s) = ( zindtbis(ji,nlay_s+1) - ztrid(ji,nlay_s+1,3) * t_i_1d(ji,1) ) / zdiagbis(ji,nlay_s+1)
556                  ENDIF
557                  ! surface temperature
558                  ztsub(ji) = t_su_1d(ji)
559                  IF( t_su_1d(ji) < rt0 ) THEN
560                     t_su_1d(ji) = ( zindtbis(ji,jm_min(ji)) - ztrid(ji,jm_min(ji),3) *  &
561                        &          ( za_s_fra(ji) * t_s_1d(ji,1) + (1._wp - za_s_fra(ji)) * t_i_1d(ji,1) ) ) / zdiagbis(ji,jm_min(ji))
562                  ENDIF
563               ENDIF
564            END DO
565            !
566            !--------------------------------------------------------------
567            ! 9) Has the scheme converged?, end of the iterative procedure
568            !--------------------------------------------------------------
569            ! check that nowhere it has started to melt
570            ! zdti_max is a measure of error, it has to be under zdti_bnd
571
572            DO ji = 1, npti
573
574               zdti_max = 0._wp
575
576               IF ( .NOT. l_T_converged(ji) ) THEN
577                  t_su_1d(ji) = MAX( MIN( t_su_1d(ji) , rt0 ) , rt0 - 100._wp )
578                  zdti_max    = MAX( zdti_max, ABS( t_su_1d(ji) - ztsub(ji) ) )
579
580                  t_s_1d(ji,1:nlay_s) = MAX( MIN( t_s_1d(ji,1:nlay_s), rt0 ), rt0 - 100._wp )
581                  zdti_max = MAX ( zdti_max , MAXVAL( ABS( t_s_1d(ji,1:nlay_s) - ztsb(ji,1:nlay_s) ) ) )
582
583                  DO jk = 1, nlay_i
584                     ztmelts       = -rTmlt * sz_i_1d(ji,jk) + rt0
585                     t_i_1d(ji,jk) =  MAX( MIN( t_i_1d(ji,jk), ztmelts ), rt0 - 100._wp )
586                     zdti_max      =  MAX( zdti_max, ABS( t_i_1d(ji,jk) - ztib(ji,jk) ) )
587                  END DO
588
589                  IF ( zdti_max < zdti_bnd ) l_T_converged(ji) = .TRUE.
590
591               ENDIF
592
593            END DO
594
595         !----------------------------------------!
596         !                                        !
597         !      Conduction flux is on             !
598         !                                        !
599         !----------------------------------------!
600         !
601         ELSEIF( k_cnd == np_cnd_ON ) THEN
602            !
603            ! ==> we use a modified BL99 solver with conduction flux (qcn_ice) as forcing term
604            !
605            !----------------------------
606            ! 7) tridiagonal system terms
607            !----------------------------
608            ! layer denotes the number of the layer in the snow or in the ice
609            ! jm denotes the reference number of the equation in the tridiagonal
610            ! system, terms of tridiagonal system are indexed as following :
611            ! 1 is subdiagonal term, 2 is diagonal and 3 is superdiagonal one
612
613            ! ice interior terms (top equation has the same form as the others)
614            ztrid   (1:npti,:,:) = 0._wp
615            zindterm(1:npti,:)   = 0._wp
616            zindtbis(1:npti,:)   = 0._wp
617            zdiagbis(1:npti,:)   = 0._wp
618
619            DO jm = nlay_s + 2, nlay_s + nlay_i 
620               DO ji = 1, npti
621                  jk = jm - nlay_s - 1
622                  ztrid   (ji,jm,1) =       - zeta_i(ji,jk) *   zkappa_i(ji,jk-1)
623                  ztrid   (ji,jm,2) = 1._wp + zeta_i(ji,jk) * ( zkappa_i(ji,jk-1) + zkappa_i(ji,jk) )
624                  ztrid   (ji,jm,3) =       - zeta_i(ji,jk) *                       zkappa_i(ji,jk)
625                  zindterm(ji,jm)   = ztiold(ji,jk) + zeta_i(ji,jk) * zradab_i(ji,jk)
626               END DO
627            ENDDO
628
629            jm =  nlay_s + nlay_i + 1
630            DO ji = 1, npti
631               ! ice bottom term
632               ztrid   (ji,jm,1) =       - zeta_i(ji,nlay_i) *   zkappa_i(ji,nlay_i-1)   
633               ztrid   (ji,jm,2) = 1._wp + zeta_i(ji,nlay_i) * ( zkappa_i(ji,nlay_i-1) + zkappa_i(ji,nlay_i) * zg1 )
634               ztrid   (ji,jm,3) = 0._wp
635               zindterm(ji,jm)   = ztiold(ji,nlay_i) + zeta_i(ji,nlay_i) *  &
636                  &              ( zradab_i(ji,nlay_i) + zkappa_i(ji,nlay_i) * zg1 * t_bo_1d(ji) ) 
637            ENDDO
638
639            DO ji = 1, npti
640               !                               !---------------------!
641               IF( h_s_1d(ji) > 0._wp ) THEN   !  snow-covered cells !
642                  !                            !---------------------!
643                  ! snow interior terms (bottom equation has the same form as the others)
644                  DO jm = 3, nlay_s + 1
645                     jk = jm - 1
646                     ztrid   (ji,jm,1) =       - zeta_s(ji,jk) *   zkappa_s(ji,jk-1)
647                     ztrid   (ji,jm,2) = 1._wp + zeta_s(ji,jk) * ( zkappa_s(ji,jk-1) + zkappa_s(ji,jk) )
648                     ztrid   (ji,jm,3) =       - zeta_s(ji,jk) *                       zkappa_s(ji,jk)
649                     zindterm(ji,jm)   = ztsold(ji,jk) + zeta_s(ji,jk) * zradab_s(ji,jk)
650                  END DO
651                 
652                  ! case of only one layer in the ice (ice equation is altered)
653                  IF ( nlay_i == 1 ) THEN
654                     ztrid   (ji,nlay_s+2,3) = 0._wp
655                     zindterm(ji,nlay_s+2)   = zindterm(ji,nlay_s+2) + zeta_i(ji,1) * zkappa_i(ji,1) * t_bo_1d(ji) 
656                  ENDIF
657                 
658                  jm_min(ji) = 2
659                  jm_max(ji) = nlay_i + nlay_s + 1
660                 
661                  ! first layer of snow equation
662                  ztrid   (ji,2,1) = 0._wp
663                  ztrid   (ji,2,2) = 1._wp + zeta_s(ji,1) * zkappa_s(ji,1)
664                  ztrid   (ji,2,3) =       - zeta_s(ji,1) * zkappa_s(ji,1) 
665                  zindterm(ji,2)   = ztsold(ji,1) + zeta_s(ji,1) * ( zradab_s(ji,1) + qcn_ice_1d(ji) ) 
666                 
667                  !                            !---------------------!
668               ELSE                            ! cells without snow  !
669                  !                            !---------------------!
670                  jm_min(ji) = nlay_s + 2
671                  jm_max(ji) = nlay_i + nlay_s + 1
672                 
673                  ! first layer of ice equation
674                  ztrid   (ji,jm_min(ji),1) = 0._wp
675                  ztrid   (ji,jm_min(ji),2) = 1._wp + zeta_i(ji,1) * zkappa_i(ji,1) 
676                  ztrid   (ji,jm_min(ji),3) =       - zeta_i(ji,1) * zkappa_i(ji,1)
677                  zindterm(ji,jm_min(ji))   = ztiold(ji,1) + zeta_i(ji,1) * ( zradab_i(ji,1) + qcn_ice_1d(ji) )
678                 
679                  ! case of only one layer in the ice (surface & ice equations are altered)
680                  IF( nlay_i == 1 ) THEN
681                     ztrid   (ji,jm_min(ji),1) = 0._wp
682                     ztrid   (ji,jm_min(ji),2) = 1._wp + zeta_i(ji,1) * zkappa_i(ji,1)
683                     ztrid   (ji,jm_min(ji),3) = 0._wp
684                     zindterm(ji,jm_min(ji))   = ztiold(ji,1) + zeta_i(ji,1) *  &
685                        &                                     ( zradab_i(ji,1) + zkappa_i(ji,1) * t_bo_1d(ji) + qcn_ice_1d(ji) )
686                  ENDIF
687                 
688               ENDIF
689               !
690               zindtbis(ji,jm_min(ji)) = zindterm(ji,jm_min(ji))
691               zdiagbis(ji,jm_min(ji)) = ztrid   (ji,jm_min(ji),2)
692               !
693            END DO
694            !
695            !------------------------------
696            ! 8) tridiagonal system solving
697            !------------------------------
698            ! Solve the tridiagonal system with Gauss elimination method.
699            ! Thomas algorithm, from Computational fluid Dynamics, J.D. ANDERSON, McGraw-Hill 1984
700            jm_maxt = 0
701            jm_mint = nlay_i+5
702            DO ji = 1, npti
703               jm_mint = MIN(jm_min(ji),jm_mint)
704               jm_maxt = MAX(jm_max(ji),jm_maxt)
705            END DO
706           
707            DO jk = jm_mint+1, jm_maxt
708               DO ji = 1, npti
709                  jm = MIN(MAX(jm_min(ji)+1,jk),jm_max(ji))
710                  zdiagbis(ji,jm) = ztrid   (ji,jm,2) - ztrid(ji,jm,1) * ztrid   (ji,jm-1,3) / zdiagbis(ji,jm-1)
711                  zindtbis(ji,jm) = zindterm(ji,jm)   - ztrid(ji,jm,1) * zindtbis(ji,jm-1)   / zdiagbis(ji,jm-1)
712               END DO
713            END DO
714           
715            ! ice temperatures
716            DO ji = 1, npti
717               ! Variable used after iterations
718               ! Value must be frozen after convergence for MPP independance reason
719               IF ( .NOT. l_T_converged(ji) ) &
720                  t_i_1d(ji,nlay_i) = zindtbis(ji,jm_max(ji)) / zdiagbis(ji,jm_max(ji))
721            END DO
722
723            DO jm = nlay_i + nlay_s, nlay_s + 2, -1
724               DO ji = 1, npti
725                  IF ( .NOT. l_T_converged(ji) ) THEN
726                     jk = jm - nlay_s - 1
727                     t_i_1d(ji,jk) = ( zindtbis(ji,jm) - ztrid(ji,jm,3) * t_i_1d(ji,jk+1) ) / zdiagbis(ji,jm)
728                  ENDIF
729               END DO
730            END DO
731           
732            ! snow temperatures     
733            DO ji = 1, npti
734               ! Variable used after iterations
735               ! Value must be frozen after convergence for MPP independance reason
736               IF ( .NOT. l_T_converged(ji) ) THEN
737                  IF( h_s_1d(ji) > 0._wp ) THEN
738                     t_s_1d(ji,nlay_s) = ( zindtbis(ji,nlay_s+1) - ztrid(ji,nlay_s+1,3) * t_i_1d(ji,1) ) / zdiagbis(ji,nlay_s+1)
739                  ENDIF
740               ENDIF
741            END DO
742            !
743            !--------------------------------------------------------------
744            ! 9) Has the scheme converged?, end of the iterative procedure
745            !--------------------------------------------------------------
746            ! check that nowhere it has started to melt
747            ! zdti_max is a measure of error, it has to be under zdti_bnd
748
749            DO ji = 1, npti
750
751               zdti_max = 0._wp
752
753               IF ( .NOT. l_T_converged(ji) ) THEN
754                  ! t_s
755                  t_s_1d(ji,1:nlay_s) = MAX( MIN( t_s_1d(ji,1:nlay_s), rt0 ), rt0 - 100._wp )
756                  zdti_max = MAX ( zdti_max , MAXVAL( ABS( t_s_1d(ji,1:nlay_s) - ztsb(ji,1:nlay_s) ) ) )
757                  ! t_i
758                  DO jk = 1, nlay_i
759                     ztmelts       = -rTmlt * sz_i_1d(ji,jk) + rt0 
760                     t_i_1d(ji,jk) =  MAX( MIN( t_i_1d(ji,jk), ztmelts ), rt0 - 100._wp )
761                     zdti_max      =  MAX ( zdti_max, ABS( t_i_1d(ji,jk) - ztib(ji,jk) ) )
762                  END DO
763
764                  IF ( zdti_max < zdti_bnd ) l_T_converged(ji) = .TRUE.
765
766               ENDIF
767
768            END DO
769
770         ENDIF ! k_cnd
771         
772      END DO  ! End of the do while iterative procedure
773      !
774      ! convergence tests (only for output)
775      IF( ln_zdf_chkcvg ) THEN
776         tice_cvg_1d(1:npti) = 0._wp
777         DO jk = 1, nlay_s          ! snow temperature
778            DO ji = 1, npti
779               tice_cvg_1d(ji) = MAX( tice_cvg_1d(ji), ABS( t_s_1d(ji,jk) - ztsb(ji,jk) ) )
780            ENDDO
781         ENDDO
782         DO jk = 1, nlay_i          ! ice temperature
783            DO ji = 1, npti
784               tice_cvg_1d(ji) = MAX( tice_cvg_1d(ji), ABS( t_i_1d(ji,jk) - ztib(ji,jk) ) )
785            ENDDO
786         ENDDO
787         IF( k_cnd == np_cnd_OFF .OR. k_cnd == np_cnd_EMU ) THEN
788            DO ji = 1, npti         ! surface temperature
789               tice_cvg_1d(ji) = MAX( tice_cvg_1d(ji), ABS( t_su_1d(ji) - ztsub(ji) ) )
790            ENDDO
791         ENDIF
792      ENDIF
793      !
794      !-----------------------------
795      ! 10) Fluxes at the interfaces
796      !-----------------------------
797      !
798      ! --- calculate conduction fluxes (positive downward)
799      !     bottom ice conduction flux
800      DO ji = 1, npti
801         qcn_ice_bot_1d(ji) = - zkappa_i(ji,nlay_i) * zg1  * ( t_bo_1d(ji ) - t_i_1d (ji,nlay_i) )
802      END DO
803      !     surface ice conduction flux
804      IF( k_cnd == np_cnd_OFF .OR. k_cnd == np_cnd_EMU ) THEN
805         !
806         DO ji = 1, npti
807            qcn_ice_top_1d(ji) =  -           za_s_fra(ji)   * zkappa_s(ji,0) * zg1s * ( t_s_1d(ji,1) - t_su_1d(ji) )  &
808               &                  - ( 1._wp - za_s_fra(ji) ) * zkappa_i(ji,0) * zg1  * ( t_i_1d(ji,1) - t_su_1d(ji) )
809         END DO
810         !
811      ELSEIF( k_cnd == np_cnd_ON ) THEN
812         !
813         DO ji = 1, npti
814            qcn_ice_top_1d(ji) = qcn_ice_1d(ji)
815         END DO
816         !
817      ENDIF
818      !     surface ice temperature
819      IF( k_cnd == np_cnd_ON .AND. ln_cndemulate ) THEN
820         !
821         DO ji = 1, npti
822            t_su_1d(ji) = (  qcn_ice_top_1d(ji) &            ! calculate surface temperature
823               &                +          za_s_fra(ji)  * zkappa_s(ji,0) * zg1s * t_s_1d(ji,1) &
824               &                + (1._wp - za_s_fra(ji)) * zkappa_i(ji,0) * zg1  * t_i_1d(ji,1) &
825               &          ) / MAX( epsi10, za_s_fra(ji)  * zkappa_s(ji,0) * zg1s + (1._wp - za_s_fra(ji)) * zkappa_i(ji,0) * zg1 )
826            t_su_1d(ji) = MAX( MIN( t_su_1d(ji), rt0 ), rt0 - 100._wp )  ! cap t_su
827         END DO
828         !
829      ENDIF
830      !
831      ! --- Diagnose the heat loss due to changing non-solar / conduction flux --- !
832      !
833      IF( k_cnd == np_cnd_OFF .OR. k_cnd == np_cnd_EMU ) THEN
834         !
835         DO ji = 1, npti
836            hfx_err_dif_1d(ji) = hfx_err_dif_1d(ji) - ( qns_ice_1d(ji) - zqns_ice_b(ji) ) * a_i_1d(ji) 
837         END DO
838         !
839      ENDIF
840      !
841      ! --- Diagnose the heat loss due to non-fully converged temperature solution (should not be above 10-4 W-m2) --- !
842      !
843      IF( k_cnd == np_cnd_OFF .OR. k_cnd == np_cnd_ON ) THEN
844         
845         CALL ice_var_enthalpy       
846         
847         ! zhfx_err = correction on the diagnosed heat flux due to non-convergence of the algorithm used to solve heat equation
848         DO ji = 1, npti
849            zdq = - zq_ini(ji) + ( SUM( e_i_1d(ji,1:nlay_i) ) * h_i_1d(ji) * r1_nlay_i +  &
850               &                   SUM( e_s_1d(ji,1:nlay_s) ) * h_s_1d(ji) * r1_nlay_s )
851           
852            IF( k_cnd == np_cnd_OFF ) THEN
853               
854               IF( t_su_1d(ji) < rt0 ) THEN  ! case T_su < 0degC
855                  zhfx_err = ( qns_ice_1d(ji)     + qsr_ice_1d(ji)     - zradtr_i(ji,nlay_i) - qcn_ice_bot_1d(ji)  &
856                     &       + zdq * r1_rdtice ) * a_i_1d(ji)
857               ELSE                          ! case T_su = 0degC
858                  zhfx_err = ( qcn_ice_top_1d(ji) + qtr_ice_top_1d(ji) - zradtr_i(ji,nlay_i) - qcn_ice_bot_1d(ji)  &
859                     &       + zdq * r1_rdtice ) * a_i_1d(ji)
860               ENDIF
861               
862            ELSEIF( k_cnd == np_cnd_ON ) THEN
863           
864               zhfx_err    = ( qcn_ice_top_1d(ji) + qtr_ice_top_1d(ji) - zradtr_i(ji,nlay_i) - qcn_ice_bot_1d(ji)  &
865                  &          + zdq * r1_rdtice ) * a_i_1d(ji)
866           
867            ENDIF
868            !
869            ! total heat sink to be sent to the ocean
870            hfx_err_dif_1d(ji) = hfx_err_dif_1d(ji) + zhfx_err
871            !
872            ! hfx_dif = Heat flux diagnostic of sensible heat used to warm/cool ice in W.m-2   
873            hfx_dif_1d(ji) = hfx_dif_1d(ji) - zdq * r1_rdtice * a_i_1d(ji)
874            !
875         END DO
876         !
877      ENDIF
878      !
879      !--------------------------------------------------------------------
880      ! 11) reset inner snow and ice temperatures, update conduction fluxes
881      !--------------------------------------------------------------------
882      ! effective conductivity and 1st layer temperature (needed by Met Office)
883      ! this is a conductivity at mid-layer, hence the factor 2
884      DO ji = 1, npti
885         IF( h_i_1d(ji) >= zhi_ssl ) THEN   ! zkappa_i=0 when h_i<zhi_ssl (but ztcond_i/=0)
886            cnd_ice_1d(ji) = 2._wp * zkappa_i(ji,0)
887         ELSE
888            cnd_ice_1d(ji) = 2._wp * ztcond_i(ji,0) / zhi_ssl ! cnd_ice is capped by: cond_i/zhi_ssl
889         ENDIF
890         t1_ice_1d(ji) = za_s_fra(ji) * t_s_1d(ji,1) + ( 1._wp - za_s_fra(ji) ) * t_i_1d(ji,1)
891      END DO
892      !
893      IF( k_cnd == np_cnd_EMU ) THEN
894         ! Restore temperatures to their initial values
895         t_s_1d    (1:npti,:) = ztsold        (1:npti,:)
896         t_i_1d    (1:npti,:) = ztiold        (1:npti,:)
897         qcn_ice_1d(1:npti)   = qcn_ice_top_1d(1:npti)
898      ENDIF
899      !
900      ! --- SIMIP diagnostics
901      !
902      DO ji = 1, npti         
903         !--- Snow-ice interfacial temperature (diagnostic SIMIP)
904         IF( h_s_1d(ji) >= zhs_ssl ) THEN
905            t_si_1d(ji) = ( rn_cnd_s * zh_i(ji) * t_s_1d(ji,1) + ztcond_i(ji,1) * zh_s(ji) * t_i_1d(ji,1) ) / &
906               &          ( rn_cnd_s * zh_i(ji)                + ztcond_i(ji,1) * zh_s(ji)                )
907         ELSE
908            t_si_1d(ji) = t_su_1d(ji)
909         ENDIF
910      END DO
911      !
912   END SUBROUTINE ice_thd_zdf_BL99
913
914#else
915   !!----------------------------------------------------------------------
916   !!   Default option       Dummy Module             No SI3 sea-ice model
917   !!----------------------------------------------------------------------
918#endif
919
920   !!======================================================================
921END MODULE icethd_zdf_BL99
Note: See TracBrowser for help on using the repository browser.