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.
icethd_dh.F90 in NEMO/branches/UKMO/NEMO_4.0_add_pond_lids_prints/src/ICE – NEMO

source: NEMO/branches/UKMO/NEMO_4.0_add_pond_lids_prints/src/ICE/icethd_dh.F90 @ 12449

Last change on this file since 12449 was 12449, checked in by dancopsey, 4 years ago
  • Snow into meltponds contributes to snow to ice diagnostics affecting thickness and salinity of the ice.
  • Avoid divide by zero errors by:
    • Removing meltponds from small ice areas.
    • Removing divide by pond fractions apart from lid shrinking there a minimum pond fraction is imnposed
  • Ponds leaking into the ocean have a salinity flux to the ocean (also a new diagnostic).
  • Add vertical fluxing of pond water.
File size: 40.7 KB
Line 
1MODULE icethd_dh
2   !!======================================================================
3   !!                       ***  MODULE icethd_dh ***
4   !!   seaice : thermodynamic growth and melt
5   !!======================================================================
6   !! History :       !  2003-05  (M. Vancoppenolle) Original code in 1D
7   !!                 !  2005-06  (M. Vancoppenolle) 3D version
8   !!            4.0  !  2018     (many people)      SI3 [aka Sea Ice cube]
9   !!----------------------------------------------------------------------
10#if defined key_si3
11   !!----------------------------------------------------------------------
12   !!   'key_si3'                                       SI3 sea-ice model
13   !!----------------------------------------------------------------------
14   !!   ice_thd_dh        : vertical sea-ice growth and melt
15   !!   ice_thd_snwblow   : distribute snow fall between ice and ocean
16  !!----------------------------------------------------------------------
17   USE dom_oce        ! ocean space and time domain
18   USE phycst         ! physical constants
19   USE ice            ! sea-ice: variables
20   USE ice1D          ! sea-ice: thermodynamics variables
21   USE icethd_sal     ! sea-ice: salinity profiles
22   !
23   USE in_out_manager ! I/O manager
24   USE lib_mpp        ! MPP library
25   USE lib_fortran    ! fortran utilities (glob_sum + no signed zero)
26   USE icethd_pnd, ONLY : a_pnd_avail
27   
28   IMPLICIT NONE
29   PRIVATE
30
31   PUBLIC   ice_thd_dh        ! called by ice_thd
32   PUBLIC   ice_thd_snwblow   ! called in sbcblk/sbccpl and here
33
34   INTERFACE ice_thd_snwblow
35      MODULE PROCEDURE ice_thd_snwblow_1d, ice_thd_snwblow_2d
36   END INTERFACE
37
38   !!----------------------------------------------------------------------
39   !! NEMO/ICE 4.0 , NEMO Consortium (2018)
40   !! $Id$
41   !! Software governed by the CeCILL license (see ./LICENSE)
42   !!----------------------------------------------------------------------
43CONTAINS
44
45   SUBROUTINE ice_thd_dh
46      !!------------------------------------------------------------------
47      !!                ***  ROUTINE ice_thd_dh  ***
48      !!
49      !! ** Purpose :   compute ice and snow thickness changes due to growth/melting
50      !!
51      !! ** Method  :   Ice/Snow surface melting arises from imbalance in surface fluxes
52      !!                Bottom accretion/ablation arises from flux budget
53      !!                Snow thickness can increase by precipitation and decrease by sublimation
54      !!                If snow load excesses Archmiede limit, snow-ice is formed by
55      !!                the flooding of sea-water in the snow
56      !!
57      !!                - Compute available flux of heat for surface ablation
58      !!                - Compute snow and sea ice enthalpies
59      !!                - Surface ablation and sublimation
60      !!                - Bottom accretion/ablation
61      !!                - Snow ice formation
62      !!
63      !! References : Bitz and Lipscomb, 1999, J. Geophys. Res.
64      !!              Fichefet T. and M. Maqueda 1997, J. Geophys. Res., 102(C6), 12609-12646   
65      !!              Vancoppenolle, Fichefet and Bitz, 2005, Geophys. Res. Let.
66      !!              Vancoppenolle et al.,2009, Ocean Modelling
67      !!------------------------------------------------------------------
68      INTEGER  ::   ji, jk       ! dummy loop indices
69      INTEGER  ::   iter         ! local integer
70
71      REAL(wp) ::   ztmelts      ! local scalar
72      REAL(wp) ::   zdum       
73      REAL(wp) ::   zfracs       ! fractionation coefficient for bottom salt entrapment
74      REAL(wp) ::   zswi1        ! switch for computation of bottom salinity
75      REAL(wp) ::   zswi12       ! switch for computation of bottom salinity
76      REAL(wp) ::   zswi2        ! switch for computation of bottom salinity
77      REAL(wp) ::   zgrr         ! bottom growth rate
78      REAL(wp) ::   zt_i_new     ! bottom formation temperature
79      REAL(wp) ::   z1_rho       ! 1/(rhos+rau0-rhoi)
80
81      REAL(wp) ::   zQm          ! enthalpy exchanged with the ocean (J/m2), >0 towards the ocean
82      REAL(wp) ::   zEi          ! specific enthalpy of sea ice (J/kg)
83      REAL(wp) ::   zEw          ! specific enthalpy of exchanged water (J/kg)
84      REAL(wp) ::   zdE          ! specific enthalpy difference (J/kg)
85      REAL(wp) ::   zfmdt        ! exchange mass flux x time step (J/m2), >0 towards the ocean
86
87      REAL(wp), DIMENSION(jpij) ::   zqprec      ! energy of fallen snow                       (J.m-3)
88      REAL(wp), DIMENSION(jpij) ::   zq_top      ! heat for surface ablation                   (J.m-2)
89      REAL(wp), DIMENSION(jpij) ::   zq_bot      ! heat for bottom ablation                    (J.m-2)
90      REAL(wp), DIMENSION(jpij) ::   zq_rema     ! remaining heat at the end of the routine    (J.m-2)
91      REAL(wp), DIMENSION(jpij) ::   zf_tt       ! Heat budget to determine melting or freezing(W.m-2)
92      REAL(wp), DIMENSION(jpij) ::   zevap_rema  ! remaining mass flux from sublimation        (kg.m-2)
93
94      REAL(wp), DIMENSION(jpij) ::   zdh_s_mel   ! snow melt
95      REAL(wp), DIMENSION(jpij) ::   zdh_s_pre   ! snow precipitation
96      REAL(wp), DIMENSION(jpij) ::   zdh_s_sub   ! snow sublimation
97
98      REAL(wp), DIMENSION(jpij,nlay_s) ::   zh_s      ! snw layer thickness
99      REAL(wp), DIMENSION(jpij,nlay_i) ::   zh_i      ! ice layer thickness
100      REAL(wp), DIMENSION(jpij,nlay_i) ::   zdeltah
101      REAL(wp), DIMENSION(jpij,nlay_i) ::   zdeltah_pnd  ! Change in thickness due to melting into ponds
102      INTEGER , DIMENSION(jpij,nlay_i) ::   icount    ! number of layers vanished by melting
103
104      REAL(wp), DIMENSION(jpij) ::   zsnw        ! distribution of snow after wind blowing
105
106      REAL(wp) ::   zswitch_sal
107
108      INTEGER  ::   num_iter_max      ! Heat conservation
109      !!------------------------------------------------------------------
110
111      ! Discriminate between time varying salinity and constant
112      SELECT CASE( nn_icesal )                  ! varying salinity or not
113         CASE( 1 , 3 )   ;   zswitch_sal = 0._wp   ! prescribed salinity profile
114         CASE( 2 )       ;   zswitch_sal = 1._wp   ! varying salinity profile
115      END SELECT
116
117      ! Initialise fraction of sea ice available for melt ponding
118      DO ji = 1, npti
119         a_pnd_avail_1d(ji) = a_pnd_avail * at_i_1d(ji)
120      END DO
121
122      ! initialize layer thicknesses and enthalpies
123      h_i_old (1:npti,0:nlay_i+1) = 0._wp
124      eh_i_old(1:npti,0:nlay_i+1) = 0._wp
125      DO jk = 1, nlay_i
126         DO ji = 1, npti
127            h_i_old (ji,jk) = h_i_1d(ji) * r1_nlay_i
128            eh_i_old(ji,jk) = e_i_1d(ji,jk) * h_i_old(ji,jk)
129         END DO
130      END DO
131      !
132      !                       ! ============================================== !
133      !                       ! Available heat for surface and bottom ablation !
134      !                       ! ============================================== !
135      !
136      IF( ln_cndflx .AND. .NOT.ln_cndemulate ) THEN
137         !
138         DO ji = 1, npti
139            zq_top(ji)     = MAX( 0._wp, qml_ice_1d(ji) * rdt_ice )
140
141            IF ( to_print(ji) == 10 ) THEN
142               write(numout,*)'loading flux: zq_top(ji), qml_ice_1d(ji) = ',zq_top(ji), ' ', qml_ice_1d(ji)
143            ENDIF
144         END DO
145         !
146      ELSE
147         !
148         DO ji = 1, npti
149            zdum           = qns_ice_1d(ji) + qsr_ice_1d(ji) - qtr_ice_top_1d(ji) - qcn_ice_top_1d(ji)
150            qml_ice_1d(ji) = zdum * MAX( 0._wp , SIGN( 1._wp, t_su_1d(ji) - rt0 ) )
151            zq_top(ji)     = MAX( 0._wp, qml_ice_1d(ji) * rdt_ice )
152
153            IF ( to_print(ji) == 10 ) THEN
154               write(numout,*)'icethd_dh: qns_ice_1d(ji), qsr_ice_1d(ji), qtr_ice_top_1d(ji), qcn_ice_top_1d(ji) = ',qns_ice_1d(ji), ' ', qsr_ice_1d(ji), ' ', qtr_ice_top_1d(ji), ' ', qcn_ice_top_1d(ji)
155               write(numout,*)'icethd_dh: zdum, t_su_1d(ji), qml_ice_1d(ji), zq_top(ji) = ',zdum, ' ', t_su_1d(ji), qml_ice_1d(ji), zq_top(ji)
156            ENDIF
157
158         END DO
159         !
160      ENDIF
161      !
162      DO ji = 1, npti
163         zf_tt(ji)         = qcn_ice_bot_1d(ji) + qsb_ice_bot_1d(ji) + fhld_1d(ji) 
164         zq_bot(ji)        = MAX( 0._wp, zf_tt(ji) * rdt_ice )
165         IF ( to_print(ji) == 1 ) THEN
166            write(numout,*)'icethd_dh: qcn_ice_bot_1d(ji), qsb_ice_bot_1d(ji) = ',qcn_ice_bot_1d(ji), qsb_ice_bot_1d(ji)
167            write(numout,*)'icethd_dh: fhld_1d(ji), zq_bot(ji) = ',fhld_1d(ji), ', ', zq_bot(ji)
168         ENDIF
169      END DO
170
171      ! Ice and snow layer thicknesses
172      !-------------------------------
173      DO jk = 1, nlay_i
174         DO ji = 1, npti
175            zh_i(ji,jk) = h_i_1d(ji) * r1_nlay_i
176         END DO
177      END DO
178
179      DO jk = 1, nlay_s
180         DO ji = 1, npti
181            zh_s(ji,jk) = h_s_1d(ji) * r1_nlay_s
182         END DO
183      END DO
184
185      !                       ! ============ !
186      !                       !     Snow     !
187      !                       ! ============ !
188      !
189      ! Internal melting
190      ! ----------------
191      ! IF snow temperature is above freezing point, THEN snow melts (should not happen but sometimes it does)
192      DO jk = 1, nlay_s
193         DO ji = 1, npti
194            IF( t_s_1d(ji,jk) > rt0 ) THEN
195               hfx_res_1d    (ji) = hfx_res_1d    (ji) + e_s_1d(ji,jk) * zh_s(ji,jk) * a_i_1d(ji) * r1_rdtice   ! heat flux to the ocean [W.m-2], < 0
196               wfx_snw_sum_1d(ji) = wfx_snw_sum_1d(ji) + rhos          * zh_s(ji,jk) * a_i_1d(ji) * r1_rdtice   ! mass flux
197               ! updates
198               dh_s_mlt(ji)    = dh_s_mlt(ji) - zh_s(ji,jk)
199               h_s_1d  (ji)    = h_s_1d(ji) - zh_s(ji,jk)
200               zh_s    (ji,jk) = 0._wp
201               e_s_1d  (ji,jk) = 0._wp
202               t_s_1d  (ji,jk) = rt0
203            END IF
204
205           IF (to_print(ji) == 10) THEN
206                write(numout,*)'icethd_dh 8: t_s_1d(ji,jk), e_s_1d(ji,jk) = ',t_s_1d(ji,jk), ' ', e_s_1d(ji,jk)
207            END IF
208         END DO
209      END DO
210
211      DO ji = 1, npti
212         IF (to_print(ji) == 10) THEN
213            write(numout,*)'icethd_dh internal_melting: wfx_snw_sum_1d(ji) = ',wfx_snw_sum_1d(ji)
214         END IF
215      END DO       
216
217      ! Snow precipitation
218      !-------------------
219      CALL ice_thd_snwblow( 1. - at_i_1d(1:npti), zsnw(1:npti) )   ! snow distribution over ice after wind blowing
220
221      zdeltah(1:npti,:) = 0._wp
222      DO ji = 1, npti
223         IF( sprecip_1d(ji) > 0._wp ) THEN
224            !
225            ! --- precipitation ---
226            zdh_s_pre (ji) = zsnw(ji) * sprecip_1d(ji) * rdt_ice * r1_rhos / at_i_1d(ji)   ! thickness change
227            zqprec    (ji) = - qprec_ice_1d(ji)                                             ! enthalpy of the precip (>0, J.m-3)
228            !
229            hfx_spr_1d(ji) = hfx_spr_1d(ji) + zdh_s_pre(ji) * a_i_1d(ji) * zqprec(ji)    * r1_rdtice   ! heat flux from snow precip (>0, W.m-2)
230            wfx_spr_1d(ji) = wfx_spr_1d(ji) - rhos          * a_i_1d(ji) * zdh_s_pre(ji) * r1_rdtice   ! mass flux, <0
231           
232            ! --- melt of falling snow ---
233            rswitch              = MAX( 0._wp , SIGN( 1._wp , zqprec(ji) - epsi20 ) )
234            zdeltah       (ji,1) = - rswitch * zq_top(ji) / MAX( zqprec(ji) , epsi20 )   ! thickness change
235            zdeltah       (ji,1) = MAX( - zdh_s_pre(ji), zdeltah(ji,1) )                 ! bound melting
236            hfx_snw_1d    (ji)   = hfx_snw_1d    (ji) - zdeltah(ji,1) * a_i_1d(ji) * zqprec(ji)    * r1_rdtice   ! heat used to melt snow (W.m-2, >0)
237            wfx_snw_sum_1d(ji)   = wfx_snw_sum_1d(ji) - rhos          * a_i_1d(ji) * zdeltah(ji,1) * r1_rdtice   ! snow melting only = water into the ocean (then without snow precip), >0
238           
239            ! updates available heat + precipitations after melting
240            dh_s_mlt (ji) = dh_s_mlt(ji) + zdeltah(ji,1)
241            zq_top   (ji) = MAX( 0._wp , zq_top (ji) + zdeltah(ji,1) * zqprec(ji) )     
242            zdh_s_pre(ji) = zdh_s_pre(ji) + zdeltah(ji,1)
243
244            IF ( to_print(ji) == 10 ) THEN
245               write(numout,*)'after precip: zq_top(ji), zdeltah(ji,1), zqprec(ji) = ',zq_top(ji), zdeltah(ji,1), zqprec(ji)
246            ENDIF
247           
248            ! update thickness
249            h_s_1d(ji) = MAX( 0._wp , h_s_1d(ji) + zdh_s_pre(ji) )
250            !
251         ELSE
252            !
253            zdh_s_pre(ji) = 0._wp
254            zqprec   (ji) = 0._wp
255            !
256         ENDIF
257
258         IF (to_print(ji) == 10) THEN
259            write(numout,*)'icethd_dh snow_precip: wfx_snw_sum_1d(ji) = ',wfx_snw_sum_1d(ji)
260         END IF
261
262      END DO
263
264      ! recalculate snow layers
265      DO jk = 1, nlay_s
266         DO ji = 1, npti
267            zh_s(ji,jk) = h_s_1d(ji) * r1_nlay_s
268         END DO
269      END DO
270
271      ! Snow melting
272      ! ------------
273      ! If heat still available (zq_top > 0), then melt more snow
274      zdeltah(1:npti,:) = 0._wp
275      zdh_s_mel(1:npti) = 0._wp
276      DO jk = 1, nlay_s
277         DO ji = 1, npti
278            IF( zh_s(ji,jk) > 0._wp .AND. zq_top(ji) > 0._wp ) THEN
279               !
280               rswitch          = MAX( 0._wp, SIGN( 1._wp, e_s_1d(ji,jk) - epsi20 ) )
281               zdeltah  (ji,jk) = - rswitch * zq_top(ji) / MAX( e_s_1d(ji,jk), epsi20 )   ! thickness change
282               zdeltah  (ji,jk) = MAX( zdeltah(ji,jk) , - zh_s(ji,jk) )                   ! bound melting
283               zdh_s_mel(ji)    = zdh_s_mel(ji) + zdeltah(ji,jk)
284               zdeltah_pnd(ji,jk) = zdeltah  (ji,jk) * a_pnd_avail_1d(ji)
285               
286               hfx_snw_1d(ji)     = hfx_snw_1d(ji)     - zdeltah(ji,jk) * a_i_1d(ji) * e_s_1d (ji,jk) * r1_rdtice   ! heat used to melt snow(W.m-2, >0)
287               wfx_snw_sum_1d(ji) = wfx_snw_sum_1d(ji) - rhos           * a_i_1d(ji) * (zdeltah(ji,jk) - zdeltah_pnd(ji,jk)) * r1_rdtice   ! snow melting only = water into the ocean (then without snow precip)
288               
289               ! updates available heat + thickness
290               dh_s_mlt(ji)    = dh_s_mlt(ji) + zdeltah(ji,jk)
291               dh_s_pnd(ji)    = dh_s_pnd(ji) + zdeltah_pnd(ji,jk)                ! Cumulate surface melt on areas contributing to melt ponds
292               zq_top  (ji)    = MAX( 0._wp , zq_top(ji) + zdeltah(ji,jk) * e_s_1d(ji,jk) )
293               h_s_1d  (ji)    = MAX( 0._wp , h_s_1d(ji) + zdeltah(ji,jk) )
294               zh_s    (ji,jk) = MAX( 0._wp , zh_s(ji,jk) + zdeltah(ji,jk) )
295
296               ! Snow melt trapped in ponds contrbutes to ice thickness and snow to ice conversion
297               h_i_1d  (ji)    = MAX( 0._wp , h_i_1d(ji) - zdeltah_pnd(ji,jk) * rhos * r1_rhoi ) 
298               wfx_sni_1d(ji)     = wfx_sni_1d(ji)     - a_i_1d(ji) * zdeltah_pnd(ji,jk) * rhos * r1_rdtice
299               wfx_snw_sni_1d(ji) = wfx_snw_sni_1d(ji) + a_i_1d(ji) * zdeltah_pnd(ji,jk) * rhos * r1_rdtice
300               !
301            ENDIF
302
303            IF ( to_print(ji) == 10 ) THEN
304               write(numout,*)'after snow melt: zq_top(ji), zdeltah(ji,jk), e_s_1d(ji,jk), test = ',zq_top(ji), zdeltah(ji,jk), e_s_1d(ji,jk), ( zh_s(ji,jk) > 0._wp .AND. zq_top(ji) > 0._wp )
305            ENDIF
306
307            IF (to_print(ji) == 10) THEN
308               write(numout,*)'icethd_dh loop: wfx_snw_sum_1d(ji), jk = ',wfx_snw_sum_1d(ji), ' ', jk
309            END IF
310         END DO
311      END DO
312
313      DO ji = 1, npti
314         IF (to_print(ji) == 10) THEN
315            write(numout,*)'icethd_dh snow_ground: wfx_snw_sum_1d(ji) = ',wfx_snw_sum_1d(ji)
316         END IF
317      END DO
318
319      ! Snow sublimation
320      !-----------------
321      ! qla_ice is always >=0 (upwards), heat goes to the atmosphere, therefore snow sublimates
322      !    comment: not counted in mass/heat exchange in iceupdate.F90 since this is an exchange with atm. (not ocean)
323      zdeltah(1:npti,:) = 0._wp
324      DO ji = 1, npti
325         IF( evap_ice_1d(ji) > 0._wp ) THEN
326            !
327            zdh_s_sub (ji)   = MAX( - h_s_1d(ji) , - evap_ice_1d(ji) * r1_rhos * rdt_ice )
328            zevap_rema(ji)   = evap_ice_1d(ji) * rdt_ice + zdh_s_sub(ji) * rhos   ! remaining evap in kg.m-2 (used for ice melting later on)
329            zdeltah   (ji,1) = MAX( zdh_s_sub(ji), - zdh_s_pre(ji) )
330           
331            hfx_sub_1d    (ji) = hfx_sub_1d(ji) + &   ! Heat flux by sublimation [W.m-2], < 0 (sublimate snow that had fallen, then pre-existing snow)
332               &                 ( zdeltah(ji,1) * zqprec(ji) + ( zdh_s_sub(ji) - zdeltah(ji,1) ) * e_s_1d(ji,1) )  &
333               &                 * a_i_1d(ji) * r1_rdtice
334            wfx_snw_sub_1d(ji) = wfx_snw_sub_1d(ji) - rhos * a_i_1d(ji) * zdh_s_sub(ji) * r1_rdtice   ! Mass flux by sublimation
335           
336            ! new snow thickness
337            h_s_1d(ji)    =  MAX( 0._wp , h_s_1d(ji) + zdh_s_sub(ji) )
338            ! update precipitations after sublimation and correct sublimation
339            zdh_s_pre(ji) = zdh_s_pre(ji) + zdeltah(ji,1)
340            zdh_s_sub(ji) = zdh_s_sub(ji) - zdeltah(ji,1)
341            !
342         ELSE
343            !
344            zdh_s_sub (ji) = 0._wp
345            zevap_rema(ji) = 0._wp
346            !
347         ENDIF
348      END DO
349     
350      ! --- Update snow diags --- !
351      DO ji = 1, npti
352         dh_s_tot(ji) = zdh_s_mel(ji) + zdh_s_pre(ji) + zdh_s_sub(ji)
353      END DO
354
355      ! Update temperature, energy
356      !---------------------------
357      ! new temp and enthalpy of the snow (remaining snow precip + remaining pre-existing snow)
358      DO jk = 1, nlay_s
359         DO ji = 1,npti
360            rswitch       = MAX( 0._wp , SIGN( 1._wp, h_s_1d(ji) - epsi20 ) )
361            e_s_1d(ji,jk) = rswitch / MAX( h_s_1d(ji), epsi20 ) *            &
362              &             ( ( zdh_s_pre(ji)              ) * zqprec(ji) +  &
363              &               ( h_s_1d(ji) - zdh_s_pre(ji) ) * rhos * ( rcpi * ( rt0 - t_s_1d(ji,jk) ) + rLfus ) )
364
365            IF (to_print(ji) == 10) THEN
366                write(numout,*)'icethd_dh 9: t_s_1d(ji,jk), e_s_1d(ji,jk) = ',t_s_1d(ji,jk), ' ', e_s_1d(ji,jk)
367                write(numout,*)'icethd_dh 9: zdh_s_pre(ji), zqprec(ji), h_s_1d(ji) = ',zdh_s_pre(ji), ' ', zqprec(ji), ' ', h_s_1d(ji)
368            END IF
369         END DO
370      END DO
371     
372      !                       ! ============ !
373      !                       !     Ice      !
374      !                       ! ============ !
375
376      ! Surface ice melting
377      !--------------------
378      zdeltah(1:npti,:) = 0._wp ! important
379      DO jk = 1, nlay_i
380         DO ji = 1, npti
381            ztmelts = - rTmlt * sz_i_1d(ji,jk)   ! Melting point of layer k [C]
382           
383            IF( t_i_1d(ji,jk) >= (ztmelts+rt0) ) THEN   !-- Internal melting
384
385               zEi            = - e_i_1d(ji,jk) * r1_rhoi             ! Specific enthalpy of layer k [J/kg, <0]       
386               zdE            = 0._wp                                 ! Specific enthalpy difference (J/kg, <0)
387                                                                      ! set up at 0 since no energy is needed to melt water...(it is already melted)
388               zdeltah(ji,jk) = MIN( 0._wp , - zh_i(ji,jk) )          ! internal melting occurs when the internal temperature is above freezing     
389                                                                      ! this should normally not happen, but sometimes, heat diffusion leads to this
390               zfmdt          = - zdeltah(ji,jk) * rhoi               ! Mass flux x time step > 0
391                         
392               dh_i_itm(ji)   = dh_i_itm(ji) + zdeltah(ji,jk)         ! Cumulate internal melting
393               
394               zfmdt          = - rhoi * zdeltah(ji,jk)               ! Recompute mass flux [kg/m2, >0]
395
396               hfx_res_1d(ji) = hfx_res_1d(ji) + zfmdt * a_i_1d(ji) * zEi * r1_rdtice                           ! Heat flux to the ocean [W.m-2], <0
397               !                                                                                                  ice enthalpy zEi is "sent" to the ocean
398               sfx_res_1d(ji) = sfx_res_1d(ji) - rhoi * a_i_1d(ji) * zdeltah(ji,jk) * s_i_1d(ji) * r1_rdtice    ! Salt flux
399               !                                                                                                  using s_i_1d and not sz_i_1d(jk) is ok
400               wfx_res_1d(ji) = wfx_res_1d(ji) - rhoi * a_i_1d(ji) * zdeltah(ji,jk) * r1_rdtice                 ! Mass flux
401
402            ELSE                                        !-- Surface melting
403               
404               zEi            = - e_i_1d(ji,jk) * r1_rhoi             ! Specific enthalpy of layer k [J/kg, <0]
405               zEw            =    rcp * ztmelts                      ! Specific enthalpy of resulting meltwater [J/kg, <0]
406               zdE            =    zEi - zEw                          ! Specific enthalpy difference < 0
407               
408               zfmdt          = - zq_top(ji) / zdE                    ! Mass flux to the ocean or meltponds [kg/m2, >0]
409               
410               zdeltah(ji,jk) = - zfmdt * r1_rhoi * (1._wp - a_pnd_avail_1d(ji))                    ! Melt of layer jk [m, <0] into the ocean
411               zdeltah_pnd(ji,jk) = - zfmdt * r1_rhoi * a_pnd_avail_1d(ji)                          ! Melt of layer jk [m, <0] into meltponds
412               
413               zdeltah(ji,jk) = MIN( 0._wp , MAX( zdeltah(ji,jk) , - zh_i(ji,jk) ) )    ! Melt of layer jk cannot exceed the layer thickness [m, <0]
414               
415               zq_top(ji)      = MAX( 0._wp , zq_top(ji) - zdeltah(ji,jk) * rhoi * zdE ) ! update available heat
416               
417               dh_i_sum(ji)   = dh_i_sum(ji) + zdeltah(ji,jk)          ! Cumulate surface melt on areas not contributing to melt ponds
418               dh_i_pnd(ji)   = dh_i_pnd(ji) + zdeltah_pnd(ji,jk)      ! Cumulate surface melt on areas contributing to melt ponds
419               
420               zfmdt          = - rhoi * zdeltah(ji,jk)               ! Recompute mass flux [kg/m2, >0]
421               
422               zQm            = zfmdt * zEw                           ! Energy of the melt water sent to the ocean [J/m2, <0]
423               
424               sfx_sum_1d(ji) = sfx_sum_1d(ji) - rhoi * a_i_1d(ji) * zdeltah(ji,jk) * s_i_1d(ji) * r1_rdtice    ! Salt flux >0
425               !                                                                                                  using s_i_1d and not sz_i_1d(jk) is ok)
426               hfx_thd_1d(ji) = hfx_thd_1d(ji) + zfmdt * a_i_1d(ji) * zEw * r1_rdtice                           ! Heat flux [W.m-2], < 0
427               hfx_sum_1d(ji) = hfx_sum_1d(ji) - zfmdt * a_i_1d(ji) * zdE * r1_rdtice                           ! Heat flux used in this process [W.m-2], > 0 
428               !
429               wfx_sum_1d(ji) = wfx_sum_1d(ji) - rhoi * a_i_1d(ji) * zdeltah(ji,jk) * r1_rdtice                 ! Mass flux
430               
431            END IF
432
433            IF ( to_print(ji) == 10 ) THEN
434               write(numout,*)'after top melt: zq_top(ji), test = ',zq_top(ji), ( t_i_1d(ji,jk) >= (ztmelts+rt0) ) 
435               write(numout,*)'after top melt: wfx_sum_1d(ji), zdeltah(ji,jk), zfmdt, zdE = ', wfx_sum_1d(ji), zdeltah(ji,jk), zfmdt, zdE
436            ENDIF
437           
438            ! Ice sublimation
439            ! ---------------
440            zdum            = MAX( - ( zh_i(ji,jk) + zdeltah(ji,jk) ) , - zevap_rema(ji) * r1_rhoi )
441            zdeltah (ji,jk) = zdeltah (ji,jk) + zdum
442            dh_i_sub(ji)    = dh_i_sub(ji)    + zdum
443           
444            sfx_sub_1d(ji)     = sfx_sub_1d(ji) - rhoi * a_i_1d(ji) * zdum * s_i_1d(ji) * r1_rdtice  ! Salt flux >0
445            !                                                                                          clem: flux is sent to the ocean for simplicity
446            !                                                                                                but salt should remain in the ice except
447            !                                                                                                if all ice is melted. => must be corrected
448            hfx_sub_1d(ji)     = hfx_sub_1d(ji) + zdum * e_i_1d(ji,jk) * a_i_1d(ji) * r1_rdtice      ! Heat flux [W.m-2], < 0
449
450            wfx_ice_sub_1d(ji) = wfx_ice_sub_1d(ji) - rhoi * a_i_1d(ji) * zdum * r1_rdtice           ! Mass flux > 0
451
452            ! update remaining mass flux
453            zevap_rema(ji)  = zevap_rema(ji) + zdum * rhoi
454           
455            ! record which layers have disappeared (for bottom melting)
456            !    => icount=0 : no layer has vanished
457            !    => icount=5 : 5 layers have vanished
458            rswitch       = MAX( 0._wp , SIGN( 1._wp , - ( zh_i(ji,jk) + zdeltah(ji,jk) ) ) ) 
459            icount(ji,jk) = NINT( rswitch )
460            zh_i(ji,jk)   = MAX( 0._wp , zh_i(ji,jk) + zdeltah(ji,jk) )
461                       
462            ! update heat content (J.m-2) and layer thickness
463            eh_i_old(ji,jk) = eh_i_old(ji,jk) + zdeltah(ji,jk) * e_i_1d(ji,jk)
464            h_i_old (ji,jk) = h_i_old (ji,jk) + zdeltah(ji,jk)
465         END DO
466      END DO
467     
468      ! update ice thickness
469      DO ji = 1, npti
470         h_i_1d(ji) =  MAX( 0._wp , h_i_1d(ji) + dh_i_sum(ji) + dh_i_itm(ji) + dh_i_sub(ji) )
471      END DO
472
473      ! remaining "potential" evap is sent to ocean
474      DO ji = 1, npti
475         wfx_err_sub_1d(ji) = wfx_err_sub_1d(ji) - zevap_rema(ji) * a_i_1d(ji) * r1_rdtice  ! <=0 (net evap for the ocean in kg.m-2.s-1)
476      END DO
477
478
479      ! Ice Basal growth
480      !------------------
481      ! Basal growth is driven by heat imbalance at the ice-ocean interface,
482      ! between the inner conductive flux  (qcn_ice_bot), from the open water heat flux
483      ! (fhld) and the sensible ice-ocean flux (qsb_ice_bot).
484      ! qcn_ice_bot is positive downwards. qsb_ice_bot and fhld are positive to the ice
485
486      ! If salinity varies in time, an iterative procedure is required, because
487      ! the involved quantities are inter-dependent.
488      ! Basal growth (dh_i_bog) depends upon new ice specific enthalpy (zEi),
489      ! which depends on forming ice salinity (s_i_new), which depends on dh/dt (dh_i_bog)
490      ! -> need for an iterative procedure, which converges quickly
491
492      num_iter_max = 1
493      IF( nn_icesal == 2 )   num_iter_max = 5  ! salinity varying in time
494     
495      DO ji = 1, npti
496         IF(  zf_tt(ji) < 0._wp  ) THEN
497            DO iter = 1, num_iter_max   ! iterations
498
499               ! New bottom ice salinity (Cox & Weeks, JGR88 )
500               !--- zswi1  if dh/dt < 2.0e-8
501               !--- zswi12 if 2.0e-8 < dh/dt < 3.6e-7
502               !--- zswi2  if dh/dt > 3.6e-7
503               zgrr     = MIN( 1.0e-3, MAX ( dh_i_bog(ji) * r1_rdtice , epsi10 ) )
504               zswi2    = MAX( 0._wp , SIGN( 1._wp , zgrr - 3.6e-7 ) )
505               zswi12   = MAX( 0._wp , SIGN( 1._wp , zgrr - 2.0e-8 ) ) * ( 1.0 - zswi2 )
506               zswi1    = 1. - zswi2 * zswi12
507               zfracs   = MIN( zswi1  * 0.12 + zswi12 * ( 0.8925 + 0.0568 * LOG( 100.0 * zgrr ) )   &
508                  &          + zswi2  * 0.26 / ( 0.26 + 0.74 * EXP ( - 724300.0 * zgrr ) )  , 0.5 )
509
510               s_i_new(ji)   = zswitch_sal * zfracs * sss_1d(ji) + ( 1. - zswitch_sal ) * s_i_1d(ji)  ! New ice salinity
511
512               ztmelts       = - rTmlt * s_i_new(ji)                                                  ! New ice melting point (C)
513
514               zt_i_new      = zswitch_sal * t_bo_1d(ji) + ( 1. - zswitch_sal) * t_i_1d(ji, nlay_i)
515               
516               zEi           = rcpi * ( zt_i_new - (ztmelts+rt0) ) &                                  ! Specific enthalpy of forming ice (J/kg, <0)
517                  &            - rLfus * ( 1.0 - ztmelts / ( zt_i_new - rt0 ) ) + rcp  * ztmelts
518
519               zEw           = rcp  * ( t_bo_1d(ji) - rt0 )                                           ! Specific enthalpy of seawater (J/kg, < 0)
520
521               zdE           = zEi - zEw                                                              ! Specific enthalpy difference (J/kg, <0)
522
523               dh_i_bog(ji)  = rdt_ice * MAX( 0._wp , zf_tt(ji) / ( zdE * rhoi ) )
524               
525            END DO
526            ! Contribution to Energy and Salt Fluxes                                   
527            zfmdt          = - rhoi * dh_i_bog(ji)                                                   ! Mass flux x time step (kg/m2, < 0)
528           
529            hfx_thd_1d(ji) = hfx_thd_1d(ji) + zfmdt * a_i_1d(ji) * zEw * r1_rdtice                           ! Heat flux to the ocean [W.m-2], >0
530            hfx_bog_1d(ji) = hfx_bog_1d(ji) - zfmdt * a_i_1d(ji) * zdE * r1_rdtice                           ! Heat flux used in this process [W.m-2], <0
531           
532            sfx_bog_1d(ji) = sfx_bog_1d(ji) - rhoi * a_i_1d(ji) * dh_i_bog(ji) * s_i_new(ji) * r1_rdtice     ! Salt flux, <0
533
534            wfx_bog_1d(ji) = wfx_bog_1d(ji) - rhoi * a_i_1d(ji) * dh_i_bog(ji) * r1_rdtice                   ! Mass flux, <0
535
536            ! update heat content (J.m-2) and layer thickness
537            eh_i_old(ji,nlay_i+1) = eh_i_old(ji,nlay_i+1) + dh_i_bog(ji) * (-zEi * rhoi)
538            h_i_old (ji,nlay_i+1) = h_i_old (ji,nlay_i+1) + dh_i_bog(ji)
539
540         ENDIF
541
542      END DO
543
544      ! Ice Basal melt
545      !---------------
546      zdeltah(1:npti,:) = 0._wp ! important
547      DO jk = nlay_i, 1, -1
548         DO ji = 1, npti
549            IF(  zf_tt(ji)  >  0._wp  .AND. jk > icount(ji,jk) ) THEN   ! do not calculate where layer has already disappeared by surface melting
550
551               ztmelts = - rTmlt * sz_i_1d(ji,jk)  ! Melting point of layer jk (C)
552
553               IF( t_i_1d(ji,jk) >= (ztmelts+rt0) ) THEN   !-- Internal melting
554
555                  zEi               = - e_i_1d(ji,jk) * r1_rhoi     ! Specific enthalpy of melting ice (J/kg, <0)
556                  zdE               = 0._wp                         ! Specific enthalpy difference   (J/kg, <0)
557                                                                    !    set up at 0 since no energy is needed to melt water...(it is already melted)
558                  zdeltah   (ji,jk) = MIN( 0._wp , - zh_i(ji,jk) )  ! internal melting occurs when the internal temperature is above freezing     
559                                                                    ! this should normally not happen, but sometimes, heat diffusion leads to this
560
561                  dh_i_itm (ji)     = dh_i_itm(ji) + zdeltah(ji,jk)
562
563                  zfmdt             = - zdeltah(ji,jk) * rhoi      ! Mass flux x time step > 0
564
565                  hfx_res_1d(ji) = hfx_res_1d(ji) + zfmdt * a_i_1d(ji) * zEi * r1_rdtice                           ! Heat flux to the ocean [W.m-2], <0
566                  !                                                                                                  ice enthalpy zEi is "sent" to the ocean
567                  sfx_res_1d(ji) = sfx_res_1d(ji) - rhoi * a_i_1d(ji) * zdeltah(ji,jk) * s_i_1d(ji) * r1_rdtice    ! Salt flux
568                  !                                                                                                  using s_i_1d and not sz_i_1d(jk) is ok
569                  wfx_res_1d(ji) = wfx_res_1d(ji) - rhoi * a_i_1d(ji) * zdeltah(ji,jk) * r1_rdtice                 ! Mass flux
570
571                  ! update heat content (J.m-2) and layer thickness
572                  eh_i_old(ji,jk) = eh_i_old(ji,jk) + zdeltah(ji,jk) * e_i_1d(ji,jk)
573                  h_i_old (ji,jk) = h_i_old (ji,jk) + zdeltah(ji,jk)
574
575               ELSE                                        !-- Basal melting
576
577                  zEi             = - e_i_1d(ji,jk) * r1_rhoi                                 ! Specific enthalpy of melting ice (J/kg, <0)
578                  zEw             = rcp * ztmelts                                             ! Specific enthalpy of meltwater (J/kg, <0)
579                  zdE             = zEi - zEw                                                 ! Specific enthalpy difference   (J/kg, <0)
580
581                  zfmdt           = - zq_bot(ji) / zdE                                        ! Mass flux x time step (kg/m2, >0)
582
583                  zdeltah(ji,jk)  = - zfmdt * r1_rhoi                                         ! Gross thickness change
584
585                  IF ( to_print(ji) == 1 ) THEN
586                    write(numout,*)'icethd_dh: zfmdt, zq_bot(ji), zdE, zdeltah(ji,jk) = ',zfmdt,', ', zq_bot(ji), zdE, zdeltah(ji,jk)
587                  ENDIF
588
589                  zdeltah(ji,jk)  = MIN( 0._wp , MAX( zdeltah(ji,jk), - zh_i(ji,jk) ) )       ! bound thickness change
590                 
591                  zq_bot(ji)      = MAX( 0._wp , zq_bot(ji) - zdeltah(ji,jk) * rhoi * zdE )   ! update available heat. MAX is necessary for roundup errors
592
593                  dh_i_bom(ji)    = dh_i_bom(ji) + zdeltah(ji,jk)                             ! Update basal melt
594
595                  zfmdt           = - zdeltah(ji,jk) * rhoi                                   ! Mass flux x time step > 0
596
597                  zQm             = zfmdt * zEw                                               ! Heat exchanged with ocean
598
599                  hfx_thd_1d(ji)  = hfx_thd_1d(ji) + zfmdt * a_i_1d(ji) * zEw * r1_rdtice                           ! Heat flux to the ocean [W.m-2], <0 
600                  hfx_bom_1d(ji)  = hfx_bom_1d(ji) - zfmdt * a_i_1d(ji) * zdE * r1_rdtice                           ! Heat used in this process [W.m-2], >0 
601
602                  sfx_bom_1d(ji)  = sfx_bom_1d(ji) - rhoi *  a_i_1d(ji) * zdeltah(ji,jk) * s_i_1d(ji) * r1_rdtice   ! Salt flux
603                  !                                                                                                   using s_i_1d and not sz_i_1d(jk) is ok
604                 
605                  wfx_bom_1d(ji)  = wfx_bom_1d(ji) - rhoi * a_i_1d(ji) * zdeltah(ji,jk) * r1_rdtice                 ! Mass flux
606
607                  IF (to_print(ji) == 1) THEN
608                     write(numout,*)'icethd_dh: wfx_bom_1d(ji), in meters, at_i_1d(ji) = ',wfx_bom_1d(ji),wfx_bom_1d(ji)*rdt_ice/(rhoi*at_i_1d(ji)), at_i_1d(ji)
609                  ENDIF
610
611                  ! update heat content (J.m-2) and layer thickness
612                  eh_i_old(ji,jk) = eh_i_old(ji,jk) + zdeltah(ji,jk) * e_i_1d(ji,jk)
613                  h_i_old (ji,jk) = h_i_old (ji,jk) + zdeltah(ji,jk)
614               ENDIF
615           
616            ENDIF
617         END DO
618      END DO
619
620     
621
622      ! Update temperature, energy
623      ! --------------------------
624      DO ji = 1, npti
625         h_i_1d(ji) = MAX( 0._wp , h_i_1d(ji) + dh_i_bog(ji) + dh_i_bom(ji) )
626      END DO 
627
628      ! If heat still available then melt more snow
629      !-------------------------------------------
630      zdeltah(1:npti,:) = 0._wp ! important
631      DO ji = 1, npti
632         zq_rema (ji)   = zq_top(ji) + zq_bot(ji) 
633         rswitch        = 1._wp - MAX( 0._wp, SIGN( 1._wp, - h_s_1d(ji) ) )   ! =1 if snow
634         rswitch        = rswitch * MAX( 0._wp, SIGN( 1._wp, e_s_1d(ji,1) - epsi20 ) )
635         zdeltah (ji,1) = - rswitch * zq_rema(ji) / MAX( e_s_1d(ji,1), epsi20 )
636         zdeltah (ji,1) = MIN( 0._wp , MAX( zdeltah(ji,1) , - h_s_1d(ji) ) ) ! bound melting
637         dh_s_tot(ji)   = dh_s_tot(ji) + zdeltah(ji,1)
638         h_s_1d  (ji)   = h_s_1d  (ji) + zdeltah(ji,1)
639       
640         zq_rema(ji)        = zq_rema(ji) + zdeltah(ji,1) * e_s_1d(ji,1)                               ! update available heat (J.m-2)
641         hfx_snw_1d(ji)     = hfx_snw_1d(ji) - zdeltah(ji,1) * a_i_1d(ji) * e_s_1d(ji,1) * r1_rdtice   ! Heat used to melt snow, W.m-2 (>0)
642         wfx_snw_sum_1d(ji) = wfx_snw_sum_1d(ji) - rhos * a_i_1d(ji) * zdeltah(ji,1) * r1_rdtice       ! Mass flux
643         dh_s_mlt(ji)       = dh_s_mlt(ji) + zdeltah(ji,1)
644         !   
645         ! Remaining heat flux (W.m-2) is sent to the ocean heat budget
646         qt_oce_ai_1d(ji) = qt_oce_ai_1d(ji) + ( zq_rema(ji) * a_i_1d(ji) ) * r1_rdtice
647
648         IF( ln_icectl .AND. zq_rema(ji) < 0. .AND. lwp ) WRITE(numout,*) 'ALERTE zq_rema <0 = ', zq_rema(ji)
649
650         IF (to_print(ji) == 10) THEN
651            write(numout,*)'icethd_dh snow_extra: wfx_snw_sum_1d(ji) = ',wfx_snw_sum_1d(ji)
652         END IF
653
654      END DO
655
656      !
657      ! Snow-Ice formation
658      ! ------------------
659      ! When snow load excesses Archimede's limit, snow-ice interface goes down under sea-level,
660      ! flooding of seawater transforms snow into ice dh_snowice is positive for the ice
661      z1_rho = 1._wp / ( rhos+rau0-rhoi )
662      DO ji = 1, npti
663         !
664         dh_snowice(ji) = MAX(  0._wp , ( rhos * h_s_1d(ji) + (rhoi-rau0) * h_i_1d(ji) ) * z1_rho )
665
666         h_i_1d(ji)    = h_i_1d(ji) + dh_snowice(ji)
667         h_s_1d(ji)    = h_s_1d(ji) - dh_snowice(ji)
668
669         ! Contribution to energy flux to the ocean [J/m2], >0 (if sst<0)
670         zfmdt          = ( rhos - rhoi ) * dh_snowice(ji)    ! <0
671         zEw            = rcp * sst_1d(ji)
672         zQm            = zfmdt * zEw 
673         
674         hfx_thd_1d(ji) = hfx_thd_1d(ji) + zfmdt * a_i_1d(ji) * zEw * r1_rdtice ! Heat flux
675
676         sfx_sni_1d(ji) = sfx_sni_1d(ji) + sss_1d(ji) * a_i_1d(ji) * zfmdt * r1_rdtice ! Salt flux
677
678         ! Case constant salinity in time: virtual salt flux to keep salinity constant
679         IF( nn_icesal /= 2 )  THEN
680            sfx_bri_1d(ji) = sfx_bri_1d(ji) - sss_1d (ji) * a_i_1d(ji) * zfmdt                  * r1_rdtice  & ! put back sss_m     into the ocean
681               &                            - s_i_1d(ji)  * a_i_1d(ji) * dh_snowice(ji) * rhoi * r1_rdtice     ! and get  rn_icesal from the ocean
682         ENDIF
683
684         ! Mass flux: All snow is thrown in the ocean, and seawater is taken to replace the volume
685         wfx_sni_1d(ji)     = wfx_sni_1d(ji)     - a_i_1d(ji) * dh_snowice(ji) * rhoi * r1_rdtice
686         wfx_snw_sni_1d(ji) = wfx_snw_sni_1d(ji) + a_i_1d(ji) * dh_snowice(ji) * rhos * r1_rdtice
687
688         ! update heat content (J.m-2) and layer thickness
689         eh_i_old(ji,0) = eh_i_old(ji,0) + dh_snowice(ji) * e_s_1d(ji,1) + zfmdt * zEw
690         h_i_old (ji,0) = h_i_old (ji,0) + dh_snowice(ji)
691         
692      END DO
693
694      !
695      ! Update temperature, energy
696      ! --------------------------
697      DO ji = 1, npti
698         rswitch     = 1._wp - MAX( 0._wp , SIGN( 1._wp , - h_i_1d(ji) ) ) 
699         t_su_1d(ji) = rswitch * t_su_1d(ji) + ( 1._wp - rswitch ) * rt0
700
701         IF (to_print(ji) == 10) THEN
702            write(numout,*)'icethd_dh: t_su_1d(ji), t_i_1d(ji,1) = ',t_su_1d(ji), ' ', t_i_1d(ji,1)
703         END IF
704      END DO
705
706      DO jk = 1, nlay_s
707         DO ji = 1,npti
708            ! where there is no ice or no snow
709            rswitch = ( 1._wp - MAX( 0._wp, SIGN( 1._wp, - h_s_1d(ji) ) ) ) * ( 1._wp - MAX( 0._wp, SIGN(1._wp, - h_i_1d(ji) ) ) )
710            ! mass & energy loss to the ocean
711            hfx_res_1d(ji) = hfx_res_1d(ji) + ( 1._wp - rswitch ) * &
712               &                              ( e_s_1d(ji,jk) * h_s_1d(ji) * r1_nlay_s * a_i_1d(ji) * r1_rdtice )  ! heat flux to the ocean [W.m-2], < 0
713            wfx_res_1d(ji) = wfx_res_1d(ji) + ( 1._wp - rswitch ) * &
714               &                              ( rhos          * h_s_1d(ji) * r1_nlay_s * a_i_1d(ji) * r1_rdtice )  ! mass flux
715            ! update energy (mass is updated in the next loop)
716            e_s_1d(ji,jk) = rswitch * e_s_1d(ji,jk)
717            ! recalculate t_s_1d from e_s_1d
718            t_s_1d(ji,jk) = rt0 + rswitch * ( - e_s_1d(ji,jk) * r1_rhos * r1_rcpi + rLfus * r1_rcpi )
719
720            IF (to_print(ji) == 10) THEN
721                write(numout,*)'icethd_dh 10: t_s_1d(ji,jk), e_s_1d(ji,jk) = ',t_s_1d(ji,jk), ' ', e_s_1d(ji,jk)
722            END IF
723         END DO
724      END DO
725
726      ! --- ensure that a_i = 0 & h_s = 0 where h_i = 0 ---
727      WHERE( h_i_1d(1:npti) == 0._wp )   
728         a_i_1d(1:npti) = 0._wp
729         h_s_1d(1:npti) = 0._wp
730      END WHERE
731      !
732   END SUBROUTINE ice_thd_dh
733
734
735   !!--------------------------------------------------------------------------
736   !! INTERFACE ice_thd_snwblow
737   !!
738   !! ** Purpose :   Compute distribution of precip over the ice
739   !!
740   !!                Snow accumulation in one thermodynamic time step
741   !!                snowfall is partitionned between leads and ice.
742   !!                If snow fall was uniform, a fraction (1-at_i) would fall into leads
743   !!                but because of the winds, more snow falls on leads than on sea ice
744   !!                and a greater fraction (1-at_i)^beta of the total mass of snow
745   !!                (beta < 1) falls in leads.
746   !!                In reality, beta depends on wind speed,
747   !!                and should decrease with increasing wind speed but here, it is
748   !!                considered as a constant. an average value is 0.66
749   !!--------------------------------------------------------------------------
750!!gm  I think it can be usefull to set this as a FUNCTION, not a SUBROUTINE....
751   SUBROUTINE ice_thd_snwblow_2d( pin, pout )
752      REAL(wp), DIMENSION(:,:), INTENT(in   ) :: pin   ! previous fraction lead ( 1. - a_i_b )
753      REAL(wp), DIMENSION(:,:), INTENT(inout) :: pout
754      pout = ( 1._wp - ( pin )**rn_blow_s )
755   END SUBROUTINE ice_thd_snwblow_2d
756
757   SUBROUTINE ice_thd_snwblow_1d( pin, pout )
758      REAL(wp), DIMENSION(:), INTENT(in   ) :: pin
759      REAL(wp), DIMENSION(:), INTENT(inout) :: pout
760      pout = ( 1._wp - ( pin )**rn_blow_s )
761   END SUBROUTINE ice_thd_snwblow_1d
762
763#else
764   !!----------------------------------------------------------------------
765   !!   Default option                                NO SI3 sea-ice model
766   !!----------------------------------------------------------------------
767#endif
768
769   !!======================================================================
770END MODULE icethd_dh
Note: See TracBrowser for help on using the repository browser.