Tatooine
duffing_oscillator.h
Go to the documentation of this file.
1#ifndef TATOOINE_DUFFING_OSCILLATOR_H
2#define TATOOINE_DUFFING_OSCILLATOR_H
3//==============================================================================
4#include <tatooine/field.h>
5
6#include <boost/math/constants/constants.hpp>
7#include <cmath>
8//==============================================================================
10//==============================================================================
11template <typename Real>
12struct duffing_oscillator : vectorfield<duffing_oscillator<Real>, Real, 2> {
15 using typename parent_type::pos_type;
16 using typename parent_type::tensor_type;
17 //============================================================================
19 static constexpr auto pi = boost::math::constants::pi<Real>();
20 //============================================================================
21 constexpr duffing_oscillator(Real delta, Real alpha, Real beta) noexcept
23 //----------------------------------------------------------------------------
24 constexpr auto evaluate(const pos_type& x, Real /*t*/) const
25 -> tensor_type override {
26 return tensor_type{
27 x(1), -m_delta * x(1) - m_alpha * x(0) - m_beta * x(0) * x(0) * x(0)};
28 }
29 //----------------------------------------------------------------------------
30 constexpr auto in_domain(const pos_type& /*x*/, Real /*t*/) const
31 -> bool override {
32 return true;
33 }
34 //----------------------------------------------------------------------------
35 auto alpha() -> auto& { return m_alpha; }
36 auto alpha() const { return m_alpha; }
37 //----------------------------------------------------------------------------
38 auto beta() -> auto& { return m_beta; }
39 auto beta() const { return m_beta; }
40 //----------------------------------------------------------------------------
41 auto delta() -> auto& { return m_delta; }
42 auto delta() const { return m_delta; }
43};
44//------------------------------------------------------------------------------
46//==============================================================================
47template <typename Real>
49 : vectorfield<forced_duffing_oscillator<Real>, Real, 2> {
52 using typename parent_type::pos_type;
53 using typename parent_type::tensor_type;
54 //============================================================================
55 Real m_eps;
56 static constexpr auto pi = boost::math::constants::pi<Real>();
57 //============================================================================
58 constexpr forced_duffing_oscillator(Real eps = 0.25) noexcept : m_eps{eps} {}
59 ~forced_duffing_oscillator() override = default;
60 //----------------------------------------------------------------------------
61 constexpr auto evaluate(pos_type const& x, Real const t) const -> tensor_type {
62 return {x(1), x(0) - x(0) * x(0) * x(0) + m_eps * std::sin(t)};
63 }
64 //----------------------------------------------------------------------------
65 constexpr auto in_domain(pos_type const& /*x*/, Real const /*t*/) const -> bool {
66 return true;
67 }
68};
69//------------------------------------------------------------------------------
71//==============================================================================
72} // namespace tatooine::numerical
73//==============================================================================
74#endif
Definition: abcflow.h:7
Definition: duffing_oscillator.h:12
Real m_alpha
Definition: duffing_oscillator.h:18
auto delta() const
Definition: duffing_oscillator.h:42
static constexpr auto pi
Definition: duffing_oscillator.h:19
auto beta() -> auto &
Definition: duffing_oscillator.h:38
Real m_delta
Definition: duffing_oscillator.h:18
Real m_beta
Definition: duffing_oscillator.h:18
auto alpha() const
Definition: duffing_oscillator.h:36
constexpr auto in_domain(const pos_type &, Real) const -> bool override
Definition: duffing_oscillator.h:30
auto delta() -> auto &
Definition: duffing_oscillator.h:41
auto beta() const
Definition: duffing_oscillator.h:39
auto alpha() -> auto &
Definition: duffing_oscillator.h:35
constexpr auto evaluate(const pos_type &x, Real) const -> tensor_type override
Definition: duffing_oscillator.h:24
constexpr duffing_oscillator(Real delta, Real alpha, Real beta) noexcept
Definition: duffing_oscillator.h:21
constexpr auto evaluate(pos_type const &x, Real const t) const -> tensor_type
Definition: duffing_oscillator.h:61
constexpr forced_duffing_oscillator(Real eps=0.25) noexcept
Definition: duffing_oscillator.h:58
Real m_eps
Definition: duffing_oscillator.h:55
constexpr auto in_domain(pos_type const &, Real const) const -> bool
Definition: duffing_oscillator.h:65
static constexpr auto pi
Definition: duffing_oscillator.h:56
Definition: field.h:134
vec< real_type, NumDimensions > pos_type
Definition: field.h:20
Tensor tensor_type
Definition: field.h:18
Definition: vec.h:12