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

source: branches/2017/dev_r8183_ICEMODEL/NEMOGCM/NEMO/LIM_SRC_3/icethd_zdf.F90 @ 8585

Last change on this file since 8585 was 8585, checked in by clem, 7 years ago

add option Lupkes2015 for ice-atm drag

File size: 35.8 KB
RevLine 
[8531]1MODULE icethd_zdf
2   !!======================================================================
3   !!                       ***  MODULE icethd_zdf ***
[8534]4   !!   sea-ice: vertical heat diffusion in sea ice (computation of temperatures)
[8531]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   !!----------------------------------------------------------------------
[8534]15   !!   'key_lim3'                                       ESIM sea-ice model
[8531]16   !!----------------------------------------------------------------------
[8534]17   USE dom_oce        ! ocean space and time domain
[8531]18   USE phycst         ! physical constants (ocean directory)
19   USE ice            ! sea-ice: variables
[8534]20   USE ice1D          ! sea-ice: thermodynamics variables
[8531]21   !
22   USE in_out_manager ! I/O manager
23   USE lib_mpp        ! MPP library
[8534]24   USE lib_fortran    ! fortran utilities (glob_sum + no signed zero)
[8531]25
26   IMPLICIT NONE
27   PRIVATE
28
[8534]29   PUBLIC   ice_thd_zdf        ! called by icethd
30   PUBLIC   ice_thd_zdf_init   ! called by icestp
[8531]31
32   !!** namelist (namthd_zdf) **
[8585]33   LOGICAL  ::   ln_zdf_BL99      ! Heat diffusion follows Bitz and Lipscomb (1999)
[8531]34   LOGICAL  ::   ln_cndi_U64      ! thermal conductivity: Untersteiner (1964)
35   LOGICAL  ::   ln_cndi_P07      ! thermal conductivity: Pringle et al (2007)
36   REAL(wp) ::   rn_cnd_s         ! thermal conductivity of the snow [W/m/K]
37   REAL(wp) ::   rn_kappa_i       ! coef. for the extinction of radiation Grenfell et al. (2006) [1/m]
38   LOGICAL  ::   ln_dqns_i        ! change non-solar surface flux with changing surface temperature (T) or not (F)
39
40   !!----------------------------------------------------------------------
41   !! NEMO/ICE 4.0 , NEMO Consortium (2017)
42   !! $Id: icethd_zdf.F90 8420 2017-08-08 12:18:46Z clem $
43   !! Software governed by the CeCILL licence     (NEMOGCM/NEMO_CeCILL.txt)
44   !!----------------------------------------------------------------------
45CONTAINS
46
47   SUBROUTINE ice_thd_zdf
[8534]48      !!-------------------------------------------------------------------
[8531]49      !!                ***  ROUTINE ice_thd_zdf  ***
50      !! ** Purpose :
51      !!           This routine determines the time evolution of snow and sea-ice
52      !!           temperature profiles.
53      !! ** Method  :
54      !!           This is done by solving the heat equation diffusion with
55      !!           a Neumann boundary condition at the surface and a Dirichlet one
56      !!           at the bottom. Solar radiation is partially absorbed into the ice.
57      !!           The specific heat and thermal conductivities depend on ice salinity
58      !!           and temperature to take into account brine pocket melting. The
59      !!           numerical
60      !!           scheme is an iterative Crank-Nicolson on a non-uniform multilayer grid
61      !!           in the ice and snow system.
62      !!
63      !!           The successive steps of this routine are
[8534]64      !!           1.  initialization of ice-snow layers thicknesses
65      !!           2.  Internal absorbed and transmitted radiation
66      !!           Then iterative procedure begins
67      !!           3.  Thermal conductivity
[8531]68      !!           4.  Kappa factors
69      !!           5.  specific heat in the ice
70      !!           6.  eta factors
71      !!           7.  surface flux computation
72      !!           8.  tridiagonal system terms
73      !!           9.  solving the tridiagonal system with Gauss elimination
74      !!           Iterative procedure ends according to a criterion on evolution
75      !!           of temperature
[8534]76      !!           10. Fluxes at the interfaces
[8531]77      !!
78      !! ** Inputs / Ouputs : (global commons)
79      !!           surface temperature : t_su_1d
80      !!           ice/snow temperatures   : t_i_1d, t_s_1d
[8564]81      !!           ice salinities          : sz_i_1d
[8531]82      !!           number of layers in the ice/snow: nlay_i, nlay_s
[8563]83      !!           total ice/snow thickness : h_i_1d, h_s_1d
[8534]84      !!-------------------------------------------------------------------
[8531]85      INTEGER ::   ji, jk         ! spatial loop index
[8562]86      INTEGER ::   jm             ! current reference number of equation
87      INTEGER ::   jm_mint, jm_maxt
[8531]88      INTEGER ::   iconv          ! number of iterations in iterative procedure
89      INTEGER ::   iconv_max = 50 ! max number of iterations in iterative procedure
90     
[8562]91      INTEGER, DIMENSION(jpij) ::   jm_min    ! reference number of top equation
92      INTEGER, DIMENSION(jpij) ::   jm_max    ! reference number of bottom equation
[8531]93     
94      REAL(wp) ::   zg1s      =  2._wp        ! for the tridiagonal system
95      REAL(wp) ::   zg1       =  2._wp        !
96      REAL(wp) ::   zgamma    =  18009._wp    ! for specific heat
97      REAL(wp) ::   zbeta     =  0.117_wp     ! for thermal conductivity (could be 0.13)
98      REAL(wp) ::   zraext_s  =  10._wp       ! extinction coefficient of radiation in the snow
99      REAL(wp) ::   zkimin    =  0.10_wp      ! minimum ice thermal conductivity
100      REAL(wp) ::   ztsu_err  =  1.e-5_wp     ! range around which t_su is considered at 0C
101      REAL(wp) ::   zdti_bnd  =  1.e-4_wp     ! maximal authorized error on temperature
102      REAL(wp) ::   ztmelt_i                  ! ice melting temperature
103      REAL(wp) ::   z1_hsu
104      REAL(wp) ::   zdti_max                  ! current maximal error on temperature
105      REAL(wp) ::   zcpi                      ! Ice specific heat
106      REAL(wp) ::   zhfx_err, zdq             ! diag errors on heat
107      REAL(wp) ::   zfac                      ! dummy factor
108     
109      REAL(wp), DIMENSION(jpij)     ::   isnow       ! switch for presence (1) or absence (0) of snow
110      REAL(wp), DIMENSION(jpij)     ::   ztsub       ! surface temperature at previous iteration
111      REAL(wp), DIMENSION(jpij)     ::   zh_i, z1_h_i ! ice layer thickness
112      REAL(wp), DIMENSION(jpij)     ::   zh_s, z1_h_s ! snow layer thickness
113      REAL(wp), DIMENSION(jpij)     ::   zfsw        ! solar radiation absorbed at the surface
114      REAL(wp), DIMENSION(jpij)     ::   zqns_ice_b  ! solar radiation absorbed at the surface
[8562]115      REAL(wp), DIMENSION(jpij)     ::   zfnet       ! surface flux function
[8531]116      REAL(wp), DIMENSION(jpij)     ::   zdqns_ice_b ! derivative of the surface flux function
117      REAL(wp), DIMENSION(jpij)     ::   zftrice     ! solar radiation transmitted through the ice
118     
119      REAL(wp), DIMENSION(jpij,nlay_i)     ::   ztiold      ! Old temperature in the ice
120      REAL(wp), DIMENSION(jpij,nlay_s)     ::   ztsold      ! Old temperature in the snow
121      REAL(wp), DIMENSION(jpij,nlay_i)     ::   ztib        ! Temporary temperature in the ice to check the convergence
122      REAL(wp), DIMENSION(jpij,nlay_s)     ::   ztsb        ! Temporary temperature in the snow to check the convergence
123      REAL(wp), DIMENSION(jpij,0:nlay_i)   ::   ztcond_i    ! Ice thermal conductivity
124      REAL(wp), DIMENSION(jpij,0:nlay_i)   ::   zradtr_i    ! Radiation transmitted through the ice
125      REAL(wp), DIMENSION(jpij,0:nlay_i)   ::   zradab_i    ! Radiation absorbed in the ice
126      REAL(wp), DIMENSION(jpij,0:nlay_i)   ::   zkappa_i    ! Kappa factor in the ice
127      REAL(wp), DIMENSION(jpij,0:nlay_i)   ::   zeta_i      ! Eta factor in the ice
128      REAL(wp), DIMENSION(jpij,0:nlay_s)   ::   zradtr_s    ! Radiation transmited through the snow
129      REAL(wp), DIMENSION(jpij,0:nlay_s)   ::   zradab_s    ! Radiation absorbed in the snow
130      REAL(wp), DIMENSION(jpij,0:nlay_s)   ::   zkappa_s    ! Kappa factor in the snow
131      REAL(wp), DIMENSION(jpij,0:nlay_s)   ::   zeta_s      ! Eta factor in the snow
132      REAL(wp), DIMENSION(jpij,nlay_i+3)   ::   zindterm    ! 'Ind'ependent term
133      REAL(wp), DIMENSION(jpij,nlay_i+3)   ::   zindtbis    ! Temporary 'ind'ependent term
134      REAL(wp), DIMENSION(jpij,nlay_i+3)   ::   zdiagbis    ! Temporary 'dia'gonal term
135      REAL(wp), DIMENSION(jpij,nlay_i+3,3) ::   ztrid       ! Tridiagonal system terms
136      REAL(wp), DIMENSION(jpij)            ::   zq_ini      ! diag errors on heat
137      REAL(wp), DIMENSION(jpij)            ::   zghe        ! G(he), th. conduct enhancement factor, mono-cat
138     
139      ! Mono-category
140      REAL(wp) :: zepsilon      ! determines thres. above which computation of G(h) is done
141      REAL(wp) :: zhe           ! dummy factor
142      REAL(wp) :: zcnd_i        ! mean sea ice thermal conductivity
143      !!------------------------------------------------------------------     
144
145      ! --- diag error on heat diffusion - PART 1 --- !
[8565]146      DO ji = 1, npti
[8563]147         zq_ini(ji) = ( SUM( e_i_1d(ji,1:nlay_i) ) * h_i_1d(ji) * r1_nlay_i +  &
148            &           SUM( e_s_1d(ji,1:nlay_s) ) * h_s_1d(ji) * r1_nlay_s ) 
[8531]149      END DO
150
[8534]151      !------------------
152      ! 1) Initialization
153      !------------------
[8565]154      DO ji = 1, npti
[8563]155         isnow(ji)= 1._wp - MAX( 0._wp , SIGN(1._wp, - h_s_1d(ji) ) )  ! is there snow or not
[8531]156         ! layer thickness
[8563]157         zh_i(ji) = h_i_1d(ji) * r1_nlay_i
158         zh_s(ji) = h_s_1d(ji) * r1_nlay_s
[8531]159      END DO
160      !
[8565]161      WHERE( zh_i(1:npti) >= epsi10 )   ;   z1_h_i(1:npti) = 1._wp / zh_i(1:npti)
162      ELSEWHERE                         ;   z1_h_i(1:npti) = 0._wp
[8531]163      END WHERE
164
[8565]165      WHERE( zh_s(1:npti) >= epsi10 )   ;   z1_h_s(1:npti) = 1._wp / zh_s(1:npti)
166      ELSEWHERE                         ;   z1_h_s(1:npti) = 0._wp
[8531]167      END WHERE
168      !
169      ! temperatures
[8565]170      ztsub  (1:npti)   = t_su_1d(1:npti)  ! temperature at the previous iteration
171      ztsold (1:npti,:) = t_s_1d(1:npti,:)   ! Old snow temperature
172      ztiold (1:npti,:) = t_i_1d(1:npti,:)   ! Old ice temperature
173      t_su_1d(1:npti)   = MIN( t_su_1d(1:npti), rt0 - ztsu_err )   ! necessary
[8531]174      !
[8534]175      !-------------
176      ! 2) Radiation
177      !-------------
[8531]178      z1_hsu = 1._wp / 0.1_wp ! threshold for the computation of i0
[8565]179      DO ji = 1, npti
[8534]180         ! --- Computation of i0 --- !
[8531]181         ! i0 describes the fraction of solar radiation which does not contribute
182         ! to the surface energy budget but rather penetrates inside the ice.
183         ! We assume that no radiation is transmitted through the snow
184         ! If there is no no snow
185         ! zfsw    = (1-i0).qsr_ice   is absorbed at the surface
186         ! zftrice = io.qsr_ice       is below the surface
187         ! ftr_ice = io.qsr_ice.exp(-k(h_i)) transmitted below the ice
188         ! fr1_i0_1d = i0 for a thin ice cover, fr1_i0_2d = i0 for a thick ice cover
[8563]189         zfac = MAX( 0._wp , 1._wp - ( h_i_1d(ji) * z1_hsu ) )     
[8531]190         i0(ji) = ( 1._wp - isnow(ji) ) * ( fr1_i0_1d(ji) + zfac * fr2_i0_1d(ji) )
191
[8534]192         ! --- Solar radiation absorbed / transmitted at the surface --- !
193         !     Derivative of the non solar flux
[8531]194         zfsw   (ji)     =  qsr_ice_1d(ji) * ( 1 - i0(ji) )   ! Shortwave radiation absorbed at surface
195         zftrice(ji)     =  qsr_ice_1d(ji) *       i0(ji)     ! Solar radiation transmitted below the surface layer
196         zdqns_ice_b(ji) = dqns_ice_1d(ji)                    ! derivative of incoming nonsolar flux
197         zqns_ice_b (ji) =  qns_ice_1d(ji)                    ! store previous qns_ice_1d value
198      END DO
199
[8534]200      ! --- Transmission/absorption of solar radiation in the ice --- !
[8565]201      zradtr_s(1:npti,0) = zftrice(1:npti)
[8531]202      DO jk = 1, nlay_s
[8565]203         DO ji = 1, npti
[8531]204            !                             ! radiation transmitted below the layer-th snow layer
205            zradtr_s(ji,jk) = zradtr_s(ji,0) * EXP( - zraext_s * zh_s(ji) * REAL(jk) )
206            !                             ! radiation absorbed by the layer-th snow layer
207            zradab_s(ji,jk) = zradtr_s(ji,jk-1) - zradtr_s(ji,jk)
208         END DO
209      END DO
210         
[8565]211      zradtr_i(1:npti,0) = zradtr_s(1:npti,nlay_s) * isnow(1:npti) + zftrice(1:npti) * ( 1._wp - isnow(1:npti) )
[8531]212      DO jk = 1, nlay_i 
[8565]213         DO ji = 1, npti
[8531]214            !                             ! radiation transmitted below the layer-th ice layer
215            zradtr_i(ji,jk) = zradtr_i(ji,0) * EXP( - rn_kappa_i * zh_i(ji) * REAL(jk) )
216            !                             ! radiation absorbed by the layer-th ice layer
217            zradab_i(ji,jk) = zradtr_i(ji,jk-1) - zradtr_i(ji,jk)
218         END DO
219      END DO
220
[8565]221      ftr_ice_1d(1:npti) = zradtr_i(1:npti,nlay_i)   ! record radiation transmitted below the ice
[8531]222      !
223      iconv    =  0          ! number of iterations
224      zdti_max =  1000._wp   ! maximal value of error on all points
[8562]225      !                                                          !============================!
[8534]226      DO WHILE ( zdti_max > zdti_bnd .AND. iconv < iconv_max )   ! Iterative procedure begins !
[8562]227         !                                                       !============================!
[8531]228         iconv = iconv + 1
229         !
[8565]230         ztib(1:npti,:) = t_i_1d(1:npti,:)
231         ztsb(1:npti,:) = t_s_1d(1:npti,:)
[8531]232         !
[8534]233         !--------------------------------
234         ! 3) Sea ice thermal conductivity
235         !--------------------------------
[8531]236         IF( ln_cndi_U64 ) THEN         !-- Untersteiner (1964) formula: k = k0 + beta.S/T
237            !
[8565]238            DO ji = 1, npti
[8564]239               ztcond_i(ji,0)      = rcdic + zbeta * sz_i_1d(ji,1)      / MIN( -epsi10, t_i_1d(ji,1) - rt0 )
240               ztcond_i(ji,nlay_i) = rcdic + zbeta * sz_i_1d(ji,nlay_i) / MIN( -epsi10, t_bo_1d(ji)  - rt0 )
[8531]241            END DO
242            DO jk = 1, nlay_i-1
[8565]243               DO ji = 1, npti
[8564]244                  ztcond_i(ji,jk) = rcdic + zbeta * 0.5_wp * ( sz_i_1d(ji,jk) + sz_i_1d(ji,jk+1) ) /  &
[8531]245                     &                      MIN( -epsi10, 0.5_wp * (t_i_1d(ji,jk) + t_i_1d(ji,jk+1)) - rt0 )
246               END DO
247            END DO
248            !
249         ELSEIF( ln_cndi_P07 ) THEN     !-- Pringle et al formula: k = k0 + beta1.S/T - beta2.T
250            !
[8565]251            DO ji = 1, npti
[8564]252               ztcond_i(ji,0)      = rcdic + 0.09_wp * sz_i_1d(ji,1) / MIN( -epsi10, t_i_1d(ji,1) - rt0 )  &
[8531]253                  &                        - 0.011_wp * ( t_i_1d(ji,1) - rt0 )
[8564]254               ztcond_i(ji,nlay_i) = rcdic + 0.09_wp * sz_i_1d(ji,nlay_i) / MIN( -epsi10, t_bo_1d(ji) - rt0 )  &
[8531]255                  &                        - 0.011_wp * ( t_bo_1d(ji) - rt0 )
256            END DO
257            DO jk = 1, nlay_i-1
[8565]258               DO ji = 1, npti
[8564]259                  ztcond_i(ji,jk) = rcdic + 0.09_wp * 0.5_wp * ( sz_i_1d(ji,jk) + sz_i_1d(ji,jk+1) ) /          &
[8531]260                     &                     MIN( -epsi10, 0.5_wp * (t_i_1d(ji,jk) + t_i_1d(ji,jk+1)) - rt0 )   &
261                     &                    - 0.011_wp * ( 0.5_wp * (t_i_1d(ji,jk) + t_i_1d(ji,jk+1)) - rt0 )
262               END DO
263            END DO
264            !
265         ENDIF
[8565]266         ztcond_i(1:npti,:) = MAX( zkimin, ztcond_i(1:npti,:) )       
[8531]267         !
[8534]268         !--- G(he) : enhancement of thermal conductivity in mono-category case
[8531]269         ! Computation of effective thermal conductivity G(h)
270         ! Used in mono-category case only to simulate an ITD implicitly
271         ! Fichefet and Morales Maqueda, JGR 1997
[8565]272         zghe(1:npti) = 1._wp
[8562]273         !
[8531]274         SELECT CASE ( nn_monocat )
275
276         CASE ( 1 , 3 )
277
278            zepsilon = 0.1_wp
[8565]279            DO ji = 1, npti
[8562]280               zcnd_i = SUM( ztcond_i(ji,:) ) / REAL( nlay_i+1, wp )                             ! Mean sea ice thermal conductivity
[8563]281               zhe = ( rn_cnd_s * h_i_1d(ji) + zcnd_i * h_s_1d(ji) ) / ( rn_cnd_s + zcnd_i )   ! Effective thickness he (zhe)
[8531]282               IF( zhe >=  zepsilon * 0.5_wp * EXP(1._wp) ) THEN
[8562]283                  zghe(ji) = MIN( 2._wp, 0.5_wp * ( 1._wp + LOG( 2._wp * zhe / zepsilon ) ) )    ! G(he)
[8531]284               ENDIF
285            END DO
286
287         END SELECT
288         !
[8534]289         !-----------------
290         ! 4) kappa factors
291         !-----------------
[8531]292         !--- Snow
293         DO jk = 0, nlay_s-1
[8565]294            DO ji = 1, npti
[8562]295               zkappa_s(ji,jk) = zghe(ji) * rn_cnd_s * z1_h_s(ji)
[8531]296            END DO
297         END DO
[8565]298         DO ji = 1, npti   ! Snow-ice interface
[8531]299            zfac = 0.5_wp * ( ztcond_i(ji,0) * zh_s(ji) + rn_cnd_s * zh_i(ji) )
300            IF( zfac > epsi10 ) THEN
301               zkappa_s(ji,nlay_s) = zghe(ji) * rn_cnd_s * ztcond_i(ji,0) / zfac
302            ELSE
303               zkappa_s(ji,nlay_s) = 0._wp
304            ENDIF
305         END DO
306
307         !--- Ice
308         DO jk = 0, nlay_i
[8565]309            DO ji = 1, npti
[8531]310               zkappa_i(ji,jk) = zghe(ji) * ztcond_i(ji,jk) * z1_h_i(ji)
311            END DO
312         END DO
[8565]313         DO ji = 1, npti   ! Snow-ice interface
[8562]314            zkappa_i(ji,0) = zkappa_s(ji,nlay_s) * isnow(ji) + zkappa_i(ji,0) * ( 1._wp - isnow(ji) )
[8531]315         END DO
316         !
[8534]317         !--------------------------------------
318         ! 5) Sea ice specific heat, eta factors
319         !--------------------------------------
[8531]320         DO jk = 1, nlay_i
[8565]321            DO ji = 1, npti
[8564]322               zcpi = cpic + zgamma * sz_i_1d(ji,jk) / MAX( ( t_i_1d(ji,jk) - rt0 ) * ( ztiold(ji,jk) - rt0 ), epsi10 )
[8531]323               zeta_i(ji,jk) = rdt_ice * r1_rhoic * z1_h_i(ji) / MAX( epsi10, zcpi ) 
324            END DO
325         END DO
326
327         DO jk = 1, nlay_s
[8565]328            DO ji = 1, npti
[8562]329               zeta_s(ji,jk) = rdt_ice * r1_rhosn * r1_cpic * z1_h_s(ji)
[8531]330            END DO
331         END DO
332         !
[8534]333         !----------------------------
334         ! 6) surface flux computation
335         !----------------------------
[8531]336         IF ( ln_dqns_i ) THEN
[8565]337            DO ji = 1, npti
[8531]338               ! update of the non solar flux according to the update in T_su
339               qns_ice_1d(ji) = qns_ice_1d(ji) + dqns_ice_1d(ji) * ( t_su_1d(ji) - ztsub(ji) )
340            END DO
341         ENDIF
342
[8565]343         DO ji = 1, npti
[8562]344            zfnet(ji) = zfsw(ji) + qns_ice_1d(ji) ! incoming = net absorbed solar radiation + non solar total flux (LWup, LWdw, SH, LH)
[8531]345         END DO
346         !
[8534]347         !----------------------------
348         ! 7) tridiagonal system terms
349         !----------------------------
[8531]350         !!layer denotes the number of the layer in the snow or in the ice
[8562]351         !!jm denotes the reference number of the equation in the tridiagonal
[8531]352         !!system, terms of tridiagonal system are indexed as following :
353         !!1 is subdiagonal term, 2 is diagonal and 3 is superdiagonal one
354
355         !!ice interior terms (top equation has the same form as the others)
[8565]356         ztrid   (1:npti,:,:) = 0._wp
357         zindterm(1:npti,:)   = 0._wp
358         zindtbis(1:npti,:)   = 0._wp
359         zdiagbis(1:npti,:)   = 0._wp
[8531]360
[8562]361         DO jm = nlay_s + 2, nlay_s + nlay_i 
[8565]362            DO ji = 1, npti
[8562]363               jk = jm - nlay_s - 1
364               ztrid(ji,jm,1)  = - zeta_i(ji,jk) * zkappa_i(ji,jk-1)
365               ztrid(ji,jm,2)  = 1.0 + zeta_i(ji,jk) * ( zkappa_i(ji,jk-1) + zkappa_i(ji,jk) )
366               ztrid(ji,jm,3)  = - zeta_i(ji,jk) * zkappa_i(ji,jk)
367               zindterm(ji,jm) = ztiold(ji,jk) + zeta_i(ji,jk) * zradab_i(ji,jk)
[8531]368            END DO
369         ENDDO
370
[8562]371         jm =  nlay_s + nlay_i + 1
[8565]372         DO ji = 1, npti
[8531]373            !!ice bottom term
[8562]374            ztrid(ji,jm,1)  = - zeta_i(ji,nlay_i)*zkappa_i(ji,nlay_i-1)   
375            ztrid(ji,jm,2)  = 1.0 + zeta_i(ji,nlay_i) * ( zkappa_i(ji,nlay_i) * zg1 + zkappa_i(ji,nlay_i-1) )
376            ztrid(ji,jm,3)  = 0.0
377            zindterm(ji,jm) = ztiold(ji,nlay_i) + zeta_i(ji,nlay_i) *  &
378               &            ( zradab_i(ji,nlay_i) + zkappa_i(ji,nlay_i) * zg1 *  t_bo_1d(ji) ) 
[8531]379         ENDDO
380
381
[8565]382         DO ji = 1, npti
[8534]383            !                               !---------------------!
[8563]384            IF ( h_s_1d(ji) > 0.0 ) THEN   !  snow-covered cells !
[8534]385               !                            !---------------------!
[8562]386               ! snow interior terms (bottom equation has the same form as the others)
387               DO jm = 3, nlay_s + 1
388                  jk = jm - 1
389                  ztrid(ji,jm,1)  = - zeta_s(ji,jk) * zkappa_s(ji,jk-1)
390                  ztrid(ji,jm,2)  = 1.0 + zeta_s(ji,jk) * ( zkappa_s(ji,jk-1) + zkappa_s(ji,jk) )
391                  ztrid(ji,jm,3)  = - zeta_s(ji,jk)*zkappa_s(ji,jk)
392                  zindterm(ji,jm) = ztsold(ji,jk) + zeta_s(ji,jk) * zradab_s(ji,jk)
[8531]393               END DO
394
[8562]395               ! case of only one layer in the ice (ice equation is altered)
[8531]396               IF ( nlay_i == 1 ) THEN
[8562]397                  ztrid(ji,nlay_s+2,3)  = 0.0
398                  zindterm(ji,nlay_s+2) = zindterm(ji,nlay_s+2) + zkappa_i(ji,1) * t_bo_1d(ji) 
[8531]399               ENDIF
400
[8534]401               IF ( t_su_1d(ji) < rt0 ) THEN   !--  case 1 : no surface melting
[8531]402
[8562]403                  jm_min(ji) = 1
404                  jm_max(ji) = nlay_i + nlay_s + 1
[8531]405
[8562]406                  ! surface equation
[8531]407                  ztrid(ji,1,1)  = 0.0
408                  ztrid(ji,1,2)  = zdqns_ice_b(ji) - zg1s * zkappa_s(ji,0)
409                  ztrid(ji,1,3)  = zg1s * zkappa_s(ji,0)
[8562]410                  zindterm(ji,1) = zdqns_ice_b(ji) * t_su_1d(ji) - zfnet(ji)
[8531]411
[8562]412                  ! first layer of snow equation
413                  ztrid(ji,2,1)  = - zkappa_s(ji,0) * zg1s * zeta_s(ji,1)
414                  ztrid(ji,2,2)  = 1.0 + zeta_s(ji,1) * ( zkappa_s(ji,1) + zkappa_s(ji,0) * zg1s )
415                  ztrid(ji,2,3)  = - zeta_s(ji,1)* zkappa_s(ji,1)
416                  zindterm(ji,2) = ztsold(ji,1) + zeta_s(ji,1) * zradab_s(ji,1)
[8531]417
[8534]418               ELSE                            !--  case 2 : surface is melting
[8531]419                  !
[8562]420                  jm_min(ji) = 2
421                  jm_max(ji) = nlay_i + nlay_s + 1
[8531]422
[8562]423                  ! first layer of snow equation
424                  ztrid(ji,2,1)  = 0.0
425                  ztrid(ji,2,2)  = 1.0 + zeta_s(ji,1) * ( zkappa_s(ji,1) + zkappa_s(ji,0) * zg1s )
426                  ztrid(ji,2,3)  = - zeta_s(ji,1)*zkappa_s(ji,1) 
[8531]427                  zindterm(ji,2) = ztsold(ji,1) + zeta_s(ji,1) *  &
[8562]428                     &           ( zradab_s(ji,1) + zkappa_s(ji,0) * zg1s * t_su_1d(ji) ) 
[8531]429               ENDIF
[8534]430            !                               !---------------------!
431            ELSE                            ! cells without snow  !
432               !                            !---------------------!
[8531]433               !
[8534]434               IF ( t_su_1d(ji) < rt0 ) THEN   !--  case 1 : no surface melting
[8531]435                  !
[8562]436                  jm_min(ji) = nlay_s + 1
437                  jm_max(ji) = nlay_i + nlay_s + 1
[8531]438
[8562]439                  ! surface equation   
440                  ztrid(ji,jm_min(ji),1)  = 0.0
441                  ztrid(ji,jm_min(ji),2)  = zdqns_ice_b(ji) - zkappa_i(ji,0)*zg1   
442                  ztrid(ji,jm_min(ji),3)  = zkappa_i(ji,0)*zg1
443                  zindterm(ji,jm_min(ji)) = zdqns_ice_b(ji)*t_su_1d(ji) - zfnet(ji)
[8531]444
[8562]445                  ! first layer of ice equation
446                  ztrid(ji,jm_min(ji)+1,1)  = - zkappa_i(ji,0) * zg1 * zeta_i(ji,1)
447                  ztrid(ji,jm_min(ji)+1,2)  = 1.0 + zeta_i(ji,1) * ( zkappa_i(ji,1) + zkappa_i(ji,0) * zg1 )
448                  ztrid(ji,jm_min(ji)+1,3)  = - zeta_i(ji,1) * zkappa_i(ji,1) 
449                  zindterm(ji,jm_min(ji)+1) = ztiold(ji,1) + zeta_i(ji,1) * zradab_i(ji,1) 
[8531]450
[8562]451                  ! case of only one layer in the ice (surface & ice equations are altered)
[8531]452                  IF ( nlay_i == 1 ) THEN
[8562]453                     ztrid(ji,jm_min(ji),1)    = 0.0
454                     ztrid(ji,jm_min(ji),2)    = zdqns_ice_b(ji) - zkappa_i(ji,0) * 2.0
455                     ztrid(ji,jm_min(ji),3)    = zkappa_i(ji,0) * 2.0
456                     ztrid(ji,jm_min(ji)+1,1)  = -zkappa_i(ji,0) * 2.0 * zeta_i(ji,1)
457                     ztrid(ji,jm_min(ji)+1,2)  = 1.0 + zeta_i(ji,1) * ( zkappa_i(ji,0) * 2.0 + zkappa_i(ji,1) )
458                     ztrid(ji,jm_min(ji)+1,3)  = 0.0
459                     zindterm(ji,jm_min(ji)+1) = ztiold(ji,1) + zeta_i(ji,1) *  &
460                        &                      ( zradab_i(ji,1) + zkappa_i(ji,1) * t_bo_1d(ji) )
[8531]461                  ENDIF
462
[8534]463               ELSE                            !--  case 2 : surface is melting
[8531]464
[8562]465                  jm_min(ji)    =  nlay_s + 2
466                  jm_max(ji)    =  nlay_i + nlay_s + 1
[8531]467
[8562]468                  ! first layer of ice equation
469                  ztrid(ji,jm_min(ji),1)  = 0.0
470                  ztrid(ji,jm_min(ji),2)  = 1.0 + zeta_i(ji,1) * ( zkappa_i(ji,1) + zkappa_i(ji,0) * zg1 ) 
471                  ztrid(ji,jm_min(ji),3)  = - zeta_i(ji,1) * zkappa_i(ji,1)
472                  zindterm(ji,jm_min(ji)) = ztiold(ji,1) + zeta_i(ji,1) *  &
473                     &                    ( zradab_i(ji,1) + zkappa_i(ji,0) * zg1 * t_su_1d(ji) ) 
[8531]474
[8562]475                  ! case of only one layer in the ice (surface & ice equations are altered)
[8531]476                  IF ( nlay_i == 1 ) THEN
[8562]477                     ztrid(ji,jm_min(ji),1)  = 0.0
478                     ztrid(ji,jm_min(ji),2)  = 1.0 + zeta_i(ji,1) * ( zkappa_i(ji,0) * 2.0 + zkappa_i(ji,1) )
479                     ztrid(ji,jm_min(ji),3)  = 0.0
480                     zindterm(ji,jm_min(ji)) = ztiold(ji,1) + zeta_i(ji,1) * ( zradab_i(ji,1) + zkappa_i(ji,1) * t_bo_1d(ji) )  &
481                        &                    + t_su_1d(ji) * zeta_i(ji,1) * zkappa_i(ji,0) * 2.0
[8531]482                  ENDIF
483
484               ENDIF
485            ENDIF
[8562]486            !
487            zindtbis(ji,jm_min(ji)) = zindterm(ji,jm_min(ji))
488            zdiagbis(ji,jm_min(ji)) = ztrid(ji,jm_min(ji),2)
489            !
[8531]490         END DO
491         !
[8534]492         !------------------------------
493         ! 8) tridiagonal system solving
494         !------------------------------
[8531]495         ! Solve the tridiagonal system with Gauss elimination method.
[8562]496         ! Thomas algorithm, from Computational fluid Dynamics, J.D. ANDERSON, McGraw-Hill 1984
497         jm_maxt = 0
498         jm_mint = nlay_i+5
[8565]499         DO ji = 1, npti
[8562]500            jm_mint = MIN(jm_min(ji),jm_mint)
501            jm_maxt = MAX(jm_max(ji),jm_maxt)
[8531]502         END DO
503
[8562]504         DO jk = jm_mint+1, jm_maxt
[8565]505            DO ji = 1, npti
[8562]506               jm = min(max(jm_min(ji)+1,jk),jm_max(ji))
507               zdiagbis(ji,jm) = ztrid(ji,jm,2)  - ztrid(ji,jm,1) * ztrid(ji,jm-1,3)  / zdiagbis(ji,jm-1)
508               zindtbis(ji,jm) = zindterm(ji,jm) - ztrid(ji,jm,1) * zindtbis(ji,jm-1) / zdiagbis(ji,jm-1)
[8531]509            END DO
510         END DO
511
[8565]512         DO ji = 1, npti
[8531]513            ! ice temperatures
[8562]514            t_i_1d(ji,nlay_i) = zindtbis(ji,jm_max(ji)) / zdiagbis(ji,jm_max(ji))
[8531]515         END DO
516
[8562]517         DO jm = nlay_i + nlay_s, nlay_s + 2, -1
[8565]518            DO ji = 1, npti
[8562]519               jk    =  jm - nlay_s - 1
520               t_i_1d(ji,jk) = ( zindtbis(ji,jm) - ztrid(ji,jm,3) * t_i_1d(ji,jk+1) ) / zdiagbis(ji,jm)
[8531]521            END DO
522         END DO
523
[8565]524         DO ji = 1, npti
[8531]525            ! snow temperatures     
[8563]526            IF( h_s_1d(ji) > 0._wp ) THEN
[8562]527               t_s_1d(ji,nlay_s) = ( zindtbis(ji,nlay_s+1) - ztrid(ji,nlay_s+1,3) * t_i_1d(ji,1) )  &
528                  &                / zdiagbis(ji,nlay_s+1)
[8531]529            ENDIF
530            ! surface temperature
531            ztsub(ji) = t_su_1d(ji)
532            IF( t_su_1d(ji) < rt0 ) THEN
[8562]533               t_su_1d(ji) = ( zindtbis(ji,jm_min(ji)) - ztrid(ji,jm_min(ji),3) *  &
534                  &          ( isnow(ji) * t_s_1d(ji,1) + ( 1._wp - isnow(ji) ) * t_i_1d(ji,1) ) ) / zdiagbis(ji,jm_min(ji))
[8531]535            ENDIF
536         END DO
537         !
[8534]538         !--------------------------------------------------------------
539         ! 9) Has the scheme converged ?, end of the iterative procedure
540         !--------------------------------------------------------------
[8531]541         ! check that nowhere it has started to melt
542         ! zdti_max is a measure of error, it has to be under zdti_bnd
543         zdti_max = 0._wp
[8565]544         DO ji = 1, npti
[8531]545            t_su_1d(ji) = MAX( MIN( t_su_1d(ji) , rt0 ) , rt0 - 100._wp )
546            zdti_max = MAX( zdti_max, ABS( t_su_1d(ji) - ztsub(ji) ) )     
547         END DO
548
549         DO jk  =  1, nlay_s
[8565]550            DO ji = 1, npti
[8531]551               t_s_1d(ji,jk) = MAX( MIN( t_s_1d(ji,jk), rt0 ), rt0 - 100._wp )
552               zdti_max = MAX( zdti_max, ABS( t_s_1d(ji,jk) - ztsb(ji,jk) ) )
553            END DO
554         END DO
555
556         DO jk  =  1, nlay_i
[8565]557            DO ji = 1, npti
[8564]558               ztmelt_i      = -tmut * sz_i_1d(ji,jk) + rt0 
[8531]559               t_i_1d(ji,jk) =  MAX( MIN( t_i_1d(ji,jk), ztmelt_i ), rt0 - 100._wp )
560               zdti_max      =  MAX( zdti_max, ABS( t_i_1d(ji,jk) - ztib(ji,jk) ) )
561            END DO
562         END DO
563
564         ! Compute spatial maximum over all errors
565         ! note that this could be optimized substantially by iterating only the non-converging points
566         IF( lk_mpp ) CALL mpp_max( zdti_max, kcom=ncomm_ice )
567
568      END DO  ! End of the do while iterative procedure
569
570      IF( ln_icectl .AND. lwp ) THEN
571         WRITE(numout,*) ' zdti_max : ', zdti_max
572         WRITE(numout,*) ' iconv    : ', iconv
573      ENDIF
574      !
[8534]575      !-----------------------------
576      ! 10) Fluxes at the interfaces
577      !-----------------------------
[8565]578      DO ji = 1, npti
[8531]579         !                                ! surface ice conduction flux
[8562]580         fc_su(ji)   =  -           isnow(ji)   * zkappa_s(ji,0) * zg1s * (t_s_1d(ji,1) - t_su_1d(ji))   &
581            &           - ( 1._wp - isnow(ji) ) * zkappa_i(ji,0) * zg1  * (t_i_1d(ji,1) - t_su_1d(ji))
[8531]582         !                                ! bottom ice conduction flux
[8562]583         fc_bo_i(ji) =  - zkappa_i(ji,nlay_i) * ( zg1*(t_bo_1d(ji) - t_i_1d(ji,nlay_i)) )
[8531]584      END DO
585
586      ! --- computes sea ice energy of melting compulsory for icethd_dh --- !
587      CALL ice_thd_enmelt
588
589      ! --- diagnose the change in non-solar flux due to surface temperature change --- !
590      IF ( ln_dqns_i ) THEN
[8565]591         DO ji = 1, npti
[8531]592            hfx_err_dif_1d(ji) = hfx_err_dif_1d(ji) - ( qns_ice_1d(ji)  - zqns_ice_b(ji) ) * a_i_1d(ji) 
593         END DO
594      END IF
595
596      ! --- diag conservation imbalance on heat diffusion - PART 2 --- !
597      !     hfx_dif = Heat flux used to warm/cool ice in W.m-2
598      !     zhfx_err = correction on the diagnosed heat flux due to non-convergence of the algorithm used to solve heat equation
[8565]599      DO ji = 1, npti
[8563]600         zdq = - zq_ini(ji) + ( SUM( e_i_1d(ji,1:nlay_i) ) * h_i_1d(ji) * r1_nlay_i +  &
601            &                   SUM( e_s_1d(ji,1:nlay_s) ) * h_s_1d(ji) * r1_nlay_s )
[8531]602
603         IF( t_su_1d(ji) < rt0 ) THEN  ! case T_su < 0degC
604            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) 
605         ELSE                          ! case T_su = 0degC
606            zhfx_err = ( fc_su(ji) + i0(ji) * qsr_ice_1d(ji) - zradtr_i(ji,nlay_i) - fc_bo_i(ji) + zdq * r1_rdtice ) * a_i_1d(ji)
607         ENDIF
608         hfx_dif_1d(ji) = hfx_dif_1d(ji) - zdq * r1_rdtice * a_i_1d(ji)
609
610         ! total heat that is sent to the ocean (i.e. not used in the heat diffusion equation)
611         hfx_err_dif_1d(ji) = hfx_err_dif_1d(ji) + zhfx_err
612
613      END DO   
614
615      ! --- Diagnostics SIMIP --- !
[8565]616      DO ji = 1, npti
[8531]617         !--- Conduction fluxes (positive downwards)
[8562]618         diag_fc_bo_1d(ji) = diag_fc_bo_1d(ji) + fc_bo_i(ji) * a_i_1d(ji) / at_i_1d(ji)
619         diag_fc_su_1d(ji) = diag_fc_su_1d(ji) + fc_su(ji)   * a_i_1d(ji) / at_i_1d(ji)
[8531]620
621         !--- Snow-ice interfacial temperature (diagnostic SIMIP)
622         zfac = rn_cnd_s * zh_i(ji) + ztcond_i(ji,1) * zh_s(ji)
623         IF( zh_s(ji) >= 1.e-3 .AND. zfac > epsi10 ) THEN
[8562]624            t_si_1d(ji) = ( rn_cnd_s       * zh_i(ji) * t_s_1d(ji,1) +   &
[8531]625               &            ztcond_i(ji,1) * zh_s(ji) * t_i_1d(ji,1) ) / zfac
626         ELSE
627            t_si_1d(ji) = t_su_1d(ji)
628         ENDIF
629      END DO
630      !
631   END SUBROUTINE ice_thd_zdf
632
633
634   SUBROUTINE ice_thd_enmelt
[8534]635      !!-------------------------------------------------------------------
[8531]636      !!                   ***  ROUTINE ice_thd_enmelt ***
637      !!                 
638      !! ** Purpose :   Computes sea ice energy of melting q_i (J.m-3) from temperature
639      !!
640      !! ** Method  :   Formula (Bitz and Lipscomb, 1999)
641      !!-------------------------------------------------------------------
642      INTEGER  ::   ji, jk   ! dummy loop indices
643      REAL(wp) ::   ztmelts  ! local scalar
644      !!-------------------------------------------------------------------
645      !
646      DO jk = 1, nlay_i             ! Sea ice energy of melting
[8565]647         DO ji = 1, npti
[8564]648            ztmelts      = - tmut  * sz_i_1d(ji,jk)
[8531]649            t_i_1d(ji,jk) = MIN( t_i_1d(ji,jk), ztmelts + rt0 ) ! Force t_i_1d to be lower than melting point
650                                                                !   (sometimes dif scheme produces abnormally high temperatures)   
651            e_i_1d(ji,jk) = rhoic * ( cpic * ( ztmelts - ( t_i_1d(ji,jk) - rt0 ) )           &
652               &                    + lfus * ( 1._wp - ztmelts / ( t_i_1d(ji,jk) - rt0 ) )   &
653               &                    - rcp  *   ztmelts )
654         END DO
655      END DO
656      DO jk = 1, nlay_s             ! Snow energy of melting
[8565]657         DO ji = 1, npti
[8531]658            e_s_1d(ji,jk) = rhosn * ( cpic * ( rt0 - t_s_1d(ji,jk) ) + lfus )
659         END DO
660      END DO
661      !
662   END SUBROUTINE ice_thd_enmelt
663
664
665   SUBROUTINE ice_thd_zdf_init
666      !!-----------------------------------------------------------------------
667      !!                   ***  ROUTINE ice_thd_zdf_init ***
668      !!                 
669      !! ** Purpose :   Physical constants and parameters associated with
670      !!                ice thermodynamics
671      !!
672      !! ** Method  :   Read the namthd_zdf namelist and check the parameters
673      !!                called at the first timestep (nit000)
674      !!
675      !! ** input   :   Namelist namthd_zdf
676      !!-------------------------------------------------------------------
677      INTEGER  ::   ios   ! Local integer output status for namelist read
678      !!
[8585]679      NAMELIST/namthd_zdf/ ln_zdf_BL99, ln_cndi_U64, ln_cndi_P07, rn_cnd_s, rn_kappa_i, ln_dqns_i
[8531]680      !!-------------------------------------------------------------------
681      !
682      REWIND( numnam_ice_ref )              ! Namelist namthd_zdf in reference namelist : Ice thermodynamics
683      READ  ( numnam_ice_ref, namthd_zdf, IOSTAT = ios, ERR = 901)
684901   IF( ios /= 0 ) CALL ctl_nam ( ios , 'namthd_zdf in reference namelist', lwp )
685
686      REWIND( numnam_ice_cfg )              ! Namelist namthd_zdf in configuration namelist : Ice thermodynamics
687      READ  ( numnam_ice_cfg, namthd_zdf, IOSTAT = ios, ERR = 902 )
688902   IF( ios /= 0 ) CALL ctl_nam ( ios , 'namthd_zdf in configuration namelist', lwp )
689      IF(lwm) WRITE ( numoni, namthd_zdf )
690      !
691      !
692      IF(lwp) THEN                          ! control print
693         WRITE(numout,*) 'ice_thd_zdf_init: Ice vertical heat diffusion'
694         WRITE(numout,*) '~~~~~~~~~~~~~~~~'
695         WRITE(numout,*) '   Namelist namthd_zdf:'
[8585]696         WRITE(numout,*) '      Diffusion follows a Bitz and Lipscomb (1999)            ln_zdf_BL99  = ', ln_zdf_BL99
[8531]697         WRITE(numout,*) '      thermal conductivity in the ice (Untersteiner 1964)     ln_cndi_U64  = ', ln_cndi_U64
698         WRITE(numout,*) '      thermal conductivity in the ice (Pringle et al 2007)    ln_cndi_P07  = ', ln_cndi_P07
699         WRITE(numout,*) '      thermal conductivity in the snow                        rn_cnd_s     = ', rn_cnd_s
700         WRITE(numout,*) '      extinction radiation parameter in sea ice               rn_kappa_i   = ', rn_kappa_i
701         WRITE(numout,*) '      change the surface non-solar flux with Tsu or not       ln_dqns_i    = ', ln_dqns_i
702     ENDIF
703      !
704      IF ( ( ln_cndi_U64 .AND. ln_cndi_P07 ) .OR. ( .NOT.ln_cndi_U64 .AND. .NOT.ln_cndi_P07 ) ) THEN
[8534]705         CALL ctl_stop( 'ice_thd_zdf_init: choose one and only one formulation for thermal conduction (ln_cndi_U64 or ln_cndi_P07)' )
[8531]706      ENDIF
707      !
708   END SUBROUTINE ice_thd_zdf_init
709
710#else
711   !!----------------------------------------------------------------------
[8534]712   !!   Default option       Dummy Module             No ESIM sea-ice model
[8531]713   !!----------------------------------------------------------------------
714#endif
715
716   !!======================================================================
717END MODULE icethd_zdf
Note: See TracBrowser for help on using the repository browser.