Finite Volume Solver  prototype
A framework to build finite volume solvers for the AG Klein at the Freie Universität Berlin.
CutCellData.hpp
Go to the documentation of this file.
1 // Copyright (c) 2019 Maikel Nadolski
2 //
3 // Permission is hereby granted, free of charge, to any person obtaining a copy
4 // of this software and associated documentation files (the "Software"), to deal
5 // in the Software without restriction, including without limitation the rights
6 // to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
7 // copies of the Software, and to permit persons to whom the Software is
8 // furnished to do so, subject to the following conditions:
9 //
10 // The above copyright notice and this permission notice shall be included in
11 // all copies or substantial portions of the Software.
12 //
13 // THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
14 // IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
15 // FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
16 // AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
17 // LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
18 // OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
19 // SOFTWARE.
20 
21 #ifndef FUB_CUTCELL_DATA_HPP
22 #define FUB_CUTCELL_DATA_HPP
23 
24 #include "fub/PatchDataView.hpp"
25 #include "fub/ext/Eigen.hpp"
26 
27 namespace fub {
28 
29 inline std::array<double, 2> Intersect(const std::array<double, 2>& i1,
30  const std::array<double, 2>& i2) {
31  return {std::max(i1[0], i2[0]), std::min(i1[1], i2[1])};
32 }
33 
34 template <int Rank> struct CutCellData {
35  static constexpr auto sRank = static_cast<std::size_t>(Rank);
36 
37  // The next member variables are given by AMReX
40  std::array<PatchDataView<const double, Rank>, sRank> face_fractions;
43  // The following members need to be computed from the AMReX EB database
46  std::array<PatchDataView<const double, Rank>, sRank> unshielded_fractions;
47  std::array<PatchDataView<const double, Rank>, sRank> shielded_left_fractions;
48  std::array<PatchDataView<const double, Rank>, sRank> shielded_right_fractions;
49  std::array<PatchDataView<const double, Rank>, sRank>
51  std::array<PatchDataView<const double, Rank>, sRank> unshielded_fractions_rel;
52  std::array<PatchDataView<const double, Rank>, sRank>
54  std::array<PatchDataView<const double, Rank>, sRank>
56  std::array<PatchDataView<const double, Rank>, sRank>
58 };
59 
60 [[nodiscard]] bool IsCutCell(const CutCellData<2>& geom,
61  const std::array<std::ptrdiff_t, 2>& index);
62 
63 [[nodiscard]] bool IsCutCell(const CutCellData<3>& geom,
64  const std::array<std::ptrdiff_t, 3>& index);
65 
66 [[nodiscard]] Eigen::Vector2d
68  const std::array<std::ptrdiff_t, 2>& index);
69 
70 [[nodiscard]] Eigen::Vector3d
72  const std::array<std::ptrdiff_t, 3>& index);
73 
74 [[nodiscard]] Eigen::Vector2d
76  const std::array<std::ptrdiff_t, 2>& index);
77 
78 [[nodiscard]] Eigen::Vector3d
80  const std::array<std::ptrdiff_t, 3>& index);
81 
82 [[nodiscard]] Eigen::Vector2d
84  const std::array<std::ptrdiff_t, 2>& index);
85 
86 [[nodiscard]] Eigen::Vector3d
88  const std::array<std::ptrdiff_t, 3>& index);
89 
90 [[nodiscard]] Eigen::Vector2d GetUnshieldedCentroid(const CutCellData<2>& geom,
91  const Index<2>& face,
92  const Eigen::Vector2d& dx,
93  Direction dir);
94 
95 template <std::size_t Rank>
96 Eigen::Matrix<double, Rank, 1> GetOffset(const std::array<std::ptrdiff_t, Rank>& index) {
97  static constexpr int iRank = static_cast<int>(Rank);
98  Eigen::Matrix<double, iRank, 1> offset;
99  for (int i = 0; i < iRank; ++i) {
100  offset[i] = static_cast<double>(index[i]);
101  }
102  return offset;
103 }
104 
105 template <int Rank>
106 Eigen::Matrix<double, Rank, 1>
108  const Index<Rank>& index,
109  const Eigen::Matrix<double, Rank, 1>& dx) {
110  const Eigen::Matrix<double, Rank, 1> relative_xM =
111  GetVolumeCentroid(geom, index);
112  const Eigen::Matrix<double, Rank, 1> offset = GetOffset<Rank>(index);
113  const Eigen::Matrix<double, Rank, 1> xM =
114  (offset + relative_xM).array() * dx.array() + 0.5 * dx.array();
115  return xM;
116 }
117 
118 template <int Rank>
119 Eigen::Matrix<double, Rank, 1>
121  const Index<Rank>& index,
122  const Eigen::Matrix<double, Rank, 1>& dx) {
123  const Eigen::Matrix<double, Rank, 1> relative_xB =
124  GetBoundaryCentroid(geom, index);
125  const Eigen::Matrix<double, Rank, 1> offset = GetOffset<Rank>(index);
126  const Eigen::Matrix<double, Rank, 1> xB =
127  (offset + relative_xB).array() * dx.array() + 0.5 * dx.array();
128  return xB;
129 }
130 
131 } // namespace fub
132 
133 #endif
The fub namespace.
Definition: AnyBoundaryCondition.hpp:31
Eigen::Vector2d GetBoundaryNormal(const CutCellData< 2 > &ccdata, const std::array< std::ptrdiff_t, 2 > &index)
Eigen::Vector2d GetUnshieldedCentroid(const CutCellData< 2 > &geom, const Index< 2 > &face, const Eigen::Vector2d &dx, Direction dir)
Eigen::Vector2d GetBoundaryCentroid(const CutCellData< 2 > &ccdata, const std::array< std::ptrdiff_t, 2 > &index)
Eigen::Matrix< double, Rank, 1 > GetAbsoluteBoundaryCentroid(const CutCellData< Rank > &geom, const Index< Rank > &index, const Eigen::Matrix< double, Rank, 1 > &dx)
Definition: CutCellData.hpp:120
Eigen::Matrix< double, Rank, 1 > GetAbsoluteVolumeCentroid(const CutCellData< Rank > &geom, const Index< Rank > &index, const Eigen::Matrix< double, Rank, 1 > &dx)
Definition: CutCellData.hpp:107
bool IsCutCell(const CutCellData< 2 > &geom, const std::array< std::ptrdiff_t, 2 > &index)
Direction
This is a type safe type to denote a dimensional split direction.
Definition: Direction.hpp:30
Eigen::Matrix< double, Rank, 1 > GetOffset(const std::array< std::ptrdiff_t, Rank > &index)
Definition: CutCellData.hpp:96
std::array< std::ptrdiff_t, static_cast< std::size_t >(Rank)> Index
Definition: PatchDataView.hpp:34
std::array< double, 2 > Intersect(const std::array< double, 2 > &i1, const std::array< double, 2 > &i2)
Definition: CutCellData.hpp:29
Eigen::Vector2d GetVolumeCentroid(const CutCellData< 2 > &ccdata, const std::array< std::ptrdiff_t, 2 > &index)
std::ptrdiff_t index
Definition: type_traits.hpp:179
Definition: CutCellData.hpp:34
std::array< PatchDataView< const double, Rank >, sRank > shielded_right_fractions
Definition: CutCellData.hpp:48
std::array< PatchDataView< const double, Rank >, sRank > shielded_right_fractions_rel
Definition: CutCellData.hpp:55
std::array< PatchDataView< const double, Rank >, sRank > unshielded_fractions
Definition: CutCellData.hpp:46
static constexpr auto sRank
Definition: CutCellData.hpp:35
PatchDataView< const double, Rank > volume_fractions
Definition: CutCellData.hpp:38
PatchDataView< const double, Rank+1 > distance_to_boundary_right
Definition: CutCellData.hpp:45
std::array< PatchDataView< const double, Rank >, sRank > shielded_left_fractions
Definition: CutCellData.hpp:47
std::array< PatchDataView< const double, Rank >, sRank > unshielded_fractions_rel
Definition: CutCellData.hpp:51
PatchDataView< const double, Rank+1 > boundary_centeroids
Definition: CutCellData.hpp:42
std::array< PatchDataView< const double, Rank >, sRank > face_fractions
Definition: CutCellData.hpp:40
std::array< PatchDataView< const double, Rank >, sRank > doubly_shielded_fractions_rel
Definition: CutCellData.hpp:57
PatchDataView< const double, Rank+1 > boundary_normals
Definition: CutCellData.hpp:41
PatchDataView< const double, Rank+1 > volume_centeroid
Definition: CutCellData.hpp:39
std::array< PatchDataView< const double, Rank >, sRank > shielded_left_fractions_rel
Definition: CutCellData.hpp:53
std::array< PatchDataView< const double, Rank >, sRank > doubly_shielded_fractions
Definition: CutCellData.hpp:50
PatchDataView< const double, Rank+1 > distance_to_boundary_left
Definition: CutCellData.hpp:44