10 #include "DataStructures/SliceIterator.hpp"
30 template <std::
size_t VolumeDim,
typename TagsList>
32 const Variables<TagsList>& vars,
34 const size_t sliced_dim,
const size_t fixed_index) noexcept {
35 const size_t interface_grid_points =
36 element_extents.slice_away(sliced_dim).product();
37 const size_t volume_grid_points = vars.number_of_grid_points();
38 constexpr
const size_t number_of_independent_components =
39 Variables<TagsList>::number_of_independent_components;
41 if (interface_vars->number_of_grid_points() != interface_grid_points) {
42 *interface_vars = Variables<TagsList>(interface_grid_points);
44 using value_type =
typename Variables<TagsList>::value_type;
45 const value_type* vars_data = vars.data();
46 value_type* interface_vars_data = interface_vars->data();
47 for (
SliceIterator si(element_extents, sliced_dim, fixed_index); si; ++si) {
48 for (
size_t i = 0; i < number_of_independent_components; ++i) {
50 interface_vars_data[si.slice_offset() +
51 i * interface_grid_points] =
52 vars_data[si.volume_offset() + i * volume_grid_points];
57 template <std::
size_t VolumeDim,
typename TagsList>
58 Variables<TagsList>
data_on_slice(
const Variables<TagsList>& vars,
60 const size_t sliced_dim,
61 const size_t fixed_index) noexcept {
62 Variables<TagsList> interface_vars(
63 element_extents.slice_away(sliced_dim).product());
65 sliced_dim, fixed_index);
66 return interface_vars;
81 template <
std::size_t VolumeDim,
typename... VolumeTags,
typename... SliceTags>
83 const gsl::not_null<Variables<tmpl::list<VolumeTags...>>*> volume_vars,
84 const Variables<tmpl::list<SliceTags...>>& vars_on_slice,
86 const size_t fixed_index) noexcept {
91 (std::is_same_v<typename VolumeTags::type, typename SliceTags::type> and
93 "Tensor types do not match.");
94 constexpr
const size_t number_of_independent_components =
95 Variables<tmpl::list<VolumeTags...>>::number_of_independent_components;
96 const size_t volume_grid_points = extents.product();
97 const size_t slice_grid_points = extents.slice_away(sliced_dim).product();
98 ASSERT(volume_vars->number_of_grid_points() == volume_grid_points,
99 "volume_vars has wrong number of grid points. Expected "
100 << volume_grid_points <<
", got "
101 << volume_vars->number_of_grid_points());
102 ASSERT(vars_on_slice.number_of_grid_points() == slice_grid_points,
103 "vars_on_slice has wrong number of grid points. Expected "
104 << slice_grid_points <<
", got "
105 << vars_on_slice.number_of_grid_points());
106 using value_type =
typename Variables<tmpl::list<VolumeTags...>>::value_type;
107 value_type*
const volume_data = volume_vars->data();
108 const value_type*
const slice_data = vars_on_slice.data();
109 for (
SliceIterator si(extents, sliced_dim, fixed_index); si; ++si) {
110 for (
size_t i = 0; i < number_of_independent_components; ++i) {
112 volume_data[si.volume_offset() + i * volume_grid_points] +=
113 slice_data[si.slice_offset() + i * slice_grid_points];