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.
limthd_dif.F90 in branches/2013/dev_r4028_CNRS_LIM3/NEMOGCM/NEMO/LIM_SRC_3 – NEMO

source: branches/2013/dev_r4028_CNRS_LIM3/NEMOGCM/NEMO/LIM_SRC_3/limthd_dif.F90 @ 4672

Last change on this file since 4672 was 4672, checked in by clem, 10 years ago
  • Property svn:keywords set to Id
File size: 40.2 KB
Line 
1MODULE limthd_dif
2   !!======================================================================
3   !!                       ***  MODULE limthd_dif ***
4   !!                       heat diffusion in sea ice
5   !!                   computation of surface and inner T 
6   !!======================================================================
7   !! History :  LIM  ! 02-2003 (M. Vancoppenolle) original 1D code
8   !!                 ! 06-2005 (M. Vancoppenolle) 3d version
9   !!                 ! 11-2006 (X Fettweis) Vectorization by Xavier
10   !!                 ! 04-2007 (M. Vancoppenolle) Energy conservation
11   !!            4.0  ! 2011-02 (G. Madec) dynamical allocation
12   !!             -   ! 2012-05 (C. Rousset) add penetration solar flux
13   !!----------------------------------------------------------------------
14#if defined key_lim3
15   !!----------------------------------------------------------------------
16   !!   'key_lim3'                                      LIM3 sea-ice model
17   !!----------------------------------------------------------------------
18   USE par_oce        ! ocean parameters
19   USE phycst         ! physical constants (ocean directory)
20   USE ice            ! LIM-3 variables
21   USE par_ice        ! LIM-3 parameters
22   USE thd_ice        ! LIM-3: thermodynamics
23   USE in_out_manager ! I/O manager
24   USE lib_mpp        ! MPP library
25   USE wrk_nemo       ! work arrays
26   USE lib_fortran    ! Fortran utilities (allows no signed zero when 'key_nosignedzero' defined) 
27   USE cpl_oasis3, ONLY : lk_cpl
28
29   IMPLICIT NONE
30   PRIVATE
31
32   PUBLIC   lim_thd_dif   ! called by lim_thd
33
34   REAL(wp) ::   epsi10 = 1.e-10_wp    !
35   !!----------------------------------------------------------------------
36   !! NEMO/LIM3 4.0 , UCL - NEMO Consortium (2011)
37   !! $Id$
38   !! Software governed by the CeCILL licence     (NEMOGCM/NEMO_CeCILL.txt)
39   !!----------------------------------------------------------------------
40CONTAINS
41
42   SUBROUTINE lim_thd_dif( kideb , kiut )
43      !!------------------------------------------------------------------
44      !!                ***  ROUTINE lim_thd_dif  ***
45      !! ** Purpose :
46      !!           This routine determines the time evolution of snow and sea-ice
47      !!           temperature profiles.
48      !! ** Method  :
49      !!           This is done by solving the heat equation diffusion with
50      !!           a Neumann boundary condition at the surface and a Dirichlet one
51      !!           at the bottom. Solar radiation is partially absorbed into the ice.
52      !!           The specific heat and thermal conductivities depend on ice salinity
53      !!           and temperature to take into account brine pocket melting. The
54      !!           numerical
55      !!           scheme is an iterative Crank-Nicolson on a non-uniform multilayer grid
56      !!           in the ice and snow system.
57      !!
58      !!           The successive steps of this routine are
59      !!           1.  Thermal conductivity at the interfaces of the ice layers
60      !!           2.  Internal absorbed radiation
61      !!           3.  Scale factors due to non-uniform grid
62      !!           4.  Kappa factors
63      !!           Then iterative procedure begins
64      !!           5.  specific heat in the ice
65      !!           6.  eta factors
66      !!           7.  surface flux computation
67      !!           8.  tridiagonal system terms
68      !!           9.  solving the tridiagonal system with Gauss elimination
69      !!           Iterative procedure ends according to a criterion on evolution
70      !!           of temperature
71      !!
72      !! ** Arguments :
73      !!           kideb , kiut : Starting and ending points on which the
74      !!                         the computation is applied
75      !!
76      !! ** Inputs / Ouputs : (global commons)
77      !!           surface temperature : t_su_b
78      !!           ice/snow temperatures   : t_i_b, t_s_b
79      !!           ice salinities          : s_i_b
80      !!           number of layers in the ice/snow: nlay_i, nlay_s
81      !!           profile of the ice/snow layers : z_i, z_s
82      !!           total ice/snow thickness : ht_i_b, ht_s_b
83      !!
84      !! ** External :
85      !!
86      !! ** References :
87      !!
88      !! ** History :
89      !!           (02-2003) Martin Vancoppenolle, Louvain-la-Neuve, Belgium
90      !!           (06-2005) Martin Vancoppenolle, 3d version
91      !!           (11-2006) Vectorized by Xavier Fettweis (UCL-ASTR)
92      !!           (04-2007) Energy conservation tested by M. Vancoppenolle
93      !!------------------------------------------------------------------
94      INTEGER , INTENT(in) ::   kideb, kiut   ! Start/End point on which the  the computation is applied
95
96      !! * Local variables
97      INTEGER ::   ji          ! spatial loop index
98      INTEGER ::   ii, ij      ! temporary dummy loop index
99      INTEGER ::   numeq       ! current reference number of equation
100      INTEGER ::   layer       ! vertical dummy loop index
101      INTEGER ::   nconv       ! number of iterations in iterative procedure
102      INTEGER ::   minnumeqmin, maxnumeqmax
103      INTEGER, POINTER, DIMENSION(:) ::   numeqmin   ! reference number of top equation
104      INTEGER, POINTER, DIMENSION(:) ::   numeqmax   ! reference number of bottom equation
105      INTEGER, POINTER, DIMENSION(:) ::   isnow      ! switch for presence (1) or absence (0) of snow
106      REAL(wp) ::   zg1s      =  2._wp        ! for the tridiagonal system
107      REAL(wp) ::   zg1       =  2._wp        !
108      REAL(wp) ::   zgamma    =  18009._wp    ! for specific heat
109      REAL(wp) ::   zbeta     =  0.117_wp     ! for thermal conductivity (could be 0.13)
110      REAL(wp) ::   zraext_s  =  1.e+8_wp     ! extinction coefficient of radiation in the snow
111      REAL(wp) ::   zkimin    =  0.10_wp      ! minimum ice thermal conductivity
112      REAL(wp) ::   ztsu_err  =  1.e-5_wp     ! range around which t_su is considered as 0°C
113      REAL(wp) ::   ztmelt_i    ! ice melting temperature
114      REAL(wp) ::   zerritmax   ! current maximal error on temperature
115      REAL(wp), POINTER, DIMENSION(:) ::   ztfs        ! ice melting point
116      REAL(wp), POINTER, DIMENSION(:) ::   ztsuold     ! old surface temperature (before the iterative procedure )
117      REAL(wp), POINTER, DIMENSION(:) ::   ztsuoldit   ! surface temperature at previous iteration
118      REAL(wp), POINTER, DIMENSION(:) ::   zh_i        ! ice layer thickness
119      REAL(wp), POINTER, DIMENSION(:) ::   zh_s        ! snow layer thickness
120      REAL(wp), POINTER, DIMENSION(:) ::   zfsw        ! solar radiation absorbed at the surface
121      REAL(wp), POINTER, DIMENSION(:) ::   zf          ! surface flux function
122      REAL(wp), POINTER, DIMENSION(:) ::   dzf         ! derivative of the surface flux function
123      REAL(wp), POINTER, DIMENSION(:) ::   zerrit      ! current error on temperature
124      REAL(wp), POINTER, DIMENSION(:) ::   zdifcase    ! case of the equation resolution (1->4)
125      REAL(wp), POINTER, DIMENSION(:) ::   zftrice     ! solar radiation transmitted through the ice
126      REAL(wp), POINTER, DIMENSION(:) ::   zihic, zhsu
127      REAL(wp), POINTER, DIMENSION(:,:) ::   ztcond_i    ! Ice thermal conductivity
128      REAL(wp), POINTER, DIMENSION(:,:) ::   zradtr_i    ! Radiation transmitted through the ice
129      REAL(wp), POINTER, DIMENSION(:,:) ::   zradab_i    ! Radiation absorbed in the ice
130      REAL(wp), POINTER, DIMENSION(:,:) ::   zkappa_i    ! Kappa factor in the ice
131      REAL(wp), POINTER, DIMENSION(:,:) ::   ztiold      ! Old temperature in the ice
132      REAL(wp), POINTER, DIMENSION(:,:) ::   zeta_i      ! Eta factor in the ice
133      REAL(wp), POINTER, DIMENSION(:,:) ::   ztitemp     ! Temporary temperature in the ice to check the convergence
134      REAL(wp), POINTER, DIMENSION(:,:) ::   zspeche_i   ! Ice specific heat
135      REAL(wp), POINTER, DIMENSION(:,:) ::   z_i         ! Vertical cotes of the layers in the ice
136      REAL(wp), POINTER, DIMENSION(:,:) ::   zradtr_s    ! Radiation transmited through the snow
137      REAL(wp), POINTER, DIMENSION(:,:) ::   zradab_s    ! Radiation absorbed in the snow
138      REAL(wp), POINTER, DIMENSION(:,:) ::   zkappa_s    ! Kappa factor in the snow
139      REAL(wp), POINTER, DIMENSION(:,:) ::   zeta_s       ! Eta factor in the snow
140      REAL(wp), POINTER, DIMENSION(:,:) ::   ztstemp      ! Temporary temperature in the snow to check the convergence
141      REAL(wp), POINTER, DIMENSION(:,:) ::   ztsold       ! Temporary temperature in the snow
142      REAL(wp), POINTER, DIMENSION(:,:) ::   z_s          ! Vertical cotes of the layers in the snow
143      REAL(wp), POINTER, DIMENSION(:,:) ::   zindterm   ! Independent term
144      REAL(wp), POINTER, DIMENSION(:,:) ::   zindtbis   ! temporary independent term
145      REAL(wp), POINTER, DIMENSION(:,:) ::   zdiagbis
146      REAL(wp), POINTER, DIMENSION(:,:,:) ::   ztrid   ! tridiagonal system terms
147      ! diag errors on heat
148      REAL(wp), POINTER, DIMENSION(:) :: zdq, zq_ini
149      REAL(wp)                        :: zhfx_err
150      !!------------------------------------------------------------------     
151      !
152      CALL wrk_alloc( jpij, numeqmin, numeqmax, isnow )
153      CALL wrk_alloc( jpij, ztfs, ztsuold, ztsuoldit, zh_i, zh_s, zfsw )
154      CALL wrk_alloc( jpij, zf, dzf, zerrit, zdifcase, zftrice, zihic, zhsu )
155      CALL wrk_alloc( jpij, nlay_i+1, ztcond_i, zradtr_i, zradab_i, zkappa_i, ztiold, zeta_i, ztitemp, z_i, zspeche_i, kjstart=0)
156      CALL wrk_alloc( jpij, nlay_s+1,           zradtr_s, zradab_s, zkappa_s, ztsold, zeta_s, ztstemp, z_s, kjstart=0)
157      CALL wrk_alloc( jpij, jkmax+2, zindterm, zindtbis, zdiagbis  )
158      CALL wrk_alloc( jpij, jkmax+2, 3, ztrid )
159
160      CALL wrk_alloc( jpij, zdq, zq_ini )
161
162      ! --- diag error on heat diffusion - PART 1 --- !
163      zdq(:) = 0._wp ; zq_ini(:) = 0._wp     
164      DO ji = kideb, kiut
165         zq_ini(ji) = ( SUM( q_i_b(ji,1:nlay_i) ) * ht_i_b(ji) / REAL( nlay_i ) +  &
166            &           SUM( q_s_b(ji,1:nlay_s) ) * ht_s_b(ji) / REAL( nlay_s ) ) 
167      END DO
168
169      !------------------------------------------------------------------------------!
170      ! 1) Initialization                                                            !
171      !------------------------------------------------------------------------------!
172      ! clem clean: replace just ztfs by rtt
173      DO ji = kideb , kiut
174         ! is there snow or not
175         isnow(ji)= NINT(  1._wp - MAX( 0._wp , SIGN(1._wp, - ht_s_b(ji) ) )  )
176         ! surface temperature of fusion
177         ztfs(ji) = REAL( isnow(ji) ) * rtt + REAL( 1 - isnow(ji) ) * rtt
178         ! layer thickness
179         zh_i(ji) = ht_i_b(ji) / REAL( nlay_i )
180         zh_s(ji) = ht_s_b(ji) / REAL( nlay_s )
181      END DO
182
183      !--------------------
184      ! Ice / snow layers
185      !--------------------
186
187      z_s(:,0) = 0._wp   ! vert. coord. of the up. lim. of the 1st snow layer
188      z_i(:,0) = 0._wp   ! vert. coord. of the up. lim. of the 1st ice layer
189
190      DO layer = 1, nlay_s            ! vert. coord of the up. lim. of the layer-th snow layer
191         DO ji = kideb , kiut
192            z_s(ji,layer) = z_s(ji,layer-1) + ht_s_b(ji) / REAL( nlay_s )
193         END DO
194      END DO
195
196      DO layer = 1, nlay_i            ! vert. coord of the up. lim. of the layer-th ice layer
197         DO ji = kideb , kiut
198            z_i(ji,layer) = z_i(ji,layer-1) + ht_i_b(ji) / REAL( nlay_i )
199         END DO
200      END DO
201      !
202      !------------------------------------------------------------------------------|
203      ! 2) Radiations                                                                |
204      !------------------------------------------------------------------------------|
205      !
206      !-------------------
207      ! Computation of i0
208      !-------------------
209      ! i0 describes the fraction of solar radiation which does not contribute
210      ! to the surface energy budget but rather penetrates inside the ice.
211      ! We assume that no radiation is transmitted through the snow
212      ! If there is no no snow
213      ! zfsw    = (1-i0).qsr_ice   is absorbed at the surface
214      ! zftrice = io.qsr_ice       is below the surface
215      ! ftr_ice = io.qsr_ice.exp(-k(h_i)) transmitted below the ice
216
217      DO ji = kideb , kiut
218         ! switches
219         isnow(ji) = NINT(  1._wp - MAX( 0._wp , SIGN( 1._wp , - ht_s_b(ji) ) )  ) 
220         ! hs > 0, isnow = 1
221         zhsu (ji) = hnzst  ! threshold for the computation of i0
222         zihic(ji) = MAX( 0._wp , 1._wp - ( ht_i_b(ji) / zhsu(ji) ) )     
223
224         i0(ji)    = REAL( 1 - isnow(ji) ) * ( fr1_i0_1d(ji) + zihic(ji) * fr2_i0_1d(ji) )
225         !fr1_i0_1d = i0 for a thin ice surface
226         !fr1_i0_2d = i0 for a thick ice surface
227         !            a function of the cloud cover
228         !
229         !i0(ji)     =  (1.0-FLOAT(isnow(ji)))*3.0/(100*ht_s_b(ji)+10.0)
230         !formula used in Cice
231      END DO
232
233      !-------------------------------------------------------
234      ! Solar radiation absorbed / transmitted at the surface
235      ! Derivative of the non solar flux
236      !-------------------------------------------------------
237      DO ji = kideb , kiut
238         zfsw   (ji) =  qsr_ice_1d(ji) * ( 1 - i0(ji) )   ! Shortwave radiation absorbed at surface
239         zftrice(ji) =  qsr_ice_1d(ji) *       i0(ji)     ! Solar radiation transmitted below the surface layer
240         dzf    (ji) = dqns_ice_1d(ji)                    ! derivative of incoming nonsolar flux
241      END DO
242
243      !---------------------------------------------------------
244      ! Transmission - absorption of solar radiation in the ice
245      !---------------------------------------------------------
246
247      DO ji = kideb, kiut           ! snow initialization
248         zradtr_s(ji,0) = zftrice(ji)     ! radiation penetrating through snow
249      END DO
250
251      DO layer = 1, nlay_s          ! Radiation through snow
252         DO ji = kideb, kiut
253            !                             ! radiation transmitted below the layer-th snow layer
254            zradtr_s(ji,layer) = zradtr_s(ji,0) * EXP( - zraext_s * ( MAX ( 0._wp , z_s(ji,layer) ) ) )
255            !                             ! radiation absorbed by the layer-th snow layer
256            zradab_s(ji,layer) = zradtr_s(ji,layer-1) - zradtr_s(ji,layer)
257         END DO
258      END DO
259
260      DO ji = kideb, kiut           ! ice initialization
261         zradtr_i(ji,0) = zradtr_s(ji,nlay_s) * REAL( isnow(ji) ) + zftrice(ji) * REAL( 1 - isnow(ji) )
262      END DO
263
264      DO layer = 1, nlay_i          ! Radiation through ice
265         DO ji = kideb, kiut
266            !                             ! radiation transmitted below the layer-th ice layer
267            zradtr_i(ji,layer) = zradtr_i(ji,0) * EXP( - kappa_i * ( MAX ( 0._wp , z_i(ji,layer) ) ) )
268            !                             ! radiation absorbed by the layer-th ice layer
269            zradab_i(ji,layer) = zradtr_i(ji,layer-1) - zradtr_i(ji,layer)
270         END DO
271      END DO
272
273      DO ji = kideb, kiut           ! Radiation transmitted below the ice
274         !!!ftr_ice_1d(ji) = ftr_ice_1d(ji) + iatte_1d(ji) * zradtr_i(ji,nlay_i) * a_i_b(ji) / at_i_b(ji) ! clem modif
275         ftr_ice_1d(ji) = zradtr_i(ji,nlay_i) 
276      END DO
277
278      !
279      !------------------------------------------------------------------------------|
280      !  3) Iterative procedure begins                                               |
281      !------------------------------------------------------------------------------|
282      !
283      DO ji = kideb, kiut        ! Old surface temperature
284         ztsuold  (ji) =  t_su_b(ji)                              ! temperature at the beg of iter pr.
285         ztsuoldit(ji) =  t_su_b(ji)                              ! temperature at the previous iter
286         t_su_b   (ji) =  MIN( t_su_b(ji), ztfs(ji) - ztsu_err )  ! necessary
287         !!ztsuold  (ji) =  t_su_b(ji)                              ! temperature at the beg of iter pr.
288         !!ztsuoldit(ji) =  t_su_b(ji)                              ! temperature at the previous iter
289         zerrit   (ji) =  1000._wp                                ! initial value of error
290      END DO
291
292      DO layer = 1, nlay_s       ! Old snow temperature
293         DO ji = kideb , kiut
294            ztsold(ji,layer) =  t_s_b(ji,layer)
295         END DO
296      END DO
297
298      DO layer = 1, nlay_i       ! Old ice temperature
299         DO ji = kideb , kiut
300            ztiold(ji,layer) =  t_i_b(ji,layer)
301         END DO
302      END DO
303
304      nconv     =  0           ! number of iterations
305      zerritmax =  1000._wp    ! maximal value of error on all points
306
307      DO WHILE ( zerritmax > maxer_i_thd .AND. nconv < nconv_i_thd )
308         !
309         nconv = nconv + 1
310         !
311         !------------------------------------------------------------------------------|
312         ! 4) Sea ice thermal conductivity                                              |
313         !------------------------------------------------------------------------------|
314         !
315         IF( thcon_i_swi == 0 ) THEN      ! Untersteiner (1964) formula
316            DO ji = kideb , kiut
317               ztcond_i(ji,0)        = rcdic + zbeta*s_i_b(ji,1) / MIN(-epsi10,t_i_b(ji,1)-rtt)
318               ztcond_i(ji,0)        = MAX(ztcond_i(ji,0),zkimin)
319            END DO
320            DO layer = 1, nlay_i-1
321               DO ji = kideb , kiut
322                  ztcond_i(ji,layer) = rcdic + zbeta*( s_i_b(ji,layer) + s_i_b(ji,layer+1) ) /  &
323                     MIN(-2.0_wp * epsi10, t_i_b(ji,layer)+t_i_b(ji,layer+1) - 2.0_wp * rtt)
324                  ztcond_i(ji,layer) = MAX(ztcond_i(ji,layer),zkimin)
325               END DO
326            END DO
327         ENDIF
328
329         IF( thcon_i_swi == 1 ) THEN      ! Pringle et al formula included: 2.11 + 0.09 S/T - 0.011.T
330            DO ji = kideb , kiut
331               ztcond_i(ji,0) = rcdic + 0.090_wp * s_i_b(ji,1) / MIN( -epsi10, t_i_b(ji,1)-rtt )   &
332                  &                   - 0.011_wp * ( t_i_b(ji,1) - rtt ) 
333               ztcond_i(ji,0) = MAX( ztcond_i(ji,0), zkimin )
334            END DO
335            DO layer = 1, nlay_i-1
336               DO ji = kideb , kiut
337                  ztcond_i(ji,layer) = rcdic + 0.090_wp * ( s_i_b(ji,layer) + s_i_b(ji,layer+1) )   &
338                     &                                  / MIN(-2.0_wp * epsi10, t_i_b(ji,layer)+t_i_b(ji,layer+1) - 2.0_wp * rtt)   &
339                     &                       - 0.0055_wp* ( t_i_b(ji,layer) + t_i_b(ji,layer+1) - 2.0*rtt ) 
340                  ztcond_i(ji,layer) = MAX( ztcond_i(ji,layer), zkimin )
341               END DO
342            END DO
343            DO ji = kideb , kiut
344               ztcond_i(ji,nlay_i) = rcdic + 0.090_wp * s_i_b(ji,nlay_i) / MIN(-epsi10,t_bo_b(ji)-rtt)   &
345                  &                        - 0.011_wp * ( t_bo_b(ji) - rtt ) 
346               ztcond_i(ji,nlay_i) = MAX( ztcond_i(ji,nlay_i), zkimin )
347            END DO
348         ENDIF
349         !
350         !------------------------------------------------------------------------------|
351         !  5) kappa factors                                                            |
352         !------------------------------------------------------------------------------|
353         !
354         DO ji = kideb, kiut
355
356            !-- Snow kappa factors
357            zkappa_s(ji,0)         = rcdsn / MAX(epsi10,zh_s(ji))
358            zkappa_s(ji,nlay_s)    = rcdsn / MAX(epsi10,zh_s(ji))
359         END DO
360
361         DO layer = 1, nlay_s-1
362            DO ji = kideb , kiut
363               zkappa_s(ji,layer)  = 2.0 * rcdsn / &
364                  MAX(epsi10,2.0*zh_s(ji))
365            END DO
366         END DO
367
368         DO layer = 1, nlay_i-1
369            DO ji = kideb , kiut
370               !-- Ice kappa factors
371               zkappa_i(ji,layer)  = 2.0*ztcond_i(ji,layer)/ &
372                  MAX(epsi10,2.0*zh_i(ji)) 
373            END DO
374         END DO
375
376         DO ji = kideb , kiut
377            zkappa_i(ji,0)        = ztcond_i(ji,0)/MAX(epsi10,zh_i(ji))
378            zkappa_i(ji,nlay_i)   = ztcond_i(ji,nlay_i) / MAX(epsi10,zh_i(ji))
379            !-- Interface
380            zkappa_s(ji,nlay_s)   = 2.0*rcdsn*ztcond_i(ji,0)/MAX(epsi10, &
381               (ztcond_i(ji,0)*zh_s(ji) + rcdsn*zh_i(ji)))
382            zkappa_i(ji,0)        = zkappa_s(ji,nlay_s)*REAL( isnow(ji) ) &
383               + zkappa_i(ji,0)*REAL( 1 - isnow(ji) )
384         END DO
385         !
386         !------------------------------------------------------------------------------|
387         ! 6) Sea ice specific heat, eta factors                                        |
388         !------------------------------------------------------------------------------|
389         !
390         DO layer = 1, nlay_i
391            DO ji = kideb , kiut
392               ztitemp(ji,layer)   = t_i_b(ji,layer)
393               zspeche_i(ji,layer) = cpic + zgamma*s_i_b(ji,layer)/ &
394                  MAX((t_i_b(ji,layer)-rtt)*(ztiold(ji,layer)-rtt),epsi10)
395               zeta_i(ji,layer)    = rdt_ice / MAX(rhoic*zspeche_i(ji,layer)*zh_i(ji), &
396                  epsi10)
397            END DO
398         END DO
399
400         DO layer = 1, nlay_s
401            DO ji = kideb , kiut
402               ztstemp(ji,layer) = t_s_b(ji,layer)
403               zeta_s(ji,layer)  = rdt_ice / MAX(rhosn*cpic*zh_s(ji),epsi10)
404            END DO
405         END DO
406         !
407         !------------------------------------------------------------------------------|
408         ! 7) surface flux computation                                                  |
409         !------------------------------------------------------------------------------|
410         !
411         DO ji = kideb , kiut
412            ! update of the non solar flux according to the update in T_su
413            qns_ice_1d(ji) = qns_ice_1d(ji) + dqns_ice_1d(ji) * ( t_su_b(ji) - ztsuoldit(ji) )
414
415            ! update incoming flux
416            zf(ji)    =   zfsw(ji)              & ! net absorbed solar radiation
417               + qns_ice_1d(ji)                  ! non solar total flux
418            ! (LWup, LWdw, SH, LH)
419         END DO
420
421         !
422         !------------------------------------------------------------------------------|
423         ! 8) tridiagonal system terms                                                  |
424         !------------------------------------------------------------------------------|
425         !
426         !!layer denotes the number of the layer in the snow or in the ice
427         !!numeq denotes the reference number of the equation in the tridiagonal
428         !!system, terms of tridiagonal system are indexed as following :
429         !!1 is subdiagonal term, 2 is diagonal and 3 is superdiagonal one
430
431         !!ice interior terms (top equation has the same form as the others)
432
433         DO numeq=1,jkmax+2
434            DO ji = kideb , kiut
435               ztrid(ji,numeq,1) = 0.
436               ztrid(ji,numeq,2) = 0.
437               ztrid(ji,numeq,3) = 0.
438               zindterm(ji,numeq)= 0.
439               zindtbis(ji,numeq)= 0.
440               zdiagbis(ji,numeq)= 0.
441            ENDDO
442         ENDDO
443
444         DO numeq = nlay_s + 2, nlay_s + nlay_i 
445            DO ji = kideb , kiut
446               layer              = numeq - nlay_s - 1
447               ztrid(ji,numeq,1)  =  - zeta_i(ji,layer)*zkappa_i(ji,layer-1)
448               ztrid(ji,numeq,2)  =  1.0 + zeta_i(ji,layer)*(zkappa_i(ji,layer-1) + &
449                  zkappa_i(ji,layer))
450               ztrid(ji,numeq,3)  =  - zeta_i(ji,layer)*zkappa_i(ji,layer)
451               zindterm(ji,numeq) =  ztiold(ji,layer) + zeta_i(ji,layer)* &
452                  zradab_i(ji,layer)
453            END DO
454         ENDDO
455
456         numeq =  nlay_s + nlay_i + 1
457         DO ji = kideb , kiut
458            !!ice bottom term
459            ztrid(ji,numeq,1)  =  - zeta_i(ji,nlay_i)*zkappa_i(ji,nlay_i-1)   
460            ztrid(ji,numeq,2)  =  1.0 + zeta_i(ji,nlay_i)*( zkappa_i(ji,nlay_i)*zg1 &
461               +  zkappa_i(ji,nlay_i-1) )
462            ztrid(ji,numeq,3)  =  0.0
463            zindterm(ji,numeq) =  ztiold(ji,nlay_i) + zeta_i(ji,nlay_i)* &
464               ( zradab_i(ji,nlay_i) + zkappa_i(ji,nlay_i)*zg1 &
465               *  t_bo_b(ji) ) 
466         ENDDO
467
468
469         DO ji = kideb , kiut
470            IF ( ht_s_b(ji).gt.0.0 ) THEN
471               !
472               !------------------------------------------------------------------------------|
473               !  snow-covered cells                                                          |
474               !------------------------------------------------------------------------------|
475               !
476               !!snow interior terms (bottom equation has the same form as the others)
477               DO numeq = 3, nlay_s + 1
478                  layer =  numeq - 1
479                  ztrid(ji,numeq,1)   =  - zeta_s(ji,layer)*zkappa_s(ji,layer-1)
480                  ztrid(ji,numeq,2)   =  1.0 + zeta_s(ji,layer)*( zkappa_s(ji,layer-1) + &
481                     zkappa_s(ji,layer) )
482                  ztrid(ji,numeq,3)   =  - zeta_s(ji,layer)*zkappa_s(ji,layer)
483                  zindterm(ji,numeq)  =  ztsold(ji,layer) + zeta_s(ji,layer)* &
484                     zradab_s(ji,layer)
485               END DO
486
487               !!case of only one layer in the ice (ice equation is altered)
488               IF ( nlay_i.eq.1 ) THEN
489                  ztrid(ji,nlay_s+2,3)    =  0.0
490                  zindterm(ji,nlay_s+2)   =  zindterm(ji,nlay_s+2) + zkappa_i(ji,1)* &
491                     t_bo_b(ji) 
492               ENDIF
493
494               IF ( t_su_b(ji) .LT. rtt ) THEN
495
496                  !------------------------------------------------------------------------------|
497                  !  case 1 : no surface melting - snow present                                  |
498                  !------------------------------------------------------------------------------|
499                  zdifcase(ji)    =  1.0
500                  numeqmin(ji)    =  1
501                  numeqmax(ji)    =  nlay_i + nlay_s + 1
502
503                  !!surface equation
504                  ztrid(ji,1,1) = 0.0
505                  ztrid(ji,1,2) = dzf(ji) - zg1s*zkappa_s(ji,0)
506                  ztrid(ji,1,3) = zg1s*zkappa_s(ji,0)
507                  zindterm(ji,1) = dzf(ji)*t_su_b(ji)   - zf(ji)
508
509                  !!first layer of snow equation
510                  ztrid(ji,2,1)  =  - zkappa_s(ji,0)*zg1s*zeta_s(ji,1)
511                  ztrid(ji,2,2)  =  1.0 + zeta_s(ji,1)*(zkappa_s(ji,1) + zkappa_s(ji,0)*zg1s)
512                  ztrid(ji,2,3)  =  - zeta_s(ji,1)* zkappa_s(ji,1)
513                  zindterm(ji,2) =  ztsold(ji,1) + zeta_s(ji,1)*zradab_s(ji,1)
514
515               ELSE 
516                  !
517                  !------------------------------------------------------------------------------|
518                  !  case 2 : surface is melting - snow present                                  |
519                  !------------------------------------------------------------------------------|
520                  !
521                  zdifcase(ji)    =  2.0
522                  numeqmin(ji)    =  2
523                  numeqmax(ji)    =  nlay_i + nlay_s + 1
524
525                  !!first layer of snow equation
526                  ztrid(ji,2,1)  =  0.0
527                  ztrid(ji,2,2)  =  1.0 + zeta_s(ji,1) * ( zkappa_s(ji,1) + &
528                     zkappa_s(ji,0) * zg1s )
529                  ztrid(ji,2,3)  =  - zeta_s(ji,1)*zkappa_s(ji,1) 
530                  zindterm(ji,2) = ztsold(ji,1) + zeta_s(ji,1) *            &
531                     ( zradab_s(ji,1) +                         &
532                     zkappa_s(ji,0) * zg1s * t_su_b(ji) ) 
533               ENDIF
534            ELSE
535               !
536               !------------------------------------------------------------------------------|
537               !  cells without snow                                                          |
538               !------------------------------------------------------------------------------|
539               !
540               IF (t_su_b(ji) .LT. rtt) THEN
541                  !
542                  !------------------------------------------------------------------------------|
543                  !  case 3 : no surface melting - no snow                                       |
544                  !------------------------------------------------------------------------------|
545                  !
546                  zdifcase(ji)      =  3.0
547                  numeqmin(ji)      =  nlay_s + 1
548                  numeqmax(ji)      =  nlay_i + nlay_s + 1
549
550                  !!surface equation   
551                  ztrid(ji,numeqmin(ji),1)   =  0.0
552                  ztrid(ji,numeqmin(ji),2)   =  dzf(ji) - zkappa_i(ji,0)*zg1   
553                  ztrid(ji,numeqmin(ji),3)   =  zkappa_i(ji,0)*zg1
554                  zindterm(ji,numeqmin(ji))  =  dzf(ji)*t_su_b(ji) - zf(ji)
555
556                  !!first layer of ice equation
557                  ztrid(ji,numeqmin(ji)+1,1) =  - zkappa_i(ji,0) * zg1 * zeta_i(ji,1)
558                  ztrid(ji,numeqmin(ji)+1,2) =  1.0 + zeta_i(ji,1) * ( zkappa_i(ji,1) & 
559                     + zkappa_i(ji,0) * zg1 )
560                  ztrid(ji,numeqmin(ji)+1,3) =  - zeta_i(ji,1)*zkappa_i(ji,1) 
561                  zindterm(ji,numeqmin(ji)+1)=  ztiold(ji,1) + zeta_i(ji,1)*zradab_i(ji,1) 
562
563                  !!case of only one layer in the ice (surface & ice equations are altered)
564
565                  IF (nlay_i.eq.1) THEN
566                     ztrid(ji,numeqmin(ji),1)    =  0.0
567                     ztrid(ji,numeqmin(ji),2)    =  dzf(ji) - zkappa_i(ji,0)*2.0
568                     ztrid(ji,numeqmin(ji),3)    =  zkappa_i(ji,0)*2.0
569                     ztrid(ji,numeqmin(ji)+1,1)  =  -zkappa_i(ji,0)*2.0*zeta_i(ji,1)
570                     ztrid(ji,numeqmin(ji)+1,2)  =  1.0 + zeta_i(ji,1)*(zkappa_i(ji,0)*2.0 + &
571                        zkappa_i(ji,1))
572                     ztrid(ji,numeqmin(ji)+1,3)  =  0.0
573
574                     zindterm(ji,numeqmin(ji)+1) =  ztiold(ji,1) + zeta_i(ji,1)* &
575                        ( zradab_i(ji,1) + zkappa_i(ji,1)*t_bo_b(ji) )
576                  ENDIF
577
578               ELSE
579
580                  !
581                  !------------------------------------------------------------------------------|
582                  ! case 4 : surface is melting - no snow                                        |
583                  !------------------------------------------------------------------------------|
584                  !
585                  zdifcase(ji)    =  4.0
586                  numeqmin(ji)    =  nlay_s + 2
587                  numeqmax(ji)    =  nlay_i + nlay_s + 1
588
589                  !!first layer of ice equation
590                  ztrid(ji,numeqmin(ji),1)      =  0.0
591                  ztrid(ji,numeqmin(ji),2)      =  1.0 + zeta_i(ji,1)*(zkappa_i(ji,1) + zkappa_i(ji,0)* &
592                     zg1) 
593                  ztrid(ji,numeqmin(ji),3)      =  - zeta_i(ji,1) * zkappa_i(ji,1)
594                  zindterm(ji,numeqmin(ji))     =  ztiold(ji,1) + zeta_i(ji,1)*( zradab_i(ji,1) + &
595                     zkappa_i(ji,0) * zg1 * t_su_b(ji) ) 
596
597                  !!case of only one layer in the ice (surface & ice equations are altered)
598                  IF (nlay_i.eq.1) THEN
599                     ztrid(ji,numeqmin(ji),1)  =  0.0
600                     ztrid(ji,numeqmin(ji),2)  =  1.0 + zeta_i(ji,1)*(zkappa_i(ji,0)*2.0 + &
601                        zkappa_i(ji,1))
602                     ztrid(ji,numeqmin(ji),3)  =  0.0
603                     zindterm(ji,numeqmin(ji)) =  ztiold(ji,1) + zeta_i(ji,1)* &
604                        (zradab_i(ji,1) + zkappa_i(ji,1)*t_bo_b(ji)) &
605                        + t_su_b(ji)*zeta_i(ji,1)*zkappa_i(ji,0)*2.0
606                  ENDIF
607
608               ENDIF
609            ENDIF
610
611         END DO
612
613         !
614         !------------------------------------------------------------------------------|
615         ! 9) tridiagonal system solving                                                |
616         !------------------------------------------------------------------------------|
617         !
618
619         ! Solve the tridiagonal system with Gauss elimination method.
620         ! Thomas algorithm, from Computational fluid Dynamics, J.D. ANDERSON,
621         ! McGraw-Hill 1984. 
622
623         maxnumeqmax = 0
624         minnumeqmin = jkmax+4
625
626         DO ji = kideb , kiut
627            zindtbis(ji,numeqmin(ji)) =  zindterm(ji,numeqmin(ji))
628            zdiagbis(ji,numeqmin(ji)) =  ztrid(ji,numeqmin(ji),2)
629            minnumeqmin               =  MIN(numeqmin(ji),minnumeqmin)
630            maxnumeqmax               =  MAX(numeqmax(ji),maxnumeqmax)
631         END DO
632
633         DO layer = minnumeqmin+1, maxnumeqmax
634            DO ji = kideb , kiut
635               numeq               =  min(max(numeqmin(ji)+1,layer),numeqmax(ji))
636               zdiagbis(ji,numeq)  =  ztrid(ji,numeq,2) - ztrid(ji,numeq,1)* &
637                  ztrid(ji,numeq-1,3)/zdiagbis(ji,numeq-1)
638               zindtbis(ji,numeq)  =  zindterm(ji,numeq) - ztrid(ji,numeq,1)* &
639                  zindtbis(ji,numeq-1)/zdiagbis(ji,numeq-1)
640            END DO
641         END DO
642
643         DO ji = kideb , kiut
644            ! ice temperatures
645            t_i_b(ji,nlay_i)    =  zindtbis(ji,numeqmax(ji))/zdiagbis(ji,numeqmax(ji))
646         END DO
647
648         DO numeq = nlay_i + nlay_s + 1, nlay_s + 2, -1
649            DO ji = kideb , kiut
650               layer    =  numeq - nlay_s - 1
651               t_i_b(ji,layer)  =  (zindtbis(ji,numeq) - ztrid(ji,numeq,3)* &
652                  t_i_b(ji,layer+1))/zdiagbis(ji,numeq)
653            END DO
654         END DO
655
656         DO ji = kideb , kiut
657            ! snow temperatures     
658            IF (ht_s_b(ji).GT.0._wp) &
659               t_s_b(ji,nlay_s)     =  (zindtbis(ji,nlay_s+1) - ztrid(ji,nlay_s+1,3) &
660               *  t_i_b(ji,1))/zdiagbis(ji,nlay_s+1) &
661               *        MAX(0.0,SIGN(1.0,ht_s_b(ji))) 
662
663            ! surface temperature
664            isnow(ji)     = NINT(  1.0 - MAX( 0.0 , SIGN( 1.0 , -ht_s_b(ji) )  )  )
665            ztsuoldit(ji) = t_su_b(ji)
666            IF( t_su_b(ji) < ztfs(ji) ) &
667               t_su_b(ji) = ( zindtbis(ji,numeqmin(ji)) - ztrid(ji,numeqmin(ji),3)* ( REAL( isnow(ji) )*t_s_b(ji,1)   &
668               &          + REAL( 1 - isnow(ji) )*t_i_b(ji,1) ) ) / zdiagbis(ji,numeqmin(ji)) 
669         END DO
670         !
671         !--------------------------------------------------------------------------
672         !  10) Has the scheme converged ?, end of the iterative procedure         |
673         !--------------------------------------------------------------------------
674         !
675         ! check that nowhere it has started to melt
676         ! zerrit(ji) is a measure of error, it has to be under maxer_i_thd
677         DO ji = kideb , kiut
678            t_su_b(ji) =  MAX(  MIN( t_su_b(ji) , ztfs(ji) ) , 190._wp  )
679            zerrit(ji) =  ABS( t_su_b(ji) - ztsuoldit(ji) )     
680         END DO
681
682         DO layer  =  1, nlay_s
683            DO ji = kideb , kiut
684               t_s_b(ji,layer) = MAX(  MIN( t_s_b(ji,layer), rtt ), 190._wp  )
685               zerrit(ji)      = MAX(zerrit(ji),ABS(t_s_b(ji,layer) - ztstemp(ji,layer)))
686            END DO
687         END DO
688
689         DO layer  =  1, nlay_i
690            DO ji = kideb , kiut
691               ztmelt_i        = -tmut * s_i_b(ji,layer) + rtt 
692               t_i_b(ji,layer) =  MAX(MIN(t_i_b(ji,layer),ztmelt_i), 190._wp)
693               zerrit(ji)      =  MAX(zerrit(ji),ABS(t_i_b(ji,layer) - ztitemp(ji,layer)))
694            END DO
695         END DO
696
697         ! Compute spatial maximum over all errors
698         ! note that this could be optimized substantially by iterating only the non-converging points
699         zerritmax = 0._wp
700         DO ji = kideb, kiut
701            zerritmax = MAX( zerritmax, zerrit(ji) )   
702         END DO
703         IF( lk_mpp ) CALL mpp_max( zerritmax, kcom=ncomm_ice )
704
705      END DO  ! End of the do while iterative procedure
706
707      IF( ln_nicep .AND. lwp ) THEN
708         WRITE(numout,*) ' zerritmax : ', zerritmax
709         WRITE(numout,*) ' nconv     : ', nconv
710      ENDIF
711
712      !
713      !-------------------------------------------------------------------------!
714      !   11) Fluxes at the interfaces                                          !
715      !-------------------------------------------------------------------------!
716      DO ji = kideb, kiut
717         ! forced mode only : update of latent heat fluxes (sublimation) (always >=0, upward flux)
718         IF( .NOT. lk_cpl) qla_ice_1d (ji) = MAX( 0._wp, qla_ice_1d (ji) + dqla_ice_1d(ji) * ( t_su_b(ji) - ztsuold(ji) ) )
719         !                                ! surface ice conduction flux
720         isnow(ji)       = NINT(  1._wp - MAX( 0._wp, SIGN( 1._wp, -ht_s_b(ji) ) )  )
721         fc_su(ji)       =  -     REAL( isnow(ji) ) * zkappa_s(ji,0) * zg1s * (t_s_b(ji,1) - t_su_b(ji))   &
722            &               - REAL( 1 - isnow(ji) ) * zkappa_i(ji,0) * zg1  * (t_i_b(ji,1) - t_su_b(ji))
723         !                                ! bottom ice conduction flux
724         fc_bo_i(ji)     =  - zkappa_i(ji,nlay_i) * ( zg1*(t_bo_b(ji) - t_i_b(ji,nlay_i)) )
725      END DO
726
727      !-----------------------------------------
728      ! Heat flux used to warm/cool ice in W.m-2
729      !-----------------------------------------
730      DO ji = kideb, kiut
731         IF( t_su_b(ji) < rtt ) THEN  ! case T_su < 0degC
732            hfx_dif_1d(ji) = hfx_dif_1d(ji) + ( qns_ice_1d(ji) + qsr_ice_1d(ji) - zradtr_i(ji,nlay_i) - fc_bo_i(ji) ) * a_i_b(ji)
733         ELSE                         ! case T_su = 0degC
734            hfx_dif_1d(ji) = hfx_dif_1d(ji) + ( fc_su(ji) + i0(ji) * qsr_ice_1d(ji) - zradtr_i(ji,nlay_i) - fc_bo_i(ji) ) * a_i_b(ji)
735         ENDIF
736      END DO
737
738      ! --- computes sea ice energy of melting compulsory for limthd_dh --- !
739      CALL lim_thd_enmelt( kideb, kiut )
740
741      ! --- diag error on heat diffusion - PART 2 --- !
742      DO ji = kideb, kiut
743         zdq(ji)        = - zq_ini(ji) + ( SUM( q_i_b(ji,1:nlay_i) ) * ht_i_b(ji) / REAL( nlay_i ) +  &
744            &                              SUM( q_s_b(ji,1:nlay_s) ) * ht_s_b(ji) / REAL( nlay_s ) )
745         zhfx_err    = ( fc_su(ji) + i0(ji) * qsr_ice_1d(ji) - zradtr_i(ji,nlay_i) - fc_bo_i(ji) + zdq(ji) * r1_rdtice ) 
746         hfx_err_1d(ji) = hfx_err_1d(ji) + zhfx_err * a_i_b(ji)
747         ! --- correction of qns_ice and surface conduction flux --- !
748         qns_ice_1d(ji) = qns_ice_1d(ji) - zhfx_err 
749         fc_su     (ji) = fc_su     (ji) - zhfx_err 
750         ! --- Heat flux at the ice surface in W.m-2 --- !
751         ii = MOD( npb(ji) - 1, jpi ) + 1 ; ij = ( npb(ji) - 1 ) / jpi + 1
752         hfx_in (ii,ij) = hfx_in (ii,ij) + a_i_b(ji) * ( qsr_ice_1d(ji) + qns_ice_1d(ji) )
753      END DO
754   
755      !
756      CALL wrk_dealloc( jpij, numeqmin, numeqmax, isnow )
757      CALL wrk_dealloc( jpij, ztfs, ztsuold, ztsuoldit, zh_i, zh_s, zfsw )
758      CALL wrk_dealloc( jpij, zf, dzf, zerrit, zdifcase, zftrice, zihic, zhsu )
759      CALL wrk_dealloc( jpij, nlay_i+1, ztcond_i, zradtr_i, zradab_i, zkappa_i, ztiold, zeta_i, ztitemp, z_i, zspeche_i, kjstart = 0 )
760      CALL wrk_dealloc( jpij, nlay_s+1,           zradtr_s, zradab_s, zkappa_s, ztsold, zeta_s, ztstemp, z_s, kjstart = 0 )
761      CALL wrk_dealloc( jpij, jkmax+2, zindterm, zindtbis, zdiagbis )
762      CALL wrk_dealloc( jpij, jkmax+2, 3, ztrid )
763      CALL wrk_dealloc( jpij, zdq, zq_ini )
764
765   END SUBROUTINE lim_thd_dif
766
767   SUBROUTINE lim_thd_enmelt( kideb, kiut )
768      !!-----------------------------------------------------------------------
769      !!                   ***  ROUTINE lim_thd_enmelt ***
770      !!                 
771      !! ** Purpose :   Computes sea ice energy of melting q_i (J.m-3) from temperature
772      !!
773      !! ** Method  :   Formula (Bitz and Lipscomb, 1999)
774      !!-------------------------------------------------------------------
775      INTEGER, INTENT(in) ::   kideb, kiut   ! bounds for the spatial loop
776      !
777      INTEGER  ::   ji, jk   ! dummy loop indices
778      REAL(wp) ::   ztmelts, zindb  ! local scalar
779      !!-------------------------------------------------------------------
780      !
781      DO jk = 1, nlay_i             ! Sea ice energy of melting
782         DO ji = kideb, kiut
783            ztmelts      = - tmut  * s_i_b(ji,jk) + rtt 
784            zindb        = MAX( 0._wp , SIGN( 1._wp , -(t_i_b(ji,jk) - rtt) - epsi10 ) )
785            q_i_b(ji,jk) = rhoic * ( cpic * ( ztmelts - t_i_b(ji,jk) )                                             &
786               &                   + lfus * ( 1.0 - zindb * ( ztmelts-rtt ) / MIN( t_i_b(ji,jk)-rtt, -epsi10 ) )   &
787               &                   - rcp  *                 ( ztmelts-rtt )  ) 
788         END DO
789      END DO
790      DO jk = 1, nlay_s             ! Snow energy of melting
791         DO ji = kideb, kiut
792            q_s_b(ji,jk) = rhosn * ( cpic * ( rtt - t_s_b(ji,jk) ) + lfus )
793         END DO
794      END DO
795      !
796   END SUBROUTINE lim_thd_enmelt
797
798#else
799   !!----------------------------------------------------------------------
800   !!                   Dummy Module                 No LIM-3 sea-ice model
801   !!----------------------------------------------------------------------
802CONTAINS
803   SUBROUTINE lim_thd_dif          ! Empty routine
804   END SUBROUTINE lim_thd_dif
805#endif
806   !!======================================================================
807END MODULE limthd_dif
Note: See TracBrowser for help on using the repository browser.