The BioCro C++ Library
c3_assimilation.h
Go to the documentation of this file.
1#ifndef C3_ASSIMILATION_H
2#define C3_ASSIMILATION_H
3
4#include "../framework/module.h"
5#include "../framework/state_map.h"
6#include "c3_temperature_response.h" // for c3_temperature_response_parameters
7#include "c3photo.h"
8
9namespace standardBML
10{
68class c3_assimilation : public direct_module
69{
70 public:
72 state_map const& input_quantities,
73 state_map* output_quantities)
74 : direct_module{},
75
76 // Get pointers to input quantities
77 atmospheric_pressure{get_input(input_quantities, "atmospheric_pressure")},
78 b0{get_input(input_quantities, "b0")},
79 b1{get_input(input_quantities, "b1")},
80 beta_PSII{get_input(input_quantities, "beta_PSII")},
81 Catm{get_input(input_quantities, "Catm")},
82 electrons_per_carboxylation{get_input(input_quantities, "electrons_per_carboxylation")},
83 electrons_per_oxygenation{get_input(input_quantities, "electrons_per_oxygenation")},
84 gbw{get_input(input_quantities, "gbw")},
85 Gs_min{get_input(input_quantities, "Gs_min")},
86 Gstar_c{get_input(input_quantities, "Gstar_c")},
87 Gstar_Ea{get_input(input_quantities, "Gstar_Ea")},
88 Jmax_at_25{get_input(input_quantities, "Jmax_at_25")},
89 Jmax_c{get_input(input_quantities, "Jmax_c")},
90 Jmax_Ea{get_input(input_quantities, "Jmax_Ea")},
91 Kc_c{get_input(input_quantities, "Kc_c")},
92 Kc_Ea{get_input(input_quantities, "Kc_Ea")},
93 Ko_c{get_input(input_quantities, "Ko_c")},
94 Ko_Ea{get_input(input_quantities, "Ko_Ea")},
95 O2{get_input(input_quantities, "O2")},
96 phi_PSII_0{get_input(input_quantities, "phi_PSII_0")},
97 phi_PSII_1{get_input(input_quantities, "phi_PSII_1")},
98 phi_PSII_2{get_input(input_quantities, "phi_PSII_2")},
99 Qabs{get_input(input_quantities, "Qabs")},
100 rh{get_input(input_quantities, "rh")},
101 RL_at_25{get_input(input_quantities, "RL_at_25")},
102 RL_c{get_input(input_quantities, "RL_c")},
103 RL_Ea{get_input(input_quantities, "RL_Ea")},
104 StomataWS{get_input(input_quantities, "StomataWS")},
105 Tambient{get_input(input_quantities, "temp")},
106 theta_0{get_input(input_quantities, "theta_0")},
107 theta_1{get_input(input_quantities, "theta_1")},
108 theta_2{get_input(input_quantities, "theta_2")},
109 Tleaf{get_input(input_quantities, "Tleaf")},
110 Tp_at_25{get_input(input_quantities, "Tp_at_25")},
111 Tp_c{get_input(input_quantities, "Tp_c")},
112 Tp_Ha{get_input(input_quantities, "Tp_Ha")},
113 Tp_Hd{get_input(input_quantities, "Tp_Hd")},
114 Tp_S{get_input(input_quantities, "Tp_S")},
115 Vcmax_at_25{get_input(input_quantities, "Vcmax_at_25")},
116 Vcmax_c{get_input(input_quantities, "Vcmax_c")},
117 Vcmax_Ea{get_input(input_quantities, "Vcmax_Ea")},
118
119 // Get pointers to output quantities
120 Assim_op{get_op(output_quantities, "Assim")},
121 Assim_check_op{get_op(output_quantities, "Assim_check")},
122 Assim_conductance_op{get_op(output_quantities, "Assim_conductance")},
123 Ci_op{get_op(output_quantities, "Ci")},
124 Cs_op{get_op(output_quantities, "Cs")},
125 GrossAssim_op{get_op(output_quantities, "GrossAssim")},
126 Gs_op{get_op(output_quantities, "Gs")},
127 RHs_op{get_op(output_quantities, "RHs")},
128 RL_op{get_op(output_quantities, "RL")},
129 Rp_op{get_op(output_quantities, "Rp")},
130 iterations_op{get_op(output_quantities, "iterations")}
131 {
132 }
133 static string_vector get_inputs();
134 static string_vector get_outputs();
135 static std::string get_name() { return "c3_assimilation"; }
136
137 private:
138 // References to input quantities
139 double const& atmospheric_pressure;
140 double const& b0;
141 double const& b1;
142 double const& beta_PSII;
143 double const& Catm;
144 double const& electrons_per_carboxylation;
145 double const& electrons_per_oxygenation;
146 double const& gbw;
147 double const& Gs_min;
148 double const& Gstar_c;
149 double const& Gstar_Ea;
150 double const& Jmax_at_25;
151 double const& Jmax_c;
152 double const& Jmax_Ea;
153 double const& Kc_c;
154 double const& Kc_Ea;
155 double const& Ko_c;
156 double const& Ko_Ea;
157 double const& O2;
158 double const& phi_PSII_0;
159 double const& phi_PSII_1;
160 double const& phi_PSII_2;
161 double const& Qabs;
162 double const& rh;
163 double const& RL_at_25;
164 double const& RL_c;
165 double const& RL_Ea;
166 double const& StomataWS;
167 double const& Tambient;
168 double const& theta_0;
169 double const& theta_1;
170 double const& theta_2;
171 double const& Tleaf;
172 double const& Tp_at_25;
173 double const& Tp_c;
174 double const& Tp_Ha;
175 double const& Tp_Hd;
176 double const& Tp_S;
177 double const& Vcmax_at_25;
178 double const& Vcmax_c;
179 double const& Vcmax_Ea;
180
181 // Pointers to output quantities
182 double* Assim_op;
183 double* Assim_check_op;
184 double* Assim_conductance_op;
185 double* Ci_op;
186 double* Cs_op;
187 double* GrossAssim_op;
188 double* Gs_op;
189 double* RHs_op;
190 double* RL_op;
191 double* Rp_op;
192 double* iterations_op;
193
194 // Main operation
195 void do_operation() const;
196};
197
199{
200 return {
201 "atmospheric_pressure", // Pa
202 "b0", // mol / m^2 / s
203 "b1", // dimensionless
204 "beta_PSII", // dimensionless (fraction of absorbed light that reaches photosystem II)
205 "Catm", // micromol / mol
206 "electrons_per_carboxylation", // self-explanatory units
207 "electrons_per_oxygenation", // self-explanatory units
208 "gbw", // mol / m^2 / s
209 "Gs_min", // mol / m^2 / s
210 "Gstar_c", // dimensionless
211 "Gstar_Ea", // J / mol
212 "Jmax_at_25", // micromol / m^2 / s
213 "Jmax_c", // dimensionless
214 "Jmax_Ea", // J / mol
215 "Kc_c", // dimensionless
216 "Kc_Ea", // J / mol
217 "Ko_c", // dimensionless
218 "Ko_Ea", // J / mol
219 "O2", // millimol / mol
220 "phi_PSII_0", // dimensionless
221 "phi_PSII_1", // (degrees C)^(-1)
222 "phi_PSII_2", // (degrees C)^(-2)
223 "Qabs", // micromol / m^2 / s
224 "rh", // dimensionless
225 "RL_at_25", // micromol / m^2 / s
226 "RL_c", // dimensionless
227 "RL_Ea", // J / mol
228 "StomataWS", // dimensionless
229 "temp", // degrees C
230 "theta_0", // dimensionless
231 "theta_1", // (degrees C)^(-1)
232 "theta_2", // (degrees C)^(-2)
233 "Tleaf", // degrees C
234 "Tp_at_25", // micromol / m^2 / s
235 "Tp_c", // dimensionless
236 "Tp_Ha", // J / mol
237 "Tp_Hd", // J / mol
238 "Tp_S", // J / K / mol
239 "Vcmax_at_25", // micromol / m^2 / s
240 "Vcmax_c", // dimensionless
241 "Vcmax_Ea", // J / mol
242 };
243}
244
246{
247 return {
248 "Assim", // micromol / m^2 / s
249 "Assim_check", // micromol / m^2 / s
250 "Assim_conductance", // micromol / m^2 / s
251 "Ci", // micromol / mol
252 "Cs", // micromol / m^2 / s
253 "GrossAssim", // micromol / m^2 / s
254 "Gs", // mol / m^2 / s
255 "RHs", // dimensionless from Pa / Pa
256 "RL", // micromol / m^2 / s
257 "Rp", // micromol / m^2 / s
258 "iterations" // not a physical quantity
259 };
260}
261
262void c3_assimilation::do_operation() const
263{
264 // Combine temperature response parameters
266 Gstar_c,
267 Gstar_Ea,
268 Jmax_c,
269 Jmax_Ea,
270 Kc_c,
271 Kc_Ea,
272 Ko_c,
273 Ko_Ea,
274 phi_PSII_0,
275 phi_PSII_1,
276 phi_PSII_2,
277 RL_c,
278 RL_Ea,
279 theta_0,
280 theta_1,
281 theta_2,
282 Tp_c,
283 Tp_Ha,
284 Tp_Hd,
285 Tp_S,
286 Vcmax_c,
287 Vcmax_Ea};
288
289 photosynthesis_outputs c3_results = c3photoC(
290 tr_param,
291 Qabs,
292 Tleaf,
293 Tambient,
294 rh,
295 Vcmax_at_25,
296 Jmax_at_25,
297 Tp_at_25,
298 RL_at_25,
299 b0,
300 b1,
301 Gs_min,
302 Catm,
303 atmospheric_pressure,
304 O2,
305 StomataWS,
306 electrons_per_carboxylation,
307 electrons_per_oxygenation,
308 beta_PSII,
309 gbw);
310
311 // Update the output quantity list
312 update(Assim_check_op, c3_results.Assim_check);
313 update(Assim_conductance_op, c3_results.Assim_conductance);
314 update(Assim_op, c3_results.Assim);
315 update(Ci_op, c3_results.Ci);
316 update(Cs_op, c3_results.Cs);
317 update(GrossAssim_op, c3_results.GrossAssim);
318 update(Gs_op, c3_results.Gs);
319 update(RHs_op, c3_results.RHs);
320 update(RL_op, c3_results.RL);
321 update(Rp_op, c3_results.Rp);
322 update(iterations_op, c3_results.iterations);
323}
324
325} // namespace standardBML
326#endif
photosynthesis_outputs c3photoC(c3_temperature_response_parameters const tr_param, double const absorbed_ppfd, double const Tleaf, double const Tambient, double const RH, double const Vcmax_at_25, double const Jmax_at_25, double const TPU_rate_max, double const RL_at_25, double const b0, double const b1, double const Gs_min, double const Ca, double const AP, double const O2, double const StomWS, double const electrons_per_carboxylation, double const electrons_per_oxygenation, double const beta_PSII, double const gbw)
Definition: c3photo.cpp:25
Calculates net assimilation, stomatal conductance, and intercellular CO2 concentration for a C3 leaf ...
c3_assimilation(state_map const &input_quantities, state_map *output_quantities)
static string_vector get_outputs()
static string_vector get_inputs()
static std::string get_name()
This is the standard BioCro module library; it includes the essential modules used in typical BioCro ...
Definition: aba_decay.h:8
A simple structure for holding the output of photosynthesis calculations.
double RL
Rate of non-photorespiratory CO2 release in the light (micromol / m^2 / s)
double Rp
Rate of photorespiration (micromol / m^2 / s)
double Assim_check
Equals zero if loop has converged (micromol / m^2 / s)
double Cs
CO2 concentration at the leaf surface (micromol / mol)
double Assim
Net CO2 assimilation rate (micromol / m^2 / s)
double Assim_conductance
Conductance-limited net CO2 assim. rate (micromol / m^2 / s)
size_t iterations
Number of iterations used by convergence loop.
double RHs
Relative humidity at the leaf surface (dimensionless)
double Ci
CO2 concentration in intercellular spaces (micromol / mol)
double GrossAssim
Gross CO2 assimilation rate (micromol / m^2 / s)
double Gs
Stomatal conductance to water vapor (mol / m^2 / s)