Line data Source code
1 0 : // Distributed under the MIT License. 2 : // See LICENSE.txt for details. 3 : 4 : #pragma once 5 : 6 : #include <cstddef> 7 : #include <optional> 8 : #include <unordered_set> 9 : #include <utility> 10 : 11 : #include "DataStructures/DataVector.hpp" 12 : #include "DataStructures/Variables.hpp" 13 : #include "Domain/Structure/Direction.hpp" 14 : #include "Domain/Structure/DirectionalId.hpp" 15 : #include "Domain/Structure/DirectionalIdMap.hpp" 16 : #include "Domain/Structure/ElementId.hpp" 17 : #include "NumericalAlgorithms/Interpolation/IrregularInterpolant.hpp" 18 : #include "Utilities/Gsl.hpp" 19 : 20 : /// \cond 21 : template <size_t Dim> 22 : class Direction; 23 : template <size_t Dim, typename T> 24 : class DirectionMap; 25 : template <size_t Dim> 26 : class Index; 27 : /// \endcond 28 : 29 : namespace evolution::dg::subcell { 30 : namespace detail { 31 : template <size_t Dim> 32 : DirectionMap<Dim, DataVector> slice_data_impl( 33 : const gsl::span<const double>& volume_subcell_vars, 34 : const Index<Dim>& subcell_extents, size_t number_of_ghost_points, 35 : const std::unordered_set<Direction<Dim>>& directions_to_slice, 36 : size_t additional_buffer, 37 : const DirectionalIdMap<Dim, std::optional<intrp::Irregular<Dim>>>& 38 : fd_to_neighbor_fd_interpolants); 39 : } // namespace detail 40 : 41 : /// @{ 42 : /*! 43 : * \brief Slice the subcell variables needed for neighbors to perform 44 : * reconstruction. 45 : * 46 : * Note that we slice to a grid that is against the boundary of the element but 47 : * is several ghost points deep. This is in contrast to the slicing used in the 48 : * DG method which is to the boundary of the element only. 49 : * 50 : * The `number_of_ghost_points` will depend on the number of neighboring points 51 : * the reconstruction method needs that is used on the subcell. The 52 : * `directions_to_slice` determines in which directions data is sliced. 53 : * Generally this will be the directions in which the element has neighbors. 54 : * 55 : * The data always has the same ordering as the volume data (tags have the same 56 : * ordering, grid points are x-varies-fastest). 57 : * 58 : * The `additional_buffer` argument is used to add extra padding to the result 59 : * storage to be used for example for sending the RDMP TCI data. This eliminates 60 : * expensive data copying. 61 : */ 62 : template <size_t Dim> 63 1 : DirectionMap<Dim, DataVector> slice_data( 64 : const DataVector& volume_subcell_vars, const Index<Dim>& subcell_extents, 65 : const size_t number_of_ghost_points, 66 : const std::unordered_set<Direction<Dim>>& directions_to_slice, 67 : const size_t additional_buffer, 68 : const DirectionalIdMap<Dim, std::optional<intrp::Irregular<Dim>>>& 69 : fd_to_neighbor_fd_interpolants) { 70 : return detail::slice_data_impl( 71 : gsl::make_span(volume_subcell_vars.data(), volume_subcell_vars.size()), 72 : subcell_extents, number_of_ghost_points, directions_to_slice, 73 : additional_buffer, fd_to_neighbor_fd_interpolants); 74 : } 75 : 76 : template <size_t Dim, typename TagList> 77 1 : DirectionMap<Dim, DataVector> slice_data( 78 : const Variables<TagList>& volume_subcell_vars, 79 : const Index<Dim>& subcell_extents, const size_t number_of_ghost_points, 80 : const std::unordered_set<Direction<Dim>>& directions_to_slice, 81 : const size_t additional_buffer, 82 : const DirectionalIdMap<Dim, std::optional<intrp::Irregular<Dim>>>& 83 : fd_to_neighbor_fd_interpolants) { 84 : // NOLINTNEXTLINE(cppcoreguidelines-pro-type-const-cast) 85 : const DataVector view{const_cast<double*>(volume_subcell_vars.data()), 86 : volume_subcell_vars.size()}; 87 : return slice_data(view, subcell_extents, number_of_ghost_points, 88 : directions_to_slice, additional_buffer, 89 : fd_to_neighbor_fd_interpolants); 90 : } 91 : /// @} 92 : } // namespace evolution::dg::subcell