New URL for NEMO forge!   http://forge.nemo-ocean.eu

Since March 2022 along with NEMO 4.2 release, the code development moved to a self-hosted GitLab.
This present forge is now archived and remained online for history.
limthd_dh.F90 in branches/2017/dev_r8183_ICEMODEL/NEMOGCM/NEMO/LIM_SRC_3 – NEMO

source: branches/2017/dev_r8183_ICEMODEL/NEMOGCM/NEMO/LIM_SRC_3/limthd_dh.F90 @ 8414

Last change on this file since 8414 was 8414, checked in by clem, 7 years ago

changing names

  • Property svn:keywords set to Id
File size: 35.3 KB
RevLine 
[825]1MODULE limthd_dh
[1572]2   !!======================================================================
3   !!                       ***  MODULE limthd_dh ***
4   !!  LIM-3 :   thermodynamic growth and decay of the ice
5   !!======================================================================
6   !! History :  LIM  ! 2003-05 (M. Vancoppenolle) Original code in 1D
7   !!                 ! 2005-06 (M. Vancoppenolle) 3D version
[4688]8   !!            3.2  ! 2009-07 (M. Vancoppenolle, Y. Aksenov, G. Madec) bug correction in wfx_snw & wfx_ice
[3625]9   !!            3.4  ! 2011-02 (G. Madec) dynamical allocation
10   !!            3.5  ! 2012-10 (G. Madec & co) salt flux + bug fixes
[1572]11   !!----------------------------------------------------------------------
[825]12#if defined key_lim3
[834]13   !!----------------------------------------------------------------------
14   !!   'key_lim3'                                      LIM3 sea-ice model
15   !!----------------------------------------------------------------------
[3625]16   !!   lim_thd_dh    : vertical accr./abl. and lateral ablation of sea ice
[825]17   !!----------------------------------------------------------------------
[3625]18   USE par_oce        ! ocean parameters
19   USE phycst         ! physical constants (OCE directory)
20   USE ice            ! LIM variables
21   USE thd_ice        ! LIM thermodynamics
[8370]22   !
[3625]23   USE in_out_manager ! I/O manager
24   USE lib_mpp        ! MPP library
25   USE lib_fortran    ! Fortran utilities (allows no signed zero when 'key_nosignedzero' defined) 
[4688]26   
[825]27   IMPLICIT NONE
28   PRIVATE
29
[5407]30   PUBLIC   lim_thd_dh      ! called by lim_thd
[5487]31   PUBLIC   lim_thd_snwblow ! called in sbcblk/sbcclio/sbccpl and here
[825]32
[5407]33   INTERFACE lim_thd_snwblow
34      MODULE PROCEDURE lim_thd_snwblow_1d, lim_thd_snwblow_2d
35   END INTERFACE
36
[825]37   !!----------------------------------------------------------------------
[4161]38   !! NEMO/LIM3 4.0 , UCL - NEMO Consortium (2010)
[1156]39   !! $Id$
[2715]40   !! Software governed by the CeCILL licence     (NEMOGCM/NEMO_CeCILL.txt)
[825]41   !!----------------------------------------------------------------------
42CONTAINS
43
[8342]44   SUBROUTINE lim_thd_dh
[921]45      !!------------------------------------------------------------------
46      !!                ***  ROUTINE lim_thd_dh  ***
47      !!
[1572]48      !! ** Purpose :   determines variations of ice and snow thicknesses.
[921]49      !!
[1572]50      !! ** Method  :   Ice/Snow surface melting arises from imbalance in surface fluxes
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
[921]55      !!
[1572]56      !!                 1) Compute available flux of heat for surface ablation
57      !!                 2) Compute snow and sea ice enthalpies
58      !!                 3) Surface ablation and sublimation
59      !!                 4) Bottom accretion/ablation
60      !!                 5) Case of Total ablation
61      !!                 6) Snow ice formation
[921]62      !!
[1572]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
[921]67      !!------------------------------------------------------------------
[1572]68      INTEGER  ::   ji , jk        ! dummy loop indices
69      INTEGER  ::   iter
[825]70
[4688]71      REAL(wp) ::   ztmelts             ! local scalar
[6416]72      REAL(wp) ::   zdum       
[1572]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
[4688]78      REAL(wp) ::   zt_i_new     ! bottom formation temperature
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
[8373]86      REAL(wp), DIMENSION(jpij) ::   zqprec      ! energy of fallen snow                       (J.m-3)
87      REAL(wp), DIMENSION(jpij) ::   zq_su       ! heat for surface ablation                   (J.m-2)
88      REAL(wp), DIMENSION(jpij) ::   zq_bo       ! heat for bottom ablation                    (J.m-2)
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)
[3294]92
[8373]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
[3294]96
[8373]97      REAL(wp), DIMENSION(jpij,nlay_i) ::   zdeltah
98      REAL(wp), DIMENSION(jpij,nlay_i) ::   zh_i      ! ice layer thickness
99      INTEGER , DIMENSION(jpij,nlay_i) ::   icount    ! number of layers vanished by melting
[3294]100
[8373]101      REAL(wp), DIMENSION(jpij) ::   zeh_i       ! total ice heat content  (J.m-2)
102      REAL(wp), DIMENSION(jpij) ::   zsnw        ! distribution of snow after wind blowing
[3294]103
[5123]104      REAL(wp) :: zswitch_sal
[4161]105
[3294]106      ! Heat conservation
[4688]107      INTEGER  ::   num_iter_max
[1572]108      !!------------------------------------------------------------------
[825]109
[5123]110      ! Discriminate between varying salinity (nn_icesal=2) and prescribed cases (other values)
[7646]111      SELECT CASE( nn_icesal )                  ! varying salinity or not
[8373]112         CASE( 1, 3 ) ;   zswitch_sal = 0._wp   ! prescribed salinity profile
113         CASE( 2 )    ;   zswitch_sal = 1._wp   ! varying salinity profile
[4688]114      END SELECT
[825]115
[8342]116      DO ji = 1, nidx
[8373]117         icount (ji,:) = 0
118         zdh_s_mel(ji) = 0._wp
119         e_i_1d(ji,nlay_i+1) = 0._wp ! Initialize enthalpy at nlay_i+1
[5167]120      END DO
121
[4688]122      ! initialize layer thicknesses and enthalpies
[8373]123      h_i_old (1:nidx,0:nlay_i+1) = 0._wp
124      eh_i_old(1:nidx,0:nlay_i+1) = 0._wp
[4688]125      DO jk = 1, nlay_i
[8342]126         DO ji = 1, nidx
[5123]127            h_i_old (ji,jk) = ht_i_1d(ji) * r1_nlay_i
[8325]128            eh_i_old(ji,jk) = e_i_1d(ji,jk) * h_i_old(ji,jk)
[4688]129         ENDDO
130      ENDDO
[921]131      !
132      !------------------------------------------------------------------------------!
[4688]133      !  1) Calculate available heat for surface and bottom ablation                 !
[921]134      !------------------------------------------------------------------------------!
135      !
[8342]136      DO ji = 1, nidx
[6416]137         zdum       = qns_ice_1d(ji) + ( 1._wp - i0(ji) ) * qsr_ice_1d(ji) - fc_su(ji) 
[4990]138         zf_tt(ji)  = fc_bo_i(ji) + fhtur_1d(ji) + fhld_1d(ji) 
[4688]139
[6416]140         zq_su (ji) = MAX( 0._wp, zdum      * rdt_ice ) * MAX( 0._wp , SIGN( 1._wp, t_su_1d(ji) - rt0 ) )
[4688]141         zq_bo (ji) = MAX( 0._wp, zf_tt(ji) * rdt_ice )
142      END DO
143
[921]144      !
145      !------------------------------------------------------------------------------!
[4688]146      ! If snow temperature is above freezing point, then snow melts
147      ! (should not happen but sometimes it does)
[921]148      !------------------------------------------------------------------------------!
[8342]149      DO ji = 1, nidx
[5123]150         IF( t_s_1d(ji,1) > rt0 ) THEN !!! Internal melting
[4688]151            ! Contribution to heat flux to the ocean [W.m-2], < 0 
[8325]152            hfx_res_1d(ji) = hfx_res_1d(ji) + e_s_1d(ji,1) * ht_s_1d(ji) * a_i_1d(ji) * r1_rdtice
[4688]153            ! Contribution to mass flux
[8233]154            wfx_snw_sum_1d(ji) = wfx_snw_sum_1d(ji) + rhosn * ht_s_1d(ji) * a_i_1d(ji) * r1_rdtice
[4688]155            ! updates
[4872]156            ht_s_1d(ji)   = 0._wp
[8325]157            e_s_1d (ji,1) = 0._wp
[5123]158            t_s_1d (ji,1) = rt0
[4688]159         END IF
160      END DO
161
162      !------------------------------------------------------------!
163      !  2) Computing layer thicknesses and enthalpies.            !
164      !------------------------------------------------------------!
[921]165      !
[825]166      DO jk = 1, nlay_i
[8342]167         DO ji = 1, nidx
[5123]168            zh_i(ji,jk) = ht_i_1d(ji) * r1_nlay_i
[8325]169            zeh_i(ji)   = zeh_i(ji) + e_i_1d(ji,jk) * zh_i(ji,jk)
[825]170         END DO
171      END DO
[921]172      !
173      !------------------------------------------------------------------------------|
174      !  3) Surface ablation and sublimation                                         |
175      !------------------------------------------------------------------------------|
176      !
[834]177      !-------------------------
178      ! 3.1 Snow precips / melt
179      !-------------------------
[825]180      ! Snow accumulation in one thermodynamic time step
181      ! snowfall is partitionned between leads and ice
182      ! if snow fall was uniform, a fraction (1-at_i) would fall into leads
183      ! but because of the winds, more snow falls on leads than on sea ice
184      ! and a greater fraction (1-at_i)^beta of the total mass of snow
[834]185      ! (beta < 1) falls in leads.
[825]186      ! In reality, beta depends on wind speed,
187      ! and should decrease with increasing wind speed but here, it is
[834]188      ! considered as a constant. an average value is 0.66
[825]189      ! Martin Vancoppenolle, December 2006
190
[8342]191      CALL lim_thd_snwblow( 1. - at_i_1d(1:nidx), zsnw(1:nidx) ) ! snow distribution over ice after wind blowing
[5487]192
[8373]193      zdeltah(1:nidx,:) = 0._wp
[8342]194      DO ji = 1, nidx
[4688]195         !-----------
196         ! Snow fall
197         !-----------
198         ! thickness change
[5407]199         zdh_s_pre(ji) = zsnw(ji) * sprecip_1d(ji) * rdt_ice * r1_rhosn / at_i_1d(ji)
200         ! enthalpy of the precip (>0, J.m-3)
201         zqprec   (ji) = - qprec_ice_1d(ji)   
[4688]202         IF( sprecip_1d(ji) == 0._wp ) zqprec(ji) = 0._wp
203         ! heat flux from snow precip (>0, W.m-2)
[4872]204         hfx_spr_1d(ji) = hfx_spr_1d(ji) + zdh_s_pre(ji) * a_i_1d(ji) * zqprec(ji) * r1_rdtice
[4688]205         ! mass flux, <0
[4872]206         wfx_spr_1d(ji) = wfx_spr_1d(ji) - rhosn * a_i_1d(ji) * zdh_s_pre(ji) * r1_rdtice
[825]207
[4688]208         !---------------------
209         ! Melt of falling snow
210         !---------------------
211         ! thickness change
[5134]212         rswitch        = MAX( 0._wp , SIGN( 1._wp , zqprec(ji) - epsi20 ) )
[5167]213         zdeltah (ji,1) = - rswitch * zq_su(ji) / MAX( zqprec(ji) , epsi20 )
214         zdeltah (ji,1) = MAX( - zdh_s_pre(ji), zdeltah(ji,1) ) ! bound melting
[4688]215         ! heat used to melt snow (W.m-2, >0)
[5167]216         hfx_snw_1d(ji) = hfx_snw_1d(ji) - zdeltah(ji,1) * a_i_1d(ji) * zqprec(ji) * r1_rdtice
[4688]217         ! snow melting only = water into the ocean (then without snow precip), >0
[8233]218         wfx_snw_sum_1d(ji) = wfx_snw_sum_1d(ji) - rhosn * a_i_1d(ji) * zdeltah(ji,1) * r1_rdtice
[5167]219         ! updates available heat + precipitations after melting
220         zq_su     (ji) = MAX( 0._wp , zq_su (ji) + zdeltah(ji,1) * zqprec(ji) )     
221         zdh_s_pre (ji) = zdh_s_pre(ji) + zdeltah(ji,1)
[4688]222
[5167]223         ! update thickness
224         ht_s_1d(ji) = MAX( 0._wp , ht_s_1d(ji) + zdh_s_pre(ji) )
[825]225      END DO
226
[5167]227      ! If heat still available (zq_su > 0), then melt more snow
[8373]228      zdeltah(1:nidx,:) = 0._wp
[825]229      DO jk = 1, nlay_s
[8342]230         DO ji = 1, nidx
[4688]231            ! thickness change
[4990]232            rswitch          = 1._wp - MAX( 0._wp, SIGN( 1._wp, - ht_s_1d(ji) ) ) 
[8325]233            rswitch          = rswitch * ( MAX( 0._wp, SIGN( 1._wp, e_s_1d(ji,jk) - epsi20 ) ) ) 
234            zdeltah  (ji,jk) = - rswitch * zq_su(ji) / MAX( e_s_1d(ji,jk), epsi20 )
[5167]235            zdeltah  (ji,jk) = MAX( zdeltah(ji,jk) , - ht_s_1d(ji) ) ! bound melting
[4688]236            zdh_s_mel(ji)    = zdh_s_mel(ji) + zdeltah(ji,jk)   
237            ! heat used to melt snow(W.m-2, >0)
[8325]238            hfx_snw_1d(ji)   = hfx_snw_1d(ji) - zdeltah(ji,jk) * a_i_1d(ji) * e_s_1d(ji,jk) * r1_rdtice 
[4688]239            ! snow melting only = water into the ocean (then without snow precip)
[8233]240            wfx_snw_sum_1d(ji)   = wfx_snw_sum_1d(ji) - rhosn * a_i_1d(ji) * zdeltah(ji,jk) * r1_rdtice
[4688]241            ! updates available heat + thickness
[8325]242            zq_su (ji)  = MAX( 0._wp , zq_su (ji) + zdeltah(ji,jk) * e_s_1d(ji,jk) )
[4872]243            ht_s_1d(ji) = MAX( 0._wp , ht_s_1d(ji) + zdeltah(ji,jk) )
[1572]244         END DO
245      END DO
[825]246
[6416]247      !------------------------------
248      ! 3.2 Sublimation (part1: snow)
249      !------------------------------
[4688]250      ! qla_ice is always >=0 (upwards), heat goes to the atmosphere, therefore snow sublimates
[8414]251      ! clem comment: not counted in mass/heat exchange in iceupdate.F90 since this is an exchange with atm. (not ocean)
[8373]252      zdeltah(1:nidx,:) = 0._wp
[8342]253      DO ji = 1, nidx
[6416]254         zdh_s_sub(ji)  = MAX( - ht_s_1d(ji) , - evap_ice_1d(ji) * r1_rhosn * rdt_ice )
255         ! remaining evap in kg.m-2 (used for ice melting later on)
256         zevap_rema(ji)  = evap_ice_1d(ji) * rdt_ice + zdh_s_sub(ji) * rhosn
257         ! Heat flux by sublimation [W.m-2], < 0 (sublimate first snow that had fallen, then pre-existing snow)
[5407]258         zdeltah(ji,1)  = MAX( zdh_s_sub(ji), - zdh_s_pre(ji) )
[8325]259         hfx_sub_1d(ji) = hfx_sub_1d(ji) + ( zdeltah(ji,1) * zqprec(ji) + ( zdh_s_sub(ji) - zdeltah(ji,1) ) * e_s_1d(ji,1)  &
[5407]260            &                              ) * a_i_1d(ji) * r1_rdtice
261         ! Mass flux by sublimation
[8239]262         wfx_snw_sub_1d(ji) = wfx_snw_sub_1d(ji) - rhosn * a_i_1d(ji) * zdh_s_sub(ji) * r1_rdtice
263
[5407]264         ! new snow thickness
265         ht_s_1d(ji)    =  MAX( 0._wp , ht_s_1d(ji) + zdh_s_sub(ji) )
266         ! update precipitations after sublimation and correct sublimation
267         zdh_s_pre(ji) = zdh_s_pre(ji) + zdeltah(ji,1)
268         zdh_s_sub(ji) = zdh_s_sub(ji) - zdeltah(ji,1)
269      END DO
270     
[4688]271      ! --- Update snow diags --- !
[8342]272      DO ji = 1, nidx
[5167]273         dh_s_tot(ji) = zdh_s_mel(ji) + zdh_s_pre(ji) + zdh_s_sub(ji)
274      END DO
[825]275
[4688]276      !-------------------------------------------
277      ! 3.3 Update temperature, energy
278      !-------------------------------------------
279      ! new temp and enthalpy of the snow (remaining snow precip + remaining pre-existing snow)
[825]280      DO jk = 1, nlay_s
[8342]281         DO ji = 1,nidx
[6416]282            rswitch       = MAX( 0._wp , SIGN( 1._wp, ht_s_1d(ji) - epsi20 ) )
[8325]283            e_s_1d(ji,jk) = rswitch / MAX( ht_s_1d(ji), epsi20 ) *           &
[6416]284              &            ( ( zdh_s_pre(ji)               ) * zqprec(ji) +  &
285              &              ( ht_s_1d(ji) - zdh_s_pre(ji) ) * rhosn * ( cpic * ( rt0 - t_s_1d(ji,jk) ) + lfus ) )
[825]286         END DO
287      END DO
288
[4688]289      !--------------------------
290      ! 3.4 Surface ice ablation
291      !--------------------------
[8373]292      zdeltah(1:nidx,:) = 0._wp ! important
[4688]293      DO jk = 1, nlay_i
[8342]294         DO ji = 1, nidx
[5202]295            ztmelts           = - tmut * s_i_1d(ji,jk) + rt0          ! Melting point of layer k [K]
296           
297            IF( t_i_1d(ji,jk) >= ztmelts ) THEN !!! Internal melting
[4688]298
[8325]299               zEi            = - e_i_1d(ji,jk) * r1_rhoic            ! Specific enthalpy of layer k [J/kg, <0]       
[5202]300               zdE            = 0._wp                                 ! Specific enthalpy difference   (J/kg, <0)
301                                                                      ! set up at 0 since no energy is needed to melt water...(it is already melted)
302               zdeltah(ji,jk) = MIN( 0._wp , - zh_i(ji,jk) )          ! internal melting occurs when the internal temperature is above freezing     
303                                                                      ! this should normally not happen, but sometimes, heat diffusion leads to this
304               zfmdt          = - zdeltah(ji,jk) * rhoic              ! Mass flux x time step > 0
305                         
306               dh_i_surf(ji)  = dh_i_surf(ji) + zdeltah(ji,jk)        ! Cumulate surface melt
307               
308               zfmdt          = - rhoic * zdeltah(ji,jk)              ! Recompute mass flux [kg/m2, >0]
[4688]309
[5202]310               ! Contribution to heat flux to the ocean [W.m-2], <0 (ice enthalpy zEi is "sent" to the ocean)
311               hfx_res_1d(ji) = hfx_res_1d(ji) + zfmdt * a_i_1d(ji) * zEi * r1_rdtice
312               
313               ! Contribution to salt flux (clem: using sm_i_1d and not s_i_1d(jk) is ok)
314               sfx_res_1d(ji) = sfx_res_1d(ji) - rhoic * a_i_1d(ji) * zdeltah(ji,jk) * sm_i_1d(ji) * r1_rdtice
315               
316               ! Contribution to mass flux
317               wfx_res_1d(ji) =  wfx_res_1d(ji) - rhoic * a_i_1d(ji) * zdeltah(ji,jk) * r1_rdtice
[4688]318
[5202]319            ELSE                                !!! Surface melting
320               
[8325]321               zEi            = - e_i_1d(ji,jk) * r1_rhoic            ! Specific enthalpy of layer k [J/kg, <0]
[5202]322               zEw            =    rcp * ( ztmelts - rt0 )            ! Specific enthalpy of resulting meltwater [J/kg, <0]
323               zdE            =    zEi - zEw                          ! Specific enthalpy difference < 0
324               
325               zfmdt          = - zq_su(ji) / zdE                     ! Mass flux to the ocean [kg/m2, >0]
326               
327               zdeltah(ji,jk) = - zfmdt * r1_rhoic                    ! Melt of layer jk [m, <0]
328               
329               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]
330               
331               zq_su(ji)      = MAX( 0._wp , zq_su(ji) - zdeltah(ji,jk) * rhoic * zdE ) ! update available heat
332               
333               dh_i_surf(ji)  = dh_i_surf(ji) + zdeltah(ji,jk)        ! Cumulate surface melt
334               
335               zfmdt          = - rhoic * zdeltah(ji,jk)              ! Recompute mass flux [kg/m2, >0]
336               
337               zQm            = zfmdt * zEw                           ! Energy of the melt water sent to the ocean [J/m2, <0]
338               
[6416]339               ! Contribution to salt flux >0 (clem: using sm_i_1d and not s_i_1d(jk) is ok)
[5202]340               sfx_sum_1d(ji) = sfx_sum_1d(ji) - rhoic * a_i_1d(ji) * zdeltah(ji,jk) * sm_i_1d(ji) * r1_rdtice
341               
342               ! Contribution to heat flux [W.m-2], < 0
343               hfx_thd_1d(ji) = hfx_thd_1d(ji) + zfmdt * a_i_1d(ji) * zEw * r1_rdtice
344               
345               ! Total heat flux used in this process [W.m-2], > 0 
346               hfx_sum_1d(ji) = hfx_sum_1d(ji) - zfmdt * a_i_1d(ji) * zdE * r1_rdtice
347               
348               ! Contribution to mass flux
349               wfx_sum_1d(ji) =  wfx_sum_1d(ji) - rhoic * a_i_1d(ji) * zdeltah(ji,jk) * r1_rdtice
350               
[5167]351            END IF
[6416]352            ! ----------------------
353            ! Sublimation part2: ice
354            ! ----------------------
355            zdum      = MAX( - ( zh_i(ji,jk) + zdeltah(ji,jk) ) , - zevap_rema(ji) * r1_rhoic )
356            zdeltah(ji,jk) = zdeltah(ji,jk) + zdum
357            dh_i_sub(ji)  = dh_i_sub(ji) + zdum
358            ! Salt flux > 0 (clem2016: flux is sent to the ocean for simplicity but salt should remain in the ice except if all ice is melted.
359            !                          It must be corrected at some point)
360            sfx_sub_1d(ji) = sfx_sub_1d(ji) - rhoic * a_i_1d(ji) * zdum * sm_i_1d(ji) * r1_rdtice
361            ! Heat flux [W.m-2], < 0
[8325]362            hfx_sub_1d(ji) = hfx_sub_1d(ji) + zdum * e_i_1d(ji,jk) * a_i_1d(ji) * r1_rdtice
[6416]363            ! Mass flux > 0
[8239]364            wfx_ice_sub_1d(ji) =  wfx_ice_sub_1d(ji) - rhoic * a_i_1d(ji) * zdum * r1_rdtice
365
[6416]366            ! update remaining mass flux
367            zevap_rema(ji)  = zevap_rema(ji) + zdum * rhoic
368           
[4688]369            ! record which layers have disappeared (for bottom melting)
370            !    => icount=0 : no layer has vanished
371            !    => icount=5 : 5 layers have vanished
[5202]372            rswitch       = MAX( 0._wp , SIGN( 1._wp , - ( zh_i(ji,jk) + zdeltah(ji,jk) ) ) ) 
373            icount(ji,jk) = NINT( rswitch )
374            zh_i(ji,jk)   = MAX( 0._wp , zh_i(ji,jk) + zdeltah(ji,jk) )
[6416]375                       
[4688]376            ! update heat content (J.m-2) and layer thickness
[8325]377            eh_i_old(ji,jk) = eh_i_old(ji,jk) + zdeltah(ji,jk) * e_i_1d(ji,jk)
[4688]378            h_i_old (ji,jk) = h_i_old (ji,jk) + zdeltah(ji,jk)
[825]379         END DO
[921]380      END DO
[4688]381      ! update ice thickness
[8342]382      DO ji = 1, nidx
[6416]383         ht_i_1d(ji) =  MAX( 0._wp , ht_i_1d(ji) + dh_i_surf(ji) + dh_i_sub(ji) )
[4688]384      END DO
[825]385
[6416]386      ! remaining "potential" evap is sent to ocean
[8342]387      DO ji = 1, nidx
[8326]388         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)
[6416]389      END DO
390
[921]391      !
392      !------------------------------------------------------------------------------!
393      ! 4) Basal growth / melt                                                       !
394      !------------------------------------------------------------------------------!
395      !
[4688]396      !------------------
397      ! 4.1 Basal growth
398      !------------------
399      ! Basal growth is driven by heat imbalance at the ice-ocean interface,
400      ! between the inner conductive flux  (fc_bo_i), from the open water heat flux
401      ! (fhld) and the turbulent ocean flux (fhtur).
402      ! fc_bo_i is positive downwards. fhtur and fhld are positive to the ice
[825]403
[4688]404      ! If salinity varies in time, an iterative procedure is required, because
405      ! the involved quantities are inter-dependent.
406      ! Basal growth (dh_i_bott) depends upon new ice specific enthalpy (zEi),
407      ! which depends on forming ice salinity (s_i_new), which depends on dh/dt (dh_i_bott)
408      ! -> need for an iterative procedure, which converges quickly
409
[5167]410      num_iter_max = 1
411      IF( nn_icesal == 2 ) num_iter_max = 5
[825]412
[4688]413      ! Iterative procedure
[8342]414      DO ji = 1, nidx
[8341]415         IF(  zf_tt(ji) < 0._wp  ) THEN
416            DO iter = 1, num_iter_max
[825]417
[4688]418               ! New bottom ice salinity (Cox & Weeks, JGR88 )
419               !--- zswi1  if dh/dt < 2.0e-8
420               !--- zswi12 if 2.0e-8 < dh/dt < 3.6e-7
421               !--- zswi2  if dh/dt > 3.6e-7
422               zgrr               = MIN( 1.0e-3, MAX ( dh_i_bott(ji) * r1_rdtice , epsi10 ) )
423               zswi2              = MAX( 0._wp , SIGN( 1._wp , zgrr - 3.6e-7 ) )
424               zswi12             = MAX( 0._wp , SIGN( 1._wp , zgrr - 2.0e-8 ) ) * ( 1.0 - zswi2 )
425               zswi1              = 1. - zswi2 * zswi12
426               zfracs             = MIN ( zswi1  * 0.12 + zswi12 * ( 0.8925 + 0.0568 * LOG( 100.0 * zgrr ) )   &
427                  &               + zswi2  * 0.26 / ( 0.26 + 0.74 * EXP ( - 724300.0 * zgrr ) )  , 0.5 )
[825]428
[8326]429               s_i_new(ji)        = zswitch_sal * zfracs * sss_1d(ji)  &  ! New ice salinity
[4872]430                                  + ( 1. - zswitch_sal ) * sm_i_1d(ji) 
[4688]431               ! New ice growth
[5123]432               ztmelts            = - tmut * s_i_new(ji) + rt0          ! New ice melting point (K)
[825]433
[4872]434               zt_i_new           = zswitch_sal * t_bo_1d(ji) + ( 1. - zswitch_sal) * t_i_1d(ji, nlay_i)
[4688]435               
436               zEi                = cpic * ( zt_i_new - ztmelts ) &     ! Specific enthalpy of forming ice (J/kg, <0)     
[5123]437                  &               - lfus * ( 1.0 - ( ztmelts - rt0 ) / ( zt_i_new - rt0 ) )   &
438                  &               + rcp  * ( ztmelts-rt0 )         
[4688]439
[4872]440               zEw                = rcp  * ( t_bo_1d(ji) - rt0 )         ! Specific enthalpy of seawater (J/kg, < 0)
[4688]441
442               zdE                = zEi - zEw                           ! Specific enthalpy difference (J/kg, <0)
443
444               dh_i_bott(ji)      = rdt_ice * MAX( 0._wp , zf_tt(ji) / ( zdE * rhoic ) )
445
[8325]446               e_i_1d(ji,nlay_i+1) = -zEi * rhoic                        ! New ice energy of melting (J/m3, >0)
[4688]447               
[8341]448            END DO
449            ! Contribution to Energy and Salt Fluxes                                   
[4688]450            zfmdt          = - rhoic * dh_i_bott(ji)             ! Mass flux x time step (kg/m2, < 0)
451
[5123]452            ztmelts        = - tmut * s_i_new(ji) + rt0          ! New ice melting point (K)
[4688]453           
[4872]454            zt_i_new       = zswitch_sal * t_bo_1d(ji) + ( 1. - zswitch_sal) * t_i_1d(ji, nlay_i)
[4688]455           
456            zEi            = cpic * ( zt_i_new - ztmelts ) &     ! Specific enthalpy of forming ice (J/kg, <0)     
[5123]457               &               - lfus * ( 1.0 - ( ztmelts - rt0 ) / ( zt_i_new - rt0 ) )   &
458               &               + rcp  * ( ztmelts-rt0 )         
[4688]459           
[4872]460            zEw            = rcp  * ( t_bo_1d(ji) - rt0 )         ! Specific enthalpy of seawater (J/kg, < 0)
[4688]461           
462            zdE            = zEi - zEw                           ! Specific enthalpy difference (J/kg, <0)
463           
464            ! Contribution to heat flux to the ocean [W.m-2], >0 
[4872]465            hfx_thd_1d(ji) = hfx_thd_1d(ji) + zfmdt * a_i_1d(ji) * zEw * r1_rdtice
[4688]466
467            ! Total heat flux used in this process [W.m-2], <0 
[4872]468            hfx_bog_1d(ji) = hfx_bog_1d(ji) - zfmdt * a_i_1d(ji) * zdE * r1_rdtice
[4688]469           
470            ! Contribution to salt flux, <0
[5167]471            sfx_bog_1d(ji) = sfx_bog_1d(ji) - rhoic * a_i_1d(ji) * dh_i_bott(ji) * s_i_new(ji) * r1_rdtice
[4688]472
473            ! Contribution to mass flux, <0
[4872]474            wfx_bog_1d(ji) =  wfx_bog_1d(ji) - rhoic * a_i_1d(ji) * dh_i_bott(ji) * r1_rdtice
[4688]475
476            ! update heat content (J.m-2) and layer thickness
[8325]477            eh_i_old(ji,nlay_i+1) = eh_i_old(ji,nlay_i+1) + dh_i_bott(ji) * e_i_1d(ji,nlay_i+1)
[4688]478            h_i_old (ji,nlay_i+1) = h_i_old (ji,nlay_i+1) + dh_i_bott(ji)
[8341]479
[825]480         ENDIF
[8341]481
[825]482      END DO
483
[4688]484      !----------------
485      ! 4.2 Basal melt
486      !----------------
[8373]487      zdeltah(1:nidx,:) = 0._wp ! important
[825]488      DO jk = nlay_i, 1, -1
[8342]489         DO ji = 1, nidx
[5202]490            IF(  zf_tt(ji)  >  0._wp  .AND. jk > icount(ji,jk) ) THEN   ! do not calculate where layer has already disappeared by surface melting
[825]491
[5123]492               ztmelts = - tmut * s_i_1d(ji,jk) + rt0  ! Melting point of layer jk (K)
[825]493
[4872]494               IF( t_i_1d(ji,jk) >= ztmelts ) THEN !!! Internal melting
[825]495
[8325]496                  zEi               = - e_i_1d(ji,jk) * r1_rhoic    ! Specific enthalpy of melting ice (J/kg, <0)
[4688]497                  zdE               = 0._wp                         ! Specific enthalpy difference   (J/kg, <0)
498                                                                    ! set up at 0 since no energy is needed to melt water...(it is already melted)
[5202]499                  zdeltah   (ji,jk) = MIN( 0._wp , - zh_i(ji,jk) )  ! internal melting occurs when the internal temperature is above freezing     
500                                                                    ! this should normally not happen, but sometimes, heat diffusion leads to this
[4161]501
[4688]502                  dh_i_bott (ji)    = dh_i_bott(ji) + zdeltah(ji,jk)
[825]503
[5202]504                  zfmdt             = - zdeltah(ji,jk) * rhoic      ! Mass flux x time step > 0
[825]505
[4688]506                  ! Contribution to heat flux to the ocean [W.m-2], <0 (ice enthalpy zEi is "sent" to the ocean)
[4872]507                  hfx_res_1d(ji) = hfx_res_1d(ji) + zfmdt * a_i_1d(ji) * zEi * r1_rdtice
[825]508
[4872]509                  ! Contribution to salt flux (clem: using sm_i_1d and not s_i_1d(jk) is ok)
[5167]510                  sfx_res_1d(ji) = sfx_res_1d(ji) - rhoic * a_i_1d(ji) * zdeltah(ji,jk) * sm_i_1d(ji) * r1_rdtice
[4688]511                                   
512                  ! Contribution to mass flux
[4872]513                  wfx_res_1d(ji) =  wfx_res_1d(ji) - rhoic * a_i_1d(ji) * zdeltah(ji,jk) * r1_rdtice
[825]514
[4688]515                  ! update heat content (J.m-2) and layer thickness
[8325]516                  eh_i_old(ji,jk) = eh_i_old(ji,jk) + zdeltah(ji,jk) * e_i_1d(ji,jk)
[4688]517                  h_i_old (ji,jk) = h_i_old (ji,jk) + zdeltah(ji,jk)
[825]518
[4688]519               ELSE                               !!! Basal melting
[825]520
[8325]521                  zEi             = - e_i_1d(ji,jk) * r1_rhoic ! Specific enthalpy of melting ice (J/kg, <0)
[5202]522                  zEw             = rcp * ( ztmelts - rt0 )    ! Specific enthalpy of meltwater (J/kg, <0)
523                  zdE             = zEi - zEw                  ! Specific enthalpy difference   (J/kg, <0)
[825]524
[5202]525                  zfmdt           = - zq_bo(ji) / zdE          ! Mass flux x time step (kg/m2, >0)
[825]526
[5202]527                  zdeltah(ji,jk)  = - zfmdt * r1_rhoic         ! Gross thickness change
[4688]528
[5202]529                  zdeltah(ji,jk)  = MIN( 0._wp , MAX( zdeltah(ji,jk), - zh_i(ji,jk) ) ) ! bound thickness change
[4688]530                 
[5202]531                  zq_bo(ji)       = MAX( 0._wp , zq_bo(ji) - zdeltah(ji,jk) * rhoic * zdE ) ! update available heat. MAX is necessary for roundup errors
[4688]532
[5202]533                  dh_i_bott(ji)   = dh_i_bott(ji) + zdeltah(ji,jk)    ! Update basal melt
[4688]534
[5202]535                  zfmdt           = - zdeltah(ji,jk) * rhoic          ! Mass flux x time step > 0
[4688]536
[5202]537                  zQm             = zfmdt * zEw         ! Heat exchanged with ocean
[4688]538
539                  ! Contribution to heat flux to the ocean [W.m-2], <0 
[5202]540                  hfx_thd_1d(ji)  = hfx_thd_1d(ji) + zfmdt * a_i_1d(ji) * zEw * r1_rdtice
[4688]541
[4872]542                  ! Contribution to salt flux (clem: using sm_i_1d and not s_i_1d(jk) is ok)
[5202]543                  sfx_bom_1d(ji)  = sfx_bom_1d(ji) - rhoic *  a_i_1d(ji) * zdeltah(ji,jk) * sm_i_1d(ji) * r1_rdtice
[4688]544                 
545                  ! Total heat flux used in this process [W.m-2], >0 
[5202]546                  hfx_bom_1d(ji)  = hfx_bom_1d(ji) - zfmdt * a_i_1d(ji) * zdE * r1_rdtice
[4688]547                 
548                  ! Contribution to mass flux
[5202]549                  wfx_bom_1d(ji)  =  wfx_bom_1d(ji) - rhoic * a_i_1d(ji) * zdeltah(ji,jk) * r1_rdtice
[4688]550
551                  ! update heat content (J.m-2) and layer thickness
[8325]552                  eh_i_old(ji,jk) = eh_i_old(ji,jk) + zdeltah(ji,jk) * e_i_1d(ji,jk)
[4688]553                  h_i_old (ji,jk) = h_i_old (ji,jk) + zdeltah(ji,jk)
554               ENDIF
555           
556            ENDIF
[5123]557         END DO
558      END DO
[4688]559
[825]560      !-------------------------------------------
[4688]561      ! Update temperature, energy
[825]562      !-------------------------------------------
[8342]563      DO ji = 1, nidx
[4872]564         ht_i_1d(ji) =  MAX( 0._wp , ht_i_1d(ji) + dh_i_bott(ji) )
[4688]565      END DO 
[825]566
[4688]567      !-------------------------------------------
568      ! 5. What to do with remaining energy
569      !-------------------------------------------
570      ! If heat still available for melting and snow remains, then melt more snow
571      !-------------------------------------------
[8373]572      zdeltah(1:nidx,:) = 0._wp ! important
[8342]573      DO ji = 1, nidx
[4688]574         zq_rema(ji)     = zq_su(ji) + zq_bo(ji) 
[5128]575         rswitch         = 1._wp - MAX( 0._wp, SIGN( 1._wp, - ht_s_1d(ji) ) )   ! =1 if snow
[8325]576         rswitch         = rswitch * MAX( 0._wp, SIGN( 1._wp, e_s_1d(ji,1) - epsi20 ) )
577         zdeltah  (ji,1) = - rswitch * zq_rema(ji) / MAX( e_s_1d(ji,1), epsi20 )
[5128]578         zdeltah  (ji,1) = MIN( 0._wp , MAX( zdeltah(ji,1) , - ht_s_1d(ji) ) ) ! bound melting
579         dh_s_tot (ji)   = dh_s_tot(ji)  + zdeltah(ji,1)
580         ht_s_1d   (ji)  = ht_s_1d(ji)   + zdeltah(ji,1)
581       
[8325]582         zq_rema(ji)     = zq_rema(ji) + zdeltah(ji,1) * e_s_1d(ji,1)                ! update available heat (J.m-2)
[5128]583         ! heat used to melt snow
[8325]584         hfx_snw_1d(ji)  = hfx_snw_1d(ji) - zdeltah(ji,1) * a_i_1d(ji) * e_s_1d(ji,1) * r1_rdtice ! W.m-2 (>0)
[5128]585         ! Contribution to mass flux
[8233]586         wfx_snw_sum_1d(ji)  =  wfx_snw_sum_1d(ji) - rhosn * a_i_1d(ji) * zdeltah(ji,1) * r1_rdtice
[5128]587         !   
[4688]588         ! Remaining heat flux (W.m-2) is sent to the ocean heat budget
[8326]589         hfx_out_1d(ji)  = hfx_out_1d(ji) + ( zq_rema(ji) * a_i_1d(ji) ) * r1_rdtice
[825]590
[7646]591         IF( ln_limctl .AND. zq_rema(ji) < 0. .AND. lwp ) WRITE(numout,*) 'ALERTE zq_rema <0 = ', zq_rema(ji)
[4688]592      END DO
[8239]593
[921]594      !
595      !------------------------------------------------------------------------------|
596      !  6) Snow-Ice formation                                                       |
597      !------------------------------------------------------------------------------|
[1572]598      ! When snow load excesses Archimede's limit, snow-ice interface goes down under sea-level,
599      ! flooding of seawater transforms snow into ice dh_snowice is positive for the ice
[8342]600      DO ji = 1, nidx
[1572]601         !
[4872]602         dh_snowice(ji) = MAX(  0._wp , ( rhosn * ht_s_1d(ji) + (rhoic-rau0) * ht_i_1d(ji) ) / ( rhosn+rau0-rhoic )  )
[825]603
[5167]604         ht_i_1d(ji)    = ht_i_1d(ji) + dh_snowice(ji)
605         ht_s_1d(ji)    = ht_s_1d(ji) - dh_snowice(ji)
[825]606
[4688]607         ! Contribution to energy flux to the ocean [J/m2], >0 (if sst<0)
[7646]608         zfmdt          = ( rhosn - rhoic ) * dh_snowice(ji)    ! <0
[8326]609         zEw            = rcp * sst_1d(ji)
[4688]610         zQm            = zfmdt * zEw 
611         
612         ! Contribution to heat flux
[4872]613         hfx_thd_1d(ji) = hfx_thd_1d(ji) + zfmdt * a_i_1d(ji) * zEw * r1_rdtice 
[825]614
[4688]615         ! Contribution to salt flux
[8326]616         sfx_sni_1d(ji) = sfx_sni_1d(ji) + sss_1d(ji) * a_i_1d(ji) * zfmdt * r1_rdtice 
[7646]617
[6470]618         ! virtual salt flux to keep salinity constant
619         IF( nn_icesal == 1 .OR. nn_icesal == 3 )  THEN
[8326]620            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
[8369]621               &                            - sm_i_1d(ji) * a_i_1d(ji) * dh_snowice(ji) * rhoic * r1_rdtice    ! and get  rn_icesal from the ocean
[6470]622         ENDIF
623
[4688]624         ! Contribution to mass flux
625         ! All snow is thrown in the ocean, and seawater is taken to replace the volume
[8341]626         wfx_sni_1d(ji)     = wfx_sni_1d(ji)     - a_i_1d(ji) * dh_snowice(ji) * rhoic * r1_rdtice
627         wfx_snw_sni_1d(ji) = wfx_snw_sni_1d(ji) + a_i_1d(ji) * dh_snowice(ji) * rhosn * r1_rdtice
[4688]628
629         ! update heat content (J.m-2) and layer thickness
[8325]630         eh_i_old(ji,0) = eh_i_old(ji,0) + dh_snowice(ji) * e_s_1d(ji,1) + zfmdt * zEw
[4688]631         h_i_old (ji,0) = h_i_old (ji,0) + dh_snowice(ji)
632         
[5134]633      END DO
[825]634
[2715]635      !
[4688]636      !-------------------------------------------
637      ! Update temperature, energy
638      !-------------------------------------------
[8342]639      DO ji = 1, nidx
[4990]640         rswitch     =  1.0 - MAX( 0._wp , SIGN( 1._wp , - ht_i_1d(ji) ) ) 
[5123]641         t_su_1d(ji) =  rswitch * t_su_1d(ji) + ( 1.0 - rswitch ) * rt0
[5134]642      END DO
[4688]643
644      DO jk = 1, nlay_s
[8342]645         DO ji = 1,nidx
[4688]646            ! mask enthalpy
[5134]647            rswitch       = 1._wp - MAX(  0._wp , SIGN( 1._wp, - ht_s_1d(ji) )  )
[8325]648            e_s_1d(ji,jk) = rswitch * e_s_1d(ji,jk)
649            ! recalculate t_s_1d from e_s_1d
650            t_s_1d(ji,jk) = rt0 + rswitch * ( - e_s_1d(ji,jk) / ( rhosn * cpic ) + lfus / cpic )
[4688]651         END DO
652      END DO
[5134]653
654      ! --- ensure that a_i = 0 where ht_i = 0 ---
[8369]655      DO ji = 1, nidx
656         IF( ht_i_1d(ji) == 0._wp )   a_i_1d(ji) = 0._wp
[8373]657      END DO         
[2715]658      !
[921]659   END SUBROUTINE lim_thd_dh
[5407]660
661
662   !!--------------------------------------------------------------------------
663   !! INTERFACE lim_thd_snwblow
664   !! ** Purpose :   Compute distribution of precip over the ice
665   !!--------------------------------------------------------------------------
666   SUBROUTINE lim_thd_snwblow_2d( pin, pout )
[8313]667      REAL(wp), DIMENSION(:,:), INTENT(in   ) :: pin   ! previous fraction lead ( 1. - a_i_b )
[5487]668      REAL(wp), DIMENSION(:,:), INTENT(inout) :: pout
[5407]669      pout = ( 1._wp - ( pin )**rn_betas )
670   END SUBROUTINE lim_thd_snwblow_2d
671
672   SUBROUTINE lim_thd_snwblow_1d( pin, pout )
[5487]673      REAL(wp), DIMENSION(:), INTENT(in   ) :: pin
674      REAL(wp), DIMENSION(:), INTENT(inout) :: pout
[5407]675      pout = ( 1._wp - ( pin )**rn_betas )
676   END SUBROUTINE lim_thd_snwblow_1d
677
[1572]678   
[825]679#else
[1572]680   !!----------------------------------------------------------------------
681   !!   Default option                               NO  LIM3 sea-ice model
682   !!----------------------------------------------------------------------
[825]683CONTAINS
684   SUBROUTINE lim_thd_dh          ! Empty routine
685   END SUBROUTINE lim_thd_dh
686#endif
[1572]687
688   !!======================================================================
[921]689END MODULE limthd_dh
Note: See TracBrowser for help on using the repository browser.