Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
19 commits
Select commit Hold shift + click to select a range
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
16 changes: 13 additions & 3 deletions README.md
Original file line number Diff line number Diff line change
Expand Up @@ -8,14 +8,14 @@

Noah-MP<sup>®</sup> 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
Expand All @@ -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**:
Expand Down
4 changes: 3 additions & 1 deletion drivers/hrldas/ConfigVarInTransferMod.F90
Original file line number Diff line number Diff line change
Expand Up @@ -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
Expand Down Expand Up @@ -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
Expand Down
8 changes: 6 additions & 2 deletions drivers/hrldas/NoahmpDriverMainMod.F90
Original file line number Diff line number Diff line change
Expand Up @@ -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
Expand All @@ -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
!---------------------------------------------------------------------
Expand Down
23 changes: 22 additions & 1 deletion drivers/hrldas/NoahmpIOVarInitMod.F90
Original file line number Diff line number Diff line change
Expand Up @@ -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) )
Expand Down Expand Up @@ -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) )
Expand All @@ -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) )
Expand Down Expand Up @@ -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
Expand Down Expand Up @@ -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
Expand Down
20 changes: 20 additions & 0 deletions drivers/hrldas/NoahmpIOVarType.F90
Original file line number Diff line number Diff line change
Expand Up @@ -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]
Expand Down Expand Up @@ -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
Expand Down Expand Up @@ -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
!------------------------------------------------------------------------
Expand Down Expand Up @@ -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)
Expand Down Expand Up @@ -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
Expand Down
4 changes: 4 additions & 0 deletions drivers/hrldas/NoahmpInitMainMod.F90
Original file line number Diff line number Diff line change
Expand Up @@ -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)
Expand Down
10 changes: 7 additions & 3 deletions drivers/hrldas/NoahmpReadNamelistMod.F90
Original file line number Diff line number Diff line change
Expand Up @@ -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
Expand All @@ -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
Expand Down Expand Up @@ -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, &
Expand Down Expand Up @@ -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
Expand Down
Loading