195 ParallelComm *pcomm =
198 MOFEM_LOG(
"EP", Sev::inform) <<
"get_two_sides_of_crack_surface";
200 if (!pcomm->rank()) {
202 auto impl = [&](
auto &saids) {
207 auto get_adj = [&](
auto e,
auto dim) {
210 e, dim,
true, adj, moab::Interface::UNION),
215 auto get_conn = [&](
auto e) {
222 constexpr
bool debug =
false;
226 auto body_skin =
get_skin(m_field, body_ents);
227 auto body_skin_edges = get_adj(body_skin, 1);
230 subtract(
get_skin(m_field, crack_faces), body_skin_edges);
231 auto crack_skin_conn = get_conn(crack_skin);
232 auto crack_skin_conn_edges = get_adj(crack_skin_conn, 1);
233 auto crack_edges = get_adj(crack_faces, 1);
234 crack_edges = subtract(crack_edges, crack_skin);
235 auto all_tets = get_adj(crack_edges, 3);
236 crack_edges = subtract(crack_edges, crack_skin_conn_edges);
237 auto crack_conn = get_conn(crack_edges);
238 all_tets.merge(get_adj(crack_conn, 3));
247 if (crack_faces.size()) {
248 auto grow = [&](
auto r) {
249 auto crack_faces_conn = get_conn(crack_faces);
252 while (size_r !=
r.size() &&
r.size() > 0) {
254 CHKERR moab.get_connectivity(
r,
v,
true);
255 v = subtract(
v, crack_faces_conn);
258 moab::Interface::UNION);
259 r = intersect(
r, all_tets);
268 Range all_tets_ord = all_tets;
269 while (all_tets.size()) {
270 Range faces = get_adj(unite(saids.first, saids.second), 2);
271 faces = subtract(crack_faces, faces);
274 auto fit = faces.begin();
275 for (;fit != faces.end(); ++fit) {
276 tets = intersect(get_adj(
Range(*fit, *fit), 3), all_tets);
277 if (tets.size() == 2) {
284 saids.first.insert(tets[0]);
285 saids.first = grow(saids.first);
286 all_tets = subtract(all_tets, saids.first);
287 if (tets.size() == 2) {
288 saids.second.insert(tets[1]);
289 saids.second = grow(saids.second);
290 all_tets = subtract(all_tets, saids.second);
298 saids.first = subtract(all_tets_ord, saids.second);
299 saids.second = subtract(all_tets_ord, saids.first);
306 std::pair<Range, Range> saids;
307 if (crack_faces.size())
312 MOFEM_LOG(
"EP", Sev::inform) <<
"get_two_sides_of_crack_surface <- done";
314 return std::pair<Range, Range>();