Line data Source code
1 0 : // Distributed under the MIT License.
2 : // See LICENSE.txt for details.
3 :
4 : #pragma once
5 :
6 : #include <array>
7 : #include <cstddef>
8 : #include <limits>
9 : #include <memory>
10 : #include <string>
11 : #include <unordered_map>
12 :
13 : #include "DataStructures/Tensor/TypeAliases.hpp"
14 : #include "Options/String.hpp"
15 : #include "PointwiseFunctions/ConstraintDamping/DampingFunction.hpp"
16 : #include "Utilities/Serialization/CharmPupable.hpp"
17 : #include "Utilities/TMPL.hpp"
18 :
19 : /// \cond
20 : class DataVector;
21 : namespace PUP {
22 : class er;
23 : } // namespace PUP
24 : namespace domain::FunctionsOfTime {
25 : class FunctionOfTime;
26 : } // namespace domain::FunctionsOfTime
27 : /// \endcond
28 :
29 1 : namespace ConstraintDamping {
30 : /*!
31 : * \brief A constant function: \f$f = C\f$
32 : *
33 : * \details Input file options are: `Value` \f$C\f$. The function takes input
34 : * coordinates of type `tnsr::I<T, VolumeDim, Fr>`, where `T` is e.g. `double`
35 : * or `DataVector`, `Fr` is a frame (e.g. `Frame::Inertial`), and `VolumeDim` is
36 : * the dimension of the spatial volume.
37 : */
38 : template <size_t VolumeDim, typename Fr>
39 1 : class Constant : public DampingFunction<VolumeDim, Fr> {
40 : public:
41 0 : struct Value {
42 0 : using type = double;
43 0 : static constexpr Options::String help = {"The value."};
44 : };
45 0 : using options = tmpl::list<Value>;
46 :
47 0 : static constexpr Options::String help = {"Returns a constant value"};
48 :
49 : /// \cond
50 : WRAPPED_PUPable_decl_base_template(SINGLE_ARG(DampingFunction<VolumeDim, Fr>),
51 : Constant); // NOLINT
52 :
53 : explicit Constant(CkMigrateMessage* msg);
54 : /// \endcond
55 :
56 0 : Constant(double value);
57 :
58 0 : Constant() = default;
59 0 : ~Constant() override = default;
60 0 : Constant(const Constant& /*rhs*/) = default;
61 0 : Constant& operator=(const Constant& /*rhs*/) = default;
62 0 : Constant(Constant&& /*rhs*/) = default;
63 0 : Constant& operator=(Constant&& /*rhs*/) = default;
64 :
65 0 : void operator()(
66 : gsl::not_null<Scalar<double>*> value_at_x,
67 : const tnsr::I<double, VolumeDim, Fr>& x, double time,
68 : const std::unordered_map<
69 : std::string,
70 : std::unique_ptr<::domain::FunctionsOfTime::FunctionOfTime>>&
71 : functions_of_time) const override;
72 0 : void operator()(
73 : gsl::not_null<Scalar<DataVector>*> value_at_x,
74 : const tnsr::I<DataVector, VolumeDim, Fr>& x, double time,
75 : const std::unordered_map<
76 : std::string,
77 : std::unique_ptr<::domain::FunctionsOfTime::FunctionOfTime>>&
78 : functions_of_time) const override;
79 :
80 0 : auto get_clone() const
81 : -> std::unique_ptr<DampingFunction<VolumeDim, Fr>> override;
82 :
83 : // NOLINTNEXTLINE(google-runtime-references)
84 0 : void pup(PUP::er& p) override;
85 :
86 : private:
87 0 : friend bool operator==(const Constant& lhs, const Constant& rhs) {
88 : return lhs.value_ == rhs.value_;
89 : }
90 :
91 : template <typename T>
92 0 : void apply_call_operator(const gsl::not_null<Scalar<T>*> value_at_x) const;
93 :
94 0 : double value_ = std::numeric_limits<double>::signaling_NaN();
95 : };
96 :
97 : template <size_t VolumeDim, typename Fr>
98 0 : bool operator!=(const Constant<VolumeDim, Fr>& lhs,
99 : const Constant<VolumeDim, Fr>& rhs) {
100 : return not(lhs == rhs);
101 : }
102 : } // namespace ConstraintDamping
103 :
104 : /// \cond
105 : template <size_t VolumeDim, typename Fr>
106 : // NOLINTNEXTLINE(cppcoreguidelines-avoid-non-const-global-variables)
107 : PUP::able::PUP_ID ConstraintDamping::Constant<VolumeDim, Fr>::my_PUP_ID =
108 : 0; // NOLINT
109 : /// \endcond
|