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