Line data Source code
1 0 : // Distributed under the MIT License.
2 : // See LICENSE.txt for details.
3 :
4 : #pragma once
5 :
6 : #include <memory>
7 : #include <optional>
8 : #include <pup.h>
9 : #include <string>
10 : #include <type_traits>
11 : #include <unordered_map>
12 :
13 : #include "DataStructures/DataBox/Prefixes.hpp"
14 : #include "DataStructures/DataVector.hpp"
15 : #include "DataStructures/Tensor/Tensor.hpp"
16 : #include "DataStructures/Variables.hpp"
17 : #include "Domain/CoordinateMaps/CoordinateMap.hpp"
18 : #include "Domain/CoordinateMaps/Tags.hpp"
19 : #include "Domain/ElementMap.hpp"
20 : #include "Domain/FunctionsOfTime/FunctionOfTime.hpp"
21 : #include "Domain/FunctionsOfTime/Tags.hpp"
22 : #include "Domain/Structure/Direction.hpp"
23 : #include "Domain/Structure/DirectionMap.hpp"
24 : #include "Domain/Tags.hpp"
25 : #include "Evolution/BoundaryConditions/Type.hpp"
26 : #include "Evolution/DgSubcell/GhostZoneLogicalCoordinates.hpp"
27 : #include "Evolution/DgSubcell/Tags/Coordinates.hpp"
28 : #include "Evolution/DgSubcell/Tags/Mesh.hpp"
29 : #include "Evolution/Systems/Burgers/BoundaryConditions/BoundaryCondition.hpp"
30 : #include "Evolution/Systems/Burgers/FiniteDifference/Factory.hpp"
31 : #include "Evolution/Systems/Burgers/FiniteDifference/Reconstructor.hpp"
32 : #include "Evolution/Systems/Burgers/FiniteDifference/Tags.hpp"
33 : #include "Evolution/Systems/Burgers/Tags.hpp"
34 : #include "Evolution/TypeTraits.hpp"
35 : #include "NumericalAlgorithms/Spectral/Mesh.hpp"
36 : #include "Options/String.hpp"
37 : #include "PointwiseFunctions/AnalyticData/Tags.hpp"
38 : #include "PointwiseFunctions/AnalyticSolutions/AnalyticSolution.hpp"
39 : #include "PointwiseFunctions/InitialDataUtilities/InitialData.hpp"
40 : #include "Utilities/Gsl.hpp"
41 : #include "Utilities/Serialization/CharmPupable.hpp"
42 : #include "Utilities/TMPL.hpp"
43 :
44 : /// \cond
45 : namespace Tags {
46 : struct Time;
47 : } // namespace Tags
48 : /// \endcond
49 :
50 : namespace Burgers::BoundaryConditions {
51 : /*!
52 : * \brief Sets Dirichlet boundary conditions using the analytic solution or
53 : * analytic data.
54 : */
55 1 : class DirichletAnalytic final : public BoundaryCondition {
56 : private:
57 0 : using flux_tag =
58 : ::Tags::Flux<Burgers::Tags::U, tmpl::size_t<1>, Frame::Inertial>;
59 :
60 : public:
61 : /// \brief What analytic solution/data to prescribe.
62 1 : struct AnalyticPrescription {
63 0 : static constexpr Options::String help =
64 : "What analytic solution/data to prescribe.";
65 0 : using type = std::unique_ptr<evolution::initial_data::InitialData>;
66 : };
67 :
68 0 : using options = tmpl::list<AnalyticPrescription>;
69 0 : static constexpr Options::String help{
70 : "DirichletAnalytic boundary conditions setting the value of U to "
71 : "the analytic solution or analytic data."};
72 :
73 0 : DirichletAnalytic() = default;
74 0 : DirichletAnalytic(DirichletAnalytic&&) = default;
75 0 : DirichletAnalytic& operator=(DirichletAnalytic&&) = default;
76 0 : DirichletAnalytic(const DirichletAnalytic&);
77 0 : DirichletAnalytic& operator=(const DirichletAnalytic&);
78 0 : ~DirichletAnalytic() override = default;
79 :
80 0 : explicit DirichletAnalytic(
81 : std::unique_ptr<evolution::initial_data::InitialData>
82 : analytic_prescription);
83 :
84 0 : explicit DirichletAnalytic(CkMigrateMessage* msg);
85 :
86 0 : WRAPPED_PUPable_decl_base_template(
87 : domain::BoundaryConditions::BoundaryCondition, DirichletAnalytic);
88 :
89 0 : auto get_clone() const -> std::unique_ptr<
90 : domain::BoundaryConditions::BoundaryCondition> override;
91 :
92 0 : static constexpr evolution::BoundaryConditions::Type bc_type =
93 : evolution::BoundaryConditions::Type::Ghost;
94 :
95 0 : void pup(PUP::er& p) override;
96 :
97 0 : using dg_interior_evolved_variables_tags = tmpl::list<>;
98 0 : using dg_interior_temporary_tags =
99 : tmpl::list<domain::Tags::Coordinates<1, Frame::Inertial>>;
100 0 : using dg_gridless_tags = tmpl::list<::Tags::Time>;
101 :
102 0 : std::optional<std::string> dg_ghost(
103 : const gsl::not_null<Scalar<DataVector>*> u,
104 : const gsl::not_null<tnsr::I<DataVector, 1, Frame::Inertial>*> flux_u,
105 : const std::optional<
106 : tnsr::I<DataVector, 1, Frame::Inertial>>& /*face_mesh_velocity*/,
107 : const tnsr::i<DataVector, 1, Frame::Inertial>& /*normal_covector*/,
108 : const tnsr::I<DataVector, 1, Frame::Inertial>& coords,
109 : [[maybe_unused]] const double time) const;
110 :
111 0 : using fd_interior_evolved_variables_tags = tmpl::list<>;
112 0 : using fd_interior_temporary_tags =
113 : tmpl::list<evolution::dg::subcell::Tags::Mesh<1>>;
114 0 : using fd_gridless_tags =
115 : tmpl::list<::Tags::Time, domain::Tags::FunctionsOfTime,
116 : domain::Tags::ElementMap<1, Frame::Grid>,
117 : domain::CoordinateMaps::Tags::CoordinateMap<1, Frame::Grid,
118 : Frame::Inertial>,
119 : fd::Tags::Reconstructor>;
120 :
121 0 : void fd_ghost(const gsl::not_null<Scalar<DataVector>*> u,
122 : const Direction<1>& direction, const Mesh<1> subcell_mesh,
123 : const double time,
124 : const std::unordered_map<
125 : std::string,
126 : std::unique_ptr<domain::FunctionsOfTime::FunctionOfTime>>&
127 : functions_of_time,
128 : const ElementMap<1, Frame::Grid>& logical_to_grid_map,
129 : const domain::CoordinateMapBase<Frame::Grid, Frame::Inertial,
130 : 1>& grid_to_inertial_map,
131 : const fd::Reconstructor& reconstructor) const;
132 :
133 : private:
134 0 : static void flux_impl(
135 : gsl::not_null<tnsr::I<DataVector, 1, Frame::Inertial>*> flux,
136 : const Scalar<DataVector>& u_analytic);
137 :
138 0 : std::unique_ptr<evolution::initial_data::InitialData> analytic_prescription_;
139 : };
140 : } // namespace Burgers::BoundaryConditions
|