The BioCro C++ Library
penman_monteith_transpiration.h
Go to the documentation of this file.
1#ifndef PENMAN_MONTEITH_TRANSPIRATION_H
2#define PENMAN_MONTEITH_TRANSPIRATION_H
3
4#include "../framework/module.h"
5#include "../framework/state_map.h"
6
7namespace standardBML
8{
9class penman_monteith_transpiration : public direct_module
10{
11 public:
13 state_map const& input_quantities,
14 state_map* output_quantities)
15 : direct_module{},
16
17 // Get references to input quantities
18 slope_water_vapor{get_input(input_quantities, "slope_water_vapor")},
19 psychrometric_parameter{get_input(input_quantities, "psychrometric_parameter")},
20 latent_heat_vaporization_of_water{get_input(input_quantities, "latent_heat_vaporization_of_water")},
21 leaf_boundary_layer_conductance{get_input(input_quantities, "leaf_boundary_layer_conductance")},
22 leaf_stomatal_conductance{get_input(input_quantities, "leaf_stomatal_conductance")},
23 leaf_net_irradiance{get_input(input_quantities, "leaf_net_irradiance")},
24 vapor_density_deficit{get_input(input_quantities, "vapor_density_deficit")},
25
26 // Get pointers to output quantities
27 leaf_transpiration_rate_op{get_op(output_quantities, "leaf_transpiration_rate")}
28 {
29 }
30 static string_vector get_inputs();
31 static string_vector get_outputs();
32 static std::string get_name() { return "penman_monteith_transpiration"; }
33
34 private:
35 // References to input quantities
36 double const& slope_water_vapor;
37 double const& psychrometric_parameter;
38 double const& latent_heat_vaporization_of_water;
39 double const& leaf_boundary_layer_conductance;
40 double const& leaf_stomatal_conductance;
41 double const& leaf_net_irradiance;
42 double const& vapor_density_deficit;
43
44 // Pointers to output quantities
45 double* leaf_transpiration_rate_op;
46 // Main operation
47 void do_operation() const;
48};
49
51{
52 return {
53 "slope_water_vapor", // kg / m^3 / K
54 "psychrometric_parameter", // kg / m^3 / K
55 "latent_heat_vaporization_of_water", // J / kg
56 "leaf_boundary_layer_conductance", // m / s
57 "leaf_stomatal_conductance", // mmol / m^2 / s
58 "leaf_net_irradiance", // J / m^2 / s (leaf area basis)
59 "vapor_density_deficit" // kg / m^3
60 };
61}
62
64{
65 return {
66 "leaf_transpiration_rate" // kg / m^2 / s (leaf area basis)
67 };
68}
69
70void penman_monteith_transpiration::do_operation() const
71{
72 // From Thornley and Johnson 1990. pg 408. equation 14.4k.
73
74 // TODO: This is for about 20 degrees C at 100000 Pa. Change it to use the
75 // model state. (1 * R * temperature) / pressure
76 double volume_of_one_mole_of_air = 24.39e-3; // m^3 / mol
77
78 double gc = leaf_boundary_layer_conductance * 1e-3 * volume_of_one_mole_of_air; // m / s
79
80 double et_num =
81 slope_water_vapor * leaf_net_irradiance +
82 latent_heat_vaporization_of_water * psychrometric_parameter *
83 leaf_boundary_layer_conductance * vapor_density_deficit;
84
85 double et_denom =
86 latent_heat_vaporization_of_water *
87 (slope_water_vapor + psychrometric_parameter * (1 + leaf_boundary_layer_conductance / gc));
88
89 double evapotranspiration = et_num / et_denom; // kg / m^2 / s (leaf area basis)
90
91 // Update the output quantity list
92 update(leaf_transpiration_rate_op, evapotranspiration); // kg / m^2 / s (leaf area basis)
93}
94
95} // namespace standardBML
96#endif
penman_monteith_transpiration(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