13 #include "DataStructures/DataVector.hpp"
16 #include "Evolution/BoundaryConditions/Type.hpp"
17 #include "Evolution/Systems/NewtonianEuler/BoundaryConditions/BoundaryCondition.hpp"
18 #include "Evolution/Systems/NewtonianEuler/ConservativeFromPrimitive.hpp"
19 #include "Evolution/Systems/NewtonianEuler/Fluxes.hpp"
20 #include "Evolution/Systems/NewtonianEuler/Tags.hpp"
23 #include "PointwiseFunctions/AnalyticData/Tags.hpp"
24 #include "PointwiseFunctions/AnalyticSolutions/AnalyticSolution.hpp"
25 #include "Time/Tags.hpp"
31 template <
size_t Dim,
typename Frame>
44 using options = tmpl::list<>;
46 "DirichletAnalytic boundary conditions using either analytic solution or "
48 static std::string name() noexcept {
return "DirichletAnalytic"; }
59 WRAPPED_PUPable_decl_base_template(
65 static constexpr evolution::BoundaryConditions::Type bc_type =
66 evolution::BoundaryConditions::Type::Ghost;
68 void pup(PUP::er& p)
override;
70 using dg_interior_evolved_variables_tags = tmpl::list<>;
71 using dg_interior_temporary_tags =
72 tmpl::list<domain::Tags::Coordinates<Dim, Frame::Inertial>>;
73 using dg_interior_primitive_variables_tags = tmpl::list<>;
74 using dg_gridless_tags =
75 tmpl::list<::Tags::Time, ::Tags::AnalyticSolutionOrData>;
77 template <
typename AnalyticSolutionOrData>
80 const gsl::not_null<tnsr::I<DataVector, Dim, Frame::Inertial>*>
84 const gsl::not_null<tnsr::I<DataVector, Dim, Frame::Inertial>*>
86 const gsl::not_null<tnsr::IJ<DataVector, Dim, Frame::Inertial>*>
87 flux_momentum_density,
88 const gsl::not_null<tnsr::I<DataVector, Dim, Frame::Inertial>*>
91 const gsl::not_null<tnsr::I<DataVector, Dim, Frame::Inertial>*> velocity,
95 tnsr::I<DataVector, Dim, Frame::Inertial>>& ,
96 const tnsr::i<DataVector, Dim, Frame::Inertial>& ,
97 const tnsr::I<DataVector, Dim, Frame::Inertial>& coords,
99 const AnalyticSolutionOrData& analytic_solution_or_data)
const noexcept {
100 auto boundary_values = [&analytic_solution_or_data, &coords,
102 if constexpr (std::is_base_of_v<MarkAsAnalyticSolution,
103 AnalyticSolutionOrData>) {
104 return analytic_solution_or_data.variables(
113 return analytic_solution_or_data.variables(
121 *mass_density = get<Tags::MassDensity<DataVector>>(boundary_values);
122 *velocity = get<Tags::Velocity<DataVector, Dim>>(boundary_values);
123 *specific_internal_energy =
124 get<Tags::SpecificInternalEnergy<DataVector>>(boundary_values);
127 energy_density, *mass_density,
128 *velocity, *specific_internal_energy);
130 flux_energy_density, *momentum_density,
131 *energy_density, *velocity,