Line data Source code
1 0 : // Distributed under the MIT License.
2 : // See LICENSE.txt for details.
3 :
4 : #pragma once
5 :
6 : #include <algorithm>
7 : #include <cstddef>
8 : #include <unordered_set>
9 :
10 : #include "DataStructures/DataVector.hpp"
11 : #include "DataStructures/Index.hpp"
12 : #include "DataStructures/Variables.hpp"
13 : #include "Domain/Structure/Direction.hpp"
14 : #include "Domain/Structure/DirectionMap.hpp"
15 : #include "Domain/Structure/DirectionalId.hpp"
16 : #include "Domain/Structure/DirectionalIdMap.hpp"
17 : #include "Evolution/DgSubcell/SliceData.hpp"
18 : #include "Utilities/Gsl.hpp"
19 :
20 : namespace evolution::dg::subcell {
21 : /// @{
22 : /*!
23 : * \brief Slice a Variables object on subcell mesh for a given direction and
24 : * slicing depth (number of ghost points).
25 : */
26 : template <size_t Dim, typename TagList>
27 1 : void slice_variable(
28 : const gsl::not_null<Variables<TagList>*>& sliced_subcell_vars,
29 : const Variables<TagList>& volume_subcell_vars,
30 : const Index<Dim>& subcell_extents, const size_t ghost_zone_size,
31 : const Direction<Dim>& direction,
32 : const DirectionalIdMap<Dim, std::optional<intrp::Irregular<Dim>>>&
33 : fd_to_neighbor_fd_interpolants) {
34 : // check the size of sliced_subcell_vars (output)
35 : const size_t num_sliced_pts =
36 : subcell_extents.slice_away(direction.dimension()).product() *
37 : ghost_zone_size;
38 : if (sliced_subcell_vars->size() != num_sliced_pts) {
39 : sliced_subcell_vars->initialize(num_sliced_pts);
40 : }
41 :
42 : // Slice volume variables. Note that the return type of the
43 : // `slice_data_impl()` function is DataVector.
44 : std::unordered_set directions_to_slice{direction};
45 :
46 : const DataVector sliced_data{detail::slice_data_impl(
47 : gsl::make_span(volume_subcell_vars.data(), volume_subcell_vars.size()),
48 : subcell_extents, ghost_zone_size, directions_to_slice, 0,
49 : fd_to_neighbor_fd_interpolants)[direction]};
50 :
51 : // copy the returned DataVector data into sliced variables
52 : std::copy(sliced_data.begin(), sliced_data.end(),
53 : sliced_subcell_vars->data());
54 : }
55 :
56 : template <size_t Dim, typename TagList>
57 1 : Variables<TagList> slice_variable(
58 : const Variables<TagList>& volume_subcell_vars,
59 : const Index<Dim>& subcell_extents, const size_t ghost_zone_size,
60 : const Direction<Dim>& direction,
61 : const DirectionalIdMap<Dim, std::optional<intrp::Irregular<Dim>>>&
62 : fd_to_neighbor_fd_interpolants) {
63 : Variables<TagList> sliced_subcell_vars{
64 : subcell_extents.slice_away(direction.dimension()).product() *
65 : ghost_zone_size};
66 : slice_variable(make_not_null(&sliced_subcell_vars), volume_subcell_vars,
67 : subcell_extents, ghost_zone_size, direction,
68 : fd_to_neighbor_fd_interpolants);
69 : return sliced_subcell_vars;
70 : }
71 : /// @}
72 : } // namespace evolution::dg::subcell
|