14 #include "PointwiseFunctions/AnalyticData/AnalyticData.hpp"
50 template <
typename ScalarFieldData,
typename BackgroundGrData>
53 ScalarFieldData::volume_dim == BackgroundGrData::volume_dim,
54 "Scalar field data and background spacetime data should have the same "
55 "spatial dimensionality. Currently provided template arguments do not.");
58 static constexpr
size_t volume_dim = ScalarFieldData::volume_dim;
61 using type = ScalarFieldData;
65 using type = BackgroundGrData;
69 using options = tmpl::list<Background, ScalarField>;
71 "A scalar field in curved background spacetime\n\n"};
72 static std::string name() noexcept {
return "ScalarWaveGr"; };
75 ScalarWaveGr(BackgroundGrData background,
76 ScalarFieldData scalar_field) noexcept
77 : flat_space_scalar_wave_data_(std::move(scalar_field)),
78 background_gr_data_(std::move(background)) {}
80 explicit ScalarWaveGr(CkMigrateMessage* ) noexcept {}
82 ScalarWaveGr() =
default;
83 ScalarWaveGr(
const ScalarWaveGr& ) =
delete;
84 ScalarWaveGr& operator=(
const ScalarWaveGr& ) =
delete;
85 ScalarWaveGr(ScalarWaveGr&& ) noexcept = default;
86 ScalarWaveGr& operator=(ScalarWaveGr&& ) noexcept = default;
87 ~ScalarWaveGr() = default;
90 template <typename DataType>
91 using spacetime_tags = typename BackgroundGrData::template tags<DataType>;
92 using tags = tmpl::append<spacetime_tags<
DataVector>,
93 tmpl::list<Pi, Phi<volume_dim>, Psi>>;
97 typename DataType, typename Tag,
98 Requires<tmpl::list_contains_v<spacetime_tags<DataType>, Tag>> =
nullptr>
99 tuples::TaggedTuple<Tag>
variables(const
tnsr::I<DataType, volume_dim>& x,
100 tmpl::list<Tag> ) const noexcept {
101 constexpr
double default_initial_time = 0.;
102 return {std::move(get<Tag>(background_gr_data_.variables(
103 x, default_initial_time, spacetime_tags<DataType>{})))};
108 tmpl::list<Pi> )
const noexcept;
111 const tnsr::I<DataVector, volume_dim>& x,
113 constexpr
double default_initial_time = 0.;
116 x, default_initial_time,
121 tmpl::list<Psi> )
const noexcept {
122 constexpr
double default_initial_time = 0.;
124 std::move(get<ScalarWave::Psi>(flat_space_scalar_wave_data_.variables(
125 x, default_initial_time,
131 template <
typename DataType,
typename... Tags>
133 tmpl::list<Tags...> )
const
135 static_assert(
sizeof...(Tags) > 1,
136 "This generic template will recurse infinitely if only one "
137 "tag is being retrieved through it.");
140 "At least one of the requested tags is not supported.");
142 return {tuples::get<Tags>(
variables(x, tmpl::list<Tags>{}))...};
146 void pup(PUP::er& p) noexcept;
149 template <
typename LocalScalarFieldData,
150 typename LocalBackgroundData>
152 operator==(
const ScalarWaveGr<LocalScalarFieldData,
153 LocalBackgroundData>& lhs,
154 const ScalarWaveGr<LocalScalarFieldData,
155 LocalBackgroundData>& rhs)
158 ScalarFieldData flat_space_scalar_wave_data_;
159 BackgroundGrData background_gr_data_;
162 template <
typename ScalarFieldData,
typename BackgroundData>
164 const ScalarWaveGr<ScalarFieldData, BackgroundData>& lhs,
165 const ScalarWaveGr<ScalarFieldData, BackgroundData>& rhs) noexcept;