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 <memory>
9 : #include <pup.h>
10 : #include <utility>
11 :
12 : #include "DataStructures/DataBox/Prefixes.hpp"
13 : #include "DataStructures/Tensor/TypeAliases.hpp"
14 : #include "DataStructures/VariablesTag.hpp"
15 : #include "Domain/Structure/DirectionalIdMap.hpp"
16 : #include "Domain/Tags.hpp"
17 : #include "Evolution/DgSubcell/GhostData.hpp"
18 : #include "Evolution/DgSubcell/Tags/GhostDataForReconstruction.hpp"
19 : #include "Evolution/DgSubcell/Tags/Mesh.hpp"
20 : #include "Evolution/DiscontinuousGalerkin/Actions/NormalCovectorAndMagnitude.hpp"
21 : #include "Evolution/Systems/ForceFree/FiniteDifference/Reconstructor.hpp"
22 : #include "Evolution/Systems/ForceFree/FiniteDifference/Tags.hpp"
23 : #include "Evolution/Systems/ForceFree/Tags.hpp"
24 : #include "Options/Options.hpp"
25 : #include "PointwiseFunctions/GeneralRelativity/Tags.hpp"
26 : #include "Utilities/Serialization/CharmPupable.hpp"
27 : #include "Utilities/TMPL.hpp"
28 :
29 : /// \cond
30 : class DataVector;
31 : template <size_t dim>
32 : class Direction;
33 : template <size_t dim>
34 : class Element;
35 : template <size_t dim>
36 : class ElementId;
37 : template <size_t dim>
38 : class Mesh;
39 : template <typename recons_tags>
40 : class Variables;
41 : namespace gsl {
42 : template <typename>
43 : class not_null;
44 : } // namespace gsl
45 : namespace PUP {
46 : class er;
47 : } // namespace PUP
48 : /// \endcond
49 :
50 : namespace ForceFree::fd {
51 :
52 : /*!
53 : * \brief Monotonised central reconstruction. See
54 : * ::fd::reconstruction::monotonised_central() for details.
55 : */
56 :
57 1 : class MonotonisedCentral : public Reconstructor {
58 : private:
59 0 : using TildeE = ForceFree::Tags::TildeE;
60 0 : using TildeB = ForceFree::Tags::TildeB;
61 0 : using TildePsi = ForceFree::Tags::TildePsi;
62 0 : using TildePhi = ForceFree::Tags::TildePhi;
63 0 : using TildeQ = ForceFree::Tags::TildeQ;
64 0 : using TildeJ = ForceFree::Tags::TildeJ;
65 :
66 0 : using volume_vars_tags =
67 : tmpl::list<TildeE, TildeB, TildePsi, TildePhi, TildeQ>;
68 :
69 0 : using recons_tags = ForceFree::fd::tags_list_for_reconstruction;
70 :
71 : public:
72 0 : static constexpr size_t dim = 3;
73 :
74 0 : using options = tmpl::list<>;
75 0 : static constexpr Options::String help{
76 : "Monotonised central reconstruction scheme."};
77 :
78 0 : MonotonisedCentral() = default;
79 0 : MonotonisedCentral(MonotonisedCentral&&) = default;
80 0 : MonotonisedCentral& operator=(MonotonisedCentral&&) = default;
81 0 : MonotonisedCentral(const MonotonisedCentral&) = default;
82 0 : MonotonisedCentral& operator=(const MonotonisedCentral&) = default;
83 0 : ~MonotonisedCentral() override = default;
84 :
85 0 : explicit MonotonisedCentral(CkMigrateMessage* msg);
86 :
87 0 : WRAPPED_PUPable_decl_base_template(Reconstructor, MonotonisedCentral);
88 :
89 0 : auto get_clone() const -> std::unique_ptr<Reconstructor> override;
90 :
91 0 : static constexpr bool use_adaptive_order = false;
92 :
93 0 : void pup(PUP::er& p) override;
94 :
95 0 : size_t ghost_zone_size() const override { return 2; }
96 :
97 0 : using reconstruction_argument_tags =
98 : tmpl::list<::Tags::Variables<volume_vars_tags>, TildeJ,
99 : domain::Tags::Element<dim>,
100 : evolution::dg::subcell::Tags::GhostDataForReconstruction<dim>,
101 : evolution::dg::subcell::Tags::Mesh<dim>>;
102 :
103 0 : void reconstruct(
104 : gsl::not_null<std::array<Variables<recons_tags>, dim>*>
105 : vars_on_lower_face,
106 : gsl::not_null<std::array<Variables<recons_tags>, dim>*>
107 : vars_on_upper_face,
108 : const Variables<volume_vars_tags>& volume_vars,
109 : const tnsr::I<DataVector, 3, Frame::Inertial>& tilde_j,
110 : const Element<dim>& element,
111 : const DirectionalIdMap<dim, evolution::dg::subcell::GhostData>&
112 : ghost_data,
113 : const Mesh<dim>& subcell_mesh) const;
114 :
115 0 : void reconstruct_fd_neighbor(
116 : gsl::not_null<Variables<recons_tags>*> vars_on_face,
117 : const Variables<volume_vars_tags>& volume_vars,
118 : const tnsr::I<DataVector, 3, Frame::Inertial>& tilde_j,
119 : const Element<dim>& element,
120 : const DirectionalIdMap<dim, evolution::dg::subcell::GhostData>&
121 : ghost_data,
122 : const Mesh<dim>& subcell_mesh,
123 : const Direction<dim> direction_to_reconstruct) const;
124 : };
125 :
126 0 : bool operator==(const MonotonisedCentral& /*lhs*/,
127 : const MonotonisedCentral& /*rhs*/);
128 :
129 0 : bool operator!=(const MonotonisedCentral& lhs, const MonotonisedCentral& rhs);
130 :
131 : } // namespace ForceFree::fd
|