The BioCro C++ Library
harmonic_oscillator.h
Go to the documentation of this file.
1#ifndef OSCILLATOR_H
2#define OSCILLATOR_H
3
4#include <cmath> // for pow
5#include "../framework/module.h"
6#include "../framework/state_map.h"
7
8namespace standardBML
9{
10class harmonic_oscillator : public differential_module
11{
12 public:
14 state_map const& input_quantities,
15 state_map* output_quantities)
16 : differential_module{},
17
18 // Get references to input quantities
19 mass{get_input(input_quantities, "mass")},
20 spring_constant{get_input(input_quantities, "spring_constant")},
21 position{get_input(input_quantities, "position")},
22 velocity{get_input(input_quantities, "velocity")},
23
24 // Get pointers to output quantities
25 position_op{get_op(output_quantities, "position")},
26 velocity_op{get_op(output_quantities, "velocity")}
27 {
28 }
29 static string_vector get_inputs();
30 static string_vector get_outputs();
31 static std::string get_name() { return "harmonic_oscillator"; }
32
33 private:
34 // References to input quantities
35 double const& mass;
36 double const& spring_constant;
37 double const& position;
38 double const& velocity;
39
40 // Pointers to output quantities
41 double* position_op;
42 double* velocity_op;
43
44 // Main operation
45 void do_operation() const;
46};
47
49{
50 return {
51 "mass", // kg
52 "spring_constant", // N / m
53 "position", // m
54 "velocity" // m / s
55 };
56}
57
59{
60 return {
61 "position", // m / s
62 "velocity" // m / s^2
63 };
64}
65
66void harmonic_oscillator::do_operation() const
67{
68 update(position_op, velocity);
69 update(velocity_op, -1.0 * spring_constant * position / mass);
70}
71
72class harmonic_energy : public direct_module
73{
74 public:
76 state_map const& input_quantities,
77 state_map* output_quantities)
78 : direct_module{},
79
80 // Get pointers to input quantities
81 mass{get_input(input_quantities, "mass")},
82 spring_constant{get_input(input_quantities, "spring_constant")},
83 position{get_input(input_quantities, "position")},
84 velocity{get_input(input_quantities, "velocity")},
85
86 // Get pointers to output quantities
87 kinetic_energy_op{get_op(output_quantities, "kinetic_energy")},
88 spring_energy_op{get_op(output_quantities, "spring_energy")},
89 total_energy_op{get_op(output_quantities, "total_energy")}
90 {
91 }
92 static string_vector get_inputs();
93 static string_vector get_outputs();
94 static std::string get_name() { return "harmonic_energy"; }
95
96 private:
97 // Pointers to input quantities
98 double const& mass;
99 double const& spring_constant;
100 double const& position;
101 double const& velocity;
102
103 // Pointers to output quantities
104 double* kinetic_energy_op;
105 double* spring_energy_op;
106 double* total_energy_op;
107
108 // Main operation
109 void do_operation() const;
110};
111
113{
114 return {
115 "mass", // kg
116 "spring_constant", // N / m
117 "position", // m
118 "velocity" // m / s
119 };
120}
121
123{
124 return {
125 "kinetic_energy", // J
126 "spring_energy", // J
127 "total_energy" // J
128 };
129}
130
131void harmonic_energy::do_operation() const
132{
133 double const kinetic_energy = 0.5 * mass * pow(velocity, 2);
134 double const spring_energy = 0.5 * spring_constant * pow(position, 2);
135
136 update(kinetic_energy_op, kinetic_energy);
137 update(spring_energy_op, spring_energy);
138 update(total_energy_op, kinetic_energy + spring_energy);
139}
140
141} // namespace standardBML
142#endif
static string_vector get_outputs()
harmonic_energy(state_map const &input_quantities, state_map *output_quantities)
static string_vector get_inputs()
static string_vector get_outputs()
harmonic_oscillator(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