The BioCro C++ Library
daylength_calculator.h
Go to the documentation of this file.
1#ifndef DAYLENGTH_CALCULATOR_H
2#define DAYLENGTH_CALCULATOR_H
3
4#include <cmath> // cos, sin
5#include <algorithm> // min, max
6#include "../framework/module.h"
7#include "../framework/state_map.h"
8#include "../framework/constants.h" //pi
9
10namespace standardBML
11{
12
52class daylength_calculator : public direct_module
53{
54 public:
56 state_map const& input_quantities,
57 state_map* output_quantities)
58 : direct_module{},
59
60 // Get references to input quantities
61 lat{get_input(input_quantities, "lat")},
62 solar_dec{get_input(input_quantities, "solar_dec")},
63 p{get_input(input_quantities, "sunrise_sunset_elevation")},
64 // Get pointers to output quantities
65 daylength{get_op(output_quantities, "day_length")}
66
67 {
68 }
69 static string_vector get_inputs();
70 static string_vector get_outputs();
71 static std::string get_name() { return "daylength_calculator"; }
72
73 private:
74 // References to input quantities
75 const double& lat;
76 const double& solar_dec;
77 const double& p;
78
79 // Pointers to output quantities
80 double* daylength;
81 // Main operation
82 void do_operation() const;
83};
84
86{
87 return {
88 "lat", // degrees
89 "solar_dec", // degrees
90 "sunrise_sunset_elevation" // degrees
91 };
92}
93
95{
96 return {
97 "day_length" // hr
98 };
99}
100
101void daylength_calculator::do_operation() const
102{
103 using math_constants::pi;
104 constexpr double to_rad = pi / 180; // radian / degree
105 double offset = std::sin(p * to_rad); // dimensionless
106 double lam = lat * to_rad; // radians
107 double phi = solar_dec * to_rad; // radians
108 double num = offset + std::sin(lam) * std::sin(phi); // dimensionaless
109 double denom = std::cos(lam) * std::cos(phi); // dimensionless
110 double u = std::max(std::min(num / denom, 1.0), -1.0); // dimensionless
111 double D = 24 - 24 / pi * std::acos(u); // hours
112 update(daylength, D); // hours
113}
114
115} // namespace standardBML
116
117#endif
Computes day_length using a model described by Forsythe et al. (1995).
daylength_calculator(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