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