LandscapeDNDC 1.37.0
Loading...
Searching...
No Matches
ld_echy3d.h
1
8
9#ifndef LDNDC_KERNEL_ECHY3D_H_
10#define LDNDC_KERNEL_ECHY3D_H_
11
12#include "ld_kernel.h"
13#include "ld_shared.h"
14#include "ld_sinkinterface.h"
15#include "state/mbe_state.h"
16#include <map>
17
18namespace ldndc {
19
20struct EcHy3DNeighbor
21{
22 EcHy3DNeighbor( cbm::source_descriptor_t, double /* intersect */);
23
24 cbm::source_descriptor_t desc;
25 double intersect; // [m]
26 double water_flux; // [m3]
27 double so4_flux; // [kg S]
28 double so4_flux_surface; // [kg S]
29 double so4_flux_erosion; // [kg S]
30 double no3_flux; // [kg N]
31 double no3_flux_surface; // [kg N]
32 double no3_flux_erosion; // [kg N]
33 double nh4_flux; // [kg N]
34 double nh4_flux_surface; // [kg N]
35 double nh4_flux_erosion; // [kg N]
36 double don_flux; // [kg N]
37 double don_flux_surface; // [kg N]
38 double don_flux_erosion; // [kg N]
39 double doc_flux; // [kg C]
40 double doc_flux_surface; // [kg N]
41 double doc_flux_erosion; // [kg N]
42
43 //entry of neighbor in parent EcHy3DCell vector
44 int cell_map;
45};
46
47class EcHy3DCell
48{
49
50public:
51
52 EcHy3DCell( int, int, double, double, double, double);
53 ~EcHy3DCell();
54
55 int setup_id;
56 int site_id;
57
58 double x; // [m]
59 double y; // [m]
60 double z; //height of soil surface [m]
61
62 bool outlet;
63 double river_output_potential; // downwards from the soil surface [m]
64 double river_length; // [m]
65 double river_elevation; // [m]
66
67 double area; // [m2]
68
69 cbm::string_t ecosystem_type; // {arable, forest, grassland, ...}
70
71 int nd_soil_layers; // number of soil layers
72
73 std::vector< EcHy3DNeighbor > neighbors;
74
75 lerr_t set_soil_layers( input_class_site_t *);
76
77 double sks_mean;
78 double sks_gw;
79 double sks_bottom;
80 double delta_groundwater_volume; // [m3]
81 double delta_surfacewater_volume; // [m3]
82 double delta_riverwater_volume; // [m3]
83 double delta_so4_soil; // [kg S]
84 double delta_so4_surface; // [kg S]
85 double delta_so4_erosion; // [kg S]
86 double delta_no3_soil; // [kg N]
87 double delta_no3_surface; // [kg N]
88 double delta_no3_erosion; // [kg N]
89 double delta_no3_gain_ecosystem_specific; // [kg N]
90 double delta_no3_loss_ecosystem_specific; // [kg N]
91 double delta_nh4_soil; // [kg N]
92 double delta_nh4_surface; // [kg N]
93 double delta_nh4_erosion; // [kg N]
94 double delta_don_soil; // [kg N]
95 double delta_don_surface; // [kg N]
96 double delta_don_erosion; // [kg N]
97 double delta_doc_soil; // [kg C]
98 double delta_doc_surface; // [kg C]
99 double delta_doc_erosion; // [kg C]
100 double delta_groundwater_gain_ecosystem_specific; // []
101 double delta_groundwater_loss_ecosystem_specific; // []
102
103 double available_so4; // [kg S]
104 double available_no3; // [kg N]
105 double available_nh4; // [kg N]
106 double available_don; // [kg N]
107 double available_doc; // [kg C]
108
109 double river_so4; // [kg S]
110 double river_no3; // [kg N]
111 double river_nh4; // [kg N]
112 double river_don; // [kg N]
113 double river_doc; // [kg N]
114
115 int sl_gw;
116 //helper variable to scale water and nutrients after outflow
117 double scale_out;
118 double scale_out_surface;
119
120 lerr_t reset();
121
122 double pressure_head; // [m]
123 lerr_t step_init( cbm::RunLevelArgs *);
124
125 lerr_t EcHy3DCell_update_soil_water_content( cbm::RunLevelArgs *);
126 lerr_t EcHy3DCell_update_surface_water_content( cbm::RunLevelArgs *);
127 lerr_t EcHy3DCell_update_river_water_content( cbm::RunLevelArgs *);
128 lerr_t EcHy3DCell_boundary_flows( cbm::RunLevelArgs *, int);
129
130 bool help;
131 lerr_t EcHy3DCell_update_nutrient_transport( double &_delta_val_soil,
132 double &_delta_val_surface,
133 double &_delta_val_erosion,
134 double &_accumulated_val,
135 lvector_t< double > &_val_soil,
136 double &_val_surface,
137 cbm::string_t _name);
138
139 double accumulated_precipitation;
140 double accumulated_throughfall;
141 lvector_t< double > accumulated_wateruptake_sl;
142 double accumulated_interceptionevaporation;
143 double accumulated_transpiration;
144 double accumulated_soilevaporation;
145 double accumulated_surfacewaterevaporation;
146 double accumulated_percolation;
147 double accumulated_infiltration;
148 double accumulated_groundwater_access; // [m3:m-2]
149 double accumulated_groundwater_loss; // [m3:m-2]
150 double accumulated_surfacewater_access; // [m3:m-2]
151 double accumulated_surfacewater_loss; // [m3:m-2]
152 double accumulated_outlet; // [m3:m-2]
153 double accumulated_outflow_soil; // [m3:m-2]
154 double accumulated_outflow_surface; // [m3:m-2]
155
156 double accumulated_outflow_so4; // [kg S m-2]
157 double accumulated_outflow_no3; // [kg N m-2]
158 double accumulated_outflow_nh4; // [kg N m-2]
159 double accumulated_outflow_don; // [kg N m-2]
160 double accumulated_outflow_doc; // [kg C m-2]
161
162 double accumulated_precipitation_old;
163 double accumulated_throughfall_old;
164 double accumulated_transpiration_old;
165 double accumulated_wateruptake_old;
166 double accumulated_interceptionevaporation_old;
167 double accumulated_soilevaporation_old;
168 double accumulated_surfacewaterevaporation_old;
169 double accumulated_infiltration_old;
170 double accumulated_groundwater_access_old; // [m3:m-2]
171 double accumulated_groundwater_loss_old; // [m3:m-2]
172 double accumulated_surfacewater_access_old; // [m3:m-2]
173 double accumulated_surfacewater_loss_old; // [m3:m-2]
174 double accumulated_outlet_old;
175 double accumulated_outflow_soil_old;
176 double accumulated_outflow_surface_old;
177
178 double accumulated_outflow_so4_old; // [kg S m-2]
179 double accumulated_outflow_no3_old; // [kg N m-2]
180 double accumulated_outflow_nh4_old; // [kg N m-2]
181 double accumulated_outflow_don_old; // [kg N m-2]
182 double accumulated_outflow_doc_old; // [kg C m-2]
183
184 SubscribedField<double> AccumulatedPrecipitation;
185 SubscribedField<double> AccumulatedThroughfall;
186 SubscribedVectorField<double> AccumulatedWateruptake;
187 SubscribedField<double> AccumulatedTranspiration;
188 SubscribedField<double> AccumulatedInterceptionevaporation;
189 SubscribedField<double> AccumulatedSoilevaporation;
190 SubscribedField<double> AccumulatedSurfacewaterevaporation;
191 PublishedAndSubscribedField<double> AccumulatedSurfacewaterAccess;
192 PublishedAndSubscribedField<double> AccumulatedRunoff;
193 PublishedAndSubscribedField<double> AccumulatedPercolation;
194 PublishedAndSubscribedField<double> AccumulatedInfiltration;
195 PublishedAndSubscribedField<double> AccumulatedGroundwaterAccess;
196 PublishedAndSubscribedField<double> AccumulatedGroundwaterLoss;
197
198 lvector_t< double > porosity_sl;
199 SubscribedVectorField<double> SoilPorosity;
200
201 double river_water; // [m3:m-2]
202
203 double surface_snow;
204 PublishedAndSubscribedField<double> SurfaceSnow;
205
206 double surface_water; // [m3:m-2]
207 PublishedAndSubscribedField<double> SurfaceWater;
208
209 lvector_t< double > wc_sl; // [m2:m-2]
210 PublishedAndSubscribedVectorField<double> VolumetricWaterContent;
211
212 lvector_t< double > sks_sl;
213 PublishedAndSubscribedVectorField<double> SaturatedHydraulicConductivity;
214
215 lvector_t< double > wc_fc_sl;
216 SubscribedVectorField<double> VolumetricFieldCapacity;
217
218 lvector_t< double > wc_sat_sl;
219 SubscribedVectorField<double> SaturatedWaterContent;
220
221 lvector_t< double > ice_sl;
222 SubscribedVectorField<double> IceContent;
223
224 lvector_t< double > height_sl; // [m]
225 lvector_t< double > depth_sl; // [m]
226 SubscribedVectorField<double> Soildepth;
227
228 double so4_surface;
229 lvector_t< double > so4_sl;
230 PublishedAndSubscribedVectorField<double> SoilSO4;
231 PublishedAndSubscribedField<double> SurfaceSO4;
232
233 double no3_surface; // [kg:m-2]
234 lvector_t< double > no3_sl;
235 PublishedAndSubscribedVectorField<double> SoilNO3;
236 PublishedAndSubscribedField<double> SurfaceNO3;
237
238 double nh4_surface;
239 lvector_t< double > nh4_sl;
240 PublishedAndSubscribedVectorField<double> SoilNH4;
241 PublishedAndSubscribedField<double> SurfaceNH4;
242
243 double don_surface;
244 lvector_t< double > don_sl;
245 PublishedAndSubscribedVectorField<double> SoilDON;
246 PublishedAndSubscribedField<double> SurfaceDON;
247
248 double doc_surface;
249 lvector_t< double > doc_sl;
250 PublishedAndSubscribedVectorField<double> SoilDOC;
251 PublishedAndSubscribedField<double> SurfaceDOC;
252
253 PublishedAndSubscribedField<double> AccumulatedLeachingNO3;
254 PublishedAndSubscribedField<double> AccumulatedLeachingNH4;
255 PublishedAndSubscribedField<double> AccumulatedLeachingDON;
256 PublishedAndSubscribedField<double> AccumulatedLeachingDOC;
257
258 double
259 max_depth();
260
261 double
262 get_runoff();
263
264 double
265 get_ground_water_available();
266
267 double
268 get_ground_water_available_above_river_potential();
269
270 double
271 get_ground_water();
272
273 double
274 get_soil_water();
275
276 double
277 get_total_water();
278
279 double
280 get_river_potential();
281
282 double
283 get_groundwater_share( lvector_t< double > &_source);
284
285 //Water volume only considered until field capacity
286 //Below field capacity, soil layer is no more accounted to the saturated zone
287 bool inline is_groundwater( int _sl){ return cbm::flt_greater( wc_sl[_sl], wc_fc_sl[_sl]); };
288};
289
290
291
292class LDNDC_API EcHy3D : public cbm::kernel_t
293{
294 LDNDC_KERNEL_OBJECT(EcHy3D,echy3d)
295
296public:
297 EcHy3D();
298 ~EcHy3D();
299
300 lerr_t configure( cbm::RunLevelArgs *);
301 lerr_t initialize( cbm::RunLevelArgs *);
302
303 //we solve with read due to mobile communication
304 lerr_t read( cbm::RunLevelArgs *);
305 lerr_t write( cbm::RunLevelArgs *);
306
307 lerr_t finalize( cbm::RunLevelArgs *);
308
309private:
310
311 lerr_t EcHy3D_initialize_cells();
312 lerr_t EcHy3D_initialize_cell_communication( cbm::RunLevelArgs *);
313 lerr_t EcHy3D_initialize_sinks( cbm::RunLevelArgs *);
314
315 lerr_t EcHy3D_move_state();
316 lerr_t EcHy3D_receive_state();
317 lerr_t EcHy3D_send_state( cbm::RunLevelArgs *);
318 lerr_t EcHy3D_write( cbm::RunLevelArgs *);
319
320
321 std::vector< EcHy3DCell > cells;
322
323 cbm::string_t data_file;
324 std::string data_file_content;
325
326 bool have_erosion_simulation;
327 bool have_surfacewater_simulation;
328 bool have_groundwater_simulation;
329
330 int kernel_setup_id;
331
332private:
333
334 lerr_t
335 collect_datarecord( ldndc_flt64_t * /* data buffer */);
336
337 lerr_t m_writerecord( ldndc_flt64_t *);
338 ldndc::sink_handle_t m_sink;
339 ldndc::SinkInterface m_sif;
340
345 EcHy3DCell *
346 get_cell( int /* cell id */);
347
348private:
349
350 /* hide these buggers for now */
351 EcHy3D( EcHy3D const &);
352 EcHy3D & operator=( EcHy3D const &);
353};
354} /* namespace ldndc */
355
356#endif /* !LDNDC_KERNEL_ECHY3D_H_ */
357
Spatially explicit groundwater model.
Definition airchemistryput.h:15