39 Eigen::Vector3d
const& c,
40 Eigen::Vector3d
const& e)
48 if (((v.rowwise().minCoeff() - e).array() > 0).any() ||
49 ((v.rowwise().maxCoeff() + e).array() < 0).any())
55 std::array<Eigen::Vector3d, 3> tri_edge{
56 {v.col(1) - v.col(0), v.col(2) - v.col(1), v.col(0) - v.col(2)}};
57 std::array<Eigen::Vector3d, 9>
const axx{
58 {Eigen::Vector3d({0, -tri_edge[0].z(), tri_edge[0].y()}),
59 Eigen::Vector3d({0, -tri_edge[1].z(), tri_edge[1].y()}),
60 Eigen::Vector3d({0, -tri_edge[2].z(), tri_edge[2].y()}),
61 Eigen::Vector3d({tri_edge[0].z(), 0, -tri_edge[0].x()}),
62 Eigen::Vector3d({tri_edge[1].z(), 0, -tri_edge[1].x()}),
63 Eigen::Vector3d({tri_edge[2].z(), 0, -tri_edge[2].x()}),
64 Eigen::Vector3d({-tri_edge[0].y(), tri_edge[0].x(), 0}),
65 Eigen::Vector3d({-tri_edge[1].y(), tri_edge[1].x(), 0}),
66 Eigen::Vector3d({-tri_edge[2].y(), tri_edge[2].x(), 0})}};
71 for (
auto const& a : axx)
73 Eigen::Vector3d p = v.transpose() * a;
74 double const r = e.dot(a.cwiseAbs());
75 if (std::max(-p.maxCoeff(), p.minCoeff()) > r)
82 Eigen::Vector3d
const plane_normal(tri_edge[0].cross(tri_edge[1]));
83 double const pd = plane_normal.dot(v.row(0));
88 int const fault_id, Eigen::Vector3d
const& half_cell_size)
93 auto const& fnodes = fault.
getNodes();
95 GeoLib::AABB const fault_aabb(fnodes.cbegin(), fnodes.cend());
99 min_pnt -= half_cell_size;
100 max_pnt += half_cell_size;
102 std::array<Eigen::Vector3d, 2>
const fault_extent{{min_pnt, max_pnt}};
103 GeoLib::AABB const fault_aabb_ext(fault_extent.cbegin(),
104 fault_extent.cend());
107 Eigen::Vector3d
const extent{half_cell_size};
108 for (std::size_t j = 0; j < n_elems; ++j)
118 auto const& c(centre_pnt.asEigenVector3d());
119 for (
auto const*
const fault_elem : felems)
121 if (fault_elem->getDimension() != 2)
127 *fault_elem->getNode(0), *fault_elem->getNode(1),
128 *fault_elem->getNode(2), c, extent))
130 (*mat_ids)[j] = fault_id;
137 *fault_elem->getNode(0), *fault_elem->getNode(2),
138 *fault_elem->getNode(3), c, extent))
140 (*mat_ids)[j] = fault_id;