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.
Changeset 8906 – NEMO

Changeset 8906


Ignore:
Timestamp:
2017-12-05T18:24:20+01:00 (6 years ago)
Author:
clem
Message:

make melt ponds from Holland2012 and associated freshwater flux conservative

Location:
branches/2017/dev_CNRS_2017/NEMOGCM
Files:
6 edited

Legend:

Unmodified
Added
Removed
  • branches/2017/dev_CNRS_2017/NEMOGCM/CONFIG/ORCA2_LIM3_PISCES/EXP00/file_def_nemo-lim.xml

    r8882 r8906  
    1414   <file_group id="5d" output_freq="5d"  output_level="10" enabled=".TRUE.">  <!-- 5d files -->     
    1515     <file id="file21" name_suffix="_icemod" description="ice variables" enabled=".true." > 
    16        <field field_ref="snothic"         name="snthic" /> 
     16       <field field_ref="snwthic"         name="snthic" /> 
    1717       <field field_ref="icethic"         name="sithic" /> 
    1818       <field field_ref="icevolu"         name="sivolu" /> 
    19        <field field_ref="snowvol"         name="snvolu" /> 
     19       <field field_ref="snwvolu"         name="snvolu" /> 
    2020       <field field_ref="iceconc"         name="siconc" /> 
    2121     </file> 
  • branches/2017/dev_CNRS_2017/NEMOGCM/NEMO/LIM_SRC_3/icedyn_rdgrft.F90

    r8882 r8906  
    669669               ! Put the melt pond water into the ocean 
    670670               !------------------------------------------             
    671                IF ( ln_pnd_fwb ) THEN 
    672                   wfx_pnd_1d(ji) = wfx_pnd_1d(ji) + ( rhofw * vprdg(ji) * ( 1._wp - rn_fpndrdg )   &        ! fresh water source for ocean 
    673                      &                              + rhofw * vprft(ji) * ( 1._wp - rn_fpndrft ) ) * r1_rdtice 
    674                ENDIF 
     671               ! clem: I think the following lines must be commented since there 
     672               !       is no net mass flux between melt ponds and the ocean (see icethd_pnd.F90 for ex.) 
     673               !IF ( ln_pnd_fwb ) THEN 
     674               !   wfx_pnd_1d(ji) = wfx_pnd_1d(ji) + ( rhofw * vprdg(ji) * ( 1._wp - rn_fpndrdg )   &        ! fresh water source for ocean 
     675               !      &                              + rhofw * vprft(ji) * ( 1._wp - rn_fpndrft ) ) * r1_rdtice 
     676               !ENDIF 
    675677 
    676678               ! virtual salt flux to keep salinity constant 
  • branches/2017/dev_CNRS_2017/NEMOGCM/NEMO/LIM_SRC_3/iceforcing.F90

    r8889 r8906  
    138138      ! 
    139139      CASE( jp_usr )                !--- user defined formulation 
    140                                 CALL usrdef_sbc_ice_flx( kt ) 
     140                                  CALL usrdef_sbc_ice_flx( kt ) 
    141141         ! 
    142142      CASE( jp_blk )                !--- bulk formulation 
    143                                 CALL blk_ice_flx( t_su, h_s, h_i, alb_ice )    !  
    144          IF( ln_mixcpl       )  CALL sbc_cpl_ice_flx( picefr=at_i_b, palbi=alb_ice, psst=sst_m, pist=t_su, phs=h_s, phi=h_i ) 
    145          IF( nn_flxdist /= 2 )  CALL ice_flx_dist( t_su, alb_ice, qns_ice, qsr_ice, dqns_ice, evap_ice, devap_ice, nn_flxdist ) 
     143                                  CALL blk_ice_flx( t_su, h_s, h_i, alb_ice )    !  
     144         IF( ln_mixcpl        )   CALL sbc_cpl_ice_flx( picefr=at_i_b, palbi=alb_ice, psst=sst_m, pist=t_su, phs=h_s, phi=h_i ) 
     145         IF( nn_flxdist /= -1 )   CALL ice_flx_dist( t_su, alb_ice, qns_ice, qsr_ice, dqns_ice, evap_ice, devap_ice, nn_flxdist ) 
    146146         ! 
    147147      CASE ( jp_purecpl )           !--- coupled formulation 
    148                                 CALL sbc_cpl_ice_flx( picefr=at_i_b, palbi=alb_ice, psst=sst_m, pist=t_su, phs=h_s, phi=h_i ) 
    149          IF( nn_flxdist == 2 )  CALL ice_flx_dist( t_su, alb_ice, qns_ice, qsr_ice, dqns_ice, evap_ice, devap_ice, nn_flxdist ) 
     148                                  CALL sbc_cpl_ice_flx( picefr=at_i_b, palbi=alb_ice, psst=sst_m, pist=t_su, phs=h_s, phi=h_i ) 
     149         IF( nn_flxdist /= -1 )   CALL ice_flx_dist( t_su, alb_ice, qns_ice, qsr_ice, dqns_ice, evap_ice, devap_ice, nn_flxdist ) 
    150150         ! 
    151151      END SELECT 
     
    294294      CASE( -1  ) 
    295295         IF(lwp) WRITE(numout,*) '   ESIM: use per-category fluxes (nn_flxdist = -1) ' 
    296          IF( ln_cpl )   CALL ctl_stop( 'ice_thd_init : the chosen nn_flxdist for ESIM in coupled mode must be 0 or 2' ) 
    297296      CASE(  0  ) 
    298297         IF(lwp) WRITE(numout,*) '   ESIM: use average per-category fluxes (nn_flxdist = 0) ' 
    299298      CASE(  1  ) 
    300299         IF(lwp) WRITE(numout,*) '   ESIM: use average then redistribute per-category fluxes (nn_flxdist = 1) ' 
    301          IF( ln_cpl )   CALL ctl_stop( 'ice_thd_init : the chosen nn_flxdist for ESIM in coupled mode must be 0 or 2' ) 
     300         IF( ln_cpl )         CALL ctl_stop( 'ice_thd_init: the chosen nn_flxdist for ESIM in coupled mode must be /=1' ) 
    302301      CASE(  2  ) 
    303302         IF(lwp) WRITE(numout,*) '   ESIM: Redistribute a single flux over categories (nn_flxdist = 2) ' 
    304          IF( .NOT. ln_cpl )   CALL ctl_stop( 'ice_thd_init : the chosen nn_flxdist for ESIM in forced mode cannot be 2' ) 
     303         IF( .NOT. ln_cpl )   CALL ctl_stop( 'ice_thd_init: the chosen nn_flxdist for ESIM in forced mode must be /=2' ) 
    305304      CASE DEFAULT 
    306305         CALL ctl_stop( 'ice_thd_init: ESIM option, nn_flxdist, should be between -1 and 2' ) 
  • branches/2017/dev_CNRS_2017/NEMOGCM/NEMO/LIM_SRC_3/iceitd.F90

    r8885 r8906  
    296296         ! 7) Make sure h_i >= minimum ice thickness hi_min 
    297297         !---------------------------------------------------------------------------------------------- 
    298          CALL tab_2d_1d( npti, nptidx(1:npti), h_i_1d (1:npti), h_i(:,:,1)  ) 
    299          CALL tab_2d_1d( npti, nptidx(1:npti), a_i_1d  (1:npti), a_i(:,:,1)    ) 
    300          CALL tab_2d_1d( npti, nptidx(1:npti), a_ip_1d (1:npti), a_ip(:,:,1)  ) 
     298         CALL tab_2d_1d( npti, nptidx(1:npti), h_i_1d (1:npti), h_i (:,:,1) ) 
     299         CALL tab_2d_1d( npti, nptidx(1:npti), a_i_1d (1:npti), a_i (:,:,1) ) 
     300         CALL tab_2d_1d( npti, nptidx(1:npti), a_ip_1d(1:npti), a_ip(:,:,1) ) 
    301301         ! 
    302302         DO ji = 1, npti 
    303303            IF ( a_i_1d(ji) > epsi10 .AND. h_i_1d(ji) < rn_himin ) THEN 
    304304               a_i_1d (ji) = a_i_1d(ji) * h_i_1d(ji) / rn_himin  
    305                IF ( ln_pnd_H12 )    a_ip_1d(ji) = a_ip_1d(ji) * h_i_1d(ji) / rn_himin 
     305               IF( ln_pnd_H12 )   a_ip_1d(ji) = a_ip_1d(ji) * h_i_1d(ji) / rn_himin 
    306306               h_i_1d(ji) = rn_himin 
    307307            ENDIF 
    308308         END DO 
    309309         ! 
    310          CALL tab_1d_2d( npti, nptidx(1:npti), h_i_1d (1:npti), h_i(:,:,1)  ) 
    311          CALL tab_1d_2d( npti, nptidx(1:npti), a_i_1d  (1:npti), a_i(:,:,1)    ) 
    312          CALL tab_1d_2d( npti, nptidx(1:npti), a_ip_1d (1:npti), a_ip(:,:,1)  ) 
     310         CALL tab_1d_2d( npti, nptidx(1:npti), h_i_1d (1:npti), h_i (:,:,1) ) 
     311         CALL tab_1d_2d( npti, nptidx(1:npti), a_i_1d (1:npti), a_i (:,:,1) ) 
     312         CALL tab_1d_2d( npti, nptidx(1:npti), a_ip_1d(1:npti), a_ip(:,:,1) ) 
    313313         ! 
    314314      ENDIF 
  • branches/2017/dev_CNRS_2017/NEMOGCM/NEMO/LIM_SRC_3/icethd_pnd.F90

    r8882 r8906  
    125125      !!                 pond contraction: Vp = Vp * exp(0.01*MAX(Tp-Tsu,0)/Tp) 
    126126      !!                    with Tp = -2degC 
    127       !! 
     127      !!   
    128128      !! ** Tunable parameters : (no real expertise yet, ideas?) 
    129129      !!  
     
    136136      !!     
    137137      !!------------------------------------------------------------------- 
    138       REAL(wp), PARAMETER ::   zrmin  = 0.15_wp  ! minimum fraction of available meltwater retained for melt ponding 
    139       REAL(wp), PARAMETER ::   zrmax  = 0.70_wp  ! maximum   ''           ''       ''        ''            '' 
    140       REAL(wp), PARAMETER ::   zpnd_aspect = 0.8_wp ! pond aspect ratio 
    141       REAL(wp), PARAMETER ::   zTp = -2._wp !  
    142  
    143       REAL(wp) ::   zfr_mlt            ! fraction of available meltwater retained for melt ponding 
     138      REAL(wp), PARAMETER ::   zrmin       = 0.15_wp  ! minimum fraction of available meltwater retained for melt ponding 
     139      REAL(wp), PARAMETER ::   zrmax       = 0.70_wp  ! maximum   ''           ''       ''        ''            '' 
     140      REAL(wp), PARAMETER ::   zpnd_aspect = 0.8_wp   ! pond aspect ratio 
     141      REAL(wp), PARAMETER ::   zTp         = -2._wp   ! reference temperature 
     142 
     143      REAL(wp) ::   zfr_mlt          ! fraction of available meltwater retained for melt ponding 
    144144      REAL(wp) ::   zdv_mlt          ! available meltwater for melt ponding 
    145       REAL(wp) ::   z1_Tp        ! reference temperature 
    146       REAL(wp) ::   z1_rhofw          ! inverse freshwater density 
    147       REAL(wp) ::   z1_zpnd_aspect    ! inverse pond aspect ratio 
    148       REAL(wp) ::   zvpnd            ! dummy pond volume 
     145      REAL(wp) ::   z1_Tp            ! inverse reference temperature 
     146      REAL(wp) ::   z1_rhofw         ! inverse freshwater density 
     147      REAL(wp) ::   z1_zpnd_aspect   ! inverse pond aspect ratio 
    149148      REAL(wp) ::   zfac, zdum 
    150149 
    151       INTEGER  ::   ji        ! loop indices 
     150      INTEGER  ::   ji   ! loop indices 
    152151      !!------------------------------------------------------------------- 
    153152      z1_rhofw       = 1. / rhofw  
     
    159158         IF( h_i_1d(ji) < rn_himin) THEN                          ! Case ice thickness < rn_himin  ! 
    160159            !                                                     !--------------------------------! 
    161             !--- Remove ponds on thin ice and send water into the ocean 
    162             IF( ln_pnd_fwb ) THEN 
    163                wfx_pnd_1d(ji) = wfx_pnd_1d(ji) + h_ip_1d(ji) * a_ip_1d(ji) * rhofw * r1_rdtice 
    164             ENDIF 
     160            !--- Remove ponds on thin ice 
    165161            a_ip_1d(ji)      = 0._wp 
    166162            a_ip_frac_1d(ji) = 0._wp 
     
    170166            !                                                     !--------------------------------! 
    171167            v_ip_1d(ji) = h_ip_1d(ji) * a_ip_1d(ji)   ! record pond volume at previous time step 
    172             zvpnd       = v_ip_1d(ji) 
    173168 
    174169            ! available meltwater for melt ponding [m, >0] and fraction 
    175170            zdv_mlt = -( dh_i_surf(ji)*rhoic + dh_s_mlt(ji)*rhosn ) * z1_rhofw * a_i_1d(ji) 
    176             zfr_mlt = zrmin + ( zrmax - zrmin ) * a_i_1d(ji)  !!clem CICE doc 
    177 !!!            zfr_mlt = zrmin + zrmax * a_i_1d(ji)  !!clem Holland paper  
    178  
    179             !--- Pond gowth 
     171            zfr_mlt = zrmin + ( zrmax - zrmin ) * a_i_1d(ji)  ! from CICE doc 
     172            !zfr_mlt = zrmin + zrmax * a_i_1d(ji)             ! from Holland paper  
     173 
     174            !--- Pond gowth ---! 
    180175            ! v_ip should never be negative, otherwise code crashes 
    181176            ! MV: as far as I saw, UM5 can create very small negative v_ip values (not Prather) 
    182177            v_ip_1d(ji) = MAX( 0._wp, v_ip_1d(ji) + zfr_mlt * zdv_mlt ) 
    183178 
     179            ! melt pond mass flux (<0) 
    184180            IF( ln_pnd_fwb .AND. zdv_mlt > 0._wp ) THEN 
    185                ! melt ponds mass flux (<0) 
    186181               zfac = zfr_mlt * zdv_mlt * rhofw * r1_rdtice 
    187182               wfx_pnd_1d(ji) = wfx_pnd_1d(ji) - zfac 
    188183 
    189                ! adjust ice/snow melting (>0) to take into account ponding 
     184               ! adjust ice/snow melting flux to balance melt pond flux (>0) 
    190185               zdum = zfac / ( wfx_snw_sum_1d(ji) + wfx_sum_1d(ji) ) 
    191186               wfx_snw_sum_1d(ji) = wfx_snw_sum_1d(ji) * (1._wp + zdum) 
     
    193188            ENDIF 
    194189 
    195             !--- Pond contraction (due to refreezing) 
    196             v_ip_1d(ji)      = v_ip_1d(ji) * EXP( 0.01_wp * MAX( zTp+rt0 - t_su_1d(ji), 0._wp ) * z1_Tp ) 
    197  
    198             ! --- Set new pond area and depth assuming linear relation between h_ip and a_ip_frac 
    199             !        h_ip = zpnd_aspect * a_ip_frac = zpnd_aspect * a_ip/a_i 
     190            !--- Pond contraction (due to refreezing) ---! 
     191            v_ip_1d(ji) = v_ip_1d(ji) * EXP( 0.01_wp * MAX( zTp+rt0 - t_su_1d(ji), 0._wp ) * z1_Tp ) 
     192 
     193            ! Set new pond area and depth assuming linear relation between h_ip and a_ip_frac 
     194            !    h_ip = zpnd_aspect * a_ip_frac = zpnd_aspect * a_ip/a_i 
    200195            a_ip_1d(ji)      = SQRT( v_ip_1d(ji) * z1_zpnd_aspect * a_i_1d(ji) ) 
    201             !NB: the SQRT has been a recurring source of crash when v_ip or a_i tuns to be even only slightly negative 
    202196            a_ip_frac_1d(ji) = a_ip_1d(ji) / a_i_1d(ji) 
    203197            h_ip_1d(ji)      = zpnd_aspect * a_ip_frac_1d(ji) 
    204  
    205             !! clem: there is no clever way to conserve mass here... 
    206              
    207 !            IF( ln_pnd_fwb ) THEN 
    208 !               ! melt ponds mass flux (>0 when ponds shrink) 
    209 !               zfac = ( v_ip_1d(ji) - zvpnd ) * rhofw * r1_rdtice 
    210 !               wfx_pnd_1d(ji) = wfx_pnd_1d(ji) - zfac!! 
    211 ! 
    212 !               ! adjust ice/snow 
    213 !               zfac = ( v_ip_1d(ji) - zvpnd ) * rhofw / ( a_i_1d(ji)*h_s_1d(ji)*rhosn + a_i_1d(ji)*h_i_1d(ji)*rhoic )! 
    214 ! 
    215 !               wfx_snw_sum_1d(ji) = wfx_snw_sum_1d(ji) + h_s_1d(ji) * zfac * a_i_1d(ji) * rhosn * r1_rdtice 
    216 !               wfx_sum_1d(ji)     = wfx_sum_1d(ji)     + h_i_1d(ji) * zfac * a_i_1d(ji) * rhoic * r1_rdtice 
    217 !                
    218 !               !!h_s_1d(ji) = h_s_1d(ji) * ( 1._wp + zfac ) 
    219 !               !!h_i_1d(ji) = h_i_1d(ji) * ( 1._wp + zfac )! 
    220 ! 
    221 !            ENDIF 
    222198 
    223199         ENDIF 
  • branches/2017/dev_CNRS_2017/NEMOGCM/NEMO/LIM_SRC_3/icevar.F90

    r8885 r8906  
    479479               wfx_res(ji,jj)  = wfx_res(ji,jj) + (1._wp - zswitch(ji,jj) ) * v_s (ji,jj,jl)   * rhosn * r1_rdtice 
    480480               hfx_res(ji,jj)  = hfx_res(ji,jj) - (1._wp - zswitch(ji,jj) ) * e_s (ji,jj,1,jl) * r1_rdtice ! W.m-2 <0 
    481                IF( ln_pnd_fwb ) THEN  
    482                   wfx_res(ji,jj)  = wfx_res(ji,jj) + (1._wp - zswitch(ji,jj) ) * v_ip(ji,jj,jl) * rhofw * r1_rdtice 
    483                ENDIF 
    484481               !----------------------------------------------------------------- 
    485482               ! Zap snow energy  
Note: See TracChangeset for help on using the changeset viewer.