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

source: trunk/NEMO/LIM_SRC_3/limthd_lac.F90 @ 833

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

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

File size: 41.4 KB
Line 
1MODULE limthd_lac
2#if defined key_lim3
3   !!======================================================================
4   !!                       ***  MODULE limthd_lac   ***
5   !!                lateral thermodynamic growth of the ice
6   !!======================================================================
7
8   !!----------------------------------------------------------------------
9   !!   lim_lat_acr    : lateral accretion of ice
10   !! * Modules used
11   USE par_oce          ! ocean parameters
12   USE dom_oce
13   USE in_out_manager
14   USE phycst
15   USE ice_oce         ! ice variables
16   USE thd_ice
17   USE dom_ice
18   USE par_ice
19   USE ice
20   USE iceini
21   USE limtab
22   USE limicepoints
23   USE taumod
24   USE blk_oce
25   USE limcons
26     
27   IMPLICIT NONE
28   PRIVATE
29
30   !! * Routine accessibility
31   PUBLIC lim_thd_lac     ! called by lim_thd
32
33   !! * Module variables
34   REAL(wp)  ::           &  ! constant values
35      epsi20 = 1.e-20  ,  &
36      epsi13 = 1.e-13  ,  &
37      epsi11 = 1.e-13  ,  &
38      epsi03 = 1.e-03  ,  &
39      epsi06 = 1.e-06  ,  &
40      zeps   = 1.e-10  ,  &
41      zzero  = 0.e0    ,  &
42      zone   = 1.e0
43
44   !!----------------------------------------------------------------------
45   !!   LIM 2.0,  UCL-LOCEAN-IPSL (2005)
46   !! $Header: /home/opalod/NEMOCVSROOT/NEMO/LIM_SRC/limthd_lac.F90,v 1.5 2005/03/27 18:34:42 opalod Exp $
47   !! This software is governed by the CeCILL licence see modipsl/doc/NEMO_CeCILL.txt
48   !!----------------------------------------------------------------------
49
50CONTAINS
51   
52   SUBROUTINE lim_thd_lac
53      !!-------------------------------------------------------------------
54      !!               ***   ROUTINE lim_thd_lac  ***
55      !! 
56      !! ** Purpose : Computation of the evolution of the ice thickness and
57      !!      concentration as a function of the heat balance in the leads.
58      !!      It is only used for lateral accretion
59      !!       
60      !! ** Method  : Ice is formed in the open water when ocean lose heat
61      !!      (heat budget of open water Bl is negative) .
62      !!      Computation of the increase of 1-A (ice concentration) fol-
63      !!      lowing the law :
64      !!      (dA/dt)acc = F[ (1-A)/(1-a) ] * [ Bl / (Li*h0) ]
65      !!       where - h0 is the thickness of ice created in the lead
66      !!             - a is a minimum fraction for leads
67      !!             - F is a monotonic non-increasing function defined as:
68      !!                  F(X)=( 1 - X**exld )**(1.0/exld)
69      !!             - exld is the exponent closure rate (=2 default val.)
70      !!
71      !! ** Action : - Adjustment of snow and ice thicknesses and heat
72      !!                content in brine pockets
73      !!             - Updating ice internal temperature
74      !!             - Computation of variation of ice volume and mass
75      !!             - Computation of frldb after lateral accretion and
76      !!               update ht_s_b, ht_i_b and tbif_1d(:,:)     
77      !!
78      !! ** References : Not available yet
79      !!
80      !! History :
81      !!   1.0  !  01-04 (T. Fichefet, M. A. Morales Maqueda, H. Goosse)
82      !!        !        original code
83      !!   2.0  !  02-08 (C. Ethe, G. Madec) F90, mpp
84      !!   3.0  !  12-05 (M. Vancoppenolle)  Thorough rewrite of the routine
85      !!                                     Salinity variations in sea ice,
86      !!                                     Multi-layer code
87      !!   3.1  !  01-06 (M. Vancoppenolle)  Ice thickness distribution
88      !!   3.2  !  04-07 (M. Vancoppenolle)  Mass and energy conservation tested
89      !!------------------------------------------------------------------------
90      !! * Arguments
91      !! * Local variables
92      INTEGER ::             &
93         ji,jj,jk,jl,jm  ,   &  !: dummy loop indices
94         layer           ,   &  !: layer index
95         nbpac                  !: nb of pts for lateral accretion
96
97      INTEGER ::             &
98         zji             ,   &  !: ji of dummy test point
99         zjj             ,   &  !: jj of dummy test point
100         iter                   !: iteration for frazil ice computation
101
102      INTEGER, DIMENSION(jpij) :: &
103         zcatac          ,   &  !:  indexes of categories where new ice grows
104         zswinew                !: switch for new ice or not
105
106      REAL(wp), DIMENSION(jpij) :: &
107         zv_newice       ,   &  !: volume of accreted ice
108         za_newice       ,   &  !: fractional area of accreted ice
109         zh_newice       ,   &  !: thickness of accreted ice
110         ze_newice       ,   &  !: heat content of accreted ice
111         zs_newice       ,   &  !: salinity of accreted ice
112         zo_newice       ,   &  !: age of accreted ice
113         zdv_res         ,   &  !: residual volume in case of excessive heat budget
114         zda_res         ,   &  !: residual area in case of excessive heat budget
115         zat_i_ac        ,   &  !: total ice fraction   
116         zat_i_lev       ,   &  !: total ice fraction for level ice only (type 1)   
117         zdh_frazb       ,   &  !: accretion of frazil ice at the ice bottom
118         zvrel_ac               !: relative ice / frazil velocity (1D vector)
119
120      REAL(wp), DIMENSION(jpij,jpl) :: &
121         zhice_old       ,   &  !: previous ice thickness
122         zdummy          ,   &  !: dummy thickness of new ice
123         zdhicbot        ,   &  !: thickness of new ice which is accreted vertically
124         zv_old          ,   &  !: old volume of ice in category jl
125         za_old          ,   &  !: old area of ice in category jl
126         za_i_ac         ,   &  !: 1-D version of a_i
127         zv_i_ac         ,   &  !: 1-D version of v_i
128         zoa_i_ac        ,   &  !: 1-D version of oa_i
129         zsmv_i_ac              !: 1-D version of smv_i
130
131      REAL(wp), DIMENSION(jpij,jkmax,jpl) :: &
132         ze_i_ac                !: 1-D version of e_i
133
134      REAL(wp), DIMENSION(jpij) :: &
135         zqbgow          ,   &  !: heat budget of the open water (negative)
136         zdhex                  !: excessively thick accreted sea ice (hlead-hice)
137
138      REAL(wp)  ::           &
139         ztmelts         ,   &  !: melting point of an ice layer
140         zdv             ,   &  !: increase in ice volume in each category
141         zfrazb                 !: fraction of frazil ice accreted at the ice bottom
142
143      ! Redistribution of energy after bottom accretion
144      REAL(wp)  ::           &  !: Energy redistribution
145         zqold           ,   &  !: old ice enthalpy
146         zweight         ,   &  !: weight of redistribution
147         zeps6           ,   &  !: epsilon value
148         zalphai         ,   &  !: factor describing how old and new layers overlap each other [m]
149         zindb           
150         
151      REAL(wp), DIMENSION(jpij,jkmax+1,jpl) :: &
152         zqm0            ,   &  !: old layer-system heat content
153         zthick0                !: old ice thickness
154
155      ! Frazil ice collection thickness
156      LOGICAL :: &              !: iterate frazil ice collection thickness
157         iterate_frazil
158
159      REAL(wp), DIMENSION(jpi,jpj) :: &
160         zvrel                  !: relative ice / frazil velocity
161
162      REAL(wp) ::            &
163         zgamafr          ,  &  !: mult. coeff. between frazil vel. and wind speed
164         ztenagm          ,  &  !: square root of wind stress
165         zvfrx            ,  &  !: x-component of frazil velocity
166         zvfry            ,  &  !: y-component of frazil velocity
167         zvgx             ,  &  !: x-component of ice velocity
168         zvgy             ,  &  !: y-component of ice velocity
169         ztaux            ,  &  !: x-component of wind stress
170         ztauy            ,  &  !: y-component of wind stress
171         ztwogp           ,  &  !: dummy factor including reduced gravity
172         zvrel2           ,  &  !: square of the relative ice-frazil velocity
173         zf               ,  &  !: F for Newton-Raphson procedure
174         zfp              ,  &  !: dF for Newton-Raphson procedure
175         zhicol_new       ,  &  !: updated collection thickness
176         zsqcd            ,  &  !: 1 / square root of ( airdensity * drag )
177         zhicrit                !: minimum thickness of frazil ice
178
179      ! Variables for energy conservation
180      REAL (wp), DIMENSION(jpi,jpj) :: &  !
181         vt_i_init, vt_i_final,   &  !  ice volume summed over categories
182         vt_s_init, vt_s_final,   &  !  snow volume summed over categories
183         et_i_init, et_i_final,   &  !  ice energy summed over categories
184         et_s_init, et_s_final       !  snow energy summed over categories
185
186      REAL(wp) ::            &
187         zde          ,      &       ! :increment of energy in category jl
188         zde_old      ,      &       ! :dummy variable for energy conservation
189         zde_new      ,      &       ! :dummy variable for energy conservation
190         zde_nice     ,      &       ! :dummy variable for energy conservation
191         zde_diff                    ! :dummy variable for energy conservation
192
193      CHARACTER (len = 15) :: fieldid
194
195      !!-----------------------------------------------------------------------!
196         
197      et_i_init(:,:) = 0.0
198      et_s_init(:,:) = 0.0
199      vt_i_init(:,:) = 0.0
200      vt_s_init(:,:) = 0.0
201      IF(lwp) THEN
202         WRITE(numout,*) 'lim_thd_lac : Creating new ice'
203         WRITE(numout,*) '~~~~~~~~~~~'
204      ENDIF
205      zeps6   = 1.0e-6
206
207      !++++++++++
208      WRITE(numout,*) ' Step 0 '
209      WRITE(numout,*) ' v_i : ', v_i(jiindex,jjindex,1:jpl)
210      WRITE(numout,*) ' a_i : ', a_i(jiindex,jjindex,1:jpl)
211      DO jk = 1, nlay_i
212        WRITE(numout,*) ' e_i : ', jk, e_i(jiindex,jjindex,jk,1:jpl)
213      END DO
214      !++++++++++
215
216!------------------------------------------------------------------------------!
217! 1) Conservation check and changes in each ice category
218!------------------------------------------------------------------------------!
219      CALL lim_column_sum (jpl, v_i, vt_i_init)
220      CALL lim_column_sum (jpl, v_s, vt_s_init)
221      CALL lim_column_sum_energy (jpl, nlay_i, e_i, et_i_init)
222      CALL lim_column_sum (jpl,   e_s(:,:,1,:) , et_s_init)
223
224!------------------------------------------------------------------------------|
225! 2) Convert units for ice internal energy
226!------------------------------------------------------------------------------|
227      DO jl = 1, jpl
228        DO jk = 1, nlay_i
229          DO jj = 1, jpj
230            DO ji = 1, jpi
231               !Energy of melting q(S,T) [J.m-3]
232               e_i(ji,jj,jk,jl) = e_i(ji,jj,jk,jl) / &
233                            MAX( area(ji,jj) * v_i(ji,jj,jl) ,  zeps ) * &
234                            nlay_i
235               zindb      = 1.0-MAX(0.0,SIGN(1.0,-v_i(ji,jj,jl))) !0 if no ice and 1 if yes
236               e_i(ji,jj,jk,jl) = e_i(ji,jj,jk,jl)*unit_fac*zindb
237            END DO
238          END DO
239        END DO
240      END DO
241
242!------------------------------------------------------------------------------!
243! 3) Collection thickness of ice formed in leads and polynyas
244!------------------------------------------------------------------------------!   
245      ! hicol is the thickness of new ice.
246      ! Frazil ice forms in open water, is transported by wind
247      ! accumulates at the edge of the consolidated ice edge
248      ! where it forms aggregates of a specific thickness called
249      ! collection thickness.
250
251      zvrel(:,:) = 0.0
252
253      ! Default new ice thickness
254      DO jj = 1, jpj
255         DO ji = 1, jpi
256            hicol(ji,jj) = hiccrit(1)
257         END DO
258      END DO
259
260      IF (fraz_swi.eq.1.0) THEN
261
262          !--------------------
263          ! Physical constants
264          !--------------------
265          hicol(:,:) = 0.0
266
267          zhicrit = 0.04 ! frazil ice thickness
268          ztwogp  = 2. * rau0 / ( grav * 0.3 * ( rau0 - rhoic ) ) ! reduced grav
269          zsqcd   = 1.0 / SQRT( 1.3 * cai ) ! 1/SQRT(airdensity*drag)
270          zgamafr = 0.03
271
272          !+++++
273          WRITE(numout,*) ' ztwogp : ', ztwogp
274          WRITE(numout,*) ' rau0   : ', rau0
275          WRITE(numout,*) ' grav   : ', grav
276          WRITE(numout,*) ' rhoic  : ', rhoic
277          !+++++
278
279          DO jj = 1, jpj
280          DO ji = 1, jpi
281
282          IF ( tms(ji,jj) * ( qcmif(ji,jj) - qldif(ji,jj) ) > 0.e0 ) THEN
283            !-------------
284            ! Wind stress
285            !-------------
286            ! C-grid wind stress components
287            ztaux         = ( gtaux(ji-1,jj  ) * tmu(ji-1,jj  ) &
288                          +   gtaux(ji  ,jj  ) * tmu(ji  ,jj  ) ) / 2.0
289            ztauy         = ( gtauy(ji  ,jj-1) * tmv(ji  ,jj-1) &
290                          +   gtauy(ji  ,jj  ) * tmv(ji  ,jj  ) ) / 2.0
291            ! Square root of wind stress
292            ztenagm       =  SQRT( SQRT( ztaux * ztaux + ztauy * ztauy ) )
293!           !+++++
294            ! tension on B-grid
295!           ztaux         = ( gtaux(ji  ,jj  ) * tmu(ji,jj    ) &
296!                         +   gtaux(ji+1,jj  ) * tmu(ji+1,jj  ) &
297!                         +   gtaux(ji,jj+1  ) * tmu(ji,jj+1  ) &
298!                         +   gtaux(ji+1,jj+1) * tmu(ji+1,jj+1) ) / 4.0
299!           ztauy         = ( gtauy(ji  ,jj  ) * tmu(ji,jj    ) &
300!                         +   gtauy(ji+1,jj  ) * tmu(ji+1,jj  ) &
301!                         +   gtauy(ji,jj+1  ) * tmu(ji,jj+1  ) &
302!                         +   gtauy(ji+1,jj+1) * tmu(ji+1,jj+1) ) / 4.0
303!           !+++++
304!           !+++++
305!           IF ( ( ji.EQ.jiindex ) .AND. ( jj.EQ.jjindex ) ) THEN
306!              WRITE(numout,*)
307!              WRITE(numout,*) ' ztaux : ', ztaux
308!              WRITE(numout,*) ' ztauy : ', ztauy
309!              WRITE(numout,*) ' |tau| : ', ztenagm
310!           ENDIF
311!           !+++++
312
313            !---------------------
314            ! Frazil ice velocity
315            !---------------------
316            zvfrx         = zgamafr * zsqcd * ztaux / MAX(ztenagm,zeps)
317            zvfry         = zgamafr * zsqcd * ztauy / MAX(ztenagm,zeps)
318
319            !-------------------
320            ! Pack ice velocity
321            !-------------------
322            ! C-grid ice velocity
323            zindb = MAX(0.0, SIGN(1.0, at_i(ji,jj) ))
324            zvgx  = zindb * ( u_ice(ji-1,jj  ) * tmu(ji-1,jj  ) &
325                            + u_ice(ji,jj    ) * tmu(ji  ,jj  ) ) / 2.0
326            zvgy  = zindb * ( v_ice(ji  ,jj-1) * tmv(ji  ,jj-1) &
327                            + v_ice(ji,jj    ) * tmv(ji  ,jj  ) ) / 2.0
328
329            !-----------------------------------
330            ! Relative frazil/pack ice velocity
331            !-----------------------------------
332            ! absolute relative velocity
333            zvrel2        = MAX( ( zvfrx - zvgx ) * ( zvfrx - zvgx ) + &
334                                 ( zvfry - zvgy ) * ( zvfry - zvgy )   &
335                               , 0.15 * 0.15 )
336            zvrel(ji,jj)  = SQRT(zvrel2)
337
338            !+++++++++
339!           ! ice drift on B-grid
340!           zindb = MAX(0.0, SIGN(1.0, at_i(ji,jj) ))
341!           zvgx  = zindb * (  u_ice(ji,jj    )   * tmu(ji,jj  )     &
342!                           +  u_ice(ji+1,jj  )   * tmu(ji+1,jj)     &
343!                           +  u_ice(ji,jj+1  )   * tmu(ji,jj+1)     &
344!                           +  u_ice(ji+1,jj+1)   * tmu(ji+1,jj+1) ) &
345!                           / 4.0
346!           zvgy  = zindb * (  v_ice(ji,jj    )   * tmu(ji,jj  ) &
347!                           +  v_ice(ji+1,jj  )   * tmu(ji+1,jj) &
348!                           +  v_ice(ji,jj+1  )   * tmu(ji,jj+1) &
349!                           +  v_ice(ji+1,jj+1)   * tmu(ji+1,jj+1) ) &
350!                           / 4.0
351
352!           !+++++
353!           IF ( ( ji.EQ.jiindex ) .AND. ( jj.EQ.jjindex ) ) THEN
354!              WRITE(numout,*)
355!              WRITE(numout,*) ' zvfrx : ', zvfrx
356!              WRITE(numout,*) ' zvfry : ', zvfry
357!              WRITE(numout,*) ' zvgx  : ', zvgx
358!              WRITE(numout,*) ' zvgy  : ', zvgx
359!           ENDIF
360!           !+++++
361
362!           !+++++
363!           IF ( ( ji.EQ.jiindex ) .AND. ( jj.EQ.jjindex ) ) THEN
364!              WRITE(numout,*)
365!              WRITE(numout,*) ' zvrel2: ', zvrel2
366!              WRITE(numout,*) ' zvrel : ', zvrel(ji,jj)
367!           ENDIF
368
369!           hicol(ji,jj) = 10.0 ! starting value has to be high!!!
370
371            !---------------------
372            ! Iterative procedure
373            !---------------------
374            hicol(ji,jj) = zhicrit + 0.1 
375            hicol(ji,jj) = zhicrit + hicol(ji,jj) /      & 
376                         ( hicol(ji,jj) * hicol(ji,jj) - &
377                           zhicrit * zhicrit ) * ztwogp * zvrel2
378
379            iter = 1
380            iterate_frazil = .true.
381
382            DO WHILE ( iter .LT. 100 .AND. iterate_frazil ) 
383               zf = ( hicol(ji,jj) - zhicrit ) * ( hicol(ji,jj)**2 - zhicrit**2 ) &
384                                 - hicol(ji,jj) * zhicrit * ztwogp * zvrel2
385               zfp = ( hicol(ji,jj) - zhicrit ) * ( 3.0*hicol(ji,jj) + zhicrit ) &
386                                 - zhicrit * ztwogp * zvrel2
387               zhicol_new = hicol(ji,jj) - zf/zfp
388               hicol(ji,jj)   = zhicol_new
389
390               !++++++++++++++++++++
391!              IF ( ABS(-zf/zfp) .LT. 1.0d-9 ) THEN
392!                 iterate_frazil = .false.
393!              ENDIF
394
395!              IF ( (ji.eq.jiindex).AND.(jj.eq.jjindex) ) THEN
396!                      WRITE(numout,*) ' ------- iter = ', iter, &
397!                      '----------------'
398!                      WRITE(numout,*) ' iterate_frazil ', iterate_frazil
399!                      WRITE(numout,*) ' zf, zfp : ', zf, zfp
400!                      WRITE(numout,*) ' dhicol  : ', -zf/zfp
401!                      WRITE(numout,*) ' hicol   : ', hicol(ji,jj)
402               !++++++++++++++++++++
403!              ENDIF
404
405               iter = iter + 1
406
407            END DO ! do while
408!         hicol(ji,jj) = MAX( hicol(ji,jj) , 0.03)
409!         WRITE(numout,*) ' zvrel2 : ', zvrel2, ' zvrel : ', SQRT(zvrel2), ' hicol : ',hicol(ji,jj)
410
411          ENDIF ! end of selection of pixels where ice forms
412
413          !+++++++++++
414          IF ( hicol(ji,jj) .GT. 2.00 .OR. hicol(ji,jj) .LT. 0.0 ) THEN
415                  WRITE(numout,*) ' ALERTE 125 : hicol too bad '
416                  WRITE(numout,*) ' ji,jj : ', ji, jj
417                  WRITE(numout,*) ' lat   : ', gphit(ji,jj)
418                  WRITE(numout,*) ' lon   : ', glamt(ji,jj)
419                  WRITE(numout,*) ' hicol : ', hicol(ji,jj)
420          ENDIF
421          !+++++++++++
422
423      END DO ! loop on ji ends
424      END DO ! loop on jj ends
425
426      WRITE(numout,*) ' '
427      WRITE(numout,*) ' Apres calcul : '
428      WRITE(numout,*) ' hicol      :   ', hicol(jiindex,jjindex)
429      WRITE(numout,*) ' at_i       :   ', at_i(jiindex,jjindex)
430
431      ENDIF ! End of computation of frazil ice collection thickness
432
433!------------------------------------------------------------------------------!
434! 4) Identify grid points where new ice forms
435!------------------------------------------------------------------------------!
436
437      !-------------------------------------
438      ! Select points for new ice formation
439      !-------------------------------------
440      ! This occurs if open water energy budget is negative
441      nbpac = 0
442      DO jj = 1, jpj
443         DO ji = 1, jpi
444            IF ( tms(ji,jj) * ( qcmif(ji,jj) - qldif(ji,jj) ) > 0.e0 ) THEN
445               nbpac = nbpac + 1
446               npac( nbpac ) = (jj - 1) * jpi + ji
447               IF ( (ji.eq.jiindex).AND.(jj.eq.jjindex) ) THEN
448                  jiindex_1d = nbpac
449               ENDIF
450            ENDIF
451         END DO
452      END DO
453
454      IF(lwp) THEN
455         WRITE(numout,*) 'lim_thd_lac : nbpac = ', nbpac
456      ENDIF
457
458      !------------------------------
459      ! Move from 2-D to 1-D vectors
460      !------------------------------
461      ! If ocean gains heat do nothing
462      ! 0therwise compute new ice formation
463
464      IF ( nbpac > 0 ) THEN
465         
466        CALL tab_2d_1d( nbpac, zat_i_ac  (1:nbpac)     , at_i         ,       &
467                        jpi, jpj, npac(1:nbpac) )
468        DO jl = 1, jpl
469           CALL tab_2d_1d( nbpac, za_i_ac(1:nbpac,jl)  , a_i(:,:,jl)  ,       &
470                           jpi, jpj, npac(1:nbpac) )
471           CALL tab_2d_1d( nbpac, zv_i_ac(1:nbpac,jl)  , v_i(:,:,jl)  ,       &
472                           jpi, jpj, npac(1:nbpac) )
473           CALL tab_2d_1d( nbpac, zoa_i_ac(1:nbpac,jl) , oa_i(:,:,jl) ,       &
474                           jpi, jpj, npac(1:nbpac) )
475           CALL tab_2d_1d( nbpac, zsmv_i_ac(1:nbpac,jl), smv_i(:,:,jl),       &
476                           jpi, jpj, npac(1:nbpac) )
477           DO jk = 1, nlay_i
478              CALL tab_2d_1d( nbpac, ze_i_ac(1:nbpac,jk,jl), e_i(:,:,jk,jl) , &
479                              jpi, jpj, npac(1:nbpac) )
480           END DO ! jk
481        END DO ! jl
482
483        CALL tab_2d_1d( nbpac, qldif_1d  (1:nbpac)     , qldif ,              &
484                        jpi, jpj, npac(1:nbpac) )
485        CALL tab_2d_1d( nbpac, qcmif_1d  (1:nbpac)     , qcmif ,              &
486                        jpi, jpj, npac(1:nbpac) )
487        CALL tab_2d_1d( nbpac, t_bo_b    (1:nbpac)     , t_bo  ,              &
488                        jpi, jpj, npac(1:nbpac) )
489        CALL tab_2d_1d( nbpac, fseqv_1d  (1:nbpac)     , fseqv ,              &
490                        jpi, jpj, npac(1:nbpac) )
491        CALL tab_2d_1d( nbpac, hicol_b   (1:nbpac)     , hicol ,              &
492                        jpi, jpj, npac(1:nbpac) )
493        CALL tab_2d_1d( nbpac, zvrel_ac  (1:nbpac)     , zvrel ,              &
494                        jpi, jpj, npac(1:nbpac) )
495
496!------------------------------------------------------------------------------!
497! 5) Compute thickness, salinity, enthalpy, age, area and volume of new ice
498!------------------------------------------------------------------------------!
499        !----------------------
500        ! Thickness of new ice
501        !----------------------
502        DO ji = 1, nbpac
503           zh_newice(ji)     = hiccrit(1)
504        END DO
505        IF ( fraz_swi .EQ. 1.0 ) zh_newice(:) = hicol_b(:)
506
507        !+++++++++++++
508        DO ji = 1, nbpac
509           IF (zh_newice(ji) .LE. 0.0) THEN
510              zji                  = MOD( npac(ji) - 1, jpi ) + 1
511              zjj                  = ( npac(ji) - 1 ) / jpi + 1
512              WRITE(numout,*) ' collection thickness  <= 0 ', zh_newice(ji), ji, zji, zjj
513!             WRITE(numout,*) ' LATITUDE ', gphit(zji,zjj), ' LONGITUDE ', &
514!                                           glamt(zji,zjj)
515!             WRITE(numout,*) ' zh_newice ', zh_newice(ji)
516!             WRITE(numout,*) ' ji ', ji
517!             WRITE(numout,*) ' a_i ', a_i(zji,zjj,1:jpl)
518!             WRITE(numout,*) ' v_i ', v_i(zji,zjj,1:jpl)
519           ENDIF
520        END DO
521        !+++++++++++++
522
523        !----------------------
524        ! Salinity of new ice
525        !----------------------
526
527        IF ( num_sal .EQ. 1 ) THEN
528           zs_newice(:)      =   bulk_sal
529        ENDIF ! num_sal
530
531        IF ( ( num_sal .EQ. 2 ) .OR. ( num_sal .EQ. 4 ) ) THEN
532
533           DO ji = 1, nbpac
534              zs_newice(ji)  =   MIN( 4.606 + 0.91 / zh_newice(ji) , s_i_max )
535              zji            =   MOD( npac(ji) - 1, jpi ) + 1
536              zjj            =   ( npac(ji) - 1 ) / jpi + 1
537              zs_newice(ji)  =   MIN( 0.5*sss_io(zji,zjj) , zs_newice(ji) )
538           END DO ! jl
539
540        ENDIF ! num_sal
541
542        IF ( num_sal .EQ. 3 ) THEN
543           zs_newice(:)      =   2.3
544        ENDIF ! num_sal
545
546        !-------------------------
547        ! Heat content of new ice
548        !-------------------------
549        ! We assume that new ice is formed at the seawater freezing point
550        DO ji = 1, nbpac
551           ztmelts           = - tmut * zs_newice(ji) + rtt ! Melting point (K)
552           ze_newice(ji)     =   rhoic * ( cpic * ( ztmelts - t_bo_b(ji) )    &
553                                         + lfus * ( 1.0 - ( ztmelts - rtt )   &
554                                           / ( t_bo_b(ji) - rtt ) )           &
555                                         - rcp * ( ztmelts-rtt ) )
556        !+++++++++++
557        IF ( ji .EQ. jiindex_1D ) THEN
558        WRITE(numout,*) ' ze_newice : ', ze_newice(jiindex_1d)
559        ENDIF
560        !+++++++++++
561           ze_newice(ji)     =   MAX( ze_newice(ji) , 0.0 ) +                 &
562                                 MAX( 0.0 , SIGN( 1.0 , - ze_newice(ji) ) )   & 
563                                 * rhoic * lfus
564        !+++++++++++
565        IF ( ji .EQ. jiindex_1D ) THEN
566        WRITE(numout,*) ' ze_newice : ', ze_newice(jiindex_1d)
567        ENDIF
568        !+++++++++++
569        END DO ! ji
570        !+++++++++++
571        IF ( jiindex_1d .GT. 0) WRITE(numout,*) ' ze_newice : ', ze_newice(jiindex_1d)
572        !+++++++++++
573
574        !----------------
575        ! Age of new ice
576        !----------------
577        DO ji = 1, nbpac
578           zo_newice(ji)     = 0.0
579        END DO ! ji
580
581        !--------------------------
582        ! Open water energy budget
583        !--------------------------
584        DO ji = 1, nbpac
585           zqbgow(ji)        = qldif_1d(ji) - qcmif_1d(ji) !<0
586        END DO ! ji
587        !+++++++++++
588        IF (jiindex_1d .GT. 0 ) THEN
589        WRITE(numout,*) ' qldif  : ', qldif_1d(jiindex_1d)
590        WRITE(numout,*) ' qcmif  : ', qcmif_1d(jiindex_1d)
591        WRITE(numout,*) ' zqbgow : ', zqbgow(jiindex_1d)
592        ENDIF
593        !+++++++++++
594
595        !-------------------
596        ! Volume of new ice
597        !-------------------
598        DO ji = 1, nbpac
599           zv_newice(ji)     = - zqbgow(ji) / ze_newice(ji)
600
601           ! A fraction zfrazb of frazil ice is accreted at the ice bottom
602           zfrazb        = ( TANH ( Cfrazb * ( zvrel_ac(ji) - vfrazb ) )     & 
603                             + 1.0 ) / 2.0 * maxfrazb
604           zdh_frazb(ji) = zfrazb*zv_newice(ji)
605           zv_newice(ji) = ( 1.0 - zfrazb ) * zv_newice(ji)
606        END DO
607        !+++++++++++
608        IF (jiindex_1d .GT. 0) THEN
609        WRITE(numout,*) ' zv_newice : ', zv_newice(jiindex_1d)
610        ENDIF
611        !+++++++++++
612
613        !------------------------------------
614        ! Diags for energy conservation test
615        !------------------------------------
616        DO ji = 1, nbpac
617           ! Volume
618           zji                  = MOD( npac(ji) - 1, jpi ) + 1
619           zjj                  = ( npac(ji) - 1 ) / jpi + 1
620           vt_i_init(zji,zjj)   = vt_i_init(zji,zjj) + zv_newice(ji)
621           ! Energy
622           zde                  = ze_newice(ji) / unit_fac
623           zde                  = zde * area(zji,zjj) * zv_newice(ji)
624           et_i_init(zji,zjj)   = et_i_init(zji,zjj) + zde
625        END DO
626
627        ! keep new ice volume in memory
628        CALL tab_1d_2d( nbpac, v_newice , npac(1:nbpac), zv_newice(1:nbpac) , &
629                        jpi, jpj )
630
631        !-----------------
632        ! Area of new ice
633        !-----------------
634        DO ji = 1, nbpac
635           za_newice(ji)     = zv_newice(ji) / zh_newice(ji)
636           ! diagnostic
637           zji                  = MOD( npac(ji) - 1, jpi ) + 1
638           zjj                  = ( npac(ji) - 1 ) / jpi + 1
639           diag_lat_gr(zji,zjj) = zv_newice(ji) / rdt_ice
640        END DO !ji
641
642!------------------------------------------------------------------------------!
643! 6) Redistribute new ice area and volume into ice categories                  !
644!------------------------------------------------------------------------------!
645
646        !-----------------------------------------
647        ! Keep old ice areas and volume in memory
648        !-----------------------------------------
649        zv_old(:,:) = zv_i_ac(:,:) 
650        za_old(:,:) = za_i_ac(:,:)
651
652        !-------------------------------------------
653        ! Compute excessive new ice area and volume
654        !-------------------------------------------
655        ! If lateral ice growth gives an ice concentration gt 1, then
656        ! we keep the excessive volume in memory and attribute it later
657        ! to bottom accretion
658        DO ji = 1, nbpac
659           ! vectorize
660           IF ( za_newice(ji) .GT. ( 1.0 - zat_i_ac(ji) ) ) THEN
661              zda_res(ji)    = za_newice(ji) - (1.0 - zat_i_ac(ji) )
662              zdv_res(ji)    = zda_res(ji) * zh_newice(ji) 
663              za_newice(ji)  = za_newice(ji) - zda_res(ji)
664              zv_newice(ji)  = zv_newice(ji) - zdv_res(ji)
665              IF ( ji .EQ. jiindex_1D ) THEN
666                      WRITE(numout,*) ' zv_newice : ', zv_newice(ji)
667                      WRITE(numout,*) ' zdv_res   : ', zdv_res  (ji)
668              ENDIF
669           ELSE
670              zda_res(ji) = 0.0
671              zdv_res(ji) = 0.0
672           ENDIF
673        END DO ! ji
674
675        !------------------------------------------------
676        ! Laterally redistribute new ice volume and area
677        !------------------------------------------------
678        zat_i_ac(:) = 0.0
679
680        WRITE(numout,*) ' zv_i_ac : ', zv_i_ac(jiindex, 1:jpl)
681        DO jl = 1, jpl
682           DO ji = 1, nbpac
683              ! vectorize
684              IF (       ( hi_max(jl-1)  .LT. zh_newice(ji) ) &
685                   .AND. ( zh_newice(ji) .LE. hi_max(jl)    ) ) THEN
686                 za_i_ac(ji,jl) = za_i_ac(ji,jl) + za_newice(ji)
687                 zv_i_ac(ji,jl) = zv_i_ac(ji,jl) + zv_newice(ji)
688                 zat_i_ac(ji)   = zat_i_ac(ji) + za_i_ac(ji,jl)
689                 zcatac(ji)     = jl
690              ENDIF
691           END DO ! ji
692        END DO ! jl
693        WRITE(numout,*) ' zv_i_ac : ', zv_i_ac(jiindex, 1:jpl)
694             
695!       !++++++++++++++++
696        DO ji = 1, nbpac
697!          !+++++
698           IF (zat_i_ac(ji).gt.1.0) THEN
699              zji            = MOD( npac(ji) - 1, jpi ) + 1
700              zjj            = ( npac(ji) - 1 ) / jpi + 1
701              WRITE(numout,*) ' *** ERROR MESSAGE *** '
702              WRITE(numout,*) ' something MUST be wrong '
703              WRITE(numout,*) ' at_i : ', zat_i_ac(ji)
704              WRITE(numout,*) ' is wrong '
705              WRITE(numout,*) ' point : ', zji, zjj
706           ENDIF
707        END DO ! ji
708        !++++++++++++++++
709
710        !----------------------------------
711        ! Heat content - lateral accretion
712        !----------------------------------
713        DO ji = 1, nbpac
714           jl = zcatac(ji) ! categroy in which new ice is put
715           ! zindb = 0 if no ice and 1 if yes
716           zindb            = 1.0 - MAX ( 0.0 , SIGN ( 1.0 , -za_old(ji,jl) ) ) 
717           ! old ice thickness
718           zhice_old(ji,jl)  = zv_old(ji,jl)                                  &
719                             / MAX ( za_old(ji,jl) , zeps ) * zindb
720           ! difference in thickness
721           zdhex(ji)      = MAX( 0.0, zh_newice(ji) - zhice_old(ji,jl) ) 
722           ! is ice totally new in category jl ?
723           zswinew(ji)    = MAX( 0.0, SIGN( 1.0 , - za_old(ji,jl) + epsi11 ) )
724        END DO
725
726        DO jk = 1, nlay_i
727           DO ji = 1, nbpac
728              jl = zcatac(ji)
729              zqold              = ze_i_ac(ji,jk,jl) ! [ J.m-3 ]
730              zalphai            = MIN( zhice_old(ji,jl) * jk  / nlay_i ,     &
731                                        zh_newice(ji) )                       &
732                                 - MIN( zhice_old(ji,jl) * ( jk - 1 )         &
733                                        / nlay_i , zh_newice(ji) )
734              ze_i_ac(ji,jk,jl) =                                             &
735              zswinew(ji)           * ze_newice(ji)                           &
736            + ( 1.0 - zswinew(ji) ) *                                         &
737              ( za_old(ji,jl)  * zqold * zhice_old(ji,jl) / nlay_i            &
738              + za_newice(ji)  * ze_newice(ji) * zalphai                      &
739              + za_newice(ji)  * ze_newice(ji) * zdhex(ji) / nlay_i ) /       &
740              ( ( zv_i_ac(ji,jl) ) / nlay_i )
741
742           END DO !ji
743        END DO !jl
744
745        !-----------------------------------------------
746        ! Add excessive volume of new ice at the bottom
747        !-----------------------------------------------
748        ! If the ice concentration exceeds 1, the remaining volume of new ice
749        ! is equally redistributed among all ice categories in which there is
750        ! ice
751
752        ! Fraction of level ice
753        jm = 1
754        zat_i_lev(:) = 0.0
755
756        DO jl = ice_cat_bounds(jm,1), ice_cat_bounds(jm,2)
757           DO ji = 1, nbpac
758              zat_i_lev(ji) = zat_i_lev(ji) + za_i_ac(ji,jl) 
759           END DO
760        END DO
761
762        WRITE(numout,*) ' zv_i_ac : ', zv_i_ac(jiindex, 1:jpl)
763        DO jl = ice_cat_bounds(jm,1), ice_cat_bounds(jm,2)
764           DO ji = 1, nbpac
765              zindb      =  MAX( 0.0, SIGN( 1.0, zdv_res(ji) ) )
766              zv_i_ac(ji,jl) = zv_i_ac(ji,jl) +                               &
767                               zindb * zdv_res(ji) * za_i_ac(ji,jl) /         &
768                               MAX( zat_i_lev(ji) , epsi06 )
769           END DO ! ji
770        END DO ! jl
771        WRITE(numout,*) ' zv_i_ac : ', zv_i_ac(jiindex, 1:jpl)
772
773        !---------------------------------
774        ! Heat content - bottom accretion
775        !---------------------------------
776        jm = 1
777        DO jl = ice_cat_bounds(jm,1), ice_cat_bounds(jm,2)
778           DO ji = 1, nbpac
779              ! zindb = 0 if no ice and 1 if yes
780              zindb            =  1.0 -  MAX( 0.0 , SIGN( 1.0                 & 
781                                            , - za_i_ac(ji,jl ) ) ) 
782              zhice_old(ji,jl) =  zv_i_ac(ji,jl) /                            &
783                                    MAX( za_i_ac(ji,jl) , zeps ) * zindb
784              zdhicbot(ji,jl)  =  zdv_res(ji) / MAX( za_i_ac(ji,jl) , zeps )  & 
785                               *  zindb &
786                               +  zindb * zdh_frazb(ji) ! frazil ice
787                                                        ! may coalesce
788              ! thickness of residual ice
789              zdummy(ji,jl)    = zv_i_ac(ji,jl)/MAX(za_i_ac(ji,jl),zeps)*zindb
790           END DO !ji
791        END DO !jl
792
793        ! old layers thicknesses and enthalpies
794        DO jl = ice_cat_bounds(jm,1), ice_cat_bounds(jm,2)
795           DO jk = 1, nlay_i
796              DO ji = 1, nbpac
797                 zthick0(ji,jk,jl)=  zhice_old(ji,jl) / nlay_i
798                 zqm0   (ji,jk,jl)=  ze_i_ac(ji,jk,jl) * zthick0(ji,jk,jl)
799              END DO !ji
800           END DO !jk
801        END DO !jl
802
803        DO jl = ice_cat_bounds(jm,1), ice_cat_bounds(jm,2)
804           DO ji = 1, nbpac
805              zthick0(ji,nlay_i+1,jl) =  zdhicbot(ji,jl)
806              zqm0   (ji,nlay_i+1,jl) =  ze_newice(ji)*zdhicbot(ji,jl)
807           END DO ! ji
808        END DO ! jl
809
810        ! Redistributing energy on the new grid
811        ze_i_ac(:,:,:) = 0.0
812        DO jl = ice_cat_bounds(jm,1), ice_cat_bounds(jm,2)
813           DO jk = 1, nlay_i
814              DO layer = 1, nlay_i + 1
815                 DO ji = 1, nbpac
816                    zindb            =  1.0 -  MAX( 0.0 , SIGN( 1.0 ,         & 
817                                                    - za_i_ac(ji,jl ) ) ) 
818                    ! Redistributing energy on the new grid
819                    zweight         =  MAX (  &
820                    MIN( zhice_old(ji,jl) * layer , zdummy(ji,jl) * jk ) -    &
821                    MAX( zhice_old(ji,jl) * ( layer - 1 ) , zdummy(ji,jl) *   &
822                        ( jk - 1 ) ) , 0.0 )                                  &
823                    /  ( MAX(nlay_i * zthick0(ji,layer,jl),zeps) ) * zindb
824                    ze_i_ac(ji,jk,jl) =  ze_i_ac(ji,jk,jl) +                  &
825                                         zweight * zqm0(ji,layer,jl) 
826                 END DO ! ji
827              END DO ! layer
828           END DO ! jk
829        END DO ! jl
830
831        DO jl = ice_cat_bounds(jm,1), ice_cat_bounds(jm,2)
832           DO jk = 1, nlay_i
833              DO ji = 1, nbpac
834                 zindb                =  1.0 - MAX( 0.0 , SIGN( 1.0           &
835                                      , - zv_i_ac(ji,jl) ) ) !0 if no ice
836                 ze_i_ac(ji,jk,jl)    = ze_i_ac(ji,jk,jl) /                   &
837                                        MAX( zv_i_ac(ji,jl) , zeps)           &
838                                        * za_i_ac(ji,jl) * nlay_i * zindb
839              END DO
840           END DO
841        END DO
842
843        !------------
844        ! Update age
845        !------------
846        DO jl = 1, jpl
847           DO ji = 1, nbpac
848              !--ice age
849              zindb            = 1.0 - MAX( 0.0 , SIGN( 1.0 , -               &
850                                 za_i_ac(ji,jl) ) )  ! 0 if no ice and 1 if yes
851              !zo_i_ac(ji,jl)  = zv_old(ji,jl) * zo_i_ac(ji,jl) / &
852              !MAX(zv_i_ac(ji,jl),zeps) * zindb   
853              zoa_i_ac(ji,jl)  = za_old(ji,jl) * zoa_i_ac(ji,jl) /            &
854                                 MAX( za_i_ac(ji,jl) , zeps ) * zindb   
855           END DO ! ji
856        END DO ! jl   
857
858        !-----------------
859        ! Update salinity
860        !-----------------
861        IF ( ( num_sal .EQ. 2 ) .OR. ( num_sal .EQ. 4 ) ) THEN
862
863        DO jl = 1, jpl
864           DO ji = 1, nbpac
865              !zindb = 0 if no ice and 1 if yes
866              zindb            = 1.0 - MAX( 0.0 , SIGN( 1.0 , -               &
867                                 zv_i_ac(ji,jl) ) )  ! 0 if no ice and 1 if yes
868              zdv              = zv_i_ac(ji,jl) - zv_old(ji,jl)
869              zsmv_i_ac(ji,jl) = ( zsmv_i_ac(ji,jl) + zdv * zs_newice(ji) ) * &
870                                 zindb
871           END DO ! ji
872        END DO ! jl   
873
874        ENDIF ! num_sal
875 
876        !---------------------------------
877        ! Salt flux due to new ice growth
878        !---------------------------------
879        IF ( ( num_sal .EQ. 4 ) ) THEN
880           DO ji = 1, nbpac
881              zji            = MOD( npac(ji) - 1, jpi ) + 1
882              zjj            = ( npac(ji) - 1 ) / jpi + 1
883              fseqv_1d(ji)   = fseqv_1d(ji) +                                     &
884                               ( sss_io(zji,zjj) - bulk_sal      ) * rhoic *      &
885                               zv_newice(ji) / rdt_ice
886           END DO
887        ELSE
888           DO ji = 1, nbpac
889              zji            = MOD( npac(ji) - 1, jpi ) + 1
890              zjj            = ( npac(ji) - 1 ) / jpi + 1
891              fseqv_1d(ji)   = fseqv_1d(ji) +                                     &
892                               ( sss_io(zji,zjj) - zs_newice(ji) ) * rhoic *      &
893                               zv_newice(ji) / rdt_ice
894           END DO ! ji
895        ENDIF
896
897!------------------------------------------------------------------------------!
898! 8) Change 2D vectors to 1D vectors
899!------------------------------------------------------------------------------!
900
901        DO jl = 1, jpl
902           CALL tab_1d_2d( nbpac, a_i(:,:,jl) , npac(1:nbpac) ,               &
903                                  za_i_ac(1:nbpac,jl) , jpi, jpj )
904           CALL tab_1d_2d( nbpac, v_i(:,:,jl) , npac(1:nbpac) ,               &
905                                  zv_i_ac(1:nbpac,jl) , jpi, jpj )
906           CALL tab_1d_2d( nbpac, oa_i(:,:,jl), npac(1:nbpac) ,               &
907                                  zoa_i_ac(1:nbpac,jl), jpi, jpj )
908           IF ( ( num_sal .EQ. 2 ) .OR. ( num_sal .EQ. 4 ) ) &
909           CALL tab_1d_2d( nbpac, smv_i(:,:,jl) , npac(1:nbpac) ,             &
910                                     zsmv_i_ac(1:nbpac,jl) , jpi, jpj )
911           DO jk = 1, nlay_i
912              CALL tab_1d_2d( nbpac, e_i(:,:,jk,jl) , npac(1:nbpac),          &
913                                     ze_i_ac(1:nbpac,jk,jl), jpi, jpj )
914           END DO ! jk
915        END DO !jl
916        CALL tab_1d_2d( nbpac, fseqv , npac(1:nbpac), fseqv_1d  (1:nbpac) ,   &
917                        jpi, jpj )
918
919     ENDIF ! nbpac > 0
920
921!------------------------------------------------------------------------------!
922! 9) Change units for e_i
923!------------------------------------------------------------------------------!   
924
925      DO jl = 1, jpl
926         DO jk = 1, nlay_i
927            DO jj = 1, jpj
928               DO ji = 1, jpi
929                  ! Correct dimensions to avoid big values
930                  e_i(ji,jj,jk,jl) = e_i(ji,jj,jk,jl) / unit_fac
931
932                  ! Mutliply by ice volume, and divide by number
933                  ! of layers to get heat content in 10^9 Joules
934                  e_i(ji,jj,jk,jl) = e_i(ji,jj,jk,jl) * &
935                                       area(ji,jj) * v_i(ji,jj,jl) / &
936                                       nlay_i
937               END DO
938            END DO
939         END DO
940      END DO
941     
942      !++++
943      WRITE(numout,*) 'lim_thd_lac  : Salt flux diagnostic '
944      WRITE(numout,*) '~~~~~~~~~~~~'
945      WRITE(numout,*) ' *** Salt fluxes at bottom interface ***'
946      WRITE(numout,*) ' fseqv      : ', fseqv(jiindex,jjindex)
947      WRITE(numout,*)
948      !++++
949
950!------------------------------------------------------------------------------|
951! 10) Conservation check and changes in each ice category
952!------------------------------------------------------------------------------|
953
954      CALL lim_column_sum (jpl,   v_i, vt_i_final)
955      fieldid = 'v_i, limthd_lac'
956      CALL lim_cons_check (vt_i_init, vt_i_final, 1.0e-6, fieldid) 
957
958      CALL lim_column_sum_energy(jpl, nlay_i, e_i, et_i_final)
959      fieldid = 'e_i, limthd_lac'
960      CALL lim_cons_check (et_i_final, et_i_final, 1.0e-3, fieldid) 
961     
962      CALL lim_column_sum (jpl,   v_s, vt_s_final)
963      fieldid = 'v_s, limthd_lac'
964      CALL lim_cons_check (vt_s_init, vt_s_final, 1.0e-6, fieldid) 
965
966!     CALL lim_column_sum (jpl,   e_s(:,:,1,:) , et_s_init)
967!     fieldid = 'e_s, limthd_lac'
968!     CALL lim_cons_check (et_s_init, et_s_final, 1.0e-3, fieldid)
969
970      WRITE(numout,*) ' vt_i_init : ', vt_i_init(jiindex,jjindex)
971      WRITE(numout,*) ' vt_i_final: ', vt_i_final(jiindex,jjindex)
972      WRITE(numout,*) ' et_i_init : ', et_i_init(jiindex,jjindex)
973      WRITE(numout,*) ' et_i_final: ', et_i_final(jiindex,jjindex)
974
975   END SUBROUTINE lim_thd_lac
976
977#else
978   !!======================================================================
979   !!                       ***  MODULE limthd_lac   ***
980   !!                           no sea ice model
981   !!======================================================================
982CONTAINS
983   SUBROUTINE lim_thd_lac           ! Empty routine
984   END SUBROUTINE lim_thd_lac
985#endif
986END MODULE limthd_lac
Note: See TracBrowser for help on using the repository browser.