LandscapeDNDC 1.37.0
grassland-dndc.h
1
5#ifndef LM_PHYSIOLOGY_GRASSLANDDNDC_H_
6#define LM_PHYSIOLOGY_GRASSLANDDNDC_H_
7
8#include "mbe_legacymodel.h"
9#include "state/mbe_state.h"
10#include "ld_shared.h"
11#include "ld_eventqueue.h"
12
13#include "eventhandler/graze/graze.h"
14#include "eventhandler/cut/cut.h"
15#include "physiology/ld_plantfunctions.h"
16
17#include <containers/lgrowarray.h>
18
19namespace ldndc {
20
21struct BaseRootSystemDNDC;
22class LDNDC_API PhysiologyGrasslandDNDC : public MBE_LegacyModel
23{
24 LMOD_EXPORT_MODULE_INFO(PhysiologyGrasslandDNDC,"physiology:grasslanddndc","Physiology GrasslandDNDC");
25
26 /*** module specific constants ***/
27
29 static double const GROWTH_RESPIRATION_FRACTION;
30
32 static const double S_TLIMIT;
33
34public:
35 PhysiologyGrasslandDNDC(
36 MoBiLE_State *,
37 cbm::io_kcomm_t *,
38 timemode_e);
39
40 ~PhysiologyGrasslandDNDC();
41
42 lerr_t configure( ldndc::config_file_t const *);
43 lerr_t register_ports( cbm::io_kcomm_t *);
44 lerr_t initialize();
45
46 lerr_t solve();
47 lerr_t unregister_ports( cbm::io_kcomm_t *);
48 lerr_t finalize() { return LDNDC_ERR_OK; }
49
50 lerr_t sleep() { return LDNDC_ERR_OK; }
51 lerr_t wake() { return LDNDC_ERR_OK; }
52
53private:
54 MoBiLE_State * m_state;
55 cbm::io_kcomm_t * io_kcomm;
56
57 /* required input classes */
58 input_class_setup_t const * m_setup;
59 input_class_soillayers_t const * m_soillayers;
60 input_class_siteparameters_t const * m_sipar;
61 input_class_species_t const * m_species;
62
63 /* required state components */
64 substate_airchemistry_t const & ac_;
65 substate_microclimate_t & mc_;
66 substate_physiology_t & ph_;
67 substate_soilchemistry_t & sc_;
68 substate_watercycle_t & wc_;
69
70 MoBiLE_PlantVegetation * m_veg;
71
72 EventQueue m_HarvestEvents;
73 CBM_Handle m_HarvestHandle;
74 EventQueue m_PlantEvents;
75 CBM_Handle m_PlantHandle;
76
77 ldndc::growable_array < BaseRootSystemDNDC*, 1000, 1 > root_system;
78
79 double const *mc_temp;
80
81 double const FTS_TOT_;
82
87 LD_PlantFunctions m_pf;
88
89 double tot_c_;
90 double tot_n_;
91
92 EventHandlerGraze m_eventgraze;
93 EventHandlerCut m_eventcut;
94
95 lvector_t< double > n_demand_vt_;
96 lvector_t< double > n_uptake_vt_;
97 lvector_t< double > n_avail_tot_vt_;
98
103 lvector_t< unsigned int > root_q_vt_;
104
105 lvector_t< double > n2_fixation_vt;
106
107 lvector_t< double > dc_fol_vt;
108 lvector_t< double > dc_lst_vt;
109 lvector_t< double > dc_bud_vt;
110 lvector_t< double > dc_frt_vt;
111
112 lvector_t< double > r_res_vt;
113 lvector_t< double > r_gro_vt;
114 lvector_t< double > r_gro_below_vt;
115 lvector_t< double > r_fol_vt;
116 lvector_t< double > r_lst_vt;
117 lvector_t< double > r_bud_vt;
118 lvector_t< double > r_frt_vt;
119
120 lvector_t< double > s_fol_vt;
121 lvector_t< double > s_bud_vt;
122
123 lvector_t< double > n_lit_fol_vt;
124 lvector_t< double > n_lit_bud_vt;
125
126 lvector_t< double > exsuLoss_vt;
127
128 std::vector< std::vector< double > > s_frt_vtsl;
129 std::vector< std::vector< double > > n_lit_frt_vtsl;
130
131 std::vector< std::vector< double > > c_upt_vtfl;
132
133 lvector_t< double > temp_sl;
134 lvector_t< double > no3_sl;
135 lvector_t< double > nh4_sl;
136 lvector_t< double > don_sl;
137
138 lvector_t< double > nh4_uptake_sl;
139 lvector_t< double > don_uptake_sl;
140 lvector_t< double > no3_uptake_sl;
141
142 bool exponential_root_distribution;
143
148 double delta_c_at_planting;
149
150 /*** methods ***/
151
156 lerr_t step_init();
157 lerr_t step_out();
158
163 lerr_t GrasslandDNDCCuttingGrazing();
164
171 void update_species_related_state_items( MoBiLE_Plant *);
172
188 lerr_t event_plant( MoBiLE_Plant *, EventAttributes const &);
189
205 lerr_t event_harvest( MoBiLE_Plant *, EventAttributes const &);
206
212 lerr_t GrasslandDNDCPlantDevelopment();
213
214
215 void growth_respiration( MoBiLE_Plant *);
216
230 void maintenance_respiration( MoBiLE_Plant *);
231
245 double nitrogen_demand( MoBiLE_Plant *);
246
251 void nitrogen_uptake();
252
267 double nitrogen_fixation( MoBiLE_Plant *, double, double);
268 double total_fixed_nitrogen( MoBiLE_Plant *, double) const;
269
270
275 void
276 GrasslandDNDCPhotosynthesis( MoBiLE_Plant *, double);
277
278
279
290 void senescence( MoBiLE_Plant *);
291
292 /* coverage */
293 void update_canopy_coverage( MoBiLE_Plant *);
294
295 /* plant height */
296 void update_canopy_height( MoBiLE_Plant *);
297
298 /* canopy structure */
299 void update_canopy_items( MoBiLE_Plant *);
300
301
302 void GrasslandDNDCBalanceCheck( int /*stage*/);
303};
304} /*namespace ldndc*/
305
306#endif /* !LM_PHYSIOLOGY_GRASSLANDDNDC_H_ */
307
Spatially explicit groundwater model.
Definition: airchemistryput.h:15