Line data Source code
1 0 : // Distributed under the MIT License.
2 : // See LICENSE.txt for details.
3 :
4 : #pragma once
5 :
6 : #include <array>
7 : #include <cstddef>
8 : #include <memory>
9 : #include <random>
10 : #include <string>
11 : #include <unordered_map>
12 :
13 : #include "DataStructures/DataBox/DataBox.hpp"
14 : #include "DataStructures/DataVector.hpp"
15 : #include "DataStructures/Tensor/Tensor.hpp"
16 : #include "Domain/ElementMap.hpp"
17 : #include "Domain/FunctionsOfTime/FunctionOfTime.hpp"
18 : #include "Domain/FunctionsOfTime/Tags.hpp"
19 : #include "Domain/Tags.hpp"
20 : #include "Domain/TagsTimeDependent.hpp"
21 : #include "Evolution/DgSubcell/ActiveGrid.hpp"
22 : #include "Evolution/DgSubcell/Tags/ActiveGrid.hpp"
23 : #include "Evolution/DgSubcell/Tags/Coordinates.hpp"
24 : #include "Evolution/DgSubcell/Tags/Mesh.hpp"
25 : #include "Evolution/Initialization/Tags.hpp"
26 : #include "Evolution/Systems/GeneralizedHarmonic/GaugeSourceFunctions/Gauges.hpp"
27 : #include "Evolution/Systems/GeneralizedHarmonic/GaugeSourceFunctions/SetPiAndPhiFromConstraints.hpp"
28 : #include "Evolution/Systems/GeneralizedHarmonic/GaugeSourceFunctions/Tags/GaugeCondition.hpp"
29 : #include "Evolution/Systems/GeneralizedHarmonic/Tags.hpp"
30 : #include "Utilities/TMPL.hpp"
31 :
32 : /// \cond
33 : namespace Tags {
34 : struct Time;
35 : } // namespace Tags
36 : /// \endcond
37 :
38 : namespace grmhd::GhValenciaDivClean {
39 : /*!
40 : * \brief Set \f$\Pi_{ab}\f$ from the gauge source function.
41 : *
42 : * This is necessary to ensure the initial data is in the desired evolution
43 : * gauge.
44 : */
45 1 : struct SetPiAndPhiFromConstraints {
46 : public:
47 0 : using return_tags =
48 : tmpl::list<gh::Tags::Pi<DataVector, 3>, gh::Tags::Phi<DataVector, 3>>;
49 0 : using argument_tags = tmpl::list<
50 : ::Tags::Time, domain::Tags::Mesh<3>,
51 : evolution::dg::subcell::Tags::Mesh<3>,
52 : domain::Tags::ElementMap<3, Frame::Grid>,
53 : domain::CoordinateMaps::Tags::CoordinateMap<3, Frame::Grid,
54 : Frame::Inertial>,
55 : domain::Tags::FunctionsOfTime,
56 : domain::Tags::Coordinates<3, Frame::ElementLogical>,
57 : evolution::dg::subcell::Tags::Coordinates<3, Frame::ElementLogical>,
58 : gr::Tags::SpacetimeMetric<DataVector, 3>,
59 : gh::gauges::Tags::GaugeCondition,
60 : evolution::dg::subcell::Tags::ActiveGrid>;
61 :
62 0 : using const_global_cache_tags = tmpl::list<gh::gauges::Tags::GaugeCondition>;
63 :
64 0 : static void apply(
65 : const gsl::not_null<tnsr::aa<DataVector, 3, Frame::Inertial>*> pi,
66 : const gsl::not_null<tnsr::iaa<DataVector, 3, Frame::Inertial>*> phi,
67 : const double initial_time, const Mesh<3>& dg_mesh,
68 : const Mesh<3>& subcell_mesh,
69 : const ElementMap<3, Frame::Grid>& logical_to_grid_map,
70 : const domain::CoordinateMapBase<Frame::Grid, Frame::Inertial, 3>&
71 : grid_to_inertial_map,
72 : const std::unordered_map<
73 : std::string,
74 : std::unique_ptr<domain::FunctionsOfTime::FunctionOfTime>>&
75 : functions_of_time,
76 : const tnsr::I<DataVector, 3, Frame::ElementLogical>&
77 : dg_logical_coordinates,
78 : const tnsr::I<DataVector, 3, Frame::ElementLogical>&
79 : subcell_logical_coordinates,
80 : const tnsr::aa<DataVector, 3, Frame::Inertial>& spacetime_metric,
81 : const gh::gauges::GaugeCondition& gauge_condition,
82 : const evolution::dg::subcell::ActiveGrid active_grid) {
83 : if (active_grid == evolution::dg::subcell::ActiveGrid::Dg) {
84 : gh::gauges::SetPiAndPhiFromConstraints<3>::apply(
85 : pi, phi, initial_time, dg_mesh, logical_to_grid_map,
86 : grid_to_inertial_map, functions_of_time, dg_logical_coordinates,
87 : spacetime_metric, gauge_condition);
88 : } else {
89 : gh::gauges::SetPiAndPhiFromConstraints<3>::apply(
90 : pi, phi, initial_time, subcell_mesh, logical_to_grid_map,
91 : grid_to_inertial_map, functions_of_time, subcell_logical_coordinates,
92 : spacetime_metric, gauge_condition);
93 : }
94 : }
95 : };
96 : } // namespace grmhd::GhValenciaDivClean
|