1#ifndef BUCKET_SOIL_DRAINAGE_H
2#define BUCKET_SOIL_DRAINAGE_H
4#include "../framework/module.h"
5#include "../framework/state_map.h"
13 : differential_module{},
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")},
29 soil_water_content_op{get_op(output_quantities,
"soil_water_content")}
34 static std::string
get_name() {
return "bucket_soil_drainage"; }
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;
51 double* soil_water_content_op;
54 void do_operation()
const;
60 "soil_field_capacity",
63 "soil_saturation_capacity",
66 "soil_saturated_conductivity",
69 "canopy_transpiration_rate",
70 "soil_evaporation_rate"
81void bucket_soil_drainage::do_operation()
const
84 double soil_field_capacity = *soil_field_capacity_ip;
85 double soil_wilting_point = *soil_wilting_point_ip;
86 double soil_water_content = *soil_water_content_ip;
87 double soil_saturation_capacity = *soil_saturation_capacity_ip;
88 double soil_depth = *soil_depth_ip;
89 double precipitation_rate = *precipitation_rate_ip;
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;
96 constexpr double g = 9.8;
97 constexpr double density_of_water_at_20_celcius = 998.2;
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;
101 double hydraulic_conductivity = soil_saturated_conductivity * pow(soil_air_entry / soil_matric_potential, 2 + 3 / soil_b_coefficient);
103 double drainage = -hydraulic_conductivity * g / density_of_water_at_20_celcius;
105 constexpr double runoff_rate = 1 / 3600;
106 double runoff = std::min(0.0, soil_water_content - soil_saturation_capacity) * runoff_rate * soil_depth;
108 double transpiration_rate = canopy_transpiration_rate / density_of_water_at_20_celcius * 1000 / 10000 / 3600;
109 double evaporation_rate = soil_evaporation_rate / density_of_water_at_20_celcius;
112 update(soil_water_content_op, (precipitation_rate - transpiration_rate - evaporation_rate - runoff - drainage) / soil_depth * 3600);
static string_vector get_outputs()
bucket_soil_drainage(state_map const &input_quantities, state_map *output_quantities)
static string_vector get_inputs()
static std::string get_name()
This is the standard BioCro module library; it includes the essential modules used in typical BioCro ...