48 Eigen::Vector3d
const& c,
49 Eigen::Vector3d
const& e)
57 if (((v.rowwise().minCoeff() - e).array() > 0).any() ||
58 ((v.rowwise().maxCoeff() + e).array() < 0).any())
64 std::array<Eigen::Vector3d, 3> tri_edge{
65 {v.col(1) - v.col(0), v.col(2) - v.col(1), v.col(0) - v.col(2)}};
66 std::array<Eigen::Vector3d, 9>
const axx{
67 {Eigen::Vector3d({0, -tri_edge[0].z(), tri_edge[0].y()}),
68 Eigen::Vector3d({0, -tri_edge[1].z(), tri_edge[1].y()}),
69 Eigen::Vector3d({0, -tri_edge[2].z(), tri_edge[2].y()}),
70 Eigen::Vector3d({tri_edge[0].z(), 0, -tri_edge[0].x()}),
71 Eigen::Vector3d({tri_edge[1].z(), 0, -tri_edge[1].x()}),
72 Eigen::Vector3d({tri_edge[2].z(), 0, -tri_edge[2].x()}),
73 Eigen::Vector3d({-tri_edge[0].y(), tri_edge[0].x(), 0}),
74 Eigen::Vector3d({-tri_edge[1].y(), tri_edge[1].x(), 0}),
75 Eigen::Vector3d({-tri_edge[2].y(), tri_edge[2].x(), 0})}};
80 for (
auto const& a : axx)
82 Eigen::Vector3d p = v.transpose() * a;
83 double const r = e.dot(a.cwiseAbs());
84 if (std::max(-p.maxCoeff(), p.minCoeff()) > r)
91 Eigen::Vector3d
const plane_normal(tri_edge[0].cross(tri_edge[1]));
92 double const pd = plane_normal.dot(v.row(0));
97 int const fault_id, Eigen::Vector3d
const& half_cell_size)
102 auto const& fnodes = fault.
getNodes();
104 GeoLib::AABB const fault_aabb(fnodes.cbegin(), fnodes.cend());
108 min_pnt -= half_cell_size;
109 max_pnt += half_cell_size;
111 std::array<Eigen::Vector3d, 2>
const fault_extent{{min_pnt, max_pnt}};
112 GeoLib::AABB const fault_aabb_ext(fault_extent.cbegin(),
113 fault_extent.cend());
116 Eigen::Vector3d
const extent{half_cell_size};
117 for (std::size_t j = 0; j < n_elems; ++j)
127 auto const& c(centre_pnt.asEigenVector3d());
128 for (
auto const*
const fault_elem : felems)
130 if (fault_elem->getDimension() != 2)
136 *fault_elem->getNode(0), *fault_elem->getNode(1),
137 *fault_elem->getNode(2), c, extent))
139 (*mat_ids)[j] = fault_id;
146 *fault_elem->getNode(0), *fault_elem->getNode(2),
147 *fault_elem->getNode(3), c, extent))
149 (*mat_ids)[j] = fault_id;