5#include "../framework/constants.h"
6#include "../framework/module.h"
7#include "../framework/state_map.h"
14 phase_clock(state_map
const& input_quantities, state_map* output_quantities)
15 : differential_module{},
18 phi_ip{get_ip(input_quantities,
"phi")},
19 light_ip{get_ip(input_quantities,
"light")},
20 clock_dead_width_ip{get_ip(input_quantities,
"clock_dead_width")},
21 clock_width_asymm_ip{get_ip(input_quantities,
"clock_width_asymm")},
22 clock_area_asymm_ip{get_ip(input_quantities,
"clock_area_asymm")},
23 clock_r_scale_ip{get_ip(input_quantities,
"clock_r_scale")},
24 clock_period_ip{get_ip(input_quantities,
"clock_period")},
27 phi_op{get_op(output_quantities,
"phi")}
32 static std::string
get_name() {
return "phase_clock"; }
37 const double* light_ip;
38 const double* clock_dead_width_ip;
39 const double* clock_width_asymm_ip;
40 const double* clock_area_asymm_ip;
41 const double* clock_r_scale_ip;
42 const double* clock_period_ip;
48 void do_operation()
const;
69void phase_clock::do_operation()
const
75 using math_constants::pi;
78 const double phi = *phi_ip;
81 const double phi_mod = phi - 2.0 * pi * floor(phi / (2.0 * pi));
84 const double light = *light_ip;
87 const double d = *clock_dead_width_ip;
88 const double delta = *clock_width_asymm_ip;
89 const double epsilon = *clock_area_asymm_ip;
90 const double s = *clock_r_scale_ip;
93 const double a = pi * (1.0 - d + delta);
94 const double b = pi * (1.0 - d - delta);
96 const double alpha = s * (1.0 + 0.5 * epsilon);
97 const double beta = s * (1.0 - 0.5 * epsilon);
101 (0.0 <= phi_mod && phi_mod < a) ? -6.0 * alpha * phi_mod * (phi_mod - a) / (a * a * a)
102 : (phi_mod < 2.0 * pi - b) ? 0.0
103 : (phi_mod < 2.0 * pi) ? 6.0 * beta * (phi_mod - 2.0 * pi) * (phi_mod - 2.0 * pi + b) / (b * b * b)
104 :
throw std::logic_error(std::string(
"Thrown by phase_clock: something is wrong with phi_mod!\n"));
107 const double natural_period = *clock_period_ip;
108 const double natural_freq = 2.0 * pi / natural_period;
114 update(phi_op, natural_freq * (1 + R * light));
phase_clock(state_map const &input_quantities, state_map *output_quantities)
static string_vector get_outputs()
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 ...