Line data Source code
1 0 : // Distributed under the MIT License. 2 : // See LICENSE.txt for details. 3 : 4 : #pragma once 5 : 6 : #include <cstddef> 7 : #include <memory> 8 : #include <optional> 9 : #include <pup.h> 10 : #include <string> 11 : 12 : #include "DataStructures/Tensor/TypeAliases.hpp" 13 : #include "Domain/BoundaryConditions/BoundaryCondition.hpp" 14 : #include "Evolution/BoundaryConditions/Type.hpp" 15 : #include "Evolution/Systems/NewtonianEuler/BoundaryConditions/BoundaryCondition.hpp" 16 : #include "Evolution/Systems/NewtonianEuler/Tags.hpp" 17 : #include "Options/String.hpp" 18 : #include "PointwiseFunctions/Hydro/Tags.hpp" 19 : #include "Utilities/TMPL.hpp" 20 : 21 : /// \cond 22 : class DataVector; 23 : namespace EquationsOfState { 24 : template <bool IsRelativistic, size_t ThermodynamicDim> 25 : class EquationOfState; 26 : } // namespace EquationsOfState 27 : namespace gsl { 28 : template <class T> 29 : class not_null; 30 : } // namespace gsl 31 : /// \endcond 32 : 33 : namespace NewtonianEuler::BoundaryConditions { 34 : /*! 35 : * \brief A boundary condition that only verifies that all characteristic speeds 36 : * are directed out of the domain; no boundary data is altered by this boundary 37 : * condition. 38 : */ 39 : template <size_t Dim> 40 1 : class DemandOutgoingCharSpeeds final : public BoundaryCondition<Dim> { 41 : public: 42 0 : using options = tmpl::list<>; 43 0 : static constexpr Options::String help{ 44 : "A boundary condition that only verifies the characteristic speeds are " 45 : "all directed out of the domain."}; 46 : 47 0 : DemandOutgoingCharSpeeds() = default; 48 0 : DemandOutgoingCharSpeeds(DemandOutgoingCharSpeeds&&) = default; 49 0 : DemandOutgoingCharSpeeds& operator=(DemandOutgoingCharSpeeds&&) = default; 50 0 : DemandOutgoingCharSpeeds(const DemandOutgoingCharSpeeds&) = default; 51 0 : DemandOutgoingCharSpeeds& operator=(const DemandOutgoingCharSpeeds&) = 52 : default; 53 0 : ~DemandOutgoingCharSpeeds() override = default; 54 : 55 0 : explicit DemandOutgoingCharSpeeds(CkMigrateMessage* msg); 56 : 57 0 : WRAPPED_PUPable_decl_base_template( 58 : domain::BoundaryConditions::BoundaryCondition, DemandOutgoingCharSpeeds); 59 : 60 0 : auto get_clone() const -> std::unique_ptr< 61 : domain::BoundaryConditions::BoundaryCondition> override; 62 : 63 0 : static constexpr evolution::BoundaryConditions::Type bc_type = 64 : evolution::BoundaryConditions::Type::DemandOutgoingCharSpeeds; 65 : 66 0 : void pup(PUP::er& p) override; 67 : 68 0 : using dg_interior_evolved_variables_tags = tmpl::list<>; 69 0 : using dg_interior_temporary_tags = tmpl::list<>; 70 0 : using dg_interior_primitive_variables_tags = 71 : tmpl::list<hydro::Tags::RestMassDensity<DataVector>, 72 : hydro::Tags::SpatialVelocity<DataVector, Dim, Frame::Inertial>, 73 : hydro::Tags::SpecificInternalEnergy<DataVector>>; 74 0 : using dg_gridless_tags = tmpl::list<hydro::Tags::EquationOfState<false, 2>>; 75 : 76 : template <size_t ThermodynamicDim> 77 0 : static std::optional<std::string> dg_demand_outgoing_char_speeds( 78 : const std::optional<tnsr::I<DataVector, Dim, Frame::Inertial>>& 79 : face_mesh_velocity, 80 : const tnsr::i<DataVector, Dim, Frame::Inertial>& 81 : outward_directed_normal_covector, 82 : 83 : const Scalar<DataVector>& mass_density, 84 : const tnsr::I<DataVector, Dim, Frame::Inertial>& velocity, 85 : const Scalar<DataVector>& specific_internal_energy, 86 : const EquationsOfState::EquationOfState<false, ThermodynamicDim>& 87 : equation_of_state); 88 : }; 89 : } // namespace NewtonianEuler::BoundaryConditions