Line data Source code
1 0 : // Distributed under the MIT License. 2 : // See LICENSE.txt for details. 3 : 4 : #pragma once 5 : 6 : #include <pup.h> 7 : #include <string> 8 : 9 : #include "DataStructures/DataVector.hpp" 10 : #include "DataStructures/Tensor/Tensor.hpp" 11 : #include "Domain/CoordinateMaps/CoordinateMap.hpp" 12 : #include "Domain/CoordinateMaps/Tags.hpp" 13 : #include "Domain/ElementMap.hpp" 14 : #include "Domain/FunctionsOfTime/FunctionOfTime.hpp" 15 : #include "Domain/FunctionsOfTime/Tags.hpp" 16 : #include "Domain/Structure/Direction.hpp" 17 : #include "Domain/Tags.hpp" 18 : #include "Evolution/BoundaryConditions/Type.hpp" 19 : #include "Evolution/DgSubcell/GhostZoneLogicalCoordinates.hpp" 20 : #include "Evolution/DgSubcell/Tags/Coordinates.hpp" 21 : #include "Evolution/DgSubcell/Tags/Mesh.hpp" 22 : #include "Evolution/Systems/Ccz4/BoundaryConditions/BoundaryCondition.hpp" 23 : #include "Evolution/Systems/Ccz4/FiniteDifference/Tags.hpp" 24 : #include "Evolution/Systems/Ccz4/Tags.hpp" 25 : #include "Evolution/TypeTraits.hpp" 26 : #include "Options/String.hpp" 27 : #include "PointwiseFunctions/AnalyticSolutions/AnalyticSolution.hpp" 28 : #include "PointwiseFunctions/InitialDataUtilities/InitialData.hpp" 29 : #include "Utilities/Gsl.hpp" 30 : #include "Utilities/Serialization/CharmPupable.hpp" 31 : #include "Utilities/TMPL.hpp" 32 : 33 : /// \cond 34 : namespace Tags { 35 : struct Time; 36 : } // namespace Tags 37 : /// \endcond 38 : 39 : namespace Ccz4::BoundaryConditions { 40 : /*! 41 : * \brief Sets Dirichlet boundary conditions using the analytic solution or 42 : * analytic data. 43 : */ 44 1 : class DirichletAnalytic final : public BoundaryCondition { 45 : public: 46 : /// \brief What analytic solution/data to prescribe. 47 1 : struct AnalyticPrescription { 48 0 : static constexpr Options::String help = 49 : "What analytic solution/data to prescribe."; 50 0 : using type = std::unique_ptr<evolution::initial_data::InitialData>; 51 : }; 52 0 : using options = tmpl::list<AnalyticPrescription>; 53 0 : static constexpr Options::String help{ 54 : "DirichletAnalytic boundary conditions using either analytic solution or " 55 : "analytic data."}; 56 : 57 0 : DirichletAnalytic() = default; 58 0 : DirichletAnalytic(DirichletAnalytic&&) = default; 59 0 : DirichletAnalytic& operator=(DirichletAnalytic&&) = default; 60 0 : DirichletAnalytic(const DirichletAnalytic&); 61 0 : DirichletAnalytic& operator=(const DirichletAnalytic&); 62 0 : ~DirichletAnalytic() override = default; 63 : 64 0 : explicit DirichletAnalytic(CkMigrateMessage* msg); 65 : 66 0 : explicit DirichletAnalytic( 67 : std::unique_ptr<evolution::initial_data::InitialData> 68 : analytic_prescription); 69 : 70 0 : WRAPPED_PUPable_decl_base_template( 71 : domain::BoundaryConditions::BoundaryCondition, DirichletAnalytic); 72 : 73 0 : auto get_clone() const 74 : -> std::unique_ptr< 75 : domain::BoundaryConditions::BoundaryCondition> override; 76 : 77 0 : static constexpr evolution::BoundaryConditions::Type bc_type = 78 : evolution::BoundaryConditions::Type::Ghost; 79 : 80 0 : void pup(PUP::er& p) override; 81 : 82 0 : using fd_interior_evolved_variables_tags = tmpl::list<>; 83 0 : using fd_interior_temporary_tags = 84 : tmpl::list<evolution::dg::subcell::Tags::Mesh<3>>; 85 0 : using fd_interior_primitive_variables_tags = tmpl::list<>; 86 0 : using fd_gridless_tags = 87 : tmpl::list<::Tags::Time, ::domain::Tags::FunctionsOfTime, 88 : domain::Tags::ElementMap<3, Frame::Grid>, 89 : domain::CoordinateMaps::Tags::CoordinateMap<3, Frame::Grid, 90 : Frame::Inertial>, 91 : ::Ccz4::fd::Tags::Reconstructor>; 92 0 : void fd_ghost( 93 : gsl::not_null<tnsr::ii<DataVector, 3, Frame::Inertial>*> 94 : conformal_metric, 95 : gsl::not_null<Scalar<DataVector>*> lapse, 96 : gsl::not_null<tnsr::I<DataVector, 3, Frame::Inertial>*> shift, 97 : gsl::not_null<Scalar<DataVector>*> conformal_factor, 98 : gsl::not_null<tnsr::ii<DataVector, 3, Frame::Inertial>*> a_tilde, 99 : gsl::not_null<Scalar<DataVector>*> trace_extrinsic_curvature, 100 : gsl::not_null<Scalar<DataVector>*> theta, 101 : gsl::not_null<tnsr::I<DataVector, 3, Frame::Inertial>*> gamma_hat, 102 : gsl::not_null<tnsr::I<DataVector, 3, Frame::Inertial>*> 103 : auxiliary_shift_b, 104 : const Direction<3>& direction, 105 : 106 : // fd_interior_temporary_tags 107 : const Mesh<3>& subcell_mesh, 108 : 109 : // fd_gridless_tags 110 : double time, 111 : const std::unordered_map< 112 : std::string, 113 : std::unique_ptr<::domain::FunctionsOfTime::FunctionOfTime>>& 114 : functions_of_time, 115 : const ElementMap<3, Frame::Grid>& logical_to_grid_map, 116 : const domain::CoordinateMapBase<Frame::Grid, Frame::Inertial, 3>& 117 : grid_to_inertial_map, 118 : const fd::Reconstructor& reconstructor) const; 119 : 120 : private: 121 0 : std::unique_ptr<evolution::initial_data::InitialData> analytic_prescription_; 122 : }; 123 : } // namespace Ccz4::BoundaryConditions