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 branches/dev_002_LIM/NEMO/LIM_SRC_3 – NEMO

source: branches/dev_002_LIM/NEMO/LIM_SRC_3/limthd_ent.F90 @ 830

Last change on this file since 830 was 825, checked in by ctlod, 16 years ago

dev_002_LIM : add the LIM 3.0 component, see ticketr: #71

File size: 35.9 KB
Line 
1MODULE limthd_ent
2#if defined key_lim3
3   !!======================================================================
4   !!                       ***  MODULE limthd_ent   ***
5   !!                  Redistribution of Enthalpy in the ice
6   !!                        on the new vertical grid
7   !!                       after vertical growth/decay
8   !!======================================================================
9
10   !!----------------------------------------------------------------------
11   !!   lim_thd_ent : ice temperature redistribution
12
13   !! * Modules used
14   USE par_oce          ! ocean parameters
15   USE dom_oce
16   USE domain
17   USE in_out_manager
18   USE phycst
19   USE ice_oce         ! ice variables
20   USE thd_ice
21   USE iceini
22   USE limistate
23   USE ice
24!  USE limthd
25   USE limvar
26   USE par_ice
27   USE limicepoints
28
29   IMPLICIT NONE
30   PRIVATE
31
32   !! * Routine accessibility
33   PUBLIC  lim_thd_ent     ! called by lim_thd
34
35   !! * Module variables
36   REAL(wp)  ::           &  ! constant values
37      epsi20 = 1.e-20  ,  &
38      epsi13 = 1.e-13  ,  &
39      zzero  = 0.e0    ,  &
40      zone   = 1.e0    ,  &
41      epsi10 = 1.0e-10
42
43   !!----------------------------------------------------------------------
44   !!   LIM 3.0,  UCL-ASTR-LOCEAN-IPSL (2005)
45   !!----------------------------------------------------------------------
46CONTAINS
47
48      SUBROUTINE lim_thd_ent(kideb,kiut,jl)
49      !!-------------------------------------------------------------------
50      !!               ***   ROUTINE lim_thd_ent  ***
51      !!
52      !! ** Purpose :
53      !!           This routine computes new vertical grids
54      !!           in the ice and in the snow, and consistently redistributes
55      !!           temperatures in the snow / ice.
56      !!           Redistribution is made so as to ensure to energy conservation
57      !!
58      !!
59      !! ** Method  : linear conservative remapping
60      !!           
61      !! ** Steps : 1) Switches
62      !!            2) Snow redistribution
63      !!            3) Ice enthalpy redistribution
64      !!            4) Ice salinity
65      !!            5) Inverse temperature computation from enthalpy
66      !!
67      !! ** Arguments
68      !!
69      !! ** Inputs / Outputs
70      !!
71      !! ** External
72      !!
73      !! ** References : Bitz & Lipscomb, JGR 99; Vancoppenolle et al., GRL, 2005
74      !!
75      !! ** History  : (05-2003) Martin V. UCL-Astr
76      !!               (07-2005) Martin for 3d adapatation
77      !!               (11-2006) Vectorized by Xavier Fettweis (ASTR)
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,jk_a     ,   &  !  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, zqt_in, &
143         zqti_fin, zqts_fin, zqt_fin
144
145      zeps   = 1.0d-20
146      zeps6  = 1.0d-06
147
148      IF(lwp) THEN
149         WRITE(numout,*) 
150         WRITE(numout,*) 'lim_thd_ent : Redistribution of energy in the ice ' 
151         WRITE(numout,*) '~~~~~~~~~~~'
152         WRITE(numout,*) ' kideb : ', kideb
153         WRITE(numout,*) ' kiut  : ', kiut 
154      ENDIF
155!
156!------------------------------------------------------------------------------|
157!  1) Number of layers / Thickness of the layers                               |
158!------------------------------------------------------------------------------|
159!
160      ! Number of layers depends on the ice thickness
161      ! 1 layer if ice thinner than 30 cm
162      ! 2 layers if ice thinner than 60 cm
163      ! 4 layers otherwise
164
165      nlays0        = nlay_s
166      nlayi0        = nlay_i
167
168      DO ji = kideb, kiut
169         zh_i(ji)   = old_ht_i_b(ji) / nlay_i 
170         zh_s(ji)   = old_ht_s_b(ji) / nlay_s
171      ENDDO
172
173      zthick0(:,:) = 0.0
174      zm0(:,:)     = 0.0
175      qm0(:,:)     = 0.0
176      zrl01(:,:)   = 0.0
177      zhl0(:,:)    = 0.0
178      z_i(:,:)     = 0.0
179      z_s(:,:)     = 0.0
180!
181!------------------------------------------------------------------------------|
182!  2) Switches                                                                 |
183!------------------------------------------------------------------------------|
184!
185      ! 2.1 snind(ji), snswi(ji)
186      ! snow surface behaviour : computation of snind(ji)-snswi(ji)
187      ! snind(ji) : index which equals
188      !   0 if snow is accumulating
189      !   1 if 1st layer is melting
190      !   2 if 2nd layer is melting ...
191      DO ji = kideb, kiut
192        snind(ji)     = 0
193        zdeltah(ji)   = 0.0
194      ENDDO !ji
195
196      DO jk = 1, nlays0
197        DO ji = kideb, kiut
198           snind(ji)  = jk        *      INT(MAX(0.0,SIGN(1.0,-dh_s_tot(ji)-zdeltah(ji)-zeps))) &
199                      + snind(ji) * (1 - INT(MAX(0.0,SIGN(1.0,-dh_s_tot(ji)-zdeltah(ji)-zeps))))
200           zdeltah(ji)= zdeltah(ji) + zh_s(ji)
201        END DO ! ji
202      ENDDO ! jk
203
204      ! snswi(ji) : switch which value equals 1 if snow melts
205      !              0 if not
206      DO ji = kideb, kiut
207         snswi(ji)     = MAX(0,INT(-dh_s_tot(ji)/MAX(zeps,ABS(dh_s_tot(ji)))))
208      ENDDO ! ji
209       
210      ! 2.2 icsuind(ji), icsuswi(ji)
211      ! ice surface behaviour : computation of icsuind(ji)-icsuswi(ji)
212      ! icsuind(ji) : index which equals
213      !     0 if nothing happens at the surface
214      !     1 if first layer is melting
215      !     2 if 2nd layer is reached by melt ...
216      DO ji = kideb, kiut
217        icsuind(ji)   = 0
218        zdeltah(ji)   = 0.0
219      ENDDO !ji
220      DO jk = 1, nlayi0
221        DO ji = kideb, kiut
222          icsuind(ji) = jk          *      INT(MAX(0.0,SIGN(1.0,-dh_i_surf(ji)-zdeltah(ji)-zeps))) &
223                      + icsuind(ji) * (1 - INT(MAX(0.0,SIGN(1.0,-dh_i_surf(ji)-zdeltah(ji)-zeps))))
224          zdeltah(ji) = zdeltah(ji) + zh_i(ji)
225        END DO ! ji
226      ENDDO !jk
227
228      ! icsuswi(ji) : switch which equals
229      !     1 if ice melts at the surface
230      !     0 if not
231      DO ji = kideb, kiut
232         icsuswi(ji)  = MAX(0,INT(-dh_i_surf(ji)/MAX(zeps , ABS(dh_i_surf(ji)) ) ) )
233      ENDDO
234
235      ! 2.3 icboind(ji), icboswi(ji)
236      ! ice bottom behaviour : computation of icboind(ji)-icboswi(ji)
237      ! icboind(ji) : index which equals
238      !     0 if accretion is on the way
239      !     1 if last layer has started to melt
240      !     2 if penultiem layer is melting ... and so on
241      !            N+1 if all layers melt and that snow transforms into ice
242      DO ji = kideb, kiut 
243        icboind(ji)   = 0
244        zdeltah(ji)   = 0.0
245      ENDDO
246      DO jk = nlayi0, 1, -1
247        DO ji = kideb, kiut
248          icboind(ji) = (nlayi0+1-jk) &
249                      *      INT(MAX(0.0,SIGN(1.0,-dh_i_bott(ji)-zdeltah(ji)-zeps))) &
250                      + icboind(ji) &
251                      * (1 - INT(MAX(0.0,SIGN(1.0,-dh_i_bott(ji)-zdeltah(ji)-zeps)))) 
252          zdeltah(ji) = zdeltah(ji) + zh_i(ji)
253        END DO
254      ENDDO
255
256      DO ji = kideb, kiut
257         ! case of total ablation with remaining snow
258         IF ( ( ht_i_b(ji) .GT. zeps ) .AND. &
259              ( ht_i_b(ji) - dh_snowice(ji) .LT. zeps ) ) icboind(ji) = nlay_i + 1
260      END DO
261
262      ! icboswi(ji) : switch which equals
263      !     1 if ice accretion is on the way
264      !     0 if ablation is on the way
265      DO ji = kideb, kiut 
266         icboswi(ji)     = MAX(0,INT(dh_i_bott(ji) / MAX(zeps,ABS(dh_i_bott(ji)))))
267      ENDDO
268
269      ! 2.4 snicind(ji), snicswi(ji)
270      ! snow ice formation : calcul de snicind(ji)-snicswi(ji)
271      ! snicind(ji) : index which equals
272      !     0 if no snow-ice forms
273      !     1 if last layer of snow has started to melt
274      !     2 if penultiem layer ...
275      DO ji = kideb, kiut
276        snicind(ji)   = 0
277        zdeltah(ji)   = 0.0
278      ENDDO
279      DO jk = nlays0, 1, -1
280        DO ji = kideb, kiut
281          snicind(ji) = (nlays0+1-jk) &
282                      *      INT(MAX(0.0,SIGN(1.0,dh_snowice(ji)-zdeltah(ji)-zeps))) &
283                      + snicind(ji) &
284                      * (1 - INT(MAX(0.0,SIGN(1.0,dh_snowice(ji)-zdeltah(ji)-zeps))))
285          zdeltah(ji) = zdeltah(ji) + zh_s(ji)
286        END DO
287      ENDDO
288
289      ! snicswi(ji) : switch which equals
290      !     1 if snow-ice forms
291      !     0 if not
292      DO ji = kideb, kiut
293        snicswi(ji)   = MAX(0,INT(dh_snowice(ji)/MAX(zeps,ABS(dh_snowice(ji)))))
294      ENDDO
295
296!     IF (jiindex_1d .GT. 0 ) THEN
297!     WRITE(numout,*) ' icsuind : ', icsuind(jiindex_1d)
298!     WRITE(numout,*) ' icsuswi : ', icsuswi(jiindex_1d)
299!     WRITE(numout,*) ' icboind : ', icboind(jiindex_1d)
300!     WRITE(numout,*) ' icboswi : ', icboswi(jiindex_1d)
301!     WRITE(numout,*) ' snicind : ', snicind(jiindex_1d)
302!     WRITE(numout,*) ' snicswi : ', snicswi(jiindex_1d)
303!     ENDIF
304!
305!------------------------------------------------------------------------------|
306!  3) Snow redistribution                                                      |
307!------------------------------------------------------------------------------|
308!
309      !-------------
310      ! Old profile
311      !-------------
312
313      ! by 'old', it is meant that layers coming from accretion are included,
314      ! and that interfacial layers which were partly melted are reduced
315
316      ! indexes of the vectors
317      !------------------------
318      ntop0                =  1
319      maxnbot0             =  0
320
321      DO ji = kideb, kiut
322        nbot0(ji)          =  nlays0  + 1 - snind(ji) + ( 1. - snicind(ji) ) * &
323                              snicswi(ji)
324        ! cotes of the top of the layers
325        zm0(ji,0)          =  0.0
326        maxnbot0           =  MAX ( maxnbot0 , nbot0(ji) )
327      ENDDO 
328
329      DO jk = 1, maxnbot0
330        DO ji = kideb, kiut
331        !change
332           limsum      = ( 1 - snswi(ji) ) * ( jk - 1 ) +                      &
333                               snswi(ji) * ( jk + snind(ji) - 1 )
334           limsum      = MIN( limsum , nlay_s )
335           zm0(ji,jk)  =  dh_s_tot(ji) + zh_s(ji) * limsum
336        END DO
337      ENDDO
338
339      DO ji = kideb, kiut
340         zm0(ji,nbot0(ji)) =  dh_s_tot(ji) - snicswi(ji) * dh_snowice(ji) + &
341                              zh_s(ji) * nlays0
342         zm0(ji,1)         =  dh_s_tot(ji) * (1 -snswi(ji) ) +              &
343                              snswi(ji) * zm0(ji,1)
344      ENDDO
345
346      DO jk = ntop0, maxnbot0
347        DO ji = kideb, kiut
348        ! layer thickness
349           zthick0(ji,jk)  =  zm0(ji,jk) - zm0(ji,jk-1)
350        END DO
351      ENDDO
352
353      zqts_in(:) = 0.0
354     
355      DO ji = kideb, kiut
356        ! layer heat content
357        qm0(ji,1)   =  rhosn * ( cpic * ( rtt - ( 1. - snswi(ji) ) * ( tatm_ice_1d(ji) ) &
358                                            - snswi(ji) * t_s_b(ji,1) )         &
359                               + lfus ) * zthick0(ji,1)
360        zqts_in(ji) =  zqts_in(ji) + qm0(ji,1) 
361      ENDDO
362
363!     IF (jiindex_1d .GT. 0 ) THEN
364!        WRITE(numout,*) ' zqts_in : ', zqts_in(jiindex_1d) / rdt_ice
365!        WRITE(numout,*) ' q_s_b  : ', q_s_b(jiindex_1d,1)
366!        WRITE(numout,*) ' t_s_b  : ', t_s_b(jiindex_1d,1)
367!        WRITE(numout,*) ' zthick0: ', zthick0(jiindex_1d,1)
368!     ENDIF
369
370!     WRITE(numout,*) ' TEST : '
371!     WRITE(numout,*) ' maxnbot0 : ', maxnbot0
372!     WRITE(numout,*) ' kideb : ', kideb
373!     WRITE(numout,*) ' kiut  : ', kiut
374      DO jk = 2, maxnbot0
375        DO ji = kideb, kiut
376          limsum      = ( 1 - snswi(ji) ) * ( jk - 1 ) +                      &
377                                snswi(ji) * ( jk + snind(ji) - 1 )
378          limsum      = MIN( limsum , nlay_s )
379          qm0(ji,jk)  = rhosn * ( cpic * ( rtt - t_s_b(ji,limsum) ) + lfus )  &
380                      * zthick0(ji,jk)
381          zswitch = 1.0 - MAX (0.0, SIGN ( 1.0, zeps - ht_s_b(ji) ) )
382          zqts_in(ji) = zqts_in(ji) + ( 1. - snswi(ji) ) * qm0(ji,jk) * zswitch
383!         IF (ji.EQ.jiindex_1d) THEN
384!                 WRITE(numout,*) ' limsum ', limsum
385!                 WRITE(numout,*) ' snswi  : ', snswi(ji)
386!                 WRITE(numout,*) ' snind  : ', snind(ji)
387!                 WRITE(numout,*) ' t_s_b  : ', t_s_b(ji,1)
388!                 WRITE(numout,*) ' q_s_b  : ', rhosn * ( cpic * ( rtt - &
389!                                               t_s_b(ji,limsum) ) + lfus )
390!                 WRITE(numout,*) ' zthick0: ', zthick0(jiindex_1d,jk)
391!         ENDIF
392        END DO ! jk
393      ENDDO ! ji
394
395      ! Heat conservation
396!     IF (jiindex_1d .GT. 0 ) THEN
397!        WRITE(numout,*) ' zqts_in : ', zqts_in(jiindex_1d) / rdt_ice
398!        WRITE(numout,*) ' q_s_b  : ', q_s_b(jiindex_1d,1)
399!        WRITE(numout,*) ' t_s_b  : ', t_s_b(jiindex_1d,1)
400!     ENDIF
401
402      !------------------------------------------------
403      ! Energy given by the snow in snow-ice formation
404      !------------------------------------------------
405      ! zqsnow, enthalpy of the flooded snow
406      DO ji = kideb, kiut
407        zqsnow(ji)     =  rhosn*lfus
408        zdeltah(ji)    =  0.0
409      ENDDO
410
411      DO jk =  nlays0, 1, -1
412        DO ji = kideb, kiut
413           zhsnow      =  MAX(0.0,dh_snowice(ji)-zdeltah(ji))
414           zqsnow(ji)  =  zqsnow(ji) + &
415                          rhosn*cpic*(rtt-t_s_b(ji,jk))
416           zdeltah(ji) =  zdeltah(ji) + zh_s(ji)
417        END DO
418      ENDDO
419
420      DO ji = kideb, kiut
421         zqsnow(ji) = zqsnow(ji) * dh_snowice(ji)
422      END DO
423
424      !------------------
425      ! NEW SNOW PROFILE
426      !------------------
427
428      !--------------
429      ! Vector index   
430      !--------------
431      ntop1    =  1
432      nbot1    =  nlay_s
433
434      !-------------------
435      ! Layer coordinates
436      !-------------------
437      DO ji = kideb, kiut
438         zh_s(ji)  = ht_s_b(ji) / nlay_s
439         z_s(ji,0) =  0.0
440      ENDDO
441
442      DO jk = 1, nlay_s
443        DO ji = kideb, kiut
444           z_s(ji,jk) =  zh_s(ji) * jk
445        END DO
446      ENDDO
447
448      !-----------------
449      ! Layer thickness
450      !-----------------
451      DO layer0 = ntop0, maxnbot0
452        DO ji = kideb, kiut
453           zhl0(ji,layer0) = zm0(ji,layer0) - zm0(ji,layer0-1)
454        END DO
455      ENDDO
456
457      DO layer1 = ntop1, nbot1
458        DO ji = kideb, kiut
459           q_s_b(ji,layer1)= 0.0
460        END DO
461      ENDDO
462
463!     IF (jiindex_1d .GT. 0) THEN
464!        WRITE(numout,*) ' qm0      : ', qm0(jiindex_1d,0:maxnbot0) / rdt_ice
465!        WRITE(numout,*) ' maxnbot0 : ', maxnbot0
466!        WRITE(numout,*) ' zm0      : ', zm0(jiindex_1d,0:maxnbot0)
467!        WRITE(numout,*) ' z_s      : ', z_s(jiindex_1d,0:1)
468!        WRITE(numout,*) ' zhl0     : ', zhl0(jiindex_1d,0:maxnbot0)
469!        WRITE(numout,*) ' zhl0     : ', zhl0(jiindex_1d,0:maxnbot0)
470!     ENDIF
471
472      !----------------
473      ! Weight factors
474      !----------------
475      DO layer0 = ntop0, maxnbot0
476        DO layer1 = ntop1, nbot1
477           DO ji = kideb, kiut
478              zrl01(layer1,layer0) = MAX(0.0,( MIN(zm0(ji,layer0),z_s(ji,layer1)) &
479              - MAX(zm0(ji,layer0-1), z_s(ji,layer1-1)))/MAX(zhl0(ji,layer0),epsi10)) 
480              q_s_b(ji,layer1) = q_s_b(ji,layer1) + zrl01(layer1,layer0)*qm0(ji,layer0) &
481                                   * MAX(0.0,SIGN(1.0,nbot0(ji)-layer0+zeps))
482!              IF (ji.EQ.jiindex_1d) THEN
483!                      WRITE(numout,*) ' layer0, layer1 ', layer0, layer1
484!                      WRITE(numout,*) ' q_s_b : ', q_s_b(ji,layer1) / rdt_ice
485!                      WRITE(numout,*) ' nbot0 : ', nbot0(ji)                 
486!                      WRITE(numout,*)
487!              ENDIF
488           END DO
489        END DO
490      ENDDO
491
492      ! Heat conservation
493      zqts_fin(:) = 0.0
494      DO jk = 1, nlay_s
495         DO ji = kideb, kiut
496            zqts_fin(ji) = zqts_fin(ji) + q_s_b(ji,jk)
497         END DO
498      END DO
499
500      IF ( con_i ) THEN
501      DO ji = kideb, kiut
502         IF ( ABS ( zqts_in(ji) - zqts_fin(ji) ) / rdt_ice .GT. 1.0e-6 ) THEN
503            zji                 = MOD( npb(ji) - 1, jpi ) + 1
504            zjj                 = ( npb(ji) - 1 ) / jpi + 1
505            WRITE(numout,*) ' violation of heat conservation : ',             &
506                            ABS ( zqts_in(ji) - zqts_fin(ji) ) / rdt_ice
507            WRITE(numout,*) ' ji, jj   : ', zji, zjj
508            WRITE(numout,*) ' ht_s_b   : ', ht_s_b(ji)
509            WRITE(numout,*) ' zqts_in  : ', zqts_in(ji) / rdt_ice
510            WRITE(numout,*) ' zqts_fin : ', zqts_fin(ji) / rdt_ice
511            WRITE(numout,*) ' dh_snowice : ', dh_snowice(ji)
512            WRITE(numout,*) ' dh_s_tot : ', dh_s_tot(ji)
513            WRITE(numout,*) ' snswi    : ', snswi(ji)
514         ENDIF
515      END DO
516      ENDIF
517
518!     WRITE(numout,*) ' ht_s_b   : ', ht_s_b(jiindex_1d)
519!     WRITE(numout,*) ' dh_s_tot : ', dh_s_tot(jiindex_1d)
520!     WRITE(numout,*) ' dh_snowi : ', dh_snowice(jiindex_1d)
521!     WRITE(numout,*) ' zqts_fin : ', zqts_fin(jiindex_1d) / rdt_ice
522!     WRITE(numout,*) ' difference : ', ( zqts_fin(jiindex_1d) - &
523!                                       zqts_in(jiindex_1d) ) / rdt_ice
524
525!     IF (jiindex_1d .GT. 1) THEN
526!     WRITE(numout,*) ' Vertical profile : '
527!     WRITE(numout,*) ' ht_s_b : ', ht_s_b(jiindex_1d)
528!     WRITE(numout,*) ' nbot0  : ', nbot0(jiindex_1d)
529!     WRITE(numout,*) ' qm0    : ', qm0(jiindex_1d,1:nbot0(jiindex_1d)) / &
530!     rdt_ice
531!     WRITE(numout,*) ' zthick0: ', zthick0(jiindex_1d,1:nbot0(jiindex_1d))
532!     WRITE(numout,*) ' zm0    : ', zm0(jiindex_1d,0:nbot0(jiindex_1d))
533!     ENDIF
534
535      !---------------------
536      ! Recover heat content
537      !---------------------
538      DO jk = 1, nlay_i
539         DO ji = kideb, kiut
540            q_s_b(ji,jk) = q_s_b(ji,jk) / MAX( zh_s(ji) , zeps )
541         END DO !ji
542      ENDDO !jk 
543!     IF (jiindex_1d .GT. 1) THEN
544!     WRITE(numout,*) ' q_s_b : ', q_s_b(jiindex_1d,1)
545!     WRITE(numout,*) ' t_s_b : ', t_s_b(jiindex_1d,1)
546!     ENDIF
547
548      !---------------------
549      ! Recover temperature
550      !---------------------
551      ! is it really necessary ???? since we don't use snow temperature anymore
552      ! it is now since, lim_thd_glohec uses t_s_b and not q_s_b!!!
553      ! it should not be necessary anymore
554
555      zfac1 = 1. / ( rhosn * cpic )
556      zfac2 = lfus / cpic 
557      DO jk = 1, nlay_s
558        DO ji = kideb, kiut
559           zswitch = MAX ( 0.0 , SIGN ( 1.0, zeps - ht_s_b(ji) ) )
560           t_s_b(ji,jk) = rtt                                                  &
561                        + ( 1.0 - zswitch ) *                                  &
562                          ( - zfac1 * q_s_b(ji,jk) + zfac2 )
563        END DO
564      ENDDO
565!     IF (jiindex_1d .GT. 1) THEN
566!     WRITE(numout,*) ' q_s_b : ', q_s_b(jiindex_1d,1)
567!     WRITE(numout,*) ' t_s_b : ', t_s_b(jiindex_1d,1)
568!     ENDIF
569!
570!------------------------------------------------------------------------------|
571!  4) Ice redistribution                                                       |
572!------------------------------------------------------------------------------|
573!
574      !-------------
575      ! OLD PROFILE
576      !-------------
577
578      !----------------
579      ! Vector indexes
580      !----------------
581      ntop0          =  1
582      maxnbot0       =  0
583
584      DO ji = kideb, kiut
585        ! reference number of the bottommost layer
586         nbot0(ji)    =  MAX( 1 ,  MIN( nlayi0 + ( 1 - icboind(ji) ) +        &
587                         ( 1 - icsuind(ji) ) * icsuswi(ji) + snicswi(ji) ,    &
588                         nlay_i + 2 ) )
589!       IF (ji.EQ.jiindex_1D) THEN
590!           WRITE(numout,*) ' nbot0 : ', nbot0(ji)
591!           WRITE(numout,*) ' nlayi0 : ', nlayi0
592!           WRITE(numout,*) ' icboind: ', icboind(ji)
593!           WRITE(numout,*) ' icsuind: ', icsuind(ji)
594!           WRITE(numout,*) ' icsuswi: ', icsuswi(ji)
595!           WRITE(numout,*) ' snicswi: ', snicswi(ji)
596!           WRITE(numout,*) ' jkmax  : ', jkmax
597!           WRITE(numout,*) ' term   : ', &
598!           nlayi0+(1-icboind(ji))+(1-icsuind(ji))*icsuswi(ji)+snicswi(ji)
599!       ENDIF
600         ! maximum reference number of the bottommost layer over all domain
601         maxnbot0     =  MAX( maxnbot0 , nbot0(ji) )
602      ENDDO
603
604      !-------------------------
605      ! Cotes of old ice layers
606      !-------------------------
607      zm0(:,0)    =  0.0
608     
609      DO jk = 1, maxnbot0
610         DO ji = kideb, kiut
611            ! jk goes from 1 to nbot0
612            ! the ice layer number goes from 1 to nlay_i
613            ! limsum is the real ice layer number corresponding to present jk
614            limsum    =  ( (icsuswi(ji)*(icsuind(ji)+jk-1) + (1-icsuswi(ji))*jk))*(1-snicswi(ji)) + (jk-1)*snicswi(ji)
615            zm0(ji,jk)=  icsuswi(ji)*dh_i_surf(ji) + snicswi(ji)*dh_snowice(ji) &
616                      +  limsum * zh_i(ji)
617         END DO
618      ENDDO
619
620      DO ji = kideb, kiut
621         zm0(ji,nbot0(ji)) =  icsuswi(ji)*dh_i_surf(ji) + snicswi(ji)*dh_snowice(ji) + dh_i_bott(ji) &
622                           +  zh_i(ji) * nlayi0
623         zm0(ji,1)         =  snicswi(ji)*dh_snowice(ji) + (1-snicswi(ji))*zm0(ji,1)
624      ENDDO
625
626      !-----------------------------
627      ! Thickness of old ice layers
628      !-----------------------------
629      DO jk = ntop0, maxnbot0
630        DO ji = kideb, kiut
631           zthick0(ji,jk) =  zm0(ji,jk) - zm0(ji,jk-1)
632        END DO
633      ENDDO
634
635      !---------------------------
636      ! Inner layers heat content
637      !---------------------------
638      qm0(:,:) =  0.0
639      zqti_in(:) = 0.0
640
641      DO jk = ntop0, maxnbot0
642         DO ji = kideb, kiut
643            limsum =  MAX(1,MIN(snicswi(ji)*(jk-1) + icsuswi(ji)*(jk-1+icsuind(ji)) + &
644                                (1-icsuswi(ji))*(1-snicswi(ji))*jk,nlay_i))
645            ztmelts = -tmut * s_i_b(ji,limsum) + rtt
646            qm0(ji,jk) = rhoic * ( cpic * (ztmelts-t_i_b(ji,limsum)) + lfus * ( 1.0-(ztmelts-rtt)/ &
647                      MIN((t_i_b(ji,limsum)-rtt),-zeps) ) - rcp*(ztmelts-rtt) ) &
648                      * zthick0(ji,jk)
649
650!           IF (ji .EQ. jiindex_1d ) THEN
651!              WRITE(numout,*) 'jk : ', jk, ' t_i_b : ', t_i_b(ji,limsum), &
652!              ' s_i_b : ', s_i_b(ji,limsum)
653!              WRITE(numout,*) ' q_i_b  : ', &
654!              rhoic*(cpic*(ztmelts-t_i_b(ji,limsum)) + lfus *( &
655!              1.0-(ztmelts-rtt)/ &
656!                                   MIN((t_i_b(ji,limsum)-rtt),-zeps) ) - &
657!                                   rcp*(ztmelts-rtt) )
658!              WRITE(numout,*) ' zthick0: ', zthick0(ji,jk)
659!              WRITE(numout,*) ' limsum : ', limsum
660!              WRITE(numout,*) ' icsuswi: ', icsuswi(ji), ' icsuind : ', &
661!              icsuind(ji)
662!              WRITE(numout,*) ' snicswi: ', snicswi(ji)
663!              WRITE(numout,*) ' FAC1   : ', snicswi(ji)*(jk-1)
664!              WRITE(numout,*) ' FAC2   : ', icsuswi(ji)*(jk-1+icsuind(ji))
665!              WRITE(numout,*) ' FAC3   : ', (1-icsuswi(ji))*(1-snicswi(ji))*jk
666!           ENDIF
667         END DO
668      ENDDO
669!     IF (jiindex_1d .GT.0) WRITE(numout,*) ' qm0    : ', qm0(jiindex_1d,1:nbot0(jiindex_1d)) / &
670!     rdt_ice
671
672!     ! Heat conservation
673!     WRITE(numout,*) ' zqts_in : ', zqts_in(jiindex_1d) / rdt_ice
674
675      !----------------------------
676      ! Bottom layers heat content
677      !----------------------------
678      DO ji = kideb, kiut       
679        ztmelts    = ( 1.0 - icboswi(ji) ) * (-tmut * s_i_b(ji,nlayi0)) &   ! case of melting ice
680                   +      icboswi(ji)      * (-tmut * s_i_new(ji))      &   ! case of forming ice
681                   + rtt                        ! this temperature is in Celsius
682
683        ! bottom formation temperature
684        ztform = t_i_b(ji,nlay_i)
685        IF ( ( num_sal .EQ. 2 ) .OR. ( num_sal .EQ. 4 ) ) ztform = t_bo_b(ji)
686        qm0(ji,nbot0(ji)) = ( 1.0 - icboswi(ji) )*qm0(ji,nbot0(ji)) &   ! case of melting ice
687                   + icboswi(ji) *                                  &   ! case of forming ice
688                     rhoic*( cpic*(ztmelts-ztform)                  &
689                           + lfus *( 1.0-(ztmelts-rtt)/             &
690                             MIN ( (ztform-rtt) , - epsi10 ) )      & 
691                           - rcp*(ztmelts-rtt) )                    &
692                    *zthick0(ji,nbot0(ji))
693      ENDDO
694
695      !-----------------------------
696      ! Snow ice layer heat content
697      !-----------------------------
698
699      DO ji = kideb, kiut
700         ! energy of the flooding seawater
701         zqsnic = rau0 * rcp * ( rtt - t_bo_b(ji) ) * dh_snowice(ji) * &
702                  (rhoic - rhosn) / rhoic * snicswi(ji) ! generally positive
703         ! Heat conservation diagnostic
704         qt_i_in(ji,jl) = qt_i_in(ji,jl) + zqsnic 
705
706         ! The heat of the flooding seawater is removed from the lead
707! default line
708!        qldif_1d(ji)   = qldif_1d(ji) - zqsnic * a_i_b(ji)
709! LIM 2 line
710!         qldif_1d(ji)  = qldif_1d(ji) + zdrmh * ( 1.0 - alphs * ( rhosn/rhoic ) ) * xlic * ( 1.0 - frld_1d(ji) )
711! debug line : test a plus (should also be positive for the ice)
712         qldif_1d(ji)   = qldif_1d(ji) + zqsnic * a_i_b(ji)
713!        qldif_1d(ji) = qldif_1d(ji) + rhosn * cpic *( t_bo_b(ji)-t_s_b(ji,1) ) * &
714!                                      a_i_b(ji)*dh_snowice(ji)
715         !++++++
716!        IF ( ji.EQ.jiindex_1D ) THEN
717!           WRITE(numout,*) ' zqsnic : ', zqsnic / rdt_ice
718!           WRITE(numout,*) ' zqsnow : ', zqsnow(ji) / rdt_ice
719!        ENDIF
720!        !++++++
721
722         ! enthalpy of the newly formed snow-ice layer
723         ! = enthalpy of snow + enthalpy of frozen water
724         zqsnic         =  zqsnow(ji) + zqsnic
725         qm0(ji,1)      =  snicswi(ji) * zqsnic + ( 1 - snicswi(ji) ) * qm0(ji,1)
726
727!        !++++++
728!        IF (ji.EQ.jiindex_1D) THEN
729!           WRITE(numout,*) ' snicswi : ', snicswi(ji)
730!           WRITE(numout,*) ' zqsnic  : ', zqsnic / rdt_ice
731!           WRITE(numout,*) ' qldif_1d : ', qldif_1d(ji)
732!           WRITE(numout,*) ' dhsnowice :', dh_snowice(ji)
733!           WRITE(numout,*) ' t_bo_b    :', t_bo_b(ji)   
734!           WRITE(numout,*) ' t_s_b     :', t_s_b(ji,1)   
735!           WRITE(numout,*) ' limsum    :', limsum   
736!           WRITE(numout,*) ' a_i_b     :', a_i_b(ji)
737!        ENDIF
738!        !++++++
739
740      ENDDO ! ji
741
742!     IF (jiindex_1D.GT.1) THEN
743!     WRITE(numout,*) ' Vertical profile : '
744!     WRITE(numout,*) ' ht_s_b : ', ht_s_b(jiindex_1d)
745!     WRITE(numout,*) ' ht_i_b : ', ht_i_b(jiindex_1d)
746!     WRITE(numout,*) ' nbot0  : ', nbot0(jiindex_1d)
747!     WRITE(numout,*) ' qm0    : ', qm0(jiindex_1d,1:nbot0(jiindex_1d)) / &
748!     rdt_ice
749!     WRITE(numout,*) ' zthick0: ', zthick0(jiindex_1d,1:nbot0(jiindex_1d))
750!     WRITE(numout,*) ' zm0    : ', zm0(jiindex_1d,0:nbot0(jiindex_1d))
751!     ENDIF
752
753      DO jk = ntop0, maxnbot0
754        DO ji = kideb, kiut
755           ! Heat conservation
756           zqti_in(ji) = zqti_in(ji) + qm0(ji,jk) &
757                       * MAX( 0.0 , SIGN(1.0,ht_i_b(ji)-zeps6+zeps) ) &
758                       * MAX( 0.0 , SIGN( 1. , nbot0(ji) - jk + zeps ) )
759!          IF (ji.EQ.jiindex_1D) THEN
760!                  WRITE(numout,*) ' jk  : ', jk
761!                  WRITE(numout,*) ' qm0 : ', qm0(ji,jk)
762!                  WRITE(numout,*) ' nbot0:', nbot0(ji)
763!                  WRITE(numout,*) ' fac 1 : ', MAX( 0.0 , SIGN( 1.0, nbot0(ji) &
764!                                               - jk + zeps ) )
765!          ENDIF
766        END DO
767      ENDDO
768!     IF (jiindex_1D .GT. 0 ) THEN
769!        WRITE(numout,*) ' qm0     : ', qm0(jiindex_1d,1:jkmax) / rdt_ice
770!        WRITE(numout,*) ' zqti_in : ', zqti_in(jiindex_1d) / rdt_ice
771!     ENDIF
772      ! Heat conservation
773!     WRITE(numout,*) ' zm0     : ', zm0(jiindex_1d,:)
774!     WRITE(numout,*) ' zthick0 : ', zthick0(jiindex_1d,:)
775!     WRITE(numout,*) ' qm0     : ', qm0(jiindex_1d,0:jkmax) / rdt_ice
776
777      !-------------
778      ! NEW PROFILE
779      !-------------
780
781      !---------------
782      ! Vectors index
783      !---------------
784
785      ntop1    =  1 
786      nbot1    =  nlay_i
787
788      !------------------
789      ! Layers thickness
790      !------------------
791      DO ji = kideb, kiut
792        zh_i(ji)      = ht_i_b(ji) / nlay_i
793      ENDDO
794
795      !-------------
796      ! Layer cotes     
797      !-------------
798      z_i(:,0) =  0.0
799      DO jk = 1, nlay_i
800        DO ji = kideb, kiut
801           z_i(ji,jk) =  zh_i(ji) * jk
802        END DO
803      ENDDO
804
805      ! What is the difference with zthick0 ???
806      !--thicknesses of the layers
807      DO layer0 = ntop0, maxnbot0
808        DO ji = kideb, kiut
809           zhl0(ji,layer0)   =  zm0(ji,layer0) - zm0(ji,layer0-1) !thicknesses of the layers
810        END DO
811      ENDDO
812
813
814      ! Use less ??
815!     DO layer1 = ntop1, nbot1
816!       DO ji = kideb, kiut
817!           IF (ji.eq.jiindex_1d) THEN
818!                   WRITE(numout,*) ' jk    : ', layer1
819!                   WRITE(numout,*) ' q_i_b : ', q_i_b(ji,layer1)
820!           ENDIF
821!           q_i_b(ji,layer1)  =  q_i_b(ji,layer1) * (1.0 - MAX(0.0,SIGN(1.0,ht_i_b(ji)-zeps6+zeps)))
822!           IF (ji.eq.jiindex_1d) THEN
823!                   WRITE(numout,*) ' ht_i_b  ', ht_i_b(ji)
824!                   WRITE(numout,*) ' factor2 ', ht_i_b(ji)-zeps6+zeps
825!                   WRITE(numout,*) ' factor .... ',  (1.0 - &
826!                   MAX(0.0,SIGN(1.0,ht_i_b(ji)-zeps6+zeps)))
827!                   WRITE(numout,*) ' q_i_b : ', q_i_b(ji,layer1)
828!           ENDIF
829!       END DO
830!     ENDDO
831
832      !------------------------
833      ! Weights for relayering
834      !------------------------
835
836      q_i_b(:,:) = 0.0
837      DO layer0 = ntop0, maxnbot0
838        DO layer1 = ntop1, nbot1
839           DO ji = kideb, kiut
840              zrl01(layer1,layer0) = MAX(0.0,( MIN(zm0(ji,layer0),z_i(ji,layer1)) &
841              - MAX(zm0(ji,layer0-1), z_i(ji,layer1-1)))/MAX(zhl0(ji,layer0),epsi10))
842              q_i_b(ji,layer1) = q_i_b(ji,layer1) & 
843                               + zrl01(layer1,layer0)*qm0(ji,layer0) &
844                               * MAX(0.0,SIGN(1.0,ht_i_b(ji)-zeps6+zeps)) &
845                               * MAX(0.0,SIGN(1.0,nbot0(ji)-layer0+zeps))
846           END DO
847        END DO
848      ENDDO
849
850     
851
852 !    WRITE(numout,*) ' s_i       : ', s_i_b(jiindex_1d,1:nlay_i)
853     
854      !-------------------------
855      ! Heat conservation check
856      !-------------------------
857      zqti_fin(:) = 0.0
858      DO jk = 1, nlay_i
859         DO ji = kideb, kiut
860            zqti_fin(ji) = zqti_fin(ji) + q_i_b(ji,jk)
861         END DO
862      END DO
863!     IF ( jiindex_1d .GT. 0 ) &
864!     WRITE(numout,*) ' zqti_fin : ', zqti_fin(jiindex_1d) / rdt_ice
865!
866      DO ji = kideb, kiut
867         IF ( ABS ( zqti_in(ji) - zqti_fin(ji) ) / rdt_ice .GT. 1.0e-6 ) THEN
868            zji                 = MOD( npb(ji) - 1, jpi ) + 1
869            zjj                 = ( npb(ji) - 1 ) / jpi + 1
870            WRITE(numout,*) ' violation of heat conservation : ',             &
871                            ABS ( zqti_in(ji) - zqti_fin(ji) ) / rdt_ice
872            WRITE(numout,*) ' ji, jj   : ', zji, zjj
873            WRITE(numout,*) ' ht_i_b   : ', ht_i_b(ji)
874            WRITE(numout,*) ' zqti_in  : ', zqti_in(ji) / rdt_ice
875            WRITE(numout,*) ' zqti_fin : ', zqti_fin(ji) / rdt_ice
876            WRITE(numout,*) ' dh_i_bott: ', dh_i_bott(ji)
877            WRITE(numout,*) ' dh_i_surf: ', dh_i_surf(ji)
878            WRITE(numout,*) ' dh_snowice:', dh_snowice(ji)
879            WRITE(numout,*) ' icsuswi  : ', icsuswi(ji)
880            WRITE(numout,*) ' icboswi  : ', icboswi(ji)
881            WRITE(numout,*) ' snicswi  : ', snicswi(ji)
882         ENDIF
883      END DO
884!
885!     WRITE(numout,*) ' old_ht_i   : ', old_ht_i_b(jiindex_1d)
886!     WRITE(numout,*) ' ht_i_b     : ', ht_i_b(jiindex_1d)
887!     WRITE(numout,*) ' icsuswi    : ', icsuswi(jiindex_1d)
888!     WRITE(numout,*) ' icboswi    : ', icboswi(jiindex_1d)
889!     WRITE(numout,*) ' snicswi    : ', snicswi(jiindex_1d)
890!     WRITE(numout,*) ' dh_i_bott  : ', dh_i_bott(jiindex_1d)
891!     WRITE(numout,*) ' dh_i_surf  : ', dh_i_surf(jiindex_1d)
892!     WRITE(numout,*) ' dh_snowice : ', dh_snowice(jiindex_1d)
893!     WRITE(numout,*) ' zqti_fin   : ', zqti_fin(jiindex_1d) / rdt_ice
894!     WRITE(numout,*) ' difference : ', ( zqti_fin(jiindex_1d) - &
895!                                       zqti_in(jiindex_1d) ) / rdt_ice
896
897      !----------------------
898      ! Recover heat content
899      !----------------------
900      DO jk = 1, nlay_i
901         DO ji = kideb, kiut
902            q_i_b(ji,jk) = q_i_b(ji,jk) / MAX( zh_i(ji) , zeps )
903         END DO !ji
904      ENDDO !jk 
905
906      !++++++++++++++++
907      ! Heat conservation
908      zqti_fin(:) = 0.0
909      DO jk = 1, nlay_i
910         DO ji = kideb, kiut
911            zqti_fin(ji) = zqti_fin(ji) + q_i_b(ji,jk) * zh_i(ji)
912         END DO
913      END DO
914!     IF (jiindex_1d .GT. 0 ) &
915!     WRITE(numout,*) ' zqti_fin : ', zqti_fin(jiindex_1d) / rdt_ice
916!     WRITE(numout,*) ' q_i_b    : ', q_i_b(jiindex_1d,1:nlay_i)
917      !++++++++++++++++
918      !-------------------------------------------------
919      ! Update salinity, bottom and snow ice entrapment
920      !-------------------------------------------------
921      DO ji = kideb, kiut
922         sm_i_b(ji) = sm_i_b(ji)                                &
923                    + dsm_i_se_1d(ji) + dsm_i_si_1d(ji)
924      END DO !ji
925
926      !---------------------
927      ! Recover temperature
928      !---------------------
929      DO jk = 1, nlay_i
930
931         DO ji = kideb, kiut
932
933            ztmelts    =  -tmut*s_i_b(ji,jk) + rtt
934            !Conversion q(S,T) -> T (second order equation)
935            zaaa         =  cpic
936            zbbb         =  ( rcp - cpic ) * ( ztmelts - rtt ) + &
937                            q_i_b(ji,jk) / rhoic - lfus
938            zccc         =  lfus * ( ztmelts - rtt )
939            zdiscrim     =  SQRT( MAX(zbbb*zbbb - 4.0*zaaa*zccc,0.0) )
940            t_i_b(ji,jk) =  rtt - ( zbbb + zdiscrim ) / & 
941                                  ( 2.0 *zaaa )
942         END DO !ji
943
944      END DO !jk
945
946! Fin de la routine Enth
947      END SUBROUTINE lim_thd_ent
948
949#else
950   !!======================================================================
951   !!                       ***  MODULE limthd_ent   ***
952   !!                             no sea ice model
953   !!======================================================================
954CONTAINS
955   SUBROUTINE lim_thd_ent          ! Empty routine
956   END SUBROUTINE lim_thd_ent
957#endif
958 END MODULE limthd_ent
959
Note: See TracBrowser for help on using the repository browser.