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/Tensor/Tensor.hpp" 15 : #include "Evolution/BoundaryConditions/Type.hpp" 16 : #include "Evolution/DgSubcell/Tags/Mesh.hpp" 17 : #include "Evolution/Systems/Burgers/BoundaryConditions/BoundaryCondition.hpp" 18 : #include "Evolution/Systems/Burgers/Tags.hpp" 19 : #include "Options/String.hpp" 20 : #include "Utilities/Gsl.hpp" 21 : #include "Utilities/Serialization/CharmPupable.hpp" 22 : #include "Utilities/TMPL.hpp" 23 : 24 : /// \cond 25 : template <size_t Dim> 26 : class Direction; 27 : template <size_t Dim> 28 : class Mesh; 29 : /// \endcond 30 : 31 : namespace Burgers::BoundaryConditions { 32 : /*! 33 : * \brief A boundary condition that only verifies that all characteristic speeds 34 : * are directed out of the domain; no boundary data is altered by this boundary 35 : * condition. 36 : */ 37 1 : class DemandOutgoingCharSpeeds final : public BoundaryCondition { 38 : public: 39 0 : using options = tmpl::list<>; 40 0 : static constexpr Options::String help{ 41 : "A boundary condition that only verifies the characteristic speeds " 42 : "are all directed out of the domain."}; 43 : 44 0 : DemandOutgoingCharSpeeds() = default; 45 0 : DemandOutgoingCharSpeeds(DemandOutgoingCharSpeeds&&) = default; 46 0 : DemandOutgoingCharSpeeds& operator=(DemandOutgoingCharSpeeds&&) = default; 47 0 : DemandOutgoingCharSpeeds(const DemandOutgoingCharSpeeds&) = default; 48 0 : DemandOutgoingCharSpeeds& operator=(const DemandOutgoingCharSpeeds&) = 49 : default; 50 0 : ~DemandOutgoingCharSpeeds() override = default; 51 : 52 0 : explicit DemandOutgoingCharSpeeds(CkMigrateMessage* msg); 53 : 54 0 : WRAPPED_PUPable_decl_base_template( 55 : domain::BoundaryConditions::BoundaryCondition, DemandOutgoingCharSpeeds); 56 : 57 0 : auto get_clone() const -> std::unique_ptr< 58 : domain::BoundaryConditions::BoundaryCondition> override; 59 : 60 0 : static constexpr evolution::BoundaryConditions::Type bc_type = 61 : evolution::BoundaryConditions::Type::DemandOutgoingCharSpeeds; 62 : 63 0 : void pup(PUP::er& p) override; 64 : 65 0 : using dg_interior_evolved_variables_tags = tmpl::list<Tags::U>; 66 0 : using dg_interior_temporary_tags = tmpl::list<>; 67 0 : using dg_gridless_tags = tmpl::list<>; 68 : 69 0 : static std::optional<std::string> dg_demand_outgoing_char_speeds( 70 : const std::optional<tnsr::I<DataVector, 1, Frame::Inertial>>& 71 : face_mesh_velocity, 72 : const tnsr::i<DataVector, 1, Frame::Inertial>& 73 : outward_directed_normal_covector, 74 : const Scalar<DataVector>& u); 75 : 76 0 : using fd_interior_evolved_variables_tags = tmpl::list<Tags::U>; 77 0 : using fd_interior_temporary_tags = 78 : tmpl::list<evolution::dg::subcell::Tags::Mesh<1>>; 79 0 : using fd_gridless_tags = tmpl::list<>; 80 : 81 0 : static void fd_demand_outgoing_char_speeds( 82 : gsl::not_null<Scalar<DataVector>*> u, const Direction<1>& direction, 83 : const std::optional<tnsr::I<DataVector, 1, Frame::Inertial>>& 84 : face_mesh_velocity, 85 : const tnsr::i<DataVector, 1, Frame::Inertial>& 86 : outward_directed_normal_covector, 87 : const Scalar<DataVector>& u_interior, const Mesh<1>& subcell_mesh); 88 : }; 89 : } // namespace Burgers::BoundaryConditions