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

source: trunk/NEMO/LIM_SRC_3/limupdate.F90 @ 894

Last change on this file since 894 was 894, checked in by rblod, 16 years ago

Correct remaining bugs in LIM3 implementation, see ticket #71

File size: 45.7 KB
Line 
1MODULE limupdate
2   !!======================================================================
3   !!                     ***  MODULE  limupdate  ***
4   !!    Update of sea-ice global variables
5   !!    at the end of the time step
6   !!   
7   !!    Ice speed from ice dynamics
8   !!    Ice thickness, Snow thickness, Temperatures, Lead fraction
9   !!      from advection and ice thermodynamics
10   !!======================================================================
11#if defined key_lim3
12   !!----------------------------------------------------------------------
13   !!   'key_lim3'                                      LIM3 sea-ice model
14   !!----------------------------------------------------------------------
15   !!    lim_update   : computes update of sea-ice global variables
16   !!                   from trend terms
17   !!----------------------------------------------------------------------
18   !! * Modules used
19   USE limistate
20   USE limrhg          ! ice rheology
21   USE lbclnk
22
23   USE dom_oce
24   USE oce             ! dynamics and tracers variables
25   USE in_out_manager
26   USE ice_oce         ! ice variables
27   USE sbc_oce         ! Surface boundary condition: ocean fields
28   USE sbc_ice         ! Surface boundary condition: ice fields
29   USE dom_ice
30   USE daymod
31   USE phycst          ! Define parameters for the routines
32   USE ice
33   USE iceini
34   USE lbclnk
35   USE limdyn
36   USE limtrp
37   USE limthd
38   USE limsbc
39   USE limdia
40   USE limwri
41   USE limrst
42   USE thd_ice         ! LIM thermodynamic sea-ice variables
43   USE par_ice
44   USE limitd_th
45   USE limvar
46   USE prtctl          ! Print control
47
48
49   IMPLICIT NONE
50   PRIVATE
51
52   !! * Accessibility
53   PUBLIC lim_update ! routine called by ice_step
54
55   !! * Module variables
56
57   !!----------------------------------------------------------------------
58   !!   LIM 2.1 , UCL-ASTR-LODYC-IPSL  (2004)
59   !!----------------------------------------------------------------------
60
61CONTAINS
62
63   SUBROUTINE lim_update
64      !!-------------------------------------------------------------------
65      !!               ***  ROUTINE lim_update  ***
66      !!               
67      !! ** Purpose :  Computes update of sea-ice global variables at
68      !!               the end of the time step.
69      !!               Address pathological cases
70      !!               This place is very important
71      !!               
72      !! ** Method  :  Mathematical
73      !!
74      !! ** Action  : -
75      !!
76      !! History : This routine was new for LIM 3.0
77      !!   3.0  !  04-06  (M. Vancoppenolle) Tendencies
78      !!---------------------------------------------------------------------
79      !! * Local variables
80      INTEGER ::      &
81          ji, jj,     & ! geographical indices
82          jk, jl, jm    ! layer, category and type indices
83      INTEGER ::      &
84          jbnd1, jbnd2
85      INTEGER ::      &
86          i_ice_switch
87
88      REAL(wp)  ::           &  ! constant values
89         epsi06 = 1.e-06  ,  &
90         epsi03 = 1.e-03  ,  &
91         epsi16 = 1.e-16  ,  &
92         epsi20 = 1.e-20  ,  &
93         epsi04 = 1.e-04  ,  &
94         epsi10 = 1.e-10  ,  &
95         rzero  = 0.e0    ,  &
96         rone   = 1.e0    ,  &
97         zhimax                   ! maximum thickness tolerated for advection of
98                                  ! in an ice-free cell
99      REAL(wp) ::            &  ! dummy switches and arguments
100         zindb, zindsn, zindic, zacrith,  &
101         zrtt, zindg, zh, zdvres, zviold,                       &
102         zbigvalue, zvsold, z_da_ex, zamax,                     &
103         z_prescr_hi, zat_i_old,                                &
104         ztmelts, ze_s
105
106      REAL(wp), DIMENSION(jpl) :: z_da_i, z_dv_i
107
108      LOGICAL, DIMENSION(jpi,jpj,jpl) ::  &
109         internal_melt
110
111      INTEGER ::      &
112         ind_im, layer      ! indices for internal melt
113      REAL(wp), DIMENSION(jkmax) :: &
114         zthick0, zqm0      ! thickness of the layers and heat contents for
115                            ! internal melt
116      REAL(wp) ::                   &
117         zweight, zesum
118       
119
120      !!-------------------------------------------------------------------
121
122      WRITE(numout,*) ' lim_update '
123      WRITE(numout,*) ' ~~~~~~~~~~ '
124
125!+++++ [
126        WRITE(numout,*) ' O) Initial values '
127        WRITE(numout,*) ' a_i : ', a_i(jiindx, jjindx, 1:jpl)
128        WRITE(numout,*) ' at_i: ', at_i(jiindx,jjindx)
129        WRITE(numout,*) ' v_i : ', v_i(jiindx, jjindx, 1:jpl)
130        WRITE(numout,*) ' v_s : ', v_s(jiindx, jjindx, 1:jpl)
131        WRITE(numout,*) ' smv_i: ', smv_i(jiindx, jjindx, 1:jpl)
132        DO jk = 1, nlay_i
133        WRITE(numout,*) ' e_i : ', e_i(jiindx, jjindx, jk, 1:jpl)
134        END DO
135!+++++ ]
136
137!------------------------------------------------------------------------------
138! 1. Update of Global variables                                               |
139!------------------------------------------------------------------------------
140
141     !---------------------
142     ! Ice dynamics 
143     !---------------------
144
145     u_ice(:,:) = u_ice(:,:) + d_u_ice_dyn(:,:)
146     v_ice(:,:) = v_ice(:,:) + d_v_ice_dyn(:,:)
147
148     !-----------------------------
149     ! Update ice and snow volumes 
150     !-----------------------------
151
152     DO jl = 1, jpl
153        DO jj = 1, jpj
154           DO ji = 1, jpi
155
156              v_i(ji,jj,jl)  = v_i(ji,jj,jl) + d_v_i_trp(ji,jj,jl)  &
157                                             + d_v_i_thd(ji,jj,jl) 
158              v_s(ji,jj,jl)  = v_s(ji,jj,jl) + d_v_s_trp(ji,jj,jl)  &
159                                             + d_v_s_thd(ji,jj,jl)
160           END DO
161        END DO
162     END DO
163
164     !---------------------------------
165     ! Classify the pathological cases
166     !---------------------------------
167     ! (1) v_i (new) > 0; d_v_i_thd + v_i(old) > 0 (easy case)
168     ! (2) v_i (new) > 0; d_v_i_thd + v_i(old) = 0 (total thermodynamic ablation)
169     ! (3) v_i (new) < 0; d_v_i_thd + v_i(old) > 0 (combined total ablation)
170     ! (4) v_i (new) < 0; d_v_i_thd + v_i(old) = 0 (total thermodynamic ablation
171     ! with negative advection, very pathological )
172     ! (5) v_i (old) = 0; d_v_i_trp > 0 (advection of ice in a free-cell)
173
174     DO jl = 1, jpl
175        DO jj = 1, jpj
176           DO ji = 1, jpi
177              patho_case(ji,jj,jl) = 1
178              IF ( v_i(ji,jj,jl) .GE. 0.0 ) THEN
179                 IF ( old_v_i(ji,jj,jl) + d_v_i_thd(ji,jj,jl) .LT. epsi10 ) THEN
180                    patho_case(ji,jj,jl) = 2
181                 ENDIF
182              ELSE
183                 patho_case(ji,jj,jl) = 3
184                 IF ( old_v_i(ji,jj,jl) + d_v_i_thd(ji,jj,jl) .LT. epsi10 ) THEN
185                    patho_case(ji,jj,jl) = 4
186                 ENDIF
187              ENDIF
188              IF ( ( old_v_i(ji,jj,jl) .LE. epsi10 ) .AND. &
189                   ( d_v_i_trp(ji,jj,jl) .GT. epsi06 ) ) THEN
190                 patho_case(ji,jj,jl) = 5 ! advection of ice in an ice-free
191                                             ! cell
192                 WRITE(numout,*) ' ALERTE patho_case still equal to 5 '
193                 WRITE(numout,*) ' ji , jj   : ', ji, jj
194                 WRITE(numout,*) ' old_v_i   : ', old_v_i(ji,jj,jl)
195                 WRITE(numout,*) ' d_v_i_trp : ', d_v_i_trp(ji,jj,jl)
196
197              ENDIF
198           END DO
199        END DO
200     END DO
201
202     !--------------------
203     ! Excessive ablation
204     !--------------------
205
206     DO jl = 1, jpl
207        DO jj = 1, jpj
208           DO ji = 1, jpi
209              IF (      ( patho_case(ji,jj,jl) .EQ. 3 ) &
210                   .OR. ( patho_case(ji,jj,jl) .EQ. 4 ) ) THEN
211              zviold         = old_v_i(ji,jj,jl)
212              zvsold         = old_v_s(ji,jj,jl)
213              ! in cases 3 ( combined total ablation )
214              !      and 4 ( total ablation with negative advection )
215              ! there is excessive total ablation
216              ! advection is chosen to be prioritary in order to conserve mass.
217              ! dv_i_thd is computed as a residual
218              ! negative energy has to be kept in memory and to be given to the ocean
219              ! equivalent salt flux is given to the ocean
220              !
221              ! This was the best solution found. Otherwise, mass conservation in advection
222              ! scheme should have been revised, which could have been a big problem
223              ! Martin Vancoppenolle (2006, updated 2007)
224
225              ! is there any ice left ?
226              zindic        = MAX( rzero, SIGN( rone, v_i(ji,jj,jl) - epsi10 ) ) 
227              !=1 if hi > 1e-3 and 0 if not
228              zdvres        = MAX(0.0,-v_i(ji,jj,jl)) !residual volume if too much ice was molten
229                                                      !this quantity is positive
230              v_i(ji,jj,jl) = zindic*v_i(ji,jj,jl)    !ice volume cannot be negative
231                                 !correct thermodynamic ablation
232              d_v_i_thd(ji,jj,jl)  = zindic  *  d_v_i_thd(ji,jj,jl) + & 
233                                (1.0-zindic) * (-zviold - d_v_i_trp(ji,jj,jl)) 
234              ! THIS IS NEW
235              d_a_i_thd(ji,jj,jl)  = zindic  *  d_a_i_thd(ji,jj,jl) + & 
236                                (1.0-zindic) * (-old_a_i(ji,jj,jl)) 
237
238              !residual salt flux if ice is over-molten
239              fsalt_res(ji,jj)  = fsalt_res(ji,jj) + ( sss_m(ji,jj) - sm_i(ji,jj,jl) ) * & 
240                             ( rhoic * zdvres / rdt_ice )
241!             fheat_res(ji,jj)  = fheat_res(ji,jj) + rhoic * lfus * zdvres / rdt_ice
242
243              ! is there any snow left ?
244              zindsn        = MAX( rzero, SIGN( rone, v_s(ji,jj,jl) - epsi10 ) ) 
245              zvsold        = v_s(ji,jj,jl)
246              zdvres        = MAX(0.0,-v_s(ji,jj,jl)) !residual volume if too much ice was molten
247                                                      !this quantity is positive
248              v_s(ji,jj,jl) = zindsn*v_s(ji,jj,jl)    !snow volume cannot be negative
249                                                      !correct thermodynamic ablation
250              d_v_s_thd(ji,jj,jl)  = zindsn  *  d_v_s_thd(ji,jj,jl) + & 
251                                 (1.0-zindsn) * (-zvsold - d_v_s_trp(ji,jj,jl)) 
252              !unsure correction on salt flux.... maybe future will tell it was not that right
253
254              !residual salt flux if snow is over-molten
255              fsalt_res(ji,jj)  = fsalt_res(ji,jj) + sss_m(ji,jj) * & 
256                             ( rhosn * zdvres / rdt_ice )
257                             !this flux will be positive if snow was over-molten
258!             fheat_res(ji,jj)  = fheat_res(ji,jj) + rhosn * lfus * zdvres / rdt_ice
259              ENDIF
260           END DO !ji
261        END DO !jj
262     END DO !jl
263
264!+++++ [
265     DO jj = 1, jpj
266        DO ji = 1, jpi
267           IF ( ABS(fsalt_res(ji,jj)) .GT. 1.0 ) THEN
268              WRITE(numout,*) ' ALERTE 1000 : residual salt flux of -> ', &
269              fsalt_res(ji,jj)
270              WRITE(numout,*) ' ji, jj : ', ji, jj, ' gphit, glamt : ', &
271              gphit(ji,jj), glamt(ji,jj)
272           ENDIF
273        END DO
274     END DO
275
276     WRITE(numout,*) ' 1. Before update of Global variables '
277     WRITE(numout,*) ' a_i : ', a_i(jiindx, jjindx, 1:jpl)
278     WRITE(numout,*) ' at_i: ', at_i(jiindx,jjindx)
279     WRITE(numout,*) ' v_i : ', v_i(jiindx, jjindx, 1:jpl)
280        WRITE(numout,*) ' v_s : ', v_s(jiindx, jjindx, 1:jpl)
281     WRITE(numout,*) ' smv_i: ', smv_i(jiindx, jjindx, 1:jpl)
282        DO jk = 1, nlay_i
283        WRITE(numout,*) ' e_i : ', e_i(jiindx, jjindx, jk, 1:jpl)
284        END DO
285!+++++ ]
286
287     !---------------------------------------------
288     ! Ice concentration and ice heat content
289     !---------------------------------------------
290
291     a_i (:,:,:) = a_i (:,:,:)   + d_a_i_trp(:,:,:)     &
292                                 + d_a_i_thd(:,:,:)
293     CALL lim_var_glo2eqv ! useless, just for debug
294        DO jk = 1, nlay_i
295        WRITE(numout,*) ' t_i : ', t_i(jiindx, jjindx, jk, 1:jpl)
296        END DO
297     e_i(:,:,:,:) = e_i(:,:,:,:) + d_e_i_trp(:,:,:,:) 
298     CALL lim_var_glo2eqv ! useless, just for debug
299        WRITE(numout,*) ' After transport update '
300        DO jk = 1, nlay_i
301        WRITE(numout,*) ' t_i : ', t_i(jiindx, jjindx, jk, 1:jpl)
302        END DO
303     e_i(:,:,:,:) = e_i(:,:,:,:) + d_e_i_thd(:,:,:,:) 
304     CALL lim_var_glo2eqv ! useless, just for debug
305        WRITE(numout,*) ' After thermodyn update '
306        DO jk = 1, nlay_i
307        WRITE(numout,*) ' t_i : ', t_i(jiindx, jjindx, jk, 1:jpl)
308        END DO
309
310     at_i(:,:) = 0.0
311     DO jl = 1, jpl
312        at_i(:,:) = a_i(:,:,jl) + at_i(:,:)
313     END DO
314
315!+++++ [
316     WRITE(numout,*) ' 1. After update of Global variables (2) '
317     WRITE(numout,*) ' a_i : ', a_i(jiindx, jjindx, 1:jpl)
318     WRITE(numout,*) ' at_i: ', at_i(jiindx,jjindx)
319     WRITE(numout,*) ' v_i : ', v_i(jiindx, jjindx, 1:jpl)
320        WRITE(numout,*) ' v_s : ', v_s(jiindx, jjindx, 1:jpl)
321     WRITE(numout,*) ' smv_i: ', smv_i(jiindx, jjindx, 1:jpl)
322     WRITE(numout,*) ' oa_i : ', oa_i(jiindx, jjindx, 1:jpl)
323     WRITE(numout,*) ' e_s : ', e_s(jiindx, jjindx, 1, 1:jpl)
324        DO jk = 1, nlay_i
325        WRITE(numout,*) ' e_i : ', e_i(jiindx, jjindx, jk, 1:jpl)
326        END DO
327!+++++ ]
328
329     !------------------------------
330     ! Snow temperature and ice age
331     !------------------------------
332
333     e_s(:,:,:,:) = e_s(:,:,:,:)        + &
334                    d_e_s_trp(:,:,:,:)  + &
335                    d_e_s_thd(:,:,:,:)
336
337     oa_i(:,:,:)  = oa_i(:,:,:)         + &
338                    d_oa_i_trp(:,:,:)   + &
339                    d_oa_i_thd(:,:,:)
340
341     !--------------
342     ! Ice salinity   
343     !--------------
344
345     IF ( ( num_sal .EQ. 2 ) .OR. ( num_sal .EQ. 4 ) ) THEN ! general case
346
347!+++++
348     WRITE(numout,*) ' Before everything '
349     WRITE(numout,*) ' smv_i: ', smv_i(jiindx, jjindx, 1:jpl)
350     WRITE(numout,*) ' oa_i:  ', oa_i(jiindx, jjindx, 1:jpl)
351        DO jk = 1, nlay_i
352        WRITE(numout,*) ' e_i : ', e_i(jiindx, jjindx, jk, 1:jpl)
353        END DO
354        WRITE(numout,*) ' v_s : ', v_s(jiindx, jjindx, 1:jpl)
355!+++++
356
357     smv_i(:,:,:) = smv_i(:,:,:)       + &
358                    d_smv_i_thd(:,:,:) + &
359                    d_smv_i_trp(:,:,:)
360
361!+++++
362     WRITE(numout,*) ' After advection   '
363     WRITE(numout,*) ' smv_i: ', smv_i(jiindx, jjindx, 1:jpl)
364        WRITE(numout,*) ' v_s : ', v_s(jiindx, jjindx, 1:jpl)
365!+++++
366
367     ENDIF ! num_sal .EQ. 2
368             
369     CALL lim_var_glo2eqv
370
371!--------------------------------------
372! 2. Review of all pathological cases
373!--------------------------------------
374
375     zrtt          = 173.15 * rone
376     zacrith       = 1.0e-6
377
378     !-------------------------------------------
379     ! 2.1) Advection of ice in an ice-free cell
380     !-------------------------------------------
381     ! should be removed since it is treated after dynamics now
382
383     zhimax = 5.0
384     ! first category
385     DO jj = 1, jpj
386        DO ji = 1, jpi
387           !--- the thickness of such an ice is often out of bounds
388           !--- thus we recompute a new area while conserving ice volume
389           zat_i_old = SUM(old_a_i(ji,jj,:))
390           zindb          =  MAX( rzero, SIGN( rone, ABS(d_a_i_trp(ji,jj,1)) - epsi10 ) ) 
391           IF (      ( ABS(d_v_i_trp(ji,jj,1))/MAX(ABS(d_a_i_trp(ji,jj,1)),epsi10)*zindb.GT.zhimax) &
392                .AND.( ( v_i(ji,jj,1)/MAX(a_i(ji,jj,1),epsi10)*zindb).GT.zhimax ) &
393                .AND.( zat_i_old.LT.zacrith ) )  THEN ! new line
394              z_prescr_hi      = hi_max(1) / 2.0
395              a_i(ji,jj,1)     = v_i(ji,jj,1) / z_prescr_hi
396           ENDIF
397        END DO
398     END DO
399
400!+++++ [
401        WRITE(numout,*) ' 2.1 '
402        WRITE(numout,*) ' a_i : ', a_i(jiindx, jjindx, 1:jpl)
403        WRITE(numout,*) ' at_i: ', at_i(jiindx,jjindx)
404        WRITE(numout,*) ' v_i : ', v_i(jiindx, jjindx, 1:jpl)
405        WRITE(numout,*) ' v_s : ', v_s(jiindx, jjindx, 1:jpl)
406        WRITE(numout,*) ' smv_i: ', smv_i(jiindx, jjindx, 1:jpl)
407        DO jk = 1, nlay_i
408        WRITE(numout,*) ' e_i : ', e_i(jiindx, jjindx, jk, 1:jpl)
409        END DO
410!+++++ ]
411
412!change this 14h44
413     zhimax = 20.0 ! line added up
414     ! change this also 17 aug
415     zhimax = 30.0 ! line added up
416
417     DO jl = 2, jpl
418        jm = ice_types(jl)
419        DO jj = 1, jpj
420           DO ji = 1, jpi
421              zindb          =  MAX( rzero, SIGN( rone, ABS(d_a_i_trp(ji,jj,jl)) - epsi10 ) ) 
422              ! this correction is very tricky... sometimes, advection gets wrong i don't know why
423              ! it makes problems when the advected volume and concentration do not seem to be
424              ! related with each other
425              ! the new thickness is sometimes very big!
426              ! and sometimes d_a_i_trp and d_v_i_trp have different sign
427              ! which of course is plausible
428              ! but fuck! it fucks everything up :)
429              IF ( (ABS(d_v_i_trp(ji,jj,jl))/MAX(ABS(d_a_i_trp(ji,jj,jl)),epsi10)*zindb.GT.zhimax) &
430                   .AND.(v_i(ji,jj,jl)/MAX(a_i(ji,jj,jl),epsi10)*zindb).GT.zhimax ) THEN
431                 z_prescr_hi  =  ( hi_max_typ(jl-ice_cat_bounds(jm,1)  ,jm) + &
432                                   hi_max_typ(jl-ice_cat_bounds(jm,1)+1,jm) ) / &
433                                   2.0
434                 a_i(ji,jj,jl) = v_i(ji,jj,jl) / z_prescr_hi
435                 ht_i(ji,jj,jl) = v_i(ji,jj,jl) / a_i(ji,jj,jl)
436              ENDIF
437           zat_i_old = SUM(old_a_i(ji,jj,:))
438
439           END DO ! ji
440        END DO !jj
441     END DO !jl
442
443!+++++ [
444        WRITE(numout,*) ' 2.1 initial '
445        WRITE(numout,*) ' a_i : ', a_i(jiindx, jjindx, 1:jpl)
446        WRITE(numout,*) ' at_i: ', at_i(jiindx,jjindx)
447        WRITE(numout,*) ' v_i : ', v_i(jiindx, jjindx, 1:jpl)
448        WRITE(numout,*) ' v_s : ', v_s(jiindx, jjindx, 1:jpl)
449        WRITE(numout,*) ' smv_i: ', smv_i(jiindx, jjindx, 1:jpl)
450        DO jk = 1, nlay_i
451        WRITE(numout,*) ' e_i : ', e_i(jiindx, jjindx, jk, 1:jpl)
452        END DO
453!+++++ ]
454
455     at_i(:,:) = 0.0
456     DO jl = 1, jpl
457        at_i(:,:) = a_i(:,:,jl) + at_i(:,:)
458     END DO
459
460     !----------------------------------------------------
461     ! 2.2) Rebin categories with thickness out of bounds
462     !----------------------------------------------------
463!+++++ [
464        WRITE(numout,*) ' 2.1 before rebinning '
465        WRITE(numout,*) ' a_i : ', a_i(jiindx, jjindx, 1:jpl)
466        WRITE(numout,*) ' at_i: ', at_i(jiindx,jjindx)
467        WRITE(numout,*) ' v_i : ', v_i(jiindx, jjindx, 1:jpl)
468        WRITE(numout,*) ' smv_i: ', smv_i(jiindx, jjindx, 1:jpl)
469        DO jk = 1, nlay_i
470        WRITE(numout,*) ' e_i : ', e_i(jiindx, jjindx, jk, 1:jpl)
471        END DO
472        WRITE(numout,*) ' v_s : ', v_s(jiindx, jjindx, 1:jpl)
473!+++++ ]
474
475      DO jm = 1, jpm
476         jbnd1 = ice_cat_bounds(jm,1)
477         jbnd2 = ice_cat_bounds(jm,2)
478         IF (ice_ncat_types(jm) .GT. 1 ) CALL lim_itd_th_reb(jbnd1, jbnd2, jm)
479      END DO
480
481
482!+++++ [
483        WRITE(numout,*) ' 2.1 after rebinning'
484        WRITE(numout,*) ' a_i : ', a_i(jiindx, jjindx, 1:jpl)
485        WRITE(numout,*) ' at_i: ', at_i(jiindx,jjindx)
486        WRITE(numout,*) ' v_i : ', v_i(jiindx, jjindx, 1:jpl)
487        WRITE(numout,*) ' smv_i: ', smv_i(jiindx, jjindx, 1:jpl)
488        DO jk = 1, nlay_i
489        WRITE(numout,*) ' e_i : ', e_i(jiindx, jjindx, jk, 1:jpl)
490        WRITE(numout,*) ' t_i : ', t_i(jiindx, jjindx, jk, 1:jpl)
491        END DO
492        WRITE(numout,*) ' v_s : ', v_s(jiindx, jjindx, 1:jpl)
493!+++++ ]
494
495     at_i(:,:) = 0.0
496     DO jl = 1, jpl
497        at_i(:,:) = a_i(:,:,jl) + at_i(:,:)
498     END DO
499
500     !---------------------------------
501     ! 2.3) Melt of an internal layer
502     !---------------------------------
503     internal_melt(:,:,:) = .false.
504
505     DO jl = 1, jpl
506        DO jk = 1, nlay_i
507           DO jj = 1, jpj 
508              DO ji = 1, jpi
509                 ztmelts = - tmut * s_i(ji,jj,jk,jl) + rtt
510                 IF ( ( ( e_i(ji,jj,jk,jl) .LE. 0.0 ) .OR. &
511                        ( t_i(ji,jj,jk,jl) .GE. ztmelts ) ) .AND. &
512                        ( v_i(ji,jj,jl) .GT. 0.0 ) .AND. &
513                        ( a_i(ji,jj,jl) .GT. 0.0 ) ) THEN
514!                    WRITE(numout,*) ' Internal layer melt : '
515!                    WRITE(numout,*) ' ji, jj, jk, jl : ', ji,jj,jk,jl
516!                    WRITE(numout,*) ' e_i : ', e_i(ji,jj,jk,jl)
517!                    WRITE(numout,*) ' v_i : ', v_i(ji,jj,jl)
518                     internal_melt(ji,jj,jl) = .true.
519                 ENDIF
520              END DO ! ji
521           END DO ! jj
522        END DO !jk
523     END DO !jl
524
525     DO jl = 1, jpl
526        DO jj = 1, jpj 
527           DO ji = 1, jpi
528              IF ( internal_melt(ji,jj,jl) ) THEN
529              ! initial ice thickness
530              !-----------------------
531              ht_i(ji,jj,jl) = v_i(ji,jj,jl) / a_i(ji,jj,jl)
532!             WRITE(numout,*) ' ji,jj,jl : ', ji,jj,jl
533!             WRITE(numout,*) ' old ht_i: ', ht_i(ji,jj,jl)
534!             WRITE(numout,*) ' Enthalpy at the beg : ', e_i(ji,jj,1:nlay_i,jl)
535!             WRITE(numout,*) ' smv_i   : ', smv_i(ji,jj,jl)
536
537              ! reduce ice thickness
538              !-----------------------
539              ind_im = 0
540              zesum = 0.0
541              DO jk = 1, nlay_i
542                 ztmelts = - tmut * s_i(ji,jj,jk,jl) + rtt
543                 IF ( ( e_i(ji,jj,jk,jl) .LE. 0.0 ) .OR.  & 
544                      ( t_i(ji,jj,jk,jl) .GE. ztmelts ) ) &
545                    ind_im = ind_im + 1
546                 zesum = zesum + e_i(ji,jj,jk,jl)
547              END DO
548              IF (ind_im .LT.nlay_i ) smv_i(ji,jj,jl)= smv_i(ji,jj,jl) / ht_i(ji,jj,jl) * & 
549                             ( ht_i(ji,jj,jl) - ind_im*ht_i(ji,jj,jl) / nlay_i )
550              ht_i(ji,jj,jl) = ht_i(ji,jj,jl) - ind_im*ht_i(ji,jj,jl) / nlay_i
551              v_i(ji,jj,jl)  = ht_i(ji,jj,jl) * a_i(ji,jj,jl)
552
553!             WRITE(numout,*) ' ind_im  : ', ind_im
554!             WRITE(numout,*) ' new ht_i: ', ht_i(ji,jj,jl)
555!             WRITE(numout,*) ' smv_i   : ', smv_i(ji,jj,jl)
556!             WRITE(numout,*) ' zesum   : ', zesum
557
558              ! redistribute heat
559              !-----------------------
560              ! old thicknesses and enthalpies
561              ind_im = 0
562              DO jk = 1, nlay_i
563                 ztmelts = - tmut * s_i(ji,jj,jk,jl) + rtt
564                 IF ( ( e_i(ji,jj,jk,jl) .GT. 0.0 ) .AND.  & 
565                      ( t_i(ji,jj,jk,jl) .LT. ztmelts ) ) THEN
566                    ind_im = ind_im + 1
567                    zthick0(ind_im) = ht_i(ji,jj,jl) * ind_im / nlay_i
568                    zqm0   (ind_im) = MAX( e_i(ji,jj,jk,jl) , 0.0 )
569                 ENDIF
570              END DO
571
572!             WRITE(numout,*) ' Old thickness, enthalpy '
573!             WRITE(numout,*) ' Number of layer : ind_im ', ind_im
574!             WRITE(numout,*) ' zthick0 : ', zthick0(1:ind_im)
575!             WRITE(numout,*) ' zqm0    : ', zqm0(1:ind_im)
576
577              ! Redistributing energy on the new grid
578              IF ( ind_im .GT. 0 ) THEN
579
580              DO jk = 1, nlay_i
581                 e_i(ji,jj,jk,jl) = 0.0
582                 DO layer = 1, ind_im
583                    zweight         = MAX (  &
584                 MIN( ht_i(ji,jj,jl) * layer / ind_im , ht_i(ji,jj,jl) * jk / nlay_i ) -       &
585                 MAX( ht_i(ji,jj,jl) * (layer-1) / ind_im , ht_i(ji,jj,jl) * (jk-1) / nlay_i ) , 0.0 ) &
586                                 /  ( ht_i(ji,jj,jl) / ind_im )
587
588                    e_i(ji,jj,jk,jl) =  e_i(ji,jj,jk,jl) + zweight*zqm0(layer)
589                 END DO !layer
590              END DO ! jk
591
592              zesum = 0.0
593              DO jk = 1, nlay_i
594                 zesum = zesum + e_i(ji,jj,jk,jl)
595              END DO
596
597!             WRITE(numout,*) ' Enthalpy at the end : ', e_i(ji,jj,1:nlay_i,jl)
598!             WRITE(numout,*) ' Volume   at the end : ', v_i(ji,jj,jl)
599!             WRITE(numout,*) ' zesum : ', zesum
600
601              ELSE ! ind_im .EQ. 0, total melt
602                 e_i(ji,jj,jk,jl) = 0.0
603              ENDIF
604
605              ENDIF ! internal_melt
606
607           END DO ! ji
608        END DO !jj
609     END DO !jl
610!+++++ [
611        WRITE(numout,*) ' 2.3 after melt of an internal ice layer '
612        WRITE(numout,*) ' a_i : ', a_i(jiindx, jjindx, 1:jpl)
613        WRITE(numout,*) ' at_i: ', at_i(jiindx,jjindx)
614        WRITE(numout,*) ' v_i : ', v_i(jiindx, jjindx, 1:jpl)
615        WRITE(numout,*) ' smv_i: ', smv_i(jiindx, jjindx, 1:jpl)
616        DO jk = 1, nlay_i
617        WRITE(numout,*) ' e_i : ', e_i(jiindx, jjindx, jk, 1:jpl)
618        WRITE(numout,*) ' t_i : ', t_i(jiindx, jjindx, jk, 1:jpl)
619        END DO
620        WRITE(numout,*) ' v_s : ', v_s(jiindx, jjindx, 1:jpl)
621!+++++ ]
622
623     internal_melt(:,:,:) = .false.
624
625     ! Melt of snow
626     !--------------
627     DO jl = 1, jpl
628        DO jj = 1, jpj 
629           DO ji = 1, jpi
630              ! snow energy of melting
631              ze_s = e_s(ji,jj,1,jl) * unit_fac / area(ji,jj) /              &
632              MAX( v_s(ji,jj,jl), 1.0e-6 )  ! snow energy of melting
633
634              ! If snow energy of melting smaller then Lf
635              ! Then all snow melts and meltwater, heat go to the ocean
636              IF ( ze_s .LE. rhosn * lfus ) internal_melt(ji,jj,jl) = .true.
637
638              !++++++
639              IF ( (ji.eq.jiindx) .AND. (jj.eq.jjindx) ) THEN
640                 WRITE(numout,*) ' jl    : ', jl
641                 WRITE(numout,*) ' ze_s  : ', ze_s
642                 WRITE(numout,*) ' v_s   : ', v_s(ji,jj,jl)
643                 WRITE(numout,*) ' rhosn : ', rhosn
644                 WRITE(numout,*) ' rhosn : ', lfus 
645                 WRITE(numout,*) ' area  : ', area(ji,jj)
646                 WRITE(numout,*) ' rhosn * lfus : ', rhosn * lfus 
647                 WRITE(numout,*) ' internal_melt : ', internal_melt(ji,jj,jl)
648              ENDIF
649              !++++++
650
651           END DO
652        END DO
653     END DO
654
655     DO jl = 1, jpl
656        DO jj = 1, jpj 
657           DO ji = 1, jpi
658              IF ( internal_melt(ji,jj,jl) ) THEN
659                  v_s(ji,jj,jl)   = 0.0
660                  e_s(ji,jj,1,jl) = 0.0
661              !   ! release heat
662                  fheat_res(ji,jj) = fheat_res(ji,jj)  &
663                                  + ze_s * v_s(ji,jj,jl) / rdt_ice
664                  ! release mass
665                  rdmsnif(ji,jj) =  rdmsnif(ji,jj) + rhosn * v_s(ji,jj,jl)
666              ENDIF
667           END DO
668        END DO
669     END DO
670
671     zbigvalue      = 1.0d+20
672
673     DO jl = 1, jpl
674        DO jj = 1, jpj 
675           DO ji = 1, jpi
676
677           !switches
678              zindb         = MAX( rzero, SIGN( rone, a_i(ji,jj,jl) - epsi06 ) ) 
679                            !switch = 1 if a_i > 1e-06 and 0 if not
680              zindsn        = MAX( rzero, SIGN( rone, v_s(ji,jj,jl) - epsi06 ) ) !=1 if hs > 1e-6 and 0 if not
681              zindic        = MAX( rzero, SIGN( rone, v_i(ji,jj,jl) - epsi04 ) ) !=1 if hi > 1e-3 and 0 if not
682              ! bug fix 25 avril 2007
683              zindb         = zindb*zindic
684
685           !--- 2.3 Correction to ice age
686           !------------------------------
687!                IF ((o_i(ji,jj,jl)-1.0)*86400.0.gt.(rdt_ice*float(numit))) THEN
688!                   o_i(ji,jj,jl) = rdt_ice*FLOAT(numit)/86400.0
689!                ENDIF
690                 IF ((oa_i(ji,jj,jl)-1.0)*86400.0.gt.(rdt_ice*numit*a_i(ji,jj,jl))) THEN
691                    oa_i(ji,jj,jl) = rdt_ice*numit/86400.0*a_i(ji,jj,jl)
692                 ENDIF
693                 oa_i(ji,jj,jl) = zindb*zindic*oa_i(ji,jj,jl)
694
695           !--- 2.4 Correction to snow thickness
696           !-------------------------------------
697!          ! snow thickness has to be greater than 0, and if ice concentration smaller than 1e-6 then hs = 0
698!             v_s(ji,jj,jl)  = MAX( zindb * v_s(ji,jj,jl), 0.0)
699           ! snow thickness cannot be smaller than 1e-6
700              v_s(ji,jj,jl)  = zindsn*v_s(ji,jj,jl)*zindb
701              v_s(ji,jj,jl)  = v_s(ji,jj,jl) *  MAX( 0.0 , SIGN( 1.0 , v_s(ji,jj,jl) - epsi06 ) )
702
703           !--- 2.5 Correction to ice thickness
704           !-------------------------------------
705           ! ice thickness has to be greater than 0, and if ice concentration smaller than 1e-6 then hi = 0
706              v_i(ji,jj,jl) = MAX( zindb * v_i(ji,jj,jl), 0.0)
707           ! ice thickness cannot be smaller than 1e-3
708              v_i(ji,jj,jl)  = zindic*v_i(ji,jj,jl)
709
710           !--- 2.6 Snow is transformed into ice if the original ice cover disappears
711           !----------------------------------------------------------------------------
712             zindg          = tms(ji,jj) *  MAX( rzero , SIGN( rone , -v_i(ji,jj,jl) ) )
713             v_i(ji,jj,jl)  = v_i(ji,jj,jl) + zindg * rhosn * v_s(ji,jj,jl) / rau0
714             v_s(ji,jj,jl)  = ( rone - zindg ) * v_s(ji,jj,jl) + & 
715                              zindg * v_i(ji,jj,jl) * ( rau0 - rhoic ) / rhosn
716
717           !--- 2.7 Correction to ice concentrations
718           !--------------------------------------------
719           ! if greater than 0, ice concentration cannot be smaller than 1e-10
720              a_i(ji,jj,jl) = zindb * MAX(zindsn, zindic) * MAX( a_i(ji,jj,jl), epsi06 )
721           ! then ice volume has to be corrected too...
722           ! instead, zap small areas
723
724           !-------------------------
725           ! 2.8) Snow heat content
726           !-------------------------
727
728              e_s(ji,jj,1,jl) = zindsn *                                &
729                 ( MIN ( MAX ( 0.0, e_s(ji,jj,1,jl) ), zbigvalue ) ) + &
730                 ( 1.0 - zindsn ) * 0.0
731
732           END DO ! ji
733        END DO ! jj
734     END DO ! jl
735
736!+++++ [
737        WRITE(numout,*) ' 2.8 '
738        WRITE(numout,*) ' a_i : ', a_i(jiindx, jjindx, 1:jpl)
739        WRITE(numout,*) ' at_i: ', at_i(jiindx,jjindx)
740        WRITE(numout,*) ' v_i : ', v_i(jiindx, jjindx, 1:jpl)
741        WRITE(numout,*) ' smv_i: ', smv_i(jiindx, jjindx, 1:jpl)
742        DO jk = 1, nlay_i
743        WRITE(numout,*) ' e_i : ', e_i(jiindx, jjindx, jk, 1:jpl)
744        END DO
745        WRITE(numout,*) ' v_s : ', v_s(jiindx, jjindx, 1:jpl)
746!+++++ ]
747
748     !------------------------
749     ! 2.9) Ice heat content
750     !------------------------
751
752     DO jl = 1, jpl
753        DO jk = 1, nlay_i
754           DO jj = 1, jpj 
755              DO ji = 1, jpi
756                 zindic        = MAX( rzero, SIGN( rone, v_i(ji,jj,jl) - epsi06 ) ) 
757                               ! =1 if v_i > 1e-6 and 0 if not
758                 e_i(ji,jj,jk,jl)= zindic * & 
759                    ( MIN ( MAX ( 0.0, e_i(ji,jj,jk,jl) ), zbigvalue ) ) + &
760                    ( 1.0 - zindic ) * 0.0
761              END DO ! ji
762           END DO ! jj
763        END DO !jk
764     END DO !jl
765       
766     WRITE(numout,*) ' 2.9 '
767     DO jk = 1, nlay_i
768        WRITE(numout,*) ' e_i : ', e_i(jiindx, jjindx, jk, 1:jpl)
769     END DO
770        WRITE(numout,*) ' v_s : ', v_s(jiindx, jjindx, 1:jpl)
771
772        WRITE(numout,*) ' v_s : ', v_s(jiindx, jjindx, 1:jpl)
773
774     !---------------------
775     ! 2.11) Ice salinity
776     !---------------------
777
778     IF ( ( num_sal .EQ. 2 ) .OR. ( num_sal .EQ. 4 ) ) THEN ! general case
779
780     DO jl = 1, jpl
781        DO jk = 1, nlay_i
782           DO jj = 1, jpj 
783              DO ji = 1, jpi
784                 ! salinity stays in bounds
785                 smv_i(ji,jj,jl)  =  MAX(MIN((rhoic-rhosn)/rhoic*sss_m(ji,jj),smv_i(ji,jj,jl)), &
786                  0.1 * v_i(ji,jj,jl) )
787                 i_ice_switch    =  1.0-MAX(0.0,SIGN(1.0,-v_i(ji,jj,jl)))
788                 smv_i(ji,jj,jl)  = i_ice_switch*smv_i(ji,jj,jl) + &
789                                     0.1*(1.0-i_ice_switch)*v_i(ji,jj,jl)
790              END DO ! ji
791           END DO ! jj
792        END DO !jk
793     END DO !jl
794
795     ENDIF
796
797!+++++ [
798        WRITE(numout,*) ' 2.11 '
799        WRITE(numout,*) ' a_i : ', a_i(jiindx, jjindx, 1:jpl)
800        WRITE(numout,*) ' v_i : ', v_i(jiindx, jjindx, 1:jpl)
801        WRITE(numout,*) ' v_s : ', v_s(jiindx, jjindx, 1:jpl)
802        WRITE(numout,*) ' at_i    ', at_i(jiindx,jjindx)
803        WRITE(numout,*) ' smv_i: ', smv_i(jiindx, jjindx, 1:jpl)
804!+++++ ]
805
806     DO jm = 1, jpm
807        DO jj = 1, jpj 
808           DO ji = 1, jpi
809              jl = ice_cat_bounds(jm,1)
810              !--- 2.12 Constrain the thickness of the smallest category above 5 cm
811              !----------------------------------------------------------------------
812              ! the ice thickness of the smallest category should be higher than 5 cm
813              ! we changed hiclim to 10
814              zindb         = MAX( rzero, SIGN( rone, a_i(ji,jj,jl) - epsi06 ) ) 
815              ht_i(ji,jj,jl) = zindb*v_i(ji,jj,jl)/MAX(a_i(ji,jj,jl), epsi06)
816              zh            = MAX( rone , zindb * hiclim  / MAX( ht_i(ji,jj,jl) , epsi20 ) )
817              ht_s(ji,jj,jl) = ht_s(ji,jj,jl)* zh
818!             v_s(ji,jj,jl)  = v_s(ji,jj,jl) * zh
819              ht_i(ji,jj,jl) = ht_i(ji,jj,jl)* zh
820!             v_i(ji,jj,jl)  = v_i(ji,jj,jl) * zh
821              a_i (ji,jj,jl) = a_i(ji,jj,jl) /zh
822           END DO !ji
823        END DO !jj
824     END DO !jm
825!+++++ [
826        WRITE(numout,*) ' 2.12 '
827        WRITE(numout,*) ' a_i : ', a_i(jiindx, jjindx, 1:jpl)
828        WRITE(numout,*) ' v_i : ', v_i(jiindx, jjindx, 1:jpl)
829        WRITE(numout,*) ' v_s : ', v_s(jiindx, jjindx, 1:jpl)
830        WRITE(numout,*) ' at_i    ', at_i(jiindx,jjindx)
831        WRITE(numout,*) ' smv_i: ', smv_i(jiindx, jjindx, 1:jpl)
832!+++++ ]
833
834     !--- 2.13 Total ice concentration should not exceed 1
835     !-----------------------------------------------------
836     zamax = amax
837     ! 2.13.1) individual concentrations cannot exceed zamax
838     !------------------------------------------------------
839
840     at_i(:,:) = 0.0
841     DO jl = 1, jpl
842        at_i(:,:) = a_i(:,:,jl) + at_i(:,:)
843     END DO
844
845     ! 2.13.2) Total ice concentration cannot exceed zamax
846     !----------------------------------------------------
847     at_i(:,:) = 0.0
848     DO jl = 1, jpl
849        at_i(:,:) = a_i(:,:,jl) + at_i(:,:)
850     END DO
851
852     DO jj = 1, jpj
853        DO ji = 1, jpi
854           
855           ! 0) Excessive area ?
856           z_da_ex =  MAX( at_i(ji,jj) - zamax , 0.0 )       
857
858           ! 1) Count the number of existing categories
859           DO jl  = 1, jpl
860              zindb   =  MAX( rzero, SIGN( rone, v_i(ji,jj,jl) - epsi03 ) ) 
861              zindb   =  MAX( rzero, SIGN( rone, v_i(ji,jj,jl) ) ) 
862              z_da_i(jl) = a_i(ji,jj,jl)*zindb*z_da_ex/MAX(at_i(ji,jj),epsi06)
863              z_dv_i(jl) = v_i(ji,jj,jl)*z_da_i(jl)/MAX(at_i(ji,jj),epsi06)
864              a_i(ji,jj,jl) = a_i(ji,jj,jl) - z_da_i(jl)
865              v_i(ji,jj,jl) = v_i(ji,jj,jl) + z_dv_i(jl)
866
867           END DO
868               
869        END DO !ji
870     END DO !jj
871
872!+++++ [
873        WRITE(numout,*) ' 2.13 '
874        WRITE(numout,*) ' a_i : ', a_i(jiindx, jjindx, 1:jpl)
875        WRITE(numout,*) ' at_i    ', at_i(jiindx,jjindx)
876        WRITE(numout,*) ' v_i : ', v_i(jiindx, jjindx, 1:jpl)
877        WRITE(numout,*) ' v_s : ', v_s(jiindx, jjindx, 1:jpl)
878        WRITE(numout,*) ' smv_i: ', smv_i(jiindx, jjindx, 1:jpl)
879!+++++ ]
880
881     at_i(:,:) = 0.0
882     DO jl = 1, jpl
883        at_i(:,:) = a_i(:,:,jl) + at_i(:,:)
884     END DO
885
886     DO jj = 1, jpj
887        DO ji = 1, jpi
888           IF (at_i(ji,jj).GT.1.0) THEN
889              WRITE(numout,*) ' lim_update ! : at_i > 1 -> PAS BIEN -> ALERTE '
890              WRITE(numout,*) ' ~~~~~~~~~~   at_i     ', at_i(ji,jj)
891              WRITE(numout,*) ' Point ', ji, jj
892              WRITE(numout,*) ' lat - long ', gphit(ji,jj), glamt(ji,jj)
893              DO jl = 1, jpl
894                 WRITE(numout,*) ' a_i ***         ', a_i(ji,jj,jl), ' CAT no ', jl
895                 WRITE(numout,*) ' a_i_old ***     ', old_a_i(ji,jj,jl), ' CAT no ', jl
896                 WRITE(numout,*) ' d_a_i_thd / trp ', d_a_i_thd(ji,jj,jl), d_a_i_trp(ji,jj,jl)
897              END DO
898!             WRITE(numout,*) ' CORRECTION BARBARE '
899!             z_da_ex =  MAX( at_i(ji,jj) - zamax , 0.0 )       
900           ENDIF
901        END DO
902     END DO
903
904     ! Final thickness distribution rebinning
905     ! --------------------------------------
906!+++++ [
907        WRITE(numout,*) ' rebinning before'
908        WRITE(numout,*) ' a_i : ', a_i(jiindx, jjindx, 1:jpl)
909        WRITE(numout,*) ' at_i    ', at_i(jiindx,jjindx)
910        WRITE(numout,*) ' v_i : ', v_i(jiindx, jjindx, 1:jpl)
911        WRITE(numout,*) ' v_s : ', v_s(jiindx, jjindx, 1:jpl)
912        WRITE(numout,*) ' smv_i: ', smv_i(jiindx, jjindx, 1:jpl)
913!+++++ ]
914!old version
915!    CALL lim_itd_th_reb(1,jpl)
916
917      DO jm = 1, jpm
918         jbnd1 = ice_cat_bounds(jm,1)
919         jbnd2 = ice_cat_bounds(jm,2)
920         IF (ice_ncat_types(jm) .GT. 1 ) CALL lim_itd_th_reb(jbnd1, jbnd2, jm)
921         IF (ice_ncat_types(jm) .EQ. 1 ) THEN
922         ENDIF
923      END DO
924!+++++ [
925        WRITE(numout,*) ' rebinning final'
926        WRITE(numout,*) ' a_i : ', a_i(jiindx, jjindx, 1:jpl)
927        WRITE(numout,*) ' at_i    ', at_i(jiindx,jjindx)
928        WRITE(numout,*) ' v_i : ', v_i(jiindx, jjindx, 1:jpl)
929        WRITE(numout,*) ' v_s : ', v_s(jiindx, jjindx, 1:jpl)
930        WRITE(numout,*) ' smv_i: ', smv_i(jiindx, jjindx, 1:jpl)
931!+++++ ]
932
933     at_i(:,:) = 0.0
934     DO jl = 1, jpl
935        at_i(:,:) = a_i(:,:,jl) + at_i(:,:)
936     END DO
937
938!------------------------------------------------------------------------------
939! 2) Corrections to avoid wrong values                                        |
940!------------------------------------------------------------------------------
941! Ice drift
942!------------
943
944      DO jj = 2, jpjm1
945         DO ji = fs_2, fs_jpim1
946            IF ( at_i(ji,jj) .EQ. 0.0 ) THEN ! what to do if there is no ice
947               IF ( at_i(ji+1,jj) .EQ. 0.0 ) u_ice(ji,jj)   = 0.0 ! right side
948               IF ( at_i(ji-1,jj) .EQ. 0.0 ) u_ice(ji-1,jj) = 0.0 ! left side
949               IF ( at_i(ji,jj+1) .EQ. 0.0 ) v_ice(ji,jj)   = 0.0 ! upper side
950               IF ( at_i(ji,jj-1) .EQ. 0.0 ) v_ice(ji-1,jj) = 0.0 ! bottom side
951            ENDIF
952         END DO
953      END DO
954      !mask velocities
955      u_ice(:,:) = u_ice(:,:) * tmu(:,:)
956      v_ice(:,:) = v_ice(:,:) * tmv(:,:)
957      !lateral boundary conditions
958      CALL lbc_lnk( u_ice(:,:), 'U', -1. )
959      CALL lbc_lnk( v_ice(:,:), 'V', -1. )
960
961!++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
962! ALERTES
963!++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
964
965     DO jj = 1, jpj
966        DO ji = 1, jpi
967              DO jl = 1, jpl
968!                IF ((v_i(ji,jj,jl).NE.0.0).AND.(a_i(ji,jj,jl).EQ.0.0)) THEN
969!                   WRITE(numout,*) ' lim_update : incompatible volume and concentration '
970              END DO ! jl
971
972           DO jl = 1, jpl
973              IF ( (a_i(ji,jj,jl).GT.1.0).OR.(at_i(ji,jj).GT.1.0) ) THEN
974                 zindb          =  MAX( rzero, SIGN( rone, a_i(ji,jj,jl) - epsi06 ) ) 
975                 WRITE(numout,*) ' lim_update : a_i > 1 '
976                 WRITE(numout,*) ' PAS BIEN ----> ALERTE !!! '
977                 WRITE(numout,*) ' ~~~~~~~~~~   at_i     ', at_i(ji,jj)
978                 WRITE(numout,*) ' Point - category', ji, jj, jl
979                 WRITE(numout,*) ' lat - long ', gphit(ji,jj), glamt(ji,jj)
980                 WRITE(numout,*) ' a_i *** a_i_old ', a_i(ji,jj,jl), old_a_i(ji,jj,jl)
981                 WRITE(numout,*) ' v_i *** v_i_old ', v_i(ji,jj,jl), old_v_i(ji,jj,jl)
982                 WRITE(numout,*) ' ht_i ***        ', v_i(ji,jj,jl)/MAX(a_i(ji,jj,jl),epsi06)*zindb 
983                 WRITE(numout,*) ' hi_max(jl), hi_max(jl-1) ', hi_max(jl), hi_max(jl-1)
984                 WRITE(numout,*) ' d_v_i_thd / trp ', d_v_i_thd(ji,jj,jl), d_v_i_trp(ji,jj,jl)
985                 WRITE(numout,*) ' d_a_i_thd / trp ', d_a_i_thd(ji,jj,jl), d_a_i_trp(ji,jj,jl)
986              ENDIF
987           END DO
988
989        END DO !jj
990     END DO !ji
991
992     WRITE(numout,*) ' TESTOSC1 ', tio_u(jiindx,jjindx), tio_v(jiindx,jjindx)
993     WRITE(numout,*) ' TESTOSC2 ', u_ice(jiindx,jjindx), v_ice(jiindx,jjindx)
994     WRITE(numout,*) ' TESTOSC3 ', u_oce(jiindx,jjindx), v_oce(jiindx,jjindx)
995     WRITE(numout,*) ' TESTOSC4 ', utau (jiindx,jjindx), vtau (jiindx,jjindx)
996
997
998      IF(ln_ctl) THEN   ! Control print
999         CALL prt_ctl_info(' ')
1000         CALL prt_ctl_info(' - Cell values : ')
1001         CALL prt_ctl_info('   ~~~~~~~~~~~~~ ')
1002         CALL prt_ctl(tab2d_1=area       , clinfo1=' lim_update  : cell area   :')
1003         CALL prt_ctl(tab2d_1=at_i       , clinfo1=' lim_update  : at_i        :')
1004         CALL prt_ctl(tab2d_1=vt_i       , clinfo1=' lim_update  : vt_i        :')
1005         CALL prt_ctl(tab2d_1=vt_s       , clinfo1=' lim_update  : vt_s        :')
1006         CALL prt_ctl(tab2d_1=strength   , clinfo1=' lim_update  : strength    :')
1007         CALL prt_ctl(tab2d_1=u_ice      , clinfo1=' lim_update  : u_ice       :', tab2d_2=v_ice      , clinfo2=' v_ice       :')
1008         CALL prt_ctl(tab2d_1=d_u_ice_dyn, clinfo1=' lim_update  : d_u_ice_dyn :', tab2d_2=d_v_ice_dyn, clinfo2=' d_v_ice_dyn :')
1009         CALL prt_ctl(tab2d_1=old_u_ice  , clinfo1=' lim_update  : old_u_ice   :', tab2d_2=old_v_ice  , clinfo2=' old_v_ice   :')
1010
1011         DO jl = 1, jpl
1012            CALL prt_ctl_info(' ')
1013            CALL prt_ctl_info(' - Category : ', ivar1=jl)
1014            CALL prt_ctl_info('   ~~~~~~~~~~')
1015            CALL prt_ctl(tab2d_1=ht_i       (:,:,jl)        , clinfo1= ' lim_update  : ht_i        : ')
1016            CALL prt_ctl(tab2d_1=ht_s       (:,:,jl)        , clinfo1= ' lim_update  : ht_s        : ')
1017            CALL prt_ctl(tab2d_1=t_su       (:,:,jl)        , clinfo1= ' lim_update  : t_su        : ')
1018            CALL prt_ctl(tab2d_1=t_s        (:,:,1,jl)      , clinfo1= ' lim_update  : t_snow      : ')
1019            CALL prt_ctl(tab2d_1=sm_i       (:,:,jl)        , clinfo1= ' lim_update  : sm_i        : ')
1020            CALL prt_ctl(tab2d_1=o_i        (:,:,jl)        , clinfo1= ' lim_update  : o_i         : ')
1021            CALL prt_ctl(tab2d_1=a_i        (:,:,jl)        , clinfo1= ' lim_update  : a_i         : ')
1022            CALL prt_ctl(tab2d_1=old_a_i    (:,:,jl)        , clinfo1= ' lim_update  : old_a_i     : ')
1023            CALL prt_ctl(tab2d_1=d_a_i_trp  (:,:,jl)        , clinfo1= ' lim_update  : d_a_i_trp   : ')
1024            CALL prt_ctl(tab2d_1=d_a_i_thd  (:,:,jl)        , clinfo1= ' lim_update  : d_a_i_thd   : ')
1025            CALL prt_ctl(tab2d_1=v_i        (:,:,jl)        , clinfo1= ' lim_update  : v_i         : ')
1026            CALL prt_ctl(tab2d_1=old_v_i    (:,:,jl)        , clinfo1= ' lim_update  : old_v_i     : ')
1027            CALL prt_ctl(tab2d_1=d_v_i_trp  (:,:,jl)        , clinfo1= ' lim_update  : d_v_i_trp   : ')
1028            CALL prt_ctl(tab2d_1=d_v_i_thd  (:,:,jl)        , clinfo1= ' lim_update  : d_v_i_thd   : ')
1029            CALL prt_ctl(tab2d_1=v_s        (:,:,jl)        , clinfo1= ' lim_update  : v_s         : ')
1030            CALL prt_ctl(tab2d_1=old_v_s    (:,:,jl)        , clinfo1= ' lim_update  : old_v_s     : ')
1031            CALL prt_ctl(tab2d_1=d_v_s_trp  (:,:,jl)        , clinfo1= ' lim_update  : d_v_s_trp   : ')
1032            CALL prt_ctl(tab2d_1=d_v_s_thd  (:,:,jl)        , clinfo1= ' lim_update  : d_v_s_thd   : ')
1033            CALL prt_ctl(tab2d_1=e_i        (:,:,1,jl)/1.0e9, clinfo1= ' lim_update  : e_i1        : ')
1034            CALL prt_ctl(tab2d_1=old_e_i    (:,:,1,jl)/1.0e9, clinfo1= ' lim_update  : old_e_i1    : ')
1035            CALL prt_ctl(tab2d_1=d_e_i_trp  (:,:,1,jl)/1.0e9, clinfo1= ' lim_update  : de_i1_trp   : ')
1036            CALL prt_ctl(tab2d_1=d_e_i_thd  (:,:,1,jl)/1.0e9, clinfo1= ' lim_update  : de_i1_thd   : ')
1037            CALL prt_ctl(tab2d_1=e_i        (:,:,2,jl)/1.0e9, clinfo1= ' lim_update  : e_i2        : ')
1038            CALL prt_ctl(tab2d_1=old_e_i    (:,:,2,jl)/1.0e9, clinfo1= ' lim_update  : old_e_i2    : ')
1039            CALL prt_ctl(tab2d_1=d_e_i_trp  (:,:,2,jl)/1.0e9, clinfo1= ' lim_update  : de_i2_trp   : ')
1040            CALL prt_ctl(tab2d_1=d_e_i_thd  (:,:,2,jl)/1.0e9, clinfo1= ' lim_update  : de_i2_thd   : ')
1041            CALL prt_ctl(tab2d_1=e_s        (:,:,1,jl)      , clinfo1= ' lim_update  : e_snow      : ')
1042            CALL prt_ctl(tab2d_1=old_e_s    (:,:,1,jl)      , clinfo1= ' lim_update  : old_e_snow  : ')
1043            CALL prt_ctl(tab2d_1=d_e_s_trp  (:,:,1,jl)/1.0e9, clinfo1= ' lim_update  : d_e_s_trp   : ')
1044            CALL prt_ctl(tab2d_1=d_e_s_thd  (:,:,1,jl)/1.0e9, clinfo1= ' lim_update  : d_e_s_thd   : ')
1045            CALL prt_ctl(tab2d_1=smv_i      (:,:,jl)        , clinfo1= ' lim_update  : smv_i       : ')
1046            CALL prt_ctl(tab2d_1=old_smv_i  (:,:,jl)        , clinfo1= ' lim_update  : old_smv_i   : ')
1047            CALL prt_ctl(tab2d_1=d_smv_i_trp(:,:,jl)        , clinfo1= ' lim_update  : d_smv_i_trp : ')
1048            CALL prt_ctl(tab2d_1=d_smv_i_thd(:,:,jl)        , clinfo1= ' lim_update  : d_smv_i_thd : ')
1049            CALL prt_ctl(tab2d_1=oa_i       (:,:,jl)        , clinfo1= ' lim_update  : oa_i        : ')
1050            CALL prt_ctl(tab2d_1=old_oa_i   (:,:,jl)        , clinfo1= ' lim_update  : old_oa_i    : ')
1051            CALL prt_ctl(tab2d_1=d_oa_i_trp (:,:,jl)        , clinfo1= ' lim_update  : d_oa_i_trp  : ')
1052            CALL prt_ctl(tab2d_1=d_oa_i_thd (:,:,jl)        , clinfo1= ' lim_update  : d_oa_i_thd  : ')
1053            CALL prt_ctl(tab2d_1=REAL(patho_case(:,:,jl))   , clinfo1= ' lim_update  : Path. case  : ')
1054
1055            DO jk = 1, nlay_i
1056               CALL prt_ctl_info(' - Layer : ', ivar1=jk)
1057               CALL prt_ctl(tab2d_1=t_i(:,:,jk,jl) , clinfo1= ' lim_update  : t_i       : ')
1058            END DO
1059         END DO
1060
1061         CALL prt_ctl_info(' ')
1062         CALL prt_ctl_info(' - Heat / FW fluxes : ')
1063         CALL prt_ctl_info('   ~~~~~~~~~~~~~~~~~~ ')
1064         CALL prt_ctl(tab2d_1=fmmec  , clinfo1= ' lim_update : fmmec : ', tab2d_2=fhmec     , clinfo2= ' fhmec     : ')
1065         CALL prt_ctl(tab2d_1=sst_m  , clinfo1= ' lim_update : sst   : ', tab2d_2=sss_m     , clinfo2= ' sss       : ')
1066         CALL prt_ctl(tab2d_1=fhbri  , clinfo1= ' lim_update : fhbri : ', tab2d_2=fheat_rpo , clinfo2= ' fheat_rpo : ')
1067
1068         CALL prt_ctl_info(' ')
1069         CALL prt_ctl_info(' - Stresses : ')
1070         CALL prt_ctl_info('   ~~~~~~~~~~ ')
1071         CALL prt_ctl(tab2d_1=utau       , clinfo1= ' lim_update : utau      : ', tab2d_2=vtau       , clinfo2= ' vtau      : ')
1072         CALL prt_ctl(tab2d_1=utaui_ice  , clinfo1= ' lim_update : utaui_ice : ', tab2d_2=vtaui_ice  , clinfo2= ' vtaui_ice : ')
1073         CALL prt_ctl(tab2d_1=u_oce      , clinfo1= ' lim_update : u_oce     : ', tab2d_2=v_oce      , clinfo2= ' v_oce     : ')
1074      ENDIF
1075
1076     !---------------------
1077
1078   END SUBROUTINE lim_update
1079#else
1080   !!----------------------------------------------------------------------
1081   !!   Default option         Empty Module               No sea-ice model
1082   !!----------------------------------------------------------------------
1083CONTAINS
1084   SUBROUTINE lim_update     ! Empty routine
1085   END SUBROUTINE lim_update
1086
1087#endif
1088
1089END MODULE limupdate
Note: See TracBrowser for help on using the repository browser.