The BioCro C++ Library
bucket_soil_drainage.h
Go to the documentation of this file.
1#ifndef BUCKET_SOIL_DRAINAGE_H
2#define BUCKET_SOIL_DRAINAGE_H
3
4#include "../framework/module.h"
5#include "../framework/state_map.h"
6
7namespace standardBML
8{
9class bucket_soil_drainage : public differential_module
10{
11 public:
12 bucket_soil_drainage(state_map const& input_quantities, state_map* output_quantities)
13 : differential_module{},
14
15 // Get pointers to input quantities
16 soil_field_capacity_ip{get_ip(input_quantities, "soil_field_capacity")},
17 soil_wilting_point_ip{get_ip(input_quantities, "soil_wilting_point")},
18 soil_water_content_ip{get_ip(input_quantities, "soil_water_content")},
19 soil_saturation_capacity_ip{get_ip(input_quantities, "soil_saturation_capacity")},
20 soil_depth_ip{get_ip(input_quantities, "soil_depth")},
21 precipitation_rate_ip{get_ip(input_quantities, "precipitation_rate")},
22 soil_saturated_conductivity_ip{get_ip(input_quantities, "soil_saturated_conductivity")},
23 soil_air_entry_ip{get_ip(input_quantities, "soil_air_entry")},
24 soil_b_coefficient_ip{get_ip(input_quantities, "soil_b_coefficient")},
25 canopy_transpiration_rate_ip{get_ip(input_quantities, "canopy_transpiration_rate")},
26 soil_evaporation_rate_ip{get_ip(input_quantities, "soil_evaporation_rate")},
27
28 // Get pointers to output quantities
29 soil_water_content_op{get_op(output_quantities, "soil_water_content")}
30 {
31 }
32 static string_vector get_inputs();
33 static string_vector get_outputs();
34 static std::string get_name() { return "bucket_soil_drainage"; }
35
36 private:
37 // Pointers to input quantities
38 const double* soil_field_capacity_ip;
39 const double* soil_wilting_point_ip;
40 const double* soil_water_content_ip;
41 const double* soil_saturation_capacity_ip;
42 const double* soil_depth_ip;
43 const double* precipitation_rate_ip;
44 const double* soil_saturated_conductivity_ip;
45 const double* soil_air_entry_ip;
46 const double* soil_b_coefficient_ip;
47 const double* canopy_transpiration_rate_ip;
48 const double* soil_evaporation_rate_ip;
49
50 // Pointers to output quantities
51 double* soil_water_content_op;
52
53 // Main operation
54 void do_operation() const;
55};
56
58{
59 return {
60 "soil_field_capacity", //
61 "soil_wilting_point", //
62 "soil_water_content", //
63 "soil_saturation_capacity", //
64 "soil_depth", //
65 "precipitation_rate", //
66 "soil_saturated_conductivity", //
67 "soil_air_entry", //
68 "soil_b_coefficient", //
69 "canopy_transpiration_rate", //
70 "soil_evaporation_rate" //
71 };
72}
73
75{
76 return {
77 "soil_water_content" //
78 };
79}
80
81void bucket_soil_drainage::do_operation() const
82{
83 // Collect inputs and make calculations
84 double soil_field_capacity = *soil_field_capacity_ip; // m^3 / m^3.
85 double soil_wilting_point = *soil_wilting_point_ip; // m^3 / m^3.
86 double soil_water_content = *soil_water_content_ip; // m^3 / m^3.
87 double soil_saturation_capacity = *soil_saturation_capacity_ip; // m^3 / m^3.
88 double soil_depth = *soil_depth_ip; // meters
89 double precipitation_rate = *precipitation_rate_ip; // m / s.
90 double soil_saturated_conductivity = *soil_saturated_conductivity_ip;
91 double soil_air_entry = *soil_air_entry_ip;
92 double soil_b_coefficient = *soil_b_coefficient_ip;
93 double canopy_transpiration_rate = *canopy_transpiration_rate_ip;
94 double soil_evaporation_rate = *soil_evaporation_rate_ip;
95
96 constexpr double g = 9.8; // m / s^2. Acceleration due to gravity.
97 constexpr double density_of_water_at_20_celcius = 998.2; // kg m^-3.
98
99 /* soil_matric_potential is calculated as per "Dynamic Simulation of Water Deficit Effects upon Maize Yield" R. F. Grant Agricultural Systems. 33(1990) 13-39. */
100 double soil_matric_potential = -exp(log(0.033) + log(soil_field_capacity / soil_water_content) / log(soil_field_capacity / soil_wilting_point) * log(1.5 / 0.033)) * 1e3; // This last term converts from MPa to kPa.
101 double hydraulic_conductivity = soil_saturated_conductivity * pow(soil_air_entry / soil_matric_potential, 2 + 3 / soil_b_coefficient); // kg s / m^3.
102
103 double drainage = -hydraulic_conductivity * g / density_of_water_at_20_celcius; // m / s.
104
105 constexpr double runoff_rate = 1 / 3600; // Runoff 1 m^3 / hr.
106 double runoff = std::min(0.0, soil_water_content - soil_saturation_capacity) * runoff_rate * soil_depth; // m / s.
107
108 double transpiration_rate = canopy_transpiration_rate / density_of_water_at_20_celcius * 1000 / 10000 / 3600; // m / s.
109 double evaporation_rate = soil_evaporation_rate / density_of_water_at_20_celcius; // m / s.
110
111 // Update the output quantity list
112 update(soil_water_content_op, (precipitation_rate - transpiration_rate - evaporation_rate - runoff - drainage) / soil_depth * 3600); // m^3 / m^3 / hr;
113}
114
115} // namespace standardBML
116#endif
bucket_soil_drainage(state_map const &input_quantities, state_map *output_quantities)
This is the standard BioCro module library; it includes the essential modules used in typical BioCro ...
Definition: aba_decay.h:8