LandscapeDNDC 1.37.0
ld_transport.h
1
8#ifndef LM_SOILCHEMISTRY_TRANSPORT_H_
9#define LM_SOILCHEMISTRY_TRANSPORT_H_
10
11#include "state/mbe_state.h"
12
13namespace ldndc {
14
15
16enum boundary_condition{ dirichlet, neuman };
17
18
23class LDNDC_API Transport
24{
25public:
26
27 Transport( MoBiLE_State *, cbm::io_kcomm_t *);
28
29 ~Transport();
30
31 substate_soilchemistry_t const & sc_;
32 substate_surfacebulk_t & sb_;
33 substate_physiology_t const & ph_;
34 input_class_setup_t const & se_;
35 input_class_soillayers_t const & sl_;
36
37private:
38
39 solver_tridiagonal_t tdma_solver_;
40
41 //effective diffusion coefficient for plant mediated diffusion per soil layer
42 lvector_t< double > d_eff_plant_sl_;
43
44 //
45 lvector_t< double > d_eff_air_sl_;
46
47 //effective gas diffusion coefficient in atmosphere.
48 lvector_t< double > d_eff_air_fl_;
49
50 //air volume per soil layer
51 lvector_t< double > v_air_sl_;
52
53 //asdvection velocity
54 lvector_t< double > soil_gas_advection_sl_;
55
56 //
57 lvector_t< double > interface_air_sl_;
58
59 //
60 lvector_t< double > interface_delta_x_air_sl_;
61
62 //unit conversion factor used for diffusion calculations
63 lvector_t< double > fact_uc_xl_;
64
65 //interface between surface and upper soil layer
66 double interface_delta_x_atm_soil_;
67
68 //
69 double interface_delta_x_fl_soil_;
70
71 double interface_delta_x_sbl_soil_;
72public:
73 //
74 bool have_water_table_;
75
76 //
77 double h_wl_;
78
79public:
80
81 double wind_stimulation;
82
87 void
88 update_diffusion(
89 lvector_t< double > const &,
90 lvector_t< double > const &,
91 lvector_t< double > const &,
92 lvector_t< double > const &,
93 lvector_t< double > const &,
94 double ,
95 double ,
96 double ,
97 double ,
98 bool );
99
100 void
101 update_advection(
102 lvector_t< double > const &);
103
108 void
109 gas_diffusion_soil(
110 bool const & /* enable/disable plant diffusion */,
111 double const & /* diffusion coefficient */,
112 lvector_t< double > & /* effective diffusion coefficient */,
113 lvector_t< double > & /* substance */,
114 lvector_t< double > & /* bulk */,
115 lvector_t< double > & /* interface */,
116 double & /* out/in-flow via surface */,
117 double & /* out/in-flow via soil ground */,
118 double & /* out/in-flow via plant */,
119 boundary_condition const & /* upper boundary condition*/,
120 boundary_condition const & /* lower boundary condition*/,
121 double const & /* dirichlet boundary condition*/,
122 double const & /* atmospheric concentration */);
123
124 void
125 gas_diffusion_soil_atm(
126 size_t const _fl_cnt,
127 bool const & /*_have_plant_diff*/,
128 double const &_D_x,
129 lvector_t< double > &_value_fl,
130 lvector_t< double > &_value_sl,
131 double &_out_floor,
132 double &_out_ground,
133 double & /*_out_plant*/,
134 double const &_dirichlet,
135 double const &/*_atmos*/);
136
137 lerr_t
138 pertubation(
139 double const &_D_x,
140 lvector_t< double > &_D_eff_bulk_sl,
141 lvector_t< double > &_value_sl,
142 lvector_t< double > &_bulk,
143 lvector_t< double > &_interface_delta_x_sl);
144
145 void
146 liq_diffusion(
147 double const &_D_x,
148 lvector_t< double > &_D_eff_bulk_sl,
149 lvector_t< double > &_value_wl,
150 lvector_t< double > &_value_sl,
151 lvector_t< double > &_bulk,
152 lvector_t< double > &_interface_delta_x_sl,
153 double &_out,
154 boundary_condition const &_upper_bc,
155 boundary_condition const &_lower_bc,
156 double const &_dirichlet);
157
158 void
159 calculate_soil_fluxes(
160 size_t /* number of soil layers */,
161 double /* diffusion coefficient */,
162 double /* dirichlet boundary condition value */,
163 boundary_condition const & /* boundary condition */,
164 lvector_t< double > const & /* bulk volume */,
165 lvector_t< double > const & /* effective diffusion coefficient */,
166 lvector_t< double > const & /* interface / delta x */,
167 lvector_t< double > const & /* considered state variable */,
168 lvector_t< double > & /* calculated flux output */);
169
170 void
171 calculate_soil_atm_fluxes(
172 size_t /* number of canopy layers */,
173 size_t /* number of soil layers */,
174 double /* diffusion coefficient */,
175 double /* dirichlet boundary condition value */,
176 boundary_condition const & /* boundary condition */,
177 lvector_t< double > const & /* bulk volume */,
178 lvector_t< double > const & /* effective diffusion coefficient */,
179 lvector_t< double > const & /* interface / delta x */,
180 lvector_t< double > const & /* considered state variable (canopy) */,
181 lvector_t< double > const & /* considered state variable (soil) */,
182 lvector_t< double > & /* calculated flux output */);
183
184 void
185 calculate_soil_water_fluxes(
186 size_t /* number of soil layers */,
187 double /* diffusion coefficient */,
188 lvector_t< double > const & /* bulk volume */,
189 lvector_t< double > const & /* effective diffusion coefficient */,
190 lvector_t< double > const & /* interface / delta x */,
191 lvector_t< double > const &_val_wl /* considered state variable in water layers */,
192 lvector_t< double > const & /* considered state variable */,
193 double const & /*t-1 value of state variable in lowest sublayer*/,
194 lvector_t< double > & /* calculated flux output */);
195
196 void
197 calculate_soil_perturbation_fluxes(
198 size_t /* number of soil layers */,
199 double /* diffusion coefficient */,
200 lvector_t< double > const & /* bulk volume */,
201 lvector_t< double > const & /* effective diffusion coefficient */,
202 lvector_t< double > const & /* interface / delta x */,
203 lvector_t< double > const & /* considered state variable */,
204 double const & /*t-1 value of state variable in lowest sublayer*/,
205 lvector_t< double > & /* calculated flux output */);
206
207 void
208 diffusion_assemble_soil_water_matrix(
209 double const &_D_x,
210 lvector_t< double > &_D_eff_bulk_sl,
211 lvector_t< double > &_source_wl,
212 lvector_t< double > &_source_sl,
213 lvector_t< double > &_bulk_sl,
214 lvector_t< double > &_interface_delta_x_sl,
215 double &_out,
216 double const &_dirichlet);
217
218 lerr_t
219 leach_up_and_down( double &,
220 double &,
221 double &,
222 double);
223
224private:
225
230 void
231 add_plant_diffusion(
232 boundary_condition const & /* upper boundary condition */,
233 double const & /* atmospheric concentration */);
234
235 void
236 diffusion_assemble_soil_matrix(
237 double const & /* diffusion coefficient */,
238 lvector_t< double > & /* effective diffusion coefficient */,
239 lvector_t< double > & /* substance */,
240 lvector_t< double > & /* bulk */,
241 double const & /* interface of upper soil layer */,
242 lvector_t< double > & /* interface */,
243 double & /* out/in flow */,
244 boundary_condition const & /* upper boundary condition*/,
245 boundary_condition const & /* lower boundary condition*/,
246 double const & /* dirichlet boundary condition*/);
247
248 void
249 diffusion_assemble_soil_atm_matrix(
250 size_t const ,
251 double const &,
252 lvector_t< double > &,
253 lvector_t< double > &,
254 lvector_t< double > &,
255 lvector_t< double > &,
256 lvector_t< double > &,
257 double &,
258 double const &);
259
260
264 void
265 diffusion_end_soil(
266 unsigned int,
267 lvector_t< double > &,
268 double &);
269
273 void
274 diffusion_end_soil_atm(
275 size_t const _fl_cnt,
276 lvector_t< double > &,
277 lvector_t< double > &,
278 double &);
279
283 void
284 diffusion_end_soil_water(
285 lvector_t< double > &,
286 lvector_t< double > &,
287 double &);
288
292 double
293 get_out_floor(
294 double const & /*diffusion constant*/,
295 lvector_t< double > &/*effective diffusion constant*/);
296
297
301 double
302 get_out_plant(
303 boundary_condition const &,
304 double const &);
305
306public:
307
311 void
312 leach_down_epsilon(
313 double & _val_mid,
314 double & _val_down,
315 double const &_transport_factor,
316 double const &_epsilon);
317
321 void
322 leach_up_and_down_epsilon(
323 double & _val_up,
324 double & _val_mid,
325 double & _val_down,
326 double const &_transport_factor,
327 double const &_epsilon);
328};
329
330
331
336#define LEACH_DOWN(__val_mid__,__val_down__,__transport_fact__) \
337{ \
338if ( cbm::flt_greater_zero( (__val_mid__))) \
339{ \
340double const leach_value( (__val_mid__) * (__transport_fact__)); \
341(__val_mid__) -= (leach_value); \
342(__val_down__) += (leach_value); \
343} \
344else \
345{ \
346(__val_mid__) = 0.0; \
347} \
348} \
349
350
351
356#define LEACH_DOWN_EPSILON(__val_mid__,__val_down__,__transport_fact__, __epsilon__) \
357{ \
358if ( cbm::flt_greater( (__val_mid__), (__epsilon__))) \
359{ \
360double const leach_value( (__val_mid__ - __epsilon__) * (__transport_fact__)); \
361(__val_mid__) -= (leach_value); \
362(__val_down__) += (leach_value); \
363} \
364} \
365
366
367
372#define LEACH_UP_AND_DOWN(__val_up__,__val_mid__,__val_down__,__transport_fact__) \
373{ \
374if ( cbm::flt_greater_zero( (__val_mid__))) \
375{ \
376if ( cbm::flt_greater_zero( (__transport_fact__))) \
377{ \
378double const leach_value( (__val_mid__) * (__transport_fact__)); \
379(__val_mid__) -= (leach_value); \
380(__val_down__) += (leach_value); \
381} \
382else \
383{ \
384double const leach_value( (__val_mid__) * (__transport_fact__) * (-1)); \
385(__val_mid__) -= (leach_value); \
386(__val_up__) += (leach_value); \
387} \
388} \
389else \
390{ \
391(__val_mid__) = 0.0; \
392} \
393} \
394
395} /*namespace ldndc*/
396
397#endif /* !LM_SOILCHEMISTRY_TRANSPORT_H_ */
Spatially explicit groundwater model.
Definition: airchemistryput.h:15