6 #include <boost/functional/hash.hpp>
11 #include "DataStructures/DataVector.hpp"
12 #include "DataStructures/FixedHashMap.hpp"
18 #include "Domain/Structure/MaxNumberOfNeighbors.hpp"
19 #include "Utilities/ContainerHelpers.hpp"
31 template <
size_t Dim,
typename ValueType>
34 boost::hash<OverlapId<Dim>>>;
69 size_t overlap_extent(
size_t volume_extent,
size_t max_overlap) noexcept;
83 size_t overlap_dimension) noexcept;
109 template <
size_t Dim>
113 explicit operator bool()
const noexcept;
123 void reset() noexcept;
138 template <
size_t Dim,
typename DataType,
typename... TensorStructure>
141 const Tensor<DataType, TensorStructure...>& tensor,
147 overlap_iterator; ++overlap_iterator) {
148 for (
size_t tensor_component = 0; tensor_component < tensor.size();
149 ++tensor_component) {
150 (*restricted_tensor)[tensor_component][overlap_iterator
152 tensor[tensor_component][overlap_iterator.volume_offset()];
157 template <
size_t Dim,
typename DataType,
typename... TensorStructure>
159 const Tensor<DataType, TensorStructure...>& tensor,
166 return restricted_tensor;
170 template <
size_t Dim>
171 void data_on_overlap_impl(
double* overlap_data,
const double* volume_data,
172 size_t num_components,
178 template <
size_t Dim,
typename OverlapTagsList,
typename VolumeTagsList>
180 const gsl::not_null<Variables<OverlapTagsList>*> overlap_data,
181 const Variables<VolumeTagsList>& volume_data,
184 constexpr
size_t num_components =
185 Variables<VolumeTagsList>::number_of_independent_components;
186 ASSERT(volume_data.number_of_grid_points() == volume_extents.product(),
187 "volume_data has wrong number of grid points. Expected "
188 << volume_extents.product() <<
", got "
189 << volume_data.number_of_grid_points());
190 ASSERT(overlap_data->number_of_grid_points() ==
192 direction.dimension()),
193 "overlap_data has wrong number of grid points. Expected "
195 direction.dimension())
196 <<
", got " << overlap_data->number_of_grid_points());
197 detail::data_on_overlap_impl(overlap_data->data(), volume_data.data(),
202 template <
size_t Dim,
typename TagsList>
203 Variables<TagsList>
data_on_overlap(
const Variables<TagsList>& volume_data,
216 template <
size_t Dim>
217 void add_overlap_data_impl(
double* volume_data,
const double* overlap_data,
218 size_t num_components,
225 template <
size_t Dim,
typename VolumeTagsList,
typename OverlapTagsList>
228 const Variables<OverlapTagsList>& overlap_data,
231 constexpr
size_t num_components =
232 Variables<VolumeTagsList>::number_of_independent_components;
233 ASSERT(volume_data->number_of_grid_points() == volume_extents.product(),
234 "volume_data has wrong number of grid points. Expected "
235 << volume_extents.product() <<
", got "
236 << volume_data->number_of_grid_points());
237 ASSERT(overlap_data.number_of_grid_points() ==
239 direction.dimension()),
240 "overlap_data has wrong number of grid points. Expected "
242 direction.dimension())
243 <<
", got " << overlap_data.number_of_grid_points());
244 detail::add_overlap_data_impl(volume_data->data(), overlap_data.data(),
252 template <
size_t Dim,
typename ExtendedTagsList,
typename OverlapTagsList>
254 const gsl::not_null<Variables<ExtendedTagsList>*> extended_data,
255 const Variables<OverlapTagsList>& overlap_data,
258 *extended_data = Variables<ExtendedTagsList>{volume_extents.product(), 0.};
263 template <
size_t Dim,
typename TagsList>
265 const Variables<TagsList>& overlap_data,
const Index<Dim>& volume_extents,
267 Variables<TagsList> extended_data{volume_extents.product()};
270 return extended_data;