Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
33 commits
Select commit Hold shift + click to select a range
fe8aa45
Add NVP control switches
huitang-earth Apr 9, 2026
b635d4e
Add control switches in namelist definition.
huitang-earth Apr 9, 2026
f53ed36
Initialize a module for NVP layer dynamics and water balance.
huitang-earth Apr 10, 2026
8f5d482
Define NVP layer controllers and variables.
huitang-earth Apr 10, 2026
6f677b7
Pass NVP namelist control to FATES.
huitang-earth Apr 10, 2026
2043eaa
Add centralized parameter module for NVP (temporal solution).
huitang-earth Apr 10, 2026
3711441
Add NVP radiation related variables and parameters.
huitang-earth Apr 10, 2026
a1955f9
Add NVP radiation related variables into history output field.
huitang-earth Apr 10, 2026
e259d4b
Add NVP-enabled SNICAR_RT call.
huitang-earth Apr 10, 2026
80ca26e
Add NVP colum filter which can be used for NVP column loops.
huitang-earth Apr 10, 2026
78ef7a0
Add NVP namelist settings (temporary)
huitang-earth Apr 10, 2026
79cbded
Allow NVP optical properties to be ported into bottom snow layer (lay…
huitang-earth Apr 10, 2026
64bf7b1
Add NVP light absorption for both snow and no-snow case
huitang-earth Apr 10, 2026
2990172
Add NVP radiation wapper for FATES
huitang-earth Apr 10, 2026
a2cf476
Add FATES wrapper for dynamic NVP layer
huitang-earth Apr 10, 2026
84e0ed8
Add NVP temperature state variable t_nvp_col.
huitang-earth Apr 10, 2026
0481b00
Accomdate NVP as layer 0 (snow layer) in soil-snow temperature integ…
huitang-earth Apr 10, 2026
ceedb0f
Add NVP sensible heat flux.
huitang-earth Apr 10, 2026
85fb103
Add NVP sensible and latent heat flux .
huitang-earth Apr 11, 2026
5b1eaf4
Add surface humidity calculation for NVP (similar to soil).
huitang-earth Apr 11, 2026
522d8f5
Add influence of ice content on NVP water retention.
huitang-earth Apr 11, 2026
fea0c85
Add NVP water state variable.
huitang-earth Apr 12, 2026
6caec1b
Add NVP water flux variables.
huitang-earth Apr 12, 2026
56a9757
Add diagnostic NVP water variables.
huitang-earth Apr 12, 2026
5d4c676
Add NVP surface specific humidity.
huitang-earth Apr 12, 2026
b8109a6
Modify soil surface water flux due to NVP presence.
huitang-earth Apr 12, 2026
85d56f9
Add NVP layer water balance calculation.
huitang-earth Apr 12, 2026
50c6bf8
Add NVP photosynthesis wrapper.
huitang-earth Apr 12, 2026
922ab69
Add separate photosynthesis call for NVP.
huitang-earth Apr 12, 2026
6b68bdc
Add call for building NVP filter.
huitang-earth Apr 12, 2026
09c5ad0
Add patch to column integration for NVP evaporation flux.
huitang-earth Apr 12, 2026
d05b7e3
Add restart option for NVP layer.
huitang-earth Apr 12, 2026
ec18da5
Remove redundant update of flx _absdv and flx_absiv for NVP layer whe…
huitang-earth Apr 21, 2026
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
6 changes: 6 additions & 0 deletions bld/namelist_files/namelist_defaults_ctsm.xml
Original file line number Diff line number Diff line change
Expand Up @@ -638,6 +638,12 @@ attributes from the config_cache.xml file (with keys converted to upper-case).
<use_luna use_fates=".true." >.false.</use_luna>
<use_luna phys="clm4_5" use_fates=".false.">.false.</use_luna>

<!-- NVP (non-vascular plant: moss/lichen) ground layer -->
<!-- [PORTED by Hui Tang: NVP control flag defaults] -->
<use_nvp >.false.</use_nvp>
<use_nvp_undersnow >.false.</use_nvp_undersnow>
<nvp_rad_model_ground >.false.</nvp_rad_model_ground>

<!-- Flexible CN options -->
<MM_Nuptake_opt use_flexibleCN=".true." >.true.</MM_Nuptake_opt>
<CNratio_floating use_flexibleCN=".true." >.true.</CNratio_floating>
Expand Down
21 changes: 21 additions & 0 deletions bld/namelist_files/namelist_definition_ctsm.xml
Original file line number Diff line number Diff line change
Expand Up @@ -946,6 +946,27 @@ LUNA operates on C3 and non-crop vegetation (see vcmax_opt for how other veg is
LUNA: Leaf Utilization of Nitrogen for Assimilation
</entry>

<!-- NVP (non-vascular plant: moss/lichen) ground layer -->
<!-- [PORTED by Hui Tang: NVP control flags] -->
<entry id="use_nvp" type="logical" category="physics"
group="clm_inparm" valid_values="" value=".false.">
Toggle to activate the NVP (non-vascular plant: moss/lichen) ground layer.
Requires use_fates=".true.".
</entry>

<entry id="use_nvp_undersnow" type="logical" category="physics"
group="clm_inparm" valid_values="" value=".false.">
Allow the NVP layer to remain active and exchange fluxes when covered by snow.
Only relevant when use_nvp=".true.".
</entry>

<entry id="nvp_rad_model_ground" type="logical" category="physics"
group="clm_inparm" valid_values="" value=".false.">
Use FATES Beer's law radiation model for the NVP ground layer instead of
the CLM bare-ground scheme.
Only relevant when use_nvp=".true.".
</entry>

<entry id="use_hillslope" type="logical" category="physics"
group="clm_inparm" valid_values="" value=".false.">
Toggle to turn on the hillslope model
Expand Down
36 changes: 28 additions & 8 deletions src/biogeophys/BareGroundFluxesMod.F90
Original file line number Diff line number Diff line change
Expand Up @@ -83,7 +83,7 @@ subroutine BareGroundFluxes(bounds, num_noexposedvegp, filter_noexposedvegp, &
use clm_varpar , only : nlevgrnd
use clm_varcon , only : cpair, vkc, grav, denice, denh2o, tfrz
use clm_varcon , only : beta_param, nu_param, meier_param3
use clm_varctl , only : use_lch4, z0param_method
use clm_varctl , only : use_lch4, z0param_method, use_nvp
use landunit_varcon , only : istsoil, istcrop
use QSatMod , only : QSat
use SurfaceResistanceMod , only : do_soilevap_beta,do_soil_resistance_sl14
Expand Down Expand Up @@ -217,21 +217,27 @@ subroutine BareGroundFluxes(bounds, num_noexposedvegp, filter_noexposedvegp, &
t_grnd => temperature_inst%t_grnd_col , & ! Input: [real(r8) (:) ] ground surface temperature [K]
thv => temperature_inst%thv_col , & ! Input: [real(r8) (:) ] virtual potential temperature (kelvin)
thm => temperature_inst%thm_patch , & ! Input: [real(r8) (:) ] intermediate variable (forc_t+0.0098*forc_hgt_t_patch)
t_h2osfc => temperature_inst%t_h2osfc_col , & ! Input: [real(r8) (:) ] surface water temperature
beta => temperature_inst%beta_col , & ! Input: [real(r8) (:) ] coefficient of conective velocity [-]
t_h2osfc => temperature_inst%t_h2osfc_col , & ! Input: [real(r8) (:) ] surface water temperature
! [PORTED by Hui Tang: NVP layer temperature for bare-ground NVP flux]
t_nvp_col => temperature_inst%t_nvp_col , & ! Input: [real(r8) (:) ] NVP layer temperature [K]
beta => temperature_inst%beta_col , & ! Input: [real(r8) (:) ] coefficient of conective velocity [-]

qg_snow => waterdiagnosticbulk_inst%qg_snow_col , & ! Input: [real(r8) (:) ] specific humidity at snow surface [kg/kg]
qg_soil => waterdiagnosticbulk_inst%qg_soil_col , & ! Input: [real(r8) (:) ] specific humidity at soil surface [kg/kg]
qg_h2osfc => waterdiagnosticbulk_inst%qg_h2osfc_col , & ! Input: [real(r8) (:) ] specific humidity at h2osfc surface [kg/kg]
qg_soil => waterdiagnosticbulk_inst%qg_soil_col , & ! Input: [real(r8) (:) ] specific humidity at soil surface [kg/kg]
qg_h2osfc => waterdiagnosticbulk_inst%qg_h2osfc_col , & ! Input: [real(r8) (:) ] specific humidity at h2osfc surface [kg/kg]
! [PORTED by Hui Tang: NVP surface specific humidity for bare-ground NVP flux]
qg_nvp => waterdiagnosticbulk_inst%qg_nvp_col , & ! Input: [real(r8) (:) ] NVP surface specific humidity [kg/kg]
qg => waterdiagnosticbulk_inst%qg_col , & ! Input: [real(r8) (:) ] specific humidity at ground surface [kg/kg]
dqgdT => waterdiagnosticbulk_inst%dqgdT_col , & ! Input: [real(r8) (:) ] temperature derivative of "qg"
h2osoi_ice => waterstatebulk_inst%h2osoi_ice_col , & ! Input: [real(r8) (:,:) ] ice lens (kg/m2)
h2osoi_liq => waterstatebulk_inst%h2osoi_liq_col , & ! Input: [real(r8) (:,:) ] liquid water (kg/m2)
grnd_ch4_cond => ch4_inst%grnd_ch4_cond_patch , & ! Output: [real(r8) (:) ] tracer conductance for boundary layer [m/s]

eflx_sh_snow => energyflux_inst%eflx_sh_snow_patch , & ! Output: [real(r8) (:) ] sensible heat flux from snow (W/m**2) [+ to atm]
eflx_sh_soil => energyflux_inst%eflx_sh_soil_patch , & ! Output: [real(r8) (:) ] sensible heat flux from soil (W/m**2) [+ to atm]
eflx_sh_h2osfc => energyflux_inst%eflx_sh_h2osfc_patch , & ! Output: [real(r8) (:) ] sensible heat flux from soil (W/m**2) [+ to atm]
eflx_sh_snow => energyflux_inst%eflx_sh_snow_patch , & ! Output: [real(r8) (:) ] sensible heat flux from snow (W/m**2) [+ to atm]
eflx_sh_soil => energyflux_inst%eflx_sh_soil_patch , & ! Output: [real(r8) (:) ] sensible heat flux from soil (W/m**2) [+ to atm]
eflx_sh_h2osfc => energyflux_inst%eflx_sh_h2osfc_patch , & ! Output: [real(r8) (:) ] sensible heat flux from surface water (W/m**2) [+ to atm]
! [PORTED by Hui Tang: NVP sensible heat flux for bare ground]
eflx_sh_nvp => energyflux_inst%eflx_sh_nvp_patch , & ! Output: [real(r8) (:) ] sensible heat flux from NVP (W/m**2) [+ to atm]
eflx_sh_grnd => energyflux_inst%eflx_sh_grnd_patch , & ! Output: [real(r8) (:) ] sensible heat flux from ground (W/m**2) [+ to atm]
eflx_sh_tot => energyflux_inst%eflx_sh_tot_patch , & ! Output: [real(r8) (:) ] total sensible heat flux (W/m**2) [+ to atm]
taux => energyflux_inst%taux_patch , & ! Output: [real(r8) (:) ] wind (shear) stress: e-w (kg/m/s**2)
Expand Down Expand Up @@ -274,6 +280,8 @@ subroutine BareGroundFluxes(bounds, num_noexposedvegp, filter_noexposedvegp, &
qflx_ev_snow => waterfluxbulk_inst%qflx_ev_snow_patch , & ! Output: [real(r8) (:) ] evaporation flux from snow (mm H2O/s) [+ to atm]
qflx_ev_soil => waterfluxbulk_inst%qflx_ev_soil_patch , & ! Output: [real(r8) (:) ] evaporation flux from soil (mm H2O/s) [+ to atm]
qflx_ev_h2osfc => waterfluxbulk_inst%qflx_ev_h2osfc_patch , & ! Output: [real(r8) (:) ] evaporation flux from h2osfc (mm H2O/s) [+ to atm]
! [PORTED by Hui Tang: NVP evaporation flux for bare ground]
qflx_ev_nvp => waterfluxbulk_inst%qflx_ev_nvp_patch , & ! Output: [real(r8) (:) ] evaporation flux from NVP (mm H2O/s) [+ to atm]
qflx_evap_soi => waterfluxbulk_inst%qflx_evap_soi_patch , & ! Output: [real(r8) (:) ] soil evaporation (mm H2O/s) (+ = to atm)
qflx_evap_tot => waterfluxbulk_inst%qflx_evap_tot_patch , & ! Output: [real(r8) (:) ] qflx_evap_soi + qflx_evap_can + qflx_tran_veg
qflx_tran_veg => waterfluxbulk_inst%qflx_tran_veg_patch , & ! Output: [real(r8) (:) ] vegetation transpiration (mm H2O/s) (+ = to atm)
Expand Down Expand Up @@ -478,6 +486,12 @@ subroutine BareGroundFluxes(bounds, num_noexposedvegp, filter_noexposedvegp, &
eflx_sh_snow(p) = -raih*(thm(p)-t_soisno(c,snl(c)+1))
eflx_sh_soil(p) = -raih*(thm(p)-t_soisno(c,1))
eflx_sh_h2osfc(p) = -raih*(thm(p)-t_h2osfc(c))
! [PORTED by Hui Tang: NVP sensible heat flux for bare ground, analogous to snow/h2osfc]
if (use_nvp .and. col%frac_nvp(c) > 0._r8) then
eflx_sh_nvp(p) = -raih*(thm(p)-t_nvp_col(c))
else
eflx_sh_nvp(p) = 0._r8
end if

! water fluxes from soil
qflx_tran_veg(p) = 0._r8
Expand All @@ -489,6 +503,12 @@ subroutine BareGroundFluxes(bounds, num_noexposedvegp, filter_noexposedvegp, &
qflx_ev_snow(p) = -raiw*(forc_q(c) - qg_snow(c))
qflx_ev_soil(p) = -raiw*(forc_q(c) - qg_soil(c))
qflx_ev_h2osfc(p) = -raiw*(forc_q(c) - qg_h2osfc(c))
! [PORTED by Hui Tang: NVP evaporation flux for bare ground, analogous to snow/h2osfc]
if (use_nvp .and. col%frac_nvp(c) > 0._r8) then
qflx_ev_nvp(p) = -raiw*(forc_q(c) - qg_nvp(c))
else
qflx_ev_nvp(p) = 0._r8
end if

! 2 m height air temperature
t_ref2m(p) = thm(p) + temp1(p)*dth(p)*(1._r8/temp12m(p) - 1._r8/temp1(p))
Expand Down
Loading