260 {
261
262 ParallelComm *pcomm =
264
265 MOFEM_LOG(
"EP", Sev::noisy) <<
"get_two_sides_of_crack_surface";
266
267 if (!pcomm->rank()) {
268
269 auto impl = [&](auto &saids) {
271
273
274 auto get_adj = [&](auto e, auto dim) {
277 e, dim, true, adj, moab::Interface::UNION),
278 "get adj");
279 return adj;
280 };
281
282 auto get_conn = [&](auto e) {
285 "get connectivity");
286 return conn;
287 };
288
289 constexpr bool debug =
false;
292 body_ents);
293 auto body_skin =
get_skin(m_field, body_ents);
294 auto body_skin_edges = get_adj(body_skin, 1);
295
296 auto crack_skin =
297 subtract(
get_skin(m_field, crack_faces), body_skin_edges);
298 auto crack_skin_conn = get_conn(crack_skin);
299 auto crack_skin_conn_edges = get_adj(crack_skin_conn, 1);
300 auto crack_edges = get_adj(crack_faces, 1);
301 crack_edges = subtract(crack_edges, crack_skin);
302 auto all_tets = get_adj(crack_edges, 3);
303 crack_edges = subtract(crack_edges, crack_skin_conn_edges);
304 auto crack_conn = get_conn(crack_edges);
305 all_tets.merge(get_adj(crack_conn, 3));
306
311 crack_edges);
312 }
313
314 if (crack_faces.size()) {
315 auto grow = [&](
auto r) {
316 auto crack_faces_conn = get_conn(crack_faces);
318 auto size_r = 0;
319 while (size_r !=
r.size() &&
r.size() > 0) {
321 CHKERR moab.get_connectivity(r,
v,
true);
322 v = subtract(
v, crack_faces_conn);
325 moab::Interface::UNION);
326 r = intersect(r, all_tets);
327 }
329 break;
330 }
331 }
333 };
334
335 Range all_tets_ord = all_tets;
336 while (all_tets.size()) {
337 Range faces = get_adj(unite(saids.first, saids.second), 2);
338 faces = subtract(crack_faces, faces);
339 if (faces.size()) {
341 auto fit = faces.begin();
342 for (; fit != faces.end(); ++fit) {
343 tets = intersect(get_adj(
Range(*fit, *fit), 3), all_tets);
344 if (tets.size() == 2) {
345 break;
346 }
347 }
348 if (tets.empty()) {
349 break;
350 } else {
351 saids.first.insert(tets[0]);
352 saids.first = grow(saids.first);
353 all_tets = subtract(all_tets, saids.first);
354 if (tets.size() == 2) {
355 saids.second.insert(tets[1]);
356 saids.second = grow(saids.second);
357 all_tets = subtract(all_tets, saids.second);
358 }
359 }
360 } else {
361 break;
362 }
363 }
364
365 saids.first = subtract(all_tets_ord, saids.second);
366 saids.second = subtract(all_tets_ord, saids.first);
367 }
368
370 };
371
372 std::pair<Range, Range> saids;
373 if (crack_faces.size())
375 return saids;
376 }
377
378 MOFEM_LOG(
"EP", Sev::noisy) <<
"get_two_sides_of_crack_surface <- done";
379
380 return std::pair<Range, Range>();
381}
#define CHK_THROW_MESSAGE(err, msg)
Check and throw MoFEM exception.
#define MoFEMFunctionBegin
First executable line of each MoFEM function, used for error handling. Final line of MoFEM functions ...
#define MoFEMFunctionReturn(a)
Last executable line of each PETSc function used for error handling. Replaces return()
#define MOFEM_LOG(channel, severity)
Log.
const double v
phase velocity of light in medium (cm/ns)