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/UKMO/NEMO_4.0.1_remove_isnow_cond/src/ICE – NEMO

source: NEMO/branches/UKMO/NEMO_4.0.1_remove_isnow_cond/src/ICE/icethd_zdf_bl99.F90 @ 12660

Last change on this file since 12660 was 12307, checked in by dancopsey, 5 years ago

Remove the loop that contains the code that is causing the problem.

File size: 43.9 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) ::   zraext_s  =  10._wp       ! extinction coefficient of radiation in the snow
93      REAL(wp) ::   zkimin    =  0.10_wp      ! minimum ice thermal conductivity
94      REAL(wp) ::   ztsu_err  =  1.e-5_wp     ! range around which t_su is considered at 0C
95      REAL(wp) ::   zdti_bnd  =  1.e-4_wp     ! maximal authorized error on temperature
96      REAL(wp) ::   zhs_min   =  0.01_wp      ! minimum snow thickness for conductivity calculation
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      REAL(wp) ::   zfac                      ! dummy factor
102      !
103      REAL(wp), DIMENSION(jpij) ::   isnow        ! switch for presence (1) or absence (0) of snow
104      REAL(wp), DIMENSION(jpij) ::   ztsub        ! surface temperature at previous iteration
105      REAL(wp), DIMENSION(jpij) ::   zh_i, z1_h_i ! ice layer thickness
106      REAL(wp), DIMENSION(jpij) ::   zh_s, z1_h_s ! snow layer thickness
107      REAL(wp), DIMENSION(jpij) ::   zqns_ice_b   ! solar radiation absorbed at the surface
108      REAL(wp), DIMENSION(jpij) ::   zfnet        ! surface flux function
109      REAL(wp), DIMENSION(jpij) ::   zdqns_ice_b  ! derivative of the surface flux function
110      !
111      REAL(wp), DIMENSION(jpij       )     ::   ztsuold     ! Old surface temperature in the ice
112      REAL(wp), DIMENSION(jpij,nlay_i)     ::   ztiold      ! Old temperature in the ice
113      REAL(wp), DIMENSION(jpij,nlay_s)     ::   ztsold      ! Old temperature in the snow
114      REAL(wp), DIMENSION(jpij,nlay_i)     ::   ztib        ! Temporary temperature in the ice to check the convergence
115      REAL(wp), DIMENSION(jpij,nlay_s)     ::   ztsb        ! Temporary temperature in the snow to check the convergence
116      REAL(wp), DIMENSION(jpij,0:nlay_i)   ::   ztcond_i    ! Ice thermal conductivity
117      REAL(wp), DIMENSION(jpij,0:nlay_i)   ::   ztcond_i_cp ! copy
118      REAL(wp), DIMENSION(jpij,0:nlay_i)   ::   zradtr_i    ! Radiation transmitted through the ice
119      REAL(wp), DIMENSION(jpij,0:nlay_i)   ::   zradab_i    ! Radiation absorbed in the ice
120      REAL(wp), DIMENSION(jpij,0:nlay_i)   ::   zkappa_i    ! Kappa factor in the ice
121      REAL(wp), DIMENSION(jpij,0:nlay_i)   ::   zeta_i      ! Eta factor in the ice
122      REAL(wp), DIMENSION(jpij,0:nlay_s)   ::   zradtr_s    ! Radiation transmited through the snow
123      REAL(wp), DIMENSION(jpij,0:nlay_s)   ::   zradab_s    ! Radiation absorbed in the snow
124      REAL(wp), DIMENSION(jpij,0:nlay_s)   ::   zkappa_s    ! Kappa factor in the snow
125      REAL(wp), DIMENSION(jpij,0:nlay_s)   ::   zeta_s      ! Eta factor in the snow
126      REAL(wp), DIMENSION(jpij,nlay_i+3)   ::   zindterm    ! 'Ind'ependent term
127      REAL(wp), DIMENSION(jpij,nlay_i+3)   ::   zindtbis    ! Temporary 'ind'ependent term
128      REAL(wp), DIMENSION(jpij,nlay_i+3)   ::   zdiagbis    ! Temporary 'dia'gonal term
129      REAL(wp), DIMENSION(jpij,nlay_i+3,3) ::   ztrid       ! Tridiagonal system terms
130      REAL(wp), DIMENSION(jpij)            ::   zq_ini      ! diag errors on heat
131      REAL(wp), DIMENSION(jpij)            ::   zghe        ! G(he), th. conduct enhancement factor, mono-cat
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      !------------------
146      ! 1) Initialization
147      !------------------
148      DO ji = 1, npti
149         isnow(ji) = 1._wp - MAX( 0._wp , SIGN(1._wp, - h_s_1d(ji) ) )  ! is there snow or not
150         ! layer thickness
151         zh_i(ji) = h_i_1d(ji) * r1_nlay_i
152         zh_s(ji) = h_s_1d(ji) * r1_nlay_s
153      END DO
154      !
155      WHERE( zh_i(1:npti) >= epsi10 )   ;   z1_h_i(1:npti) = 1._wp / zh_i(1:npti)
156      ELSEWHERE                         ;   z1_h_i(1:npti) = 0._wp
157      END WHERE
158      !
159      WHERE( zh_s(1:npti) > 0._wp   )       zh_s(1:npti) = MAX( zhs_min * r1_nlay_s, zh_s(1:npti) )
160      !
161      WHERE( zh_s(1:npti) > 0._wp   )   ;   z1_h_s(1:npti) = 1._wp / zh_s(1:npti)
162      ELSEWHERE                         ;   z1_h_s(1:npti) = 0._wp
163      END WHERE
164      !
165      ! Store initial temperatures and non solar heat fluxes
166      IF( k_cnd == np_cnd_OFF .OR. k_cnd == np_cnd_EMU ) THEN
167         !
168         ztsub      (1:npti) = t_su_1d(1:npti)                          ! surface temperature at iteration n-1
169         ztsuold    (1:npti) = t_su_1d(1:npti)                          ! surface temperature initial value
170         t_su_1d    (1:npti) = MIN( t_su_1d(1:npti), rt0 - ztsu_err )   ! required to leave the choice between melting or not
171         zdqns_ice_b(1:npti) = dqns_ice_1d(1:npti)                      ! derivative of incoming nonsolar flux
172         zqns_ice_b (1:npti) = qns_ice_1d(1:npti)                       ! store previous qns_ice_1d value
173         !
174      ENDIF
175      !
176      ztsold (1:npti,:) = t_s_1d(1:npti,:)   ! Old snow temperature
177      ztiold (1:npti,:) = t_i_1d(1:npti,:)   ! Old ice temperature
178
179      !-------------
180      ! 2) Radiation
181      !-------------
182      ! --- Transmission/absorption of solar radiation in the ice --- !
183      zradtr_s(1:npti,0) = qtr_ice_top_1d(1:npti)
184      DO jk = 1, nlay_s
185         DO ji = 1, npti
186            !                             ! radiation transmitted below the layer-th snow layer
187            zradtr_s(ji,jk) = zradtr_s(ji,0) * EXP( - zraext_s * h_s_1d(ji) * r1_nlay_s * REAL(jk) )
188            !                             ! radiation absorbed by the layer-th snow layer
189            zradab_s(ji,jk) = zradtr_s(ji,jk-1) - zradtr_s(ji,jk)
190         END DO
191      END DO
192      !
193      zradtr_i(1:npti,0) = zradtr_s(1:npti,nlay_s) * isnow(1:npti) + qtr_ice_top_1d(1:npti) * ( 1._wp - isnow(1:npti) )
194      DO jk = 1, nlay_i 
195         DO ji = 1, npti
196            !                             ! radiation transmitted below the layer-th ice layer
197            zradtr_i(ji,jk) = zradtr_i(ji,0) * EXP( - rn_kappa_i * zh_i(ji) * REAL(jk) )
198            !                             ! radiation absorbed by the layer-th ice layer
199            zradab_i(ji,jk) = zradtr_i(ji,jk-1) - zradtr_i(ji,jk)
200         END DO
201      END DO
202      !
203      qtr_ice_bot_1d(1:npti) = zradtr_i(1:npti,nlay_i)   ! record radiation transmitted below the ice
204      !
205      iconv    = 0          ! number of iterations
206      !
207      l_T_converged(:) = .FALSE.
208      ! Convergence calculated until all sub-domain grid points have converged
209      ! Calculations keep going for all grid points until sub-domain convergence (vectorisation optimisation)
210      ! but values are not taken into account (results independant of MPI partitioning)
211      !
212      !                                                                            !============================!
213      DO WHILE ( ( .NOT. ALL (l_T_converged(1:npti)) ) .AND. iconv < iconv_max )   ! Iterative procedure begins !
214         !                                                                         !============================!
215         iconv = iconv + 1
216         !
217         ztib(1:npti,:) = t_i_1d(1:npti,:)
218         ztsb(1:npti,:) = t_s_1d(1:npti,:)
219         !
220         !--------------------------------
221         ! 3) Sea ice thermal conductivity
222         !--------------------------------
223         IF( ln_cndi_U64 ) THEN         !-- Untersteiner (1964) formula: k = k0 + beta.S/T
224            !
225            DO ji = 1, npti
226               ztcond_i_cp(ji,0)      = rcnd_i + zbeta * sz_i_1d(ji,1)      / MIN( -epsi10, t_i_1d(ji,1) - rt0 )
227               ztcond_i_cp(ji,nlay_i) = rcnd_i + zbeta * sz_i_1d(ji,nlay_i) / MIN( -epsi10, t_bo_1d(ji)  - rt0 )
228            END DO
229            DO jk = 1, nlay_i-1
230               DO ji = 1, npti
231                  ztcond_i_cp(ji,jk) = rcnd_i + zbeta * 0.5_wp * ( sz_i_1d(ji,jk) + sz_i_1d(ji,jk+1) ) /  &
232                     &                         MIN( -epsi10, 0.5_wp * (t_i_1d(ji,jk) + t_i_1d(ji,jk+1)) - rt0 )
233               END DO
234            END DO
235            !
236         ELSEIF( ln_cndi_P07 ) THEN     !-- Pringle et al formula: k = k0 + beta1.S/T - beta2.T
237            !
238            DO ji = 1, npti
239               ztcond_i_cp(ji,0)      = rcnd_i + 0.09_wp  *  sz_i_1d(ji,1)      / MIN( -epsi10, t_i_1d(ji,1) - rt0 )  &
240                  &                           - 0.011_wp * ( t_i_1d(ji,1) - rt0 )
241               ztcond_i_cp(ji,nlay_i) = rcnd_i + 0.09_wp  *  sz_i_1d(ji,nlay_i) / MIN( -epsi10, t_bo_1d(ji)  - rt0 )  &
242                  &                           - 0.011_wp * ( t_bo_1d(ji) - rt0 )
243            END DO
244            DO jk = 1, nlay_i-1
245               DO ji = 1, npti
246                  ztcond_i_cp(ji,jk) = rcnd_i + 0.09_wp  *   0.5_wp * ( sz_i_1d(ji,jk) + sz_i_1d(ji,jk+1) ) /        &
247                     &                        MIN( -epsi10, 0.5_wp * ( t_i_1d (ji,jk) + t_i_1d (ji,jk+1) ) - rt0 )  &
248                     &                       - 0.011_wp * ( 0.5_wp * ( t_i_1d (ji,jk) + t_i_1d (ji,jk+1) ) - rt0 )
249               END DO
250            END DO
251            !
252         ENDIF
253
254         ! Variable used after iterations
255         ! Value must be frozen after convergence for MPP independance reason
256         DO ji = 1, npti
257            IF ( .NOT. l_T_converged(ji) ) &
258               ztcond_i(ji,:) = MAX( zkimin, ztcond_i_cp(ji,:) )       
259         END DO
260         !
261         !--- G(he) : enhancement of thermal conductivity in mono-category case
262         ! Computation of effective thermal conductivity G(h)
263         ! Used in mono-category case only to simulate an ITD implicitly
264         ! Fichefet and Morales Maqueda, JGR 1997
265         zghe(1:npti) = 1._wp
266         !
267         IF( ln_virtual_itd ) THEN
268            !
269            zepsilon = 0.1_wp
270            DO ji = 1, npti
271               zcnd_i = SUM( ztcond_i(ji,:) ) / REAL( nlay_i+1, wp )                                ! Mean sea ice thermal conductivity
272               zhe = ( rn_cnd_s * h_i_1d(ji) + zcnd_i * h_s_1d(ji) ) / ( rn_cnd_s + zcnd_i )        ! Effective thickness he (zhe)
273               IF( zhe >=  zepsilon * 0.5_wp * EXP(1._wp) )  &
274                  &   zghe(ji) = MIN( 2._wp, 0.5_wp * ( 1._wp + LOG( 2._wp * zhe / zepsilon ) ) )   ! G(he)
275            END DO
276            !
277         ENDIF
278         !
279         !-----------------
280         ! 4) kappa factors
281         !-----------------
282         !--- Snow
283         ! Variable used after iterations
284         ! Value must be frozen after convergence for MPP independance reason
285         DO jk = 0, nlay_s-1
286            DO ji = 1, npti
287               IF ( .NOT. l_T_converged(ji) ) &
288                  zkappa_s(ji,jk) = zghe(ji) * rn_cnd_s * z1_h_s(ji)
289            END DO
290         END DO
291         DO ji = 1, npti   ! Snow-ice interface
292            IF ( .NOT. l_T_converged(ji) ) THEN
293               zfac = 0.5_wp * ( ztcond_i(ji,0) * zh_s(ji) + rn_cnd_s * zh_i(ji) )
294               IF( zfac > epsi10 ) THEN
295                  zkappa_s(ji,nlay_s) = zghe(ji) * rn_cnd_s * ztcond_i(ji,0) / zfac
296               ELSE
297                  zkappa_s(ji,nlay_s) = 0._wp
298               ENDIF
299            ENDIF
300         END DO
301
302         !--- Ice
303         ! Variable used after iterations
304         ! Value must be frozen after convergence for MPP independance reason
305         DO jk = 0, nlay_i
306            DO ji = 1, npti
307               IF ( .NOT. l_T_converged(ji) ) &
308                  zkappa_i(ji,jk) = zghe(ji) * ztcond_i(ji,jk) * z1_h_i(ji)
309            END DO
310         END DO
311
312         !
313         !--------------------------------------
314         ! 5) Sea ice specific heat, eta factors
315         !--------------------------------------
316         DO jk = 1, nlay_i
317            DO ji = 1, npti
318               zcpi = rcpi + zgamma * sz_i_1d(ji,jk) / MAX( ( t_i_1d(ji,jk) - rt0 ) * ( ztiold(ji,jk) - rt0 ), epsi10 )
319               zeta_i(ji,jk) = rdt_ice * r1_rhoi * z1_h_i(ji) / MAX( epsi10, zcpi ) 
320            END DO
321         END DO
322
323         DO jk = 1, nlay_s
324            DO ji = 1, npti
325               zeta_s(ji,jk) = rdt_ice * r1_rhos * r1_rcpi * z1_h_s(ji)
326            END DO
327         END DO
328         !
329         !----------------------------------------!
330         !                                        !
331         !   Conduction flux is off or emulated   !
332         !                                        !
333         !----------------------------------------!
334         !
335         IF( k_cnd == np_cnd_OFF .OR. k_cnd == np_cnd_EMU ) THEN
336            !
337            ! ==> The original BL99 temperature computation is used
338            !       (with qsr_ice, qns_ice and dqns_ice as inputs)
339            !
340            !----------------------------
341            ! 6) surface flux computation
342            !----------------------------
343            ! update of the non solar flux according to the update in T_su
344            DO ji = 1, npti
345               ! Variable used after iterations
346               ! Value must be frozen after convergence for MPP independance reason
347               IF ( .NOT. l_T_converged(ji) ) &
348                  qns_ice_1d(ji) = qns_ice_1d(ji) + dqns_ice_1d(ji) * ( t_su_1d(ji) - ztsub(ji) )
349            END DO
350
351            DO ji = 1, npti
352               zfnet(ji) = qsr_ice_1d(ji) - qtr_ice_top_1d(ji) + qns_ice_1d(ji) ! net heat flux = net - transmitted solar + non solar
353            END DO
354            !
355            !----------------------------
356            ! 7) tridiagonal system terms
357            !----------------------------
358            ! layer denotes the number of the layer in the snow or in the ice
359            ! jm denotes the reference number of the equation in the tridiagonal
360            ! system, terms of tridiagonal system are indexed as following :
361            ! 1 is subdiagonal term, 2 is diagonal and 3 is superdiagonal one
362
363            ! ice interior terms (top equation has the same form as the others)
364            ztrid   (1:npti,:,:) = 0._wp
365            zindterm(1:npti,:)   = 0._wp
366            zindtbis(1:npti,:)   = 0._wp
367            zdiagbis(1:npti,:)   = 0._wp
368
369            DO jm = nlay_s + 2, nlay_s + nlay_i 
370               DO ji = 1, npti
371                  jk = jm - nlay_s - 1
372                  ztrid   (ji,jm,1) =       - zeta_i(ji,jk) *   zkappa_i(ji,jk-1)
373                  ztrid   (ji,jm,2) = 1._wp + zeta_i(ji,jk) * ( zkappa_i(ji,jk-1) + zkappa_i(ji,jk) )
374                  ztrid   (ji,jm,3) =       - zeta_i(ji,jk) *                       zkappa_i(ji,jk)
375                  zindterm(ji,jm)   = ztiold(ji,jk) + zeta_i(ji,jk) * zradab_i(ji,jk)
376               END DO
377            END DO
378
379            jm =  nlay_s + nlay_i + 1
380            DO ji = 1, npti
381               ! ice bottom term
382               ztrid   (ji,jm,1) =       - zeta_i(ji,nlay_i) *   zkappa_i(ji,nlay_i-1)   
383               ztrid   (ji,jm,2) = 1._wp + zeta_i(ji,nlay_i) * ( zkappa_i(ji,nlay_i-1) + zkappa_i(ji,nlay_i) * zg1 )
384               ztrid   (ji,jm,3) = 0._wp
385               zindterm(ji,jm)   = ztiold(ji,nlay_i) + zeta_i(ji,nlay_i) *  &
386                  &              ( zradab_i(ji,nlay_i) + zkappa_i(ji,nlay_i) * zg1 * t_bo_1d(ji) ) 
387            END DO
388
389            DO ji = 1, npti
390               !                               !---------------------!
391               IF( h_s_1d(ji) > 0._wp ) THEN   !  snow-covered cells !
392                  !                            !---------------------!
393                  ! snow interior terms (bottom equation has the same form as the others)
394                  DO jm = 3, nlay_s + 1
395                     jk = jm - 1
396                     ztrid   (ji,jm,1) =       - zeta_s(ji,jk) *   zkappa_s(ji,jk-1)
397                     ztrid   (ji,jm,2) = 1._wp + zeta_s(ji,jk) * ( zkappa_s(ji,jk-1) + zkappa_s(ji,jk) )
398                     ztrid   (ji,jm,3) =       - zeta_s(ji,jk) *                       zkappa_s(ji,jk)
399                     zindterm(ji,jm)   = ztsold(ji,jk) + zeta_s(ji,jk) * zradab_s(ji,jk)
400                  END DO
401                 
402                  ! case of only one layer in the ice (ice equation is altered)
403                  IF( nlay_i == 1 ) THEN
404                     ztrid   (ji,nlay_s+2,3) = 0._wp
405                     zindterm(ji,nlay_s+2)   = zindterm(ji,nlay_s+2) + zeta_i(ji,1) * zkappa_i(ji,1) * t_bo_1d(ji) 
406                  ENDIF
407                 
408                  IF( t_su_1d(ji) < rt0 ) THEN   !--  case 1 : no surface melting
409                     
410                     jm_min(ji) = 1
411                     jm_max(ji) = nlay_i + nlay_s + 1
412                     
413                     ! surface equation
414                     ztrid   (ji,1,1) = 0._wp
415                     ztrid   (ji,1,2) = zdqns_ice_b(ji) - zg1s * zkappa_s(ji,0)
416                     ztrid   (ji,1,3) =                   zg1s * zkappa_s(ji,0)
417                     zindterm(ji,1)   = zdqns_ice_b(ji) * t_su_1d(ji) - zfnet(ji)
418                     
419                     ! first layer of snow equation
420                     ztrid   (ji,2,1) =       - zeta_s(ji,1) *                    zkappa_s(ji,0) * zg1s
421                     ztrid   (ji,2,2) = 1._wp + zeta_s(ji,1) * ( zkappa_s(ji,1) + zkappa_s(ji,0) * zg1s )
422                     ztrid   (ji,2,3) =       - zeta_s(ji,1) *   zkappa_s(ji,1)
423                     zindterm(ji,2)   = ztsold(ji,1) + zeta_s(ji,1) * zradab_s(ji,1)
424                     
425                  ELSE                            !--  case 2 : surface is melting
426                     !
427                     jm_min(ji) = 2
428                     jm_max(ji) = nlay_i + nlay_s + 1
429                     
430                     ! first layer of snow equation
431                     ztrid   (ji,2,1) = 0._wp
432                     ztrid   (ji,2,2) = 1._wp + zeta_s(ji,1) * ( zkappa_s(ji,1) + zkappa_s(ji,0) * zg1s )
433                     ztrid   (ji,2,3) =       - zeta_s(ji,1) *   zkappa_s(ji,1) 
434                     zindterm(ji,2)   = ztsold(ji,1) + zeta_s(ji,1) * ( zradab_s(ji,1) + zkappa_s(ji,0) * zg1s * t_su_1d(ji) ) 
435                  ENDIF
436                  !                            !---------------------!
437               ELSE                            ! cells without snow  !
438                  !                            !---------------------!
439                  !
440                  IF( t_su_1d(ji) < rt0 ) THEN   !--  case 1 : no surface melting
441                     !
442                     jm_min(ji) = nlay_s + 1
443                     jm_max(ji) = nlay_i + nlay_s + 1
444                     
445                     ! surface equation   
446                     ztrid   (ji,jm_min(ji),1) = 0._wp
447                     ztrid   (ji,jm_min(ji),2) = zdqns_ice_b(ji) - zkappa_i(ji,0) * zg1   
448                     ztrid   (ji,jm_min(ji),3) =                   zkappa_i(ji,0) * zg1
449                     zindterm(ji,jm_min(ji))   = zdqns_ice_b(ji) * t_su_1d(ji) - zfnet(ji)
450                     
451                     ! first layer of ice equation
452                     ztrid   (ji,jm_min(ji)+1,1) =       - zeta_i(ji,1) *                    zkappa_i(ji,0) * zg1
453                     ztrid   (ji,jm_min(ji)+1,2) = 1._wp + zeta_i(ji,1) * ( zkappa_i(ji,1) + zkappa_i(ji,0) * zg1 )
454                     ztrid   (ji,jm_min(ji)+1,3) =       - zeta_i(ji,1) *   zkappa_i(ji,1) 
455                     zindterm(ji,jm_min(ji)+1)   = ztiold(ji,1) + zeta_i(ji,1) * zradab_i(ji,1) 
456                     
457                     ! case of only one layer in the ice (surface & ice equations are altered)
458                     IF( nlay_i == 1 ) THEN
459                        ztrid   (ji,jm_min(ji),1)   = 0._wp
460                        ztrid   (ji,jm_min(ji),2)   = zdqns_ice_b(ji)      -   zkappa_i(ji,0) * 2._wp
461                        ztrid   (ji,jm_min(ji),3)   =                          zkappa_i(ji,0) * 2._wp
462                        ztrid   (ji,jm_min(ji)+1,1) =       - zeta_i(ji,1) *   zkappa_i(ji,0) * 2._wp
463                        ztrid   (ji,jm_min(ji)+1,2) = 1._wp + zeta_i(ji,1) * ( zkappa_i(ji,0) * 2._wp + zkappa_i(ji,1) )
464                        ztrid   (ji,jm_min(ji)+1,3) = 0._wp
465                        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))
466                     ENDIF
467                     
468                  ELSE                            !--  case 2 : surface is melting
469                     
470                     jm_min(ji) = nlay_s + 2
471                     jm_max(ji) = nlay_i + nlay_s + 1
472                     
473                     ! first layer of ice equation
474                     ztrid   (ji,jm_min(ji),1) = 0._wp
475                     ztrid   (ji,jm_min(ji),2) = 1._wp + zeta_i(ji,1) * ( zkappa_i(ji,1) + zkappa_i(ji,0) * zg1 ) 
476                     ztrid   (ji,jm_min(ji),3) =       - zeta_i(ji,1) *   zkappa_i(ji,1)
477                     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)) 
478                     
479                     ! case of only one layer in the ice (surface & ice equations are altered)
480                     IF( nlay_i == 1 ) THEN
481                        ztrid   (ji,jm_min(ji),1) = 0._wp
482                        ztrid   (ji,jm_min(ji),2) = 1._wp + zeta_i(ji,1) * ( zkappa_i(ji,0) * 2._wp + zkappa_i(ji,1) )
483                        ztrid   (ji,jm_min(ji),3) = 0._wp
484                        zindterm(ji,jm_min(ji))   = ztiold(ji,1) + zeta_i(ji,1) * ( zradab_i(ji,1) + zkappa_i(ji,1) * t_bo_1d(ji) ) &
485                           &                      + t_su_1d(ji) * zeta_i(ji,1) * zkappa_i(ji,0) * 2._wp
486                     ENDIF
487                     
488                  ENDIF
489               ENDIF
490               !
491               zindtbis(ji,jm_min(ji)) = zindterm(ji,jm_min(ji))
492               zdiagbis(ji,jm_min(ji)) = ztrid   (ji,jm_min(ji),2)
493               !
494            END DO
495            !
496            !------------------------------
497            ! 8) tridiagonal system solving
498            !------------------------------
499            ! Solve the tridiagonal system with Gauss elimination method.
500            ! Thomas algorithm, from Computational fluid Dynamics, J.D. ANDERSON, McGraw-Hill 1984
501            jm_maxt = 0
502            jm_mint = nlay_i+5
503            DO ji = 1, npti
504               jm_mint = MIN(jm_min(ji),jm_mint)
505               jm_maxt = MAX(jm_max(ji),jm_maxt)
506            END DO
507
508            DO jk = jm_mint+1, jm_maxt
509               DO ji = 1, npti
510                  jm = MIN(MAX(jm_min(ji)+1,jk),jm_max(ji))
511                  zdiagbis(ji,jm) = ztrid   (ji,jm,2) - ztrid(ji,jm,1) * ztrid   (ji,jm-1,3) / zdiagbis(ji,jm-1)
512                  zindtbis(ji,jm) = zindterm(ji,jm  ) - ztrid(ji,jm,1) * zindtbis(ji,jm-1  ) / zdiagbis(ji,jm-1)
513               END DO
514            END DO
515
516            ! ice temperatures
517            DO ji = 1, npti
518               ! Variable used after iterations
519               ! Value must be frozen after convergence for MPP independance reason
520               IF ( .NOT. l_T_converged(ji) ) &
521                  t_i_1d(ji,nlay_i) = zindtbis(ji,jm_max(ji)) / zdiagbis(ji,jm_max(ji))
522            END DO
523
524            DO jm = nlay_i + nlay_s, nlay_s + 2, -1
525               DO ji = 1, npti
526                  jk = jm - nlay_s - 1
527                  IF ( .NOT. l_T_converged(ji) ) &
528                     t_i_1d(ji,jk) = ( zindtbis(ji,jm) - ztrid(ji,jm,3) * t_i_1d(ji,jk+1) ) / zdiagbis(ji,jm)
529               END DO
530            END DO
531
532            DO ji = 1, npti
533               ! Variables used after iterations
534               ! Value must be frozen after convergence for MPP independance reason
535               IF ( .NOT. l_T_converged(ji) ) THEN
536                  ! snow temperatures     
537                  IF( h_s_1d(ji) > 0._wp ) THEN
538                     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)
539                  ENDIF
540                  ! surface temperature
541                  ztsub(ji) = t_su_1d(ji)
542                  IF( t_su_1d(ji) < rt0 ) THEN
543                     t_su_1d(ji) = ( zindtbis(ji,jm_min(ji)) - ztrid(ji,jm_min(ji),3) *  &
544                        &          ( isnow(ji) * t_s_1d(ji,1) + ( 1._wp - isnow(ji) ) * t_i_1d(ji,1) ) ) / zdiagbis(ji,jm_min(ji))
545                  ENDIF
546               ENDIF
547            END DO
548            !
549            !--------------------------------------------------------------
550            ! 9) Has the scheme converged?, end of the iterative procedure
551            !--------------------------------------------------------------
552            ! check that nowhere it has started to melt
553            ! zdti_max is a measure of error, it has to be under zdti_bnd
554
555            DO ji = 1, npti
556
557               zdti_max = 0._wp
558
559               IF ( .NOT. l_T_converged(ji) ) THEN
560                  t_su_1d(ji) = MAX( MIN( t_su_1d(ji) , rt0 ) , rt0 - 100._wp )
561                  zdti_max    = MAX( zdti_max, ABS( t_su_1d(ji) - ztsub(ji) ) )
562
563                  t_s_1d(ji,1:nlay_s) = MAX( MIN( t_s_1d(ji,1:nlay_s), rt0 ), rt0 - 100._wp )
564                  zdti_max = MAX ( zdti_max , MAXVAL( ABS( t_s_1d(ji,1:nlay_s) - ztsb(ji,1:nlay_s) ) ) )
565
566                  DO jk = 1, nlay_i
567                     ztmelts       = -rTmlt * sz_i_1d(ji,jk) + rt0
568                     t_i_1d(ji,jk) =  MAX( MIN( t_i_1d(ji,jk), ztmelts ), rt0 - 100._wp )
569                     zdti_max      =  MAX( zdti_max, ABS( t_i_1d(ji,jk) - ztib(ji,jk) ) )
570                  END DO
571
572                  IF ( zdti_max < zdti_bnd ) l_T_converged(ji) = .TRUE.
573
574               ENDIF
575
576            END DO
577
578         !----------------------------------------!
579         !                                        !
580         !      Conduction flux is on             !
581         !                                        !
582         !----------------------------------------!
583         !
584         ELSEIF( k_cnd == np_cnd_ON ) THEN
585            !
586            ! ==> we use a modified BL99 solver with conduction flux (qcn_ice) as forcing term
587            !
588            !----------------------------
589            ! 7) tridiagonal system terms
590            !----------------------------
591            ! layer denotes the number of the layer in the snow or in the ice
592            ! jm denotes the reference number of the equation in the tridiagonal
593            ! system, terms of tridiagonal system are indexed as following :
594            ! 1 is subdiagonal term, 2 is diagonal and 3 is superdiagonal one
595
596            ! ice interior terms (top equation has the same form as the others)
597            ztrid   (1:npti,:,:) = 0._wp
598            zindterm(1:npti,:)   = 0._wp
599            zindtbis(1:npti,:)   = 0._wp
600            zdiagbis(1:npti,:)   = 0._wp
601
602            DO jm = nlay_s + 2, nlay_s + nlay_i 
603               DO ji = 1, npti
604                  jk = jm - nlay_s - 1
605                  ztrid   (ji,jm,1) =       - zeta_i(ji,jk) *   zkappa_i(ji,jk-1)
606                  ztrid   (ji,jm,2) = 1._wp + zeta_i(ji,jk) * ( zkappa_i(ji,jk-1) + zkappa_i(ji,jk) )
607                  ztrid   (ji,jm,3) =       - zeta_i(ji,jk) *                       zkappa_i(ji,jk)
608                  zindterm(ji,jm)   = ztiold(ji,jk) + zeta_i(ji,jk) * zradab_i(ji,jk)
609               END DO
610            ENDDO
611
612            jm =  nlay_s + nlay_i + 1
613            DO ji = 1, npti
614               ! ice bottom term
615               ztrid   (ji,jm,1) =       - zeta_i(ji,nlay_i) *   zkappa_i(ji,nlay_i-1)   
616               ztrid   (ji,jm,2) = 1._wp + zeta_i(ji,nlay_i) * ( zkappa_i(ji,nlay_i-1) + zkappa_i(ji,nlay_i) * zg1 )
617               ztrid   (ji,jm,3) = 0._wp
618               zindterm(ji,jm)   = ztiold(ji,nlay_i) + zeta_i(ji,nlay_i) *  &
619                  &              ( zradab_i(ji,nlay_i) + zkappa_i(ji,nlay_i) * zg1 * t_bo_1d(ji) ) 
620            ENDDO
621
622            DO ji = 1, npti
623               !                               !---------------------!
624               IF( h_s_1d(ji) > 0._wp ) THEN   !  snow-covered cells !
625                  !                            !---------------------!
626                  ! snow interior terms (bottom equation has the same form as the others)
627                  DO jm = 3, nlay_s + 1
628                     jk = jm - 1
629                     ztrid   (ji,jm,1) =       - zeta_s(ji,jk) *   zkappa_s(ji,jk-1)
630                     ztrid   (ji,jm,2) = 1._wp + zeta_s(ji,jk) * ( zkappa_s(ji,jk-1) + zkappa_s(ji,jk) )
631                     ztrid   (ji,jm,3) =       - zeta_s(ji,jk) *                       zkappa_s(ji,jk)
632                     zindterm(ji,jm)   = ztsold(ji,jk) + zeta_s(ji,jk) * zradab_s(ji,jk)
633                  END DO
634                 
635                  ! case of only one layer in the ice (ice equation is altered)
636                  IF ( nlay_i == 1 ) THEN
637                     ztrid   (ji,nlay_s+2,3) = 0._wp
638                     zindterm(ji,nlay_s+2)   = zindterm(ji,nlay_s+2) + zeta_i(ji,1) * zkappa_i(ji,1) * t_bo_1d(ji) 
639                  ENDIF
640                 
641                  jm_min(ji) = 2
642                  jm_max(ji) = nlay_i + nlay_s + 1
643                 
644                  ! first layer of snow equation
645                  ztrid   (ji,2,1) = 0._wp
646                  ztrid   (ji,2,2) = 1._wp + zeta_s(ji,1) * zkappa_s(ji,1)
647                  ztrid   (ji,2,3) =       - zeta_s(ji,1) * zkappa_s(ji,1) 
648                  zindterm(ji,2)   = ztsold(ji,1) + zeta_s(ji,1) * ( zradab_s(ji,1) + qcn_ice_1d(ji) ) 
649                 
650                  !                            !---------------------!
651               ELSE                            ! cells without snow  !
652                  !                            !---------------------!
653                  jm_min(ji) = nlay_s + 2
654                  jm_max(ji) = nlay_i + nlay_s + 1
655                 
656                  ! first layer of ice equation
657                  ztrid   (ji,jm_min(ji),1) = 0._wp
658                  ztrid   (ji,jm_min(ji),2) = 1._wp + zeta_i(ji,1) * zkappa_i(ji,1) 
659                  ztrid   (ji,jm_min(ji),3) =       - zeta_i(ji,1) * zkappa_i(ji,1)
660                  zindterm(ji,jm_min(ji))   = ztiold(ji,1) + zeta_i(ji,1) * ( zradab_i(ji,1) + qcn_ice_1d(ji) )
661                 
662                  ! case of only one layer in the ice (surface & ice equations are altered)
663                  IF( nlay_i == 1 ) THEN
664                     ztrid   (ji,jm_min(ji),1) = 0._wp
665                     ztrid   (ji,jm_min(ji),2) = 1._wp + zeta_i(ji,1) * zkappa_i(ji,1)
666                     ztrid   (ji,jm_min(ji),3) = 0._wp
667                     zindterm(ji,jm_min(ji))   = ztiold(ji,1) + zeta_i(ji,1) *  &
668                        &                                     ( zradab_i(ji,1) + zkappa_i(ji,1) * t_bo_1d(ji) + qcn_ice_1d(ji) )
669                  ENDIF
670                 
671               ENDIF
672               !
673               zindtbis(ji,jm_min(ji)) = zindterm(ji,jm_min(ji))
674               zdiagbis(ji,jm_min(ji)) = ztrid   (ji,jm_min(ji),2)
675               !
676            END DO
677            !
678            !------------------------------
679            ! 8) tridiagonal system solving
680            !------------------------------
681            ! Solve the tridiagonal system with Gauss elimination method.
682            ! Thomas algorithm, from Computational fluid Dynamics, J.D. ANDERSON, McGraw-Hill 1984
683            jm_maxt = 0
684            jm_mint = nlay_i+5
685            DO ji = 1, npti
686               jm_mint = MIN(jm_min(ji),jm_mint)
687               jm_maxt = MAX(jm_max(ji),jm_maxt)
688            END DO
689           
690            DO jk = jm_mint+1, jm_maxt
691               DO ji = 1, npti
692                  jm = MIN(MAX(jm_min(ji)+1,jk),jm_max(ji))
693                  zdiagbis(ji,jm) = ztrid   (ji,jm,2) - ztrid(ji,jm,1) * ztrid   (ji,jm-1,3) / zdiagbis(ji,jm-1)
694                  zindtbis(ji,jm) = zindterm(ji,jm)   - ztrid(ji,jm,1) * zindtbis(ji,jm-1)   / zdiagbis(ji,jm-1)
695               END DO
696            END DO
697           
698            ! ice temperatures
699            DO ji = 1, npti
700               ! Variable used after iterations
701               ! Value must be frozen after convergence for MPP independance reason
702               IF ( .NOT. l_T_converged(ji) ) &
703                  t_i_1d(ji,nlay_i) = zindtbis(ji,jm_max(ji)) / zdiagbis(ji,jm_max(ji))
704            END DO
705
706            DO jm = nlay_i + nlay_s, nlay_s + 2, -1
707               DO ji = 1, npti
708                  IF ( .NOT. l_T_converged(ji) ) THEN
709                     jk = jm - nlay_s - 1
710                     t_i_1d(ji,jk) = ( zindtbis(ji,jm) - ztrid(ji,jm,3) * t_i_1d(ji,jk+1) ) / zdiagbis(ji,jm)
711                  ENDIF
712               END DO
713            END DO
714           
715            ! snow 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) ) THEN
720                  IF( h_s_1d(ji) > 0._wp ) THEN
721                     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)
722                  ENDIF
723               ENDIF
724            END DO
725            !
726            !--------------------------------------------------------------
727            ! 9) Has the scheme converged?, end of the iterative procedure
728            !--------------------------------------------------------------
729            ! check that nowhere it has started to melt
730            ! zdti_max is a measure of error, it has to be under zdti_bnd
731
732            DO ji = 1, npti
733
734               zdti_max = 0._wp
735
736               IF ( .NOT. l_T_converged(ji) ) THEN
737                  ! t_s
738                  t_s_1d(ji,1:nlay_s) = MAX( MIN( t_s_1d(ji,1:nlay_s), rt0 ), rt0 - 100._wp )
739                  zdti_max = MAX ( zdti_max , MAXVAL( ABS( t_s_1d(ji,1:nlay_s) - ztsb(ji,1:nlay_s) ) ) )
740                  ! t_i
741                  DO jk = 1, nlay_i
742                     ztmelts       = -rTmlt * sz_i_1d(ji,jk) + rt0 
743                     t_i_1d(ji,jk) =  MAX( MIN( t_i_1d(ji,jk), ztmelts ), rt0 - 100._wp )
744                     zdti_max      =  MAX ( zdti_max, ABS( t_i_1d(ji,jk) - ztib(ji,jk) ) )
745                  END DO
746
747                  IF ( zdti_max < zdti_bnd ) l_T_converged(ji) = .TRUE.
748
749               ENDIF
750
751            END DO
752
753         ENDIF ! k_cnd
754         
755      END DO  ! End of the do while iterative procedure
756     
757      IF( ln_icectl .AND. lwp ) THEN
758         WRITE(numout,*) ' zdti_max : ', zdti_max
759         WRITE(numout,*) ' iconv    : ', iconv
760      ENDIF
761     
762      !
763      !-----------------------------
764      ! 10) Fluxes at the interfaces
765      !-----------------------------
766      !
767      ! --- calculate conduction fluxes (positive downward)
768
769      DO ji = 1, npti
770         !                                ! surface ice conduction flux
771         qcn_ice_top_1d(ji) =  -           isnow(ji)   * zkappa_s(ji,0)      * zg1s * ( t_s_1d(ji,1) - t_su_1d(ji) )  &
772            &                  - ( 1._wp - isnow(ji) ) * zkappa_i(ji,0)      * zg1  * ( t_i_1d(ji,1) - t_su_1d(ji) )
773         !                                ! bottom ice conduction flux
774         qcn_ice_bot_1d(ji) =                          - zkappa_i(ji,nlay_i) * zg1  * ( t_bo_1d(ji ) - t_i_1d (ji,nlay_i) )
775      END DO
776     
777      !
778      ! --- Diagnose the heat loss due to changing non-solar / conduction flux --- !
779      !
780      IF( k_cnd == np_cnd_OFF .OR. k_cnd == np_cnd_EMU ) THEN
781         !
782         DO ji = 1, npti
783            hfx_err_dif_1d(ji) = hfx_err_dif_1d(ji) - ( qns_ice_1d(ji) - zqns_ice_b(ji) ) * a_i_1d(ji) 
784         END DO
785         !
786      ELSEIF( k_cnd == np_cnd_ON ) THEN
787         !
788         DO ji = 1, npti
789            hfx_err_dif_1d(ji) = hfx_err_dif_1d(ji) - ( qcn_ice_top_1d(ji) - qcn_ice_1d(ji) ) * a_i_1d(ji) 
790         END DO
791         !
792      ENDIF
793     
794      !
795      ! --- Diagnose the heat loss due to non-fully converged temperature solution (should not be above 10-4 W-m2) --- !
796      !
797      IF( k_cnd == np_cnd_OFF .OR. k_cnd == np_cnd_ON ) THEN
798         
799         CALL ice_var_enthalpy       
800         
801         ! zhfx_err = correction on the diagnosed heat flux due to non-convergence of the algorithm used to solve heat equation
802         DO ji = 1, npti
803            zdq = - zq_ini(ji) + ( SUM( e_i_1d(ji,1:nlay_i) ) * h_i_1d(ji) * r1_nlay_i +  &
804               &                   SUM( e_s_1d(ji,1:nlay_s) ) * h_s_1d(ji) * r1_nlay_s )
805           
806            IF( k_cnd == np_cnd_OFF ) THEN
807               
808               IF( t_su_1d(ji) < rt0 ) THEN  ! case T_su < 0degC
809                  zhfx_err = ( qns_ice_1d(ji)     + qsr_ice_1d(ji)     - zradtr_i(ji,nlay_i) - qcn_ice_bot_1d(ji)  &
810                     &       + zdq * r1_rdtice ) * a_i_1d(ji)
811               ELSE                          ! case T_su = 0degC
812                  zhfx_err = ( qcn_ice_top_1d(ji) + qtr_ice_top_1d(ji) - zradtr_i(ji,nlay_i) - qcn_ice_bot_1d(ji)  &
813                     &       + zdq * r1_rdtice ) * a_i_1d(ji)
814               ENDIF
815               
816            ELSEIF( k_cnd == np_cnd_ON ) THEN
817           
818               zhfx_err    = ( qcn_ice_top_1d(ji) + qtr_ice_top_1d(ji) - zradtr_i(ji,nlay_i) - qcn_ice_bot_1d(ji)  &
819                  &          + zdq * r1_rdtice ) * a_i_1d(ji)
820           
821            ENDIF
822            !
823            ! total heat sink to be sent to the ocean
824            hfx_err_dif_1d(ji) = hfx_err_dif_1d(ji) + zhfx_err
825            !
826            ! hfx_dif = Heat flux diagnostic of sensible heat used to warm/cool ice in W.m-2   
827            hfx_dif_1d(ji) = hfx_dif_1d(ji) - zdq * r1_rdtice * a_i_1d(ji)
828            !
829         END DO
830         !
831      ENDIF
832      !
833      !--------------------------------------------------------------------
834      ! 11) reset inner snow and ice temperatures, update conduction fluxes
835      !--------------------------------------------------------------------
836      ! effective conductivity and 1st layer temperature (needed by Met Office)
837      DO ji = 1, npti
838         IF( h_s_1d(ji) > 0.1_wp ) THEN
839            cnd_ice_1d(ji) = 2._wp * zkappa_s(ji,0)
840         ELSE
841            IF( h_i_1d(ji) > 0.1_wp ) THEN
842               cnd_ice_1d(ji) = 2._wp * zkappa_i(ji,0)
843            ELSE
844               cnd_ice_1d(ji) = 2._wp * ztcond_i(ji,0) * 10._wp
845            ENDIF
846         ENDIF
847         t1_ice_1d(ji) = isnow(ji) * t_s_1d(ji,1) + ( 1._wp - isnow(ji) ) * t_i_1d(ji,1)
848      END DO
849      !
850      IF( k_cnd == np_cnd_EMU ) THEN
851         ! Restore temperatures to their initial values
852         t_s_1d    (1:npti,:) = ztsold        (1:npti,:)
853         t_i_1d    (1:npti,:) = ztiold        (1:npti,:)
854         qcn_ice_1d(1:npti)   = qcn_ice_top_1d(1:npti)
855
856         !!clem
857         ! remettre t_su_1d, qns_ice_1d et dqns_ice_1d comme avant puisqu'on devrait faire comme si on avant conduction = input
858         !clem
859      ENDIF
860      !
861      ! --- SIMIP diagnostics
862      !
863      DO ji = 1, npti         
864         !--- Snow-ice interfacial temperature (diagnostic SIMIP)
865         zfac = rn_cnd_s * zh_i(ji) + ztcond_i(ji,1) * zh_s(ji)
866         IF( h_s_1d(ji) >= zhs_min ) THEN
867            t_si_1d(ji) = ( rn_cnd_s       * zh_i(ji) * t_s_1d(ji,1) +   &
868               &            ztcond_i(ji,1) * zh_s(ji) * t_i_1d(ji,1) ) / MAX( epsi10, zfac )
869         ELSE
870            t_si_1d(ji) = t_su_1d(ji)
871         ENDIF
872      END DO
873      !
874   END SUBROUTINE ice_thd_zdf_BL99
875
876#else
877   !!----------------------------------------------------------------------
878   !!   Default option       Dummy Module             No SI3 sea-ice model
879   !!----------------------------------------------------------------------
880#endif
881
882   !!======================================================================
883END MODULE icethd_zdf_BL99
Note: See TracBrowser for help on using the repository browser.