The BioCro C++ Library
senescence_logistic.h
Go to the documentation of this file.
1#ifndef SENESCENCE_LOGISTIC_H
2#define SENESCENCE_LOGISTIC_H
3
4#include "../framework/module.h"
5#include "../framework/state_map.h"
6
7namespace standardBML
8{
22class senescence_logistic : public differential_module
23{
24 public:
26 state_map const& input_quantities,
27 state_map* output_quantities)
28 : differential_module{},
29
30 // Get references to input quantities
31 Leaf{get_input(input_quantities, "Leaf")},
32 Stem{get_input(input_quantities, "Stem")},
33 Root{get_input(input_quantities, "Root")},
34 Rhizome{get_input(input_quantities, "Rhizome")},
35 kSeneLeaf{get_input(input_quantities, "kSeneLeaf")},
36 kSeneStem{get_input(input_quantities, "kSeneStem")},
37 kSeneRoot{get_input(input_quantities, "kSeneRoot")},
38 kSeneRhizome{get_input(input_quantities, "kSeneRhizome")},
39 kLeaf{get_input(input_quantities, "kLeaf")},
40 kStem{get_input(input_quantities, "kStem")},
41 kRoot{get_input(input_quantities, "kRoot")},
42 kRhizome{get_input(input_quantities, "kRhizome")},
43 kGrain{get_input(input_quantities, "kGrain")},
44 kShell{get_input(input_quantities, "kShell")},
45 remobilization_fraction{get_input(input_quantities, "remobilization_fraction")},
46
47 // Get pointers to output quantities
48 Leaf_op{get_op(output_quantities, "Leaf")},
49 LeafLitter_op{get_op(output_quantities, "LeafLitter")},
50 Stem_op{get_op(output_quantities, "Stem")},
51 StemLitter_op{get_op(output_quantities, "StemLitter")},
52 Root_op{get_op(output_quantities, "Root")},
53 RootLitter_op{get_op(output_quantities, "RootLitter")},
54 Rhizome_op{get_op(output_quantities, "Rhizome")},
55 RhizomeLitter_op{get_op(output_quantities, "RhizomeLitter")},
56 Grain_op{get_op(output_quantities, "Grain")},
57 Shell_op{get_op(output_quantities, "Shell")}
58 {
59 }
60 static string_vector get_inputs();
61 static string_vector get_outputs();
62 static std::string get_name() { return "senescence_logistic"; }
63
64 private:
65 // References to input quantities
66 const double& Leaf;
67 const double& Stem;
68 const double& Root;
69 const double& Rhizome;
70 const double& kSeneLeaf;
71 const double& kSeneStem;
72 const double& kSeneRoot;
73 const double& kSeneRhizome;
74 const double& kLeaf;
75 const double& kStem;
76 const double& kRoot;
77 const double& kRhizome;
78 const double& kGrain;
79 const double& kShell;
80 const double& remobilization_fraction;
81
82 // Pointers to output quantities
83 double* Leaf_op;
84 double* LeafLitter_op;
85 double* Stem_op;
86 double* StemLitter_op;
87 double* Root_op;
88 double* RootLitter_op;
89 double* Rhizome_op;
90 double* RhizomeLitter_op;
91 double* Grain_op;
92 double* Shell_op;
93
94 // Implement the pure virtual function do_operation():
95 void do_operation() const override final;
96};
97
99{
100 return {
101 "Leaf", // Mg / ha
102 "Stem", // Mg / ha
103 "Root", // Mg / ha
104 "Rhizome", // Mg / ha
105 "kSeneLeaf", // dimensionless, fraction of Leaf senesced
106 "kSeneStem", // dimensionless, fraction of Stem senesced
107 "kSeneRoot", // dimensionless, fraction of Root senesced
108 "kSeneRhizome", // dimensionless, fraction of Rhizome senesced
109 "kLeaf", // dimensionless, fraction carbon allocated to Leaf
110 "kStem", // dimensionless, fraction carbon allocated to Stem
111 "kRoot", // dimensionless, fraction carbon allocated to Root
112 "kRhizome", // dimensionless, fraction carbon allocated to Rhizome
113 "kGrain", // dimensionless, fraction carbon allocated to Grain
114 "kShell", // dimensionless, fraction carbon allocated to Shell
115 "remobilization_fraction" // dimensionless, fraction of senesced leaf
116 // tissue remobilized to other plant organs
117 };
118}
119
121{
122 return {
123 "Leaf", // Mg / ha
124 "LeafLitter", // Mg / ha
125 "Stem", // Mg / ha
126 "StemLitter", // Mg / ha
127 "Root", // Mg / ha
128 "RootLitter", // Mg / ha
129 "Rhizome", // Mg / ha
130 "RhizomeLitter", // Mg / ha
131 "Shell", // Mg / ha
132 "Grain" // Mg / ha
133 };
134}
135
136void senescence_logistic::do_operation() const
137{
138 double senescence_leaf = kSeneLeaf * Leaf; // Mg / ha, amount of leaf senesced
139 double senescence_stem = kSeneStem * Stem; // Mg / ha, amount of stem senesced
140 double senescence_root = kSeneRoot * Root; // Mg / ha, amount of root senesced
141 double senescence_rhizome = kSeneRhizome * Rhizome; // Mg / ha, amount of rhizome senesced
142
143 // change in leaf biomass = minus amount senesced + new leaf tissue from
144 // remobilized amount (Allows for leaves to start senescing while new leaves
145 // are still being produced).
146 double dLeaf = -senescence_leaf + kLeaf * senescence_leaf * remobilization_fraction; // Mg / ha
147
148 // change in amount of leaf litter
149 double dLeafLitter = senescence_leaf * (1 - remobilization_fraction); // Mg / ha
150
151 // change in stem biomass = minus amount senesced + new stem tissue from
152 // remobilized leaf fraction
153 double dStem = -senescence_stem + kStem * senescence_leaf * remobilization_fraction; // Mg / ha
154
155 double dStemLitter = senescence_stem; // Mg / ha, change in amount of stem litter
156
157 // change in root biomass = minus amount senesced + new root tissue from remobilized
158 // leaf fraction
159 double dRoot = -senescence_root + kRoot * senescence_leaf * remobilization_fraction; // Mg / ha
160
161 double dRootLitter = senescence_root; // Mg / ha, change in amount of root litter
162
163 // change in rhizome biomass = minus amount senesced + new rhizome from remobilized
164 // leaf fraction
165 double dRhizome = -senescence_rhizome + kRhizome * senescence_leaf * remobilization_fraction; // Mg / ha
166 double dRhizomeLitter = senescence_rhizome; // Mg / ha, change in rhizome litter
167
168 // change in grain biomass = new grain from remobilized leaf fraction.
169 // currently do not include grain senescence.
170 double dGrain = kGrain * senescence_leaf * remobilization_fraction; // Mg / ha
171
172 // change in shell biomass = new shell from remobilized leaf fraction.
173 // currently do not include shell senescence.
174 double dShell = kShell * senescence_leaf * remobilization_fraction; // Mg / ha
175
176 update(Leaf_op, dLeaf); // Mg / ha
177 update(Stem_op, dStem); // Mg / ha
178 update(Root_op, dRoot); // Mg / ha
179 update(Rhizome_op, dRhizome); // Mg / ha
180 update(Grain_op, dGrain); // Mg / ha
181 update(Shell_op, dShell); // Mg / ha
182 update(LeafLitter_op, dLeafLitter); // Mg / ha
183 update(StemLitter_op, dStemLitter); // Mg / ha
184 update(RootLitter_op, dRootLitter); // Mg / ha
185 update(RhizomeLitter_op, dRhizomeLitter); // Mg / ha
186}
187
188} // namespace standardBML
189#endif
Calculates the change in plant organ biomasses due to senescence.
senescence_logistic(state_map const &input_quantities, state_map *output_quantities)
This is the standard BioCro module library; it includes the essential modules used in typical BioCro ...
Definition: aba_decay.h:8