1#ifndef THERMAL_TIME_SENESCENCE_H
2#define THERMAL_TIME_SENESCENCE_H
4#include "../framework/module.h"
5#include "../framework/state_map.h"
95 state_map
const& input_quantities,
96 state_map* output_quantities)
98 differential_module(true),
101 TTc{get_input(input_quantities,
"TTc")},
102 seneLeaf{get_input(input_quantities,
"seneLeaf")},
103 seneStem{get_input(input_quantities,
"seneStem")},
104 seneRoot{get_input(input_quantities,
"seneRoot")},
105 seneRhizome{get_input(input_quantities,
"seneRhizome")},
106 leaf_senescence_index{get_input(input_quantities,
"leaf_senescence_index")},
107 stem_senescence_index{get_input(input_quantities,
"stem_senescence_index")},
108 root_senescence_index{get_input(input_quantities,
"root_senescence_index")},
109 rhizome_senescence_index{get_input(input_quantities,
"rhizome_senescence_index")},
110 kStem{get_input(input_quantities,
"kStem")},
111 kRoot{get_input(input_quantities,
"kRoot")},
112 kRhizome{get_input(input_quantities,
"kRhizome")},
113 kGrain{get_input(input_quantities,
"kGrain")},
114 remobilization_fraction{get_input(input_quantities,
"remobilization_fraction")},
115 net_assimilation_rate_leaf{get_input(input_quantities,
"net_assimilation_rate_leaf")},
116 net_assimilation_rate_stem{get_input(input_quantities,
"net_assimilation_rate_stem")},
117 net_assimilation_rate_root{get_input(input_quantities,
"net_assimilation_rate_root")},
118 net_assimilation_rate_rhizome{get_input(input_quantities,
"net_assimilation_rate_rhizome")},
121 Leaf_op{get_op(output_quantities,
"Leaf")},
122 LeafLitter_op{get_op(output_quantities,
"LeafLitter")},
123 leaf_senescence_index_op{get_op(output_quantities,
"leaf_senescence_index")},
124 Stem_op{get_op(output_quantities,
"Stem")},
125 StemLitter_op{get_op(output_quantities,
"StemLitter")},
126 stem_senescence_index_op{get_op(output_quantities,
"stem_senescence_index")},
127 Root_op{get_op(output_quantities,
"Root")},
128 RootLitter_op{get_op(output_quantities,
"RootLitter")},
129 root_senescence_index_op{get_op(output_quantities,
"root_senescence_index")},
130 Rhizome_op{get_op(output_quantities,
"Rhizome")},
131 RhizomeLitter_op{get_op(output_quantities,
"RhizomeLitter")},
132 rhizome_senescence_index_op{get_op(output_quantities,
"rhizome_senescence_index")},
133 Grain_op{get_op(output_quantities,
"Grain")}
138 static std::string
get_name() {
return "thermal_time_senescence"; }
146 std::vector<double>
mutable assim_rate_leaf_vec;
147 std::vector<double>
mutable assim_rate_stem_vec;
148 std::vector<double>
mutable assim_rate_root_vec;
149 std::vector<double>
mutable assim_rate_rhizome_vec;
153 double const& seneLeaf;
154 double const& seneStem;
155 double const& seneRoot;
156 double const& seneRhizome;
157 double const& leaf_senescence_index;
158 double const& stem_senescence_index;
159 double const& root_senescence_index;
160 double const& rhizome_senescence_index;
163 double const& kRhizome;
164 double const& kGrain;
165 const double& remobilization_fraction;
166 double const& net_assimilation_rate_leaf;
167 double const& net_assimilation_rate_stem;
168 double const& net_assimilation_rate_root;
169 double const& net_assimilation_rate_rhizome;
173 double* LeafLitter_op;
174 double* leaf_senescence_index_op;
176 double* StemLitter_op;
177 double* stem_senescence_index_op;
179 double* RootLitter_op;
180 double* root_senescence_index_op;
182 double* RhizomeLitter_op;
183 double* rhizome_senescence_index_op;
187 void do_operation()
const;
198 "leaf_senescence_index",
199 "stem_senescence_index",
200 "root_senescence_index",
201 "rhizome_senescence_index",
206 "remobilization_fraction",
207 "net_assimilation_rate_leaf",
208 "net_assimilation_rate_stem",
209 "net_assimilation_rate_root",
210 "net_assimilation_rate_rhizome"
219 "leaf_senescence_index",
222 "stem_senescence_index",
225 "root_senescence_index",
228 "rhizome_senescence_index",
233void thermal_time_senescence::do_operation()
const
236 assim_rate_leaf_vec.push_back(net_assimilation_rate_leaf);
237 assim_rate_stem_vec.push_back(net_assimilation_rate_stem);
238 assim_rate_root_vec.push_back(net_assimilation_rate_root);
239 assim_rate_rhizome_vec.push_back(net_assimilation_rate_rhizome);
245 double dRhizome{0.0};
247 double dLeafLitter{0.0};
248 double dStemLitter{0.0};
249 double dRootLitter{0.0};
250 double dRhizomeLitter{0.0};
251 double dleaf_senescence_index{0.0};
252 double dstem_senescence_index{0.0};
253 double droot_senescence_index{0.0};
254 double drhizome_senescence_index{0.0};
256 if (TTc >= seneLeaf) {
258 double change = assim_rate_leaf_vec.at(leaf_senescence_index);
265 dLeafLitter += change * (1.0 - remobilization_fraction);
266 dRhizome += kRhizome * change * remobilization_fraction;
267 dStem += kStem * change * remobilization_fraction;
268 dRoot += kRoot * change * remobilization_fraction;
269 dGrain += kGrain * change * remobilization_fraction;
272 dleaf_senescence_index++;
275 if (TTc >= seneStem) {
277 double change = assim_rate_stem_vec.at(stem_senescence_index);
284 dStemLitter += change;
287 dstem_senescence_index++;
290 if (TTc >= seneRoot) {
292 double change = assim_rate_root_vec.at(root_senescence_index);
299 dRootLitter += change;
302 droot_senescence_index++;
307 drhizome_senescence_index++;
310 if (TTc >= seneRhizome) {
312 double change = assim_rate_rhizome_vec.at(rhizome_senescence_index);
319 dRhizomeLitter += change;
322 drhizome_senescence_index++;
326 update(Leaf_op, dLeaf);
327 update(Stem_op, dStem);
328 update(Root_op, dRoot);
329 update(Rhizome_op, dRhizome);
330 update(Grain_op, dGrain);
332 update(LeafLitter_op, dLeafLitter);
333 update(StemLitter_op, dStemLitter);
334 update(RootLitter_op, dRootLitter);
335 update(RhizomeLitter_op, dRhizomeLitter);
337 update(leaf_senescence_index_op, dleaf_senescence_index);
338 update(stem_senescence_index_op, dstem_senescence_index);
339 update(root_senescence_index_op, droot_senescence_index);
340 update(rhizome_senescence_index_op, drhizome_senescence_index);
Determines senescence rates for several plant organs based on thermal time thresholds and magical tim...
thermal_time_senescence(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 ...