LandscapeDNDC 1.37.0
soilchemistry-dndc2.h
1
16#ifndef LM_SOILCHEMISTRY_DNDC2_H_
17#define LM_SOILCHEMISTRY_DNDC2_H_
18
19#include "mbe_legacymodel.h"
20#include "state/mbe_state.h"
21#include "ld_shared.h"
22#include "ld_isotopes.h"
23#include "soilchemistry/ld_transport.h"
24#include "soilchemistry/ld_enhanced_efficiency_nitrogen_fertilizers.h"
25
26#include "eventhandler/fertilize/fertilize.h"
27#include "eventhandler/till/till.h"
28
29#include <input/event/events.h>
30
31class solver_tridiagonal_t;
32
33namespace ldndc {
34
35 class LDNDC_API SoilChemistryDNDC2 : public MBE_LegacyModel
36 {
37 /*** module specific constants ***/
38
40 static const unsigned int NN;
41
43 static const double TNORM;
44
46 static const double HLIM;
47
49 static const double FRN2;
50
51 LMOD_EXPORT_MODULE_INFO(SoilChemistryDNDC2,"soilchemistry:dndc2","Soilchemistry DNDC2");
52 public:
53 SoilChemistryDNDC2(
54 MoBiLE_State *,
55 cbm::io_kcomm_t *,
56 timemode_e);
57
58 ~SoilChemistryDNDC2();
59
60 lerr_t configure( ldndc::config_file_t const *);
61 lerr_t register_ports( cbm::io_kcomm_t *);
62 lerr_t initialize();
63
64 lerr_t solve();
65 lerr_t unregister_ports( cbm::io_kcomm_t *);
66 lerr_t finalize();
67
68 lerr_t sleep() { return LDNDC_ERR_OK; }
69 lerr_t wake() { return LDNDC_ERR_OK; }
70
71 private:
72 cbm::io_kcomm_t * io_kcomm;
73
74 input_class_groundwater_t const * gw_;
75 input_class_siteparameters_t const & sipar_;
76 input_class_soillayers_t const & sl_;
77
78 substate_surfacebulk_t & sb_;
79 substate_airchemistry_t & ac_;
80 substate_microclimate_t const & mc_;
81 substate_physiology_t & ph_;
82 substate_soilchemistry_t & sc_;
83 substate_watercycle_t & wc_;
84
85 MoBiLE_PlantVegetation * m_veg;
86
87 CBM_Handle m_PlantHandle;
88 int m_PlantCounter;
89
90 timemode_e const timemode_;
91
92 unsigned int const INTERNAL_TIME_STEPS;
93 double const FTS_TOT_;
94
95 EventHandlerFertilize m_eventfertilize;
96 EventHandlerTill m_eventtill;
97
98 private:
99
100 bool new_model;
101
102
103 double * d_soil_eff_;
104
105 solver_tridiagonal_t * tdma_solver_;
106 Transport transport_;
107
108 double *waterflux_sl;
109 double *accumulated_waterflux_old_sl;
110
111 lvector_t< double > crb_l; // very labile active organic carbon
112 lvector_t< double > crb_r; // labile active organic carbon
113 lvector_t< double > hdc_l; // recalcitrant active organic carbon
114 lvector_t< double > hdc_r; // very recalcitrant active organic carbon
115
116 lvector_t< double > p_o2_sl;
117 lvector_t< double > fdeni;
118 lvector_t< double > day_co2;
119 lvector_t< double > co2_auto_sl;
120 lvector_t< double > anvf_old;
121 lvector_t< double > nitrify_n2o;
122
123 lvector_t< double > communicate_sl;
124
125 lvector_t< double > flux_chem_no_sl;
126 lvector_t< double > flux_chem_n2o_sl;
127
128 /* variable for transport calculations between soil layers
129 * note:
130 * array size = number of soil layers + 1
131 * in order to allow in- and out-flow of soillayer domaine
132 */
133 lvector_t< double > flux_record_sl;
134
135 /* soil temperature */
136 lvector_t< double > const &mc_temp_sl;
137
138 double const KLRAW;
139 double const KLRAW_STUBBLE;
140
141 double const PERTVL;
142 double const PERTL;
143 double const PERTR;
144
145 double const KRCVL;
146 double const KRCL;
147 double const KRCR;
148
149 double const KRCH;
150
151 double const KCRB_L;
152 double const KCRB_R;
153
154 double const KHDC_L;
155 double const KHDC_R;
156
157 double const MUEMAX;
158 double const AMAXX;
159
160 double const KNIT;
161
162 double const D_NO_SCALE;
163 double const D_N2O_SCALE;
164 double const D_O2_AIR_SCALE;
165
166 double const MNO3;
167 double const MUE_NO3;
168
169 double const MNO2;
170 double const MUE_NO2;
171
172 double const MNO;
173 double const MUE_NO;
174
175 double const MN2O;
176 double const MUE_N2O;
177
178 double const KCHEM;
179
180 double const DIFF_C;
181 double const DIFF_N;
182
183 double const GROUNDWATER_NUTRIENT_ACCESS_RATE;
184
185
186 lvector_t< double > D_eff_plant_sl;
187 lvector_t< double > D_eff_air_sl;
188 lvector_t< double > v_air_sl;
189 lvector_t< double > v_water_sl;
190 lvector_t< double > v_ice_sl;
191 lvector_t< double > delta_x;
192 lvector_t< double > interface_delta_x_air_sl;
193 lvector_t< double > soil_gas_advection_sl; // soil gas advection [m:s-1]
194
195 double no_0;
196 double n2o_0;
197 double an_no_0;
198 double an_n2o_0;
199
200 double day_no3_groundwater_access;
201 double year_no3_groundwater_access;
202
203 double n2o_atm;
204 double no_atm;
205
206 double day_mineral_litter;
207 double day_mineral_humus;
208 double day_mineral_microbes;
209 double day_mineral_aorg;
210 double day_mineral_humads;
211
212
213 double const *cCO2;
214 lvector_t< double > co2_concentration_fl;
215 double const *cCH4;
216 lvector_t< double > ch4_concentration_fl;
217 double const *cNO;
218 lvector_t< double > no_concentration_fl;
219 double const *cNH3;
220
221 bool helper;
222
223 lerr_t SCDNDC2_step_initialize_();
224 lerr_t SCDNDC2_step_finalize_();
225
226
228 void SCDNDC2_urea_hydrolysis();
229
231 void SCDNDC2_autotrophic_respiration();
232
234 void SCDNDC2_littering();
235
237 void SCDNDC2_pertubation();
238
253 void SCDNDC2_distribute_among_litter_layers(
254 double _add_c[],
255 double _n_diff);
256
258 void SCDNDC2_nh4_clay_equilibrium();
259
261 void SCDNDC2_calc_sl_arrays();
262
264 void SCDNDC2_split_aorg();
265
267 void SCDNDC2_combine_aorg();
268
270 void SCDNDC2_litter_decomposition();
271
273 void SCDNDC2_humus_decomposition();
274
276 void SCDNDC2_microbial_dynamics();
277
279 void SCDNDC2_humads_decomposition();
280
282 void SCDNDC2_nh4_nh3_dynamics();
283
285 void SCDNDC2_nitrification();
286
288 void SCDNDC2_denitrification();
289
291 void SCDNDC2_no_oxidation();
292
294 void SCDNDC2_gas_diffusion();
295
297 void SCDNDC2_gas_diffusion_new();
298
300 void SCDNDC2_groundwater_access();
301
303 void SCDNDC2_leaching();
304
306 void SCDNDC2_o2_diffusion();
307
309 void SCDNDC2_anvf();
310
312 double SCDNDC2_temp_mois(
313 size_t);
314
316 void SCDNDC2_decomp_litter(
317 size_t sl,
318 double rcn,
319 double decoConstant,
320 double microUse,
321 double temp_mois_fact,
322 double &crb_l,
323 double &rc);
324
326 void SCDNDC2_wood_decomposition();
327
329 void SCDNDC2_nh4_nh3_equilibrium();
330
332 void SCDNDC2_nh3_volatilization();
333
335 void SCDNDC2_diffusion(
336 size_t,
337 double,
338 double,
339 double &,
340 double &);
341
343 void SCDNDC2_conversion(
344 size_t sl,
345 double n_sum,
346 double doc_MM,
347 double fn,
348 double MAINTENANCE,
349 double MAXRGR,
350 double MAXYLD,
351 double phk,
352 double f_MM,
353 double &deniC,
354 lvector_t< double > & ,
355 lvector_t< double > & ,
356 double &chem_from,
357 double &chem_to);
358
360 void SCDNDC2_chemodenitrification(
361 size_t sl);
362
363 double SCDNDC2_get_fact_o2(size_t /* soil layer */);
364
365 double SCDNDC2_get_wfps(
366 size_t /* soil layer */);
367
368 /* balance check switch */
369 bool bc_warn;
370 double bc_tolerance;
371
372 lerr_t SCDNDC2_balance_check(
373 unsigned int /*stage*/, double * /*carbon*/, double * /*nitrogen*/);
374 double SCDNDC2_get_c_tot();
375 double SCDNDC2_get_n_tot();
376
382 lerr_t
383 SCDNDC2_check_for_negative_value(
384 char const * /*name*/);
385
386 Isotopes isotope;
387 };
388
389} /*namespace ldndc*/
390
391#endif /* LM_SOILCHEMISTRY_DNDC2_H_ */
392
Spatially explicit groundwater model.
Definition: airchemistryput.h:15