-
Notifications
You must be signed in to change notification settings - Fork 10
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
Add simple SIF model to photosynthesis #706
Changes from 1 commit
File filter
Filter by extension
Conversations
Jump to
Diff view
Diff view
There are no files selected for viewing
Original file line number | Diff line number | Diff line change |
---|---|---|
|
@@ -543,10 +543,12 @@ function ClimaLand.make_update_aux( | |
|
||
# Update Rd, An, Vcmax25 (if applicable to model) in place | ||
Vcmax25 = p.canopy.photosynthesis.Vcmax25 | ||
SIF = p.canopy.photosynthesis.SIF | ||
update_photosynthesis!( | ||
Rd, | ||
An, | ||
Vcmax25, | ||
SIF, | ||
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. Can we make these two things independent? Why does update_photosynthesis! needs SIF? There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. we could, it just currently lives in the photosynthesis name space (stored in canopy.photosynthesis.SIF), we thought it was okay for now with a simple model... Do you suggest making a new canopy output / model, stored in canopy.SIF, in a Vegetation/SIF.jl file? (similar to what we have, photosynthesis.jl, radiation.jl, stomatalconductance.jl, etc.) If we do, it will be a bit more involved and a breaking change, but it will allow to have multiple SIF modules There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. maybe we could do that for a next PR? There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. Yes. I think it should be an independent module. If anything it is a radiative variable and it should live in radiation instead of photosynthesis. There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. Like SIF would be equivalent to APAR. We measure it with a radiometer. |
||
canopy.photosynthesis, | ||
T_canopy, | ||
p.canopy.radiative_transfer.par.abs, | ||
|
Original file line number | Diff line number | Diff line change |
---|---|---|
|
@@ -1041,3 +1041,40 @@ function plant_respiration_growth(f2::FT, An::FT, Rpm::FT) where {FT} | |
Rg = f2 * (An - Rpm) | ||
return Rg | ||
end | ||
|
||
# 4 Solar Induced Fluorescence (SIF) | ||
|
||
# call function below inside photosynthesis.jl p | ||
|
||
""" | ||
compute_SIF_at_a_point(Tc::FT,APAR::FT, Vcmax25::FT) | ||
|
||
Computes observed SIF at 755 nm in W/m^2. Note that Tc is in Kelvin, and photo | ||
synthetic rates are in mol/m^2/s, and APAR is in PPFD. | ||
AlexisRenchon marked this conversation as resolved.
Show resolved
Hide resolved
|
||
""" | ||
function compute_SIF_at_a_point( | ||
APAR::FT, | ||
Tc::FT, | ||
Vcmax25::FT, | ||
R::FT, | ||
photosynthesis_parameters, | ||
) where {FT} | ||
|
||
(; ΔHJmax, To, θj, ϕ, sif_parameters) = photosynthesis_parameters | ||
Jmax = max_electron_transport(Vcmax25, ΔHJmax, Tc, To, R) | ||
J = electron_transport(APAR, Jmax, θj, ϕ) | ||
(; kf, kd_p1, kd_p2, min_kd, kn_p1, kn_p2, kp, kappa_p1, kappa_p2) = | ||
sif_parameters | ||
Tf = FT(273.15) | ||
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. this is kind of annoying, but we should get T_freeze from the earth_param_set in Canopy.jl update_aux!, and pass as an argument... like we do with R There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. Let's do that together! Is this to reduce allocation? or make sure we use params instead of hard coding? There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. +1. |
||
kd = max(kd_p1 * (Tc - Tf) + kd_p2, min_kd) | ||
x = 1 - J / Jmax | ||
kn = (kn_p1 * x - kn_p2) * x | ||
ϕp0 = kp / (kf + kp + kn) | ||
ϕp = J / Jmax * ϕp0 | ||
ϕf = kf / (kf + kd + kn) * (1 - ϕp) | ||
κ = kappa_p1 * Vcmax25 * FT(1e6) + kappa_p2 # formula expects Vcmax25 in μmol/m^2/s | ||
F = APAR * ϕf | ||
SIF_755 = F / κ | ||
|
||
return SIF_755 | ||
end |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
do we need to pass sif_parameters here? I thought in our methods in CreateParametersExt we have a default which makes the sif_params and uses them
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
We need it here because it calls the struct, not the function.
Note that we plan to refactor ClimaLandSimulations (with the help of Gabriele), to have it better designed in general, with PFT framework, global simulations... and ready for ClimaCalibrate