diff --git a/physics/SFC_Models/Land/Noahmp/module_sf_noahmp_glacier.F90 b/physics/SFC_Models/Land/Noahmp/module_sf_noahmp_glacier.F90 index a4c862cae..5b7aa584d 100644 --- a/physics/SFC_Models/Land/Noahmp/module_sf_noahmp_glacier.F90 +++ b/physics/SFC_Models/Land/Noahmp/module_sf_noahmp_glacier.F90 @@ -2630,15 +2630,24 @@ subroutine snowwater_glacier (nsnow ,nsoil ,imelt ,dt ,sfctmp , & !in snliq ,imelt ,ficeold, & !in isnow ,dzsnso ) !inout + if(isnow < 0) & !when multi-layer call combine_glacier (nsnow ,nsoil , & !in isnow ,sh2o ,stc ,snice ,snliq , & !inout dzsnso ,sice ,snowh ,sneqv , & !inout ponding1 ,ponding2) !out + if(isnow < 0) & !when multi-layer call divide_glacier (nsnow ,nsoil , & !in isnow ,stc ,snice ,snliq ,dzsnso ) !inout end if + call snowh2o_glacier (nsnow ,nsoil ,dt ,qsnfro ,qsnsub , & !in + qrain , & !in + isnow ,dzsnso ,snowh ,sneqv ,snice , & !inout + snliq ,sh2o ,sice ,stc , & !inout + ponding1 ,ponding2 ,fsh , & !inout + qsnbot ) !out + !set empty snow layers to zero do iz = -nsnow+1, isnow @@ -2649,16 +2658,9 @@ subroutine snowwater_glacier (nsnow ,nsoil ,imelt ,dt ,sfctmp , & !in zsnso(iz) = 0. enddo - call snowh2o_glacier (nsnow ,nsoil ,dt ,qsnfro ,qsnsub , & !in - qrain , & !in - isnow ,dzsnso ,snowh ,sneqv ,snice , & !inout - snliq ,sh2o ,sice ,stc , & !inout - ponding1 ,ponding2 ,fsh , & !inout - qsnbot ) !out - !to obtain equilibrium state of snow in glacier region - if(sneqv > mwd .and. isnow /= 0) then ! 100 mm -> maximum water depth + if(sneqv > mwd) then ! 100 mm -> maximum water depth bdsnow = snice(0) / dzsnso(0) snoflow = (sneqv - mwd) snice(0) = snice(0) - snoflow @@ -2668,7 +2670,7 @@ subroutine snowwater_glacier (nsnow ,nsoil ,imelt ,dt ,sfctmp , & !in ! sum up snow mass for layered snow - if(isnow /= 0) then + if(isnow < 0) then sneqv = 0. snowh = 0. do iz = isnow+1,0 @@ -2744,7 +2746,7 @@ subroutine snowfall_glacier (nsoil ,nsnow ,dt ,qsnow ,snowhin , & !in ! creating a new layer - if(isnow == 0 .and. qsnow>0. .and. snowh >= 0.05) then + if(isnow == 0 .and. qsnow>0. .and. snowh >= 0.025) then isnow = -1 newnode = 1 dzsnso(0)= snowh @@ -2902,8 +2904,8 @@ subroutine combine_glacier (nsnow ,nsoil , & !in real (kind=kind_phys) :: zwice !< total ice mass in snow real (kind=kind_phys) :: zwliq !< total liquid water in snow real (kind=kind_phys) :: dzmin(3) !< minimum of top snow layer - data dzmin /0.045, 0.05, 0.2/ -! data dzmin /0.025, 0.025, 0.1/ ! mb: change limit +! data dzmin /0.045, 0.05, 0.2/ + data dzmin /0.025, 0.025, 0.1/ ! mb: change limit !----------------------------------------------------------------------- isnow_old = isnow @@ -2913,17 +2915,29 @@ subroutine combine_glacier (nsnow ,nsoil , & !in if(j /= 0) then snliq(j+1) = snliq(j+1) + snliq(j) snice(j+1) = snice(j+1) + snice(j) + dzsnso(j+1) = dzsnso(j+1) + dzsnso(j) else if (isnow_old < -1) then snliq(j-1) = snliq(j-1) + snliq(j) snice(j-1) = snice(j-1) + snice(j) + dzsnso(j-1) = dzsnso(j-1) + dzsnso(j) else - ponding1 = ponding1 + snliq(j) ! isnow will get set to zero below - sneqv = snice(j) ! ponding will get added to ponding from - snowh = dzsnso(j) ! phasechange which should be zero here - snliq(j) = 0.0 ! because there it was only calculated - snice(j) = 0.0 ! for thin snow - dzsnso(j) = 0.0 + if(snice(j) >= 0.) then + ponding1 = snliq(j) ! isnow will get set to zero below; ponding1 will get + sneqv = snice(j) ! added to ponding from phasechange ponding should be + snowh = dzsnso(j) ! zero here because it was calculated for thin snow + else ! snice over-sublimated earlier + ponding1 = snliq(j) + snice(j) + if(ponding1 < 0.) then ! if snice and snliq sublimates remove from soil + sice(1) = max(0.0,sice(1)+ponding1/(dzsnso(1)*1000.)) + ponding1 = 0.0 + end if + sneqv = 0.0 + snowh = 0.0 + end if + snliq(j) = 0.0 + snice(j) = 0.0 + dzsnso(j) = 0.0 endif ! sh2o(1) = sh2o(1)+snliq(j)/(dzsnso(1)*1000.) ! sice(1) = sice(1)+snice(j)/(dzsnso(1)*1000.) @@ -2966,8 +2980,8 @@ subroutine combine_glacier (nsnow ,nsoil , & !in ! check the snow depth - all snow gone ! the liquid water assumes ponding on soil surface. -! if (snowh < 0.025 .and. isnow < 0 ) then ! mb: change limit - if (snowh < 0.05 .and. isnow < 0 ) then + if (snowh < 0.025 .and. isnow < 0 ) then ! mb: change limit +! if (snowh < 0.05 .and. isnow < 0 ) then isnow = 0 sneqv = zwice ponding2 = ponding2 + zwliq ! limit of isnow < 0 means input ponding @@ -3165,8 +3179,8 @@ subroutine divide_glacier (nsnow ,nsoil , & !in zwliq, zwice, tsno(1)) ! subdivide a new layer -! if (msno <= 2 .and. dz(2) > 0.20) then ! mb: change limit - if (msno <= 2 .and. dz(2) > 0.10) then + if (msno <= 2 .and. dz(2) > 0.20) then ! mb: change limit +! if (msno <= 2 .and. dz(2) > 0.10) then msno = 3 dtdz = (tsno(1) - tsno(2))/((dz(1)+dz(2))/2.) dz(2) = dz(2)/2. @@ -3293,6 +3307,7 @@ subroutine snowh2o_glacier (nsnow ,nsoil ,dt ,qsnfro ,qsnsub , & !in sneqv = sneqv - qsnsub*dt + qsnfro*dt propor = sneqv/temp snowh = max(0.,propor * snowh) + snowh = min(max(snowh,sneqv/500.0),sneqv/50.0) ! limit adjustment to a reasonable density elseif(opt_gla == 2) then fsh = fsh - (qsnfro-qsnsub)*hsub qsnfro = 0.0 diff --git a/physics/SFC_Models/Land/Noahmp/noahmpdrv.F90 b/physics/SFC_Models/Land/Noahmp/noahmpdrv.F90 index a4c80362d..a36b7a60a 100644 --- a/physics/SFC_Models/Land/Noahmp/noahmpdrv.F90 +++ b/physics/SFC_Models/Land/Noahmp/noahmpdrv.F90 @@ -1205,34 +1205,34 @@ subroutine noahmpdrv_run & ! snow_cover_fraction = 1.0 - temperature_leaf = undefined - canopy_ice = undefined - canopy_liquid = undefined - vapor_pres_canopy_air = undefined - temperature_canopy_air = undefined - canopy_wet_fraction = undefined - lake_water = undefined - depth_water_table = undefined - aquifer_water = undefined - saturated_water = undefined - leaf_carbon = undefined - root_carbon = undefined - stem_carbon = undefined - wood_carbon = undefined - soil_carbon_stable = undefined - soil_carbon_fast = undefined - leaf_area_index = undefined - stem_area_index = undefined - evaporation_canopy = undefined - transpiration = undefined - aquifer_water = undefined - precip_adv_heat_total = undefined + temperature_leaf = temperature_radiative + canopy_ice = 0.0 + canopy_liquid = 0.0 + vapor_pres_canopy_air = 2000.0 + temperature_canopy_air = temperature_radiative + canopy_wet_fraction = 0.0 + lake_water = 0.0 + depth_water_table = 0.0 + aquifer_water = 0.0 + saturated_water = 0.0 + leaf_carbon = 0.0 + root_carbon = 0.0 + stem_carbon = 0.0 + wood_carbon = 0.0 + soil_carbon_stable = 0.0 + soil_carbon_fast = 0.0 + leaf_area_index = 0.0 + stem_area_index = 0.0 + evaporation_canopy = 0.0 + transpiration = 0.0 + aquifer_water = 0.0 + precip_adv_heat_total = 0.0 soil_moisture_wtd = 0.0 recharge = 0.0 deep_recharge = 0.0 eq_soil_water_vol = soil_moisture_vol - transpiration_heat = undefined - latent_heat_canopy = undefined + transpiration_heat = 0.0 + latent_heat_canopy = 0.0 z0_total = 0.002 latent_heat_total = latent_heat_ground t2mmp(i) = temperature_bare_2m