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 :
12 : #include "DataStructures/DataBox/Prefixes.hpp"
13 : #include "DataStructures/DataVector.hpp"
14 : #include "DataStructures/Tags/TempTensor.hpp"
15 : #include "DataStructures/Tensor/Tensor.hpp"
16 : #include "DataStructures/Variables.hpp"
17 : #include "Evolution/BoundaryConditions/Type.hpp"
18 : #include "Evolution/Systems/RadiationTransport/M1Grey/BoundaryConditions/BoundaryCondition.hpp"
19 : #include "Evolution/Systems/RadiationTransport/M1Grey/Fluxes.hpp"
20 : #include "Evolution/Systems/RadiationTransport/M1Grey/M1Closure.hpp"
21 : #include "Evolution/Systems/RadiationTransport/M1Grey/Tags.hpp"
22 : #include "Options/String.hpp"
23 : #include "PointwiseFunctions/AnalyticData/Tags.hpp"
24 : #include "PointwiseFunctions/AnalyticSolutions/AnalyticSolution.hpp"
25 : #include "PointwiseFunctions/GeneralRelativity/Tags.hpp"
26 : #include "PointwiseFunctions/Hydro/Tags.hpp"
27 : #include "PointwiseFunctions/InitialDataUtilities/InitialData.hpp"
28 : #include "Utilities/Gsl.hpp"
29 : #include "Utilities/Serialization/CharmPupable.hpp"
30 : #include "Utilities/TMPL.hpp"
31 :
32 : /// \cond
33 : namespace Tags {
34 : struct Time;
35 : } // namespace Tags
36 : namespace domain::Tags {
37 : template <size_t Dim, typename Frame>
38 : struct Coordinates;
39 : } // namespace domain::Tags
40 : /// \endcond
41 :
42 : namespace RadiationTransport::M1Grey::BoundaryConditions {
43 :
44 : /// \cond
45 : template <typename NeutrinoSpeciesList>
46 : class DirichletAnalytic;
47 : /// \endcond
48 :
49 : /*!
50 : * \brief Sets Dirichlet boundary conditions using the analytic solution or
51 : * analytic data.
52 : */
53 : template <typename... NeutrinoSpecies>
54 1 : class DirichletAnalytic<tmpl::list<NeutrinoSpecies...>> final
55 : : public BoundaryCondition<tmpl::list<NeutrinoSpecies...>> {
56 : public:
57 : /// \brief What analytic solution/data to prescribe.
58 1 : struct AnalyticPrescription {
59 0 : static constexpr Options::String help =
60 : "What analytic solution/data to prescribe.";
61 0 : using type = std::unique_ptr<evolution::initial_data::InitialData>;
62 : };
63 :
64 0 : using options = tmpl::list<AnalyticPrescription>;
65 0 : static constexpr Options::String help{
66 : "DirichletAnalytic boundary conditions using either analytic solution or "
67 : "analytic data."};
68 :
69 0 : DirichletAnalytic() = default;
70 0 : DirichletAnalytic(DirichletAnalytic&&) = default;
71 0 : DirichletAnalytic& operator=(DirichletAnalytic&&) = default;
72 0 : DirichletAnalytic(const DirichletAnalytic&);
73 0 : DirichletAnalytic& operator=(const DirichletAnalytic&);
74 0 : ~DirichletAnalytic() override = default;
75 :
76 0 : explicit DirichletAnalytic(CkMigrateMessage* msg)
77 : : BoundaryCondition<tmpl::list<NeutrinoSpecies...>>(msg) {}
78 :
79 0 : explicit DirichletAnalytic(
80 : std::unique_ptr<evolution::initial_data::InitialData>
81 : analytic_prescription);
82 :
83 0 : WRAPPED_PUPable_decl_base_template(
84 : domain::BoundaryConditions::BoundaryCondition, DirichletAnalytic);
85 :
86 0 : auto get_clone() const -> std::unique_ptr<
87 : domain::BoundaryConditions::BoundaryCondition> override {
88 : return std::make_unique<DirichletAnalytic>(*this);
89 : }
90 :
91 0 : static constexpr evolution::BoundaryConditions::Type bc_type =
92 : evolution::BoundaryConditions::Type::Ghost;
93 :
94 0 : void pup(PUP::er& p) override;
95 :
96 0 : using dg_interior_evolved_variables_tags = tmpl::list<>;
97 0 : using dg_interior_temporary_tags =
98 : tmpl::list<domain::Tags::Coordinates<3, Frame::Inertial>>;
99 0 : using dg_interior_primitive_variables_tags = tmpl::list<>;
100 0 : using dg_gridless_tags = tmpl::list<::Tags::Time>;
101 :
102 0 : std::optional<std::string> dg_ghost(
103 : const gsl::not_null<typename Tags::TildeE<
104 : Frame::Inertial, NeutrinoSpecies>::type*>... tilde_e,
105 : const gsl::not_null<typename Tags::TildeS<
106 : Frame::Inertial, NeutrinoSpecies>::type*>... tilde_s,
107 :
108 : const gsl::not_null<typename ::Tags::Flux<
109 : Tags::TildeE<Frame::Inertial, NeutrinoSpecies>, tmpl::size_t<3>,
110 : Frame::Inertial>::type*>... flux_tilde_e,
111 : const gsl::not_null<typename ::Tags::Flux<
112 : Tags::TildeS<Frame::Inertial, NeutrinoSpecies>, tmpl::size_t<3>,
113 : Frame::Inertial>::type*>... flux_tilde_s,
114 :
115 : const gsl::not_null<tnsr::II<DataVector, 3, Frame::Inertial>*>
116 : inv_spatial_metric,
117 :
118 : const std::optional<
119 : tnsr::I<DataVector, 3, Frame::Inertial>>& /*face_mesh_velocity*/,
120 : const tnsr::i<DataVector, 3, Frame::Inertial>& /*normal_covector*/,
121 : const tnsr::I<DataVector, 3, Frame::Inertial>& /*normal_vector*/,
122 : const tnsr::I<DataVector, 3, Frame::Inertial>& coords, double time) const;
123 :
124 : private:
125 0 : std::unique_ptr<evolution::initial_data::InitialData> analytic_prescription_;
126 : };
127 : } // namespace RadiationTransport::M1Grey::BoundaryConditions
|