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

source: branches/2017/dev_r7881_ENHANCE09_RK3/NEMOGCM/NEMO/LIM_SRC_3/icethd_zdf.F90 @ 8813

Last change on this file since 8813 was 8813, checked in by gm, 6 years ago

#1911 (ENHANCE-09): PART I.3 - phasing with updated branch dev_r8183_ICEMODEL revision 8787

File size: 48.0 KB
Line 
1MODULE icethd_zdf
2   !!======================================================================
3   !!                       ***  MODULE icethd_zdf ***
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      : select the appropriate routine for vertical heat diffusion calculation
18   !!  ice_thd_zdf_BL99 :
19   !!  ice_thd_enmelt   :
20   !!  ice_thd_zdf_init :
21   !!----------------------------------------------------------------------
22   USE dom_oce        ! ocean space and time domain
23   USE phycst         ! physical constants (ocean directory)
24   USE ice            ! sea-ice: variables
25   USE ice1D          ! sea-ice: thermodynamics variables
26   !
27   USE in_out_manager ! I/O manager
28   USE lib_mpp        ! MPP library
29   USE lib_fortran    ! fortran utilities (glob_sum + no signed zero)
30
31   IMPLICIT NONE
32   PRIVATE
33
34   PUBLIC   ice_thd_zdf        ! called by icethd
35   PUBLIC   ice_thd_zdf_init   ! called by icestp
36
37   !!** namelist (namthd_zdf) **
38   LOGICAL  ::   ln_zdf_BL99      ! Heat diffusion follows Bitz and Lipscomb (1999)
39   LOGICAL  ::   ln_cndi_U64      ! thermal conductivity: Untersteiner (1964)
40   LOGICAL  ::   ln_cndi_P07      ! thermal conductivity: Pringle et al (2007)
41   REAL(wp) ::   rn_kappa_i       ! coef. for the extinction of radiation Grenfell et al. (2006) [1/m]
42   REAL(wp), PUBLIC ::   rn_cnd_s ! thermal conductivity of the snow [W/m/K]
43
44   INTEGER  ::   nice_zdf         ! Choice of the type of vertical heat diffusion formulation
45   !                                           ! associated indices:
46   INTEGER, PARAMETER ::   np_BL99    = 1      ! Bitz and Lipscomb (1999)
47
48   INTEGER, PARAMETER ::   np_zdf_jules_OFF    = 0   !   compute all temperatures from qsr and qns
49   INTEGER, PARAMETER ::   np_zdf_jules_SND    = 1   !   compute conductive heat flux and surface temperature from qsr and qns
50   INTEGER, PARAMETER ::   np_zdf_jules_RCV    = 2   !   compute snow and inner ice temperatures from qcnd
51   
52   !!----------------------------------------------------------------------
53   !! NEMO/ICE 4.0 , NEMO Consortium (2017)
54   !! $Id: icethd_zdf.F90 8420 2017-08-08 12:18:46Z clem $
55   !! Software governed by the CeCILL licence     (NEMOGCM/NEMO_CeCILL.txt)
56   !!----------------------------------------------------------------------
57CONTAINS
58
59   SUBROUTINE ice_thd_zdf
60      !!-------------------------------------------------------------------
61      !!                ***  ROUTINE ice_thd_zdf  ***
62      !!
63      !! ** Purpose :   select the appropriate routine for the computation
64      !!              of vertical diffusion
65      !!-------------------------------------------------------------------
66   
67      SELECT CASE ( nice_zdf )      ! Choose the vertical heat diffusion solver
68      !
69      !                             !-------------     
70      CASE( np_BL99 )               ! BL99 solver
71         !                          !-------------
72         SELECT CASE( nice_jules )
73         CASE( np_jules_OFF    )   ;   CALL ice_thd_zdf_BL99 ( np_zdf_jules_OFF )   ! No Jules coupler     
74         CASE( np_jules_EMULE  )   ;   CALL ice_thd_zdf_BL99 ( np_zdf_jules_SND )   ! Jules coupler is emulated (send/recieve)
75                                       CALL ice_thd_zdf_BL99 ( np_zdf_jules_RCV )
76         CASE( np_jules_ACTIVE )   ;   CALL ice_thd_zdf_BL99 ( np_zdf_jules_RCV )   ! Jules coupler is active (receive only)
77         END SELECT
78      END SELECT
79     
80   END SUBROUTINE ice_thd_zdf
81   
82   
83   SUBROUTINE ice_thd_zdf_BL99( k_jules )
84      !!-------------------------------------------------------------------
85      !!                ***  ROUTINE ice_thd_zdf_BL99  ***
86      !!
87      !! ** Purpose :   computes the time evolution of snow and sea-ice temperature
88      !!              profiles, using the original Bitz and Lipscomb (1999) algorithm
89      !!
90      !! ** Method  :   solves the heat equation diffusion with a Neumann boundary
91      !!              condition at the surface and a Dirichlet one at the bottom.
92      !!              Solar radiation is partially absorbed into the ice.
93      !!              The specific heat and thermal conductivities depend on ice
94      !!              salinity and temperature to take into account brine pocket   
95      !!              melting. The numerical scheme is an iterative Crank-Nicolson
96      !!              on a non-uniform multilayer grid in the ice and snow system.
97      !!
98      !!           The successive steps of this routine are
99      !!           1.  initialization of ice-snow layers thicknesses
100      !!           2.  Internal absorbed and transmitted radiation
101      !!           Then iterative procedure begins
102      !!           3.  Thermal conductivity
103      !!           4.  Kappa factors
104      !!           5.  specific heat in the ice
105      !!           6.  eta factors
106      !!           7.  surface flux computation
107      !!           8.  tridiagonal system terms
108      !!           9.  solving the tridiagonal system with Gauss elimination
109      !!           Iterative procedure ends according to a criterion on evolution
110      !!           of temperature
111      !!           10. Fluxes at the interfaces
112      !!
113      !! ** Inputs / Ouputs : (global commons)
114      !!           surface temperature : t_su_1d
115      !!           ice/snow temperatures   : t_i_1d, t_s_1d
116      !!           ice salinities          : sz_i_1d
117      !!           number of layers in the ice/snow: nlay_i, nlay_s
118      !!           total ice/snow thickness : h_i_1d, h_s_1d
119      !!-------------------------------------------------------------------
120      INTEGER, INTENT(in) ::   k_jules     ! Jules coupling (0=OFF, 1=RECEIVE, 2=SEND)
121      !
122      INTEGER ::   ji, jk         ! spatial loop index
123      INTEGER ::   jm             ! current reference number of equation
124      INTEGER ::   jm_mint, jm_maxt
125      INTEGER ::   iconv          ! number of iterations in iterative procedure
126      INTEGER ::   iconv_max = 50 ! max number of iterations in iterative procedure
127      !
128      INTEGER, DIMENSION(jpij) ::   jm_min    ! reference number of top equation
129      INTEGER, DIMENSION(jpij) ::   jm_max    ! reference number of bottom equation
130      !
131      REAL(wp) ::   zg1s      =  2._wp        ! for the tridiagonal system
132      REAL(wp) ::   zg1       =  2._wp        !
133      REAL(wp) ::   zgamma    =  18009._wp    ! for specific heat
134      REAL(wp) ::   zbeta     =  0.117_wp     ! for thermal conductivity (could be 0.13)
135      REAL(wp) ::   zraext_s  =  10._wp       ! extinction coefficient of radiation in the snow
136      REAL(wp) ::   zkimin    =  0.10_wp      ! minimum ice thermal conductivity
137      REAL(wp) ::   ztsu_err  =  1.e-5_wp     ! range around which t_su is considered at 0C
138      REAL(wp) ::   zdti_bnd  =  1.e-4_wp     ! maximal authorized error on temperature
139      REAL(wp) ::   ztmelt_i                  ! ice melting temperature
140      REAL(wp) ::   zdti_max                  ! current maximal error on temperature
141      REAL(wp) ::   zcpi                      ! Ice specific heat
142      REAL(wp) ::   zhfx_err, zdq             ! diag errors on heat
143      REAL(wp) ::   zfac                      ! dummy factor
144      !
145      REAL(wp), DIMENSION(jpij)     ::   isnow       ! switch for presence (1) or absence (0) of snow
146      REAL(wp), DIMENSION(jpij)     ::   ztsub       ! surface temperature at previous iteration
147      REAL(wp), DIMENSION(jpij)     ::   zh_i, z1_h_i ! ice layer thickness
148      REAL(wp), DIMENSION(jpij)     ::   zh_s, z1_h_s ! snow layer thickness
149      REAL(wp), DIMENSION(jpij)     ::   zqns_ice_b  ! solar radiation absorbed at the surface
150      REAL(wp), DIMENSION(jpij)     ::   zfnet       ! surface flux function
151      REAL(wp), DIMENSION(jpij)     ::   zdqns_ice_b ! derivative of the surface flux function
152      !
153      REAL(wp), DIMENSION(jpij       )     ::   ztsuold     ! Old surface temperature in the ice
154      REAL(wp), DIMENSION(jpij,nlay_i)     ::   ztiold      ! Old temperature in the ice
155      REAL(wp), DIMENSION(jpij,nlay_s)     ::   ztsold      ! Old temperature in the snow
156      REAL(wp), DIMENSION(jpij,nlay_i)     ::   ztib        ! Temporary temperature in the ice to check the convergence
157      REAL(wp), DIMENSION(jpij,nlay_s)     ::   ztsb        ! Temporary temperature in the snow to check the convergence
158      REAL(wp), DIMENSION(jpij,0:nlay_i)   ::   ztcond_i    ! Ice thermal conductivity
159      REAL(wp), DIMENSION(jpij,0:nlay_i)   ::   zradtr_i    ! Radiation transmitted through the ice
160      REAL(wp), DIMENSION(jpij,0:nlay_i)   ::   zradab_i    ! Radiation absorbed in the ice
161      REAL(wp), DIMENSION(jpij,0:nlay_i)   ::   zkappa_i    ! Kappa factor in the ice
162      REAL(wp), DIMENSION(jpij,0:nlay_i)   ::   zeta_i      ! Eta factor in the ice
163      REAL(wp), DIMENSION(jpij,0:nlay_s)   ::   zradtr_s    ! Radiation transmited through the snow
164      REAL(wp), DIMENSION(jpij,0:nlay_s)   ::   zradab_s    ! Radiation absorbed in the snow
165      REAL(wp), DIMENSION(jpij,0:nlay_s)   ::   zkappa_s    ! Kappa factor in the snow
166      REAL(wp), DIMENSION(jpij,0:nlay_s)   ::   zeta_s      ! Eta factor in the snow
167      REAL(wp), DIMENSION(jpij,nlay_i+3)   ::   zindterm    ! 'Ind'ependent term
168      REAL(wp), DIMENSION(jpij,nlay_i+3)   ::   zindtbis    ! Temporary 'ind'ependent term
169      REAL(wp), DIMENSION(jpij,nlay_i+3)   ::   zdiagbis    ! Temporary 'dia'gonal term
170      REAL(wp), DIMENSION(jpij,nlay_i+3,3) ::   ztrid       ! Tridiagonal system terms
171      REAL(wp), DIMENSION(jpij)            ::   zq_ini      ! diag errors on heat
172      REAL(wp), DIMENSION(jpij)            ::   zghe        ! G(he), th. conduct enhancement factor, mono-cat
173      !
174      REAL(wp) ::   zfr1, zfr2, zfrqsr_tr_i   ! dummy factor
175      !
176      ! Mono-category
177      REAL(wp) :: zepsilon      ! determines thres. above which computation of G(h) is done
178      REAL(wp) :: zhe           ! dummy factor
179      REAL(wp) :: zcnd_i        ! mean sea ice thermal conductivity
180      !!------------------------------------------------------------------     
181
182      ! --- diag error on heat diffusion - PART 1 --- !
183      DO ji = 1, npti
184         zq_ini(ji) = ( SUM( e_i_1d(ji,1:nlay_i) ) * h_i_1d(ji) * r1_nlay_i +  &
185            &           SUM( e_s_1d(ji,1:nlay_s) ) * h_s_1d(ji) * r1_nlay_s ) 
186      END DO
187
188      !------------------
189      ! 1) Initialization
190      !------------------
191      DO ji = 1, npti
192         isnow(ji)= 1._wp - MAX( 0._wp , SIGN(1._wp, - h_s_1d(ji) ) )  ! is there snow or not
193         ! layer thickness
194         zh_i(ji) = h_i_1d(ji) * r1_nlay_i
195         zh_s(ji) = h_s_1d(ji) * r1_nlay_s
196      END DO
197      !
198      WHERE( zh_i(1:npti) >= epsi10 )   ;   z1_h_i(1:npti) = 1._wp / zh_i(1:npti)
199      ELSEWHERE                         ;   z1_h_i(1:npti) = 0._wp
200      END WHERE
201      !
202      WHERE( zh_s(1:npti) >= epsi10 )   ;   z1_h_s(1:npti) = 1._wp / zh_s(1:npti)
203      ELSEWHERE                         ;   z1_h_s(1:npti) = 0._wp
204      END WHERE
205      !
206      ! Store initial temperatures and non solar heat fluxes
207      IF ( k_jules == np_zdf_jules_OFF .OR. k_jules == np_zdf_jules_SND  ) THEN ! OFF or SND mode
208         !
209         ztsub  (1:npti)       =   t_su_1d(1:npti)                          ! surface temperature at iteration n-1
210         ztsuold(1:npti)       =   t_su_1d(1:npti)                          ! surface temperature initial value
211         zdqns_ice_b(1:npti)   =   dqns_ice_1d(1:npti)                      ! derivative of incoming nonsolar flux
212         zqns_ice_b (1:npti)   =   qns_ice_1d(1:npti)                       ! store previous qns_ice_1d value
213         !
214         t_su_1d(1:npti)       =   MIN( t_su_1d(1:npti), rt0 - ztsu_err )   ! required to leave the choice between melting or not
215         !
216      ENDIF   
217      !
218      ztsold (1:npti,:) = t_s_1d(1:npti,:)   ! Old snow temperature
219      ztiold (1:npti,:) = t_i_1d(1:npti,:)   ! Old ice temperature
220
221      !-------------
222      ! 2) Radiation
223      !-------------
224      ! --- Transmission/absorption of solar radiation in the ice --- !
225!     zfr1 = ( 0.18 * ( 1.0 - 0.81 ) + 0.35 * 0.81 )            !   standard value
226!     zfr2 = ( 0.82 * ( 1.0 - 0.81 ) + 0.65 * 0.81 )            !   zfr2 such that zfr1 + zfr2 to equal 1
227!
228!     DO ji = 1, npti
229!
230!        zfac = MAX( 0._wp , 1._wp - ( h_i_1d(ji) * 10._wp ) )     
231!
232!              zfrqsr_tr_i = zfr1 + zfac * zfr2                         !   below 10 cm, linearly increase zfrqsr_tr_i until 1 at zero thickness
233!              IF ( h_s_1d(ji) >= 0.0_wp )   zfrqsr_tr_i = 0._wp     !   snow fully opaque
234!
235!              qsr_ice_tr_1d(ji) = zfrqsr_tr_i * qsr_ice_1d(ji)   !   transmitted solar radiation
236!
237!              zfsw(ji) = qsr_ice_1d(ji) - qsr_ice_tr_1d(ji)
238!              zftrice(ji) = qsr_ice_tr_1d(ji)
239!              i0(ji) = zfrqsr_tr_i
240!
241!     END DO
242
243      zradtr_s(1:npti,0) = qsr_ice_tr_1d(1:npti)
244      DO jk = 1, nlay_s
245         DO ji = 1, npti
246            !                             ! radiation transmitted below the layer-th snow layer
247            zradtr_s(ji,jk) = zradtr_s(ji,0) * EXP( - zraext_s * zh_s(ji) * REAL(jk) )
248            !                             ! radiation absorbed by the layer-th snow layer
249            zradab_s(ji,jk) = zradtr_s(ji,jk-1) - zradtr_s(ji,jk)
250         END DO
251      END DO
252      !
253      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) )
254      DO jk = 1, nlay_i 
255         DO ji = 1, npti
256            !                             ! radiation transmitted below the layer-th ice layer
257            zradtr_i(ji,jk) = zradtr_i(ji,0) * EXP( - rn_kappa_i * zh_i(ji) * REAL(jk) )
258            !                             ! radiation absorbed by the layer-th ice layer
259            zradab_i(ji,jk) = zradtr_i(ji,jk-1) - zradtr_i(ji,jk)
260         END DO
261      END DO
262      !
263      ftr_ice_1d(1:npti) = zradtr_i(1:npti,nlay_i)   ! record radiation transmitted below the ice
264      !
265      iconv    =  0          ! number of iterations
266      zdti_max =  1000._wp   ! maximal value of error on all points
267      !                                                          !============================!
268      DO WHILE ( zdti_max > zdti_bnd .AND. iconv < iconv_max )   ! Iterative procedure begins !
269         !                                                       !============================!
270         iconv = iconv + 1
271         !
272         ztib(1:npti,:) = t_i_1d(1:npti,:)
273         ztsb(1:npti,:) = t_s_1d(1:npti,:)
274         !
275         !--------------------------------
276         ! 3) Sea ice thermal conductivity
277         !--------------------------------
278         IF( ln_cndi_U64 ) THEN         !-- Untersteiner (1964) formula: k = k0 + beta.S/T
279            !
280            DO ji = 1, npti
281               ztcond_i(ji,0)      = rcdic + zbeta * sz_i_1d(ji,1)      / MIN( -epsi10, t_i_1d(ji,1) - rt0 )
282               ztcond_i(ji,nlay_i) = rcdic + zbeta * sz_i_1d(ji,nlay_i) / MIN( -epsi10, t_bo_1d(ji)  - rt0 )
283            END DO
284            DO jk = 1, nlay_i-1
285               DO ji = 1, npti
286                  ztcond_i(ji,jk) = rcdic + zbeta * 0.5_wp * ( sz_i_1d(ji,jk) + sz_i_1d(ji,jk+1) ) /  &
287                     &                      MIN( -epsi10, 0.5_wp * (t_i_1d(ji,jk) + t_i_1d(ji,jk+1)) - rt0 )
288               END DO
289            END DO
290            !
291         ELSEIF( ln_cndi_P07 ) THEN     !-- Pringle et al formula: k = k0 + beta1.S/T - beta2.T
292            !
293            DO ji = 1, npti
294               ztcond_i(ji,0)      = rcdic + 0.09_wp * sz_i_1d(ji,1) / MIN( -epsi10, t_i_1d(ji,1) - rt0 )  &
295                  &                        - 0.011_wp * ( t_i_1d(ji,1) - rt0 )
296               ztcond_i(ji,nlay_i) = rcdic + 0.09_wp * sz_i_1d(ji,nlay_i) / MIN( -epsi10, t_bo_1d(ji) - rt0 )  &
297                  &                        - 0.011_wp * ( t_bo_1d(ji) - rt0 )
298            END DO
299            DO jk = 1, nlay_i-1
300               DO ji = 1, npti
301                  ztcond_i(ji,jk) = rcdic + 0.09_wp * 0.5_wp * ( sz_i_1d(ji,jk) + sz_i_1d(ji,jk+1) ) /          &
302                     &                     MIN( -epsi10, 0.5_wp * (t_i_1d(ji,jk) + t_i_1d(ji,jk+1)) - rt0 )   &
303                     &                    - 0.011_wp * ( 0.5_wp * (t_i_1d(ji,jk) + t_i_1d(ji,jk+1)) - rt0 )
304               END DO
305            END DO
306            !
307         ENDIF
308         ztcond_i(1:npti,:) = MAX( zkimin, ztcond_i(1:npti,:) )       
309         !
310         !--- G(he) : enhancement of thermal conductivity in mono-category case
311         ! Computation of effective thermal conductivity G(h)
312         ! Used in mono-category case only to simulate an ITD implicitly
313         ! Fichefet and Morales Maqueda, JGR 1997
314         zghe(1:npti) = 1._wp
315         !
316         SELECT CASE ( nn_monocat )
317         !
318         CASE ( 1 , 3 )
319            !
320            zepsilon = 0.1_wp
321            DO ji = 1, npti
322               zcnd_i = SUM( ztcond_i(ji,:) ) / REAL( nlay_i+1, wp )                             ! Mean sea ice thermal conductivity
323               zhe = ( rn_cnd_s * h_i_1d(ji) + zcnd_i * h_s_1d(ji) ) / ( rn_cnd_s + zcnd_i )   ! Effective thickness he (zhe)
324               IF( zhe >=  zepsilon * 0.5_wp * EXP(1._wp) ) THEN
325                  zghe(ji) = MIN( 2._wp, 0.5_wp * ( 1._wp + LOG( 2._wp * zhe / zepsilon ) ) )    ! G(he)
326               ENDIF
327            END DO
328            !
329         END SELECT
330         !
331         !-----------------
332         ! 4) kappa factors
333         !-----------------
334         !--- Snow
335         DO jk = 0, nlay_s-1
336            DO ji = 1, npti
337               zkappa_s(ji,jk) = zghe(ji) * rn_cnd_s * z1_h_s(ji)
338            END DO
339         END DO
340         DO ji = 1, npti   ! Snow-ice interface
341            zfac = 0.5_wp * ( ztcond_i(ji,0) * zh_s(ji) + rn_cnd_s * zh_i(ji) )
342            IF( zfac > epsi10 ) THEN
343               zkappa_s(ji,nlay_s) = zghe(ji) * rn_cnd_s * ztcond_i(ji,0) / zfac
344            ELSE
345               zkappa_s(ji,nlay_s) = 0._wp
346            ENDIF
347         END DO
348
349         !--- Ice
350         DO jk = 0, nlay_i
351            DO ji = 1, npti
352               zkappa_i(ji,jk) = zghe(ji) * ztcond_i(ji,jk) * z1_h_i(ji)
353            END DO
354         END DO
355         DO ji = 1, npti   ! Snow-ice interface
356            zkappa_i(ji,0) = zkappa_s(ji,nlay_s) * isnow(ji) + zkappa_i(ji,0) * ( 1._wp - isnow(ji) )
357         END DO
358         !
359         !--------------------------------------
360         ! 5) Sea ice specific heat, eta factors
361         !--------------------------------------
362         DO jk = 1, nlay_i
363            DO ji = 1, npti
364               zcpi = cpic + zgamma * sz_i_1d(ji,jk) / MAX( ( t_i_1d(ji,jk) - rt0 ) * ( ztiold(ji,jk) - rt0 ), epsi10 )
365               zeta_i(ji,jk) = rdt_ice * r1_rhoic * z1_h_i(ji) / MAX( epsi10, zcpi ) 
366            END DO
367         END DO
368
369         DO jk = 1, nlay_s
370            DO ji = 1, npti
371               zeta_s(ji,jk) = rdt_ice * r1_rhosn * r1_cpic * z1_h_s(ji)
372            END DO
373         END DO
374         
375         !
376         !----------------------------------------!
377         !                                        !
378         !       JULES IF (OFF or SND MODE)       !
379         !                                        !
380         !----------------------------------------!
381         !
382         
383         IF ( k_jules == np_zdf_jules_OFF .OR. k_jules == np_zdf_jules_SND  ) THEN ! OFF or SND mode
384         
385            !
386            ! In OFF mode the original BL99 temperature computation is used
387            ! (with qsr_ice, qns_ice and dqns_ice as inputs)
388            !
389            ! In SND mode, the computation is required to compute the conduction fluxes
390            !
391         
392            !----------------------------
393            ! 6) surface flux computation
394            !----------------------------
395
396            DO ji = 1, npti
397            ! update of the non solar flux according to the update in T_su
398               qns_ice_1d(ji) = qns_ice_1d(ji) + dqns_ice_1d(ji) * ( t_su_1d(ji) - ztsub(ji) )
399            END DO
400
401            DO ji = 1, npti
402               zfnet(ji) = qsr_ice_1d(ji) - qsr_ice_tr_1d(ji) + qns_ice_1d(ji) ! net heat flux = net solar - transmitted solar + non solar
403            END DO
404            !
405            !----------------------------
406            ! 7) tridiagonal system terms
407            !----------------------------
408            !!layer denotes the number of the layer in the snow or in the ice
409            !!jm denotes the reference number of the equation in the tridiagonal
410            !!system, terms of tridiagonal system are indexed as following :
411            !!1 is subdiagonal term, 2 is diagonal and 3 is superdiagonal one
412
413            !!ice interior terms (top equation has the same form as the others)
414            ztrid   (1:npti,:,:) = 0._wp
415            zindterm(1:npti,:)   = 0._wp
416            zindtbis(1:npti,:)   = 0._wp
417            zdiagbis(1:npti,:)   = 0._wp
418
419            DO jm = nlay_s + 2, nlay_s + nlay_i 
420            DO ji = 1, npti
421               jk = jm - nlay_s - 1
422               ztrid(ji,jm,1)  = - zeta_i(ji,jk) * zkappa_i(ji,jk-1)
423               ztrid(ji,jm,2)  = 1.0 + zeta_i(ji,jk) * ( zkappa_i(ji,jk-1) + zkappa_i(ji,jk) )
424               ztrid(ji,jm,3)  = - zeta_i(ji,jk) * zkappa_i(ji,jk)
425               zindterm(ji,jm) = ztiold(ji,jk) + zeta_i(ji,jk) * zradab_i(ji,jk)
426            END DO
427            END DO
428
429            jm =  nlay_s + nlay_i + 1
430            DO ji = 1, npti
431            !!ice bottom term
432            ztrid(ji,jm,1)  = - zeta_i(ji,nlay_i)*zkappa_i(ji,nlay_i-1)   
433            ztrid(ji,jm,2)  = 1.0 + zeta_i(ji,nlay_i) * ( zkappa_i(ji,nlay_i) * zg1 + zkappa_i(ji,nlay_i-1) )
434            ztrid(ji,jm,3)  = 0.0
435            zindterm(ji,jm) = ztiold(ji,nlay_i) + zeta_i(ji,nlay_i) *  &
436               &            ( zradab_i(ji,nlay_i) + zkappa_i(ji,nlay_i) * zg1 *  t_bo_1d(ji) ) 
437            END DO
438
439
440            DO ji = 1, npti
441            !                               !---------------------!
442            IF ( h_s_1d(ji) > 0.0 ) THEN    !  snow-covered cells !
443               !                            !---------------------!
444               ! snow interior terms (bottom equation has the same form as the others)
445               DO jm = 3, nlay_s + 1
446                  jk = jm - 1
447                  ztrid(ji,jm,1)  = - zeta_s(ji,jk) * zkappa_s(ji,jk-1)
448                  ztrid(ji,jm,2)  = 1.0 + zeta_s(ji,jk) * ( zkappa_s(ji,jk-1) + zkappa_s(ji,jk) )
449                  ztrid(ji,jm,3)  = - zeta_s(ji,jk)*zkappa_s(ji,jk)
450                  zindterm(ji,jm) = ztsold(ji,jk) + zeta_s(ji,jk) * zradab_s(ji,jk)
451               END DO
452
453               ! case of only one layer in the ice (ice equation is altered)
454               IF ( nlay_i == 1 ) THEN
455                  ztrid(ji,nlay_s+2,3)  = 0.0
456                  zindterm(ji,nlay_s+2) = zindterm(ji,nlay_s+2) + zkappa_i(ji,1) * t_bo_1d(ji) 
457               ENDIF
458
459               IF ( t_su_1d(ji) < rt0 ) THEN   !--  case 1 : no surface melting
460
461                  jm_min(ji) = 1
462                  jm_max(ji) = nlay_i + nlay_s + 1
463
464                  ! surface equation
465                  ztrid(ji,1,1)  = 0.0
466                  ztrid(ji,1,2)  = zdqns_ice_b(ji) - zg1s * zkappa_s(ji,0)
467                  ztrid(ji,1,3)  = zg1s * zkappa_s(ji,0)
468                  zindterm(ji,1) = zdqns_ice_b(ji) * t_su_1d(ji) - zfnet(ji)
469
470                  ! first layer of snow equation
471                  ztrid(ji,2,1)  = - zkappa_s(ji,0) * zg1s * zeta_s(ji,1)
472                  ztrid(ji,2,2)  = 1.0 + zeta_s(ji,1) * ( zkappa_s(ji,1) + zkappa_s(ji,0) * zg1s )
473                  ztrid(ji,2,3)  = - zeta_s(ji,1)* zkappa_s(ji,1)
474                  zindterm(ji,2) = ztsold(ji,1) + zeta_s(ji,1) * zradab_s(ji,1)
475
476               ELSE                            !--  case 2 : surface is melting
477                  !
478                  jm_min(ji) = 2
479                  jm_max(ji) = nlay_i + nlay_s + 1
480
481                  ! first layer of snow equation
482                  ztrid(ji,2,1)  = 0.0
483                  ztrid(ji,2,2)  = 1.0 + zeta_s(ji,1) * ( zkappa_s(ji,1) + zkappa_s(ji,0) * zg1s )
484                  ztrid(ji,2,3)  = - zeta_s(ji,1)*zkappa_s(ji,1) 
485                  zindterm(ji,2) = ztsold(ji,1) + zeta_s(ji,1) *  &
486                     &           ( zradab_s(ji,1) + zkappa_s(ji,0) * zg1s * t_su_1d(ji) ) 
487               ENDIF
488               !                            !---------------------!
489            ELSE                            ! cells without snow  !
490               !                            !---------------------!
491               !
492               IF ( t_su_1d(ji) < rt0 ) THEN   !--  case 1 : no surface melting
493                  !
494                  jm_min(ji) = nlay_s + 1
495                  jm_max(ji) = nlay_i + nlay_s + 1
496
497                  ! surface equation   
498                  ztrid(ji,jm_min(ji),1)  = 0.0
499                  ztrid(ji,jm_min(ji),2)  = zdqns_ice_b(ji) - zkappa_i(ji,0)*zg1   
500                  ztrid(ji,jm_min(ji),3)  = zkappa_i(ji,0)*zg1
501                  zindterm(ji,jm_min(ji)) = zdqns_ice_b(ji)*t_su_1d(ji) - zfnet(ji)
502
503                  ! first layer of ice equation
504                  ztrid(ji,jm_min(ji)+1,1)  = - zkappa_i(ji,0) * zg1 * zeta_i(ji,1)
505                  ztrid(ji,jm_min(ji)+1,2)  = 1.0 + zeta_i(ji,1) * ( zkappa_i(ji,1) + zkappa_i(ji,0) * zg1 )
506                  ztrid(ji,jm_min(ji)+1,3)  = - zeta_i(ji,1) * zkappa_i(ji,1) 
507                  zindterm(ji,jm_min(ji)+1) = ztiold(ji,1) + zeta_i(ji,1) * zradab_i(ji,1) 
508
509                  ! case of only one layer in the ice (surface & ice equations are altered)
510                  IF ( nlay_i == 1 ) THEN
511                     ztrid(ji,jm_min(ji),1)    = 0.0
512                     ztrid(ji,jm_min(ji),2)    = zdqns_ice_b(ji) - zkappa_i(ji,0) * 2.0
513                     ztrid(ji,jm_min(ji),3)    =  zkappa_i(ji,0) * 2.0
514                     ztrid(ji,jm_min(ji)+1,1)  = -zkappa_i(ji,0) * 2.0 * zeta_i(ji,1)
515                     ztrid(ji,jm_min(ji)+1,2)  = 1.0 + zeta_i(ji,1) * ( zkappa_i(ji,0) * 2.0 + zkappa_i(ji,1) )
516                     ztrid(ji,jm_min(ji)+1,3)  = 0.0
517                     zindterm(ji,jm_min(ji)+1) = ztiold(ji,1) + zeta_i(ji,1) *  &
518                        &                      ( zradab_i(ji,1) + zkappa_i(ji,1) * t_bo_1d(ji) )
519                  ENDIF
520
521               ELSE                            !--  case 2 : surface is melting
522
523                  jm_min(ji)    =  nlay_s + 2
524                  jm_max(ji)    =  nlay_i + nlay_s + 1
525
526                  ! first layer of ice equation
527                  ztrid(ji,jm_min(ji),1)  = 0.0
528                  ztrid(ji,jm_min(ji),2)  = 1.0 + zeta_i(ji,1) * ( zkappa_i(ji,1) + zkappa_i(ji,0) * zg1 ) 
529                  ztrid(ji,jm_min(ji),3)  = - zeta_i(ji,1) * zkappa_i(ji,1)
530                  zindterm(ji,jm_min(ji)) = ztiold(ji,1) + zeta_i(ji,1) *  &
531                     &                    ( zradab_i(ji,1) + zkappa_i(ji,0) * zg1 * t_su_1d(ji) ) 
532
533                  ! case of only one layer in the ice (surface & ice equations are altered)
534                  IF ( nlay_i == 1 ) THEN
535                     ztrid(ji,jm_min(ji),1)  = 0.0
536                     ztrid(ji,jm_min(ji),2)  = 1.0 + zeta_i(ji,1) * ( zkappa_i(ji,0) * 2.0 + zkappa_i(ji,1) )
537                     ztrid(ji,jm_min(ji),3)  = 0.0
538                     zindterm(ji,jm_min(ji)) = ztiold(ji,1) + zeta_i(ji,1) * ( zradab_i(ji,1) + zkappa_i(ji,1) * t_bo_1d(ji) )  &
539                        &                    + t_su_1d(ji) * zeta_i(ji,1) * zkappa_i(ji,0) * 2.0
540                  ENDIF
541
542               ENDIF
543            ENDIF
544            !
545            zindtbis(ji,jm_min(ji)) = zindterm(ji,jm_min(ji))
546            zdiagbis(ji,jm_min(ji)) = ztrid(ji,jm_min(ji),2)
547            !
548            END DO
549            !
550            !------------------------------
551            ! 8) tridiagonal system solving
552            !------------------------------
553            ! Solve the tridiagonal system with Gauss elimination method.
554            ! Thomas algorithm, from Computational fluid Dynamics, J.D. ANDERSON, McGraw-Hill 1984
555            jm_maxt = 0
556            jm_mint = nlay_i+5
557            DO ji = 1, npti
558               jm_mint = MIN(jm_min(ji),jm_mint)
559               jm_maxt = MAX(jm_max(ji),jm_maxt)
560            END DO
561
562            DO jk = jm_mint+1, jm_maxt
563            DO ji = 1, npti
564               jm = min(max(jm_min(ji)+1,jk),jm_max(ji))
565               zdiagbis(ji,jm) = ztrid(ji,jm,2)  - ztrid(ji,jm,1) * ztrid(ji,jm-1,3)  / zdiagbis(ji,jm-1)
566               zindtbis(ji,jm) = zindterm(ji,jm) - ztrid(ji,jm,1) * zindtbis(ji,jm-1) / zdiagbis(ji,jm-1)
567            END DO
568            END DO
569
570            DO ji = 1, npti
571            ! ice temperatures
572            t_i_1d(ji,nlay_i) = zindtbis(ji,jm_max(ji)) / zdiagbis(ji,jm_max(ji))
573            END DO
574
575            DO jm = nlay_i + nlay_s, nlay_s + 2, -1
576            DO ji = 1, npti
577               jk    =  jm - nlay_s - 1
578               t_i_1d(ji,jk) = ( zindtbis(ji,jm) - ztrid(ji,jm,3) * t_i_1d(ji,jk+1) ) / zdiagbis(ji,jm)
579            END DO
580            END DO
581
582            DO ji = 1, npti
583            ! snow temperatures     
584            IF( h_s_1d(ji) > 0._wp ) THEN
585               t_s_1d(ji,nlay_s) = ( zindtbis(ji,nlay_s+1) - ztrid(ji,nlay_s+1,3) * t_i_1d(ji,1) )  &
586               &                / zdiagbis(ji,nlay_s+1)
587            ENDIF
588            ! surface temperature
589            ztsub(ji) = t_su_1d(ji)
590            IF( t_su_1d(ji) < rt0 ) THEN
591               t_su_1d(ji) = ( zindtbis(ji,jm_min(ji)) - ztrid(ji,jm_min(ji),3) *  &
592                  &          ( isnow(ji) * t_s_1d(ji,1) + ( 1._wp - isnow(ji) ) * t_i_1d(ji,1) ) ) / zdiagbis(ji,jm_min(ji))
593            ENDIF
594            END DO
595            !
596            !--------------------------------------------------------------
597            ! 9) Has the scheme converged ?, end of the iterative procedure
598            !--------------------------------------------------------------
599            ! check that nowhere it has started to melt
600            ! zdti_max is a measure of error, it has to be under zdti_bnd
601            zdti_max = 0._wp
602            DO ji = 1, npti
603            t_su_1d(ji) = MAX( MIN( t_su_1d(ji) , rt0 ) , rt0 - 100._wp )
604            zdti_max = MAX( zdti_max, ABS( t_su_1d(ji) - ztsub(ji) ) )     
605            END DO
606
607            DO jk  =  1, nlay_s
608            DO ji = 1, npti
609               t_s_1d(ji,jk) = MAX( MIN( t_s_1d(ji,jk), rt0 ), rt0 - 100._wp )
610               zdti_max = MAX( zdti_max, ABS( t_s_1d(ji,jk) - ztsb(ji,jk) ) )
611            END DO
612            END DO
613
614            DO jk  =  1, nlay_i
615            DO ji = 1, npti
616               ztmelt_i      = -tmut * sz_i_1d(ji,jk) + rt0 
617               t_i_1d(ji,jk) =  MAX( MIN( t_i_1d(ji,jk), ztmelt_i ), rt0 - 100._wp )
618               zdti_max      =  MAX( zdti_max, ABS( t_i_1d(ji,jk) - ztib(ji,jk) ) )
619            END DO
620            END DO
621
622            ! Compute spatial maximum over all errors
623            ! note that this could be optimized substantially by iterating only the non-converging points
624            IF( lk_mpp ) CALL mpp_max( zdti_max, kcom=ncomm_ice )
625         !
626         !----------------------------------------!
627         !                                        !
628         !       JULES IF (RCV MODE)              !
629         !                                        !
630         !----------------------------------------!
631         !
632
633         ELSE IF ( k_jules == np_zdf_jules_RCV  ) THEN ! RCV mode
634         
635            !
636            ! In RCV mode, we use a modified BL99 solver
637            ! with conduction flux (qcn_ice) as forcing term
638            !
639            !----------------------------
640            ! 7) tridiagonal system terms
641            !----------------------------
642            !!layer denotes the number of the layer in the snow or in the ice
643            !!jm denotes the reference number of the equation in the tridiagonal
644            !!system, terms of tridiagonal system are indexed as following :
645            !!1 is subdiagonal term, 2 is diagonal and 3 is superdiagonal one
646
647            !!ice interior terms (top equation has the same form as the others)
648            ztrid   (1:npti,:,:) = 0._wp
649            zindterm(1:npti,:)   = 0._wp
650            zindtbis(1:npti,:)   = 0._wp
651            zdiagbis(1:npti,:)   = 0._wp
652
653            DO jm = nlay_s + 2, nlay_s + nlay_i 
654            DO ji = 1, npti
655               jk = jm - nlay_s - 1
656               ztrid(ji,jm,1)  = - zeta_i(ji,jk) * zkappa_i(ji,jk-1)
657               ztrid(ji,jm,2)  = 1.0 + zeta_i(ji,jk) * ( zkappa_i(ji,jk-1) + zkappa_i(ji,jk) )
658               ztrid(ji,jm,3)  = - zeta_i(ji,jk) * zkappa_i(ji,jk)
659               zindterm(ji,jm) = ztiold(ji,jk) + zeta_i(ji,jk) * zradab_i(ji,jk)
660            END DO
661            ENDDO
662
663            jm =  nlay_s + nlay_i + 1
664            DO ji = 1, npti
665            !!ice bottom term
666            ztrid(ji,jm,1)  = - zeta_i(ji,nlay_i)*zkappa_i(ji,nlay_i-1)   
667            ztrid(ji,jm,2)  = 1.0 + zeta_i(ji,nlay_i) * ( zkappa_i(ji,nlay_i) * zg1 + zkappa_i(ji,nlay_i-1) )
668            ztrid(ji,jm,3)  = 0.0
669            zindterm(ji,jm) = ztiold(ji,nlay_i) + zeta_i(ji,nlay_i) *  &
670               &            ( zradab_i(ji,nlay_i) + zkappa_i(ji,nlay_i) * zg1 *  t_bo_1d(ji) ) 
671            ENDDO
672
673
674            DO ji = 1, npti
675            !                              !---------------------!
676            IF ( h_s_1d(ji) > 0.0 ) THEN   !  snow-covered cells !
677               !                           !---------------------!
678               ! snow interior terms (bottom equation has the same form as the others)
679               DO jm = 3, nlay_s + 1
680               jk = jm - 1
681               ztrid(ji,jm,1)  = - zeta_s(ji,jk) * zkappa_s(ji,jk-1)
682               ztrid(ji,jm,2)  = 1.0 + zeta_s(ji,jk) * ( zkappa_s(ji,jk-1) + zkappa_s(ji,jk) )
683               ztrid(ji,jm,3)  = - zeta_s(ji,jk)*zkappa_s(ji,jk)
684               zindterm(ji,jm) = ztsold(ji,jk) + zeta_s(ji,jk) * zradab_s(ji,jk)
685               END DO
686
687               ! case of only one layer in the ice (ice equation is altered)
688               IF ( nlay_i == 1 ) THEN
689               ztrid(ji,nlay_s+2,3)  = 0.0
690               zindterm(ji,nlay_s+2) = zindterm(ji,nlay_s+2) + zkappa_i(ji,1) * t_bo_1d(ji) 
691               ENDIF
692
693               jm_min(ji) = 2
694               jm_max(ji) = nlay_i + nlay_s + 1
695
696               ! first layer of snow equation
697               ztrid(ji,2,1)  = 0.0
698               ztrid(ji,2,2)  = 1.0 + zeta_s(ji,1) * zkappa_s(ji,1)
699               ztrid(ji,2,3)  = - zeta_s(ji,1)*zkappa_s(ji,1) 
700               zindterm(ji,2) = ztsold(ji,1) + zeta_s(ji,1) *  &
701               &           ( zradab_s(ji,1) + qcn_ice_1d(ji) ) 
702
703            !                               !---------------------!
704            ELSE                            ! cells without snow  !
705            !                               !---------------------!
706
707               jm_min(ji)    =  nlay_s + 2
708               jm_max(ji)    =  nlay_i + nlay_s + 1
709
710               ! first layer of ice equation
711               ztrid(ji,jm_min(ji),1)  = 0.0
712               ztrid(ji,jm_min(ji),2)  = 1.0 + zeta_i(ji,1) * zkappa_i(ji,1) 
713               ztrid(ji,jm_min(ji),3)  = - zeta_i(ji,1) * zkappa_i(ji,1)
714               zindterm(ji,jm_min(ji)) = ztiold(ji,1) + zeta_i(ji,1) *  &
715               &                    ( zradab_i(ji,1) + qcn_ice_1d(ji) )
716
717               ! case of only one layer in the ice (surface & ice equations are altered)
718               IF ( nlay_i == 1 ) THEN
719               ztrid(ji,jm_min(ji),1)  = 0.0
720               ztrid(ji,jm_min(ji),2)  = 1.0 + zeta_i(ji,1) * zkappa_i(ji,1)
721               ztrid(ji,jm_min(ji),3)  = 0.0
722               zindterm(ji,jm_min(ji)) = ztiold(ji,1) + zeta_i(ji,1) * ( zradab_i(ji,1) + zkappa_i(ji,1) * t_bo_1d(ji)    &
723               &                    + qcn_ice_1d(ji) )
724
725               ENDIF
726
727            ENDIF
728            !
729            zindtbis(ji,jm_min(ji)) = zindterm(ji,jm_min(ji))
730            zdiagbis(ji,jm_min(ji)) = ztrid(ji,jm_min(ji),2)
731            !
732            END DO
733            !
734            !------------------------------
735            ! 8) tridiagonal system solving
736            !------------------------------
737            ! Solve the tridiagonal system with Gauss elimination method.
738            ! Thomas algorithm, from Computational fluid Dynamics, J.D. ANDERSON, McGraw-Hill 1984
739            jm_maxt = 0
740            jm_mint = nlay_i+5
741            DO ji = 1, npti
742            jm_mint = MIN(jm_min(ji),jm_mint)
743            jm_maxt = MAX(jm_max(ji),jm_maxt)
744            END DO
745
746            DO jk = jm_mint+1, jm_maxt
747            DO ji = 1, npti
748               jm = min(max(jm_min(ji)+1,jk),jm_max(ji))
749               zdiagbis(ji,jm) = ztrid(ji,jm,2)  - ztrid(ji,jm,1) * ztrid(ji,jm-1,3)  / zdiagbis(ji,jm-1)
750               zindtbis(ji,jm) = zindterm(ji,jm) - ztrid(ji,jm,1) * zindtbis(ji,jm-1) / zdiagbis(ji,jm-1)
751            END DO
752            END DO
753
754            DO ji = 1, npti
755            ! ice temperatures
756            t_i_1d(ji,nlay_i) = zindtbis(ji,jm_max(ji)) / zdiagbis(ji,jm_max(ji))
757            END DO
758
759            DO jm = nlay_i + nlay_s, nlay_s + 2, -1
760            DO ji = 1, npti
761               jk    =  jm - nlay_s - 1
762               t_i_1d(ji,jk) = ( zindtbis(ji,jm) - ztrid(ji,jm,3) * t_i_1d(ji,jk+1) ) / zdiagbis(ji,jm)
763            END DO
764            END DO
765
766            DO ji = 1, npti
767            ! snow temperatures     
768            IF( h_s_1d(ji) > 0._wp ) THEN
769               t_s_1d(ji,nlay_s) = ( zindtbis(ji,nlay_s+1) - ztrid(ji,nlay_s+1,3) * t_i_1d(ji,1) )  &
770               &                / zdiagbis(ji,nlay_s+1)
771            ENDIF
772            END DO
773            !
774            !--------------------------------------------------------------
775            ! 9) Has the scheme converged ?, end of the iterative procedure
776            !--------------------------------------------------------------
777            ! check that nowhere it has started to melt
778            ! zdti_max is a measure of error, it has to be under zdti_bnd
779            zdti_max = 0._wp
780
781            DO jk  =  1, nlay_s
782            DO ji = 1, npti
783               t_s_1d(ji,jk) = MAX( MIN( t_s_1d(ji,jk), rt0 ), rt0 - 100._wp )
784               zdti_max = MAX( zdti_max, ABS( t_s_1d(ji,jk) - ztsb(ji,jk) ) )
785            END DO
786            END DO
787
788            DO jk  =  1, nlay_i
789            DO ji = 1, npti
790               ztmelt_i      = -tmut * sz_i_1d(ji,jk) + rt0 
791               t_i_1d(ji,jk) =  MAX( MIN( t_i_1d(ji,jk), ztmelt_i ), rt0 - 100._wp )
792               zdti_max      =  MAX( zdti_max, ABS( t_i_1d(ji,jk) - ztib(ji,jk) ) )
793            END DO
794            END DO
795
796            ! Compute spatial maximum over all errors
797            ! note that this could be optimized substantially by iterating only the non-converging points
798            IF( lk_mpp )   CALL mpp_max( zdti_max, kcom=ncomm_ice )
799
800         ENDIF ! k_jules
801         
802      END DO  ! End of the do while iterative procedure
803     
804      IF( ln_icectl .AND. lwp ) THEN
805         WRITE(numout,*) ' zdti_max : ', zdti_max
806         WRITE(numout,*) ' iconv    : ', iconv
807      ENDIF
808     
809      !
810      !-----------------------------
811      ! 10) Fluxes at the interfaces
812      !-----------------------------
813      !
814      ! --- update conduction fluxes
815      !
816      DO ji = 1, npti
817      !                                ! surface ice conduction flux
818         fc_su(ji)   =  -           isnow(ji)   * zkappa_s(ji,0) * zg1s * (t_s_1d(ji,1) - t_su_1d(ji))   &
819            &           - ( 1._wp - isnow(ji) ) * zkappa_i(ji,0) * zg1  * (t_i_1d(ji,1) - t_su_1d(ji))
820      !                                ! bottom ice conduction flux
821         fc_bo_i(ji) =  - zkappa_i(ji,nlay_i) * ( zg1*(t_bo_1d(ji) - t_i_1d(ji,nlay_i)) )
822      END DO
823     
824      !
825      ! --- Diagnose the heat loss due to changing non-solar / conduction flux --- !
826      !
827      IF ( k_jules == np_zdf_jules_OFF .OR. k_jules == np_zdf_jules_SND  ) THEN  ! OFF or SND mode
828         DO ji = 1, npti
829            hfx_err_dif_1d(ji) = hfx_err_dif_1d(ji) - ( qns_ice_1d(ji) - zqns_ice_b(ji) ) * a_i_1d(ji) 
830         END DO
831      ELSE        ! RCV mode
832         DO ji = 1, npti
833            hfx_err_dif_1d(ji) = hfx_err_dif_1d(ji) - ( fc_su(ji)      - qcn_ice_1d(ji) ) * a_i_1d(ji) 
834         END DO
835      ENDIF
836     
837      !
838      ! --- Diagnose the heat loss due to non-fully converged temperature solution (should not be above 10-4 W-m2) --- !
839      !
840
841      IF ( ( k_jules == np_zdf_jules_OFF ) .OR. ( k_jules == np_zdf_jules_RCV ) ) THEN ! OFF
842     
843         CALL ice_thd_enmelt       
844
845         !     zhfx_err = correction on the diagnosed heat flux due to non-convergence of the algorithm used to solve heat equation
846         DO ji = 1, npti
847            zdq = - zq_ini(ji) + ( SUM( e_i_1d(ji,1:nlay_i) ) * h_i_1d(ji) * r1_nlay_i +  &
848               &                   SUM( e_s_1d(ji,1:nlay_s) ) * h_s_1d(ji) * r1_nlay_s )
849               
850            IF ( ( k_jules == np_zdf_jules_OFF ) ) THEN
851               
852                  IF( t_su_1d(ji) < rt0 ) THEN  ! case T_su < 0degC
853                     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) 
854                  ELSE                          ! case T_su = 0degC
855                     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)
856                  ENDIF
857           
858            ELSE ! RCV CASE
859           
860               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)
861           
862            ENDIF
863            !
864            ! total heat sink to be sent to the ocean
865            hfx_err_dif_1d(ji) = hfx_err_dif_1d(ji) + zhfx_err
866            !
867            ! hfx_dif = Heat flux diagnostic of sensible heat used to warm/cool ice in W.m-2   
868            hfx_dif_1d(ji) = hfx_dif_1d(ji) - zdq * r1_rdtice * a_i_1d(ji)
869            !
870         END DO
871         !
872         ! --- SIMIP diagnostics
873         !
874         DO ji = 1, npti
875            !--- Conduction fluxes (positive downwards)
876            diag_fc_bo_1d(ji) = diag_fc_bo_1d(ji) + fc_bo_i(ji) * a_i_1d(ji) / at_i_1d(ji)
877            diag_fc_su_1d(ji) = diag_fc_su_1d(ji) + fc_su(ji)   * a_i_1d(ji) / at_i_1d(ji)
878   
879            !--- Snow-ice interfacial temperature (diagnostic SIMIP)
880            zfac = rn_cnd_s * zh_i(ji) + ztcond_i(ji,1) * zh_s(ji)
881            IF( zh_s(ji) >= 1.e-3 .AND. zfac > epsi10 ) THEN
882               t_si_1d(ji) = ( rn_cnd_s       * zh_i(ji) * t_s_1d(ji,1) +   &
883                  &            ztcond_i(ji,1) * zh_s(ji) * t_i_1d(ji,1) ) / zfac
884            ELSE
885               t_si_1d(ji) = t_su_1d(ji)
886            ENDIF
887         END DO
888         !
889      ENDIF
890      !
891      !---------------------------------------------------------------------------------------
892      ! 11) Jules coupling: reset inner snow and ice temperatures, update conduction fluxes
893      !---------------------------------------------------------------------------------------
894      !
895      IF ( k_jules == np_zdf_jules_SND ) THEN   ! --- Jules coupling in "SND" mode
896         !
897         ! Restore temperatures to their initial values
898         t_s_1d(1:npti,:)        = ztsold (1:npti,:)
899         t_i_1d(1:npti,:)        = ztiold (1:npti,:)
900         qcn_ice_1d(1:npti)      = fc_su(1:npti)
901         
902      ENDIF
903      !
904   END SUBROUTINE ice_thd_zdf_BL99
905
906
907   SUBROUTINE ice_thd_enmelt
908      !!-------------------------------------------------------------------
909      !!                   ***  ROUTINE ice_thd_enmelt ***
910      !!                 
911      !! ** Purpose :   Computes sea ice energy of melting q_i (J.m-3) from temperature
912      !!
913      !! ** Method  :   Formula (Bitz and Lipscomb, 1999)
914      !!-------------------------------------------------------------------
915      INTEGER  ::   ji, jk   ! dummy loop indices
916      REAL(wp) ::   ztmelts  ! local scalar
917      !!-------------------------------------------------------------------
918      !
919      DO jk = 1, nlay_i             ! Sea ice energy of melting
920         DO ji = 1, npti
921            ztmelts      = - tmut  * sz_i_1d(ji,jk)
922            t_i_1d(ji,jk) = MIN( t_i_1d(ji,jk), ztmelts + rt0 ) ! Force t_i_1d to be lower than melting point
923                                                                !   (sometimes dif scheme produces abnormally high temperatures)   
924            e_i_1d(ji,jk) = rhoic * ( cpic * ( ztmelts - ( t_i_1d(ji,jk) - rt0 ) )           &
925               &                    + lfus * ( 1._wp - ztmelts / ( t_i_1d(ji,jk) - rt0 ) )   &
926               &                    - rcp  *   ztmelts )
927         END DO
928      END DO
929      DO jk = 1, nlay_s             ! Snow energy of melting
930         DO ji = 1, npti
931            e_s_1d(ji,jk) = rhosn * ( cpic * ( rt0 - t_s_1d(ji,jk) ) + lfus )
932         END DO
933      END DO
934      !
935   END SUBROUTINE ice_thd_enmelt
936
937
938   SUBROUTINE ice_thd_zdf_init
939      !!-----------------------------------------------------------------------
940      !!                   ***  ROUTINE ice_thd_zdf_init ***
941      !!                 
942      !! ** Purpose :   Physical constants and parameters associated with
943      !!                ice thermodynamics
944      !!
945      !! ** Method  :   Read the namthd_zdf namelist and check the parameters
946      !!                called at the first timestep (nit000)
947      !!
948      !! ** input   :   Namelist namthd_zdf
949      !!-------------------------------------------------------------------
950      INTEGER  ::   ios, ioptio   ! Local integer
951      !!
952      NAMELIST/namthd_zdf/ ln_zdf_BL99, ln_cndi_U64, ln_cndi_P07, rn_cnd_s, rn_kappa_i
953      !!-------------------------------------------------------------------
954      !
955      REWIND( numnam_ice_ref )              ! Namelist namthd_zdf in reference namelist : Ice thermodynamics
956      READ  ( numnam_ice_ref, namthd_zdf, IOSTAT = ios, ERR = 901)
957901   IF( ios /= 0 ) CALL ctl_nam ( ios , 'namthd_zdf in reference namelist', lwp )
958
959      REWIND( numnam_ice_cfg )              ! Namelist namthd_zdf in configuration namelist : Ice thermodynamics
960      READ  ( numnam_ice_cfg, namthd_zdf, IOSTAT = ios, ERR = 902 )
961902   IF( ios /= 0 ) CALL ctl_nam ( ios , 'namthd_zdf in configuration namelist', lwp )
962      IF(lwm) WRITE ( numoni, namthd_zdf )
963      !
964      !
965      IF(lwp) THEN                          ! control print
966         WRITE(numout,*) 'ice_thd_zdf_init: Ice vertical heat diffusion'
967         WRITE(numout,*) '~~~~~~~~~~~~~~~~'
968         WRITE(numout,*) '   Namelist namthd_zdf:'
969         WRITE(numout,*) '      Bitz and Lipscomb (1999) formulation                    ln_zdf_BL99  = ', ln_zdf_BL99
970         WRITE(numout,*) '      thermal conductivity in the ice (Untersteiner 1964)     ln_cndi_U64  = ', ln_cndi_U64
971         WRITE(numout,*) '      thermal conductivity in the ice (Pringle et al 2007)    ln_cndi_P07  = ', ln_cndi_P07
972         WRITE(numout,*) '      thermal conductivity in the snow                        rn_cnd_s     = ', rn_cnd_s
973         WRITE(numout,*) '      extinction radiation parameter in sea ice               rn_kappa_i   = ', rn_kappa_i
974     ENDIF
975
976      !
977      IF ( ( ln_cndi_U64 .AND. ln_cndi_P07 ) .OR. ( .NOT.ln_cndi_U64 .AND. .NOT.ln_cndi_P07 ) ) THEN
978         CALL ctl_stop( 'ice_thd_zdf_init: choose one and only one formulation for thermal conduction (ln_cndi_U64 or ln_cndi_P07)' )
979      ENDIF
980
981      !                             !== set the choice of ice vertical thermodynamic formulation ==!
982      ioptio = 0 
983      !      !--- BL99 thermo dynamics                               (linear liquidus + constant thermal properties)
984      IF( ln_zdf_BL99 ) THEN   ;   ioptio = ioptio + 1   ;   nice_zdf = np_BL99   ;   ENDIF
985      IF( ioptio /= 1 )    CALL ctl_stop( 'ice_thd_init: one and only one ice thermo option has to be defined ' )
986      !
987   END SUBROUTINE ice_thd_zdf_init
988
989#else
990   !!----------------------------------------------------------------------
991   !!   Default option       Dummy Module             No ESIM sea-ice model
992   !!----------------------------------------------------------------------
993#endif
994
995   !!======================================================================
996END MODULE icethd_zdf
Note: See TracBrowser for help on using the repository browser.