Line data Source code
1 0 : // Distributed under the MIT License.
2 : // See LICENSE.txt for details.
3 :
4 : #pragma once
5 :
6 : #include <array>
7 : #include <cstddef>
8 :
9 : /// \cond
10 : class DataVector;
11 : template <size_t>
12 : class Direction;
13 : template <size_t>
14 : class Element;
15 : template <size_t>
16 : class Mesh;
17 : /// \endcond
18 :
19 : namespace Limiters::Weno_detail {
20 :
21 : // Check that an element has just one neighbor in a particular direction, and
22 : // that this neighbor has the same refinement level as the element.
23 : template <size_t VolumeDim>
24 : bool check_element_has_one_similar_neighbor_in_direction(
25 : const Element<VolumeDim>& element, const Direction<VolumeDim>& direction);
26 :
27 : // Compute the coordinate positions of a neighbor element's grid points in the
28 : // logical coordinates of the local element.
29 : //
30 : // However, the results are organized to match the expected input of a
31 : // RegularGridInterpolator constructor:
32 : // - The coordinates are given as an array of 1D coordinate values.
33 : // - For any dimension where the local and neighbor meshes share the same 1D
34 : // submesh, the array is empty. (This tells the RegularGridInterpolator that
35 : // no interpolation needs to be done in this dimension.)
36 : //
37 : // Limitations:
38 : // - No support for h-refinement. It is ASSERT'ed that the element has only one
39 : // neighbor in the specified direction, and that this neighbor is of the same
40 : // refinement level as the local element.
41 : // - Assumes a uniform rectilinear grid. No support for elements of different
42 : // sizes (as could occur if all elements have the same refinement level but
43 : // different blocks have different physical size), or curvilinear elements.
44 : // This is not checked.
45 : template <size_t VolumeDim>
46 : std::array<DataVector, VolumeDim> neighbor_grid_points_in_local_logical_coords(
47 : const Mesh<VolumeDim>& local_mesh, const Mesh<VolumeDim>& neighbor_mesh,
48 : const Element<VolumeDim>& element,
49 : const Direction<VolumeDim>& direction_to_neighbor);
50 :
51 : // Compute the coordinate positions of the local element's grid points in the
52 : // logical coordinates of the a neighbor element.
53 : //
54 : // See documentation of `neighbor_grid_points_in_local_logical_coords` for
55 : // further details and limitations.
56 : template <size_t VolumeDim>
57 : std::array<DataVector, VolumeDim> local_grid_points_in_neighbor_logical_coords(
58 : const Mesh<VolumeDim>& local_mesh, const Mesh<VolumeDim>& neighbor_mesh,
59 : const Element<VolumeDim>& element,
60 : const Direction<VolumeDim>& direction_to_neighbor);
61 :
62 : } // namespace Limiters::Weno_detail
|