Line data Source code
1 0 : // Distributed under the MIT License.
2 : // See LICENSE.txt for details.
3 :
4 : #pragma once
5 :
6 : #include <cstddef>
7 : #include <limits>
8 :
9 : #include "DataStructures/Tensor/TypeAliases.hpp"
10 : #include "Evolution/Systems/NewtonianEuler/Sources/Source.hpp"
11 : #include "Evolution/Systems/NewtonianEuler/TagsDeclarations.hpp"
12 : #include "Options/String.hpp"
13 : #include "Utilities/MakeArray.hpp"
14 : #include "Utilities/TMPL.hpp"
15 :
16 : /// \cond
17 : class DataVector;
18 :
19 : namespace PUP {
20 : class er;
21 : } // namespace PUP
22 :
23 : namespace gsl {
24 : template <typename>
25 : struct not_null;
26 : } // namespace gsl
27 : /// \endcond
28 :
29 : namespace NewtonianEuler::Sources {
30 :
31 : /*!
32 : * \brief Source generated from an external uniform acceleration.
33 : *
34 : * The NewtonianEuler system with source terms is written as
35 : *
36 : * \f{align*}
37 : * \partial_t\rho + \partial_i F^i(\rho) &= S(\rho)\\
38 : * \partial_t S^i + \partial_j F^{j}(S^i) &= S(S^i)\\
39 : * \partial_t e + \partial_i F^i(e) &= S(e),
40 : * \f}
41 : *
42 : * where \f$F^i(u)\f$ is the volume flux of the conserved quantity \f$u\f$
43 : * (see ComputeFluxes). For an external acceleration \f$a^i\f$, one has
44 : *
45 : * \f{align*}
46 : * S(\rho) &= 0\\
47 : * S(S^i) &= \rho a^i\\
48 : * S(e) &= S_ia^i,
49 : * \f}
50 : *
51 : * where \f$\rho\f$ is the mass density, \f$S^i\f$ is the momentum density,
52 : * and \f$e\f$ is the energy density.
53 : */
54 : template <size_t Dim>
55 1 : class UniformAcceleration : public Source<Dim> {
56 : public:
57 : /// The applied acceleration
58 1 : struct Acceleration {
59 0 : using type = std::array<double, Dim>;
60 0 : static constexpr Options::String help = {"The applied accerelation."};
61 : };
62 :
63 0 : using options = tmpl::list<Acceleration>;
64 :
65 0 : static constexpr Options::String help = {
66 : "Source terms corresponding to a uniform acceleration."};
67 :
68 0 : UniformAcceleration() = default;
69 0 : UniformAcceleration(const UniformAcceleration& /*rhs*/) = default;
70 0 : UniformAcceleration& operator=(const UniformAcceleration& /*rhs*/) = default;
71 0 : UniformAcceleration(UniformAcceleration&& /*rhs*/) = default;
72 0 : UniformAcceleration& operator=(UniformAcceleration&& /*rhs*/) = default;
73 0 : ~UniformAcceleration() override = default;
74 :
75 0 : explicit UniformAcceleration(
76 : const std::array<double, Dim>& acceleration_field);
77 :
78 : /// \cond
79 : explicit UniformAcceleration(CkMigrateMessage* msg);
80 : using PUP::able::register_constructor;
81 : WRAPPED_PUPable_decl_template(UniformAcceleration);
82 : /// \endcond
83 :
84 : // NOLINTNEXTLINE(google-runtime-references)
85 0 : void pup(PUP::er& p) override;
86 :
87 0 : auto get_clone() const -> std::unique_ptr<Source<Dim>> override;
88 :
89 0 : void operator()(
90 : gsl::not_null<Scalar<DataVector>*> source_mass_density_cons,
91 : gsl::not_null<tnsr::I<DataVector, Dim>*> source_momentum_density,
92 : gsl::not_null<Scalar<DataVector>*> source_energy_density,
93 : const Scalar<DataVector>& mass_density_cons,
94 : const tnsr::I<DataVector, Dim>& momentum_density,
95 : const Scalar<DataVector>& energy_density,
96 : const tnsr::I<DataVector, Dim>& velocity,
97 : const Scalar<DataVector>& pressure,
98 : const Scalar<DataVector>& specific_internal_energy,
99 : const EquationsOfState::EquationOfState<false, 2>& eos,
100 : const tnsr::I<DataVector, Dim>& coords, double time) const override;
101 :
102 : private:
103 : template <size_t SpatialDim>
104 0 : friend bool operator==( // NOLINT(readability-redundant-declaration)
105 : const UniformAcceleration<SpatialDim>& lhs,
106 : const UniformAcceleration<SpatialDim>& rhs);
107 :
108 0 : std::array<double, Dim> acceleration_field_ =
109 : make_array<Dim>(std::numeric_limits<double>::signaling_NaN());
110 : };
111 :
112 : template <size_t Dim>
113 0 : bool operator!=(const UniformAcceleration<Dim>& lhs,
114 : const UniformAcceleration<Dim>& rhs);
115 : } // namespace NewtonianEuler::Sources
|