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_nh4_soil; // [kg N]
90 double delta_nh4_surface; // [kg N]
91 double delta_nh4_erosion; // [kg N]
92 double delta_don_soil; // [kg N]
93 double delta_don_surface; // [kg N]
94 double delta_don_erosion; // [kg N]
95 double delta_doc_soil; // [kg C]
96 double delta_doc_surface; // [kg C]
97 double delta_doc_erosion; // [kg C]
98
99 double delta_no3_gain_ecosystem_specific; // [kg N]
100 double delta_no3_loss_ecosystem_specific; // [kg N]
101
102 double delta_n_gain_ecosystem_specific; // [kg N]
103 double delta_n_loss_ecosystem_specific; // [kg N]
104
105 double delta_c_gain_ecosystem_specific; // [kg N]
106 double delta_c_loss_ecosystem_specific; // [kg N]
107
108 double delta_groundwater_gain_ecosystem_specific; // []
109 double delta_groundwater_loss_ecosystem_specific; // []
110
111 double available_so4; // [kg S]
112 double available_no3; // [kg N]
113 double available_nh4; // [kg N]
114 double available_don; // [kg N]
115 double available_doc; // [kg C]
116
117 double river_so4; // [kg S]
118 double river_no3; // [kg N]
119 double river_nh4; // [kg N]
120 double river_don; // [kg N]
121 double river_doc; // [kg N]
122
123 int sl_gw;
124 //helper variable to scale water and nutrients after outflow
125 double scale_out;
126 double scale_out_surface;
127
128 lerr_t reset();
129
130 double pressure_head; // [m]
131 lerr_t step_init( cbm::RunLevelArgs *);
132
133 lerr_t EcHy3DCell_update_soil_water_content( cbm::RunLevelArgs *);
134 lerr_t EcHy3DCell_update_surface_water_content( cbm::RunLevelArgs *);
135 lerr_t EcHy3DCell_update_river_water_content( cbm::RunLevelArgs *);
136 lerr_t EcHy3DCell_boundary_flows( cbm::RunLevelArgs *, int);
137
138 bool help;
139 lerr_t EcHy3DCell_update_nutrient_transport( double &_delta_val_soil,
140 double &_delta_val_surface,
141 double &_delta_val_erosion,
142 double &_accumulated_val,
143 lvector_t< double > &_val_soil,
144 double &_val_surface,
145 cbm::string_t _name);
146
147 double accumulated_precipitation;
148 double accumulated_throughfall;
149 lvector_t< double > accumulated_wateruptake_sl;
150 double accumulated_interceptionevaporation;
151 double accumulated_transpiration;
152 double accumulated_soilevaporation;
153 double accumulated_surfacewaterevaporation;
154 double accumulated_percolation;
155 double accumulated_infiltration;
156 double accumulated_groundwater_access; // [m3:m-2]
157 double accumulated_groundwater_loss; // [m3:m-2]
158 double accumulated_surfacewater_access; // [m3:m-2]
159 double accumulated_surfacewater_loss; // [m3:m-2]
160 double accumulated_outlet; // [m3:m-2]
161 double accumulated_outflow_soil; // [m3:m-2]
162 double accumulated_outflow_surface; // [m3:m-2]
163
164 double accumulated_outflow_so4; // [kg S m-2]
165 double accumulated_outflow_no3; // [kg N m-2]
166 double accumulated_outflow_nh4; // [kg N m-2]
167 double accumulated_outflow_don; // [kg N m-2]
168 double accumulated_outflow_doc; // [kg C m-2]
169
170 double accumulated_precipitation_old;
171 double accumulated_throughfall_old;
172 double accumulated_transpiration_old;
173 double accumulated_wateruptake_old; // [m3:m-2] last value written to output
174 double accumulated_interceptionevaporation_old;
175 double accumulated_soilevaporation_old;
176 double accumulated_surfacewaterevaporation_old;
177 double accumulated_infiltration_old;
178 double accumulated_groundwater_access_old; // [m3:m-2]
179 double accumulated_groundwater_loss_old; // [m3:m-2]
180 double accumulated_surfacewater_access_old; // [m3:m-2]
181 double accumulated_surfacewater_loss_old; // [m3:m-2] last value written to output
182 double accumulated_surfacewater_loss_step_old; // [m3:m-2] value after last EcHy3D time step (see EcHy3D_move_state)
183 double accumulated_outlet_old;
184 double accumulated_outflow_soil_old;
185 double accumulated_outflow_surface_old;
186
187 double accumulated_outflow_so4_old; // [kg S m-2]
188 double accumulated_outflow_no3_old; // [kg N m-2]
189 double accumulated_outflow_nh4_old; // [kg N m-2]
190 double accumulated_outflow_don_old; // [kg N m-2]
191 double accumulated_outflow_doc_old; // [kg C m-2]
192
193 SubscribedField<double> AccumulatedPrecipitation;
194 SubscribedField<double> AccumulatedThroughfall;
195 SubscribedVectorField<double> AccumulatedWateruptake;
196 SubscribedField<double> AccumulatedTranspiration;
197 SubscribedField<double> AccumulatedInterceptionevaporation;
198 SubscribedField<double> AccumulatedSoilevaporation;
199 SubscribedField<double> AccumulatedSurfacewaterevaporation;
200 PublishedAndSubscribedField<double> AccumulatedSurfacewaterAccess;
201 PublishedAndSubscribedField<double> AccumulatedRunoff;
202 PublishedAndSubscribedField<double> AccumulatedPercolation;
203 PublishedAndSubscribedField<double> AccumulatedInfiltration;
204 PublishedAndSubscribedField<double> AccumulatedGroundwaterAccess;
205 PublishedAndSubscribedField<double> AccumulatedGroundwaterLoss;
206
207 lvector_t< double > porosity_sl;
208 SubscribedVectorField<double> SoilPorosity;
209
210 double river_water; // [m3:m-2]
211
212 double surface_snow;
213 PublishedAndSubscribedField<double> SurfaceSnow;
214
215 double surface_water; // [m3:m-2]
216 PublishedAndSubscribedField<double> SurfaceWater;
217
218 lvector_t< double > wc_sl; // [m2:m-2]
219 PublishedAndSubscribedVectorField<double> VolumetricWaterContent;
220
221 lvector_t< double > sks_sl;
222 PublishedAndSubscribedVectorField<double> SaturatedHydraulicConductivity;
223
224 lvector_t< double > wc_fc_sl;
225 SubscribedVectorField<double> VolumetricFieldCapacity;
226
227 lvector_t< double > wc_sat_sl;
228 SubscribedVectorField<double> SaturatedWaterContent;
229
230 lvector_t< double > ice_sl;
231 SubscribedVectorField<double> IceContent;
232
233 lvector_t< double > height_sl; // [m]
234 lvector_t< double > depth_sl; // [m]
235 SubscribedVectorField<double> Soildepth;
236
237 double so4_surface;
238 lvector_t< double > so4_sl;
239 PublishedAndSubscribedVectorField<double> SoilSO4;
240 PublishedAndSubscribedField<double> SurfaceSO4;
241
242 double no3_surface; // [kg:m-2]
243 lvector_t< double > no3_sl;
244 PublishedAndSubscribedVectorField<double> SoilNO3;
245 PublishedAndSubscribedField<double> SurfaceNO3;
246
247 double nh4_surface;
248 lvector_t< double > nh4_sl;
249 PublishedAndSubscribedVectorField<double> SoilNH4;
250 PublishedAndSubscribedField<double> SurfaceNH4;
251
252 double don_surface;
253 lvector_t< double > don_sl;
254 PublishedAndSubscribedVectorField<double> SoilDON;
255 PublishedAndSubscribedField<double> SurfaceDON;
256
257 double doc_surface;
258 lvector_t< double > doc_sl;
259 PublishedAndSubscribedVectorField<double> SoilDOC;
260 PublishedAndSubscribedField<double> SurfaceDOC;
261
262 PublishedAndSubscribedField<double> AccumulatedLeachingNO3;
263 PublishedAndSubscribedField<double> AccumulatedLeachingNH4;
264 PublishedAndSubscribedField<double> AccumulatedLeachingDON;
265 PublishedAndSubscribedField<double> AccumulatedLeachingDOC;
266
267 double
268 max_depth();
269
270 double
271 get_runoff();
272
273 double
274 get_ground_water_available();
275
276 double
277 get_ground_water_available_above_river_potential();
278
279 double
280 get_ground_water();
281
282 double
283 get_soil_water();
284
285 double
286 get_total_water();
287
288 double
289 get_river_potential();
290
291 double
292 get_groundwater_share( lvector_t< double > &_source);
293
294 //Water volume only considered until field capacity
295 //Below field capacity, soil layer is no more accounted to the saturated zone
296 bool inline is_groundwater( int _sl){ return cbm::flt_greater( wc_sl[_sl], wc_fc_sl[_sl]); };
297};
298
299
300
301class LDNDC_API EcHy3D : public cbm::kernel_t
302{
303 LDNDC_KERNEL_OBJECT(EcHy3D,echy3d)
304
305public:
306 EcHy3D();
307 ~EcHy3D();
308
309 lerr_t configure( cbm::RunLevelArgs *);
310 lerr_t initialize( cbm::RunLevelArgs *);
311
312 lerr_t solve_global( cbm::RunLevelArgs *);
313 lerr_t write( cbm::RunLevelArgs *);
314
315 lerr_t finalize( cbm::RunLevelArgs *);
316
317private:
318
319 lerr_t EcHy3D_initialize_cells();
320 lerr_t EcHy3D_initialize_cell_communication( cbm::RunLevelArgs *);
321 lerr_t EcHy3D_initialize_sinks( cbm::RunLevelArgs *);
322
323 lerr_t EcHy3D_move_state();
324 lerr_t EcHy3D_receive_state();
325 lerr_t EcHy3D_send_state( cbm::RunLevelArgs *);
326 lerr_t EcHy3D_write( cbm::RunLevelArgs *);
327
328
329 std::vector< EcHy3DCell > cells;
330
331 cbm::string_t data_file;
332 std::string data_file_content;
333
334 bool have_erosion_simulation;
335 bool have_surfacewater_simulation;
336 bool have_groundwater_simulation;
337
338 int kernel_setup_id;
339
340private:
341
342 lerr_t
343 collect_datarecord( ldndc_flt64_t * /* data buffer */);
344
345 lerr_t m_writerecord( ldndc_flt64_t *);
346 ldndc::sink_handle_t m_sink;
347 ldndc::SinkInterface m_sif;
348
353 EcHy3DCell *
354 get_cell( int /* cell id */);
355
356private:
357
358 /* hide these buggers for now */
359 EcHy3D( EcHy3D const &);
360 EcHy3D & operator=( EcHy3D const &);
361};
362} /* namespace ldndc */
363
364#endif /* !LDNDC_KERNEL_ECHY3D_H_ */
365
Spatially explicit groundwater model.
Definition airchemistryput.h:15