34 constexpr double eps = 100 * std::numeric_limits<double>::epsilon();
35 std::vector<std::array<double, 2>> triangle_points;
36 std::vector<double> thickness_points;
38 auto same = [
eps](
const double a,
const double b) {
39 return std::abs(
a - b) <=
eps;
41 auto has_triangle_point = [&](
const double ksi,
const double eta) {
43 triangle_points.begin(), triangle_points.end(),
45 return same(p[0], ksi) && same(p[1], eta);
46 }) != triangle_points.end();
48 auto has_thickness_point = [&](
const double zeta) {
49 return std::find_if(thickness_points.begin(), thickness_points.end(),
50 [&](
const double z) { return same(z, zeta); }) !=
51 thickness_points.end();
54 const auto reference_points = this->gaussPts;
55 const auto original_map = this->mapGaussPts;
56 for (
size_t gg = 0; gg != reference_points.size2(); ++gg) {
57 const double ksi = reference_points(0, gg);
58 const double eta = reference_points(1, gg);
59 const double zeta = reference_points(2, gg);
60 if (!has_triangle_point(ksi,
eta))
61 triangle_points.push_back({ksi,
eta});
62 if (!has_thickness_point(
zeta))
63 thickness_points.push_back(
zeta);
66 const size_t expected_points =
67 triangle_points.size() * thickness_points.size();
68 if (expected_points != reference_points.size2())
70 "Reference prism points do not form a Cartesian product");
72 this->gaussPtsTrianglesOnly.resize(3, triangle_points.size(),
false);
73 this->gaussPtsTrianglesOnly.clear();
74 for (
size_t tt = 0; tt != triangle_points.size(); ++tt) {
75 this->gaussPtsTrianglesOnly(0, tt) = triangle_points[tt][0];
76 this->gaussPtsTrianglesOnly(1, tt) = triangle_points[tt][1];
79 this->gaussPtsThroughThickness.resize(2, thickness_points.size(),
false);
80 this->gaussPtsThroughThickness.clear();
81 for (
size_t zz = 0; zz != thickness_points.size(); ++zz)
82 this->gaussPtsThroughThickness(0, zz) = thickness_points[zz];
84 this->mapGaussPts.clear();
85 this->mapGaussPts.reserve(expected_points);
86 for (
const auto &p : triangle_points) {
87 for (
const double zeta : thickness_points) {
89 for (; gg != reference_points.size2(); ++gg) {
90 if (same(reference_points(0, gg), p[0]) &&
91 same(reference_points(1, gg), p[1]) &&
92 same(reference_points(2, gg),
zeta))
95 if (gg == reference_points.size2())
97 "Could not map a fat-prism post-processing point");
98 this->mapGaussPts.push_back(original_map[gg]);