Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Adding Medlyn stomatal conductance model into CTSM-FATES #608

Merged
merged 17 commits into from
Jun 21, 2020
Merged
Show file tree
Hide file tree
Changes from 1 commit
Commits
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
33 changes: 18 additions & 15 deletions biogeophys/FatesPlantRespPhotosynthMod.F90
Original file line number Diff line number Diff line change
Expand Up @@ -169,7 +169,7 @@ subroutine FatesPlantRespPhotosynthDrive (nsites, sites,bc_in,bc_out,dtime)
real(r8) :: mm_ko2 ! Michaelis-Menten constant for O2 (Pa)
real(r8) :: co2_cpoint ! CO2 compensation point (Pa)
real(r8) :: btran_eff ! effective transpiration wetness factor (0 to 1)
real(r8) :: stomatal_intercept_btran ! minimum leaf conductance (umol H2O/m**2/s)
real(r8) :: stomatal_intercept_btran ! water-stressed minimum stomatal conductance (umol H2O/m**2/s)
real(r8) :: kn ! leaf nitrogen decay coefficient
real(r8) :: cf ! s m**2/umol -> s/m (ideal gas conversion) [umol/m3]
real(r8) :: gb_mol ! leaf boundary layer conductance (molar form: [umol /m**2/s])
Expand Down Expand Up @@ -257,7 +257,7 @@ subroutine FatesPlantRespPhotosynthDrive (nsites, sites,bc_in,bc_out,dtime)
slatop => EDPftvarcon_inst%slatop , & ! specific leaf area at top of canopy,
! projected area basis [m^2/gC]
woody => EDPftvarcon_inst%woody , & ! Is vegetation woody or not?
stomatal_intercept => EDPftvarcon_inst%stomatal_intercept ) !stomatal intercept for Ball-Berry model and Medlyn model
stomatal_intercept => EDPftvarcon_inst%stomatal_intercept ) !Unstressed minimum stomatal conductance



Expand Down Expand Up @@ -884,7 +884,7 @@ subroutine LeafLayerPhotosynthesis(f_sun_lsl, & ! in
real(r8), intent(in) :: can_co2_ppress ! Partial pressure of CO2 NEAR the leaf surface (Pa)
real(r8), intent(in) :: can_o2_ppress ! Partial pressure of O2 NEAR the leaf surface (Pa)
real(r8), intent(in) :: btran ! transpiration wetness factor (0 to 1)
real(r8), intent(in) :: stomatal_intercept_btran ! minimum leaf conductance (umol H2O/m**2/s)
real(r8), intent(in) :: stomatal_intercept_btran !water-stressed minimum stomatal conductance (umol H2O/m**2/s)
real(r8), intent(in) :: cf ! s m**2/umol -> s/m (ideal gas conversion) [umol/m3]
real(r8), intent(in) :: gb_mol ! leaf boundary layer conductance (umol /m**2/s)
real(r8), intent(in) :: ceair ! vapor pressure of air, constrained (Pa)
Expand Down Expand Up @@ -958,12 +958,10 @@ subroutine LeafLayerPhotosynthesis(f_sun_lsl, & ! in
! empirical curvature parameter for ap photosynthesis co-limitation
real(r8),parameter :: theta_ip = 0.999_r8

!Flag for stomatal conductance model method, 1 for Ball-Berry, 2 for Medlyn
!integer, parameter :: stomatalcond_mtd

associate( bb_slope => EDPftvarcon_inst%BB_slope ,& ! slope of BB relationship, unitless
medlyn_slope=> EDPftvarcon_inst%medlyn_slope , & ! Slope for Medlyn stomatal conductance model method, the unit is KPa^0.5
stomatal_intercept=> EDPftvarcon_inst%stomatal_intercept ) !Intercept for Medlyn & Ball Berry stomatal conductance model method, the unit is umol/m**2/s
stomatal_intercept=> EDPftvarcon_inst%stomatal_intercept ) !Unstressed minimum stomatal conductance, the unit is umol/m**2/s



Expand Down Expand Up @@ -1193,15 +1191,20 @@ subroutine LeafLayerPhotosynthesis(f_sun_lsl, & ! in
write (fates_log(),*)'gs_mol= ',gs_mol
call endrun(msg=errMsg(sourcefile, __LINE__))
end if

! Compare with Ball-Berry model: gs_mol = m * an * hs/leaf_co2_ppress p + b
hs = (gb_mol*ceair + gs_mol* veg_esat ) / ((gb_mol+gs_mol)*veg_esat )
gs_mol_err = bb_slope(ft)*max(anet, 0._r8)*hs/leaf_co2_ppress*can_press + stomatal_intercept_btran

if (abs(gs_mol-gs_mol_err) > 1.e-01_r8 .and. (stomatal_model == 1)) then
write (fates_log(),*) 'CF: Ball-Berry error check - stomatal conductance error:'
write (fates_log(),*) gs_mol, gs_mol_err
end if

! Compare with Medlyn model: gs_mol = 1.6*(1+m/sqrt(vpd)) * an/leaf_co2_ppress*p + b
if ( stomatal_model == 2 ) then
gs_mol_err = 1.6*(1 + medlyn_slope(ft)/sqrt(vpd))*max(anet,0._r8)/leaf_co2_ppress*can_press + stomatal_intercept_btran
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Thanks @Qianyuxuan , what is the 1.6, is that the diffusivity ratio of water to carbon?

h2o_co2_bl_diffuse_ratio

Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

wait, thats the boundary layer diffusion ratio, I think this is the stoma ratio:
h2o_co2_stoma_diffuse_ratio

Copy link
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

@rgknox Sorry. I forgot to change that. Yes. 1.6 is the factor that converts from conductance to CO2 to conductance to water vapour. I will adjust it soon.

! Compare with Ball-Berry model: gs_mol = m * an * hs/leaf_co2_ppress*p + b
else if ( stomatal_model == 1 ) then
hs = (gb_mol*ceair + gs_mol* veg_esat ) / ((gb_mol+gs_mol)*veg_esat )
gs_mol_err = bb_slope(ft)*max(anet, 0._r8)*hs/leaf_co2_ppress*can_press + stomatal_intercept_btran
end if

if (abs(gs_mol-gs_mol_err) > 1.e-01_r8) then
write (fates_log(),*) 'Stomatal model error check - stomatal conductance error:'
write (fates_log(),*) gs_mol, gs_mol_err
end if

enddo !sunsha loop

Expand Down
2 changes: 1 addition & 1 deletion main/EDPftvarcon.F90
Original file line number Diff line number Diff line change
Expand Up @@ -53,7 +53,7 @@ module EDPftvarcon
real(r8), allocatable :: seed_suppl(:) ! seeds that come from outside the gridbox.
real(r8), allocatable :: BB_slope(:) ! ball berry slope parameter
real(r8), allocatable :: medlyn_slope(:) ! Medlyn slope parameter KPa^0.5
real(r8), allocatable :: stomatal_intercept(:) ! Stomatal intercept parameter umol/m**2/s
real(r8), allocatable :: stomatal_intercept(:) ! intercept of stomatal conductance model (or unstressed minimum conductance) umol/m**2/s

real(r8), allocatable :: seed_alloc_mature(:) ! fraction of carbon balance allocated to
! clonal reproduction.
Expand Down