Line data Source code
1 1 : // Distributed under the MIT License.
2 : // See LICENSE.txt for details.
3 :
4 : /// \file
5 : /// Defines MathFunctions::Sinusoid.
6 :
7 : #pragma once
8 :
9 : #include <memory>
10 : #include <pup.h>
11 :
12 : #include "Options/String.hpp"
13 : #include "PointwiseFunctions/MathFunctions/MathFunction.hpp"
14 : #include "Utilities/Serialization/CharmPupable.hpp"
15 : #include "Utilities/TMPL.hpp"
16 :
17 : /// \cond
18 : class DataVector;
19 : /// \endcond
20 :
21 : namespace MathFunctions {
22 : template <size_t VolumeDim, typename Fr>
23 0 : class Sinusoid;
24 :
25 : /*!
26 : * \ingroup MathFunctionsGroup
27 : * \brief Sinusoid \f$f = A \sin\left(k x + \delta \right)\f$.
28 : *
29 : * \details Input file options are: Amplitude, Phase, and Wavenumber
30 : */
31 : template <typename Fr>
32 1 : class Sinusoid<1, Fr> : public MathFunction<1, Fr> {
33 : public:
34 0 : struct Amplitude {
35 0 : using type = double;
36 0 : static constexpr Options::String help = {"The amplitude."};
37 : };
38 :
39 0 : struct Wavenumber {
40 0 : using type = double;
41 0 : static constexpr Options::String help = {"The wavenumber."};
42 : };
43 :
44 0 : struct Phase {
45 0 : using type = double;
46 0 : static constexpr Options::String help = {"The phase shift."};
47 : };
48 0 : using options = tmpl::list<Amplitude, Wavenumber, Phase>;
49 :
50 0 : static constexpr Options::String help = {
51 : "Applies a Sinusoid function to the input value"};
52 :
53 0 : Sinusoid(double amplitude, double wavenumber, double phase);
54 0 : Sinusoid() = default;
55 0 : std::unique_ptr<MathFunction<1, Fr>> get_clone() const override;
56 :
57 0 : WRAPPED_PUPable_decl_base_template(SINGLE_ARG(MathFunction<1, Fr>),
58 : Sinusoid); // NOLINT
59 :
60 0 : explicit Sinusoid(CkMigrateMessage* /*unused*/) {}
61 :
62 1 : double operator()(const double& x) const override;
63 0 : DataVector operator()(const DataVector& x) const override;
64 :
65 1 : double first_deriv(const double& x) const override;
66 0 : DataVector first_deriv(const DataVector& x) const override;
67 :
68 1 : double second_deriv(const double& x) const override;
69 0 : DataVector second_deriv(const DataVector& x) const override;
70 :
71 1 : double third_deriv(const double& x) const override;
72 0 : DataVector third_deriv(const DataVector& x) const override;
73 :
74 0 : bool operator==(const MathFunction<1, Fr>& other) const override;
75 0 : bool operator!=(const MathFunction<1, Fr>& other) const override;
76 :
77 0 : bool operator==(const Sinusoid<1, Fr>& other) const;
78 0 : bool operator!=(const Sinusoid<1, Fr>& other) const;
79 : // NOLINTNEXTLINE(google-runtime-references)
80 0 : void pup(PUP::er& p) override;
81 :
82 : private:
83 0 : double amplitude_{};
84 0 : double wavenumber_{};
85 0 : double phase_{};
86 :
87 : template <typename T>
88 0 : T apply_call_operator(const T& x) const;
89 : template <typename T>
90 0 : T apply_first_deriv(const T& x) const;
91 : template <typename T>
92 0 : T apply_second_deriv(const T& x) const;
93 : template <typename T>
94 0 : T apply_third_deriv(const T& x) const;
95 : };
96 :
97 : } // namespace MathFunctions
98 :
99 : /// \cond
100 : template <typename Fr>
101 : PUP::able::PUP_ID MathFunctions::Sinusoid<1, Fr>::my_PUP_ID = 0; // NOLINT
102 : /// \endcond
|