diff --git a/drivers/hrldas/ConfigVarInTransferMod.F90 b/drivers/hrldas/ConfigVarInTransferMod.F90 index 35998c0f..4fa054b2 100644 --- a/drivers/hrldas/ConfigVarInTransferMod.F90 +++ b/drivers/hrldas/ConfigVarInTransferMod.F90 @@ -59,6 +59,7 @@ subroutine ConfigVarInTransfer(noahmp, NoahmpIO) noahmp%config%nmlist%OptRunoffSurface = NoahmpIO%IOPT_RUNSRF noahmp%config%nmlist%OptRunoffSubsurface = NoahmpIO%IOPT_RUNSUB noahmp%config%nmlist%OptGlacierTreatment = NoahmpIO%IOPT_GLA + noahmp%config%nmlist%OptSnowCompaction = NoahmpIO%IOPT_COMPACT ! config domain variable noahmp%config%domain%SurfaceType = 1 @@ -136,7 +137,7 @@ subroutine ConfigVarInTransfer(noahmp, NoahmpIO) noahmp%config%domain%VegType = NoahmpIO%NATURAL_TABLE ! set rural vegetation type based on table natural ! urban is handled by explicit urban scheme outside Noah-MP NoahmpIO%GVFMAX(I,J) = 0.96 * 100.0 ! unit: % - endif + endif endif ! treatment for crop point diff --git a/drivers/hrldas/NoahmpIOVarType.F90 b/drivers/hrldas/NoahmpIOVarType.F90 index a936dc04..e0be132c 100644 --- a/drivers/hrldas/NoahmpIOVarType.F90 +++ b/drivers/hrldas/NoahmpIOVarType.F90 @@ -63,6 +63,7 @@ module NoahmpIOVarType integer :: IOPT_IRRM ! irrigation method (0->dynamic; 1-> sprinkler; 2-> micro; 3-> flood) integer :: IOPT_INFDV ! infiltration options for dynamic VIC (1->Philip; 2-> Green-Ampt;3->Smith-Parlange) integer :: IOPT_TDRN ! drainage option (0->off; 1->simple scheme; 2->Hooghoudt's scheme) + integer :: IOPT_COMPACT ! snowpack compaction (1->Anderson1976; 2->Abolafia-Rosenzweig2024) real(kind=kind_noahmp) :: XICE_THRESHOLD ! fraction of grid determining seaice real(kind=kind_noahmp) :: JULIAN ! Julian day real(kind=kind_noahmp) :: DTBL ! timestep [s] @@ -781,6 +782,12 @@ module NoahmpIOVarType real(kind=kind_noahmp) :: C5_SNOWCOMPACT_TABLE ! snow desctructive metamorphism compaction parameter3 real(kind=kind_noahmp) :: DM_SNOWCOMPACT_TABLE ! upper Limit on destructive metamorphism compaction [kg/m3] real(kind=kind_noahmp) :: ETA0_SNOWCOMPACT_TABLE ! snow viscosity coefficient [kg-s/m2] + real(kind=kind_noahmp) :: SNOWCOMPACTm_AR24_TABLE ! snow compaction m parameter for linear sfc temp fitting from AR24 + real(kind=kind_noahmp) :: SNOWCOMPACTb_AR24_TABLE ! snow compaction b parameter for linear sfc temp fitting from AR24 + real(kind=kind_noahmp) :: SNOWCOMPACT_P1_AR24_TABLE ! lower constrain for SnowCompactBurdenFac for high pressure bin from AR24 + real(kind=kind_noahmp) :: SNOWCOMPACT_P2_AR24_TABLE ! lower constrain for SnowCompactBurdenFac for mid pressure bin from AR24 + real(kind=kind_noahmp) :: SNOWCOMPACT_P3_AR24_TABLE ! lower constrain for SnowCompactBurdenFac for low pressure bin from AR24 + real(kind=kind_noahmp) :: SNOWCOMPACT_Up_AR24_TABLE ! upper constraint on SnowCompactBurdenFac from AR24 real(kind=kind_noahmp) :: SNLIQMAXFRAC_TABLE ! maximum liquid water fraction in snow real(kind=kind_noahmp) :: SWEMAXGLA_TABLE ! Maximum SWE allowed at glaciers (mm) real(kind=kind_noahmp) :: WSLMAX_TABLE ! maximum lake water storage (mm) diff --git a/drivers/hrldas/NoahmpReadNamelistMod.F90 b/drivers/hrldas/NoahmpReadNamelistMod.F90 index 0b3e1c97..1c0fe477 100644 --- a/drivers/hrldas/NoahmpReadNamelistMod.F90 +++ b/drivers/hrldas/NoahmpReadNamelistMod.F90 @@ -80,6 +80,7 @@ subroutine NoahmpReadNamelist(NoahmpIO) integer :: radiative_transfer_option = 3 integer :: snow_albedo_option = 1 integer :: snow_thermal_conductivity = 1 + integer :: snow_compaction_option = 2 integer :: pcp_partition_option = 1 integer :: tbot_option = 2 integer :: temp_time_scheme_option = 1 @@ -122,11 +123,11 @@ subroutine NoahmpReadNamelist(NoahmpIO) forcing_name_T,forcing_name_Q,forcing_name_U,forcing_name_V,forcing_name_P, & forcing_name_LW,forcing_name_SW,forcing_name_PR,forcing_name_SN, & dynamic_veg_option, canopy_stomatal_resistance_option, & - btr_option, surface_drag_option, supercooled_water_option, & + btr_option, surface_drag_option, supercooled_water_option, & frozen_soil_option, radiative_transfer_option, snow_albedo_option, & snow_thermal_conductivity, surface_runoff_option, subsurface_runoff_option, & pcp_partition_option, tbot_option, temp_time_scheme_option, & - glacier_option, surface_resistance_option, & + glacier_option, surface_resistance_option, snow_compaction_option, & irrigation_option, irrigation_method, dvic_infiltration_option, & tile_drainage_option,soil_data_option, pedotransfer_option, crop_option, & sf_urban_physics,use_wudapt_lcz,num_urban_hi,urban_atmosphere_thickness, & @@ -343,6 +344,7 @@ subroutine NoahmpReadNamelist(NoahmpIO) NoahmpIO%IOPT_IRRM = irrigation_method NoahmpIO%IOPT_INFDV = dvic_infiltration_option NoahmpIO%IOPT_TDRN = tile_drainage_option + NoahmpIO%IOPT_COMPACT = snow_compaction_option ! basic model setup variables NoahmpIO%indir = indir NoahmpIO%forcing_timestep = forcing_timestep diff --git a/drivers/hrldas/NoahmpReadTableMod.F90 b/drivers/hrldas/NoahmpReadTableMod.F90 index eb01ceb2..eda242fc 100644 --- a/drivers/hrldas/NoahmpReadTableMod.F90 +++ b/drivers/hrldas/NoahmpReadTableMod.F90 @@ -111,6 +111,8 @@ subroutine NoahmpReadTable(NoahmpIO) BATS_NIR_NEW, BATS_VIS_AGE, BATS_NIR_AGE, BATS_VIS_DIR, BATS_NIR_DIR, & RSURF_SNOW, RSURF_EXP, C2_SNOWCOMPACT, C3_SNOWCOMPACT, C4_SNOWCOMPACT, & C5_SNOWCOMPACT, DM_SNOWCOMPACT, ETA0_SNOWCOMPACT, SNLIQMAXFRAC, SWEMAXGLA, & + SNOWCOMPACTm_AR24,SNOWCOMPACTb_AR24,SNOWCOMPACT_P1_AR24, SNOWCOMPACT_P2_AR24,& + SNOWCOMPACT_P3_AR24, SNOWCOMPACT_Up_AR24, & WSLMAX, ROUS, CMIC, SNOWDEN_MAX, CLASS_ALB_REF, CLASS_SNO_AGE, CLASS_ALB_NEW,& PSIWLT, Z0SOIL, Z0LAKE namelist / noahmp_global_parameters / CO2, O2, TIMEAN, FSATMX, Z0SNO, SSI, SNOW_RET_FAC ,SNOW_EMIS, SWEMX, TAU0, & @@ -118,6 +120,8 @@ subroutine NoahmpReadTable(NoahmpIO) BATS_NIR_NEW, BATS_VIS_AGE, BATS_NIR_AGE, BATS_VIS_DIR, BATS_NIR_DIR, & RSURF_SNOW, RSURF_EXP, C2_SNOWCOMPACT, C3_SNOWCOMPACT, C4_SNOWCOMPACT, & C5_SNOWCOMPACT, DM_SNOWCOMPACT, ETA0_SNOWCOMPACT, SNLIQMAXFRAC, SWEMAXGLA, & + SNOWCOMPACTm_AR24,SNOWCOMPACTb_AR24,SNOWCOMPACT_P1_AR24, SNOWCOMPACT_P2_AR24,& + SNOWCOMPACT_P3_AR24, SNOWCOMPACT_Up_AR24, & WSLMAX, ROUS, CMIC, SNOWDEN_MAX, CLASS_ALB_REF, CLASS_SNO_AGE, CLASS_ALB_NEW,& PSIWLT, Z0SOIL, Z0LAKE @@ -481,46 +485,52 @@ subroutine NoahmpReadTable(NoahmpIO) NoahmpIO%EICE_TABLE = undefined_real ! global parameters - NoahmpIO%CO2_TABLE = undefined_real - NoahmpIO%O2_TABLE = undefined_real - NoahmpIO%TIMEAN_TABLE = undefined_real - NoahmpIO%FSATMX_TABLE = undefined_real - NoahmpIO%Z0SNO_TABLE = undefined_real - NoahmpIO%SSI_TABLE = undefined_real - NoahmpIO%SNOW_RET_FAC_TABLE = undefined_real - NoahmpIO%SNOW_EMIS_TABLE = undefined_real - NoahmpIO%SWEMX_TABLE = undefined_real - NoahmpIO%TAU0_TABLE = undefined_real - NoahmpIO%GRAIN_GROWTH_TABLE = undefined_real - NoahmpIO%EXTRA_GROWTH_TABLE = undefined_real - NoahmpIO%DIRT_SOOT_TABLE = undefined_real - NoahmpIO%BATS_COSZ_TABLE = undefined_real - NoahmpIO%BATS_VIS_NEW_TABLE = undefined_real - NoahmpIO%BATS_NIR_NEW_TABLE = undefined_real - NoahmpIO%BATS_VIS_AGE_TABLE = undefined_real - NoahmpIO%BATS_NIR_AGE_TABLE = undefined_real - NoahmpIO%BATS_VIS_DIR_TABLE = undefined_real - NoahmpIO%BATS_NIR_DIR_TABLE = undefined_real - NoahmpIO%RSURF_SNOW_TABLE = undefined_real - NoahmpIO%RSURF_EXP_TABLE = undefined_real - NoahmpIO%C2_SNOWCOMPACT_TABLE = undefined_real - NoahmpIO%C3_SNOWCOMPACT_TABLE = undefined_real - NoahmpIO%C4_SNOWCOMPACT_TABLE = undefined_real - NoahmpIO%C5_SNOWCOMPACT_TABLE = undefined_real - NoahmpIO%DM_SNOWCOMPACT_TABLE = undefined_real - NoahmpIO%ETA0_SNOWCOMPACT_TABLE = undefined_real - NoahmpIO%SNLIQMAXFRAC_TABLE = undefined_real - NoahmpIO%SWEMAXGLA_TABLE = undefined_real - NoahmpIO%WSLMAX_TABLE = undefined_real - NoahmpIO%ROUS_TABLE = undefined_real - NoahmpIO%CMIC_TABLE = undefined_real - NoahmpIO%SNOWDEN_MAX_TABLE = undefined_real - NoahmpIO%CLASS_ALB_REF_TABLE = undefined_real - NoahmpIO%CLASS_SNO_AGE_TABLE = undefined_real - NoahmpIO%CLASS_ALB_NEW_TABLE = undefined_real - NoahmpIO%PSIWLT_TABLE = undefined_real - NoahmpIO%Z0SOIL_TABLE = undefined_real - NoahmpIO%Z0LAKE_TABLE = undefined_real + NoahmpIO%CO2_TABLE = undefined_real + NoahmpIO%O2_TABLE = undefined_real + NoahmpIO%TIMEAN_TABLE = undefined_real + NoahmpIO%FSATMX_TABLE = undefined_real + NoahmpIO%Z0SNO_TABLE = undefined_real + NoahmpIO%SSI_TABLE = undefined_real + NoahmpIO%SNOW_RET_FAC_TABLE = undefined_real + NoahmpIO%SNOW_EMIS_TABLE = undefined_real + NoahmpIO%SWEMX_TABLE = undefined_real + NoahmpIO%TAU0_TABLE = undefined_real + NoahmpIO%GRAIN_GROWTH_TABLE = undefined_real + NoahmpIO%EXTRA_GROWTH_TABLE = undefined_real + NoahmpIO%DIRT_SOOT_TABLE = undefined_real + NoahmpIO%BATS_COSZ_TABLE = undefined_real + NoahmpIO%BATS_VIS_NEW_TABLE = undefined_real + NoahmpIO%BATS_NIR_NEW_TABLE = undefined_real + NoahmpIO%BATS_VIS_AGE_TABLE = undefined_real + NoahmpIO%BATS_NIR_AGE_TABLE = undefined_real + NoahmpIO%BATS_VIS_DIR_TABLE = undefined_real + NoahmpIO%BATS_NIR_DIR_TABLE = undefined_real + NoahmpIO%RSURF_SNOW_TABLE = undefined_real + NoahmpIO%RSURF_EXP_TABLE = undefined_real + NoahmpIO%C2_SNOWCOMPACT_TABLE = undefined_real + NoahmpIO%C3_SNOWCOMPACT_TABLE = undefined_real + NoahmpIO%C4_SNOWCOMPACT_TABLE = undefined_real + NoahmpIO%C5_SNOWCOMPACT_TABLE = undefined_real + NoahmpIO%DM_SNOWCOMPACT_TABLE = undefined_real + NoahmpIO%ETA0_SNOWCOMPACT_TABLE = undefined_real + NoahmpIO%SNOWCOMPACTm_AR24_TABLE = undefined_real + NoahmpIO%SNOWCOMPACTb_AR24_TABLE = undefined_real + NoahmpIO%SNOWCOMPACT_P1_AR24_TABLE = undefined_real + NoahmpIO%SNOWCOMPACT_P2_AR24_TABLE = undefined_real + NoahmpIO%SNOWCOMPACT_P3_AR24_TABLE = undefined_real + NoahmpIO%SNOWCOMPACT_Up_AR24_TABLE = undefined_real + NoahmpIO%SNLIQMAXFRAC_TABLE = undefined_real + NoahmpIO%SWEMAXGLA_TABLE = undefined_real + NoahmpIO%WSLMAX_TABLE = undefined_real + NoahmpIO%ROUS_TABLE = undefined_real + NoahmpIO%CMIC_TABLE = undefined_real + NoahmpIO%SNOWDEN_MAX_TABLE = undefined_real + NoahmpIO%CLASS_ALB_REF_TABLE = undefined_real + NoahmpIO%CLASS_SNO_AGE_TABLE = undefined_real + NoahmpIO%CLASS_ALB_NEW_TABLE = undefined_real + NoahmpIO%PSIWLT_TABLE = undefined_real + NoahmpIO%Z0SOIL_TABLE = undefined_real + NoahmpIO%Z0LAKE_TABLE = undefined_real ! irrigation parameters NoahmpIO%IRR_HAR_TABLE = undefined_int @@ -877,46 +887,52 @@ subroutine NoahmpReadTable(NoahmpIO) close(15) ! assign values - NoahmpIO%CO2_TABLE = CO2 - NoahmpIO%O2_TABLE = O2 - NoahmpIO%TIMEAN_TABLE = TIMEAN - NoahmpIO%FSATMX_TABLE = FSATMX - NoahmpIO%Z0SNO_TABLE = Z0SNO - NoahmpIO%SSI_TABLE = SSI - NoahmpIO%SNOW_RET_FAC_TABLE = SNOW_RET_FAC - NoahmpIO%SNOW_EMIS_TABLE = SNOW_EMIS - NoahmpIO%SWEMX_TABLE = SWEMX - NoahmpIO%TAU0_TABLE = TAU0 - NoahmpIO%GRAIN_GROWTH_TABLE = GRAIN_GROWTH - NoahmpIO%EXTRA_GROWTH_TABLE = EXTRA_GROWTH - NoahmpIO%DIRT_SOOT_TABLE = DIRT_SOOT - NoahmpIO%BATS_COSZ_TABLE = BATS_COSZ - NoahmpIO%BATS_VIS_NEW_TABLE = BATS_VIS_NEW - NoahmpIO%BATS_NIR_NEW_TABLE = BATS_NIR_NEW - NoahmpIO%BATS_VIS_AGE_TABLE = BATS_VIS_AGE - NoahmpIO%BATS_NIR_AGE_TABLE = BATS_NIR_AGE - NoahmpIO%BATS_VIS_DIR_TABLE = BATS_VIS_DIR - NoahmpIO%BATS_NIR_DIR_TABLE = BATS_NIR_DIR - NoahmpIO%RSURF_SNOW_TABLE = RSURF_SNOW - NoahmpIO%RSURF_EXP_TABLE = RSURF_EXP - NoahmpIO%C2_SNOWCOMPACT_TABLE = C2_SNOWCOMPACT - NoahmpIO%C3_SNOWCOMPACT_TABLE = C3_SNOWCOMPACT - NoahmpIO%C4_SNOWCOMPACT_TABLE = C4_SNOWCOMPACT - NoahmpIO%C5_SNOWCOMPACT_TABLE = C5_SNOWCOMPACT - NoahmpIO%DM_SNOWCOMPACT_TABLE = DM_SNOWCOMPACT - NoahmpIO%ETA0_SNOWCOMPACT_TABLE = ETA0_SNOWCOMPACT - NoahmpIO%SNLIQMAXFRAC_TABLE = SNLIQMAXFRAC - NoahmpIO%SWEMAXGLA_TABLE = SWEMAXGLA - NoahmpIO%WSLMAX_TABLE = WSLMAX - NoahmpIO%ROUS_TABLE = ROUS - NoahmpIO%CMIC_TABLE = CMIC - NoahmpIO%SNOWDEN_MAX_TABLE = SNOWDEN_MAX - NoahmpIO%CLASS_ALB_REF_TABLE = CLASS_ALB_REF - NoahmpIO%CLASS_SNO_AGE_TABLE = CLASS_SNO_AGE - NoahmpIO%CLASS_ALB_NEW_TABLE = CLASS_ALB_NEW - NoahmpIO%PSIWLT_TABLE = PSIWLT - NoahmpIO%Z0SOIL_TABLE = Z0SOIL - NoahmpIO%Z0LAKE_TABLE = Z0LAKE + NoahmpIO%CO2_TABLE = CO2 + NoahmpIO%O2_TABLE = O2 + NoahmpIO%TIMEAN_TABLE = TIMEAN + NoahmpIO%FSATMX_TABLE = FSATMX + NoahmpIO%Z0SNO_TABLE = Z0SNO + NoahmpIO%SSI_TABLE = SSI + NoahmpIO%SNOW_RET_FAC_TABLE = SNOW_RET_FAC + NoahmpIO%SNOW_EMIS_TABLE = SNOW_EMIS + NoahmpIO%SWEMX_TABLE = SWEMX + NoahmpIO%TAU0_TABLE = TAU0 + NoahmpIO%GRAIN_GROWTH_TABLE = GRAIN_GROWTH + NoahmpIO%EXTRA_GROWTH_TABLE = EXTRA_GROWTH + NoahmpIO%DIRT_SOOT_TABLE = DIRT_SOOT + NoahmpIO%BATS_COSZ_TABLE = BATS_COSZ + NoahmpIO%BATS_VIS_NEW_TABLE = BATS_VIS_NEW + NoahmpIO%BATS_NIR_NEW_TABLE = BATS_NIR_NEW + NoahmpIO%BATS_VIS_AGE_TABLE = BATS_VIS_AGE + NoahmpIO%BATS_NIR_AGE_TABLE = BATS_NIR_AGE + NoahmpIO%BATS_VIS_DIR_TABLE = BATS_VIS_DIR + NoahmpIO%BATS_NIR_DIR_TABLE = BATS_NIR_DIR + NoahmpIO%RSURF_SNOW_TABLE = RSURF_SNOW + NoahmpIO%RSURF_EXP_TABLE = RSURF_EXP + NoahmpIO%C2_SNOWCOMPACT_TABLE = C2_SNOWCOMPACT + NoahmpIO%C3_SNOWCOMPACT_TABLE = C3_SNOWCOMPACT + NoahmpIO%C4_SNOWCOMPACT_TABLE = C4_SNOWCOMPACT + NoahmpIO%C5_SNOWCOMPACT_TABLE = C5_SNOWCOMPACT + NoahmpIO%DM_SNOWCOMPACT_TABLE = DM_SNOWCOMPACT + NoahmpIO%ETA0_SNOWCOMPACT_TABLE = ETA0_SNOWCOMPACT + NoahmpIO%SNOWCOMPACTm_AR24_TABLE = SNOWCOMPACTm_AR24 + NoahmpIO%SNOWCOMPACTb_AR24_TABLE = SNOWCOMPACTb_AR24 + NoahmpIO%SNOWCOMPACT_P1_AR24_TABLE = SNOWCOMPACT_P1_AR24 + NoahmpIO%SNOWCOMPACT_P2_AR24_TABLE = SNOWCOMPACT_P2_AR24 + NoahmpIO%SNOWCOMPACT_P3_AR24_TABLE = SNOWCOMPACT_P3_AR24 + NoahmpIO%SNOWCOMPACT_Up_AR24_TABLE = SNOWCOMPACT_Up_AR24 + NoahmpIO%SNLIQMAXFRAC_TABLE = SNLIQMAXFRAC + NoahmpIO%SWEMAXGLA_TABLE = SWEMAXGLA + NoahmpIO%WSLMAX_TABLE = WSLMAX + NoahmpIO%ROUS_TABLE = ROUS + NoahmpIO%CMIC_TABLE = CMIC + NoahmpIO%SNOWDEN_MAX_TABLE = SNOWDEN_MAX + NoahmpIO%CLASS_ALB_REF_TABLE = CLASS_ALB_REF + NoahmpIO%CLASS_SNO_AGE_TABLE = CLASS_SNO_AGE + NoahmpIO%CLASS_ALB_NEW_TABLE = CLASS_ALB_NEW + NoahmpIO%PSIWLT_TABLE = PSIWLT + NoahmpIO%Z0SOIL_TABLE = Z0SOIL + NoahmpIO%Z0LAKE_TABLE = Z0LAKE !---------------- NoahmpTable.TBL irrigation parameters inquire( file='NoahmpTable.TBL', exist=file_named ) diff --git a/drivers/hrldas/WaterVarInTransferMod.F90 b/drivers/hrldas/WaterVarInTransferMod.F90 index b7208851..98324ea4 100644 --- a/drivers/hrldas/WaterVarInTransferMod.F90 +++ b/drivers/hrldas/WaterVarInTransferMod.F90 @@ -101,6 +101,12 @@ subroutine WaterVarInTransfer(noahmp, NoahmpIO) noahmp%water%param%SnowCompactAgingFac3 = NoahmpIO%C5_SNOWCOMPACT_TABLE noahmp%water%param%SnowCompactAgingMax = NoahmpIO%DM_SNOWCOMPACT_TABLE noahmp%water%param%SnowViscosityCoeff = NoahmpIO%ETA0_SNOWCOMPACT_TABLE + noahmp%water%param%SnowCompactmAR24 = NoahmpIO%SNOWCOMPACTm_AR24_TABLE + noahmp%water%param%SnowCompactbAR24 = NoahmpIO%SNOWCOMPACTb_AR24_TABLE + noahmp%water%param%SnowCompactP1AR24 = NoahmpIO%SNOWCOMPACT_P1_AR24_TABLE + noahmp%water%param%SnowCompactP2AR24 = NoahmpIO%SNOWCOMPACT_P2_AR24_TABLE + noahmp%water%param%SnowCompactP3AR24 = NoahmpIO%SNOWCOMPACT_P3_AR24_TABLE + noahmp%water%param%BurdenFacUpAR24 = NoahmpIO%SNOWCOMPACT_Up_AR24_TABLE noahmp%water%param%SnowLiqFracMax = NoahmpIO%SNLIQMAXFRAC_TABLE noahmp%water%param%SnowLiqHoldCap = NoahmpIO%SSI_TABLE noahmp%water%param%SnowLiqReleaseFac = NoahmpIO%SNOW_RET_FAC_TABLE diff --git a/drivers/lis/ConfigVarInTransferMod.F90 b/drivers/lis/ConfigVarInTransferMod.F90 index 35998c0f..30a592ff 100644 --- a/drivers/lis/ConfigVarInTransferMod.F90 +++ b/drivers/lis/ConfigVarInTransferMod.F90 @@ -59,6 +59,7 @@ subroutine ConfigVarInTransfer(noahmp, NoahmpIO) noahmp%config%nmlist%OptRunoffSurface = NoahmpIO%IOPT_RUNSRF noahmp%config%nmlist%OptRunoffSubsurface = NoahmpIO%IOPT_RUNSUB noahmp%config%nmlist%OptGlacierTreatment = NoahmpIO%IOPT_GLA + noahmp%config%nmlist%OptSnowCompaction = NoahmpIO%IOPT_COMPACT ! config domain variable noahmp%config%domain%SurfaceType = 1 diff --git a/drivers/lis/LisNoahmpParamType.F90 b/drivers/lis/LisNoahmpParamType.F90 index 754105c0..a0678d4e 100644 --- a/drivers/lis/LisNoahmpParamType.F90 +++ b/drivers/lis/LisNoahmpParamType.F90 @@ -126,6 +126,12 @@ module LisNoahmpParamType real(kind=kind_noahmp) :: C5_SNOWCOMPACT ! snow desctructive metamorphism compaction parameter3 real(kind=kind_noahmp) :: DM_SNOWCOMPACT ! upper Limit on destructive metamorphism compaction [kg/m3] real(kind=kind_noahmp) :: ETA0_SNOWCOMPACT ! snow viscosity coefficient [kg-s/m2] + real(kind=kind_noahmp) :: SNOWCOMPACTm_AR24 ! snow compaction m parameter for linear sfc temp fitting from AR24 + real(kind=kind_noahmp) :: SNOWCOMPACTb_AR24 ! snow compaction b parameter for linear sfc temp fitting from AR24 + real(kind=kind_noahmp) :: SNOWCOMPACT_P1_AR24 ! lower constraint for SnowCompactBurdenFac for high pressure bin from AR24 + real(kind=kind_noahmp) :: SNOWCOMPACT_P2_AR24 ! lower constraint for SnowCompactBurdenFac for mid pressure bin from AR24 + real(kind=kind_noahmp) :: SNOWCOMPACT_P3_AR24 ! lower constraint for SnowCompactBurdenFac for low pressure bin from AR24 + real(kind=kind_noahmp) :: SNOWCOMPACT_Up_AR24 ! upper constraint on SnowCompactBurdenFac from AR24 real(kind=kind_noahmp) :: SNLIQMAXFRAC ! maximum liquid water fraction in snow real(kind=kind_noahmp) :: SWEMAXGLA ! Maximum SWE allowed at glaciers (mm) real(kind=kind_noahmp) :: WSLMAX ! maximum lake water storage (mm) diff --git a/drivers/lis/NoahmpIOVarType.F90 b/drivers/lis/NoahmpIOVarType.F90 index f0e80fd6..bf7c5eab 100644 --- a/drivers/lis/NoahmpIOVarType.F90 +++ b/drivers/lis/NoahmpIOVarType.F90 @@ -57,6 +57,7 @@ module NoahmpIOVarType integer :: IOPT_IRRM ! irrigation method (0->dynamic; 1-> sprinkler; 2-> micro; 3-> flood) integer :: IOPT_INFDV ! infiltration options for dynamic VIC (1->Philip; 2-> Green-Ampt;3->Smith-Parlange) integer :: IOPT_TDRN ! drainage option (0->off; 1->simple scheme; 2->Hooghoudt's scheme) + integer :: IOPT_COMPACT ! snowpack compaction (1->Anderson1976; 2->Abolafia-Rosenzweig2024) integer :: sf_urban_physics ! urban physics option ! basic model info @@ -756,6 +757,12 @@ module NoahmpIOVarType real(kind=kind_noahmp) :: C5_SNOWCOMPACT_TABLE ! snow desctructive metamorphism compaction parameter3 real(kind=kind_noahmp) :: DM_SNOWCOMPACT_TABLE ! upper Limit on destructive metamorphism compaction [kg/m3] real(kind=kind_noahmp) :: ETA0_SNOWCOMPACT_TABLE ! snow viscosity coefficient [kg-s/m2] + real(kind=kind_noahmp) :: SNOWCOMPACTm_AR24_TABLE ! snow compaction m parameter for linear sfc temp fitting from AR24 + real(kind=kind_noahmp) :: SNOWCOMPACTb_AR24_TABLE ! snow compaction b parameter for linear sfc temp fitting from AR24 + real(kind=kind_noahmp) :: SNOWCOMPACT_P1_AR24_TABLE ! lower constraint for SnowCompactBurdenFac for high pressure bin from AR24 + real(kind=kind_noahmp) :: SNOWCOMPACT_P2_AR24_TABLE ! lower constraint for SnowCompactBurdenFac for mid pressure bin from AR24 + real(kind=kind_noahmp) :: SNOWCOMPACT_P3_AR24_TABLE ! lower constraint for SnowCompactBurdenFac for low pressure bin from AR24 + real(kind=kind_noahmp) :: SNOWCOMPACT_Up_AR24_TABLE ! upper constraint on SnowCompactBurdenFac from AR24 real(kind=kind_noahmp) :: SNLIQMAXFRAC_TABLE ! maximum liquid water fraction in snow real(kind=kind_noahmp) :: SWEMAXGLA_TABLE ! Maximum SWE allowed at glaciers (mm) real(kind=kind_noahmp) :: WSLMAX_TABLE ! maximum lake water storage (mm) diff --git a/drivers/lis/NoahmpReadTableMod.F90 b/drivers/lis/NoahmpReadTableMod.F90 index c56c7ac0..f92f9647 100644 --- a/drivers/lis/NoahmpReadTableMod.F90 +++ b/drivers/lis/NoahmpReadTableMod.F90 @@ -111,6 +111,8 @@ subroutine NoahmpReadTable(LANDDATA_name,MPTABLE_file) BATS_NIR_NEW, BATS_VIS_AGE, BATS_NIR_AGE, BATS_VIS_DIR, BATS_NIR_DIR, & RSURF_SNOW, RSURF_EXP, C2_SNOWCOMPACT, C3_SNOWCOMPACT, C4_SNOWCOMPACT, & C5_SNOWCOMPACT, DM_SNOWCOMPACT, ETA0_SNOWCOMPACT, SNLIQMAXFRAC, SWEMAXGLA, & + SNOWCOMPACTm_AR24,SNOWCOMPACTb_AR24,SNOWCOMPACT_P1_AR24, SNOWCOMPACT_P2_AR24,& + SNOWCOMPACT_P3_AR24, SNOWCOMPACT_Up_AR24, & WSLMAX, ROUS, CMIC, SNOWDEN_MAX, CLASS_ALB_REF, CLASS_SNO_AGE, CLASS_ALB_NEW,& PSIWLT, Z0SOIL, Z0LAKE namelist / noahmp_global_parameters / CO2, O2, TIMEAN, FSATMX, Z0SNO, SSI, SNOW_RET_FAC ,SNOW_EMIS, SWEMX, TAU0, & @@ -118,6 +120,8 @@ subroutine NoahmpReadTable(LANDDATA_name,MPTABLE_file) BATS_NIR_NEW, BATS_VIS_AGE, BATS_NIR_AGE, BATS_VIS_DIR, BATS_NIR_DIR, & RSURF_SNOW, RSURF_EXP, C2_SNOWCOMPACT, C3_SNOWCOMPACT, C4_SNOWCOMPACT, & C5_SNOWCOMPACT, DM_SNOWCOMPACT, ETA0_SNOWCOMPACT, SNLIQMAXFRAC, SWEMAXGLA, & + SNOWCOMPACTm_AR24,SNOWCOMPACTb_AR24,SNOWCOMPACT_P1_AR24, SNOWCOMPACT_P2_AR24,& + SNOWCOMPACT_P3_AR24, SNOWCOMPACT_Up_AR24, & WSLMAX, ROUS, CMIC, SNOWDEN_MAX, CLASS_ALB_REF, CLASS_SNO_AGE, CLASS_ALB_NEW,& PSIWLT, Z0SOIL, Z0LAKE @@ -481,46 +485,52 @@ subroutine NoahmpReadTable(LANDDATA_name,MPTABLE_file) NoahmpIO%EICE_TABLE = undefined_real ! global parameters - NoahmpIO%CO2_TABLE = undefined_real - NoahmpIO%O2_TABLE = undefined_real - NoahmpIO%TIMEAN_TABLE = undefined_real - NoahmpIO%FSATMX_TABLE = undefined_real - NoahmpIO%Z0SNO_TABLE = undefined_real - NoahmpIO%SSI_TABLE = undefined_real - NoahmpIO%SNOW_RET_FAC_TABLE = undefined_real - NoahmpIO%SNOW_EMIS_TABLE = undefined_real - NoahmpIO%SWEMX_TABLE = undefined_real - NoahmpIO%TAU0_TABLE = undefined_real - NoahmpIO%GRAIN_GROWTH_TABLE = undefined_real - NoahmpIO%EXTRA_GROWTH_TABLE = undefined_real - NoahmpIO%DIRT_SOOT_TABLE = undefined_real - NoahmpIO%BATS_COSZ_TABLE = undefined_real - NoahmpIO%BATS_VIS_NEW_TABLE = undefined_real - NoahmpIO%BATS_NIR_NEW_TABLE = undefined_real - NoahmpIO%BATS_VIS_AGE_TABLE = undefined_real - NoahmpIO%BATS_NIR_AGE_TABLE = undefined_real - NoahmpIO%BATS_VIS_DIR_TABLE = undefined_real - NoahmpIO%BATS_NIR_DIR_TABLE = undefined_real - NoahmpIO%RSURF_SNOW_TABLE = undefined_real - NoahmpIO%RSURF_EXP_TABLE = undefined_real - NoahmpIO%C2_SNOWCOMPACT_TABLE = undefined_real - NoahmpIO%C3_SNOWCOMPACT_TABLE = undefined_real - NoahmpIO%C4_SNOWCOMPACT_TABLE = undefined_real - NoahmpIO%C5_SNOWCOMPACT_TABLE = undefined_real - NoahmpIO%DM_SNOWCOMPACT_TABLE = undefined_real - NoahmpIO%ETA0_SNOWCOMPACT_TABLE = undefined_real - NoahmpIO%SNLIQMAXFRAC_TABLE = undefined_real - NoahmpIO%SWEMAXGLA_TABLE = undefined_real - NoahmpIO%WSLMAX_TABLE = undefined_real - NoahmpIO%ROUS_TABLE = undefined_real - NoahmpIO%CMIC_TABLE = undefined_real - NoahmpIO%SNOWDEN_MAX_TABLE = undefined_real - NoahmpIO%CLASS_ALB_REF_TABLE = undefined_real - NoahmpIO%CLASS_SNO_AGE_TABLE = undefined_real - NoahmpIO%CLASS_ALB_NEW_TABLE = undefined_real - NoahmpIO%PSIWLT_TABLE = undefined_real - NoahmpIO%Z0SOIL_TABLE = undefined_real - NoahmpIO%Z0LAKE_TABLE = undefined_real + NoahmpIO%CO2_TABLE = undefined_real + NoahmpIO%O2_TABLE = undefined_real + NoahmpIO%TIMEAN_TABLE = undefined_real + NoahmpIO%FSATMX_TABLE = undefined_real + NoahmpIO%Z0SNO_TABLE = undefined_real + NoahmpIO%SSI_TABLE = undefined_real + NoahmpIO%SNOW_RET_FAC_TABLE = undefined_real + NoahmpIO%SNOW_EMIS_TABLE = undefined_real + NoahmpIO%SWEMX_TABLE = undefined_real + NoahmpIO%TAU0_TABLE = undefined_real + NoahmpIO%GRAIN_GROWTH_TABLE = undefined_real + NoahmpIO%EXTRA_GROWTH_TABLE = undefined_real + NoahmpIO%DIRT_SOOT_TABLE = undefined_real + NoahmpIO%BATS_COSZ_TABLE = undefined_real + NoahmpIO%BATS_VIS_NEW_TABLE = undefined_real + NoahmpIO%BATS_NIR_NEW_TABLE = undefined_real + NoahmpIO%BATS_VIS_AGE_TABLE = undefined_real + NoahmpIO%BATS_NIR_AGE_TABLE = undefined_real + NoahmpIO%BATS_VIS_DIR_TABLE = undefined_real + NoahmpIO%BATS_NIR_DIR_TABLE = undefined_real + NoahmpIO%RSURF_SNOW_TABLE = undefined_real + NoahmpIO%RSURF_EXP_TABLE = undefined_real + NoahmpIO%C2_SNOWCOMPACT_TABLE = undefined_real + NoahmpIO%C3_SNOWCOMPACT_TABLE = undefined_real + NoahmpIO%C4_SNOWCOMPACT_TABLE = undefined_real + NoahmpIO%C5_SNOWCOMPACT_TABLE = undefined_real + NoahmpIO%DM_SNOWCOMPACT_TABLE = undefined_real + NoahmpIO%ETA0_SNOWCOMPACT_TABLE = undefined_real + NoahmpIO%SNOWCOMPACTm_AR24_TABLE = undefined_real + NoahmpIO%SNOWCOMPACTb_AR24_TABLE = undefined_real + NoahmpIO%SNOWCOMPACT_P1_AR24_TABLE = undefined_real + NoahmpIO%SNOWCOMPACT_P2_AR24_TABLE = undefined_real + NoahmpIO%SNOWCOMPACT_P3_AR24_TABLE = undefined_real + NoahmpIO%SNOWCOMPACT_Up_AR24_TABLE = undefined_real + NoahmpIO%SNLIQMAXFRAC_TABLE = undefined_real + NoahmpIO%SWEMAXGLA_TABLE = undefined_real + NoahmpIO%WSLMAX_TABLE = undefined_real + NoahmpIO%ROUS_TABLE = undefined_real + NoahmpIO%CMIC_TABLE = undefined_real + NoahmpIO%SNOWDEN_MAX_TABLE = undefined_real + NoahmpIO%CLASS_ALB_REF_TABLE = undefined_real + NoahmpIO%CLASS_SNO_AGE_TABLE = undefined_real + NoahmpIO%CLASS_ALB_NEW_TABLE = undefined_real + NoahmpIO%PSIWLT_TABLE = undefined_real + NoahmpIO%Z0SOIL_TABLE = undefined_real + NoahmpIO%Z0LAKE_TABLE = undefined_real ! irrigation parameters NoahmpIO%IRR_HAR_TABLE = undefined_int @@ -883,46 +893,52 @@ subroutine NoahmpReadTable(LANDDATA_name,MPTABLE_file) close(15) ! assign values - NoahmpIO%CO2_TABLE = CO2 - NoahmpIO%O2_TABLE = O2 - NoahmpIO%TIMEAN_TABLE = TIMEAN - NoahmpIO%FSATMX_TABLE = FSATMX - NoahmpIO%Z0SNO_TABLE = Z0SNO - NoahmpIO%SSI_TABLE = SSI - NoahmpIO%SNOW_RET_FAC_TABLE = SNOW_RET_FAC - NoahmpIO%SNOW_EMIS_TABLE = SNOW_EMIS - NoahmpIO%SWEMX_TABLE = SWEMX - NoahmpIO%TAU0_TABLE = TAU0 - NoahmpIO%GRAIN_GROWTH_TABLE = GRAIN_GROWTH - NoahmpIO%EXTRA_GROWTH_TABLE = EXTRA_GROWTH - NoahmpIO%DIRT_SOOT_TABLE = DIRT_SOOT - NoahmpIO%BATS_COSZ_TABLE = BATS_COSZ - NoahmpIO%BATS_VIS_NEW_TABLE = BATS_VIS_NEW - NoahmpIO%BATS_NIR_NEW_TABLE = BATS_NIR_NEW - NoahmpIO%BATS_VIS_AGE_TABLE = BATS_VIS_AGE - NoahmpIO%BATS_NIR_AGE_TABLE = BATS_NIR_AGE - NoahmpIO%BATS_VIS_DIR_TABLE = BATS_VIS_DIR - NoahmpIO%BATS_NIR_DIR_TABLE = BATS_NIR_DIR - NoahmpIO%RSURF_SNOW_TABLE = RSURF_SNOW - NoahmpIO%RSURF_EXP_TABLE = RSURF_EXP - NoahmpIO%C2_SNOWCOMPACT_TABLE = C2_SNOWCOMPACT - NoahmpIO%C3_SNOWCOMPACT_TABLE = C3_SNOWCOMPACT - NoahmpIO%C4_SNOWCOMPACT_TABLE = C4_SNOWCOMPACT - NoahmpIO%C5_SNOWCOMPACT_TABLE = C5_SNOWCOMPACT - NoahmpIO%DM_SNOWCOMPACT_TABLE = DM_SNOWCOMPACT - NoahmpIO%ETA0_SNOWCOMPACT_TABLE = ETA0_SNOWCOMPACT - NoahmpIO%SNLIQMAXFRAC_TABLE = SNLIQMAXFRAC - NoahmpIO%SWEMAXGLA_TABLE = SWEMAXGLA - NoahmpIO%WSLMAX_TABLE = WSLMAX - NoahmpIO%ROUS_TABLE = ROUS - NoahmpIO%CMIC_TABLE = CMIC - NoahmpIO%SNOWDEN_MAX_TABLE = SNOWDEN_MAX - NoahmpIO%CLASS_ALB_REF_TABLE = CLASS_ALB_REF - NoahmpIO%CLASS_SNO_AGE_TABLE = CLASS_SNO_AGE - NoahmpIO%CLASS_ALB_NEW_TABLE = CLASS_ALB_NEW - NoahmpIO%PSIWLT_TABLE = PSIWLT - NoahmpIO%Z0SOIL_TABLE = Z0SOIL - NoahmpIO%Z0LAKE_TABLE = Z0LAKE + NoahmpIO%CO2_TABLE = CO2 + NoahmpIO%O2_TABLE = O2 + NoahmpIO%TIMEAN_TABLE = TIMEAN + NoahmpIO%FSATMX_TABLE = FSATMX + NoahmpIO%Z0SNO_TABLE = Z0SNO + NoahmpIO%SSI_TABLE = SSI + NoahmpIO%SNOW_RET_FAC_TABLE = SNOW_RET_FAC + NoahmpIO%SNOW_EMIS_TABLE = SNOW_EMIS + NoahmpIO%SWEMX_TABLE = SWEMX + NoahmpIO%TAU0_TABLE = TAU0 + NoahmpIO%GRAIN_GROWTH_TABLE = GRAIN_GROWTH + NoahmpIO%EXTRA_GROWTH_TABLE = EXTRA_GROWTH + NoahmpIO%DIRT_SOOT_TABLE = DIRT_SOOT + NoahmpIO%BATS_COSZ_TABLE = BATS_COSZ + NoahmpIO%BATS_VIS_NEW_TABLE = BATS_VIS_NEW + NoahmpIO%BATS_NIR_NEW_TABLE = BATS_NIR_NEW + NoahmpIO%BATS_VIS_AGE_TABLE = BATS_VIS_AGE + NoahmpIO%BATS_NIR_AGE_TABLE = BATS_NIR_AGE + NoahmpIO%BATS_VIS_DIR_TABLE = BATS_VIS_DIR + NoahmpIO%BATS_NIR_DIR_TABLE = BATS_NIR_DIR + NoahmpIO%RSURF_SNOW_TABLE = RSURF_SNOW + NoahmpIO%RSURF_EXP_TABLE = RSURF_EXP + NoahmpIO%C2_SNOWCOMPACT_TABLE = C2_SNOWCOMPACT + NoahmpIO%C3_SNOWCOMPACT_TABLE = C3_SNOWCOMPACT + NoahmpIO%C4_SNOWCOMPACT_TABLE = C4_SNOWCOMPACT + NoahmpIO%C5_SNOWCOMPACT_TABLE = C5_SNOWCOMPACT + NoahmpIO%DM_SNOWCOMPACT_TABLE = DM_SNOWCOMPACT + NoahmpIO%ETA0_SNOWCOMPACT_TABLE = ETA0_SNOWCOMPACT + NoahmpIO%SNOWCOMPACTm_AR24_TABLE = SNOWCOMPACTm_AR24 + NoahmpIO%SNOWCOMPACTb_AR24_TABLE = SNOWCOMPACTb_AR24 + NoahmpIO%SNOWCOMPACT_P1_AR24_TABLE = SNOWCOMPACT_P1_AR24 + NoahmpIO%SNOWCOMPACT_P2_AR24_TABLE = SNOWCOMPACT_P2_AR24 + NoahmpIO%SNOWCOMPACT_P3_AR24_TABLE = SNOWCOMPACT_P3_AR24 + NoahmpIO%SNOWCOMPACT_Up_AR24_TABLE = SNOWCOMPACT_Up_AR24 + NoahmpIO%SNLIQMAXFRAC_TABLE = SNLIQMAXFRAC + NoahmpIO%SWEMAXGLA_TABLE = SWEMAXGLA + NoahmpIO%WSLMAX_TABLE = WSLMAX + NoahmpIO%ROUS_TABLE = ROUS + NoahmpIO%CMIC_TABLE = CMIC + NoahmpIO%SNOWDEN_MAX_TABLE = SNOWDEN_MAX + NoahmpIO%CLASS_ALB_REF_TABLE = CLASS_ALB_REF + NoahmpIO%CLASS_SNO_AGE_TABLE = CLASS_SNO_AGE + NoahmpIO%CLASS_ALB_NEW_TABLE = CLASS_ALB_NEW + NoahmpIO%PSIWLT_TABLE = PSIWLT + NoahmpIO%Z0SOIL_TABLE = Z0SOIL + NoahmpIO%Z0LAKE_TABLE = Z0LAKE !---------------- NoahmpTable.TBL irrigation parameters inquire( file=trim(MPTABLE_file), exist=file_named ) diff --git a/drivers/lis/WaterVarInTransferMod.F90 b/drivers/lis/WaterVarInTransferMod.F90 index 8925810d..fb8671f4 100644 --- a/drivers/lis/WaterVarInTransferMod.F90 +++ b/drivers/lis/WaterVarInTransferMod.F90 @@ -103,6 +103,12 @@ subroutine WaterVarInTransfer(noahmp, NoahmpIO, LISparam) noahmp%water%param%SnowCompactAgingFac3 = LISparam%C5_SNOWCOMPACT noahmp%water%param%SnowCompactAgingMax = LISparam%DM_SNOWCOMPACT noahmp%water%param%SnowViscosityCoeff = LISparam%ETA0_SNOWCOMPACT + noahmp%water%param%SnowCompactmAR24 = LISparam%SNOWCOMPACTm_AR24 + noahmp%water%param%SnowCompactbAR24 = LISparam%SNOWCOMPACTb_AR24 + noahmp%water%param%SnowCompactP1AR24 = LISparam%SNOWCOMPACT_P1_AR24 + noahmp%water%param%SnowCompactP2AR24 = LISparam%SNOWCOMPACT_P2_AR24 + noahmp%water%param%SnowCompactP3AR24 = LISparam%SNOWCOMPACT_P3_AR24 + noahmp%water%param%BurdenFacUpAR24 = LISparam%SNOWCOMPACT_Up_AR24 noahmp%water%param%SnowLiqFracMax = LISparam%SNLIQMAXFRAC noahmp%water%param%SnowLiqHoldCap = LISparam%SSI noahmp%water%param%SnowLiqReleaseFac = LISparam%SNOW_RET_FAC diff --git a/parameters/NoahmpTable.TBL b/parameters/NoahmpTable.TBL index bb76c76f..d94b7f6e 100644 --- a/parameters/NoahmpTable.TBL +++ b/parameters/NoahmpTable.TBL @@ -423,43 +423,53 @@ &noahmp_global_parameters ! atmospheric constituants - CO2 = 395.0e-06 ! CO2 partial pressure - O2 = 0.209 ! O2 partial pressure + CO2 = 395.0e-06 ! CO2 partial pressure + O2 = 0.209 ! O2 partial pressure ! runoff parameters used for SIMTOP and SIMGM - TIMEAN = 10.5 ! gridcell mean topgraphic index (global mean) - FSATMX = 0.38 ! maximum surface saturated fraction (global mean) - ROUS = 0.20 ! specific yield [-] for Niu et al. 2007 groundwater scheme (OptRunoffSubsurface=1) - CMIC = 0.80 ! microprore content (0.0-1.0), 0.0: close to free drainage + TIMEAN = 10.5 ! gridcell mean topgraphic index (global mean) + FSATMX = 0.38 ! maximum surface saturated fraction (global mean) + ROUS = 0.20 ! specific yield [-] for Niu et al. 2007 groundwater scheme (OptRunoffSubsurface=1) + CMIC = 0.80 ! microprore content (0.0-1.0), 0.0: close to free drainage ! parameters for snow processes - SSI = 0.03 ! liquid water holding capacity for snowpack (m3/m3) - SNOW_RET_FAC = 5.0e-5 ! snowpack water release timescale factor (1/s) - SNOW_EMIS = 0.95 ! snow emissivity - SWEMX = 1.00 ! new snow mass to fully cover old snow (mm), equivalent to 10mm depth (density = 100 kg/m3) - TAU0 = 1.0e6 ! tau0 from Yang97 eqn. 10a for BATS snow aging - GRAIN_GROWTH = 5000.0 ! growth from vapor diffusion Yang97 eqn. 10b for BATS snow aging - EXTRA_GROWTH = 10.0 ! extra growth near freezing Yang97 eqn. 10c for BATS snow aging - DIRT_SOOT = 0.3 ! dirt and soot term Yang97 eqn. 10d for BATS snow aging - BATS_COSZ = 2.0 ! zenith angle snow albedo adjustment; b in Yang97 eqn. 15 for BATS snow albedo - BATS_VIS_NEW = 0.95 ! new snow visible albedo for BATS snow albedo - BATS_NIR_NEW = 0.65 ! new snow NIR albedo for BATS snow albedo - BATS_VIS_AGE = 0.2 ! age factor for diffuse visible snow albedo Yang97 eqn. 17 for BATS snow albedo - BATS_NIR_AGE = 0.5 ! age factor for diffuse NIR snow albedo Yang97 eqn. 18 for BATS snow albedo - BATS_VIS_DIR = 0.4 ! cosz factor for direct visible snow albedo Yang97 eqn. 15 for BATS snow albedo - BATS_NIR_DIR = 0.4 ! cosz factor for direct NIR snow albedo Yang97 eqn. 16 for BATS snow albedo - C2_SNOWCOMPACT = 21.0e-3 ! overburden snow compaction parameter (m3/kg) - C3_SNOWCOMPACT = 2.5e-6 ! snow desctructive metamorphism compaction parameter1 [1/s] - C4_SNOWCOMPACT = 0.04 ! snow desctructive metamorphism compaction parameter2 [1/k] - C5_SNOWCOMPACT = 2.0 ! snow desctructive metamorphism compaction parameter3 - DM_SNOWCOMPACT = 100.0 ! upper Limit on destructive metamorphism compaction [kg/m3] - ETA0_SNOWCOMPACT = 1.33e+6 ! snow viscosity coefficient [kg-s/m2], Anderson1979: 0.52e6~1.38e6; 1.33e+6 optimized based on SNOTEL obs (He et al. 2021 JGR) - SNLIQMAXFRAC = 0.4 ! maximum liquid water fraction in snow - SWEMAXGLA = 5000.0 ! Maximum SWE allowed at glaciers (mm) - SNOWDEN_MAX = 120.0 ! maximum fresh snowfall density (kg/m3) - CLASS_ALB_REF = 0.55 ! reference snow albedo in CLASS scheme - CLASS_SNO_AGE = 3600.0 ! snow aging e-folding time (s) in CLASS albedo scheme - CLASS_ALB_NEW = 0.84 ! fresh snow albedo in CLASS scheme - RSURF_SNOW = 50.0 ! surface resistence for snow [s/m] - Z0SNO = 0.002 ! snow surface roughness length (m) + SSI = 0.03 ! liquid water holding capacity for snowpack (m3/m3) + SNOW_RET_FAC = 5.0e-5 ! snowpack water release timescale factor (1/s) + SNOW_EMIS = 0.95 ! snow emissivity + SNLIQMAXFRAC = 0.4 ! maximum liquid water fraction in snow + SWEMAXGLA = 5000.0 ! Maximum SWE allowed at glaciers (mm) + SNOWDEN_MAX = 120.0 ! maximum fresh snowfall density (kg/m3) + RSURF_SNOW = 50.0 ! surface resistence for snow [s/m] + Z0SNO = 0.002 ! snow surface roughness length (m) + ! BATS snow albedo parameters + SWEMX = 1.00 ! new snow mass to fully cover old snow (mm), equivalent to 10mm depth (density = 100 kg/m3) + TAU0 = 1.0e6 ! tau0 from Yang97 eqn. 10a for BATS snow aging + GRAIN_GROWTH = 5000.0 ! growth from vapor diffusion Yang97 eqn. 10b for BATS snow aging + EXTRA_GROWTH = 10.0 ! extra growth near freezing Yang97 eqn. 10c for BATS snow aging + DIRT_SOOT = 0.3 ! dirt and soot term Yang97 eqn. 10d for BATS snow aging + BATS_COSZ = 2.0 ! zenith angle snow albedo adjustment; b in Yang97 eqn. 15 for BATS snow albedo + BATS_VIS_NEW = 0.95 ! new snow visible albedo for BATS snow albedo + BATS_NIR_NEW = 0.65 ! new snow NIR albedo for BATS snow albedo + BATS_VIS_AGE = 0.2 ! age factor for diffuse visible snow albedo Yang97 eqn. 17 for BATS snow albedo + BATS_NIR_AGE = 0.5 ! age factor for diffuse NIR snow albedo Yang97 eqn. 18 for BATS snow albedo + BATS_VIS_DIR = 0.4 ! cosz factor for direct visible snow albedo Yang97 eqn. 15 for BATS snow albedo + BATS_NIR_DIR = 0.4 ! cosz factor for direct NIR snow albedo Yang97 eqn. 16 for BATS snow albedo + ! CLASS snow albedo parameters + CLASS_ALB_REF = 0.55 ! reference snow albedo in CLASS scheme + CLASS_SNO_AGE = 3600.0 ! snow aging e-folding time (s) in CLASS albedo scheme + CLASS_ALB_NEW = 0.84 ! fresh snow albedo in CLASS scheme + ! general snow compaction parameter + C2_SNOWCOMPACT = 21.0e-3 ! overburden snow compaction parameter (m3/kg) + C3_SNOWCOMPACT = 2.5e-6 ! snow desctructive metamorphism compaction parameter1 [1/s] + C4_SNOWCOMPACT = 0.04 ! snow desctructive metamorphism compaction parameter2 [1/k] + C5_SNOWCOMPACT = 2.0 ! snow desctructive metamorphism compaction parameter3 + DM_SNOWCOMPACT = 100.0 ! upper Limit on destructive metamorphism compaction [kg/m3] + ETA0_SNOWCOMPACT = 1.33e+6 ! snow viscosity coefficient [kg-s/m2], Anderson1979: 0.52e6~1.38e6; 1.33e+6 optimized based on SNOTEL obs (He et al. 2021 JGR) + ! additional snow compaction parameters for Abolafia-Rosenzweig et al. 2024 (AR24) scheme + SNOWCOMPACTm_AR24 = -0.000695 ! snow compaction m parameter for linear sfc temp fitting from AR24 + SNOWCOMPACTb_AR24 = 0.206067 ! snow compaction b parameter for linear sfc temp fitting from AR24 + SNOWCOMPACT_P1_AR24 = 0.017 ! lower constraint for SnowCompactBurdenFac for high pressure bin from AR24 + SNOWCOMPACT_P2_AR24 = 0.018 ! lower constraint for SnowCompactBurdenFac for mid pressure bin from AR24 + SNOWCOMPACT_P3_AR24 = 0.019 ! lower constraint for SnowCompactBurdenFac for low pressure bin from AR24 + SNOWCOMPACT_Up_AR24 = 0.0315 ! upper constraint on SnowCompactBurdenFac from AR24 ! other soil and hydrological parameters RSURF_EXP = 5.0 ! exponent in the shape parameter for soil resistance option 1 WSLMAX = 5000.0 ! maximum lake water storage (mm) diff --git a/src/ConfigVarInitMod.F90 b/src/ConfigVarInitMod.F90 index 5c8af537..99a96e35 100644 --- a/src/ConfigVarInitMod.F90 +++ b/src/ConfigVarInitMod.F90 @@ -46,6 +46,7 @@ subroutine ConfigVarInitDefault(noahmp) noahmp%config%nmlist%OptSoilProperty = undefined_int noahmp%config%nmlist%OptPedotransfer = undefined_int noahmp%config%nmlist%OptGlacierTreatment = undefined_int + noahmp%config%nmlist%OptSnowCompaction = undefined_int ! config domain variable noahmp%config%domain%LandUseDataName = "MODIFIED_IGBP_MODIS_NOAH" diff --git a/src/ConfigVarType.F90 b/src/ConfigVarType.F90 index dc7979f3..25bfb0d6 100644 --- a/src/ConfigVarType.F90 +++ b/src/ConfigVarType.F90 @@ -120,6 +120,9 @@ module ConfigVarType integer :: OptGlacierTreatment ! options for glacier treatment ! 1 -> include phase change of ice (default) ! 2 -> ice treatment more like original Noah + integer :: OptSnowCompaction ! options for ground snow compaction + ! 1 -> original scheme from Anderson (1976) + ! 2 -> new scheme from Abolafia-Rosenzweig et al. (2024) end type namelist_type diff --git a/src/Makefile b/src/Makefile index 706c0219..f9fb49d7 100644 --- a/src/Makefile +++ b/src/Makefile @@ -42,6 +42,7 @@ OBJS = ConstantDefineMod.o \ SnowLayerDivideMod.o \ SnowLayerWaterComboMod.o \ SnowpackCompactionMod.o \ + SnowpackCompactionAR24Mod.o \ SnowpackHydrologyMod.o \ SnowWaterMainMod.o \ SoilHydraulicPropertyMod.o \ @@ -205,11 +206,12 @@ SnowLayerDivideMod.o: ../utility/Machine.o NoahmpVarType.o Const SnowLayerWaterComboMod.o SnowLayerWaterComboMod.o: ../utility/Machine.o ConstantDefineMod.o SnowpackCompactionMod.o: ../utility/Machine.o NoahmpVarType.o ConstantDefineMod.o +SnowpackCompactionAR24Mod.o: ../utility/Machine.o NoahmpVarType.o ConstantDefineMod.o SnowpackHydrologyMod.o: ../utility/Machine.o NoahmpVarType.o ConstantDefineMod.o \ SnowLayerCombineMod.o SnowWaterMainMod.o: ../utility/Machine.o NoahmpVarType.o ConstantDefineMod.o \ SnowfallBelowCanopyMod.o SnowpackCompactionMod.o SnowLayerDivideMod.o \ - SnowLayerCombineMod.o SnowpackHydrologyMod.o + SnowLayerCombineMod.o SnowpackHydrologyMod.o SnowpackCompactionAR24Mod.o SoilHydraulicPropertyMod.o: ../utility/Machine.o NoahmpVarType.o ConstantDefineMod.o SoilMoistureSolverMod.o: ../utility/Machine.o NoahmpVarType.o ConstantDefineMod.o \ MatrixSolverTriDiagonalMod.o @@ -340,7 +342,7 @@ ResistanceGroundEvaporationGlacierMod.o: ../utility/Machine.o NoahmpVarType.o Co SnowCoverGlacierMod.o: ../utility/Machine.o NoahmpVarType.o ConstantDefineMod.o SnowWaterMainGlacierMod.o: ../utility/Machine.o NoahmpVarType.o ConstantDefineMod.o SnowfallBelowCanopyMod.o \ SnowpackCompactionMod.o SnowLayerCombineMod.o SnowLayerDivideMod.o \ - SnowpackHydrologyGlacierMod.o + SnowpackHydrologyGlacierMod.o SnowpackCompactionAR24Mod.o SnowpackHydrologyGlacierMod.o: ../utility/Machine.o NoahmpVarType.o ConstantDefineMod.o SnowLayerCombineMod.o SurfaceAlbedoGlacierMod.o: ../utility/Machine.o NoahmpVarType.o ConstantDefineMod.o SnowAgingBatsMod.o \ SnowAlbedoBatsMod.o SnowAlbedoClassMod.o GroundAlbedoGlacierMod.o diff --git a/src/SnowWaterMainGlacierMod.F90 b/src/SnowWaterMainGlacierMod.F90 index 0fac6ec0..d050ba0b 100644 --- a/src/SnowWaterMainGlacierMod.F90 +++ b/src/SnowWaterMainGlacierMod.F90 @@ -8,6 +8,7 @@ module SnowWaterMainGlacierMod use ConstantDefineMod use SnowfallBelowCanopyMod, only : SnowfallAfterCanopyIntercept use SnowpackCompactionMod, only : SnowpackCompaction + use SnowpackCompactionAR24Mod, only : SnowpackCompactionAR24 use SnowLayerCombineMod, only : SnowLayerCombine use SnowLayerDivideMod, only : SnowLayerDivide use SnowpackHydrologyGlacierMod, only : SnowpackHydrologyGlacier @@ -38,6 +39,7 @@ subroutine SnowWaterMainGlacier(noahmp) NumSoilLayer => noahmp%config%domain%NumSoilLayer ,& ! in, number of soil layers MainTimeStep => noahmp%config%domain%MainTimeStep ,& ! in, noahmp main time step [s] DepthSoilLayer => noahmp%config%domain%DepthSoilLayer ,& ! in, depth [m] of layer-bottom from soil surface + OptSnowCompaction => noahmp%config%nmlist%OptSnowCompaction ,& ! in, options for ground snowpack compaction SnoWatEqvMaxGlacier => noahmp%water%param%SnoWatEqvMaxGlacier ,& ! in, Maximum SWE allowed at glaciers [mm] ThicknessSnowSoilLayer => noahmp%config%domain%ThicknessSnowSoilLayer ,& ! inout, thickness of snow/soil layers [m] DepthSnowSoilLayer => noahmp%config%domain%DepthSnowSoilLayer ,& ! inout, depth of snow/soil layer-bottom [m] @@ -63,8 +65,9 @@ subroutine SnowWaterMainGlacier(noahmp) ! do following snow layer compaction, combination, and division only for multi-layer snowpack - ! snowpack compaction - if ( NumSnowLayerNeg < 0 ) call SnowpackCompaction(noahmp) + ! snowpack compaction (option: 1->original,Anderson1976; 2->new,Abolafia-Rosenzweig2024) + if ( NumSnowLayerNeg < 0 .and. OptSnowCompaction == 1) call SnowpackCompaction(noahmp) + if ( NumSnowLayerNeg < 0 .and. OptSnowCompaction == 2) call SnowpackCompactionAR24(noahmp) ! snow layer combination if ( NumSnowLayerNeg < 0 ) call SnowLayerCombine(noahmp) diff --git a/src/SnowWaterMainMod.F90 b/src/SnowWaterMainMod.F90 index 2e3e7f00..2b15fb97 100644 --- a/src/SnowWaterMainMod.F90 +++ b/src/SnowWaterMainMod.F90 @@ -6,11 +6,12 @@ module SnowWaterMainMod use Machine use NoahmpVarType use ConstantDefineMod - use SnowfallBelowCanopyMod, only : SnowfallAfterCanopyIntercept - use SnowpackCompactionMod, only : SnowpackCompaction - use SnowLayerCombineMod, only : SnowLayerCombine - use SnowLayerDivideMod, only : SnowLayerDivide - use SnowpackHydrologyMod, only : SnowpackHydrology + use SnowfallBelowCanopyMod, only : SnowfallAfterCanopyIntercept + use SnowpackCompactionMod, only : SnowpackCompaction + use SnowpackCompactionAR24Mod, only : SnowpackCompactionAR24 + use SnowLayerCombineMod, only : SnowLayerCombine + use SnowLayerDivideMod, only : SnowLayerDivide + use SnowpackHydrologyMod, only : SnowpackHydrology implicit none @@ -38,6 +39,7 @@ subroutine SnowWaterMain(noahmp) NumSoilLayer => noahmp%config%domain%NumSoilLayer ,& ! in, number of soil layers MainTimeStep => noahmp%config%domain%MainTimeStep ,& ! in, noahmp main time step [s] DepthSoilLayer => noahmp%config%domain%DepthSoilLayer ,& ! in, depth [m] of layer-bottom from soil surface + OptSnowCompaction => noahmp%config%nmlist%OptSnowCompaction ,& ! in, options for ground snowpack compaction SnoWatEqvMaxGlacier => noahmp%water%param%SnoWatEqvMaxGlacier ,& ! in, Maximum SWE allowed at glaciers [mm] ThicknessSnowSoilLayer => noahmp%config%domain%ThicknessSnowSoilLayer ,& ! inout, thickness of snow/soil layers [m] DepthSnowSoilLayer => noahmp%config%domain%DepthSnowSoilLayer ,& ! inout, depth of snow/soil layer-bottom [m] @@ -63,8 +65,9 @@ subroutine SnowWaterMain(noahmp) ! do following snow layer compaction, combination, and division only for multi-layer snowpack - ! snowpack compaction - if ( NumSnowLayerNeg < 0 ) call SnowpackCompaction(noahmp) + ! snowpack compaction (option: 1->original,Anderson1976; 2->new,Abolafia-Rosenzweig2024) + if ( NumSnowLayerNeg < 0 .and. OptSnowCompaction == 1) call SnowpackCompaction(noahmp) + if ( NumSnowLayerNeg < 0 .and. OptSnowCompaction == 2) call SnowpackCompactionAR24(noahmp) ! snow layer combination if ( NumSnowLayerNeg < 0 ) call SnowLayerCombine(noahmp) diff --git a/src/SnowpackCompactionAR24Mod.F90 b/src/SnowpackCompactionAR24Mod.F90 new file mode 100644 index 00000000..a66de915 --- /dev/null +++ b/src/SnowpackCompactionAR24Mod.F90 @@ -0,0 +1,150 @@ +module SnowpackCompactionAR24Mod + +!!! Snowpack compaction process (Anderson 1976) updated by Abolafia-Rosenzweig et al. 2024 (AR24) +!!! Update snow depth via compaction due to destructive metamorphism, overburden, & melt + + use Machine + use NoahmpVarType + use ConstantDefineMod + + implicit none + +contains + + subroutine SnowpackCompactionAR24(noahmp) + +! ------------------------ Code history ----------------------------------- +! Original Noah-MP subroutine: COMPACT +! Original code: Guo-Yue Niu and Noah-MP team (Niu et al. 2011) +! Refactered code: C. He, P. Valayamkunnath, & refactor team (He et al. 2023) +! New snow compaction scheme: R. Abolafia-Rosenzweig (Abolafia-Rosenzweig et al. 2024) +! ------------------------------------------------------------------------- + + implicit none + + type(noahmp_type), intent(inout) :: noahmp + +! local variable + integer :: LoopInd ! snow layer loop index + real(kind=kind_noahmp) :: SnowBurden ! pressure of overlying snow [kg/m2] + real(kind=kind_noahmp) :: SnowCompactAgeExpFac ! EXPF=exp(-c4*(273.15-TemperatureSoilSnow)) + real(kind=kind_noahmp) :: TempDiff ! ConstFreezePoint - TemperatureSoilSnow[K] + real(kind=kind_noahmp) :: SnowVoid ! void (1 - SnowIce - SnowLiqWater) + real(kind=kind_noahmp) :: SnowWatTotTmp ! water mass (ice + liquid) [kg/m2] + real(kind=kind_noahmp) :: SnowIceDens ! partial density of ice [kg/m3] + real(kind=kind_noahmp) :: SnowCompactBurdenFac ! snow overburden compaction parameter [m3/kg] + +! -------------------------------------------------------------------- + associate( & + MainTimeStep => noahmp%config%domain%MainTimeStep ,& ! in, noahmp main time step [s] + TemperatureAirRefHeight => noahmp%forcing%TemperatureAirRefHeight ,& ! in, air temperature [K] at reference height + PressureAirRefHeight => noahmp%forcing%PressureAirRefHeight ,& ! in, air pressure [Pa] at reference height + TemperatureSoilSnow => noahmp%energy%state%TemperatureSoilSnow ,& ! in, snow and soil layer temperature [K] + SnowIce => noahmp%water%state%SnowIce ,& ! in, snow layer ice [mm] + SnowLiqWater => noahmp%water%state%SnowLiqWater ,& ! in, snow layer liquid water [mm] + IndexPhaseChange => noahmp%water%state%IndexPhaseChange ,& ! in, phase change index [0-none;1-melt;2-refreeze] + SnowIceFracPrev => noahmp%water%state%SnowIceFracPrev ,& ! in, ice fraction in snow layers at previous timestep + SnowCompactAgingFac1 => noahmp%water%param%SnowCompactAgingFac1 ,& ! in, snow desctructive metamorphism compaction factor1 [1/s] + SnowCompactAgingFac2 => noahmp%water%param%SnowCompactAgingFac2 ,& ! in, snow desctructive metamorphism compaction factor2 [1/k] + SnowCompactAgingFac3 => noahmp%water%param%SnowCompactAgingFac3 ,& ! in, snow desctructive metamorphism compaction factor3 + SnowCompactm => noahmp%water%param%SnowCompactmAR24 ,& ! in, snow compaction m parameter for linear sfc temp fitting AR24 + SnowCompactb => noahmp%water%param%SnowCompactbAR24 ,& ! in, snow compaction b parameter for linear sfc temp fitting AR24 + SnowCompactPSFC1 => noahmp%water%param%SnowCompactP1AR24 ,& ! in, lower constraint for SnowCompactBurdenFac for high pressure bin AR24 + SnowCompactPSFC2 => noahmp%water%param%SnowCompactP2AR24 ,& ! in, lower constraint for SnowCompactBurdenFac for mid pressure bin AR24 + SnowCompactPSFC3 => noahmp%water%param%SnowCompactP3AR24 ,& ! in, lower constraint for SnowCompactBurdenFac for low pressure bin AR24 + BurdenFacUpper => noahmp%water%param%BurdenFacUpAR24 ,& ! in, upper constraint on SnowCompactBurdenFac AR24 + SnowCompactAgingMax => noahmp%water%param%SnowCompactAgingMax ,& ! in, maximum destructive metamorphism compaction [kg/m3] + SnowViscosityCoeff => noahmp%water%param%SnowViscosityCoeff ,& ! in, snow viscosity coeff [kg s/m2],Anderson1979:0.52e6~1.38e6 + NumSnowLayerNeg => noahmp%config%domain%NumSnowLayerNeg ,& ! inout, actual number of snow layers (negative) + ThicknessSnowSoilLayer => noahmp%config%domain%ThicknessSnowSoilLayer ,& ! inout, thickness of snow/soil layers [m] + CompactionSnowAging => noahmp%water%flux%CompactionSnowAging ,& ! out, rate of compaction due to destructive metamorphism [1/s] + CompactionSnowBurden => noahmp%water%flux%CompactionSnowBurden ,& ! out, rate of compaction of snowpack due to overburden [1/s] + CompactionSnowMelt => noahmp%water%flux%CompactionSnowMelt ,& ! out, rate of compaction of snowpack due to melt [1/s] + CompactionSnowTot => noahmp%water%flux%CompactionSnowTot ,& ! out, change in fractional-thickness due to compaction [1/s] + SnowIceFrac => noahmp%water%state%SnowIceFrac & ! out, fraction of ice in snow layers at current time step + ) +! ---------------------------------------------------------------------- + + ! initialization for out-only variables + CompactionSnowAging(:) = 0.0 + CompactionSnowBurden(:) = 0.0 + CompactionSnowMelt(:) = 0.0 + CompactionSnowTot(:) = 0.0 + SnowIceFrac(:) = 0.0 + + ! start snow compaction + SnowBurden = 0.0 + ! SnowCompactBurdenFac updated from Abolafia-Rosenzweig et al., 2024 + SnowCompactBurdenFac = SnowCompactm * TemperatureAirRefHeight + SnowCompactb + ! pressure-based lower constraints: + if ( PressureAirRefHeight >= 85000.0 ) then ! high pressure bin + SnowCompactBurdenFac = max(SnowCompactBurdenFac, SnowCompactPSFC1) + endif + if ( (PressureAirRefHeight >= 80000.0) .and. (PressureAirRefHeight < 85000.0) ) then ! mid-pressure bin + SnowCompactBurdenFac = max(SnowCompactBurdenFac, SnowCompactPSFC2) + endif + if ( PressureAirRefHeight < 80000.0 ) then ! low pressure bin + SnowCompactBurdenFac = max(SnowCompactBurdenFac, SnowCompactPSFC3) + endif + ! upper constraint on SnowCompactBurdenFac + SnowCompactBurdenFac = min(SnowCompactBurdenFac, BurdenFacUpper) + + do LoopInd = NumSnowLayerNeg+1, 0 + + SnowWatTotTmp = SnowIce(LoopInd) + SnowLiqWater(LoopInd) + SnowIceFrac(LoopInd) = SnowIce(LoopInd) / SnowWatTotTmp + SnowVoid = 1.0 - (SnowIce(LoopInd)/ConstDensityIce + SnowLiqWater(LoopInd)/ConstDensityWater) / & + ThicknessSnowSoilLayer(LoopInd) + + ! Allow compaction only for non-saturated node and higher ice lens node. + if ( (SnowVoid > 0.001) .and. (SnowIce(LoopInd) > 0.1) ) then + SnowIceDens = SnowIce(LoopInd) / ThicknessSnowSoilLayer(LoopInd) + TempDiff = max(0.0, ConstFreezePoint-TemperatureSoilSnow(LoopInd)) + + ! Settling/compaction as a result of destructive metamorphism + SnowCompactAgeExpFac = exp(-SnowCompactAgingFac2 * TempDiff) + CompactionSnowAging(LoopInd) = -SnowCompactAgingFac1 * SnowCompactAgeExpFac + if ( SnowIceDens > SnowCompactAgingMax ) & + CompactionSnowAging(LoopInd) = CompactionSnowAging(LoopInd) * exp(-46.0e-3*(SnowIceDens-SnowCompactAgingMax)) + if ( SnowLiqWater(LoopInd) > (0.01*ThicknessSnowSoilLayer(LoopInd)) ) & + CompactionSnowAging(LoopInd) = CompactionSnowAging(LoopInd) * SnowCompactAgingFac3 ! Liquid water term + + ! Compaction due to overburden + CompactionSnowBurden(LoopInd) = -(SnowBurden + 0.5*SnowWatTotTmp) * & + exp(-0.08*TempDiff-SnowCompactBurdenFac*SnowIceDens) / SnowViscosityCoeff ! 0.5*SnowWatTotTmp -> self-burden + + ! Compaction occurring during melt + if ( IndexPhaseChange(LoopInd) == 1 ) then + CompactionSnowMelt(LoopInd) = max(0.0, (SnowIceFracPrev(LoopInd)-SnowIceFrac(LoopInd)) / & + max(1.0e-6, SnowIceFracPrev(LoopInd))) + CompactionSnowMelt(LoopInd) = -CompactionSnowMelt(LoopInd) / MainTimeStep ! sometimes too large + else + CompactionSnowMelt(LoopInd) = 0.0 + endif + + ! Time rate of fractional change in snow thickness (units of s-1) + CompactionSnowTot(LoopInd) = (CompactionSnowAging(LoopInd) + CompactionSnowBurden(LoopInd) + & + CompactionSnowMelt(LoopInd) ) * MainTimeStep + CompactionSnowTot(LoopInd) = max(-0.5, CompactionSnowTot(LoopInd)) + + ! The change in DZ due to compaction + ThicknessSnowSoilLayer(LoopInd) = ThicknessSnowSoilLayer(LoopInd) * (1.0 + CompactionSnowTot(LoopInd)) + ThicknessSnowSoilLayer(LoopInd) = max(ThicknessSnowSoilLayer(LoopInd), & + SnowIce(LoopInd)/ConstDensityIce + SnowLiqWater(LoopInd)/ConstDensityWater) + + ! Constrain snow density to a reasonable range (50~500 kg/m3) + ThicknessSnowSoilLayer(LoopInd) = min( max( ThicknessSnowSoilLayer(LoopInd),& + (SnowIce(LoopInd)+SnowLiqWater(LoopInd))/500.0 ), & + (SnowIce(LoopInd)+SnowLiqWater(LoopInd))/50.0 ) + endif + + ! Pressure of overlying snow + SnowBurden = SnowBurden + SnowWatTotTmp + + enddo + + end associate + + end subroutine SnowpackCompactionAR24 + +end module SnowpackCompactionAR24Mod diff --git a/src/WaterVarInitMod.F90 b/src/WaterVarInitMod.F90 index a03d8b4f..f60af81b 100644 --- a/src/WaterVarInitMod.F90 +++ b/src/WaterVarInitMod.F90 @@ -230,6 +230,12 @@ subroutine WaterVarInitDefault(noahmp) noahmp%water%param%SnowCompactAgingFac3 = undefined_real noahmp%water%param%SnowCompactAgingMax = undefined_real noahmp%water%param%SnowViscosityCoeff = undefined_real + noahmp%water%param%SnowCompactmAR24 = undefined_real + noahmp%water%param%SnowCompactbAR24 = undefined_real + noahmp%water%param%SnowCompactP1AR24 = undefined_real + noahmp%water%param%SnowCompactP2AR24 = undefined_real + noahmp%water%param%SnowCompactP3AR24 = undefined_real + noahmp%water%param%BurdenFacUpAR24 = undefined_real noahmp%water%param%SnowLiqFracMax = undefined_real noahmp%water%param%SnowLiqHoldCap = undefined_real noahmp%water%param%SnowLiqReleaseFac = undefined_real diff --git a/src/WaterVarType.F90 b/src/WaterVarType.F90 index 2d2f9132..ed788c18 100644 --- a/src/WaterVarType.F90 +++ b/src/WaterVarType.F90 @@ -173,6 +173,12 @@ module WaterVarType real(kind=kind_noahmp) :: SnowCompactAgingFac3 ! snow desctructive metamorphism compaction parameter3 real(kind=kind_noahmp) :: SnowCompactAgingMax ! upper Limit on destructive metamorphism compaction [kg/m3] real(kind=kind_noahmp) :: SnowViscosityCoeff ! snow viscosity coefficient [kg-s/m2], Anderson1979: 0.52e6~1.38e6 + real(kind=kind_noahmp) :: SnowCompactmAR24 ! snow compaction m parameter for linear sfc temp fitting from AR24 + real(kind=kind_noahmp) :: SnowCompactbAR24 ! snow compaction b parameter for linear sfc temp fitting from AR24 + real(kind=kind_noahmp) :: SnowCompactP1AR24 ! lower constraint for SnowCompactBurdenFac for high pressure bin from AR24 + real(kind=kind_noahmp) :: SnowCompactP2AR24 ! lower constraint for SnowCompactBurdenFac for mid pressure bin from AR24 + real(kind=kind_noahmp) :: SnowCompactP3AR24 ! lower constraint for SnowCompactBurdenFac for low pressure bin from AR24 + real(kind=kind_noahmp) :: BurdenFacUpAR24 ! upper constraint on SnowCompactBurdenFac from AR24 real(kind=kind_noahmp) :: SnowLiqFracMax ! maximum liquid water fraction in snow real(kind=kind_noahmp) :: SnowLiqHoldCap ! liquid water holding capacity for snowpack [m3/m3] real(kind=kind_noahmp) :: SnowLiqReleaseFac ! snowpack water release timescale factor [1/s]