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

Ignore:
Timestamp:
2020-02-24T18:04:40+01:00 (4 years ago)
Author:
dancopsey
Message:
  • Snow into meltponds contributes to snow to ice diagnostics affecting thickness and salinity of the ice.
  • Avoid divide by zero errors by:
    • Removing meltponds from small ice areas.
    • Removing divide by pond fractions apart from lid shrinking there a minimum pond fraction is imnposed
  • Ponds leaking into the ocean have a salinity flux to the ocean (also a new diagnostic).
  • Add vertical fluxing of pond water.
File:
1 edited

Legend:

Unmodified
Added
Removed
  • NEMO/branches/UKMO/NEMO_4.0_add_pond_lids_prints/src/ICE/icethd_pnd.F90

    r12439 r12449  
    3939 
    4040   REAL(wp), PUBLIC, PARAMETER :: a_pnd_avail = 0.7_wp   ! Fraction of sea ice available for melt ponding 
    41    REAL(wp), PUBLIC, PARAMETER :: pnd_lid_max = 0.015    !  pond lid thickness above which the ponds disappear from the albedo calculation 
    42    REAL(wp), PUBLIC, PARAMETER :: pnd_lid_min = 0.005    !  pond lid thickness below which the full pond area is used in the albedo calculation 
    43  
    44    REAL(wp), PARAMETER :: snow_lid_min = 0.15  ! Snow thickness above which form a lid of size pnd_lid_min on the melt ponds 
    45    REAL(wp), PARAMETER :: snow_lid_max = 0.25  ! Snow thickness above which form a lid of size pnd_lid_max on the melt ponds 
     41   REAL(wp), PUBLIC, PARAMETER :: pnd_lid_max = 0.015_wp !  pond lid thickness above which the ponds disappear from the albedo calculation 
     42   REAL(wp), PUBLIC, PARAMETER :: pnd_lid_min = 0.005_wp !  pond lid thickness below which the full pond area is used in the albedo calculation 
     43 
     44   REAL(wp), PARAMETER :: viscosity_dyn = 1.79e-3_wp 
    4645 
    4746   !! * Substitutions 
     
    138137      ! 
    139138      REAL(wp) ::   zfr_mlt          ! fraction of available meltwater retained for melt ponding 
    140       REAL(wp) ::   zdh_mlt          ! available meltwater for melt ponding (equivalent thickness change) 
     139      REAL(wp) ::   zdv_mlt          ! available meltwater for melt ponding (equivalent volume change) 
    141140      REAL(wp) ::   z1_Tp            ! inverse reference temperature 
    142141      REAL(wp) ::   z1_rhow          ! inverse freshwater density 
     
    151150      REAL(wp) ::   dh_i_pndleak     ! Grid box mean change in water depth due to leaking back to the ocean 
    152151      REAL(wp) ::   weighted_lid_snow ! Lid to go on ponds under snow if snow thickness exceeds snow_lid_min 
    153       ! 
    154       INTEGER  ::   ji   ! loop indices 
     152      REAL(wp) ::   h_gravity_head   ! Height above sea level of the top of the melt pond 
     153      REAL(wp) ::   h_percolation    ! Distance between the base of the melt pond and the base of the sea ice 
     154      REAL(wp) ::   Sbr              ! Brine salinity 
     155      REAL(wp), DIMENSION(nlay_i) ::   phi     ! liquid fraction 
     156      REAL(wp) ::   perm             ! Permeability of the sea ice 
     157      REAL(wp) ::   drain            ! Amount of melt pond draining the sea ice per m2 
     158      REAL(wp) ::   za_ip            ! Temporary pond fraction 
     159  
     160      ! 
     161      INTEGER  ::   ji, jk   ! loop indices 
    155162      !!------------------------------------------------------------------- 
    156163      z1_rhow        = 1._wp / rhow  
     
    168175         END IF 
    169176 
    170          !                                                        !--------------------------------! 
    171          IF( h_i_1d(ji) < rn_himin) THEN                          ! Case ice thickness < rn_himin ! 
    172             !                                                     !--------------------------------! 
    173             !--- Remove ponds on thin ice 
     177         !                                                            !----------------------------------------------------! 
     178         IF( h_i_1d(ji) < rn_himin .OR. a_i_1d(ji) < epsi10 ) THEN    ! Case ice thickness < rn_himin or tiny ice fraction ! 
     179            !                                                         !----------------------------------------------------! 
     180            !--- Remove ponds on thin ice or tiny ice fractions 
    174181            a_ip_1d(ji)      = 0._wp 
    175182            a_ip_frac_1d(ji) = 0._wp 
     
    177184            lh_ip_1d(ji)     = 0._wp 
    178185 
    179             zdh_mlt = 0._wp 
     186            zdv_mlt = 0._wp 
    180187            zdh_frz = 0._wp 
    181188            !                                                     !--------------------------------! 
     
    183190            !                                                     !--------------------------------! 
    184191            v_ip_1d(ji) = h_ip_1d(ji) * a_ip_1d(ji)   ! record pond volume at previous time step 
     192 
     193            ! To avoid divide by zero errors in some calculations we will use a temporary pond fraction variable that has a minimum value of epsi06 
     194            za_ip = a_ip_1d(ji) 
     195            IF ( za_ip < epsi06 ) za_ip = epsi06 
    185196            ! 
    186197            ! available meltwater for melt ponding 
    187             ! This is the change in ice thickness due to melt scaled up by the realive areas of the meltpond 
    188             ! and the area of sea ice feeding the melt ponds. 
    189             zdh_mlt = -(dh_i_pnd(ji)*rhoi + dh_s_pnd(ji)*rhos) * z1_rhow * a_i_1d(ji) / a_ip_1d(ji) 
     198            ! This is the change in ice volume due to melt 
     199            zdv_mlt = -(dh_i_pnd(ji)*rhoi + dh_s_pnd(ji)*rhos) * z1_rhow * a_i_1d(ji) 
    190200            ! 
    191201            !--- Pond gowth ---! 
    192             v_ip_1d(ji) = v_ip_1d(ji) + zdh_mlt * a_ip_1d(ji) 
     202            v_ip_1d(ji) = v_ip_1d(ji) + zdv_mlt 
    193203            ! 
    194204            !--- Lid shrinking. ---! 
    195             lh_ip_1d(ji) = lh_ip_1d(ji) - zdh_mlt 
     205            lh_ip_1d(ji) = lh_ip_1d(ji) - zdv_mlt / za_ip 
    196206            ! 
    197207            ! 
     
    231241            h_ip_1d(ji)      = zpnd_aspect * a_ip_frac_1d(ji) 
    232242 
     243            ! If pond area exceeds a_pnd_avail_1d(ji) * a_i_1d(ji) then reduce the pond volume 
     244            IF ( a_ip_1d(ji) > a_pnd_avail_1d(ji) * a_i_1d(ji) ) THEN 
     245                v_ip_old = v_ip_1d(ji)   ! Save original volume before leak for future use 
     246                h_ip_1d(ji) = zpnd_aspect * a_pnd_avail_1d(ji) 
     247                a_ip_1d(ji) = a_pnd_avail_1d(ji) * a_i_1d(ji) 
     248                v_ip_1d(ji) = h_ip_1d(ji) * a_ip_1d(ji) 
     249                a_ip_frac_1d(ji) = a_ip_1d(ji) / a_i_1d(ji) 
     250 
     251                ! A change in volume of a melt pond is equivalent to a change in water depth in the grid box mean. 
     252                ! Scale this up to make water depth meaned over sea ice. 
     253                dh_i_pndleak = (v_ip_1d(ji) - v_ip_old) / a_i_1d(ji)   ! This will be a negative number 
     254 
     255                ! Output this water loss as a mass flux diagnostic 
     256                wfx_pnd_1d(ji) = wfx_pnd_1d(ji) - rhow * a_i_1d(ji) * dh_i_pndleak * r1_rdtice 
     257 
     258                ! Reduce the ice thickness using densities to convert from a water depth difference to a sea ice thickness difference 
     259                h_i_1d(ji) =  MAX( 0._wp , h_i_1d(ji) + dh_i_pndleak * rhow * z1_rhoi ) 
     260 
     261                ! Pass this as a salinity flux to the ocean 
     262                sfx_pnd_1d(ji) = sfx_pnd_1d(ji) - rhow * a_i_1d(ji) * dh_i_pndleak * s_i_1d(ji) * r1_rdtice 
     263            ENDIF 
     264 
     265            ! If pond depth exceeds half the ice thickness then reduce the pond volume 
     266            IF ( h_ip_1d(ji) > 0.5_wp * h_i_1d(ji) ) THEN 
     267                v_ip_old = v_ip_1d(ji)   ! Save original volume before leak for future use 
     268                h_ip_1d(ji) = 0.5_wp * h_i_1d(ji) 
     269                a_ip_frac_1d(ji) = h_ip_1d(ji) / zpnd_aspect 
     270                a_ip_1d(ji) = a_ip_frac_1d(ji) * a_i_1d(ji) 
     271                v_ip_1d(ji) = h_ip_1d(ji) * a_ip_1d(ji) 
     272 
     273                ! A change in volume of a melt pond is equivalent to a change in water depth in the grid box mean. 
     274                ! Scale this up to make water depth meaned over sea ice. 
     275                dh_i_pndleak = (v_ip_1d(ji) - v_ip_old) / a_i_1d(ji)   ! This will be a negative number 
     276 
     277                ! Output this water loss as a mass flux diagnostic 
     278                wfx_pnd_1d(ji) = wfx_pnd_1d(ji) - rhow * a_i_1d(ji) * dh_i_pndleak * r1_rdtice 
     279 
     280                ! Reduce the ice thickness using densities to convert from a water depth difference to a sea ice thickness difference 
     281                h_i_1d(ji) =  MAX( 0._wp , h_i_1d(ji) + dh_i_pndleak * rhow * z1_rhoi ) 
     282 
     283                ! Pass this as a salinity flux to the ocean 
     284                sfx_pnd_1d(ji) = sfx_pnd_1d(ji) - rhow * a_i_1d(ji) * dh_i_pndleak * s_i_1d(ji) * r1_rdtice 
     285            ENDIF 
     286 
     287            !-- Vertical flushing of pond water --! 
     288            ! The height above sea level of the top of the melt pond is the ratios of density of ice and water times the ice depth. 
     289            ! This assumes the pond is sitting on top of the ice. 
     290            h_gravity_head = h_i_1d(ji) * (rhow - rhoi) * z1_rhow 
     291 
     292            ! The depth through which water percolates is the distance under the melt pond 
     293            h_percolation = h_i_1d(ji) - h_ip_1d(ji) 
     294 
     295            ! Calculate the permeability of the ice (Assur 1958) 
     296            DO jk = 1, nlay_i 
     297                Sbr = - 1.2_wp                         & 
     298                      - 21.8_wp     * (t_i_1d(ji,jk)-rt0)    & 
     299                      - 0.919_wp    * (t_i_1d(ji,jk)-rt0)**2 & 
     300                      - 0.01878_wp  * (t_i_1d(ji,jk)-rt0)**3 
     301                phi(jk) = sz_i_1d(ji,jk)/Sbr 
     302            END DO 
     303            perm = 3.0e-08_wp * (minval(phi))**3 
     304 
     305            ! Do the drainage using Darcy's law 
     306            IF ( perm > 0._wp ) THEN 
     307                drain = perm*rhow*grav*h_gravity_head*rdt_ice / (viscosity_dyn*h_percolation) 
     308 
     309                v_ip_old = v_ip_1d(ji)   ! Save original volume before leak for future use 
     310                h_ip_1d(ji) = h_ip_1d(ji) - drain 
     311                a_ip_frac_1d(ji) = h_ip_1d(ji) / zpnd_aspect 
     312                a_ip_1d(ji) = a_ip_frac_1d(ji) * a_i_1d(ji) 
     313                v_ip_1d(ji) = h_ip_1d(ji) * a_ip_1d(ji) 
     314 
     315                ! A change in volume of a melt pond is equivalent to a change in water depth in the grid box mean. 
     316                ! Scale this up to make water depth meaned over sea ice. 
     317                dh_i_pndleak = (v_ip_1d(ji) - v_ip_old) / a_i_1d(ji)   ! This will be a negative number 
     318 
     319                ! Output this water loss as a mass flux diagnostic 
     320                wfx_pnd_1d(ji) = wfx_pnd_1d(ji) - rhow * a_i_1d(ji) * dh_i_pndleak * r1_rdtice 
     321 
     322                ! Reduce the ice thickness using densities to convert from a water depth difference to a sea ice thickness difference 
     323                h_i_1d(ji) =  MAX( 0._wp , h_i_1d(ji) + dh_i_pndleak * rhow * z1_rhoi ) 
     324 
     325                ! Pass this as a salinity flux to the ocean 
     326                sfx_pnd_1d(ji) = sfx_pnd_1d(ji) - rhow * a_i_1d(ji) * dh_i_pndleak * s_i_1d(ji) * r1_rdtice 
     327            ENDIF 
     328 
    233329            ! If lid thickness is ten times greater than pond thickness then remove pond             
    234330            IF ( lh_ip_1d(ji) > h_ip_1d(ji) * 10._wp ) THEN 
     
    240336            END IF 
    241337 
    242             ! If pond area exceeds a_pnd_avail_1d(ji) * a_i_1d(ji) then reduce the pond volume 
    243             IF ( a_ip_1d(ji) > a_pnd_avail_1d(ji) * a_i_1d(ji) ) THEN 
    244                 v_ip_old = v_ip_1d(ji)   ! Save original volume before leak for future use 
    245                 h_ip_1d(ji) = zpnd_aspect * a_pnd_avail_1d(ji) 
    246                 a_ip_1d(ji) = a_pnd_avail_1d(ji) * a_i_1d(ji) 
    247                 v_ip_1d(ji) = h_ip_1d(ji) * a_ip_1d(ji) 
    248                 a_ip_frac_1d(ji) = a_ip_1d(ji) / a_i_1d(ji) 
    249  
    250                 ! A change in volume of a melt pond is equivalent to a change in water depth in the grid box mean. 
    251                 ! Scale this up to make water depth meaned over sea ice. 
    252                 dh_i_pndleak = (v_ip_1d(ji) - v_ip_old) / a_i_1d(ji)   ! This will be a negative number 
    253  
    254                 ! Output this water loss as a mass flux diagnostic 
    255                 wfx_pnd_1d(ji) = wfx_pnd_1d(ji) - rhow * a_i_1d(ji) * dh_i_pndleak * r1_rdtice 
    256  
    257                 ! Reduce the ice thickness using densities to convert from a water depth difference to a sea ice thickness difference 
    258                 h_i_1d(ji) =  MAX( 0._wp , h_i_1d(ji) + dh_i_pndleak * rhow * z1_rhoi ) 
    259             ENDIF 
    260  
    261             ! If pond depth exceeds half the ice thickness then reduce the pond volume 
    262             IF ( h_ip_1d(ji) > 0.5_wp * h_i_1d(ji) ) THEN 
    263                 v_ip_old = v_ip_1d(ji)   ! Save original volume before leak for future use 
    264                 h_ip_1d(ji) = 0.5_wp * h_i_1d(ji) 
    265                 a_ip_frac_1d(ji) = h_ip_1d(ji) / zpnd_aspect 
    266                 a_ip_1d(ji) = a_ip_frac_1d(ji) * a_i_1d(ji) 
    267                 v_ip_1d(ji) = h_ip_1d(ji) * a_ip_1d(ji) 
    268  
    269                 ! A change in volume of a melt pond is equivalent to a change in water depth in the grid box mean. 
    270                 ! Scale this up to make water depth meaned over sea ice. 
    271                 dh_i_pndleak = (v_ip_1d(ji) - v_ip_old) / a_i_1d(ji)   ! This will be a negative number 
    272  
    273                 ! Output this water loss as a mass flux diagnostic 
    274                 wfx_pnd_1d(ji) = wfx_pnd_1d(ji) - rhow * a_i_1d(ji) * dh_i_pndleak * r1_rdtice 
    275  
    276                 ! Reduce the ice thickness using densities to convert from a water depth difference to a sea ice thickness difference 
    277                 h_i_1d(ji) =  MAX( 0._wp , h_i_1d(ji) + dh_i_pndleak * rhow * z1_rhoi ) 
    278             ENDIF 
    279  
    280             ! If any of the previous two IF tests has removed all the ice thickness then remove ice area. 
     338            ! If any of the previous changes has removed all the ice thickness then remove ice area. 
    281339            IF ( h_i_1d(ji) == 0._wp ) THEN 
    282340                a_i_1d(ji) = 0._wp 
     
    284342            ENDIF 
    285343 
    286             ! If snow thickness exceeds snow_lid_min then form a very thin lid (so snow can go over the top) 
    287             IF ( h_s_1d(ji) > snow_lid_min .AND. h_s_1d(ji) < snow_lid_max ) THEN 
    288                weighted_lid_snow = (snow_lid_max - h_s_1d(ji))/(snow_lid_max-snow_lid_min) * pnd_lid_min +             & 
    289                                    (h_s_1d(ji) - snow_lid_min)/(snow_lid_max-snow_lid_min) * pnd_lid_max 
    290                lh_ip_1d(ji) = MAX(lh_ip_1d(ji), weighted_lid_snow) 
    291             ENDIF 
    292             IF ( h_s_1d(ji) >= snow_lid_max ) THEN 
    293                lh_ip_1d(ji) = MAX(lh_ip_1d(ji), pnd_lid_max) 
    294             ENDIF 
    295  
    296344            ! 
    297345         ENDIF 
     
    299347         IF (to_print(ji) == 10) THEN 
    300348            write(numout,*)'icethd_pnd: h_ip_1d(ji), zpnd_aspect, a_ip_frac_1d(ji), a_ip_1d(ji) = ',h_ip_1d(ji), zpnd_aspect, a_ip_frac_1d(ji), a_ip_1d(ji) 
    301             write(numout,*)'icethd_pnd: a_i_1d(ji), v_ip_1d(ji), t_su_1d(ji), zfr_mlt, zdh_mlt = ',a_i_1d(ji), ' ', v_ip_1d(ji), ' ', t_su_1d(ji), ' ', zfr_mlt, ' ', zdh_mlt 
     349            write(numout,*)'icethd_pnd: a_i_1d(ji), v_ip_1d(ji), t_su_1d(ji), zfr_mlt, zdv_mlt = ',a_i_1d(ji), ' ', v_ip_1d(ji), ' ', t_su_1d(ji), ' ', zfr_mlt, ' ', zdv_mlt 
    302350            write(numout,*)'icethd_pnd: meltt = ', -( dh_i_sum(ji)*rhoi + dh_s_mlt(ji)*rhos ) / rhoi 
    303             write(numout,*)'icethd_pnd: lh_ip_1d(ji), zdh_mlt, zdh_frz, t_su_1d(ji) = ',lh_ip_1d(ji), ' ', zdh_mlt, ' ', zdh_frz, ' ', t_su_1d(ji) 
     351            write(numout,*)'icethd_pnd: lh_ip_1d(ji), sfx_pnd_1d(ji), zdh_frz, t_su_1d(ji) = ',lh_ip_1d(ji), ' ', sfx_pnd_1d(ji), ' ', zdh_frz, ' ', t_su_1d(ji) 
    304352            write(numout,*)'icethd_pnd: a_pnd_avail_1d(ji), at_i_1d(ji), wfx_pnd_1d(ji), h_i_1d(ji) = ', a_pnd_avail_1d(ji), ' ', at_i_1d(ji), ' ', wfx_pnd_1d(ji), ' ', h_i_1d(ji) 
     353            write(numout,*)'icethd_pnd: drain, perm, h_percolation, h_gravity_head = ',drain, ' ', perm, ' ', h_percolation, ' ', h_gravity_head 
     354            write(numout,*)'icethd_pnd: t_i_1d(ji,1), sz_i_1d(ji,1) = ',t_i_1d(ji,1), ' ', sz_i_1d(ji,1) 
    305355         END IF 
    306356 
Note: See TracChangeset for help on using the changeset viewer.