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 <pup.h>
8 :
9 : #include "DataStructures/Tensor/TypeAliases.hpp"
10 : #include "Evolution/Systems/GeneralizedHarmonic/GaugeSourceFunctions/Gauges.hpp"
11 : #include "Options/String.hpp"
12 : #include "Utilities/TMPL.hpp"
13 :
14 : /// \cond
15 : class DataVector;
16 : namespace gsl {
17 : template <class T>
18 : class not_null;
19 : } // namespace gsl
20 : /// \endcond
21 :
22 : namespace gh::gauges {
23 : /*!
24 : * \brief Imposes the harmonic gauge condition, \f$H_a=0\f$.
25 : */
26 1 : class Harmonic final : public GaugeCondition {
27 : public:
28 0 : using options = tmpl::list<>;
29 :
30 0 : static constexpr Options::String help{
31 : "Apply the Harmonic gauge condition H_a=0."};
32 :
33 0 : Harmonic() = default;
34 0 : Harmonic(const Harmonic&) = default;
35 0 : Harmonic& operator=(const Harmonic&) = default;
36 0 : Harmonic(Harmonic&&) = default;
37 0 : Harmonic& operator=(Harmonic&&) = default;
38 0 : ~Harmonic() override = default;
39 :
40 : /// \cond
41 : explicit Harmonic(CkMigrateMessage* msg);
42 : using PUP::able::register_constructor;
43 : WRAPPED_PUPable_decl_template(Harmonic); // NOLINT
44 : /// \endcond
45 :
46 : template <size_t SpatialDim>
47 0 : void gauge_and_spacetime_derivative(
48 : gsl::not_null<tnsr::a<DataVector, SpatialDim, Frame::Inertial>*> gauge_h,
49 : gsl::not_null<tnsr::ab<DataVector, SpatialDim, Frame::Inertial>*>
50 : d4_gauge_h,
51 : double time,
52 : const tnsr::I<DataVector, SpatialDim, Frame::Inertial>& inertial_coords)
53 : const;
54 :
55 : // NOLINTNEXTLINE(google-runtime-references)
56 0 : void pup(PUP::er& p) override;
57 :
58 0 : std::unique_ptr<GaugeCondition> get_clone() const override;
59 :
60 0 : bool is_harmonic() const override;
61 : };
62 : } // namespace gh::gauges
|