The BioCro C++ Library
c4_canopy.h
Go to the documentation of this file.
1#ifndef C4_CANOPY_H
2#define C4_CANOPY_H
3
4#include "../framework/module.h"
5#include "../framework/state_map.h"
6#include "CanAC.h" // For CanAC
7
8namespace standardBML
9{
10class c4_canopy : public direct_module
11{
12 public:
14 state_map const& input_quantities,
15 state_map* output_quantities)
16 : direct_module{},
17
18 // Get pointers to input quantities
19 absorbed_longwave{get_input(input_quantities, "absorbed_longwave")},
20 alpha1{get_input(input_quantities, "alpha1")},
21 atmospheric_pressure{get_input(input_quantities, "atmospheric_pressure")},
22 atmospheric_scattering{get_input(input_quantities, "atmospheric_scattering")},
23 atmospheric_transmittance{get_input(input_quantities, "atmospheric_transmittance")},
24 b0{get_input(input_quantities, "b0")},
25 b1{get_input(input_quantities, "b1")},
26 beta{get_input(input_quantities, "beta")},
27 Catm{get_input(input_quantities, "Catm")},
28 chil{get_input(input_quantities, "chil")},
29 cosine_zenith_angle{get_input(input_quantities, "cosine_zenith_angle")},
30 gbw_canopy{get_input(input_quantities, "gbw_canopy")},
31 growth_respiration_fraction{get_input(input_quantities, "growth_respiration_fraction")},
32 Gs_min{get_input(input_quantities, "Gs_min")},
33 k_diffuse{get_input(input_quantities, "k_diffuse")},
34 kparm{get_input(input_quantities, "kparm")},
35 kpLN{get_input(input_quantities, "kpLN")},
36 lai{get_input(input_quantities, "lai")},
37 leaf_reflectance_nir{get_input(input_quantities, "leaf_reflectance_nir")},
38 leaf_reflectance_par{get_input(input_quantities, "leaf_reflectance_par")},
39 leaf_transmittance_nir{get_input(input_quantities, "leaf_transmittance_nir")},
40 leaf_transmittance_par{get_input(input_quantities, "leaf_transmittance_par")},
41 LeafN{get_input(input_quantities, "LeafN")},
42 leafwidth{get_input(input_quantities, "leafwidth")},
43 lnfun{get_input(input_quantities, "lnfun")},
44 lowerT{get_input(input_quantities, "lowerT")},
45 nalphab0{get_input(input_quantities, "nalphab0")},
46 nalphab1{get_input(input_quantities, "nalphab1")},
47 nileafn{get_input(input_quantities, "nileafn")},
48 nkln{get_input(input_quantities, "nkln")},
49 nkpLN{get_input(input_quantities, "nkpLN")},
50 nlayers{get_input(input_quantities, "nlayers")},
51 nlnb0{get_input(input_quantities, "nlnb0")},
52 nlnb1{get_input(input_quantities, "nlnb1")},
53 nRdb0{get_input(input_quantities, "nRdb0")},
54 nRdb1{get_input(input_quantities, "nRdb1")},
55 nvmaxb0{get_input(input_quantities, "nvmaxb0")},
56 nvmaxb1{get_input(input_quantities, "nvmaxb1")},
57 par_energy_content{get_input(input_quantities, "par_energy_content")},
58 par_energy_fraction{get_input(input_quantities, "par_energy_fraction")},
59 rh{get_input(input_quantities, "rh")},
60 RL_at_25{get_input(input_quantities, "RL_at_25")},
61 solar{get_input(input_quantities, "solar")},
62 StomataWS{get_input(input_quantities, "StomataWS")},
63 temp{get_input(input_quantities, "temp")},
64 theta{get_input(input_quantities, "theta")},
65 upperT{get_input(input_quantities, "upperT")},
66 Vcmax_at_25{get_input(input_quantities, "Vcmax_at_25")},
67 windspeed{get_input(input_quantities, "windspeed")},
68
69 // Get pointers to output quantities
70 canopy_assimilation_molar_flux_op{get_op(output_quantities, "canopy_assimilation_molar_flux")},
71 canopy_conductance_op{get_op(output_quantities, "canopy_conductance")},
72 canopy_gross_assimilation_molar_flux_op{get_op(output_quantities, "canopy_gross_assimilation_molar_flux")},
73 canopy_non_photorespiratory_CO2_release_rate_op{get_op(output_quantities, "canopy_non_photorespiratory_CO2_release_molar_flux")},
74 canopy_photorespiration_molar_flux_op{get_op(output_quantities, "canopy_photorespiration_molar_flux")},
75 canopy_transpiration_rate_op{get_op(output_quantities, "canopy_transpiration_rate")},
76 whole_plant_growth_respiration_molar_flux_op{get_op(output_quantities, "whole_plant_growth_respiration_molar_flux")}
77 {
78 }
79 static string_vector get_inputs();
80 static string_vector get_outputs();
81 static std::string get_name() { return "c4_canopy"; }
82
83 private:
84 // References to input quantities
85 double const& absorbed_longwave;
86 double const& alpha1;
87 double const& atmospheric_pressure;
88 double const& atmospheric_scattering;
89 double const& atmospheric_transmittance;
90 double const& b0;
91 double const& b1;
92 double const& beta;
93 double const& Catm;
94 double const& chil;
95 double const& cosine_zenith_angle;
96 double const& gbw_canopy;
97 double const& growth_respiration_fraction;
98 double const& Gs_min;
99 double const& k_diffuse;
100 double const& kparm;
101 double const& kpLN;
102 double const& lai;
103 double const& leaf_reflectance_nir;
104 double const& leaf_reflectance_par;
105 double const& leaf_transmittance_nir;
106 double const& leaf_transmittance_par;
107 double const& LeafN;
108 double const& leafwidth;
109 double const& lnfun;
110 double const& lowerT;
111 double const& nalphab0;
112 double const& nalphab1;
113 double const& nileafn;
114 double const& nkln;
115 double const& nkpLN;
116 double const& nlayers;
117 double const& nlnb0;
118 double const& nlnb1;
119 double const& nRdb0;
120 double const& nRdb1;
121 double const& nvmaxb0;
122 double const& nvmaxb1;
123 double const& par_energy_content;
124 double const& par_energy_fraction;
125 double const& rh;
126 double const& RL_at_25;
127 double const& solar;
128 double const& StomataWS;
129 double const& temp;
130 double const& theta;
131 double const& upperT;
132 double const& Vcmax_at_25;
133 double const& windspeed;
134
135 // Pointers to output quantities
136 double* canopy_assimilation_molar_flux_op;
137 double* canopy_conductance_op;
138 double* canopy_gross_assimilation_molar_flux_op;
139 double* canopy_non_photorespiratory_CO2_release_rate_op;
140 double* canopy_photorespiration_molar_flux_op;
141 double* canopy_transpiration_rate_op;
142 double* whole_plant_growth_respiration_molar_flux_op;
143
144 // Main operation
145 void do_operation() const;
146};
147
149{
150 return {
151 "absorbed_longwave", // J / m^2 / s
152 "alpha1",
153 "atmospheric_pressure", // Pa
154 "atmospheric_scattering", // dimensionless
155 "atmospheric_transmittance", // dimensionless
156 "b0", // mol / m^2 / s
157 "b1", // dimensionless
158 "beta", // dimensionless
159 "Catm", // ppm
160 "chil", // dimensionless
161 "cosine_zenith_angle", // dimensionless
162 "gbw_canopy", // m / s
163 "growth_respiration_fraction", // dimensionless
164 "Gs_min", // mol / m^2 / s
165 "k_diffuse", // dimensionless
166 "kparm",
167 "kpLN",
168 "lai", // dimensionless from m^2 leaf / m^2 ground
169 "leaf_reflectance_nir", // dimensionless
170 "leaf_reflectance_par", // dimensionless
171 "leaf_transmittance_nir", // dimensionless
172 "leaf_transmittance_par", // dimensionless
173 "LeafN",
174 "leafwidth", // m
175 "lnfun", // not a physical quantity
176 "lowerT", // degrees C
177 "nalphab0",
178 "nalphab1",
179 "nileafn",
180 "nkln",
181 "nkpLN",
182 "nlayers", // not a physical quantity
183 "nlnb0",
184 "nlnb1",
185 "nRdb0",
186 "nRdb1",
187 "nvmaxb0",
188 "nvmaxb1",
189 "par_energy_content", // J / micromol
190 "par_energy_fraction", // dimensionless
191 "rh", // dimensionless from Pa / Pa
192 "RL_at_25", // micromol / m^2 / s
193 "solar", // micromol / m^2 / s
194 "StomataWS", // dimensionless
195 "temp", // degrees C
196 "theta", // dimensionless
197 "upperT", // degrees C
198 "Vcmax_at_25", // micromol / m^2 / s
199 "windspeed" // m / s
200 };
201}
202
204{
205 return {
206 "canopy_assimilation_molar_flux", // micromol / m^2 / s
207 "canopy_conductance", // mol / m^2 / s
208 "canopy_gross_assimilation_molar_flux", // micromol / m^2 / s
209 "canopy_non_photorespiratory_CO2_release_molar_flux", // micromol / m^2 / s
210 "canopy_photorespiration_molar_flux", // micromol / m^2 / s
211 "canopy_transpiration_rate", // Mg / ha / hr
212 "whole_plant_growth_respiration_molar_flux" // micromol / m^2 / s
213 };
214}
215
216void c4_canopy::do_operation() const
217{
218 // Collect inputs and make calculations
219 struct nitroParms nitroP;
220 nitroP.ileafN = nileafn;
221 nitroP.kln = nkln;
222 nitroP.Vmaxb1 = nvmaxb1;
223 nitroP.Vmaxb0 = nvmaxb0;
224 nitroP.alphab1 = nalphab1;
225 nitroP.alphab0 = nalphab0;
226 nitroP.Rdb1 = nRdb1;
227 nitroP.Rdb0 = nRdb0;
228 nitroP.kpLN = nkpLN;
229 nitroP.lnb0 = nlnb0;
230 nitroP.lnb1 = nlnb1;
231
233 nitroP,
234 absorbed_longwave,
235 alpha1,
236 temp,
237 atmospheric_pressure,
238 atmospheric_scattering,
239 atmospheric_transmittance,
240 b0,
241 b1,
242 beta,
243 Catm,
244 chil,
245 cosine_zenith_angle,
246 gbw_canopy,
247 growth_respiration_fraction,
248 Gs_min,
249 k_diffuse,
250 kparm,
251 kpLN,
252 lai,
253 leaf_reflectance_nir,
254 leaf_reflectance_par,
255 leaf_transmittance_nir,
256 leaf_transmittance_par,
257 LeafN,
258 leafwidth,
259 lowerT,
260 par_energy_content,
261 par_energy_fraction,
262 rh,
263 RL_at_25,
264 solar,
265 StomataWS,
266 theta,
267 upperT,
268 Vcmax_at_25,
269 windspeed,
270 lnfun,
271 nlayers);
272
273 // Update the parameter list
274 update(canopy_assimilation_molar_flux_op, can_result.Assim); // micromol / m^2 /s
275 update(canopy_conductance_op, can_result.canopy_conductance); // mol / m^2 / s
276 update(canopy_gross_assimilation_molar_flux_op, can_result.GrossAssim); // micromol / m^2 /s
277 update(canopy_non_photorespiratory_CO2_release_rate_op, can_result.RL); // micromol / m^2 / s
278 update(canopy_photorespiration_molar_flux_op, can_result.Rp); // micromol / m^2 /s
279 update(canopy_transpiration_rate_op, can_result.Trans); // Mg / ha / hr
280 update(whole_plant_growth_respiration_molar_flux_op, can_result.whole_plant_gr); // micromol / m^2 / s
281}
282} // namespace standardBML
283#endif
canopy_photosynthesis_outputs CanAC(const nitroParms &nitroP, double absorbed_longwave, double Alpha, double ambient_temperature, double atmospheric_pressure, double atmospheric_scattering, double atmospheric_transmittance, double b0, double b1, double beta, double Catm, double chil, double cosine_zenith_angle, double gbw_canopy, double growth_respiration_fraction, double Gs_min, double k_diffuse, double Kparm, double kpLN, double LAI, double leaf_reflectance_nir, double leaf_reflectance_par, double leaf_transmittance_nir, double leaf_transmittance_par, double leafN, double leafwidth, double lowerT, double par_energy_content, double par_energy_fraction, double RH, double RL_at_25, double solarR, double StomataWS, double theta, double upperT, double Vcmax_at_25, double WindSpeed, int lnfun, int nlayers)
Definition: CanAC.cpp:12
static string_vector get_outputs()
Definition: c4_canopy.h:203
c4_canopy(state_map const &input_quantities, state_map *output_quantities)
Definition: c4_canopy.h:13
static string_vector get_inputs()
Definition: c4_canopy.h:148
static std::string get_name()
Definition: c4_canopy.h:81
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 canopy photosynthesis calculations.
double RL
Rate of non-photorespiratory CO2 release in the light (micromol / m^2 / s)
double canopy_conductance
Stomatal conductance to water vapor (mol / m^2 / s)
double Rp
Rate of photorespiration (micromol / m^2 / s)
double whole_plant_gr
Whole-plant growth respiration rate (micromol / m^2 / s)
double Assim
Net CO2 assimilation rate (micromol / m^2 / s)
double GrossAssim
Gross CO2 assimilation rate (micromol / m^2 / s)
double Trans
Transpiration rate (Mg / ha / hr)
double ileafN
Definition: AuxBioCro.h:74
double kpLN
Definition: AuxBioCro.h:82