1#ifndef POINCARE_CLOCK_H
2#define POINCARE_CLOCK_H
5#include "../framework/constants.h"
6#include "../framework/module.h"
7#include "../framework/state_map.h"
14 poincare_clock(state_map
const& input_quantities, state_map* output_quantities)
15 : differential_module{},
18 dawn_kick_ip{get_ip(input_quantities,
"dawn_kick")},
19 dusk_kick_ip{get_ip(input_quantities,
"dusk_kick")},
20 dawn_b_ip{get_ip(input_quantities,
"dawn_b")},
21 dawn_a_ip{get_ip(input_quantities,
"dawn_a")},
22 dusk_b_ip{get_ip(input_quantities,
"dusk_b")},
23 dusk_a_ip{get_ip(input_quantities,
"dusk_a")},
24 ref_b_ip{get_ip(input_quantities,
"ref_b")},
25 ref_a_ip{get_ip(input_quantities,
"ref_a")},
26 clock_gamma_ip{get_ip(input_quantities,
"clock_gamma")},
27 clock_r0_ip{get_ip(input_quantities,
"clock_r0")},
28 clock_period_ip{get_ip(input_quantities,
"clock_period")},
31 dawn_b_op{get_op(output_quantities,
"dawn_b")},
32 dawn_a_op{get_op(output_quantities,
"dawn_a")},
33 dusk_b_op{get_op(output_quantities,
"dusk_b")},
34 dusk_a_op{get_op(output_quantities,
"dusk_a")},
35 ref_b_op{get_op(output_quantities,
"ref_b")},
36 ref_a_op{get_op(output_quantities,
"ref_a")}
41 static std::string
get_name() {
return "poincare_clock"; }
45 const double* dawn_kick_ip;
46 const double* dusk_kick_ip;
47 const double* dawn_b_ip;
48 const double* dawn_a_ip;
49 const double* dusk_b_ip;
50 const double* dusk_a_ip;
51 const double* ref_b_ip;
52 const double* ref_a_ip;
53 const double* clock_gamma_ip;
54 const double* clock_r0_ip;
55 const double* clock_period_ip;
66 void do_operation()
const;
96void poincare_clock::do_operation()
const
102 using math_constants::pi;
105 double dawn_kick = *dawn_kick_ip;
106 double dusk_kick = *dusk_kick_ip;
109 double dawn_b = *dawn_b_ip;
110 double dawn_a = *dawn_a_ip;
113 double dusk_b = *dusk_b_ip;
114 double dusk_a = *dusk_a_ip;
117 double ref_b = *ref_b_ip;
118 double ref_a = *ref_a_ip;
121 const double natural_period = *clock_period_ip;
122 const double natural_freq = 2.0 * pi / natural_period;
123 const double gamma = *clock_gamma_ip;
124 const double r_0 = *clock_r0_ip;
127 const double dawn_friction = gamma * (r_0 - sqrt(dawn_a * dawn_a + dawn_b * dawn_b));
128 const double dusk_friction = gamma * (r_0 - sqrt(dusk_a * dusk_a + dusk_b * dusk_b));
129 const double ref_friction = gamma * (r_0 - sqrt(ref_a * ref_a + ref_b * ref_b));
136 update(dawn_b_op, dawn_friction * dawn_b + natural_freq * dawn_a);
137 update(dawn_a_op, dawn_friction * dawn_a - natural_freq * dawn_b + dawn_kick);
140 update(dusk_b_op, dusk_friction * dusk_b + natural_freq * dusk_a);
141 update(dusk_a_op, dusk_friction * dusk_a - natural_freq * dusk_b + dusk_kick);
144 update(ref_b_op, ref_friction * ref_b + natural_freq * ref_a);
145 update(ref_a_op, ref_friction * ref_a - natural_freq * ref_b);
static string_vector get_outputs()
static string_vector get_inputs()
static std::string get_name()
poincare_clock(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 ...