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 branches/2017/dev_merge_2017/NEMOGCM/NEMO/LIM_SRC_3 – NEMO

source: branches/2017/dev_merge_2017/NEMOGCM/NEMO/LIM_SRC_3/icethd_zdf_bl99.F90 @ 9423

Last change on this file since 9423 was 9423, checked in by clem, 6 years ago

small correction for the temperature diffusion when snow thickness is small

File size: 42.4 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 :  LIM  ! 02-2003 (M. Vancoppenolle) original 1D code
7   !!                 ! 06-2005 (M. Vancoppenolle) 3d version
8   !!                 ! 11-2006 (X Fettweis) Vectorization by Xavier
9   !!                 ! 04-2007 (M. Vancoppenolle) Energy conservation
10   !!            4.0  ! 2011-02 (G. Madec) dynamical allocation
11   !!             -   ! 2012-05 (C. Rousset) add penetration solar flux
12   !!----------------------------------------------------------------------
13#if defined key_lim3
14   !!----------------------------------------------------------------------
15   !!   'key_lim3'                                       ESIM sea-ice model
16   !!----------------------------------------------------------------------
17   !!  ice_thd_zdf_BL99 : vertical diffusion computation
18   !!----------------------------------------------------------------------
19   USE dom_oce        ! ocean space and time domain
20   USE phycst         ! physical constants (ocean directory)
21   USE ice            ! sea-ice: variables
22   USE ice1D          ! sea-ice: thermodynamics variables
23   USE icevar         ! sea-ice: operations
24   !
25   USE in_out_manager ! I/O manager
26   USE lib_mpp        ! MPP library
27   USE lib_fortran    ! fortran utilities (glob_sum + no signed zero)
28
29   IMPLICIT NONE
30   PRIVATE
31
32   PUBLIC   ice_thd_zdf_BL99   ! called by icethd_zdf
33
34   !!----------------------------------------------------------------------
35   !! NEMO/ICE 4.0 , NEMO Consortium (2017)
36   !! $Id: icethd_zdf.F90 8420 2017-08-08 12:18:46Z clem $
37   !! Software governed by the CeCILL licence     (NEMOGCM/NEMO_CeCILL.txt)
38   !!----------------------------------------------------------------------
39CONTAINS
40
41   SUBROUTINE ice_thd_zdf_BL99( k_jules )
42      !!-------------------------------------------------------------------
43      !!                ***  ROUTINE ice_thd_zdf_BL99  ***
44      !!
45      !! ** Purpose : computes the time evolution of snow and sea-ice temperature
46      !!              profiles, using the original Bitz and Lipscomb (1999) algorithm
47      !!
48      !! ** Method  : solves the heat equation diffusion with a Neumann boundary
49      !!              condition at the surface and a Dirichlet one at the bottom.
50      !!              Solar radiation is partially absorbed into the ice.
51      !!              The specific heat and thermal conductivities depend on ice
52      !!              salinity and temperature to take into account brine pocket   
53      !!              melting. The numerical scheme is an iterative Crank-Nicolson
54      !!              on a non-uniform multilayer grid in the ice and snow system.
55      !!
56      !!           The successive steps of this routine are
57      !!           1.  initialization of ice-snow layers thicknesses
58      !!           2.  Internal absorbed and transmitted radiation
59      !!           Then iterative procedure begins
60      !!           3.  Thermal conductivity
61      !!           4.  Kappa factors
62      !!           5.  specific heat in the ice
63      !!           6.  eta factors
64      !!           7.  surface flux computation
65      !!           8.  tridiagonal system terms
66      !!           9.  solving the tridiagonal system with Gauss elimination
67      !!           Iterative procedure ends according to a criterion on evolution
68      !!           of temperature
69      !!           10. Fluxes at the interfaces
70      !!
71      !! ** Inputs / Ouputs : (global commons)
72      !!           surface temperature              : t_su_1d
73      !!           ice/snow temperatures            : t_i_1d, t_s_1d
74      !!           ice salinities                   : sz_i_1d
75      !!           number of layers in the ice/snow : nlay_i, nlay_s
76      !!           total ice/snow thickness         : h_i_1d, h_s_1d
77      !!-------------------------------------------------------------------
78      INTEGER, INTENT(in) ::   k_jules     ! Jules coupling (0=OFF, 1=EMULATED, 2=ACTIVE)
79      !
80      INTEGER ::   ji, jk         ! spatial loop index
81      INTEGER ::   jm             ! current reference number of equation
82      INTEGER ::   jm_mint, jm_maxt
83      INTEGER ::   iconv          ! number of iterations in iterative procedure
84      INTEGER ::   iconv_max = 50 ! max number of iterations in iterative procedure
85      !
86      INTEGER, DIMENSION(jpij) ::   jm_min    ! reference number of top equation
87      INTEGER, DIMENSION(jpij) ::   jm_max    ! reference number of bottom equation
88      !
89      REAL(wp) ::   zg1s      =  2._wp        ! for the tridiagonal system
90      REAL(wp) ::   zg1       =  2._wp        !
91      REAL(wp) ::   zgamma    =  18009._wp    ! for specific heat
92      REAL(wp) ::   zbeta     =  0.117_wp     ! for thermal conductivity (could be 0.13)
93      REAL(wp) ::   zraext_s  =  10._wp       ! extinction coefficient of radiation in the snow
94      REAL(wp) ::   zkimin    =  0.10_wp      ! minimum ice thermal conductivity
95      REAL(wp) ::   ztsu_err  =  1.e-5_wp     ! range around which t_su is considered at 0C
96      REAL(wp) ::   zdti_bnd  =  1.e-4_wp     ! maximal authorized error on temperature
97      REAL(wp) ::   zhs_min   =  0.01_wp      ! minimum snow thickness for conductivity calculation
98      REAL(wp) ::   ztmelt_i                  ! ice melting temperature
99      REAL(wp) ::   zdti_max                  ! current maximal error on temperature
100      REAL(wp) ::   zcpi                      ! Ice specific heat
101      REAL(wp) ::   zhfx_err, zdq             ! diag errors on heat
102      REAL(wp) ::   zfac                      ! dummy factor
103      !
104      REAL(wp), DIMENSION(jpij) ::   isnow        ! switch for presence (1) or absence (0) of snow
105      REAL(wp), DIMENSION(jpij) ::   ztsub        ! surface temperature at previous iteration
106      REAL(wp), DIMENSION(jpij) ::   zh_i, z1_h_i ! ice layer thickness
107      REAL(wp), DIMENSION(jpij) ::   zh_s, z1_h_s ! snow layer thickness
108      REAL(wp), DIMENSION(jpij) ::   zqns_ice_b   ! solar radiation absorbed at the surface
109      REAL(wp), DIMENSION(jpij) ::   zfnet        ! surface flux function
110      REAL(wp), DIMENSION(jpij) ::   zdqns_ice_b  ! derivative of the surface flux function
111      !
112      REAL(wp), DIMENSION(jpij       )     ::   ztsuold     ! Old surface temperature in the ice
113      REAL(wp), DIMENSION(jpij,nlay_i)     ::   ztiold      ! Old temperature in the ice
114      REAL(wp), DIMENSION(jpij,nlay_s)     ::   ztsold      ! Old temperature in the snow
115      REAL(wp), DIMENSION(jpij,nlay_i)     ::   ztib        ! Temporary temperature in the ice to check the convergence
116      REAL(wp), DIMENSION(jpij,nlay_s)     ::   ztsb        ! Temporary temperature in the snow to check the convergence
117      REAL(wp), DIMENSION(jpij,0:nlay_i)   ::   ztcond_i    ! Ice thermal conductivity
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_jules == np_jules_OFF .OR. k_jules == np_jules_EMULE ) 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) = qsr_ice_tr_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) + qsr_ice_tr_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      ftr_ice_1d(1:npti) = zradtr_i(1:npti,nlay_i)   ! record radiation transmitted below the ice
204      !
205      iconv    = 0          ! number of iterations
206      zdti_max = 1000._wp   ! maximal value of error on all points
207      !
208      !                                                          !============================!
209      DO WHILE ( zdti_max > zdti_bnd .AND. iconv < iconv_max )   ! Iterative procedure begins !
210         !                                                       !============================!
211         iconv = iconv + 1
212         !
213         ztib(1:npti,:) = t_i_1d(1:npti,:)
214         ztsb(1:npti,:) = t_s_1d(1:npti,:)
215         !
216         !--------------------------------
217         ! 3) Sea ice thermal conductivity
218         !--------------------------------
219         IF( ln_cndi_U64 ) THEN         !-- Untersteiner (1964) formula: k = k0 + beta.S/T
220            !
221            DO ji = 1, npti
222               ztcond_i(ji,0)      = rcdic + zbeta * sz_i_1d(ji,1)      / MIN( -epsi10, t_i_1d(ji,1) - rt0 )
223               ztcond_i(ji,nlay_i) = rcdic + zbeta * sz_i_1d(ji,nlay_i) / MIN( -epsi10, t_bo_1d(ji)  - rt0 )
224            END DO
225            DO jk = 1, nlay_i-1
226               DO ji = 1, npti
227                  ztcond_i(ji,jk) = rcdic + zbeta * 0.5_wp * ( sz_i_1d(ji,jk) + sz_i_1d(ji,jk+1) ) /  &
228                     &                      MIN( -epsi10, 0.5_wp * (t_i_1d(ji,jk) + t_i_1d(ji,jk+1)) - rt0 )
229               END DO
230            END DO
231            !
232         ELSEIF( ln_cndi_P07 ) THEN     !-- Pringle et al formula: k = k0 + beta1.S/T - beta2.T
233            !
234            DO ji = 1, npti
235               ztcond_i(ji,0)      = rcdic + 0.09_wp  *  sz_i_1d(ji,1)      / MIN( -epsi10, t_i_1d(ji,1) - rt0 )  &
236                  &                        - 0.011_wp * ( t_i_1d(ji,1) - rt0 )
237               ztcond_i(ji,nlay_i) = rcdic + 0.09_wp  *  sz_i_1d(ji,nlay_i) / MIN( -epsi10, t_bo_1d(ji)  - rt0 )  &
238                  &                        - 0.011_wp * ( t_bo_1d(ji) - rt0 )
239            END DO
240            DO jk = 1, nlay_i-1
241               DO ji = 1, npti
242                  ztcond_i(ji,jk) = rcdic + 0.09_wp  *   0.5_wp * ( sz_i_1d(ji,jk) + sz_i_1d(ji,jk+1) ) /        &
243                     &                     MIN( -epsi10, 0.5_wp * ( t_i_1d (ji,jk) + t_i_1d (ji,jk+1) ) - rt0 )  &
244                     &                    - 0.011_wp * ( 0.5_wp * ( t_i_1d (ji,jk) + t_i_1d (ji,jk+1) ) - rt0 )
245               END DO
246            END DO
247            !
248         ENDIF
249         ztcond_i(1:npti,:) = MAX( zkimin, ztcond_i(1:npti,:) )       
250         !
251         !--- G(he) : enhancement of thermal conductivity in mono-category case
252         ! Computation of effective thermal conductivity G(h)
253         ! Used in mono-category case only to simulate an ITD implicitly
254         ! Fichefet and Morales Maqueda, JGR 1997
255         zghe(1:npti) = 1._wp
256         !
257         SELECT CASE ( nn_virtual_itd )
258         !
259         CASE ( 1 , 2 )
260            !
261            zepsilon = 0.1_wp
262            DO ji = 1, npti
263               zcnd_i = SUM( ztcond_i(ji,:) ) / REAL( nlay_i+1, wp )                                ! Mean sea ice thermal conductivity
264               zhe = ( rn_cnd_s * h_i_1d(ji) + zcnd_i * h_s_1d(ji) ) / ( rn_cnd_s + zcnd_i )        ! Effective thickness he (zhe)
265               IF( zhe >=  zepsilon * 0.5_wp * EXP(1._wp) )  &
266                  &   zghe(ji) = MIN( 2._wp, 0.5_wp * ( 1._wp + LOG( 2._wp * zhe / zepsilon ) ) )   ! G(he)
267            END DO
268            !
269         END SELECT
270         !
271         !-----------------
272         ! 4) kappa factors
273         !-----------------
274         !--- Snow
275         DO jk = 0, nlay_s-1
276            DO ji = 1, npti
277               zkappa_s(ji,jk) = zghe(ji) * rn_cnd_s * z1_h_s(ji)
278            END DO
279         END DO
280         DO ji = 1, npti   ! Snow-ice interface
281            zfac = 0.5_wp * ( ztcond_i(ji,0) * zh_s(ji) + rn_cnd_s * zh_i(ji) )
282            IF( zfac > epsi10 ) THEN
283               zkappa_s(ji,nlay_s) = zghe(ji) * rn_cnd_s * ztcond_i(ji,0) / zfac
284            ELSE
285               zkappa_s(ji,nlay_s) = 0._wp
286            ENDIF
287         END DO
288
289         !--- Ice
290         DO jk = 0, nlay_i
291            DO ji = 1, npti
292               zkappa_i(ji,jk) = zghe(ji) * ztcond_i(ji,jk) * z1_h_i(ji)
293            END DO
294         END DO
295         DO ji = 1, npti   ! Snow-ice interface
296            zkappa_i(ji,0) = zkappa_s(ji,nlay_s) * isnow(ji) + zkappa_i(ji,0) * ( 1._wp - isnow(ji) )
297         END DO
298         !
299         !--------------------------------------
300         ! 5) Sea ice specific heat, eta factors
301         !--------------------------------------
302         DO jk = 1, nlay_i
303            DO ji = 1, npti
304               zcpi = cpic + zgamma * sz_i_1d(ji,jk) / MAX( ( t_i_1d(ji,jk) - rt0 ) * ( ztiold(ji,jk) - rt0 ), epsi10 )
305               zeta_i(ji,jk) = rdt_ice * r1_rhoic * z1_h_i(ji) / MAX( epsi10, zcpi ) 
306            END DO
307         END DO
308
309         DO jk = 1, nlay_s
310            DO ji = 1, npti
311               zeta_s(ji,jk) = rdt_ice * r1_rhosn * r1_cpic * z1_h_s(ji)
312            END DO
313         END DO
314         !
315         !----------------------------------------!
316         !                                        !
317         !   JULES COUPLING IS OFF OR EMULATED    !
318         !                                        !
319         !----------------------------------------!
320         !
321         IF( k_jules == np_jules_OFF .OR. k_jules == np_jules_EMULE ) THEN
322            !
323            ! ==> The original BL99 temperature computation is used
324            !       (with qsr_ice, qns_ice and dqns_ice as inputs)
325            !
326            !----------------------------
327            ! 6) surface flux computation
328            !----------------------------
329            ! update of the non solar flux according to the update in T_su
330            DO ji = 1, npti
331               qns_ice_1d(ji) = qns_ice_1d(ji) + dqns_ice_1d(ji) * ( t_su_1d(ji) - ztsub(ji) )
332            END DO
333
334            DO ji = 1, npti
335               zfnet(ji) = qsr_ice_1d(ji) - qsr_ice_tr_1d(ji) + qns_ice_1d(ji) ! net heat flux = net - transmitted solar + non solar
336            END DO
337            !
338            !----------------------------
339            ! 7) tridiagonal system terms
340            !----------------------------
341            ! layer denotes the number of the layer in the snow or in the ice
342            ! jm denotes the reference number of the equation in the tridiagonal
343            ! system, terms of tridiagonal system are indexed as following :
344            ! 1 is subdiagonal term, 2 is diagonal and 3 is superdiagonal one
345
346            ! ice interior terms (top equation has the same form as the others)
347            ztrid   (1:npti,:,:) = 0._wp
348            zindterm(1:npti,:)   = 0._wp
349            zindtbis(1:npti,:)   = 0._wp
350            zdiagbis(1:npti,:)   = 0._wp
351
352            DO jm = nlay_s + 2, nlay_s + nlay_i 
353               DO ji = 1, npti
354                  jk = jm - nlay_s - 1
355                  ztrid   (ji,jm,1) =       - zeta_i(ji,jk) *   zkappa_i(ji,jk-1)
356                  ztrid   (ji,jm,2) = 1._wp + zeta_i(ji,jk) * ( zkappa_i(ji,jk-1) + zkappa_i(ji,jk) )
357                  ztrid   (ji,jm,3) =       - zeta_i(ji,jk) *                       zkappa_i(ji,jk)
358                  zindterm(ji,jm)   = ztiold(ji,jk) + zeta_i(ji,jk) * zradab_i(ji,jk)
359               END DO
360            END DO
361
362            jm =  nlay_s + nlay_i + 1
363            DO ji = 1, npti
364               ! ice bottom term
365               ztrid   (ji,jm,1) =       - zeta_i(ji,nlay_i) *   zkappa_i(ji,nlay_i-1)   
366               ztrid   (ji,jm,2) = 1._wp + zeta_i(ji,nlay_i) * ( zkappa_i(ji,nlay_i-1) + zkappa_i(ji,nlay_i) * zg1 )
367               ztrid   (ji,jm,3) = 0._wp
368               zindterm(ji,jm)   = ztiold(ji,nlay_i) + zeta_i(ji,nlay_i) *  &
369                  &              ( zradab_i(ji,nlay_i) + zkappa_i(ji,nlay_i) * zg1 * t_bo_1d(ji) ) 
370            END DO
371
372            DO ji = 1, npti
373               !                               !---------------------!
374               IF( h_s_1d(ji) > 0._wp ) THEN   !  snow-covered cells !
375                  !                            !---------------------!
376                  ! snow interior terms (bottom equation has the same form as the others)
377                  DO jm = 3, nlay_s + 1
378                     jk = jm - 1
379                     ztrid   (ji,jm,1) =       - zeta_s(ji,jk) *   zkappa_s(ji,jk-1)
380                     ztrid   (ji,jm,2) = 1._wp + zeta_s(ji,jk) * ( zkappa_s(ji,jk-1) + zkappa_s(ji,jk) )
381                     ztrid   (ji,jm,3) =       - zeta_s(ji,jk) *                       zkappa_s(ji,jk)
382                     zindterm(ji,jm)   = ztsold(ji,jk) + zeta_s(ji,jk) * zradab_s(ji,jk)
383                  END DO
384                 
385                  ! case of only one layer in the ice (ice equation is altered)
386                  IF( nlay_i == 1 ) THEN
387                     ztrid   (ji,nlay_s+2,3) = 0._wp
388                     zindterm(ji,nlay_s+2)   = zindterm(ji,nlay_s+2) + zeta_i(ji,1) * zkappa_i(ji,1) * t_bo_1d(ji) 
389                  ENDIF
390                 
391                  IF( t_su_1d(ji) < rt0 ) THEN   !--  case 1 : no surface melting
392                     
393                     jm_min(ji) = 1
394                     jm_max(ji) = nlay_i + nlay_s + 1
395                     
396                     ! surface equation
397                     ztrid   (ji,1,1) = 0._wp
398                     ztrid   (ji,1,2) = zdqns_ice_b(ji) - zg1s * zkappa_s(ji,0)
399                     ztrid   (ji,1,3) =                   zg1s * zkappa_s(ji,0)
400                     zindterm(ji,1)   = zdqns_ice_b(ji) * t_su_1d(ji) - zfnet(ji)
401                     
402                     ! first layer of snow equation
403                     ztrid   (ji,2,1) =       - zeta_s(ji,1) *                    zkappa_s(ji,0) * zg1s
404                     ztrid   (ji,2,2) = 1._wp + zeta_s(ji,1) * ( zkappa_s(ji,1) + zkappa_s(ji,0) * zg1s )
405                     ztrid   (ji,2,3) =       - zeta_s(ji,1) *   zkappa_s(ji,1)
406                     zindterm(ji,2)   = ztsold(ji,1) + zeta_s(ji,1) * zradab_s(ji,1)
407                     
408                  ELSE                            !--  case 2 : surface is melting
409                     !
410                     jm_min(ji) = 2
411                     jm_max(ji) = nlay_i + nlay_s + 1
412                     
413                     ! first layer of snow equation
414                     ztrid   (ji,2,1) = 0._wp
415                     ztrid   (ji,2,2) = 1._wp + zeta_s(ji,1) * ( zkappa_s(ji,1) + zkappa_s(ji,0) * zg1s )
416                     ztrid   (ji,2,3) =       - zeta_s(ji,1) *   zkappa_s(ji,1) 
417                     zindterm(ji,2)   = ztsold(ji,1) + zeta_s(ji,1) * ( zradab_s(ji,1) + zkappa_s(ji,0) * zg1s * t_su_1d(ji) ) 
418                  ENDIF
419                  !                            !---------------------!
420               ELSE                            ! cells without snow  !
421                  !                            !---------------------!
422                  !
423                  IF( t_su_1d(ji) < rt0 ) THEN   !--  case 1 : no surface melting
424                     !
425                     jm_min(ji) = nlay_s + 1
426                     jm_max(ji) = nlay_i + nlay_s + 1
427                     
428                     ! surface equation   
429                     ztrid   (ji,jm_min(ji),1) = 0._wp
430                     ztrid   (ji,jm_min(ji),2) = zdqns_ice_b(ji) - zkappa_i(ji,0) * zg1   
431                     ztrid   (ji,jm_min(ji),3) =                   zkappa_i(ji,0) * zg1
432                     zindterm(ji,jm_min(ji))   = zdqns_ice_b(ji) * t_su_1d(ji) - zfnet(ji)
433                     
434                     ! first layer of ice equation
435                     ztrid   (ji,jm_min(ji)+1,1) =       - zeta_i(ji,1) *                    zkappa_i(ji,0) * zg1
436                     ztrid   (ji,jm_min(ji)+1,2) = 1._wp + zeta_i(ji,1) * ( zkappa_i(ji,1) + zkappa_i(ji,0) * zg1 )
437                     ztrid   (ji,jm_min(ji)+1,3) =       - zeta_i(ji,1) *   zkappa_i(ji,1) 
438                     zindterm(ji,jm_min(ji)+1)   = ztiold(ji,1) + zeta_i(ji,1) * zradab_i(ji,1) 
439                     
440                     ! case of only one layer in the ice (surface & ice equations are altered)
441                     IF( nlay_i == 1 ) THEN
442                        ztrid   (ji,jm_min(ji),1)   = 0._wp
443                        ztrid   (ji,jm_min(ji),2)   = zdqns_ice_b(ji)      -   zkappa_i(ji,0) * 2._wp
444                        ztrid   (ji,jm_min(ji),3)   =                          zkappa_i(ji,0) * 2._wp
445                        ztrid   (ji,jm_min(ji)+1,1) =       - zeta_i(ji,1) *   zkappa_i(ji,0) * 2._wp
446                        ztrid   (ji,jm_min(ji)+1,2) = 1._wp + zeta_i(ji,1) * ( zkappa_i(ji,0) * 2._wp + zkappa_i(ji,1) )
447                        ztrid   (ji,jm_min(ji)+1,3) = 0._wp
448                        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))
449                     ENDIF
450                     
451                  ELSE                            !--  case 2 : surface is melting
452                     
453                     jm_min(ji) = nlay_s + 2
454                     jm_max(ji) = nlay_i + nlay_s + 1
455                     
456                     ! first layer of ice equation
457                     ztrid   (ji,jm_min(ji),1) = 0._wp
458                     ztrid   (ji,jm_min(ji),2) = 1._wp + zeta_i(ji,1) * ( zkappa_i(ji,1) + zkappa_i(ji,0) * zg1 ) 
459                     ztrid   (ji,jm_min(ji),3) =       - zeta_i(ji,1) *   zkappa_i(ji,1)
460                     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)) 
461                     
462                     ! case of only one layer in the ice (surface & ice equations are altered)
463                     IF( nlay_i == 1 ) THEN
464                        ztrid   (ji,jm_min(ji),1) = 0._wp
465                        ztrid   (ji,jm_min(ji),2) = 1._wp + zeta_i(ji,1) * ( zkappa_i(ji,0) * 2._wp + zkappa_i(ji,1) )
466                        ztrid   (ji,jm_min(ji),3) = 0._wp
467                        zindterm(ji,jm_min(ji))   = ztiold(ji,1) + zeta_i(ji,1) * ( zradab_i(ji,1) + zkappa_i(ji,1) * t_bo_1d(ji) ) &
468                           &                      + t_su_1d(ji) * zeta_i(ji,1) * zkappa_i(ji,0) * 2._wp
469                     ENDIF
470                     
471                  ENDIF
472               ENDIF
473               !
474               zindtbis(ji,jm_min(ji)) = zindterm(ji,jm_min(ji))
475               zdiagbis(ji,jm_min(ji)) = ztrid   (ji,jm_min(ji),2)
476               !
477            END DO
478            !
479            !------------------------------
480            ! 8) tridiagonal system solving
481            !------------------------------
482            ! Solve the tridiagonal system with Gauss elimination method.
483            ! Thomas algorithm, from Computational fluid Dynamics, J.D. ANDERSON, McGraw-Hill 1984
484            jm_maxt = 0
485            jm_mint = nlay_i+5
486            DO ji = 1, npti
487               jm_mint = MIN(jm_min(ji),jm_mint)
488               jm_maxt = MAX(jm_max(ji),jm_maxt)
489            END DO
490
491            DO jk = jm_mint+1, jm_maxt
492               DO ji = 1, npti
493                  jm = MIN(MAX(jm_min(ji)+1,jk),jm_max(ji))
494                  zdiagbis(ji,jm) = ztrid   (ji,jm,2) - ztrid(ji,jm,1) * ztrid   (ji,jm-1,3) / zdiagbis(ji,jm-1)
495                  zindtbis(ji,jm) = zindterm(ji,jm  ) - ztrid(ji,jm,1) * zindtbis(ji,jm-1  ) / zdiagbis(ji,jm-1)
496               END DO
497            END DO
498
499            ! ice temperatures
500            DO ji = 1, npti
501               t_i_1d(ji,nlay_i) = zindtbis(ji,jm_max(ji)) / zdiagbis(ji,jm_max(ji))
502            END DO
503
504            DO jm = nlay_i + nlay_s, nlay_s + 2, -1
505               DO ji = 1, npti
506                  jk = jm - nlay_s - 1
507                  t_i_1d(ji,jk) = ( zindtbis(ji,jm) - ztrid(ji,jm,3) * t_i_1d(ji,jk+1) ) / zdiagbis(ji,jm)
508               END DO
509            END DO
510
511            DO ji = 1, npti
512               ! snow temperatures     
513               IF( h_s_1d(ji) > 0._wp ) THEN
514                  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)
515               ENDIF
516               ! surface temperature
517               ztsub(ji) = t_su_1d(ji)
518               IF( t_su_1d(ji) < rt0 ) THEN
519                  t_su_1d(ji) = ( zindtbis(ji,jm_min(ji)) - ztrid(ji,jm_min(ji),3) *  &
520                     &          ( isnow(ji) * t_s_1d(ji,1) + ( 1._wp - isnow(ji) ) * t_i_1d(ji,1) ) ) / zdiagbis(ji,jm_min(ji))
521               ENDIF
522            END DO
523            !
524            !--------------------------------------------------------------
525            ! 9) Has the scheme converged?, end of the iterative procedure
526            !--------------------------------------------------------------
527            ! check that nowhere it has started to melt
528            ! zdti_max is a measure of error, it has to be under zdti_bnd
529            zdti_max = 0._wp
530            DO ji = 1, npti
531               t_su_1d(ji) = MAX( MIN( t_su_1d(ji) , rt0 ) , rt0 - 100._wp )
532               zdti_max    = MAX( zdti_max, ABS( t_su_1d(ji) - ztsub(ji) ) )     
533            END DO
534
535            DO jk = 1, nlay_s
536               DO ji = 1, npti
537                  t_s_1d(ji,jk) = MAX( MIN( t_s_1d(ji,jk), rt0 ), rt0 - 100._wp )
538                  zdti_max      = MAX( zdti_max, ABS( t_s_1d(ji,jk) - ztsb(ji,jk) ) )
539               END DO
540            END DO
541
542            DO jk = 1, nlay_i
543               DO ji = 1, npti
544                  ztmelt_i      = -tmut * sz_i_1d(ji,jk) + rt0 
545                  t_i_1d(ji,jk) =  MAX( MIN( t_i_1d(ji,jk), ztmelt_i ), rt0 - 100._wp )
546                  zdti_max      =  MAX( zdti_max, ABS( t_i_1d(ji,jk) - ztib(ji,jk) ) )
547               END DO
548            END DO
549
550            ! Compute spatial maximum over all errors
551            ! note that this could be optimized substantially by iterating only the non-converging points
552            IF( lk_mpp ) CALL mpp_max( zdti_max, kcom=ncomm_ice )
553         !
554         !----------------------------------------!
555         !                                        !
556         !      JULES COUPLING IS ACTIVE          !
557         !                                        !
558         !----------------------------------------!
559         !
560         ELSEIF( k_jules == np_jules_ACTIVE ) THEN
561            !
562            ! ==> we use a modified BL99 solver with conduction flux (qcn_ice) as forcing term
563            !
564            !----------------------------
565            ! 7) tridiagonal system terms
566            !----------------------------
567            ! layer denotes the number of the layer in the snow or in the ice
568            ! jm denotes the reference number of the equation in the tridiagonal
569            ! system, terms of tridiagonal system are indexed as following :
570            ! 1 is subdiagonal term, 2 is diagonal and 3 is superdiagonal one
571
572            ! ice interior terms (top equation has the same form as the others)
573            ztrid   (1:npti,:,:) = 0._wp
574            zindterm(1:npti,:)   = 0._wp
575            zindtbis(1:npti,:)   = 0._wp
576            zdiagbis(1:npti,:)   = 0._wp
577
578            DO jm = nlay_s + 2, nlay_s + nlay_i 
579               DO ji = 1, npti
580                  jk = jm - nlay_s - 1
581                  ztrid   (ji,jm,1) =       - zeta_i(ji,jk) *   zkappa_i(ji,jk-1)
582                  ztrid   (ji,jm,2) = 1._wp + zeta_i(ji,jk) * ( zkappa_i(ji,jk-1) + zkappa_i(ji,jk) )
583                  ztrid   (ji,jm,3) =       - zeta_i(ji,jk) *                       zkappa_i(ji,jk)
584                  zindterm(ji,jm)   = ztiold(ji,jk) + zeta_i(ji,jk) * zradab_i(ji,jk)
585               END DO
586            ENDDO
587
588            jm =  nlay_s + nlay_i + 1
589            DO ji = 1, npti
590               ! ice bottom term
591               ztrid   (ji,jm,1) =       - zeta_i(ji,nlay_i) *   zkappa_i(ji,nlay_i-1)   
592               ztrid   (ji,jm,2) = 1._wp + zeta_i(ji,nlay_i) * ( zkappa_i(ji,nlay_i-1) + zkappa_i(ji,nlay_i) * zg1 )
593               ztrid   (ji,jm,3) = 0._wp
594               zindterm(ji,jm)   = ztiold(ji,nlay_i) + zeta_i(ji,nlay_i) *  &
595                  &              ( zradab_i(ji,nlay_i) + zkappa_i(ji,nlay_i) * zg1 * t_bo_1d(ji) ) 
596            ENDDO
597
598            DO ji = 1, npti
599               !                               !---------------------!
600               IF( h_s_1d(ji) > 0._wp ) THEN   !  snow-covered cells !
601                  !                            !---------------------!
602                  ! snow interior terms (bottom equation has the same form as the others)
603                  DO jm = 3, nlay_s + 1
604                     jk = jm - 1
605                     ztrid   (ji,jm,1) =       - zeta_s(ji,jk) *   zkappa_s(ji,jk-1)
606                     ztrid   (ji,jm,2) = 1._wp + zeta_s(ji,jk) * ( zkappa_s(ji,jk-1) + zkappa_s(ji,jk) )
607                     ztrid   (ji,jm,3) =       - zeta_s(ji,jk) *                       zkappa_s(ji,jk)
608                     zindterm(ji,jm)   = ztsold(ji,jk) + zeta_s(ji,jk) * zradab_s(ji,jk)
609                  END DO
610                 
611                  ! case of only one layer in the ice (ice equation is altered)
612                  IF ( nlay_i == 1 ) THEN
613                     ztrid   (ji,nlay_s+2,3) = 0._wp
614                     zindterm(ji,nlay_s+2)   = zindterm(ji,nlay_s+2) + zeta_i(ji,1) * zkappa_i(ji,1) * t_bo_1d(ji) 
615                  ENDIF
616                 
617                  jm_min(ji) = 2
618                  jm_max(ji) = nlay_i + nlay_s + 1
619                 
620                  ! first layer of snow equation
621                  ztrid   (ji,2,1) = 0._wp
622                  ztrid   (ji,2,2) = 1._wp + zeta_s(ji,1) * zkappa_s(ji,1)
623                  ztrid   (ji,2,3) =       - zeta_s(ji,1) * zkappa_s(ji,1) 
624                  zindterm(ji,2)   = ztsold(ji,1) + zeta_s(ji,1) * ( zradab_s(ji,1) + qcn_ice_1d(ji) ) 
625                 
626                  !                            !---------------------!
627               ELSE                            ! cells without snow  !
628                  !                            !---------------------!
629                  jm_min(ji) = nlay_s + 2
630                  jm_max(ji) = nlay_i + nlay_s + 1
631                 
632                  ! first layer of ice equation
633                  ztrid   (ji,jm_min(ji),1) = 0._wp
634                  ztrid   (ji,jm_min(ji),2) = 1._wp + zeta_i(ji,1) * zkappa_i(ji,1) 
635                  ztrid   (ji,jm_min(ji),3) =       - zeta_i(ji,1) * zkappa_i(ji,1)
636                  zindterm(ji,jm_min(ji))   = ztiold(ji,1) + zeta_i(ji,1) * ( zradab_i(ji,1) + qcn_ice_1d(ji) )
637                 
638                  ! case of only one layer in the ice (surface & ice equations are altered)
639                  IF( nlay_i == 1 ) THEN
640                     ztrid   (ji,jm_min(ji),1) = 0._wp
641                     ztrid   (ji,jm_min(ji),2) = 1._wp + zeta_i(ji,1) * zkappa_i(ji,1)
642                     ztrid   (ji,jm_min(ji),3) = 0._wp
643                     zindterm(ji,jm_min(ji))   = ztiold(ji,1) + zeta_i(ji,1) *  &
644                        &                                     ( zradab_i(ji,1) + zkappa_i(ji,1) * t_bo_1d(ji) + qcn_ice_1d(ji) )
645                  ENDIF
646                 
647               ENDIF
648               !
649               zindtbis(ji,jm_min(ji)) = zindterm(ji,jm_min(ji))
650               zdiagbis(ji,jm_min(ji)) = ztrid   (ji,jm_min(ji),2)
651               !
652            END DO
653            !
654            !------------------------------
655            ! 8) tridiagonal system solving
656            !------------------------------
657            ! Solve the tridiagonal system with Gauss elimination method.
658            ! Thomas algorithm, from Computational fluid Dynamics, J.D. ANDERSON, McGraw-Hill 1984
659            jm_maxt = 0
660            jm_mint = nlay_i+5
661            DO ji = 1, npti
662               jm_mint = MIN(jm_min(ji),jm_mint)
663               jm_maxt = MAX(jm_max(ji),jm_maxt)
664            END DO
665           
666            DO jk = jm_mint+1, jm_maxt
667               DO ji = 1, npti
668                  jm = MIN(MAX(jm_min(ji)+1,jk),jm_max(ji))
669                  zdiagbis(ji,jm) = ztrid   (ji,jm,2) - ztrid(ji,jm,1) * ztrid   (ji,jm-1,3) / zdiagbis(ji,jm-1)
670                  zindtbis(ji,jm) = zindterm(ji,jm)   - ztrid(ji,jm,1) * zindtbis(ji,jm-1)   / zdiagbis(ji,jm-1)
671               END DO
672            END DO
673           
674            ! ice temperatures
675           DO ji = 1, npti
676               t_i_1d(ji,nlay_i) = zindtbis(ji,jm_max(ji)) / zdiagbis(ji,jm_max(ji))
677            END DO
678
679            DO jm = nlay_i + nlay_s, nlay_s + 2, -1
680               DO ji = 1, npti
681                  jk = jm - nlay_s - 1
682                  t_i_1d(ji,jk) = ( zindtbis(ji,jm) - ztrid(ji,jm,3) * t_i_1d(ji,jk+1) ) / zdiagbis(ji,jm)
683               END DO
684            END DO
685           
686            ! snow temperatures     
687            DO ji = 1, npti
688               IF( h_s_1d(ji) > 0._wp ) THEN
689                  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)
690               ENDIF
691            END DO
692            !
693            !--------------------------------------------------------------
694            ! 9) Has the scheme converged?, end of the iterative procedure
695            !--------------------------------------------------------------
696            ! check that nowhere it has started to melt
697            ! zdti_max is a measure of error, it has to be under zdti_bnd
698            zdti_max = 0._wp
699
700            DO jk = 1, nlay_s
701               DO ji = 1, npti
702                  t_s_1d(ji,jk) = MAX( MIN( t_s_1d(ji,jk), rt0 ), rt0 - 100._wp )
703                  zdti_max = MAX( zdti_max, ABS( t_s_1d(ji,jk) - ztsb(ji,jk) ) )
704               END DO
705            END DO
706           
707            DO jk = 1, nlay_i
708               DO ji = 1, npti
709                  ztmelt_i      = -tmut * sz_i_1d(ji,jk) + rt0 
710                  t_i_1d(ji,jk) =  MAX( MIN( t_i_1d(ji,jk), ztmelt_i ), rt0 - 100._wp )
711                  zdti_max      =  MAX( zdti_max, ABS( t_i_1d(ji,jk) - ztib(ji,jk) ) )
712               END DO
713            END DO
714
715            ! Compute spatial maximum over all errors
716            ! note that this could be optimized substantially by iterating only the non-converging points
717            IF( lk_mpp )   CALL mpp_max( zdti_max, kcom=ncomm_ice )
718
719         ENDIF ! k_jules
720         
721      END DO  ! End of the do while iterative procedure
722     
723      IF( ln_icectl .AND. lwp ) THEN
724         WRITE(numout,*) ' zdti_max : ', zdti_max
725         WRITE(numout,*) ' iconv    : ', iconv
726      ENDIF
727     
728      !
729      !-----------------------------
730      ! 10) Fluxes at the interfaces
731      !-----------------------------
732      !
733      ! --- update conduction fluxes
734      !
735      DO ji = 1, npti
736         !                                ! surface ice conduction flux
737         fc_su(ji)   =  -           isnow(ji)   * zkappa_s(ji,0) * zg1s * ( t_s_1d(ji,1) - t_su_1d(ji) )  &
738            &           - ( 1._wp - isnow(ji) ) * zkappa_i(ji,0) * zg1  * ( t_i_1d(ji,1) - t_su_1d(ji) )
739         !                                ! bottom ice conduction flux
740         fc_bo_i(ji) =  - zkappa_i(ji,nlay_i) * zg1 * ( t_bo_1d(ji) - t_i_1d(ji,nlay_i) )
741      END DO
742     
743      !
744      ! --- Diagnose the heat loss due to changing non-solar / conduction flux --- !
745      !
746      IF( k_jules == np_jules_OFF .OR. k_jules == np_jules_EMULE ) THEN
747         !
748         DO ji = 1, npti
749            hfx_err_dif_1d(ji) = hfx_err_dif_1d(ji) - ( qns_ice_1d(ji) - zqns_ice_b(ji) ) * a_i_1d(ji) 
750         END DO
751         !
752      ELSEIF( k_jules == np_jules_ACTIVE ) THEN
753         !
754         DO ji = 1, npti
755            hfx_err_dif_1d(ji) = hfx_err_dif_1d(ji) - ( fc_su(ji)      - qcn_ice_1d(ji) ) * a_i_1d(ji) 
756         END DO
757         !
758      ENDIF
759     
760      !
761      ! --- Diagnose the heat loss due to non-fully converged temperature solution (should not be above 10-4 W-m2) --- !
762      !
763      IF( k_jules == np_jules_OFF .OR. k_jules == np_jules_ACTIVE ) THEN
764         
765         CALL ice_var_enthalpy       
766         
767         ! zhfx_err = correction on the diagnosed heat flux due to non-convergence of the algorithm used to solve heat equation
768         DO ji = 1, npti
769            zdq = - zq_ini(ji) + ( SUM( e_i_1d(ji,1:nlay_i) ) * h_i_1d(ji) * r1_nlay_i +  &
770               &                   SUM( e_s_1d(ji,1:nlay_s) ) * h_s_1d(ji) * r1_nlay_s )
771           
772            IF( k_jules == np_jules_OFF ) THEN
773               
774               IF( t_su_1d(ji) < rt0 ) THEN  ! case T_su < 0degC
775                  zhfx_err = ( qns_ice_1d(ji) + qsr_ice_1d(ji)    - zradtr_i(ji,nlay_i) - fc_bo_i(ji) + zdq * r1_rdtice )*a_i_1d(ji)
776               ELSE                          ! case T_su = 0degC
777                  zhfx_err = ( fc_su(ji)      + qsr_ice_tr_1d(ji) - zradtr_i(ji,nlay_i) - fc_bo_i(ji) + zdq * r1_rdtice )*a_i_1d(ji)
778               ENDIF
779               
780            ELSEIF( k_jules == np_jules_ACTIVE ) THEN
781           
782               zhfx_err = ( fc_su(ji) + qsr_ice_tr_1d(ji) - zradtr_i(ji,nlay_i) - fc_bo_i(ji) + zdq * r1_rdtice ) * a_i_1d(ji)
783           
784            ENDIF
785            !
786            ! total heat sink to be sent to the ocean
787            hfx_err_dif_1d(ji) = hfx_err_dif_1d(ji) + zhfx_err
788            !
789            ! hfx_dif = Heat flux diagnostic of sensible heat used to warm/cool ice in W.m-2   
790            hfx_dif_1d(ji) = hfx_dif_1d(ji) - zdq * r1_rdtice * a_i_1d(ji)
791            !
792         END DO
793         !
794         ! --- SIMIP diagnostics
795         !
796         DO ji = 1, npti
797            !--- Conduction fluxes (positive downwards)
798            diag_fc_bo_1d(ji) = diag_fc_bo_1d(ji) + fc_bo_i(ji) * a_i_1d(ji) / at_i_1d(ji)
799            diag_fc_su_1d(ji) = diag_fc_su_1d(ji) + fc_su  (ji) * a_i_1d(ji) / at_i_1d(ji)
800   
801            !--- Snow-ice interfacial temperature (diagnostic SIMIP)
802            zfac = rn_cnd_s * zh_i(ji) + ztcond_i(ji,1) * zh_s(ji)
803            IF( h_s_1d(ji) >= zhs_min ) THEN
804               t_si_1d(ji) = ( rn_cnd_s       * zh_i(ji) * t_s_1d(ji,1) +   &
805                  &            ztcond_i(ji,1) * zh_s(ji) * t_i_1d(ji,1) ) / MAX( epsi10, zfac )
806            ELSE
807               t_si_1d(ji) = t_su_1d(ji)
808            ENDIF
809         END DO
810         !
811      ENDIF
812      !
813      !---------------------------------------------------------------------------------------
814      ! 11) Jules coupling: reset inner snow and ice temperatures, update conduction fluxes
815      !---------------------------------------------------------------------------------------
816      ! effective conductivity and 1st layer temperature (needed by Met Office)
817      DO ji = 1, npti
818         IF( h_s_1d(ji) > 0.1_wp ) THEN
819            cnd_ice_1d(ji) = 2._wp * zkappa_s(ji,0)
820         ELSE
821            IF( h_i_1d(ji) > 0.1_wp ) THEN
822               cnd_ice_1d(ji) = 2._wp * zkappa_i(ji,0)
823            ELSE
824               cnd_ice_1d(ji) = 2._wp * ztcond_i(ji,0) / 0.1_wp
825            ENDIF
826         ENDIF
827         t1_ice_1d(ji) = isnow(ji) * t_s_1d(ji,1) + ( 1._wp - isnow(ji) ) * t_i_1d(ji,1)
828      END DO
829      !
830      IF( k_jules == np_jules_EMULE ) THEN
831         ! Restore temperatures to their initial values
832         t_s_1d    (1:npti,:) = ztsold(1:npti,:)
833         t_i_1d    (1:npti,:) = ztiold(1:npti,:)
834         qcn_ice_1d(1:npti)   = fc_su (1:npti)
835      ENDIF
836      !
837   END SUBROUTINE ice_thd_zdf_BL99
838
839
840#else
841   !!----------------------------------------------------------------------
842   !!   Default option       Dummy Module             No ESIM sea-ice model
843   !!----------------------------------------------------------------------
844#endif
845
846   !!======================================================================
847END MODULE icethd_zdf_BL99
Note: See TracBrowser for help on using the repository browser.