7 #include <boost/functional/hash.hpp>
20 #include "Evolution/DiscontinuousGalerkin/Limiters/WenoGridHelpers.hpp"
21 #include "Evolution/DiscontinuousGalerkin/Limiters/WenoHelpers.hpp"
22 #include "Evolution/DiscontinuousGalerkin/Limiters/WenoOscillationIndicator.hpp"
23 #include "NumericalAlgorithms/Interpolation/RegularGridInterpolant.hpp"
28 namespace Limiters::Weno_detail {
40 template <
typename Tag,
size_t VolumeDim,
typename PackagedData>
41 void simple_weno_impl(
50 modified_neighbor_solution_buffer,
52 const double neighbor_linear_weight,
const size_t tensor_storage_index,
57 neighbor_data) noexcept {
59 modified_neighbor_solution_buffer->size() == neighbor_data.size(),
60 "modified_neighbor_solution_buffer->size() = "
61 << modified_neighbor_solution_buffer->size()
62 <<
"\nneighbor_data.size() = " << neighbor_data.size()
63 <<
"\nmodified_neighbor_solution_buffer was incorrectly initialized "
64 "before calling simple_weno_impl.");
69 DataVector& component_to_limit = (*tensor)[tensor_storage_index];
70 const double local_mean =
mean_value(component_to_limit, mesh);
71 for (
const auto& neighbor_and_data : neighbor_data) {
72 const auto& neighbor = neighbor_and_data.first;
73 const auto&
data = neighbor_and_data.second;
75 if (interpolator_buffer->find(neighbor) == interpolator_buffer->end()) {
77 const auto& direction = neighbor.first;
78 const auto& source_mesh =
data.mesh;
79 const auto target_1d_logical_coords =
80 Weno_detail::local_grid_points_in_neighbor_logical_coords(
81 mesh, source_mesh, element, direction);
82 interpolator_buffer->insert(std::make_pair(
84 target_1d_logical_coords)));
88 DataVector& buffer = modified_neighbor_solution_buffer->at(neighbor);
90 interpolator_buffer->at(neighbor).interpolate(
92 get<Tag>(
data.volume_data)[tensor_storage_index]);
93 const double neighbor_mean =
mean_value(buffer, mesh);
94 buffer += (local_mean - neighbor_mean);
98 Weno_detail::reconstruct_from_weighted_sum(
100 Weno_detail::DerivativeWeight::PowTwoEll, mesh,
101 *modified_neighbor_solution_buffer);
113 template <
typename Tag,
size_t VolumeDim,
typename PackagedData>
114 void simple_weno_impl(
123 modified_neighbor_solution_buffer,
130 neighbor_data) noexcept {
131 for (
size_t tensor_storage_index = 0; tensor_storage_index < tensor->size();
132 ++tensor_storage_index) {
133 simple_weno_impl<Tag>(interpolator_buffer,
134 modified_neighbor_solution_buffer, tensor,
135 neighbor_linear_weight, tensor_storage_index, mesh,
136 element, neighbor_data);