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/trunk/src/ICE – NEMO

source: NEMO/trunk/src/ICE/icethd_dh.F90 @ 10069

Last change on this file since 10069 was 10069, checked in by nicolasmartin, 6 years ago

Fix mistakes of previous commit on SVN keywords property

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