diff --git a/README.md b/README.md index 3090b930..e1a80052 100644 --- a/README.md +++ b/README.md @@ -8,14 +8,14 @@ Noah-MP® is a widely-used state-of-the-art land surface model used in many research and operational weather/climate models (e.g., HRLDAS, WRF, MPAS, WRF-Hydro/NWM, NOAA/UFS, NASA/LIS, etc.). -This is the official Noah-MP land surface model unified repository for code downloading and contribution. Noah-MP is a community open-source model developed with the contributions from the entire scientific community. For development, maintenance, and release of the community Noah-MP GitHub code, please contact: Cenlin He (cenlinhe@ucar.edu) and Fei Chen (feichen@ucar.edu). +This is the official Noah-MP land surface model unified repository for code downloading and contribution. Noah-MP is a community open-source model developed with the contributions from the entire scientific community. For development, maintenance, and release of the community Noah-MP GitHub code, please contact: Cenlin He (cenlinhe@ucar.edu). Noah-MP model website: https://ral.ucar.edu/solutions/products/noah-multiparameterization-land-surface-model-noah-mp-lsm -## New: Release of Noah-MP version 5.0 (Refactored/Modernized version) +## Release of Noah-MP version 5.0 (Refactored/Modernized version) -The latest Noah-MP model version (version 5.0) has been released in March 9, 2023, which is a modernized/refactored version by re-writing the entire model with modern Fortran code infrastructure and data structures. All future Noah-MP developments and updates will be made only to this modernized/refactored version. The version 5.0 has the same model physics as the version 4.5, but with a different code infrastructure. More details about the Noah-MP version 5.0 can be found in the model description paper (He et al., 2023b, in review) and the technical documentation (He et al. 2023a). Currently, the Noah-MP version 5.0 coupling with HRLDAS has been completed, but its coupling with other host models (e.g., WRF-Hydro, NASA/LIS, WRF, MPAS, UFS, etc.) is still on-going. +The Noah-MP model version (version 5.0) has been released in March 9, 2023, which is a modernized/refactored version by re-writing the entire model with modern Fortran code infrastructure and data structures. All future Noah-MP developments and updates will be made only to this modernized/refactored version. The version 5.0 has the same model physics as the version 4.5, but with a different code infrastructure. More details about the Noah-MP version 5.0 can be found in the model description paper (He et al., 2023b, in review) and the technical documentation (He et al. 2023a). Currently, the Noah-MP version 5.0 coupling with HRLDAS has been completed, but its coupling with other host models (e.g., WRF-Hydro, NASA/LIS, WRF, MPAS, UFS, etc.) is still on-going. ## Noah-MP technical documentation and model description papers @@ -31,6 +31,16 @@ Technical documentation freely available at http://dx.doi.org/10.5065/ew8g-yr95 **Noah-MP development future priority paper**: He, C., Chen, F., Barlage, M., Yang, Z.-L., Wegiel, J. W., Niu, G.-Y., Gochis, D., Mocko, D. M., Abolafia-Rosenzweig, R., Zhang, Z., Lin, T.-S., Valayamkunnath, P., Ek, M., and Niyogi, D. (2023): Enhancing the community Noah-MP land model capabilities for Earth sciences and applications, Bull. Amer. Meteor. Soc., E2023–E2029, https://doi.org/10.1175/BAMS-D-23-0249.1 +## Noah-MP Strategic Plan Committee + +Cenlin He, Prasanth Valayamkunnath, Michael Barlage, David Mocko, Guo-Yue Niu, Myung-Seo Koo, Fei Chen, Jerry Wiegel, Zong-Liang Yang, Dev Niyogi, Xuemei Wang, Gonzalo Miguez-Macho + + +## Noah-MP Code Review Committee + +The current code review committee list is here: https://docs.google.com/spreadsheets/d/13kGfVbf5TmFJm-wjis1ZQjmt7eCXFLfbZaqXkvPSi14/edit?gid=0#gid=0 + + ## Noah-MP GitHub structure **The folders**: diff --git a/drivers/hrldas/ConfigVarInTransferMod.F90 b/drivers/hrldas/ConfigVarInTransferMod.F90 index 1a1db108..6b1fd95d 100644 --- a/drivers/hrldas/ConfigVarInTransferMod.F90 +++ b/drivers/hrldas/ConfigVarInTransferMod.F90 @@ -59,6 +59,8 @@ 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 + noahmp%config%nmlist%OptWetlandModel = NoahmpIO%IOPT_WETLAND ! config domain variable noahmp%config%domain%SurfaceType = 1 @@ -153,7 +155,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/NoahmpDriverMainMod.F90 b/drivers/hrldas/NoahmpDriverMainMod.F90 index 1d1e0693..3207a88c 100644 --- a/drivers/hrldas/NoahmpDriverMainMod.F90 +++ b/drivers/hrldas/NoahmpDriverMainMod.F90 @@ -70,6 +70,7 @@ subroutine NoahmpDriverMain(NoahmpIO) NoahmpIO%ACC_ECANXY = 0.0 NoahmpIO%ACC_ETRANXY = 0.0 NoahmpIO%ACC_EDIRXY = 0.0 + NoahmpIO%ACC_GLAFLWXY = 0.0 endif if ( NoahmpIO%SOIL_UPDATE_STEPS > 1 ) then @@ -83,11 +84,14 @@ subroutine NoahmpDriverMain(NoahmpIO) NoahmpIO%ACC_ECANXY = 0.0 NoahmpIO%ACC_ETRANXY = 0.0 NoahmpIO%ACC_EDIRXY = 0.0 + NoahmpIO%ACC_GLAFLWXY = 0.0 end if endif - if ( mod(NoahmpIO%ITIMESTEP, NoahmpIO%SOIL_UPDATE_STEPS) == 0 ) NoahmpIO%CALCULATE_SOIL = .true. - + !if ( mod(NoahmpIO%ITIMESTEP, NoahmpIO%SOIL_UPDATE_STEPS) == 0 ) NoahmpIO%CALCULATE_SOIL = .true. + ! Prevent stale values of calculate_soil from leaking across cpu threads in if-statement above + NoahmpIO%CALCULATE_SOIL = mod(NoahmpIO%ITIMESTEP, NoahmpIO%SOIL_UPDATE_STEPS) == 0 + !--------------------------------------------------------------------- ! Prepare Noah-MP driver !--------------------------------------------------------------------- diff --git a/drivers/hrldas/NoahmpIOVarInitMod.F90 b/drivers/hrldas/NoahmpIOVarInitMod.F90 index 507410f7..07d26569 100644 --- a/drivers/hrldas/NoahmpIOVarInitMod.F90 +++ b/drivers/hrldas/NoahmpIOVarInitMod.F90 @@ -298,6 +298,7 @@ subroutine NoahmpIOVarInitDefault(NoahmpIO) if ( .not. allocated (NoahmpIO%ACC_QINSURXY)) allocate ( NoahmpIO%ACC_QINSURXY (XSTART:XEND, YSTART:YEND) ) if ( .not. allocated (NoahmpIO%ACC_QSEVAXY) ) allocate ( NoahmpIO%ACC_QSEVAXY (XSTART:XEND, YSTART:YEND) ) if ( .not. allocated (NoahmpIO%ACC_ETRANIXY)) allocate ( NoahmpIO%ACC_ETRANIXY (XSTART:XEND,1:NSOIL,YSTART:YEND) ) + if ( .not. allocated (NoahmpIO%ACC_GLAFLWXY)) allocate ( NoahmpIO%ACC_GLAFLWXY (XSTART:XEND, YSTART:YEND) ) ! Needed for MMF_RUNOFF (IOPT_RUN = 5); not part of MP driver in WRF if ( .not. allocated (NoahmpIO%MSFTX) ) allocate ( NoahmpIO%MSFTX (XSTART:XEND,YSTART:YEND) ) @@ -414,6 +415,16 @@ subroutine NoahmpIOVarInitDefault(NoahmpIO) if ( .not. allocated (NoahmpIO%SEASON_GDD)) allocate ( NoahmpIO%SEASON_GDD (XSTART:XEND, YSTART:YEND) ) if ( .not. allocated (NoahmpIO%CROPTYPE) ) allocate ( NoahmpIO%CROPTYPE (XSTART:XEND,5,YSTART:YEND) ) + ! Needed for Zhang et al. 2022 wetland model (OPT_WETLAND=1 or 2) + if ( NoahmpIO%IOPT_WETLAND > 0 ) then + if ( .not. allocated (NoahmpIO%FSATXY) ) allocate ( NoahmpIO%FSATXY (XSTART:XEND, YSTART:YEND) ) ! saturated fraction of the grid (-) + if ( .not. allocated (NoahmpIO%WSURFXY)) allocate ( NoahmpIO%WSURFXY (XSTART:XEND, YSTART:YEND) ) ! wetland water storage [mm] + endif + if ( NoahmpIO%IOPT_WETLAND == 2 ) then + if ( .not. allocated (NoahmpIO%FSATMX) ) allocate ( NoahmpIO%FSATMX (XSTART:XEND, YSTART:YEND) ) ! maximum saturated fraction + if ( .not. allocated (NoahmpIO%WCAP) ) allocate ( NoahmpIO%WCAP (XSTART:XEND, YSTART:YEND) ) ! maximum wetland capacity [m] + endif + ! Single- and Multi-layer Urban Models if ( NoahmpIO%SF_URBAN_PHYSICS > 0 ) then if ( .not. allocated (NoahmpIO%sh_urb2d) ) allocate ( NoahmpIO%sh_urb2d (XSTART:XEND,YSTART:YEND) ) @@ -428,7 +439,6 @@ subroutine NoahmpIOVarInitDefault(NoahmpIO) if ( .not. allocated (NoahmpIO%lb_urb2d) ) allocate ( NoahmpIO%lb_urb2d (XSTART:XEND,YSTART:YEND) ) if ( .not. allocated (NoahmpIO%hgt_urb2d) ) allocate ( NoahmpIO%hgt_urb2d (XSTART:XEND,YSTART:YEND) ) if ( .not. allocated (NoahmpIO%ust) ) allocate ( NoahmpIO%ust (XSTART:XEND,YSTART:YEND) ) - !ENDIF !IF(NoahmpIO%SF_URBAN_PHYSICS == 1 ) THEN ! single layer urban model if ( .not. allocated (NoahmpIO%cmr_sfcdif) ) allocate ( NoahmpIO%cmr_sfcdif (XSTART:XEND, YSTART:YEND) ) @@ -742,6 +752,7 @@ subroutine NoahmpIOVarInitDefault(NoahmpIO) NoahmpIO%ACC_ECANXY = 0.0 NoahmpIO%ACC_ETRANXY = 0.0 NoahmpIO%ACC_EDIRXY = 0.0 + NoahmpIO%ACC_GLAFLWXY = 0.0 ! MMF Groundwater NoahmpIO%TERRAIN = undefined_real @@ -865,6 +876,16 @@ subroutine NoahmpIOVarInitDefault(NoahmpIO) NoahmpIO%IRRSPLH = 0.0 NoahmpIO%LOCTIM = undefined_real + ! wetland model (Zhang et al. 2022) + if ( NoahmpIO%IOPT_WETLAND > 0 ) then + NoahmpIO%FSATXY = undefined_real + NoahmpIO%WSURFXY = undefined_real + endif + if ( NoahmpIO%IOPT_WETLAND == 2 ) then + NoahmpIO%FSATMX = undefined_real + NoahmpIO%WCAP = undefined_real + endif + ! spatial varying soil texture if ( NoahmpIO%IOPT_SOIL > 1 ) then NoahmpIO%SOILCL1 = undefined_real diff --git a/drivers/hrldas/NoahmpIOVarType.F90 b/drivers/hrldas/NoahmpIOVarType.F90 index ffdf2b7e..1ab8df19 100644 --- a/drivers/hrldas/NoahmpIOVarType.F90 +++ b/drivers/hrldas/NoahmpIOVarType.F90 @@ -63,6 +63,8 @@ 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 :: IOPT_WETLAND ! wetland model option (0->off; 1->Zhang2022 fixed parameter; 2->Zhang2022 read in 2D parameter) 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] @@ -330,6 +332,7 @@ module NoahmpIOVarType real(kind=kind_noahmp), allocatable, dimension(:,:) :: ACC_ETRANXY ! accumulated transpiration per soil timestep [mm] real(kind=kind_noahmp), allocatable, dimension(:,:) :: ACC_EDIRXY ! accumulated net ground (soil/snow) evaporation per soil timestep [mm] real(kind=kind_noahmp), allocatable, dimension(:,:,:) :: ACC_ETRANIXY ! accumualted transpiration rate within soil timestep [m/s * dt_soil/dt_main] + real(kind=kind_noahmp), allocatable, dimension(:,:) :: ACC_GLAFLWXY ! accumulated glacier excessive flow [mm] per soil timestep !------------------------------------------------------------------------ ! Needed for MMF_RUNOFF (IOPT_RUN = 5); not part of MP driver in WRF @@ -503,6 +506,14 @@ module NoahmpIOVarType real(kind=kind_noahmp), allocatable, dimension(:,:) :: SEASON_GDD ! seasonal GDD real(kind=kind_noahmp), allocatable, dimension(:,:,:) :: CROPTYPE ! crop type +!------------------------------------------------------------------------ +! Needed for wetland model (OPT_WETLAND=1 or 2) +!------------------------------------------------------------------------ + real(kind=kind_noahmp), allocatable, dimension(:,:) :: FSATXY ! saturated fraction of the grid (-) + real(kind=kind_noahmp), allocatable, dimension(:,:) :: WSURFXY ! wetland water storage [mm] + real(kind=kind_noahmp), allocatable, dimension(:,:) :: FSATMX ! maximum saturated fraction + real(kind=kind_noahmp), allocatable, dimension(:,:) :: WCAP ! maximum wetland capacity [m] + !------------------------------------------------------------------------ ! Single- and Multi-layer Urban Models !------------------------------------------------------------------------ @@ -914,6 +925,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) @@ -1004,6 +1021,9 @@ module NoahmpIOVarType real(kind=kind_noahmp), allocatable, dimension(:,:) :: RTCT_TABLE ! fraction of carbohydrate translocation from root to grain real(kind=kind_noahmp), allocatable, dimension(:) :: BIO2LAI_TABLE ! leaf area per living leaf biomass [m2/kg] + ! wetland parameter (OPT_WETLAND=1) + real(kind=kind_noahmp) :: WCAP_TABLE ! maximum surface wetland capacity + ! soil parameters integer :: SLCATS_TABLE ! number of soil categories real(kind=kind_noahmp), allocatable, dimension(:) :: BEXP_TABLE ! soil B parameter diff --git a/drivers/hrldas/NoahmpInitMainMod.F90 b/drivers/hrldas/NoahmpInitMainMod.F90 index efdd9f3e..6a87b275 100644 --- a/drivers/hrldas/NoahmpInitMainMod.F90 +++ b/drivers/hrldas/NoahmpInitMainMod.F90 @@ -151,6 +151,10 @@ subroutine NoahmpInitMain(NoahmpIO) NoahmpIO%QSNOWXY(I,J) = 0.0 NoahmpIO%QRAINXY(I,J) = 0.0 NoahmpIO%WSLAKEXY(I,J) = 0.0 + if ( NoahmpIO%IOPT_WETLAND > 0 ) then + NoahmpIO%FSATXY(I,J) = 0.0 + NoahmpIO%WSURFXY(I,J) = 0.0 + endif if ( NoahmpIO%IOPT_RUNSUB /= 5 ) then NoahmpIO%WAXY(I,J) = 4900.0 NoahmpIO%WTXY(I,J) = NoahmpIO%WAXY(i,j) diff --git a/drivers/hrldas/NoahmpReadNamelistMod.F90 b/drivers/hrldas/NoahmpReadNamelistMod.F90 index 454cabe0..9b0ea764 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 @@ -92,6 +93,7 @@ subroutine NoahmpReadNamelist(NoahmpIO) integer :: irrigation_method = 0 integer :: dvic_infiltration_option = 1 integer :: tile_drainage_option = 0 + integer :: wetland_option = 0 integer :: split_output_count = 1 logical :: skip_first_output = .false. integer :: khour = -9999 @@ -143,11 +145,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, & + pcp_partition_option, tbot_option, temp_time_scheme_option, wetland_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, & @@ -369,6 +371,8 @@ 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 + NoahmpIO%IOPT_WETLAND = wetland_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 31562c6a..39dbeb91 100644 --- a/drivers/hrldas/NoahmpReadTableMod.F90 +++ b/drivers/hrldas/NoahmpReadTableMod.F90 @@ -111,15 +111,19 @@ 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 + PSIWLT, Z0SOIL, Z0LAKE, WCAP namelist / noahmp_global_parameters / CO2, O2, TIMEAN, FSATMX, Z0SNO, SSI, SNOW_RET_FAC ,SNOW_EMIS, SWEMX, TAU0, & GRAIN_GROWTH, EXTRA_GROWTH, DIRT_SOOT, BATS_COSZ, BATS_VIS_NEW, & 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 + PSIWLT, Z0SOIL, Z0LAKE, WCAP ! irrigation parameters integer :: IRR_HAR @@ -488,46 +492,53 @@ 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 + NoahmpIO%WCAP_TABLE = undefined_real ! irrigation parameters NoahmpIO%IRR_HAR_TABLE = undefined_int @@ -898,46 +909,53 @@ 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 + NoahmpIO%WCAP_TABLE = WCAP !---------------- NoahmpTable.TBL irrigation parameters inquire( file='NoahmpTable.TBL', exist=file_named ) diff --git a/drivers/hrldas/WaterVarInTransferMod.F90 b/drivers/hrldas/WaterVarInTransferMod.F90 index 20bac1e2..142ce44e 100644 --- a/drivers/hrldas/WaterVarInTransferMod.F90 +++ b/drivers/hrldas/WaterVarInTransferMod.F90 @@ -77,6 +77,10 @@ subroutine WaterVarInTransfer(noahmp, NoahmpIO) noahmp%water%state%SoilMoistureEqui (1:NumSoilLayer) = NoahmpIO%SMOISEQ (I,1:NumSoilLayer,J) noahmp%water%state%RechargeGwDeepWT = 0.0 noahmp%water%state%RechargeGwShallowWT = 0.0 + if ( noahmp%config%nmlist%OptWetlandModel > 0 ) then + noahmp%water%state%SoilSaturateFrac = NoahmpIO%FSATXY (I,J) + noahmp%water%state%WaterStorageWetland = NoahmpIO%WSURFXY (I,J) + endif #ifdef WRF_HYDRO noahmp%water%state%WaterTableHydro = NoahmpIO%ZWATBLE2D (I,J) noahmp%water%state%WaterHeadSfc = NoahmpIO%sfcheadrt (I,J) @@ -91,6 +95,7 @@ subroutine WaterVarInTransfer(noahmp, NoahmpIO) noahmp%water%flux%TranspirationAcc = NoahmpIO%ACC_ETRANXY (I,J) noahmp%water%flux%EvapGroundNetAcc = NoahmpIO%ACC_EDIRXY (I,J) noahmp%water%flux%TranspWatLossSoilAcc(1:NumSoilLayer)= NoahmpIO%ACC_ETRANIXY(I,1:NumSoilLayer,J) + noahmp%water%flux%GlacierExcessFlowAcc = NoahmpIO%ACC_GLAFLWXY(I,J) ! water parameter variables noahmp%water%param%DrainSoilLayerInd = NoahmpIO%DRAIN_LAYER_OPT_TABLE @@ -101,6 +106,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 @@ -146,6 +157,7 @@ subroutine WaterVarInTransfer(noahmp, NoahmpIO) noahmp%water%param%DrainWatDepToImperv = NoahmpIO%TD_D_TABLE(SoilType(1)) noahmp%water%param%NumSoilLayerRoot = NoahmpIO%NROOT_TABLE(VegType) noahmp%water%param%SoilDrainSlope = NoahmpIO%SLOPE_TABLE(RunoffSlopeType) + noahmp%water%param%WetlandCapMax = NoahmpIO%WCAP_TABLE !SNICAR if (noahmp%config%nmlist%OptSnowAlbedo == 3 )then @@ -229,6 +241,12 @@ subroutine WaterVarInTransfer(noahmp, NoahmpIO) noahmp%water%param%DrainTubeDist = NoahmpIO%TD_SPAC (I,J) ! tile spacing endif + ! spatial varying wetland parameters from input + if ( noahmp%config%nmlist%OptWetlandModel == 2 ) then + noahmp%water%param%SoilSfcSatFracMax = NoahmpIO%FSATMX(I,J) + noahmp%water%param%WetlandCapMax = NoahmpIO%WCAP(I,J) + endif + ! derived water parameters noahmp%water%param%SoilInfilMaxCoeff = noahmp%water%param%SoilInfilFacRef * & noahmp%water%param%SoilWatConductivitySat(1) / & diff --git a/drivers/hrldas/WaterVarOutTransferMod.F90 b/drivers/hrldas/WaterVarOutTransferMod.F90 index 0bb0fde1..39cd38ce 100644 --- a/drivers/hrldas/WaterVarOutTransferMod.F90 +++ b/drivers/hrldas/WaterVarOutTransferMod.F90 @@ -120,6 +120,7 @@ subroutine WaterVarOutTransfer(noahmp, NoahmpIO) NoahmpIO%ACC_ECANXY (I,J) = noahmp%water%flux%EvapCanopyNetAcc NoahmpIO%ACC_ETRANXY (I,J) = noahmp%water%flux%TranspirationAcc NoahmpIO%ACC_EDIRXY (I,J) = noahmp%water%flux%EvapGroundNetAcc + NoahmpIO%ACC_GLAFLWXY(I,J) = noahmp%water%flux%GlacierExcessFlowAcc NoahmpIO%RECHXY (I,J) = NoahmpIO%RECHXY(I,J) + (noahmp%water%state%RechargeGwShallowWT*1.0e3) NoahmpIO%DEEPRECHXY (I,J) = NoahmpIO%DEEPRECHXY(I,J) + noahmp%water%state%RechargeGwDeepWT NoahmpIO%SMCWTDXY (I,J) = noahmp%water%state%SoilMoistureToWT @@ -165,6 +166,12 @@ subroutine WaterVarOutTransfer(noahmp, NoahmpIO) NoahmpIO%IRFIVOL (I,J) = NoahmpIO%IRFIVOL(I,J)+(noahmp%water%flux%IrrigationRateFlood*1000.0) NoahmpIO%IRELOSS (I,J) = NoahmpIO%IRELOSS(I,J)+(noahmp%water%flux%EvapIrriSprinkler*NoahmpIO%DTBL) + ! wetland (Zhang2022) + if ( noahmp%config%nmlist%OptWetlandModel > 0 ) then + NoahmpIO%WSURFXY(I,J) = noahmp%water%state%WaterStorageWetland + NoahmpIO%FSATXY (I,J) = noahmp%water%state%SoilSaturateFrac + endif + #ifdef WRF_HYDRO NoahmpIO%infxsrt (I,J) = max(noahmp%water%flux%RunoffSurface, 0.0) ! mm, surface runoff NoahmpIO%soldrain (I,J) = max(noahmp%water%flux%RunoffSubsurface, 0.0) ! mm, underground runoff diff --git a/drivers/lis/ConfigVarInTransferMod.F90 b/drivers/lis/ConfigVarInTransferMod.F90 index 35998c0f..b0cde6a5 100644 --- a/drivers/lis/ConfigVarInTransferMod.F90 +++ b/drivers/lis/ConfigVarInTransferMod.F90 @@ -59,6 +59,8 @@ 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 + noahmp%config%nmlist%OptWetlandModel = NoahmpIO%IOPT_WETLAND ! config domain variable noahmp%config%domain%SurfaceType = 1 diff --git a/drivers/lis/LisNoahmpParamType.F90 b/drivers/lis/LisNoahmpParamType.F90 index 754105c0..9f834401 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) @@ -204,6 +210,9 @@ module LisNoahmpParamType real(kind=kind_noahmp) :: RTCT(NSTAGE) ! fraction of carbohydrate translocation from root to grain real(kind=kind_noahmp) :: BIO2LAI ! leaf area per living leaf biomass [m2/kg] + ! wetland parameters + real(kind=kind_noahmp) :: WCAP ! maximum wetland water holding capacity [m] (tunable) for opt_wetland=1 + ! soil parameters real(kind=kind_noahmp) :: BEXP(NSOIL) ! soil B parameter real(kind=kind_noahmp) :: SMCDRY(NSOIL) ! dry soil moisture threshold diff --git a/drivers/lis/NoahmpDriverMainMod.F90 b/drivers/lis/NoahmpDriverMainMod.F90 index a5dbe856..7ede99fc 100644 --- a/drivers/lis/NoahmpDriverMainMod.F90 +++ b/drivers/lis/NoahmpDriverMainMod.F90 @@ -68,6 +68,7 @@ subroutine NoahmpDriverMain(NoahmpIO, LISparam) NoahmpIO%ACC_ECANXY = 0.0 NoahmpIO%ACC_ETRANXY = 0.0 NoahmpIO%ACC_EDIRXY = 0.0 + NoahmpIO%ACC_GLAFLWXY = 0.0 endif if ( NoahmpIO%SOIL_UPDATE_STEPS > 1 ) then @@ -81,6 +82,7 @@ subroutine NoahmpDriverMain(NoahmpIO, LISparam) NoahmpIO%ACC_ECANXY = 0.0 NoahmpIO%ACC_ETRANXY = 0.0 NoahmpIO%ACC_EDIRXY = 0.0 + NoahmpIO%ACC_GLAFLWXY = 0.0 end if endif diff --git a/drivers/lis/NoahmpIOVarInitMod.F90 b/drivers/lis/NoahmpIOVarInitMod.F90 index e2439223..1bec48c2 100644 --- a/drivers/lis/NoahmpIOVarInitMod.F90 +++ b/drivers/lis/NoahmpIOVarInitMod.F90 @@ -300,6 +300,7 @@ subroutine NoahmpIOVarInitDefault(NoahmpIO) if ( .not. allocated (NoahmpIO%ACC_QINSURXY)) allocate ( NoahmpIO%ACC_QINSURXY (XSTART:XEND, YSTART:YEND) ) if ( .not. allocated (NoahmpIO%ACC_QSEVAXY) ) allocate ( NoahmpIO%ACC_QSEVAXY (XSTART:XEND, YSTART:YEND) ) if ( .not. allocated (NoahmpIO%ACC_ETRANIXY)) allocate ( NoahmpIO%ACC_ETRANIXY (XSTART:XEND,1:NSOIL,YSTART:YEND) ) + if ( .not. allocated (NoahmpIO%ACC_GLAFLWXY)) allocate ( NoahmpIO%ACC_GLAFLWXY (XSTART:XEND, YSTART:YEND) ) if ( .not. allocated (NoahmpIO%FGEV_PET) ) allocate ( NoahmpIO%FGEV_PET (XSTART:XEND, YSTART:YEND) ) if ( .not. allocated (NoahmpIO%FCEV_PET) ) allocate ( NoahmpIO%FCEV_PET (XSTART:XEND, YSTART:YEND) ) if ( .not. allocated (NoahmpIO%FCTR_PET) ) allocate ( NoahmpIO%FCTR_PET (XSTART:XEND, YSTART:YEND) ) @@ -331,6 +332,16 @@ subroutine NoahmpIOVarInitDefault(NoahmpIO) if ( .not. allocated (NoahmpIO%SEASON_GDD)) allocate ( NoahmpIO%SEASON_GDD (XSTART:XEND, YSTART:YEND) ) if ( .not. allocated (NoahmpIO%CROPTYPE) ) allocate ( NoahmpIO%CROPTYPE (XSTART:XEND,5,YSTART:YEND) ) + ! Needed for Zhang et al. 2022 wetland model (OPT_WETLAND=1 or 2) + if ( NoahmpIO%IOPT_WETLAND > 0 ) then + if ( .not. allocated (NoahmpIO%FSATXY) ) allocate ( NoahmpIO%FSATXY (XSTART:XEND, YSTART:YEND) ) ! saturated fraction of the grid (-) + if ( .not. allocated (NoahmpIO%WSURFXY)) allocate ( NoahmpIO%WSURFXY (XSTART:XEND, YSTART:YEND) ) ! wetland water storage [mm] + endif + if ( NoahmpIO%IOPT_WETLAND == 2 ) then + if ( .not. allocated (NoahmpIO%FSATMX) ) allocate ( NoahmpIO%FSATMX (XSTART:XEND, YSTART:YEND) ) ! maximum saturated fraction + if ( .not. allocated (NoahmpIO%WCAP) ) allocate ( NoahmpIO%WCAP (XSTART:XEND, YSTART:YEND) ) ! maximum wetland capacity + endif + ! Single- and Multi-layer Urban Models if ( NoahmpIO%SF_URBAN_PHYSICS > 0 ) then if ( .not. allocated (NoahmpIO%sh_urb2d) ) allocate ( NoahmpIO%sh_urb2d (XSTART:XEND,YSTART:YEND) ) @@ -656,6 +667,7 @@ subroutine NoahmpIOVarInitDefault(NoahmpIO) NoahmpIO%ACC_ECANXY = 0.0 NoahmpIO%ACC_ETRANXY = 0.0 NoahmpIO%ACC_EDIRXY = 0.0 + NoahmpIO%ACC_GLAFLWXY = 0.0 NoahmpIO%FGEV_PET = undefined_real NoahmpIO%FCEV_PET = undefined_real NoahmpIO%FCTR_PET = undefined_real @@ -709,6 +721,16 @@ subroutine NoahmpIOVarInitDefault(NoahmpIO) NoahmpIO%IRRSPLH = 0.0 NoahmpIO%LOCTIM = undefined_real + ! wetland model (Zhang et al. 2022) + if ( NoahmpIO%IOPT_WETLAND > 0 ) then + NoahmpIO%FSATXY = undefined_real + NoahmpIO%WSURFXY = undefined_real + endif + if ( NoahmpIO%IOPT_WETLAND == 2 ) then + NoahmpIO%FSATMX = undefined_real + NoahmpIO%WCAP = undefined_real + endif + ! spatial varying soil texture if ( NoahmpIO%IOPT_SOIL > 1 ) then NoahmpIO%SOILCL1 = undefined_real diff --git a/drivers/lis/NoahmpIOVarType.F90 b/drivers/lis/NoahmpIOVarType.F90 index f0e80fd6..81ee9ab4 100644 --- a/drivers/lis/NoahmpIOVarType.F90 +++ b/drivers/lis/NoahmpIOVarType.F90 @@ -57,6 +57,8 @@ 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 :: IOPT_WETLAND ! wetland model option (0->off; 1->Zhang2022 scheme fixed parameter; 2->Zhang2022 read in 2D parameter) integer :: sf_urban_physics ! urban physics option ! basic model info @@ -315,6 +317,7 @@ module NoahmpIOVarType real(kind=kind_noahmp), allocatable, dimension(:,:) :: ACC_ETRANXY ! accumulated transpiration per soil timestep [mm] real(kind=kind_noahmp), allocatable, dimension(:,:) :: ACC_EDIRXY ! accumulated net ground (soil/snow) evaporation per soil timestep [mm] real(kind=kind_noahmp), allocatable, dimension(:,:,:) :: ACC_ETRANIXY ! accumualted transpiration rate within soil timestep [m/s * dt_soil/dt_main] + real(kind=kind_noahmp), allocatable, dimension(:,:) :: ACC_GLAFLWXY ! accumulated glacier excessive flow [mm] per soil timestep real(kind=kind_noahmp), allocatable, dimension(:,:) :: FGEV_PET ! ground evapo flux due to PET [W/m2] real(kind=kind_noahmp), allocatable, dimension(:,:) :: FCEV_PET ! canopy evapo flux due to PET [W/m2] real(kind=kind_noahmp), allocatable, dimension(:,:) :: FCTR_PET ! transpiration flux due to PET [W/m2] @@ -344,6 +347,13 @@ module NoahmpIOVarType real(kind=kind_noahmp) :: WTDDT = 30.0 ! frequency of groundwater call [minutes] integer :: STEPWTD ! step of groundwater call +!------------------------------------------------------------------------ +! Needed for wetland model (OPT_WETLAND = 1 or 2) +!------------------------------------------------------------------------ + real(kind=kind_noahmp), allocatable, dimension(:,:) :: FSATXY ! saturated fraction of the grid (-) + real(kind=kind_noahmp), allocatable, dimension(:,:) :: WSURFXY ! wetland water storage + real(kind=kind_noahmp), allocatable, dimension(:,:) :: FSATMX ! maximum saturated fraction + real(kind=kind_noahmp), allocatable, dimension(:,:) :: WCAP ! maximum wetland capacity !------------------------------------------------------------------------ ! Single- and Multi-layer Urban Models @@ -756,6 +766,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) @@ -846,6 +862,9 @@ module NoahmpIOVarType real(kind=kind_noahmp), allocatable, dimension(:,:) :: RTCT_TABLE ! fraction of carbohydrate translocation from root to grain real(kind=kind_noahmp), allocatable, dimension(:) :: BIO2LAI_TABLE ! leaf area per living leaf biomass [m2/kg] + ! wetland parameter (OPT_WETLAND=1) + real(kind=kind_noahmp) :: WCAP_TABLE ! maximum surface wetland capacity + ! soil parameters integer :: SLCATS_TABLE ! number of soil categories real(kind=kind_noahmp), allocatable, dimension(:) :: BEXP_TABLE ! soil B parameter diff --git a/drivers/lis/NoahmpInitMainMod.F90 b/drivers/lis/NoahmpInitMainMod.F90 index 7a590791..a1ab2fe1 100644 --- a/drivers/lis/NoahmpInitMainMod.F90 +++ b/drivers/lis/NoahmpInitMainMod.F90 @@ -151,6 +151,10 @@ subroutine NoahmpInitMain(NoahmpIO) NoahmpIO%QSNOWXY(I,J) = 0.0 NoahmpIO%QRAINXY(I,J) = 0.0 NoahmpIO%WSLAKEXY(I,J) = 0.0 + if ( NoahmpIO%IOPT_WETLAND > 0 ) then + NoahmpIO%FSATXY(I,J) = 0.0 + NoahmpIO%WSURFXY(I,J) = 0.0 + endif if ( NoahmpIO%IOPT_RUNSUB /= 5 ) then NoahmpIO%WAXY(I,J) = 4900.0 NoahmpIO%WTXY(I,J) = NoahmpIO%WAXY(i,j) diff --git a/drivers/lis/NoahmpReadTableMod.F90 b/drivers/lis/NoahmpReadTableMod.F90 index c56c7ac0..aff96124 100644 --- a/drivers/lis/NoahmpReadTableMod.F90 +++ b/drivers/lis/NoahmpReadTableMod.F90 @@ -111,15 +111,19 @@ 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 + PSIWLT, Z0SOIL, Z0LAKE, WCAP namelist / noahmp_global_parameters / CO2, O2, TIMEAN, FSATMX, Z0SNO, SSI, SNOW_RET_FAC ,SNOW_EMIS, SWEMX, TAU0, & GRAIN_GROWTH, EXTRA_GROWTH, DIRT_SOOT, BATS_COSZ, BATS_VIS_NEW, & 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 + PSIWLT, Z0SOIL, Z0LAKE, WCAP ! irrigation parameters integer :: IRR_HAR @@ -481,46 +485,53 @@ 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 + NoahmpIO%WCAP_TABLE = undefined_real ! irrigation parameters NoahmpIO%IRR_HAR_TABLE = undefined_int @@ -883,46 +894,53 @@ 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 + NoahmpIO%WCAP_TABLE = WCAP !---------------- 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..96415601 100644 --- a/drivers/lis/WaterVarInTransferMod.F90 +++ b/drivers/lis/WaterVarInTransferMod.F90 @@ -79,6 +79,10 @@ subroutine WaterVarInTransfer(noahmp, NoahmpIO, LISparam) noahmp%water%state%SoilMoistureEqui (1:NumSoilLayer) = NoahmpIO%SMOISEQ (I,1:NumSoilLayer,J) noahmp%water%state%RechargeGwDeepWT = 0.0 noahmp%water%state%RechargeGwShallowWT = 0.0 + if ( noahmp%config%nmlist%OptWetlandModel > 0 ) then + noahmp%water%state%SoilSaturateFrac = NoahmpIO%FSATXY (I,J) + noahmp%water%state%WaterStorageWetland = NoahmpIO%WSURFXY (I,J) + endif #ifdef WRF_HYDRO noahmp%water%state%WaterTableHydro = NoahmpIO%ZWATBLE2D (I,J) noahmp%water%state%WaterHeadSfc = NoahmpIO%sfcheadrt (I,J) @@ -93,6 +97,7 @@ subroutine WaterVarInTransfer(noahmp, NoahmpIO, LISparam) noahmp%water%flux%TranspirationAcc = NoahmpIO%ACC_ETRANXY (I,J) noahmp%water%flux%EvapGroundNetAcc = NoahmpIO%ACC_EDIRXY (I,J) noahmp%water%flux%TranspWatLossSoilAcc(1:NumSoilLayer)= NoahmpIO%ACC_ETRANIXY(I,1:NumSoilLayer,J) + noahmp%water%flux%GlacierExcessFlowAcc = NoahmpIO%ACC_GLAFLWXY(I,J) ! water parameter variables noahmp%water%param%DrainSoilLayerInd = LISparam%DRAIN_LAYER_OPT @@ -103,6 +108,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 @@ -148,6 +159,7 @@ subroutine WaterVarInTransfer(noahmp, NoahmpIO, LISparam) noahmp%water%param%DrainWatDepToImperv = LISparam%TD_D noahmp%water%param%NumSoilLayerRoot = LISparam%NROOT noahmp%water%param%SoilDrainSlope = LISparam%SLOPE + noahmp%water%param%WetlandCapMax = LISparam%WCAP do IndexSoilLayer = 1, size(SoilType) noahmp%water%param%SoilMoistureSat (IndexSoilLayer) = LISparam%SMCMAX(IndexSoilLayer) @@ -201,6 +213,12 @@ subroutine WaterVarInTransfer(noahmp, NoahmpIO, LISparam) noahmp%water%param%DrainTubeDist = NoahmpIO%TD_SPAC (I,J) ! tile spacing endif + ! spatial varying wetland parameters from input + if ( noahmp%config%nmlist%OptWetlandModel == 2 ) then + noahmp%water%param%SoilSfcSatFracMax = NoahmpIO%FSATMX(I,J) + noahmp%water%param%WetlandCapMax = NoahmpIO%WCAP(I,J) + endif + ! derived water parameters noahmp%water%param%SoilInfilMaxCoeff = noahmp%water%param%SoilInfilFacRef * & noahmp%water%param%SoilWatConductivitySat(1) / & diff --git a/drivers/lis/WaterVarOutTransferMod.F90 b/drivers/lis/WaterVarOutTransferMod.F90 index 3682e8b5..e14851b6 100644 --- a/drivers/lis/WaterVarOutTransferMod.F90 +++ b/drivers/lis/WaterVarOutTransferMod.F90 @@ -118,6 +118,7 @@ subroutine WaterVarOutTransfer(noahmp, NoahmpIO) NoahmpIO%ACC_ECANXY (I,J) = noahmp%water%flux%EvapCanopyNetAcc NoahmpIO%ACC_ETRANXY (I,J) = noahmp%water%flux%TranspirationAcc NoahmpIO%ACC_EDIRXY (I,J) = noahmp%water%flux%EvapGroundNetAcc + NoahmpIO%ACC_GLAFLWXY(I,J) = noahmp%water%flux%GlacierExcessFlowAcc NoahmpIO%RECHXY (I,J) = NoahmpIO%RECHXY(I,J) + (noahmp%water%state%RechargeGwShallowWT*1.0e3) NoahmpIO%DEEPRECHXY (I,J) = NoahmpIO%DEEPRECHXY(I,J) + noahmp%water%state%RechargeGwDeepWT NoahmpIO%SMCWTDXY (I,J) = noahmp%water%state%SoilMoistureToWT @@ -142,6 +143,12 @@ subroutine WaterVarOutTransfer(noahmp, NoahmpIO) NoahmpIO%IRFIVOL (I,J) = NoahmpIO%IRFIVOL(I,J)+(noahmp%water%flux%IrrigationRateFlood*1000.0) NoahmpIO%IRELOSS (I,J) = NoahmpIO%IRELOSS(I,J)+(noahmp%water%flux%EvapIrriSprinkler*NoahmpIO%DTBL) + ! wetland (Zhang2022) + if ( noahmp%config%nmlist%OptWetlandModel > 0 ) then + NoahmpIO%WSURFXY(I,J) = noahmp%water%state%WaterStorageWetland + NoahmpIO%FSATXY (I,J) = noahmp%water%state%SoilSaturateFrac + endif + #ifdef WRF_HYDRO NoahmpIO%infxsrt (I,J) = max(noahmp%water%flux%RunoffSurface, 0.0) ! mm, surface runoff NoahmpIO%soldrain (I,J) = max(noahmp%water%flux%RunoffSubsurface, 0.0) ! mm, underground runoff diff --git a/parameters/NoahmpTable.TBL b/parameters/NoahmpTable.TBL index 2ff46d21..8094b42a 100644 --- a/parameters/NoahmpTable.TBL +++ b/parameters/NoahmpTable.TBL @@ -423,49 +423,61 @@ &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) PSIWLT = -150.0 ! metric potential for wilting point (m) Z0SOIL = 0.002 ! Bare-soil roughness length (m) (i.e., under the canopy) Z0LAKE = 0.01 ! Lake surface roughness length (m) + ! wetland parameter + WCAP = 0.10 ! maximum wetland water holding capacity [m] (tunable) from Zhang et al. 2022 / &noahmp_irrigation_parameters @@ -482,35 +494,35 @@ &noahmp_crop_parameters ! NCROP = 5 - ! 1: Corn - ! 2: Soybean - ! 3: Sorghum - ! 4: Rice - ! 5: Winter wheat + ! 1: Corn (Zhang et al. 2020 JAMES) + ! 2: Soybean (Zhang et al. 2020 JAMES) + ! 3: Sorghum (not calibrated, placeholder) + ! 4: Rice (not calibrated, placeholder) + ! 5: Spring wheat (Zhang et al. 2023 GMD) DEFAULT_CROP = 0 ! default crop type (1-5); if =0, use generic dynamic vegetation !------------------------------------------------------- ! CropType: 1 2 3 4 5 !------------------------------------------------------- - PLTDAY = 111, 131, 111, 111, 111, ! Planting date - HSDAY = 300, 280, 300, 300, 300, ! Harvest date + PLTDAY = 111, 131, 111, 111, 145, ! Planting date + HSDAY = 300, 280, 300, 300, 273, ! Harvest date PLANTPOP = 78.0, 78.0, 78.0, 78.0, 78.0, ! Plant density [per ha] - GDDTBASE = 10.0, 10.0, 10.0, 10.0, 10.0, ! Base temperature for Grow Degree Day (GDD) accumulation [C] + GDDTBASE = 10.0, 10.0, 10.0, 10.0, 5.0, ! Base temperature for Grow Degree Day (GDD) accumulation [C] GDDTCUT = 30.0, 30.0, 30.0, 30.0, 30.0, ! Upper temperature for Grow Degree Day (GDD) accumulation [C] - GDDS1 = 50.0, 60.0, 50.0, 50.0, 50.0, ! Grow Degree Day (GDD) from seeding to emergence - GDDS2 = 625.0, 675.0, 718.0, 718.0, 718.0, ! Grow Degree Day (GDD) from seeding to initial vegetative - GDDS3 = 933.0, 1183.0, 933.0, 933.0, 933.0, ! Grow Degree Day (GDD) from seeding to post vegetative - GDDS4 = 1103.0, 1253.0, 1103.0, 1103.0, 1103.0, ! Grow Degree Day (GDD) from seeding to intial reproductive - GDDS5 = 1555.0, 1605.0, 1555.0, 1555.0, 1555.0, ! Grow Degree Day (GDD) from seeding to pysical maturity - C3PSNI = 0.0, 1.0, 1.0, 1.0, 1.0, ! photosynthetic pathway: 0.0 = c4, 1.0 = c3; the following 11 *I parameters added by Z. Zhang, 2020/02 + GDDS1 = 50.0, 60.0, 50.0, 50.0, 150.0, ! Grow Degree Day (GDD) from seeding to emergence + GDDS2 = 625.0, 675.0, 718.0, 718.0, 450.0, ! Grow Degree Day (GDD) from seeding to initial vegetative + GDDS3 = 933.0, 1183.0, 933.0, 933.0, 770.0, ! Grow Degree Day (GDD) from seeding to post vegetative + GDDS4 = 1103.0, 1253.0, 1103.0, 1103.0, 950.0, ! Grow Degree Day (GDD) from seeding to intial reproductive + GDDS5 = 1555.0, 1605.0, 1555.0, 1555.0, 1120.0, ! Grow Degree Day (GDD) from seeding to pysical maturity + C3PSNI = 0.0, 1.0, 0.0, 1.0, 1.0, ! photosynthetic pathway: 0.0 = c4, 1.0 = c3; the following 11 *I parameters added by Z. Zhang, 2020/02 KC25I = 30.0, 30.0, 30.0, 30.0, 30.0, ! CO2 michaelis-menten constant at 25 degC (pa) AKCI = 2.1, 2.1, 2.1, 2.1, 2.1, ! q10 for KC25; change in CO2 Michaelis-Menten constant for every 10-degC temperature change KO25I = 3.E4, 3.E4, 3.E4, 3.E4, 3.E4, ! O2 michaelis-menten constant at 25 degC (pa) AKOI = 1.2, 1.2, 1.2, 1.2, 1.2, ! q10 for KO25; change in O2 Michaelis-Menten constant for every 10-degC temperature change - AVCMXI = 2.4, 2.4, 2.4, 2.4, 2.4, ! q10 for VCMZ25; change in maximum rate of carboxylation for every 10-degC temperature change - VCMX25I = 60.0, 80.0, 60.0, 60.0, 55.0, ! maximum rate of carboxylation at 25c (umol CO2/m2/s) - BPI = 4.E4, 1.E4, 2.E3, 2.E3, 2.E3, ! minimum leaf conductance (umol/m2/s) + AVCMXI = 2.4, 2.4, 2.4, 2.4, 1.5, ! q10 for VCMZ25; change in maximum rate of carboxylation for every 10-degC temperature change + VCMX25I = 60.0, 80.0, 60.0, 60.0, 60.0, ! maximum rate of carboxylation at 25c (umol CO2/m2/s) + BPI = 4.E4, 1.E4, 2.E3, 2.E3, 1.E4, ! minimum leaf conductance (umol/m2/s) MPI = 4., 9., 6., 9., 9., ! slope of conductance-to-photosynthesis relationship FOLNMXI = 1.5, 1.5, 1.5, 1.5, 1.5, ! foliage nitrogen concentration when f(n)=1 (%) QE25I = 0.05, 0.06, 0.06, 0.06, 0.06, ! quantum efficiency at 25 degC (umol CO2/umol photon) @@ -545,8 +557,8 @@ LF_OVRC_S2 = 0.0, 0.0, 0.0, 0.0, 0.0, ! fraction of leaf turnover [1/s] at growth stage 2 LF_OVRC_S3 = 0.0, 0.0, 0.0, 0.0, 0.0, ! fraction of leaf turnover [1/s] at growth stage 3 LF_OVRC_S4 = 0.0, 0.0, 0.0, 0.0, 0.0, ! fraction of leaf turnover [1/s] at growth stage 4 - LF_OVRC_S5 = 0.2, 0.2, 0.48, 0.48, 0.48, ! fraction of leaf turnover [1/s] at growth stage 5 - LF_OVRC_S6 = 0.3, 0.3, 0.48, 0.48, 0.48, ! fraction of leaf turnover [1/s] at growth stage 6 + LF_OVRC_S5 = 0.2, 0.2, 0.48, 0.48, 0.05, ! fraction of leaf turnover [1/s] at growth stage 5 + LF_OVRC_S6 = 0.3, 0.3, 0.48, 0.48, 0.05, ! fraction of leaf turnover [1/s] at growth stage 6 LF_OVRC_S7 = 0.0, 0.0, 0.0, 0.0, 0.0, ! fraction of leaf turnover [1/s] at growth stage 7 LF_OVRC_S8 = 0.0, 0.0, 0.0, 0.0, 0.0, ! fraction of leaf turnover [1/s] at growth stage 8 ST_OVRC_S1 = 0.0, 0.0, 0.0, 0.0, 0.0, ! fraction of stem turnover [1/s] at growth stage 1 @@ -565,67 +577,67 @@ RT_OVRC_S6 = 0.06, 0.06, 0.06, 0.06, 0.06, ! fraction of root tunrover [1/s] at growth stage 6 RT_OVRC_S7 = 0.0, 0.0, 0.0, 0.0, 0.0, ! fraction of root tunrover [1/s] at growth stage 7 RT_OVRC_S8 = 0.0, 0.0, 0.0, 0.0, 0.0, ! fraction of root tunrover [1/s] at growth stage 8 - LFMR25 = 0.8, 1.0, 1.0, 1.0, 1.0, ! leaf maintenance respiration at 25C [umol CO2/m2/s] - STMR25 = 0.05, 0.05, 0.1, 0.1, 0.1, ! stem maintenance respiration at 25C [umol CO2/kg bio/s] - RTMR25 = 0.05, 0.05, 0.0, 0.0, 0.0, ! root maintenance respiration at 25C [umol CO2/kg bio/s] - GRAINMR25 = 0.0, 0.0, 0.1, 0.1, 0.1, ! grain maintenance respiration at 25C [umol CO2/kg bio/s] + LFMR25 = 0.8, 1.0, 1.0, 1.0, 0.8, ! leaf maintenance respiration at 25C [umol CO2/m2/s] + STMR25 = 0.05, 0.05, 0.1, 0.1, 0.05, ! stem maintenance respiration at 25C [umol CO2/kg bio/s] + RTMR25 = 0.05, 0.05, 0.0, 0.0, 0.05, ! root maintenance respiration at 25C [umol CO2/kg bio/s] + GRAINMR25 = 0.0, 0.0, 0.1, 0.1, 0.0, ! grain maintenance respiration at 25C [umol CO2/kg bio/s] LFPT_S1 = 0.0, 0.0, 0.0, 0.0, 0.0, ! fraction of carbohydrate flux to leaf at growth stage 1 LFPT_S2 = 0.0, 0.0, 0.0, 0.0, 0.0, ! fraction of carbohydrate flux to leaf at growth stage 2 LFPT_S3 = 0.36, 0.4, 0.4, 0.4, 0.4, ! fraction of carbohydrate flux to leaf at growth stage 3 - LFPT_S4 = 0.1, 0.2, 0.2, 0.2, 0.2, ! fraction of carbohydrate flux to leaf at growth stage 4 - LFPT_S5 = 0.0, 0.0, 0.0, 0.0, 0.0, ! fraction of carbohydrate flux to leaf at growth stage 5 + LFPT_S4 = 0.1, 0.2, 0.2, 0.2, 0.3, ! fraction of carbohydrate flux to leaf at growth stage 4 + LFPT_S5 = 0.0, 0.0, 0.0, 0.0, 0.1, ! fraction of carbohydrate flux to leaf at growth stage 5 LFPT_S6 = 0.0, 0.0, 0.0, 0.0, 0.0, ! fraction of carbohydrate flux to leaf at growth stage 6 LFPT_S7 = 0.0, 0.0, 0.0, 0.0, 0.0, ! fraction of carbohydrate flux to leaf at growth stage 7 LFPT_S8 = 0.0, 0.0, 0.0, 0.0, 0.0, ! fraction of carbohydrate flux to leaf at growth stage 8 STPT_S1 = 0.0, 0.0, 0.0, 0.0, 0.0, ! fraction of carbohydrate flux to stem at growth stage 1 STPT_S2 = 0.0, 0.0, 0.0, 0.0, 0.0, ! fraction of carbohydrate flux to stem at growth stage 2 - STPT_S3 = 0.24, 0.2, 0.2, 0.2, 0.2, ! fraction of carbohydrate flux to stem at growth stage 3 - STPT_S4 = 0.6, 0.5, 0.5, 0.5, 0.5, ! fraction of carbohydrate flux to stem at growth stage 4 - STPT_S5 = 0.0, 0.0, 0.15, 0.15, 0.15, ! fraction of carbohydrate flux to stem at growth stage 5 - STPT_S6 = 0.0, 0.0, 0.05, 0.05, 0.05, ! fraction of carbohydrate flux to stem at growth stage 6 + STPT_S3 = 0.24, 0.2, 0.2, 0.2, 0.5, ! fraction of carbohydrate flux to stem at growth stage 3 + STPT_S4 = 0.6, 0.5, 0.5, 0.5, 0.6, ! fraction of carbohydrate flux to stem at growth stage 4 + STPT_S5 = 0.0, 0.0, 0.15, 0.15, 0.2, ! fraction of carbohydrate flux to stem at growth stage 5 + STPT_S6 = 0.0, 0.0, 0.05, 0.05, 0.2, ! fraction of carbohydrate flux to stem at growth stage 6 STPT_S7 = 0.0, 0.0, 0.0, 0.0, 0.0, ! fraction of carbohydrate flux to stem at growth stage 7 STPT_S8 = 0.0, 0.0, 0.0, 0.0, 0.0, ! fraction of carbohydrate flux to stem at growth stage 8 RTPT_S1 = 0.0, 0.0, 0.0, 0.0, 0.0, ! fraction of carbohydrate flux to root at growth stage 1 RTPT_S2 = 0.0, 0.0, 0.0, 0.0, 0.0, ! fraction of carbohydrate flux to root at growth stage 2 - RTPT_S3 = 0.4, 0.4, 0.4, 0.4, 0.4, ! fraction of carbohydrate flux to root at growth stage 3 - RTPT_S4 = 0.3, 0.3, 0.3, 0.3, 0.3, ! fraction of carbohydrate flux to root at growth stage 4 + RTPT_S3 = 0.4, 0.4, 0.4, 0.4, 0.1, ! fraction of carbohydrate flux to root at growth stage 3 + RTPT_S4 = 0.3, 0.3, 0.3, 0.3, 0.1, ! fraction of carbohydrate flux to root at growth stage 4 RTPT_S5 = 0.05, 0.05, 0.05, 0.05, 0.05, ! fraction of carbohydrate flux to root at growth stage 5 - RTPT_S6 = 0.0, 0.0, 0.05, 0.05, 0.05, ! fraction of carbohydrate flux to root at growth stage 6 + RTPT_S6 = 0.0, 0.0, 0.05, 0.05, 0.0, ! fraction of carbohydrate flux to root at growth stage 6 RTPT_S7 = 0.0, 0.0, 0.0, 0.0, 0.0, ! fraction of carbohydrate flux to root at growth stage 7 RTPT_S8 = 0.0, 0.0, 0.0, 0.0, 0.0, ! fraction of carbohydrate flux to root at growth stage 8 GRAINPT_S1 = 0.0, 0.0, 0.0, 0.0, 0.0, ! fraction of carbohydrate flux to grain at growth stage 1 GRAINPT_S2 = 0.0, 0.0, 0.0, 0.0, 0.0, ! fraction of carbohydrate flux to grain at growth stage 2 GRAINPT_S3 = 0.0, 0.0, 0.0, 0.0, 0.0, ! fraction of carbohydrate flux to grain at growth stage 3 GRAINPT_S4 = 0.0, 0.0, 0.0, 0.0, 0.0, ! fraction of carbohydrate flux to grain at growth stage 4 - GRAINPT_S5 = 0.95, 0.95, 0.8, 0.8, 0.8, ! fraction of carbohydrate flux to grain at growth stage 5 - GRAINPT_S6 = 1.0, 1.0, 0.9, 0.9, 0.9, ! fraction of carbohydrate flux to grain at growth stage 6 + GRAINPT_S5 = 0.95, 0.95, 0.8, 0.8, 0.7, ! fraction of carbohydrate flux to grain at growth stage 5 + GRAINPT_S6 = 1.0, 1.0, 0.9, 0.9, 0.8, ! fraction of carbohydrate flux to grain at growth stage 6 GRAINPT_S7 = 0.0, 0.0, 0.0, 0.0, 0.0, ! fraction of carbohydrate flux to grain at growth stage 7 GRAINPT_S8 = 0.0, 0.0, 0.0, 0.0, 0.0, ! fraction of carbohydrate flux to grain at growth stage 8 LFCT_S1 = 0.0, 0.0, 0.0, 0.0, 0.0, ! fraction of carbohydrate translocation from leaf to grain at growth stage 1 LFCT_S2 = 0.0, 0.0, 0.0, 0.0, 0.0, ! fraction of carbohydrate translocation from leaf to grain at growth stage 2 - LFCT_S3 = 0.0, 0.0, 0.4, 0.4, 0.4, ! fraction of carbohydrate translocation from leaf to grain at growth stage 3 - LFCT_S4 = 0.0, 0.0, 0.3, 0.3, 0.3, ! fraction of carbohydrate translocation from leaf to grain at growth stage 4 - LFCT_S5 = 0.0, 0.0, 0.05, 0.05, 0.05, ! fraction of carbohydrate translocation from leaf to grain at growth stage 5 - LFCT_S6 = 0.0, 0.0, 0.05, 0.05, 0.05, ! fraction of carbohydrate translocation from leaf to grain at growth stage 6 + LFCT_S3 = 0.0, 0.0, 0.4, 0.4, 0.0, ! fraction of carbohydrate translocation from leaf to grain at growth stage 3 + LFCT_S4 = 0.0, 0.0, 0.3, 0.3, 0.0, ! fraction of carbohydrate translocation from leaf to grain at growth stage 4 + LFCT_S5 = 0.0, 0.0, 0.05, 0.05, 0.0, ! fraction of carbohydrate translocation from leaf to grain at growth stage 5 + LFCT_S6 = 0.0, 0.0, 0.05, 0.05, 0.0, ! fraction of carbohydrate translocation from leaf to grain at growth stage 6 LFCT_S7 = 0.0, 0.0, 0.0, 0.0, 0.0, ! fraction of carbohydrate translocation from leaf to grain at growth stage 7 LFCT_S8 = 0.0, 0.0, 0.0, 0.0, 0.0, ! fraction of carbohydrate translocation from leaf to grain at growth stage 8 STCT_S1 = 0.0, 0.0, 0.0, 0.0, 0.0, ! fraction of carbohydrate translocation from stem to grain at growth stage 1 STCT_S2 = 0.0, 0.0, 0.0, 0.0, 0.0, ! fraction of carbohydrate translocation from stem to grain at growth stage 2 - STCT_S3 = 0.0, 0.0, 0.4, 0.4, 0.4, ! fraction of carbohydrate translocation from stem to grain at growth stage 3 - STCT_S4 = 0.0, 0.0, 0.3, 0.3, 0.3, ! fraction of carbohydrate translocation from stem to grain at growth stage 4 - STCT_S5 = 0.0, 0.0, 0.05, 0.05, 0.05, ! fraction of carbohydrate translocation from stem to grain at growth stage 5 - STCT_S6 = 0.0, 0.0, 0.05, 0.05, 0.05, ! fraction of carbohydrate translocation from stem to grain at growth stage 6 + STCT_S3 = 0.0, 0.0, 0.4, 0.4, 0.0, ! fraction of carbohydrate translocation from stem to grain at growth stage 3 + STCT_S4 = 0.0, 0.0, 0.3, 0.3, 0.0, ! fraction of carbohydrate translocation from stem to grain at growth stage 4 + STCT_S5 = 0.0, 0.0, 0.05, 0.05, 0.0, ! fraction of carbohydrate translocation from stem to grain at growth stage 5 + STCT_S6 = 0.0, 0.0, 0.05, 0.05, 0.0, ! fraction of carbohydrate translocation from stem to grain at growth stage 6 STCT_S7 = 0.0, 0.0, 0.0, 0.0, 0.0, ! fraction of carbohydrate translocation from stem to grain at growth stage 7 STCT_S8 = 0.0, 0.0, 0.0, 0.0, 0.0, ! fraction of carbohydrate translocation from stem to grain at growth stage 8 RTCT_S1 = 0.0, 0.0, 0.0, 0.0, 0.0, ! fraction of carbohydrate translocation from root to grain at growth stage 1 RTCT_S2 = 0.0, 0.0, 0.0, 0.0, 0.0, ! fraction of carbohydrate translocation from root to grain at growth stage 2 - RTCT_S3 = 0.0, 0.0, 0.4, 0.4, 0.4, ! fraction of carbohydrate translocation from root to grain at growth stage 3 - RTCT_S4 = 0.0, 0.0, 0.3, 0.3, 0.3, ! fraction of carbohydrate translocation from root to grain at growth stage 4 - RTCT_S5 = 0.0, 0.0, 0.05, 0.05, 0.05, ! fraction of carbohydrate translocation from root to grain at growth stage 5 - RTCT_S6 = 0.0, 0.0, 0.05, 0.05, 0.05, ! fraction of carbohydrate translocation from root to grain at growth stage 6 + RTCT_S3 = 0.0, 0.0, 0.4, 0.4, 0.0, ! fraction of carbohydrate translocation from root to grain at growth stage 3 + RTCT_S4 = 0.0, 0.0, 0.3, 0.3, 0.0, ! fraction of carbohydrate translocation from root to grain at growth stage 4 + RTCT_S5 = 0.0, 0.0, 0.05, 0.05, 0.0, ! fraction of carbohydrate translocation from root to grain at growth stage 5 + RTCT_S6 = 0.0, 0.0, 0.05, 0.05, 0.0, ! fraction of carbohydrate translocation from root to grain at growth stage 6 RTCT_S7 = 0.0, 0.0, 0.0, 0.0, 0.0, ! fraction of carbohydrate translocation from root to grain at growth stage 7 RTCT_S8 = 0.0, 0.0, 0.0, 0.0, 0.0, ! fraction of carbohydrate translocation from root to grain at growth stage 8 - BIO2LAI = 0.015, 0.030, 0.015, 0.015, 0.015, ! leaf area per living leaf biomass [m2/kg] + BIO2LAI = 0.015, 0.030, 0.015, 0.015, 0.025, ! leaf area per living leaf biomass [m2/kg] / &noahmp_tiledrain_parameters diff --git a/src/BalanceErrorCheckMod.F90 b/src/BalanceErrorCheckMod.F90 index f79e3e33..56302e1b 100644 --- a/src/BalanceErrorCheckMod.F90 +++ b/src/BalanceErrorCheckMod.F90 @@ -36,13 +36,14 @@ subroutine BalanceWaterInit(noahmp) SnowWaterEquiv => noahmp%water%state%SnowWaterEquiv ,& ! in, snow water equivalent [mm] SoilMoisture => noahmp%water%state%SoilMoisture ,& ! in, total soil moisture [m3/m3] WaterStorageAquifer => noahmp%water%state%WaterStorageAquifer ,& ! in, water storage in aquifer [mm] + WaterStorageWetland => noahmp%water%state%WaterStorageWetland ,& ! in, water storage in wetland [mm] WaterStorageTotBeg => noahmp%water%state%WaterStorageTotBeg & ! out, total water storage [mm] at the beginning ) ! ---------------------------------------------------------------------- ! compute total water storage before NoahMP processes if ( SurfaceType == 1 ) then ! soil - WaterStorageTotBeg = CanopyLiqWater + CanopyIce + SnowWaterEquiv + WaterStorageAquifer + WaterStorageTotBeg = CanopyLiqWater + CanopyIce + SnowWaterEquiv + WaterStorageAquifer + WaterStorageWetland do LoopInd = 1, NumSoilLayer WaterStorageTotBeg = WaterStorageTotBeg + SoilMoisture(LoopInd) * ThicknessSnowSoilLayer(LoopInd) * 1000.0 enddo @@ -87,6 +88,7 @@ subroutine BalanceWaterCheck(noahmp) SnowWaterEquiv => noahmp%water%state%SnowWaterEquiv ,& ! in, snow water equivalent [mm] SoilMoisture => noahmp%water%state%SoilMoisture ,& ! in, total soil moisture [m3/m3] WaterStorageAquifer => noahmp%water%state%WaterStorageAquifer ,& ! in, water storage in aquifer [mm] + WaterStorageWetland => noahmp%water%state%WaterStorageWetland ,& ! in, water storage in wetland [mm] WaterStorageTotBeg => noahmp%water%state%WaterStorageTotBeg ,& ! in, total water storage [mm] at the beginning PrecipTotRefHeight => noahmp%water%flux%PrecipTotRefHeight ,& ! in, total precipitation [mm/s] at reference height EvapCanopyNet => noahmp%water%flux%EvapCanopyNet ,& ! in, evaporation of intercepted water [mm/s] @@ -116,7 +118,7 @@ subroutine BalanceWaterCheck(noahmp) ! only water balance check for every soil timestep ! Error in water balance should be < 0.1 mm if ( SurfaceType == 1 ) then ! soil - WaterStorageTotEnd = CanopyLiqWater + CanopyIce + SnowWaterEquiv + WaterStorageAquifer + WaterStorageTotEnd = CanopyLiqWater + CanopyIce + SnowWaterEquiv + WaterStorageAquifer + WaterStorageWetland do LoopInd = 1, NumSoilLayer WaterStorageTotEnd = WaterStorageTotEnd + SoilMoisture(LoopInd) * ThicknessSnowSoilLayer(LoopInd) * 1000.0 enddo @@ -143,11 +145,11 @@ subroutine BalanceWaterCheck(noahmp) write(*, & '(" GridIndexI GridIndexJ SfcWaterTotChgAcc PrecipTotRefHeightAcc IrrigationRateMicro & IrrigationRateFlood EvapCanopyNetAcc EvapGroundNetAcc TranspirationAcc RunoffSurface & - RunoffSubsurface WaterTableDepth TileDrain")') - write(*,'(i6,i6,f10.3,10f10.5)') GridIndexI, GridIndexJ, SfcWaterTotChgAcc, PrecipTotAcc, & + RunoffSubsurface WaterTableDepth TileDrain WaterStorageWetland ")') + write(*,'(i6,i6,f10.3,11f10.5)') GridIndexI, GridIndexJ, SfcWaterTotChgAcc, PrecipTotAcc, & IrrigationRateMicro*1000.0, IrrigationRateFlood*1000.0, & EvapCanopyNetAcc, EvapGroundNetAcc, TranspirationAcc, RunoffSurface, & - RunoffSubsurface, WaterTableDepth, TileDrain + RunoffSubsurface, WaterTableDepth, TileDrain, WaterStorageWetland stop "Error: Water budget problem in NoahMP LSM" endif #endif diff --git a/src/ConfigVarInitMod.F90 b/src/ConfigVarInitMod.F90 index 6d59d244..bfc8cc6a 100644 --- a/src/ConfigVarInitMod.F90 +++ b/src/ConfigVarInitMod.F90 @@ -46,11 +46,14 @@ 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 + noahmp%config%nmlist%OptWetlandModel = undefined_int ! config domain variable noahmp%config%domain%LandUseDataName = "MODIFIED_IGBP_MODIS_NOAH" noahmp%config%domain%FlagUrban = .false. noahmp%config%domain%FlagCropland = .false. + noahmp%config%domain%FlagWetland = .false. noahmp%config%domain%FlagDynamicCrop = .false. noahmp%config%domain%FlagDynamicVeg = .false. noahmp%config%domain%FlagSoilProcess = .false. diff --git a/src/ConfigVarType.F90 b/src/ConfigVarType.F90 index d1d6c49f..6eae6e03 100644 --- a/src/ConfigVarType.F90 +++ b/src/ConfigVarType.F90 @@ -122,7 +122,13 @@ module ConfigVarType integer :: OptGlacierTreatment ! options for glacier treatment ! 1 -> include phase change of ice (default) ! 2 -> ice treatment more like original Noah - !SNICAR + integer :: OptSnowCompaction ! options for ground snow compaction + ! 1 -> original scheme from Anderson (1976) + ! 2 -> new scheme from Abolafia-Rosenzweig et al. (2024) + integer :: OptWetlandModel ! option for wetland model + ! 0 -> No Wetland model (default) + ! 1 -> Single-point/uniform parameter (Zhang, et al. 2022 WRR) + ! 2 -> 2-D regional parameter input (Zhang, et al. 2022 WRR) integer :: OptSnicarSnowShape ! options for snow grain shape in SNICAR (He et al. 2017 JC) ! 1 -> sphere ! 2 -> spheroid @@ -134,14 +140,14 @@ module ConfigVarType logical :: FlagSnicarSnowBCIntmix ! flag to determine SNICAR, false->external mixing for all BC ; true->internal mixing for hydrophilic BC logical :: FlagSnicarSnowDustIntmix ! flag to determine SNICAR, false->external mixing for all dust; true->internal mixing for all dust logical :: FlagSnicarUseAerosol ! option to turn on/off aerosol deposition flux effect in snow in SNICAR - ! .false. -> without aerosol deposition flux effect - ! .true. -> with aerosol deposition flux effect + ! .false. -> without aerosol deposition flux effect + ! .true. -> with aerosol deposition flux effect logical :: FlagSnicarUseOC ! option to activate OC in snow in SNICAR - ! .false. -> without organic carbon in snow - ! .true. -> with organic carbon in snow + ! .false. -> without organic carbon in snow + ! .true. -> with organic carbon in snow logical :: FlagSnicarAerosolReadTable ! option to read aerosol deposition fluxes from table or not - ! .false. -> data read from NetCDF forcing file - ! .true. -> data read from table + ! .false. -> data read from NetCDF forcing file + ! .true. -> data read from table end type namelist_type @@ -151,6 +157,7 @@ module ConfigVarType character(len=256) :: LandUseDataName ! landuse dataset name (USGS or MODIFIED_IGBP_MODIS_NOAH) logical :: FlagUrban ! flag for urban grid logical :: FlagCropland ! flag to identify croplands + logical :: FlagWetland ! flag to identify wetlands logical :: FlagDynamicCrop ! flag to activate dynamic crop model logical :: FlagDynamicVeg ! flag to activate dynamic vegetation scheme logical :: FlagSoilProcess ! flag to determine if calculating soil processes diff --git a/src/GeneralInitMod.F90 b/src/GeneralInitMod.F90 index 551e0176..f26fe71f 100644 --- a/src/GeneralInitMod.F90 +++ b/src/GeneralInitMod.F90 @@ -27,12 +27,16 @@ subroutine GeneralInit(noahmp) ! -------------------------------------------------------------------- associate( & + LandUseDataName => noahmp%config%domain%LandUseDataName ,& ! in, landuse data name (USGS or MODIS_IGBP) + VegType => noahmp%config%domain%VegType ,& ! in, vegetation type NumSoilLayer => noahmp%config%domain%NumSoilLayer ,& ! in, number of soil layers DepthSoilLayer => noahmp%config%domain%DepthSoilLayer ,& ! in, depth [m] of layer-bottom from soil surface NumSoilLayerRoot => noahmp%water%param%NumSoilLayerRoot ,& ! in, number of soil layers with root present NumSnowLayerNeg => noahmp%config%domain%NumSnowLayerNeg ,& ! in, actual number of snow layers (negative) DepthSnowSoilLayer => noahmp%config%domain%DepthSnowSoilLayer ,& ! in, depth of snow/soil layer-bottom [m] TemperatureSoilSnow => noahmp%energy%state%TemperatureSoilSnow ,& ! in, snow and soil layer temperature [K] + FlagCropland => noahmp%config%domain%FlagCropland ,& ! out, flag to identify croplands + FlagWetland => noahmp%config%domain%FlagWetland ,& ! out, flag to identify wetlands ThicknessSnowSoilLayer => noahmp%config%domain%ThicknessSnowSoilLayer ,& ! out, thickness of snow/soil layers [m] TemperatureRootZone => noahmp%energy%state%TemperatureRootZone & ! out, root-zone averaged temperature [K] ) @@ -54,6 +58,17 @@ subroutine GeneralInit(noahmp) TemperatureSoilSnow(LoopInd) * ThicknessSnowSoilLayer(LoopInd) / (-DepthSoilLayer(NumSoilLayerRoot)) enddo + ! initialize special land type flags + FlagCropland = .false. + FlagWetland = .false. + if ( trim(LandUseDataName) == "USGS" ) then + if ( (VegType >= 3 ) .and. (VegType <= 6 ) ) FlagCropland = .true. + if ( (VegType >= 17) .and. (VegType <= 18) ) FlagWetland = .true. + elseif ( trim(LandUseDataName) == "MODIFIED_IGBP_MODIS_NOAH") then + if ( (VegType == 12) .or. (VegType == 14) ) FlagCropland = .true. + if ( (VegType == 11) ) FlagWetland = .true. + endif + end associate end subroutine GeneralInit diff --git a/src/GroundWaterTopModelMod.F90 b/src/GroundWaterTopModelMod.F90 index 5e67f648..36bfdc22 100644 --- a/src/GroundWaterTopModelMod.F90 +++ b/src/GroundWaterTopModelMod.F90 @@ -127,6 +127,7 @@ subroutine GroundWaterTopModel(noahmp) ! Matric potential at the layer above the water table SatDegUnsatSoil = min(1.0, SoilMoisture(IndUnsatSoil)/SoilMoistureSat(IndUnsatSoil)) SatDegUnsatSoil = max(SatDegUnsatSoil, real(0.01,kind=8)) + if (SatDegUnsatSoil < 0.01) SatDegUnsatSoil = 0.01 ! avoid max() function leakage above for SatDegUnsatSoil less than but very close to 0.01 SoilMatPotFrz = -SoilMatPotentialSat(IndUnsatSoil) * 1000.0 * & SatDegUnsatSoil**(-SoilExpCoeffB(IndUnsatSoil)) ! m -> mm SoilMatPotFrz = max(-120000.0, MicroPoreContent*SoilMatPotFrz) diff --git a/src/IrrigationPrepareMod.F90 b/src/IrrigationPrepareMod.F90 index 108bbe68..2996f107 100644 --- a/src/IrrigationPrepareMod.F90 +++ b/src/IrrigationPrepareMod.F90 @@ -27,8 +27,7 @@ subroutine IrrigationPrepare(noahmp) ! ---------------------------------------------------------------------- associate( & - LandUseDataName => noahmp%config%domain%LandUseDataName ,& ! in, landuse data name (USGS or MODIS_IGBP) - VegType => noahmp%config%domain%VegType ,& ! in, vegetation type + FlagCropland => noahmp%config%domain%FlagCropland ,& ! in, flag to identify croplands FlagSoilProcess => noahmp%config%domain%FlagSoilProcess ,& ! in, flag to calculate soil processes OptIrrigationMethod => noahmp%config%nmlist%OptIrrigationMethod ,& ! in, irrigation method option IrriFracThreshold => noahmp%water%param%IrriFracThreshold ,& ! in, irrigation fraction threshold @@ -38,23 +37,12 @@ subroutine IrrigationPrepare(noahmp) IrrigationAmtFlood => noahmp%water%state%IrrigationAmtFlood ,& ! inout, flood irrigation water amount [m] IrrigationAmtMicro => noahmp%water%state%IrrigationAmtMicro ,& ! inout, micro irrigation water amount [m] RainfallRefHeight => noahmp%water%flux%RainfallRefHeight ,& ! inout, rainfall [mm/s] at reference height - FlagCropland => noahmp%config%domain%FlagCropland ,& ! out, flag to identify croplands IrrigationFracSprinkler => noahmp%water%state%IrrigationFracSprinkler ,& ! out, sprinkler irrigation fraction (0 to 1) IrrigationFracMicro => noahmp%water%state%IrrigationFracMicro ,& ! out, fraction of grid under micro irrigation (0 to 1) IrrigationFracFlood => noahmp%water%state%IrrigationFracFlood & ! out, fraction of grid under flood irrigation (0 to 1) ) ! ---------------------------------------------------------------------- - ! initialize - FlagCropland = .false. - - ! determine cropland - if ( trim(LandUseDataName) == "USGS" ) then - if ( (VegType >= 3) .and. (VegType <= 6) ) FlagCropland = .true. - elseif ( trim(LandUseDataName) == "MODIFIED_IGBP_MODIS_NOAH") then - if ( (VegType == 12) .or. (VegType == 14) ) FlagCropland = .true. - endif - ! if OptIrrigationMethod = 0 and if methods are unknown for certain area, then use sprinkler irrigation method if ( (OptIrrigationMethod == 0) .and. (IrrigationFracSprinkler == 0.0) .and. (IrrigationFracMicro == 0.0) & .and. (IrrigationFracFlood == 0.0) .and. (IrrigationFracGrid >= IrriFracThreshold) ) then diff --git a/src/Makefile b/src/Makefile index 70b69ce5..49db7151 100644 --- a/src/Makefile +++ b/src/Makefile @@ -36,12 +36,15 @@ OBJS = ConstantDefineMod.o \ RunoffSurfaceTopModelMmfMod.o \ RunoffSurfaceVicMod.o \ RunoffSurfaceXinAnJiangMod.o \ + RunoffSurfaceWetlandMod.o \ + WetlandWaterZhang22Mod.o \ ShallowWaterTableMmfMod.o \ SnowfallBelowCanopyMod.o \ SnowLayerCombineMod.o \ SnowLayerDivideMod.o \ SnowLayerWaterComboMod.o \ SnowpackCompactionMod.o \ + SnowpackCompactionAR24Mod.o \ SnowpackHydrologyMod.o \ SnowWaterMainMod.o \ SoilHydraulicPropertyMod.o \ @@ -203,6 +206,8 @@ RunoffSurfaceTopModelGrdMod.o: ../utility/Machine.o NoahmpVarType.o Const RunoffSurfaceTopModelMmfMod.o: ../utility/Machine.o NoahmpVarType.o ConstantDefineMod.o RunoffSurfaceVicMod.o: ../utility/Machine.o NoahmpVarType.o ConstantDefineMod.o RunoffSurfaceXinAnJiangMod.o: ../utility/Machine.o NoahmpVarType.o ConstantDefineMod.o +RunoffSurfaceWetlandMod.o: ../utility/Machine.o NoahmpVarType.o ConstantDefineMod.o +WetlandWaterZhang22Mod.o: ../utility/Machine.o NoahmpVarType.o ConstantDefineMod.o ShallowWaterTableMmfMod.o: ../utility/Machine.o NoahmpVarType.o ConstantDefineMod.o SnowfallBelowCanopyMod.o: ../utility/Machine.o NoahmpVarType.o ConstantDefineMod.o SnowLayerCombineMod.o: ../utility/Machine.o NoahmpVarType.o ConstantDefineMod.o \ @@ -211,11 +216,13 @@ 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 SnowAerosolSnicarMod.o + SnowLayerCombineMod.o SnowpackHydrologyMod.o SnowpackCompactionAR24Mod.o \ + SnowAerosolSnicarMod.o SoilHydraulicPropertyMod.o: ../utility/Machine.o NoahmpVarType.o ConstantDefineMod.o SoilMoistureSolverMod.o: ../utility/Machine.o NoahmpVarType.o ConstantDefineMod.o \ MatrixSolverTriDiagonalMod.o @@ -235,7 +242,8 @@ SoilWaterMainMod.o: ../utility/Machine.o NoahmpVarType.o Const RunoffSubSurfaceEquiWaterTableMod.o RunoffSubSurfaceGroundWaterMod.o \ RunoffSubSurfaceDrainageMod.o RunoffSubSurfaceShallowMmfMod.o \ SoilWaterDiffusionRichardsMod.o SoilMoistureSolverMod.o \ - TileDrainageSimpleMod.o TileDrainageHooghoudtMod.o + TileDrainageSimpleMod.o TileDrainageHooghoudtMod.o \ + RunoffSurfaceWetlandMod.o TileDrainageEquiDepthMod.o: ../utility/Machine.o NoahmpVarType.o ConstantDefineMod.o TileDrainageHooghoudtMod.o: ../utility/Machine.o NoahmpVarType.o ConstantDefineMod.o \ TileDrainageEquiDepthMod.o WaterTableDepthSearchMod.o \ @@ -243,7 +251,7 @@ TileDrainageHooghoudtMod.o: ../utility/Machine.o NoahmpVarType.o Const TileDrainageSimpleMod.o: ../utility/Machine.o NoahmpVarType.o ConstantDefineMod.o WaterMainMod.o: ../utility/Machine.o NoahmpVarType.o ConstantDefineMod.o \ CanopyHydrologyMod.o SnowWaterMainMod.o IrrigationFloodMod.o \ - IrrigationMicroMod.o SoilWaterMainMod.o + IrrigationMicroMod.o SoilWaterMainMod.o WetlandWaterZhang22Mod.o WaterTableDepthSearchMod.o: ../utility/Machine.o NoahmpVarType.o ConstantDefineMod.o WaterTableEquilibriumMod.o: ../utility/Machine.o NoahmpVarType.o ConstantDefineMod.o IrrigationTriggerMod.o: ../utility/Machine.o NoahmpVarType.o ConstantDefineMod.o @@ -355,7 +363,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 SnowAerosolSnicarMod.o + SnowpackHydrologyGlacierMod.o SnowpackCompactionAR24Mod.o SnowAerosolSnicarMod.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 SnowAlbedoSnicarMod.o \ diff --git a/src/RunoffSurfaceWetlandMod.F90 b/src/RunoffSurfaceWetlandMod.F90 new file mode 100644 index 00000000..f66e5dcd --- /dev/null +++ b/src/RunoffSurfaceWetlandMod.F90 @@ -0,0 +1,50 @@ +module RunoffSurfaceWetlandMod + +!!! Calculate surface runoff based on first-layer soil moisture with wetland scheme (Zhang et al., 2022) + + use Machine + use NoahmpVarType + use ConstantDefineMod + + implicit none + +contains + + subroutine RunoffSurfaceWetland(noahmp) + +! ------------------------ Code history -------------------------------------------------- +! Refactered code: C. He, P. Valayamkunnath, & refactor team (He et al. 2023) +! Implemented by Z. Zhang (Zhang et al. 2022) +! ---------------------------------------------------------------------------------------- + + implicit none + + type(noahmp_type), intent(inout) :: noahmp + +! -------------------------------------------------------------------- + associate( & + SoilSfcInflowMean => noahmp%water%flux%SoilSfcInflowMean ,& ! in, mean water input on soil surface [m/s] + SoilSfcSatFracMax => noahmp%water%param%SoilSfcSatFracMax ,& ! in, maximum surface saturated fraction (global mean) + SoilImpervFrac => noahmp%water%state%SoilImpervFrac ,& ! in, impervious fraction due to frozen soil + SoilLiqWater => noahmp%water%state%SoilLiqWater ,& ! in, soil water content [m3/m3] + SoilMoistureSat => noahmp%water%param%SoilMoistureSat ,& ! in, saturated value of soil moisture [m3/m3] + SoilSaturateFrac => noahmp%water%state%SoilSaturateFrac ,& ! out, fractional saturated area for soil moisture + RunoffSurface => noahmp%water%flux%RunoffSurface ,& ! out, surface runoff [m/s] + InfilRateSfc => noahmp%water%flux%InfilRateSfc & ! out, infiltration rate at surface [m/s] + ) +! ---------------------------------------------------------------------- + + ! compute saturated area fraction, based on top-layer soil moisture + SoilSaturateFrac = SoilSfcSatFracMax * (SoilLiqWater(1)/SoilMoistureSat(1)) + + ! compute surface runoff and infiltration m/s + if ( SoilSfcInflowMean > 0.0 ) then + RunoffSurface = SoilSfcInflowMean * ((1.0-SoilImpervFrac(1)) * SoilSaturateFrac + SoilImpervFrac(1)) + InfilRateSfc = SoilSfcInflowMean - RunoffSurface + endif + + end associate + + end subroutine RunoffSurfaceWetland + +end module RunoffSurfaceWetlandMod diff --git a/src/SnowWaterMainGlacierMod.F90 b/src/SnowWaterMainGlacierMod.F90 index 561bdd44..457fbe6a 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 @@ -41,6 +42,7 @@ subroutine SnowWaterMainGlacier(noahmp) MainTimeStep => noahmp%config%domain%MainTimeStep ,& ! in, noahmp main time step [s] OptSnowAlbedo => noahmp%config%nmlist%OptSnowAlbedo ,& ! in, options for ground snow surface albedo 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] @@ -76,8 +78,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 6e6d80df..b09bad14 100644 --- a/src/SnowWaterMainMod.F90 +++ b/src/SnowWaterMainMod.F90 @@ -6,12 +6,13 @@ 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 SnowAerosolSnicarMod + use SnowfallBelowCanopyMod, only : SnowfallAfterCanopyIntercept + use SnowpackCompactionMod, only : SnowpackCompaction + use SnowpackCompactionAR24Mod, only : SnowpackCompactionAR24 + use SnowLayerCombineMod, only : SnowLayerCombine + use SnowLayerDivideMod, only : SnowLayerDivide + use SnowpackHydrologyMod, only : SnowpackHydrology + use SnowAerosolSnicarMod, only : SnowAerosolSnicar implicit none @@ -41,6 +42,7 @@ subroutine SnowWaterMain(noahmp) MainTimeStep => noahmp%config%domain%MainTimeStep ,& ! in, noahmp main time step [s] OptSnowAlbedo => noahmp%config%nmlist%OptSnowAlbedo ,& ! in, options for ground snow surface albedo 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] @@ -76,8 +78,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/SoilWaterMainMod.F90 b/src/SoilWaterMainMod.F90 index a03a983b..cae67801 100644 --- a/src/SoilWaterMainMod.F90 +++ b/src/SoilWaterMainMod.F90 @@ -14,6 +14,7 @@ module SoilWaterMainMod use RunoffSurfaceVicMod, only : RunoffSurfaceVIC use RunoffSurfaceXinAnJiangMod, only : RunoffSurfaceXinAnJiang use RunoffSurfaceDynamicVicMod, only : RunoffSurfaceDynamicVic + use RunoffSurfaceWetlandMod, only : RunoffSurfaceWetland use RunoffSubSurfaceEquiWaterTableMod, only : RunoffSubSurfaceEquiWaterTable use RunoffSubSurfaceGroundWaterMod, only : RunoffSubSurfaceGroundWater use RunoffSubSurfaceDrainageMod, only : RunoffSubSurfaceDrainage @@ -65,9 +66,11 @@ subroutine SoilWaterMain(noahmp) SoilTimeStep => noahmp%config%domain%SoilTimeStep ,& ! in, noahmp soil time step [s] ThicknessSnowSoilLayer => noahmp%config%domain%ThicknessSnowSoilLayer ,& ! in, thickness of snow/soil layers [m] FlagUrban => noahmp%config%domain%FlagUrban ,& ! in, logical flag for urban grid + FlagWetland => noahmp%config%domain%FlagWetland ,& ! in, logical flag for wetland grid OptRunoffSurface => noahmp%config%nmlist%OptRunoffSurface ,& ! in, options for surface runoff OptRunoffSubsurface => noahmp%config%nmlist%OptRunoffSubsurface ,& ! in, options for subsurface runoff OptTileDrainage => noahmp%config%nmlist%OptTileDrainage ,& ! in, options for tile drainage + OptWetlandModel => noahmp%config%nmlist%OptWetlandModel ,& ! in, options for wetland model SoilIce => noahmp%water%state%SoilIce ,& ! in, soil ice content [m3/m3] TileDrainFrac => noahmp%water%state%TileDrainFrac ,& ! in, tile drainage map (fraction) SoilSfcInflowMean => noahmp%water%flux%SoilSfcInflowMean ,& ! in, mean water input on soil surface [m/s] @@ -149,6 +152,10 @@ subroutine SoilWaterMain(noahmp) if ( OptRunoffSurface == 7 ) call RunoffSurfaceXinAnJiang(noahmp,SoilTimeStep) if ( OptRunoffSurface == 8 ) call RunoffSurfaceDynamicVic(noahmp,SoilTimeStep,InfilSfcAcc) + ! special treatment for wetland points (due to subgrid wetland treatment, currently no flag control) + !if ( (FlagWetland .eqv. .true.) .and. (OptWetlandModel > 0) ) call RunoffSurfaceWetland(noahmp) + if ( OptWetlandModel > 0 ) call RunoffSurfaceWetland(noahmp) + ! determine iteration times to solve soil water diffusion and moisture NumIterSoilWat = 3 if ( (InfilRateSfc*SoilTimeStep) > (ThicknessSnowSoilLayer(1)*SoilMoistureSat(1)) ) then diff --git a/src/SurfaceAlbedoGlacierMod.F90 b/src/SurfaceAlbedoGlacierMod.F90 index a7be323e..b084e58a 100644 --- a/src/SurfaceAlbedoGlacierMod.F90 +++ b/src/SurfaceAlbedoGlacierMod.F90 @@ -62,8 +62,11 @@ subroutine SurfaceAlbedoGlacier(noahmp) FracRadSwAbsSnowDif(:,IndBand) = 0.0 enddo + ! snow aging (allow nighttime BATS snow albedo aging) + call SnowAgingBats(noahmp) + + ! snow grain size and aging for SNICAR if ( OptSnowAlbedo == 3 ) then - ! snow radius call SnowFreshRadius(noahmp) call SnowAgingSnicar(noahmp) endif @@ -71,9 +74,6 @@ subroutine SurfaceAlbedoGlacier(noahmp) ! solar radiation process is only done if there is light if ( CosSolarZenithAngle > 0 ) then - ! snow aging - call SnowAgingBats(noahmp) - ! snow albedo if ( OptSnowAlbedo == 1 ) call SnowAlbedoBats(noahmp) if ( OptSnowAlbedo == 2 ) call SnowAlbedoClass(noahmp) diff --git a/src/SurfaceAlbedoMod.F90 b/src/SurfaceAlbedoMod.F90 index a5774fe8..b8323243 100644 --- a/src/SurfaceAlbedoMod.F90 +++ b/src/SurfaceAlbedoMod.F90 @@ -112,8 +112,11 @@ subroutine SurfaceAlbedo(noahmp) enddo VegAreaIndEff = LeafAreaIndEff + StemAreaIndEff + ! snow aging (allow nighttime BATS snow albedo aging) + call SnowAgingBats(noahmp) + + ! snow grain size and aging for SNICAR if ( OptSnowAlbedo == 3 ) then - ! snow radius call SnowFreshRadius(noahmp) call SnowAgingSnicar(noahmp) endif @@ -129,9 +132,6 @@ subroutine SurfaceAlbedo(noahmp) TransmittanceVeg(IndBand) = max(TransmittanceLeaf(IndBand)*LeafWgt+TransmittanceStem(IndBand)*StemWgt, MinThr) enddo - ! snow aging - call SnowAgingBats(noahmp) - ! snow albedos if ( OptSnowAlbedo == 1 ) call SnowAlbedoBats(noahmp) if ( OptSnowAlbedo == 2 ) call SnowAlbedoClass(noahmp) diff --git a/src/WaterMainMod.F90 b/src/WaterMainMod.F90 index d737e81e..988961f5 100644 --- a/src/WaterMainMod.F90 +++ b/src/WaterMainMod.F90 @@ -6,11 +6,12 @@ module WaterMainMod use Machine use NoahmpVarType use ConstantDefineMod - use CanopyHydrologyMod, only : CanopyHydrology - use SnowWaterMainMod, only : SnowWaterMain - use IrrigationFloodMod, only : IrrigationFlood - use IrrigationMicroMod, only : IrrigationMicro - use SoilWaterMainMod, only : SoilWaterMain + use CanopyHydrologyMod, only : CanopyHydrology + use SnowWaterMainMod, only : SnowWaterMain + use IrrigationFloodMod, only : IrrigationFlood + use IrrigationMicroMod, only : IrrigationMicro + use SoilWaterMainMod, only : SoilWaterMain + use WetlandWaterZhang22Mod, only : WetlandWaterZhang22 implicit none @@ -37,9 +38,11 @@ subroutine WaterMain(noahmp) SoilTimeStep => noahmp%config%domain%SoilTimeStep ,& ! in, soil process timestep [s] SurfaceType => noahmp%config%domain%SurfaceType ,& ! in, surface type 1-soil; 2-lake FlagCropland => noahmp%config%domain%FlagCropland ,& ! in, flag to identify croplands + FlagWetland => noahmp%config%domain%FlagWetland ,& ! in, flag to identify wetlands FlagUrban => noahmp%config%domain%FlagUrban ,& ! in, urban point flag FlagSoilProcess => noahmp%config%domain%FlagSoilProcess ,& ! in, flag to calculate soil processes NumSoilTimeStep => noahmp%config%domain%NumSoilTimeStep ,& ! in, number of timesteps for soil process calculation + OptWetlandModel => noahmp%config%nmlist%OptWetlandModel ,& ! in, options for wetland model VaporizeGrd => noahmp%water%flux%VaporizeGrd ,& ! in, ground vaporize rate total (evap+sublim) [mm/s] CondenseVapGrd => noahmp%water%flux%CondenseVapGrd ,& ! in, ground vapor condense rate total (dew+frost) [mm/s] RainfallGround => noahmp%water%flux%RainfallGround ,& ! in, ground surface rain rate [mm/s] @@ -71,6 +74,7 @@ subroutine WaterMain(noahmp) SublimSnowSfcIce => noahmp%water%flux%SublimSnowSfcIce ,& ! inout, snow surface sublimation rate[mm/s] TranspWatLossSoil => noahmp%water%flux%TranspWatLossSoil ,& ! inout, transpiration water loss from soil layers [m/s] GlacierExcessFlow => noahmp%water%flux%GlacierExcessFlow ,& ! inout, glacier excess flow [mm/s] + GlacierExcessFlowAcc => noahmp%water%flux%GlacierExcessFlowAcc ,& ! inout, accumulated glacier excess flow [mm] SoilSfcInflowAcc => noahmp%water%flux%SoilSfcInflowAcc ,& ! inout, accumulated water flux into soil during soil timestep [m/s * dt_soil/dt_main] EvapSoilSfcLiqAcc => noahmp%water%flux%EvapSoilSfcLiqAcc ,& ! inout, accumulated soil surface evaporation during soil timestep [m/s * dt_soil/dt_main] TranspWatLossSoilAcc => noahmp%water%flux%TranspWatLossSoilAcc ,& ! inout, accumualted transpiration water loss during soil timestep [m/s * dt_soil/dt_main] @@ -94,10 +98,9 @@ subroutine WaterMain(noahmp) ! initialize TranspWatLossSoil = 0.0 - GlacierExcessFlow = 0.0 - RunoffSubsurface = 0.0 - RunoffSurface = 0.0 SoilSfcInflow = 0.0 + RunoffSurface = 0.0 + RunoffSubsurface = 0.0 TileDrain = 0.0 ! prepare for water process @@ -128,6 +131,9 @@ subroutine WaterMain(noahmp) ! snowpack water processs call SnowWaterMain(noahmp) + ! accumulate glacier excessive flow [mm] + GlacierExcessFlowAcc = GlacierExcessFlowAcc + GlacierExcessFlow * MainTimeStep + ! treat frozen ground/soil if ( FlagFrozenGround .eqv. .true. ) then SoilIce(1) = SoilIce(1) + (DewSoilSfcLiq-EvapSoilSfcLiq) * MainTimeStep / & @@ -190,10 +196,10 @@ subroutine WaterMain(noahmp) call SoilWaterMain(noahmp) endif - endif ! FlagSoilProcess soil timestep + ! merge excess glacier snow flow to subsurface runoff + RunoffSubsurface = RunoffSubsurface + GlacierExcessFlowAcc ! mm per soil timestep - ! merge excess glacier snow flow to subsurface runoff - RunoffSubsurface = RunoffSubsurface + GlacierExcessFlow * MainTimeStep ! mm per soil timestep + endif ! FlagSoilProcess soil timestep ! update surface water vapor flux ! urban - jref WaterToAtmosTotal = Transpiration + EvapCanopyNet + EvapGroundNet @@ -202,6 +208,12 @@ subroutine WaterMain(noahmp) SpecHumidity2mBare = SpecHumiditySfc endif + ! call surface wetland scheme (due to subgrid wetland treatment, currently no flag control) + !if ( (FlagWetland .eqv. .true.) .and. (OptWetlandModel > 0) ) then + if ( OptWetlandModel > 0 ) then + call WetlandWaterZhang22(noahmp,MainTimeStep) + endif + end associate end subroutine WaterMain diff --git a/src/WaterVarInitMod.F90 b/src/WaterVarInitMod.F90 index 6b4c9b21..c011bee2 100644 --- a/src/WaterVarInitMod.F90 +++ b/src/WaterVarInitMod.F90 @@ -78,6 +78,7 @@ subroutine WaterVarInitDefault(noahmp) noahmp%water%state%PrecipAreaFrac = undefined_real noahmp%water%state%TileDrainFrac = undefined_real noahmp%water%state%FrozenPrecipFrac = undefined_real + noahmp%water%state%WaterStorageWetland = undefined_real if ( .not. allocated(noahmp%water%state%IndexPhaseChange) ) & allocate( noahmp%water%state%IndexPhaseChange(-NumSnowLayerMax+1:NumSoilLayer) ) @@ -184,6 +185,7 @@ subroutine WaterVarInitDefault(noahmp) noahmp%water%flux%WaterToAtmosTotal = undefined_real noahmp%water%flux%EvapSoilSfcLiqAcc = undefined_real noahmp%water%flux%SoilSfcInflowAcc = undefined_real + noahmp%water%flux%GlacierExcessFlowAcc = undefined_real noahmp%water%flux%SfcWaterTotChgAcc = undefined_real noahmp%water%flux%PrecipTotAcc = undefined_real noahmp%water%flux%EvapCanopyNetAcc = undefined_real @@ -236,6 +238,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 @@ -282,6 +290,7 @@ subroutine WaterVarInitDefault(noahmp) noahmp%water%param%SoilMatPotentialWilt = undefined_real noahmp%water%param%SnowMeltFac = undefined_real noahmp%water%param%SnowCoverFac = undefined_real + noahmp%water%param%WetlandCapMax = undefined_real if ( .not. allocated(noahmp%water%param%SoilMoistureSat) ) & allocate( noahmp%water%param%SoilMoistureSat(1:NumSoilLayer) ) diff --git a/src/WaterVarType.F90 b/src/WaterVarType.F90 index 324bb91b..3f01ae5d 100644 --- a/src/WaterVarType.F90 +++ b/src/WaterVarType.F90 @@ -71,6 +71,7 @@ module WaterVarType real(kind=kind_noahmp) :: EvapCanopyNetAcc ! accumulated net evaporation of canopy intercepted water per soil timestep [mm] real(kind=kind_noahmp) :: TranspirationAcc ! accumulated transpiration per soil timestep [mm] real(kind=kind_noahmp) :: EvapGroundNetAcc ! accumulated net ground (soil/snow) evaporation per soil timestep [mm] + real(kind=kind_noahmp) :: GlacierExcessFlowAcc ! accumulated glacier excessive flow [mm] per soil timestep real(kind=kind_noahmp) :: EvapSoilSfcLiqMean ! mean soil surface water evaporation during soil timestep [m/s] real(kind=kind_noahmp) :: SoilSfcInflowMean ! mean water input on soil surface during soil timestep [m/s] @@ -126,6 +127,7 @@ module WaterVarType real(kind=kind_noahmp) :: WaterStorageAquifer ! water storage in aquifer [mm] real(kind=kind_noahmp) :: WaterStorageSoilAqf ! water storage in aquifer + saturated soil [mm] real(kind=kind_noahmp) :: WaterStorageLake ! water storage in lake (can be negative) [mm] + real(kind=kind_noahmp) :: WaterStorageWetland ! water storage in wetland [mm] real(kind=kind_noahmp) :: WaterHeadSfc ! surface water head [mm] real(kind=kind_noahmp) :: IrrigationFracGrid ! total irrigation fraction from input for a grid real(kind=kind_noahmp) :: PrecipAreaFrac ! fraction of the gridcell that receives precipitation @@ -196,6 +198,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] @@ -242,6 +250,7 @@ module WaterVarType real(kind=kind_noahmp) :: SoilMatPotentialWilt ! soil metric potential for wilting point [m] real(kind=kind_noahmp) :: SnowMeltFac ! snowmelt m parameter in snow cover fraction calculation real(kind=kind_noahmp) :: SnowCoverFac ! snow cover factor [m] (originally hard-coded 2.5*z0 in SCF formulation) + real(kind=kind_noahmp) :: WetlandCapMax ! maximum wetland capacity [m] real(kind=kind_noahmp) :: SnowRadiusMin ! minimum allowed snow effective radius for SNICAR (also cold "fresh snow" value) [microns] real(kind=kind_noahmp) :: FreshSnowRadiusMax ! maximum warm fresh snow effective radius [microns] real(kind=kind_noahmp) :: SnowRadiusRefrz ! Effective radius of re-frozen snow [microns] diff --git a/src/WetlandWaterZhang22Mod.F90 b/src/WetlandWaterZhang22Mod.F90 new file mode 100644 index 00000000..d223de31 --- /dev/null +++ b/src/WetlandWaterZhang22Mod.F90 @@ -0,0 +1,102 @@ +module WetlandWaterZhang22Mod + +!!! Calculate wetland water processes (Zhang et al., 2022), evaporation is estimated based on Priestley Taylor (P-T) Method + + use Machine + use NoahmpVarType + use ConstantDefineMod + + implicit none + +contains + + subroutine WetlandWaterZhang22(noahmp,TimeStep) + +! ------------------------ Code history -------------------------------------------------- +! Refactered code: C. He, P. Valayamkunnath, & refactor team (He et al. 2023) +! Implementation by Z. Zhang (Zhang et al. 2022) +! ---------------------------------------------------------------------------------------- + + implicit none + + type(noahmp_type), intent(inout) :: noahmp + real(kind=kind_noahmp), intent(in) :: TimeStep ! timestep (may not be the same as main model timestep) + +! local variables + real(kind=kind_noahmp) :: LatHeatSpec ! latent heat vap./sublimation [J/kg] + real(kind=kind_noahmp) :: VapPresSlope ! slope of saturation vapor pressure curve + real(kind=kind_noahmp) :: LatHeatPot ! evaporation from P-T method, energy flux [W/m2] + real(kind=kind_noahmp) :: PsychroConst ! gamma psychrometic constant + real(kind=kind_noahmp) :: EvapLatentHeat ! evaporation heat from surface [W/m2] + real(kind=kind_noahmp) :: EvapWaterFlux ! evaporation water from surface [mm/s] + +! -------------------------------------------------------------------- + associate( & + TemperatureSfc => noahmp%energy%state%TemperatureSfc ,& ! in, surface air temperature [K] + RadSwAbsSfc => noahmp%energy%flux%RadSwAbsSfc ,& ! in, total absorbed solar radiation [W/m2] + RadSwReflSfc => noahmp%energy%flux%RadSwReflSfc ,& ! in, total reflected solar radiation [W/m2] + RadLwNetSfc => noahmp%energy%flux%RadLwNetSfc ,& ! in, total net longwave rad [W/m2] (+ to atm) + HeatGroundTot => noahmp%energy%flux%HeatGroundTot ,& ! in, total ground heat flux [W/m2] (+ to soil/snow) + HeatSensibleSfc => noahmp%energy%flux%HeatSensibleSfc ,& ! in, total sensible heat [W/m2] (+ to atm) + SoilSaturateFrac => noahmp%water%state%SoilSaturateFrac ,& ! in, fractional saturated area for soil moisture + WetlandCapMax => noahmp%water%param%WetlandCapMax ,& ! in, maximum wetland capacity [m] + WaterStorageWetland => noahmp%water%state%WaterStorageWetland ,& ! inout, wetland water storage [mm] + RunoffSurface => noahmp%water%flux%RunoffSurface ,& ! inout, surface runoff [mm] per soil timestep + EvapGroundNet => noahmp%water%flux%EvapGroundNet ,& ! inout, accumulated net ground evaporation per soil timestep [mm] + HeatLatentGrd => noahmp%energy%flux%HeatLatentGrd & ! inout, ground evaporation heat flux [W/m2] (+ to atm) + ) +! ---------------------------------------------------------------------- + + ! set initial value + EvapWaterFlux = 0.0 + EvapLatentHeat = 0.0 + + ! set psychrometric constant and VapPresSlope + if ( TemperatureSfc > ConstFreezePoint ) then + LatHeatSpec = ConstLatHeatEvap + else + LatHeatSpec = ConstLatHeatSublim + endif + + ! determine psychrometic constant + if ( TemperatureSfc < (273.15+26.85) ) then + PsychroConst = 0.00040 + else + PsychroConst = 0.00041 + endif + + ! calculate slope VapPresSlope based on surface temperature + if ( TemperatureSfc < (273.15+6.85) ) then + VapPresSlope = 0.00022 + elseif ( TemperatureSfc < (273.15+16.85) ) then + VapPresSlope = 0.00042 + elseif ( TemperatureSfc < (273.15+26.85) ) then + VapPresSlope = 0.00078 + else + VapPresSlope = 0.00132 + endif + + ! compute wetland water balance + LatHeatPot = 1.26 * VapPresSlope * (RadSwAbsSfc - RadLwNetSfc - HeatGroundTot) / & + (VapPresSlope + PsychroConst) ! LatHeatPot Potential latent heat W/m2 P-T method + WaterStorageWetland = WaterStorageWetland + RunoffSurface + if ( WaterStorageWetland > (LatHeatPot*TimeStep/LatHeatSpec*SoilSaturateFrac) ) then ! if current wetland storage is larger than PET rate + EvapWaterFlux = max(LatHeatPot / LatHeatSpec * SoilSaturateFrac, 0.0) ! evaporation rate mm/s + else ! if current wetland storage is less than PET rate + EvapWaterFlux = max(WaterStorageWetland/TimeStep, 0.0) ! use all of it + endif + WaterStorageWetland = max(WaterStorageWetland-EvapWaterFlux*TimeStep,0.0) ! adjust surface wetland storage + + ! adjuest energy and water balance + EvapLatentHeat = EvapWaterFlux * LatHeatSpec ! convert evaporation to latent heat flux + HeatSensibleSfc = HeatSensibleSfc - EvapLatentHeat ! reduce sensible heat flux + HeatLatentGrd = HeatLatentGrd + EvapLatentHeat ! increase direct evaporation + RunoffSurface = max(WaterStorageWetland - WetlandCapMax*1000.0, 0.0) ! excessive storage becomes runoff + EvapGroundNet = EvapGroundNet + EvapWaterFlux ! increase direct evaporation + WaterStorageWetland = min(WetlandCapMax*1000.0, WaterStorageWetland) + + end associate + + end subroutine WetlandWaterZhang22 + +end module WetlandWaterZhang22Mod