11 #include "NumericalAlgorithms/Interpolation/Actions/InterpolationTargetVarsFromElement.hpp"
12 #include "NumericalAlgorithms/Interpolation/IrregularInterpolant.hpp"
13 #include "NumericalAlgorithms/Interpolation/PointInfoTag.hpp"
17 #include "Parallel/Invoke.hpp"
18 #include "ParallelAlgorithms/EventsAndTriggers/Event.hpp"
19 #include "PointwiseFunctions/GeneralRelativity/Tags.hpp"
29 template <
size_t VolumeDim>
34 template <
typename TagsList>
39 template <
size_t VolumeDim>
42 template <
typename Metavariables,
typename Tag>
43 struct InterpolationTarget;
44 namespace Registrars {
45 template <
size_t VolumeDim,
typename InterpolationTargetTag,
46 typename Metavariables,
typename Tensors>
47 struct InterpolateWithoutInterpComponent;
50 template <
size_t VolumeDim,
typename InterpolationTargetTag,
51 typename Metavariables,
typename Tensors,
52 typename EventRegistrars =
53 tmpl::list<Registrars::InterpolateWithoutInterpComponent<
54 VolumeDim, InterpolationTargetTag, Metavariables, Tensors>>>
55 class InterpolateWithoutInterpComponent;
63 namespace Registrars {
64 template <
size_t VolumeDim,
typename InterpolationTargetTag,
65 typename Metavariables,
typename Tensors>
66 struct InterpolateWithoutInterpComponent {
67 template <
typename RegistrarList>
68 using f = Events::InterpolateWithoutInterpComponent<
69 VolumeDim, InterpolationTargetTag, Metavariables, Tensors, RegistrarList>;
77 template <
size_t VolumeDim,
typename InterpolationTargetTag,
78 typename Metavariables,
typename... Tensors,
typename EventRegistrars>
79 class InterpolateWithoutInterpComponent<VolumeDim, InterpolationTargetTag,
80 Metavariables, tmpl::list<Tensors...>,
82 :
public Event<EventRegistrars> {
84 explicit InterpolateWithoutInterpComponent(
85 CkMigrateMessage* ) noexcept {}
86 using PUP::able::register_constructor;
90 using options = tmpl::list<>;
92 "Does interpolation using the given InterpolationTargetTag, "
93 "without an Interpolator ParallelComponent.";
96 return Options::name<InterpolationTargetTag>();
99 InterpolateWithoutInterpComponent() =
default;
101 using argument_tags =
102 tmpl::list<::Tags::TimeStepId, Tags::InterpPointInfo<Metavariables>,
105 template <
typename ParallelComponent>
108 const typename Tags::InterpPointInfo<Metavariables>::type& point_infos,
112 const ParallelComponent*
const )
const noexcept {
114 const auto& block_logical_coords =
115 get<Vars::PointInfoTag<InterpolationTargetTag, VolumeDim>>(point_infos);
117 const auto element_coord_holders =
121 if (element_coord_holders.count(element_ids[0]) == 0) {
130 const auto& element_coord_holder = element_coord_holders.at(element_ids[0]);
133 Variables<typename InterpolationTargetTag::vars_to_interpolate_to_target>
134 interp_vars(mesh.number_of_grid_points());
137 if constexpr (std::is_same_v<tmpl::list<>,
typename InterpolationTargetTag::
138 compute_items_on_source>) {
141 [[maybe_unused]]
const auto copy_to_variables = [&interp_vars](
142 const auto tensor_tag_v,
const auto& tensor) noexcept {
143 using tensor_tag = tmpl::type_from<decltype(tensor_tag_v)>;
144 get<tensor_tag>(interp_vars) = tensor;
147 expand_pack(copy_to_variables(tmpl::type_<Tensors>{}, tensors)...);
153 typename InterpolationTargetTag::compute_items_on_source>>(
157 typename InterpolationTargetTag::vars_to_interpolate_to_target>(
158 [&box, &interp_vars ](
auto tag_v) noexcept {
159 using tag =
typename decltype(tag_v)::type;
160 get<tag>(interp_vars) = db::get<tag>(box);
166 mesh, element_coord_holder.element_logical_coords);
175 typename InterpolationTargetTag::vars_to_interpolate_to_target>>(
181 bool needs_evolved_variables()
const noexcept
override {
return true; }
185 template <
size_t VolumeDim,
typename InterpolationTargetTag,
186 typename Metavariables,
typename... Tensors,
typename EventRegistrars>
187 PUP::able::PUP_ID InterpolateWithoutInterpComponent<
188 VolumeDim, InterpolationTargetTag, Metavariables, tmpl::list<Tensors...>,
189 EventRegistrars>::my_PUP_ID = 0;