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_ent.F90 in trunk/NEMO/LIM_SRC_3 – NEMO

source: trunk/NEMO/LIM_SRC_3/limthd_ent.F90 @ 867

Last change on this file since 867 was 834, checked in by ctlod, 16 years ago

Clean comments and useless lines, see ticket:#72

File size: 26.2 KB
Line 
1MODULE limthd_ent
2#if defined key_lim3
3   !!----------------------------------------------------------------------
4   !!   'key_lim3'                                      LIM3 sea-ice model
5   !!----------------------------------------------------------------------
6   !!======================================================================
7   !!                       ***  MODULE limthd_ent   ***
8   !!                  Redistribution of Enthalpy in the ice
9   !!                        on the new vertical grid
10   !!                       after vertical growth/decay
11   !!======================================================================
12   !!   lim_thd_ent : ice redistribution of enthalpy
13
14   !! * Modules used
15   USE par_oce          ! ocean parameters
16   USE dom_oce
17   USE domain
18   USE in_out_manager
19   USE phycst
20   USE ice_oce         ! ice variables
21   USE thd_ice
22   USE iceini
23   USE limistate
24   USE ice
25   USE limvar
26   USE par_ice
27
28   IMPLICIT NONE
29   PRIVATE
30
31   !! * Routine accessibility
32   PUBLIC  lim_thd_ent     ! called by lim_thd
33
34   !! * Module variables
35   REAL(wp)  ::           &  ! constant values
36      epsi20 = 1.e-20  ,  &
37      epsi13 = 1.e-13  ,  &
38      zzero  = 0.e0    ,  &
39      zone   = 1.e0    ,  &
40      epsi10 = 1.0e-10
41
42   !!----------------------------------------------------------------------
43   !!   LIM 3.0,  UCL-ASTR-LOCEAN-IPSL (2008)
44   !!----------------------------------------------------------------------
45CONTAINS
46
47      SUBROUTINE lim_thd_ent(kideb,kiut,jl)
48      !!-------------------------------------------------------------------
49      !!               ***   ROUTINE lim_thd_ent  ***
50      !!
51      !! ** Purpose :
52      !!           This routine computes new vertical grids
53      !!           in the ice and in the snow, and consistently redistributes
54      !!           temperatures in the snow / ice.
55      !!           Redistribution is made so as to ensure to energy conservation
56      !!
57      !!
58      !! ** Method  : linear conservative remapping
59      !!           
60      !! ** Steps : 1) Grid
61      !!            2) Switches
62      !!            3) Snow redistribution
63      !!            4) Ice enthalpy redistribution
64      !!            5) Ice salinity, recover temperature
65      !!
66      !! ** Arguments
67      !!
68      !! ** Inputs / Outputs
69      !!
70      !! ** External
71      !!
72      !! ** References : Bitz & Lipscomb, JGR 99; Vancoppenolle et al., GRL, 2005
73      !!
74      !! ** History  : (05-2003) Martin V. UCL-Astr
75      !!               (07-2005) Martin for 3d adapatation
76      !!               (11-2006) Vectorized by Xavier Fettweis (ASTR)
77      !!               (03-2008) Energy conservation and clean code
78      !! * Arguments
79
80      INTEGER , INTENT(IN)::  &
81         kideb          ,   &  ! start point on which the the computation is applied
82         kiut           ,   &  ! end point on which the the computation is applied
83         jl                    ! thickness category number
84
85      INTEGER ::            &
86         ji,jk          ,   &  !  dummy loop indices
87         zji, zjj       ,   &  !  dummy indices
88         ntop0          ,   &  !  old layer top index
89         nbot1          ,   &  !  new layer bottom index
90         ntop1          ,   &  !  new layer top index
91         limsum         ,   &  !  temporary loop index
92         nlayi0,nlays0  ,   &  !  old number of layers
93         maxnbot0       ,   &  !  old layer bottom index
94         layer0, layer1        !  old/new layer indexes
95
96      INTEGER, DIMENSION(jpij) :: &
97         snswi          ,   &  !  snow switch
98         nbot0          ,   &  !  old layer bottom index
99         icsuind        ,   &  !  ice surface index
100         icsuswi        ,   &  !  ice surface switch
101         icboind        ,   &  !  ice bottom index
102         icboswi        ,   &  !  ice bottom switch
103         snicind        ,   &  !  snow ice index
104         snicswi        ,   &  !  snow ice switch
105         snind                 !  snow index
106
107      REAL(wp) :: &
108         zeps, zeps6    ,   &  ! numerical constant very small
109         ztmelts        ,   &  ! ice melting point
110         zqsnic         ,   &  ! enthalpy of snow ice layer
111         zhsnow         ,   &  ! temporary snow thickness variable
112         zswitch        ,   &  ! dummy switch argument
113         zfac1          ,   &  ! dummy factor
114         zfac2          ,   &  ! dummy factor
115         ztform         ,   &  !: bottom formation temperature
116         zaaa           ,   &  !: dummy factor
117         zbbb           ,   &  !: dummy factor
118         zccc           ,   &  !: dummy factor
119         zdiscrim              !: dummy factor
120
121      REAL(wp), DIMENSION(jpij) :: & 
122         zh_i           ,   &  ! thickness of an ice layer
123         zh_s           ,   &  ! thickness of a snow layer
124         zqsnow         ,   &  ! enthalpy of the snow put in snow ice   
125         zdeltah               ! temporary variable
126
127      REAL(wp), DIMENSION(jpij,0:jkmax+3) :: &
128         zm0            ,   &  !  old layer-system vertical cotes
129         qm0            ,   &  !  old layer-system heat content
130         z_s            ,   &  !  new snow system vertical cotes
131         z_i            ,   &  !  new ice system vertical cotes
132         zthick0               !  old ice thickness
133
134      REAL(wp), DIMENSION(jpij,0:jkmax+3) :: &
135         zhl0                  ! old and new layer thicknesses
136 
137      REAL(wp), DIMENSION(0:jkmax+3,0:jkmax+3) :: &
138         zrl01
139
140      ! Energy conservation
141      REAL(wp), DIMENSION(jpij) :: &
142         zqti_in, zqts_in,         &
143         zqti_fin, zqts_fin
144
145!------------------------------------------------------------------------------|
146
147      zeps   = 1.0d-20
148      zeps6  = 1.0d-06
149      zthick0(:,:) = 0.0
150      zm0(:,:)     = 0.0
151      qm0(:,:)     = 0.0
152      zrl01(:,:)   = 0.0
153      zhl0(:,:)    = 0.0
154      z_i(:,:)     = 0.0
155      z_s(:,:)     = 0.0
156
157!
158!------------------------------------------------------------------------------|
159!  1) Grid                                                                     |
160!------------------------------------------------------------------------------|
161!
162      nlays0        = nlay_s
163      nlayi0        = nlay_i
164
165      DO ji = kideb, kiut
166         zh_i(ji)   = old_ht_i_b(ji) / nlay_i 
167         zh_s(ji)   = old_ht_s_b(ji) / nlay_s
168      ENDDO
169
170!
171!------------------------------------------------------------------------------|
172!  2) Switches                                                                 |
173!------------------------------------------------------------------------------|
174!
175      ! 2.1 snind(ji), snswi(ji)
176      ! snow surface behaviour : computation of snind(ji)-snswi(ji)
177      ! snind(ji) : index which equals
178      !   0 if snow is accumulating
179      !   1 if 1st layer is melting
180      !   2 if 2nd layer is melting ...
181      DO ji = kideb, kiut
182        snind(ji)     = 0
183        zdeltah(ji)   = 0.0
184      ENDDO !ji
185
186      DO jk = 1, nlays0
187        DO ji = kideb, kiut
188           snind(ji)  = jk        *      INT(MAX(0.0,SIGN(1.0,-dh_s_tot(ji)-zdeltah(ji)-zeps))) &
189                      + snind(ji) * (1 - INT(MAX(0.0,SIGN(1.0,-dh_s_tot(ji)-zdeltah(ji)-zeps))))
190           zdeltah(ji)= zdeltah(ji) + zh_s(ji)
191        END DO ! ji
192      ENDDO ! jk
193
194      ! snswi(ji) : switch which value equals 1 if snow melts
195      !              0 if not
196      DO ji = kideb, kiut
197         snswi(ji)     = MAX(0,INT(-dh_s_tot(ji)/MAX(zeps,ABS(dh_s_tot(ji)))))
198      ENDDO ! ji
199       
200      ! 2.2 icsuind(ji), icsuswi(ji)
201      ! ice surface behaviour : computation of icsuind(ji)-icsuswi(ji)
202      ! icsuind(ji) : index which equals
203      !     0 if nothing happens at the surface
204      !     1 if first layer is melting
205      !     2 if 2nd layer is reached by melt ...
206      DO ji = kideb, kiut
207        icsuind(ji)   = 0
208        zdeltah(ji)   = 0.0
209      ENDDO !ji
210      DO jk = 1, nlayi0
211        DO ji = kideb, kiut
212          icsuind(ji) = jk          *      INT(MAX(0.0,SIGN(1.0,-dh_i_surf(ji)-zdeltah(ji)-zeps))) &
213                      + icsuind(ji) * (1 - INT(MAX(0.0,SIGN(1.0,-dh_i_surf(ji)-zdeltah(ji)-zeps))))
214          zdeltah(ji) = zdeltah(ji) + zh_i(ji)
215        END DO ! ji
216      ENDDO !jk
217
218      ! icsuswi(ji) : switch which equals
219      !     1 if ice melts at the surface
220      !     0 if not
221      DO ji = kideb, kiut
222         icsuswi(ji)  = MAX(0,INT(-dh_i_surf(ji)/MAX(zeps , ABS(dh_i_surf(ji)) ) ) )
223      ENDDO
224
225      ! 2.3 icboind(ji), icboswi(ji)
226      ! ice bottom behaviour : computation of icboind(ji)-icboswi(ji)
227      ! icboind(ji) : index which equals
228      !     0 if accretion is on the way
229      !     1 if last layer has started to melt
230      !     2 if penultiem layer is melting ... and so on
231      !            N+1 if all layers melt and that snow transforms into ice
232      DO ji = kideb, kiut 
233        icboind(ji)   = 0
234        zdeltah(ji)   = 0.0
235      ENDDO
236      DO jk = nlayi0, 1, -1
237        DO ji = kideb, kiut
238          icboind(ji) = (nlayi0+1-jk) &
239                      *      INT(MAX(0.0,SIGN(1.0,-dh_i_bott(ji)-zdeltah(ji)-zeps))) &
240                      + icboind(ji) &
241                      * (1 - INT(MAX(0.0,SIGN(1.0,-dh_i_bott(ji)-zdeltah(ji)-zeps)))) 
242          zdeltah(ji) = zdeltah(ji) + zh_i(ji)
243        END DO
244      ENDDO
245
246      DO ji = kideb, kiut
247         ! case of total ablation with remaining snow
248         IF ( ( ht_i_b(ji) .GT. zeps ) .AND. &
249              ( ht_i_b(ji) - dh_snowice(ji) .LT. zeps ) ) icboind(ji) = nlay_i + 1
250      END DO
251
252      ! icboswi(ji) : switch which equals
253      !     1 if ice accretion is on the way
254      !     0 if ablation is on the way
255      DO ji = kideb, kiut 
256         icboswi(ji)     = MAX(0,INT(dh_i_bott(ji) / MAX(zeps,ABS(dh_i_bott(ji)))))
257      ENDDO
258
259      ! 2.4 snicind(ji), snicswi(ji)
260      ! snow ice formation : calcul de snicind(ji)-snicswi(ji)
261      ! snicind(ji) : index which equals
262      !     0 if no snow-ice forms
263      !     1 if last layer of snow has started to melt
264      !     2 if penultiem layer ...
265      DO ji = kideb, kiut
266        snicind(ji)   = 0
267        zdeltah(ji)   = 0.0
268      ENDDO
269      DO jk = nlays0, 1, -1
270        DO ji = kideb, kiut
271          snicind(ji) = (nlays0+1-jk) &
272                      *      INT(MAX(0.0,SIGN(1.0,dh_snowice(ji)-zdeltah(ji)-zeps))) &
273                      + snicind(ji) &
274                      * (1 - INT(MAX(0.0,SIGN(1.0,dh_snowice(ji)-zdeltah(ji)-zeps))))
275          zdeltah(ji) = zdeltah(ji) + zh_s(ji)
276        END DO
277      ENDDO
278
279      ! snicswi(ji) : switch which equals
280      !     1 if snow-ice forms
281      !     0 if not
282      DO ji = kideb, kiut
283        snicswi(ji)   = MAX(0,INT(dh_snowice(ji)/MAX(zeps,ABS(dh_snowice(ji)))))
284      ENDDO
285
286!
287!------------------------------------------------------------------------------|
288!  3) Snow redistribution                                                      |
289!------------------------------------------------------------------------------|
290!
291      !-------------
292      ! Old profile
293      !-------------
294
295      ! by 'old', it is meant that layers coming from accretion are included,
296      ! and that interfacial layers which were partly melted are reduced
297
298      ! indexes of the vectors
299      !------------------------
300      ntop0                =  1
301      maxnbot0             =  0
302
303      DO ji = kideb, kiut
304        nbot0(ji)          =  nlays0  + 1 - snind(ji) + ( 1. - snicind(ji) ) * &
305                              snicswi(ji)
306        ! cotes of the top of the layers
307        zm0(ji,0)          =  0.0
308        maxnbot0           =  MAX ( maxnbot0 , nbot0(ji) )
309      ENDDO 
310
311      DO jk = 1, maxnbot0
312        DO ji = kideb, kiut
313        !change
314           limsum      = ( 1 - snswi(ji) ) * ( jk - 1 ) +                      &
315                               snswi(ji) * ( jk + snind(ji) - 1 )
316           limsum      = MIN( limsum , nlay_s )
317           zm0(ji,jk)  =  dh_s_tot(ji) + zh_s(ji) * limsum
318        END DO
319      ENDDO
320
321      DO ji = kideb, kiut
322         zm0(ji,nbot0(ji)) =  dh_s_tot(ji) - snicswi(ji) * dh_snowice(ji) + &
323                              zh_s(ji) * nlays0
324         zm0(ji,1)         =  dh_s_tot(ji) * (1 -snswi(ji) ) +              &
325                              snswi(ji) * zm0(ji,1)
326      ENDDO
327
328      DO jk = ntop0, maxnbot0
329        DO ji = kideb, kiut
330        ! layer thickness
331           zthick0(ji,jk)  =  zm0(ji,jk) - zm0(ji,jk-1)
332        END DO
333      ENDDO
334
335      zqts_in(:) = 0.0
336     
337      DO ji = kideb, kiut
338        ! layer heat content
339        qm0(ji,1)   =  rhosn * ( cpic * ( rtt - ( 1. - snswi(ji) ) * ( tatm_ice_1d(ji) ) &
340                                            - snswi(ji) * t_s_b(ji,1) )         &
341                               + lfus ) * zthick0(ji,1)
342        zqts_in(ji) =  zqts_in(ji) + qm0(ji,1) 
343      ENDDO
344
345      DO jk = 2, maxnbot0
346        DO ji = kideb, kiut
347          limsum      = ( 1 - snswi(ji) ) * ( jk - 1 ) +                      &
348                                snswi(ji) * ( jk + snind(ji) - 1 )
349          limsum      = MIN( limsum , nlay_s )
350          qm0(ji,jk)  = rhosn * ( cpic * ( rtt - t_s_b(ji,limsum) ) + lfus )  &
351                      * zthick0(ji,jk)
352          zswitch = 1.0 - MAX (0.0, SIGN ( 1.0, zeps - ht_s_b(ji) ) )
353          zqts_in(ji) = zqts_in(ji) + ( 1. - snswi(ji) ) * qm0(ji,jk) * zswitch
354        END DO ! jk
355      ENDDO ! ji
356
357      !------------------------------------------------
358      ! Energy given by the snow in snow-ice formation
359      !------------------------------------------------
360      ! zqsnow, enthalpy of the flooded snow
361      DO ji = kideb, kiut
362        zqsnow(ji)     =  rhosn*lfus
363        zdeltah(ji)    =  0.0
364      ENDDO
365
366      DO jk =  nlays0, 1, -1
367        DO ji = kideb, kiut
368           zhsnow      =  MAX(0.0,dh_snowice(ji)-zdeltah(ji))
369           zqsnow(ji)  =  zqsnow(ji) + &
370                          rhosn*cpic*(rtt-t_s_b(ji,jk))
371           zdeltah(ji) =  zdeltah(ji) + zh_s(ji)
372        END DO
373      ENDDO
374
375      DO ji = kideb, kiut
376         zqsnow(ji) = zqsnow(ji) * dh_snowice(ji)
377      END DO
378
379      !------------------
380      ! new snow profile
381      !------------------
382
383      !--------------
384      ! Vector index   
385      !--------------
386      ntop1    =  1
387      nbot1    =  nlay_s
388
389      !-------------------
390      ! Layer coordinates
391      !-------------------
392      DO ji = kideb, kiut
393         zh_s(ji)  = ht_s_b(ji) / nlay_s
394         z_s(ji,0) =  0.0
395      ENDDO
396
397      DO jk = 1, nlay_s
398        DO ji = kideb, kiut
399           z_s(ji,jk) =  zh_s(ji) * jk
400        END DO
401      ENDDO
402
403      !-----------------
404      ! Layer thickness
405      !-----------------
406      DO layer0 = ntop0, maxnbot0
407        DO ji = kideb, kiut
408           zhl0(ji,layer0) = zm0(ji,layer0) - zm0(ji,layer0-1)
409        END DO
410      ENDDO
411
412      DO layer1 = ntop1, nbot1
413        DO ji = kideb, kiut
414           q_s_b(ji,layer1)= 0.0
415        END DO
416      ENDDO
417
418      !----------------
419      ! Weight factors
420      !----------------
421      DO layer0 = ntop0, maxnbot0
422        DO layer1 = ntop1, nbot1
423           DO ji = kideb, kiut
424              zrl01(layer1,layer0) = MAX(0.0,( MIN(zm0(ji,layer0),z_s(ji,layer1)) &
425              - MAX(zm0(ji,layer0-1), z_s(ji,layer1-1)))/MAX(zhl0(ji,layer0),epsi10)) 
426              q_s_b(ji,layer1) = q_s_b(ji,layer1) + zrl01(layer1,layer0)*qm0(ji,layer0) &
427                                   * MAX(0.0,SIGN(1.0,nbot0(ji)-layer0+zeps))
428           END DO
429        END DO
430      ENDDO
431
432      ! Heat conservation
433      zqts_fin(:) = 0.0
434      DO jk = 1, nlay_s
435         DO ji = kideb, kiut
436            zqts_fin(ji) = zqts_fin(ji) + q_s_b(ji,jk)
437         END DO
438      END DO
439
440      IF ( con_i ) THEN
441      DO ji = kideb, kiut
442         IF ( ABS ( zqts_in(ji) - zqts_fin(ji) ) / rdt_ice .GT. 1.0e-6 ) THEN
443            zji                 = MOD( npb(ji) - 1, jpi ) + 1
444            zjj                 = ( npb(ji) - 1 ) / jpi + 1
445            WRITE(numout,*) ' violation of heat conservation : ',             &
446                            ABS ( zqts_in(ji) - zqts_fin(ji) ) / rdt_ice
447            WRITE(numout,*) ' ji, jj   : ', zji, zjj
448            WRITE(numout,*) ' ht_s_b   : ', ht_s_b(ji)
449            WRITE(numout,*) ' zqts_in  : ', zqts_in(ji) / rdt_ice
450            WRITE(numout,*) ' zqts_fin : ', zqts_fin(ji) / rdt_ice
451            WRITE(numout,*) ' dh_snowice : ', dh_snowice(ji)
452            WRITE(numout,*) ' dh_s_tot : ', dh_s_tot(ji)
453            WRITE(numout,*) ' snswi    : ', snswi(ji)
454         ENDIF
455      END DO
456      ENDIF
457
458      !---------------------
459      ! Recover heat content
460      !---------------------
461      DO jk = 1, nlay_i
462         DO ji = kideb, kiut
463            q_s_b(ji,jk) = q_s_b(ji,jk) / MAX( zh_s(ji) , zeps )
464         END DO !ji
465      ENDDO !jk 
466
467      !---------------------
468      ! Recover temperature
469      !---------------------
470      zfac1 = 1. / ( rhosn * cpic )
471      zfac2 = lfus / cpic 
472      DO jk = 1, nlay_s
473        DO ji = kideb, kiut
474           zswitch = MAX ( 0.0 , SIGN ( 1.0, zeps - ht_s_b(ji) ) )
475           t_s_b(ji,jk) = rtt                                                  &
476                        + ( 1.0 - zswitch ) *                                  &
477                          ( - zfac1 * q_s_b(ji,jk) + zfac2 )
478        END DO
479      ENDDO
480!
481!------------------------------------------------------------------------------|
482!  4) Ice redistribution                                                       |
483!------------------------------------------------------------------------------|
484!
485      !-------------
486      ! OLD PROFILE
487      !-------------
488
489      !----------------
490      ! Vector indexes
491      !----------------
492      ntop0          =  1
493      maxnbot0       =  0
494
495      DO ji = kideb, kiut
496        ! reference number of the bottommost layer
497         nbot0(ji)    =  MAX( 1 ,  MIN( nlayi0 + ( 1 - icboind(ji) ) +        &
498                         ( 1 - icsuind(ji) ) * icsuswi(ji) + snicswi(ji) ,    &
499                         nlay_i + 2 ) )
500         ! maximum reference number of the bottommost layer over all domain
501         maxnbot0     =  MAX( maxnbot0 , nbot0(ji) )
502      ENDDO
503
504      !-------------------------
505      ! Cotes of old ice layers
506      !-------------------------
507      zm0(:,0)    =  0.0
508     
509      DO jk = 1, maxnbot0
510         DO ji = kideb, kiut
511            ! jk goes from 1 to nbot0
512            ! the ice layer number goes from 1 to nlay_i
513            ! limsum is the real ice layer number corresponding to present jk
514            limsum    =  ( (icsuswi(ji)*(icsuind(ji)+jk-1) + & 
515                           (1-icsuswi(ji))*jk))*(1-snicswi(ji)) + (jk-1)*snicswi(ji)
516            zm0(ji,jk)=  icsuswi(ji)*dh_i_surf(ji) + snicswi(ji)*dh_snowice(ji) &
517                      +  limsum * zh_i(ji)
518         END DO
519      ENDDO
520
521      DO ji = kideb, kiut
522         zm0(ji,nbot0(ji)) =  icsuswi(ji)*dh_i_surf(ji) + snicswi(ji)*dh_snowice(ji) + dh_i_bott(ji) &
523                           +  zh_i(ji) * nlayi0
524         zm0(ji,1)         =  snicswi(ji)*dh_snowice(ji) + (1-snicswi(ji))*zm0(ji,1)
525      ENDDO
526
527      !-----------------------------
528      ! Thickness of old ice layers
529      !-----------------------------
530      DO jk = ntop0, maxnbot0
531        DO ji = kideb, kiut
532           zthick0(ji,jk) =  zm0(ji,jk) - zm0(ji,jk-1)
533        END DO
534      ENDDO
535
536      !---------------------------
537      ! Inner layers heat content
538      !---------------------------
539      qm0(:,:) =  0.0
540      zqti_in(:) = 0.0
541
542      DO jk = ntop0, maxnbot0
543         DO ji = kideb, kiut
544            limsum =  MAX(1,MIN(snicswi(ji)*(jk-1) + icsuswi(ji)*(jk-1+icsuind(ji)) + &
545                                (1-icsuswi(ji))*(1-snicswi(ji))*jk,nlay_i))
546            ztmelts = -tmut * s_i_b(ji,limsum) + rtt
547            qm0(ji,jk) = rhoic * ( cpic * (ztmelts-t_i_b(ji,limsum)) + lfus * ( 1.0-(ztmelts-rtt)/ &
548                      MIN((t_i_b(ji,limsum)-rtt),-zeps) ) - rcp*(ztmelts-rtt) ) &
549                      * zthick0(ji,jk)
550         END DO
551      ENDDO
552
553      !----------------------------
554      ! Bottom layers heat content
555      !----------------------------
556      DO ji = kideb, kiut       
557        ztmelts    = ( 1.0 - icboswi(ji) ) * (-tmut * s_i_b(ji,nlayi0)) &   ! case of melting ice
558                   +      icboswi(ji)      * (-tmut * s_i_new(ji))      &   ! case of forming ice
559                   + rtt                        ! this temperature is in Celsius
560
561        ! bottom formation temperature
562        ztform = t_i_b(ji,nlay_i)
563        IF ( ( num_sal .EQ. 2 ) .OR. ( num_sal .EQ. 4 ) ) ztform = t_bo_b(ji)
564        qm0(ji,nbot0(ji)) = ( 1.0 - icboswi(ji) )*qm0(ji,nbot0(ji)) &   ! case of melting ice
565                   + icboswi(ji) *                                  &   ! case of forming ice
566                     rhoic*( cpic*(ztmelts-ztform)                  &
567                           + lfus *( 1.0-(ztmelts-rtt)/             &
568                             MIN ( (ztform-rtt) , - epsi10 ) )      & 
569                           - rcp*(ztmelts-rtt) )                    &
570                    *zthick0(ji,nbot0(ji))
571      ENDDO
572
573      !-----------------------------
574      ! Snow ice layer heat content
575      !-----------------------------
576      DO ji = kideb, kiut
577         ! energy of the flooding seawater
578         zqsnic = rau0 * rcp * ( rtt - t_bo_b(ji) ) * dh_snowice(ji) * &
579                  (rhoic - rhosn) / rhoic * snicswi(ji) ! generally positive
580         ! Heat conservation diagnostic
581         qt_i_in(ji,jl) = qt_i_in(ji,jl) + zqsnic 
582
583         qldif_1d(ji)   = qldif_1d(ji) + zqsnic * a_i_b(ji)
584
585         ! enthalpy of the newly formed snow-ice layer
586         ! = enthalpy of snow + enthalpy of frozen water
587         zqsnic         =  zqsnow(ji) + zqsnic
588         qm0(ji,1)      =  snicswi(ji) * zqsnic + ( 1 - snicswi(ji) ) * qm0(ji,1)
589
590      ENDDO ! ji
591
592      DO jk = ntop0, maxnbot0
593        DO ji = kideb, kiut
594           ! Heat conservation
595           zqti_in(ji) = zqti_in(ji) + qm0(ji,jk) &
596                       * MAX( 0.0 , SIGN(1.0,ht_i_b(ji)-zeps6+zeps) ) &
597                       * MAX( 0.0 , SIGN( 1. , nbot0(ji) - jk + zeps ) )
598        END DO
599      ENDDO
600
601      !-------------
602      ! NEW PROFILE
603      !-------------
604
605      !---------------
606      ! Vectors index
607      !---------------
608
609      ntop1    =  1 
610      nbot1    =  nlay_i
611
612      !------------------
613      ! Layers thickness
614      !------------------
615      DO ji = kideb, kiut
616        zh_i(ji)      = ht_i_b(ji) / nlay_i
617      ENDDO
618
619      !-------------
620      ! Layer cotes     
621      !-------------
622      z_i(:,0) =  0.0
623      DO jk = 1, nlay_i
624        DO ji = kideb, kiut
625           z_i(ji,jk) =  zh_i(ji) * jk
626        END DO
627      ENDDO
628
629      !--thicknesses of the layers
630      DO layer0 = ntop0, maxnbot0
631        DO ji = kideb, kiut
632           zhl0(ji,layer0)   =  zm0(ji,layer0) - zm0(ji,layer0-1) !thicknesses of the layers
633        END DO
634      ENDDO
635
636      !------------------------
637      ! Weights for relayering
638      !------------------------
639
640      q_i_b(:,:) = 0.0
641      DO layer0 = ntop0, maxnbot0
642        DO layer1 = ntop1, nbot1
643           DO ji = kideb, kiut
644              zrl01(layer1,layer0) = MAX(0.0,( MIN(zm0(ji,layer0),z_i(ji,layer1)) &
645              - MAX(zm0(ji,layer0-1), z_i(ji,layer1-1)))/MAX(zhl0(ji,layer0),epsi10))
646              q_i_b(ji,layer1) = q_i_b(ji,layer1) & 
647                               + zrl01(layer1,layer0)*qm0(ji,layer0) &
648                               * MAX(0.0,SIGN(1.0,ht_i_b(ji)-zeps6+zeps)) &
649                               * MAX(0.0,SIGN(1.0,nbot0(ji)-layer0+zeps))
650           END DO
651        END DO
652      ENDDO
653
654      !-------------------------
655      ! Heat conservation check
656      !-------------------------
657      zqti_fin(:) = 0.0
658      DO jk = 1, nlay_i
659         DO ji = kideb, kiut
660            zqti_fin(ji) = zqti_fin(ji) + q_i_b(ji,jk)
661         END DO
662      END DO
663!
664      DO ji = kideb, kiut
665         IF ( ABS ( zqti_in(ji) - zqti_fin(ji) ) / rdt_ice .GT. 1.0e-6 ) THEN
666            zji                 = MOD( npb(ji) - 1, jpi ) + 1
667            zjj                 = ( npb(ji) - 1 ) / jpi + 1
668            WRITE(numout,*) ' violation of heat conservation : ',             &
669                            ABS ( zqti_in(ji) - zqti_fin(ji) ) / rdt_ice
670            WRITE(numout,*) ' ji, jj   : ', zji, zjj
671            WRITE(numout,*) ' ht_i_b   : ', ht_i_b(ji)
672            WRITE(numout,*) ' zqti_in  : ', zqti_in(ji) / rdt_ice
673            WRITE(numout,*) ' zqti_fin : ', zqti_fin(ji) / rdt_ice
674            WRITE(numout,*) ' dh_i_bott: ', dh_i_bott(ji)
675            WRITE(numout,*) ' dh_i_surf: ', dh_i_surf(ji)
676            WRITE(numout,*) ' dh_snowice:', dh_snowice(ji)
677            WRITE(numout,*) ' icsuswi  : ', icsuswi(ji)
678            WRITE(numout,*) ' icboswi  : ', icboswi(ji)
679            WRITE(numout,*) ' snicswi  : ', snicswi(ji)
680         ENDIF
681      END DO
682
683      !----------------------
684      ! Recover heat content
685      !----------------------
686      DO jk = 1, nlay_i
687         DO ji = kideb, kiut
688            q_i_b(ji,jk) = q_i_b(ji,jk) / MAX( zh_i(ji) , zeps )
689         END DO !ji
690      ENDDO !jk 
691
692      ! Heat conservation
693      zqti_fin(:) = 0.0
694      DO jk = 1, nlay_i
695         DO ji = kideb, kiut
696            zqti_fin(ji) = zqti_fin(ji) + q_i_b(ji,jk) * zh_i(ji)
697         END DO
698      END DO
699
700!
701!------------------------------------------------------------------------------|
702!  5) Update salinity and recover temperature                                  |
703!------------------------------------------------------------------------------|
704!
705      ! Update salinity (basal entrapment, snow ice formation)
706      DO ji = kideb, kiut
707         sm_i_b(ji) = sm_i_b(ji)                                &
708                    + dsm_i_se_1d(ji) + dsm_i_si_1d(ji)
709      END DO !ji
710
711      ! Recover temperature
712      DO jk = 1, nlay_i
713
714         DO ji = kideb, kiut
715
716            ztmelts    =  -tmut*s_i_b(ji,jk) + rtt
717            !Conversion q(S,T) -> T (second order equation)
718            zaaa         =  cpic
719            zbbb         =  ( rcp - cpic ) * ( ztmelts - rtt ) + &
720                            q_i_b(ji,jk) / rhoic - lfus
721            zccc         =  lfus * ( ztmelts - rtt )
722            zdiscrim     =  SQRT( MAX(zbbb*zbbb - 4.0*zaaa*zccc,0.0) )
723            t_i_b(ji,jk) =  rtt - ( zbbb + zdiscrim ) / & 
724                                  ( 2.0 *zaaa )
725         END DO !ji
726
727      END DO !jk
728
729      END SUBROUTINE lim_thd_ent
730
731#else
732   !!======================================================================
733   !!                       ***  MODULE limthd_ent   ***
734   !!                             no sea ice model
735   !!======================================================================
736CONTAINS
737   SUBROUTINE lim_thd_ent          ! Empty routine
738   END SUBROUTINE lim_thd_ent
739#endif
740 END MODULE limthd_ent
Note: See TracBrowser for help on using the repository browser.