26 {
27
30 if (verb == -1)
31 verb = verbose;
33 for (DofEntity_multiIndex::iterator dit = dofsField.begin();
34 dit != dofsField.end();) {
35 if (!dit->get()->getActive()) {
36 dit = dofsField.erase(dit);
37 } else {
38 ++dit;
39 }
40 }
42}
43
45 const BitRefLevel mask,
46 int verb) {
48 if (verb == -1)
49 verb = verbose;
51 CHKERR BitRefManager(*this).getEntitiesByRefLevel(
bit, mask, ents, verb);
52 CHKERR clear_dofs_fields(ents, verb);
54}
55
58 if (verb == -1)
59 verb = verbose;
60
61 for (Range::const_pair_iterator p_eit = ents.pair_begin();
62 p_eit != ents.pair_end(); p_eit++) {
65
66 DofEntityByEnt::iterator dit, hi_dit;
67 dit = dofsField.get<Ent_mi_tag>().lower_bound(first);
68 if (dit == dofsField.get<Ent_mi_tag>().end())
69 continue;
70 hi_dit = dofsField.get<Ent_mi_tag>().upper_bound(second);
71
72 dofsField.get<Ent_mi_tag>().erase(dit, hi_dit);
73 }
75}
76
78 int verb) {
80 if (verb == -1)
81 verb = verbose;
82
83 const auto bit_number = get_field_bit_number(name);
84
85 for (Range::const_pair_iterator p_eit = ents.pair_begin();
86 p_eit != ents.pair_end(); p_eit++) {
87 const auto first = p_eit->first;
88 const auto second = p_eit->second;
89 const auto lo_uid = DofEntity::getLoFieldEntityUId(bit_number, first);
90 const auto hi_uid = DofEntity::getHiFieldEntityUId(bit_number, second);
91 auto dit = dofsField.get<Unique_mi_tag>().lower_bound(lo_uid);
92 auto hi_dit = dofsField.get<Unique_mi_tag>().upper_bound(hi_uid);
93 dofsField.get<Unique_mi_tag>().erase(dit, hi_dit);
94 }
96}
97
99 const BitRefLevel mask,
100 int verb) {
102 if (verb == -1)
103 verb = verbose;
105 CHKERR BitRefManager(*this).getEntitiesByRefLevel(
bit, mask, ents, verb);
106 CHKERR clear_dofs_fields(ents, verb);
107 CHKERR clear_adjacencies_entities(ents, verb);
108 CHKERR clear_ents_fields(ents, verb);
110}
111
114 if (verb == -1)
115 verb = verbose;
116 CHKERR clear_dofs_fields(ents, verb);
117 CHKERR clear_adjacencies_entities(ents, verb);
118 for (Range::const_pair_iterator p_eit = ents.pair_begin();
119 p_eit != ents.pair_end(); p_eit++) {
122 FieldEntity_multiIndex::index<Ent_mi_tag>::type::iterator dit, hi_dit;
123 dit = entsFields.get<Ent_mi_tag>().lower_bound(first);
124 hi_dit = entsFields.get<Ent_mi_tag>().upper_bound(second);
125 entsFields.get<Ent_mi_tag>().erase(dit, hi_dit);
126 }
128}
129
131 int verb) {
133 if (verb == -1)
134 verb = verbose;
135 const auto bit_number = get_field_bit_number(name);
136 CHKERR clear_dofs_fields(name, ents, verb);
137 CHKERR clear_adjacencies_entities(name, ents, verb);
138 for (Range::const_pair_iterator p_eit = ents.pair_begin();
139 p_eit != ents.pair_end(); p_eit++) {
140 const auto first = p_eit->first;
141 const auto second = p_eit->second;
142 auto dit = entsFields.get<Unique_mi_tag>().lower_bound(
143 FieldEntity::getLocalUniqueIdCalculate(bit_number, first));
144 auto hi_dit = entsFields.get<Unique_mi_tag>().upper_bound(
145 FieldEntity::getLocalUniqueIdCalculate(bit_number, second));
146 entsFields.get<Unique_mi_tag>().erase(dit, hi_dit);
147 }
149}
150
151MoFEMErrorCode Core::remove_ents_from_field(
const std::string name,
153 const EntityType type, int verb) {
155 if (verb == -1)
156 verb = verbose;
158 CHKERR get_moab().get_entities_by_type(meshset, type, ents);
159 CHKERR remove_ents_from_field(name, ents, verb);
161}
162
163MoFEMErrorCode Core::remove_ents_from_field(
const std::string name,
164 const Range ents,
int verb) {
166 if (verb == -1)
167 verb = verbose;
169 meshset = get_field_meshset(name);
170 CHKERR clear_ents_fields(name, ents, verb);
171 CHKERR get_moab().remove_entities(meshset, ents);
173}
174
177 if (verb == -1)
178 verb = verbose;
179 CHKERR clear_ents_fields(ents, verb);
180 for (Field_multiIndex::iterator fit = fIelds.begin(); fit != fIelds.end();
181 fit++) {
183 CHKERR get_moab().remove_entities(meshset, ents);
184 }
186}
187
189 const BitRefLevel mask,
190 int verb) {
192 if (verb == -1)
193 verb = verbose;
195 CHKERR BitRefManager(*this).getEntitiesByRefLevel(
bit, mask, ents, verb);
196 CHKERR remove_ents_from_field(ents, verb);
198}
199
201 const BitRefLevel mask,
202 int verb) {
204 if (verb == -1)
205 verb = verbose;
207 CHKERR BitRefManager(*this).getEntitiesByRefLevel(
bit, mask, ents, verb);
208 CHKERR clear_adjacencies_entities(ents, verb);
210}
211
214 if (verb == -1)
215 verb = verbose;
216 for (Range::const_pair_iterator p_eit = ents.pair_begin();
217 p_eit != ents.pair_end(); ++p_eit) {
220 FieldEntityEntFiniteElementAdjacencyMap_multiIndex::index<
221 Ent_mi_tag>::type::iterator ait,
222 hi_ait;
223 ait = entFEAdjacencies.get<Ent_mi_tag>().lower_bound(first);
224 hi_ait = entFEAdjacencies.get<Ent_mi_tag>().upper_bound(second);
225 entFEAdjacencies.get<Ent_mi_tag>().erase(ait, hi_ait);
226 }
228}
229
230MoFEMErrorCode Core::clear_adjacencies_entities(
const std::string name,
231 const Range ents,
int verb) {
233 if (verb == -1)
234 verb = verbose;
235
236 const Field *field_ptr = get_field_structure(name);
237 int field_bit_number = field_ptr->getBitNumber();
238
239 for (Range::const_pair_iterator p_eit = ents.pair_begin();
240 p_eit != ents.pair_end(); p_eit++) {
241
242
245
246
248 FieldEntity::getLocalUniqueIdCalculate(field_bit_number, first);
250 FieldEntity::getLocalUniqueIdCalculate(field_bit_number, second);
251
252
253 auto ait = entFEAdjacencies.get<Unique_mi_tag>().lower_bound(first_uid);
254 auto hi_ait = entFEAdjacencies.get<Unique_mi_tag>().upper_bound(second_uid);
255 entFEAdjacencies.get<Unique_mi_tag>().erase(ait, hi_ait);
256 }
258}
259
261 const BitRefLevel mask,
262 int verb) {
264 if (verb == -1)
265 verb = verbose;
267 CHKERR BitRefManager(*this).getEntitiesByRefLevel(
bit, mask, ents, verb);
268 CHKERR clear_finite_elements(ents, verb);
270}
271
274 if (verb == -1)
275 verb = verbose;
276 CHKERR clear_adjacencies_finite_elements(ents, verb);
277 for (Range::const_pair_iterator p_eit = ents.pair_begin();
278 p_eit != ents.pair_end(); p_eit++) {
281 EntFiniteElement_multiIndex::index<Ent_mi_tag>::type::iterator fit, hi_fit;
282 fit = entsFiniteElements.get<Ent_mi_tag>().lower_bound(first);
283 hi_fit = entsFiniteElements.get<Ent_mi_tag>().upper_bound(second);
284 entsFiniteElements.get<Ent_mi_tag>().erase(fit, hi_fit);
285 }
287}
288
289MoFEMErrorCode Core::clear_finite_elements(
const std::string &fe_name,
290 const Range &ents,
int verb) {
292 if (verb == -1)
293 verb = verbose;
294 CHKERR clear_adjacencies_finite_elements(fe_name, ents, verb);
295 auto fe_miit = finiteElements.get<FiniteElement_name_mi_tag>().find(fe_name);
296 if (fe_miit == finiteElements.get<FiniteElement_name_mi_tag>().end()) {
297 for (Range::const_pair_iterator p_eit = ents.pair_begin();
298 p_eit != ents.pair_end(); p_eit++) {
299 auto fit = entsFiniteElements.get<Unique_mi_tag>().lower_bound(
300 EntFiniteElement::getLocalUniqueIdCalculate(p_eit->first,
301 (*fe_miit)->getFEUId()));
302 auto hi_fit = entsFiniteElements.get<Unique_mi_tag>().upper_bound(
303 EntFiniteElement::getLocalUniqueIdCalculate(p_eit->second,
304 (*fe_miit)->getFEUId()));
305 fit = entsFiniteElements.get<Unique_mi_tag>().erase(fit, hi_fit);
306 }
307 }
309}
310
312 const BitRefLevel mask,
313 int verb) {
316 CHKERR BitRefManager(*this).getEntitiesByRefLevel(
bit, mask, ents, verb);
317 CHKERR clear_adjacencies_finite_elements(ents, verb);
319}
320
322 int verb) {
324 if (verb == -1)
325 verb = verbose;
326 for (Range::const_pair_iterator p_eit = ents.pair_begin();
327 p_eit != ents.pair_end(); p_eit++) {
330 FieldEntityEntFiniteElementAdjacencyMap_multiIndex::index<
331 FEEnt_mi_tag>::type::iterator ait,
332 hi_ait;
333 ait = entFEAdjacencies.get<FEEnt_mi_tag>().lower_bound(first);
334 hi_ait = entFEAdjacencies.get<FEEnt_mi_tag>().upper_bound(second);
335 entFEAdjacencies.get<FEEnt_mi_tag>().erase(ait, hi_ait);
336 }
338}
339
340MoFEMErrorCode Core::clear_adjacencies_finite_elements(
const std::string name,
342 int verb) {
344 if (verb == -1)
345 verb = verbose;
346
347 FiniteElement_multiIndex::index<FiniteElement_name_mi_tag>::type::iterator
348 it_fe = finiteElements.get<FiniteElement_name_mi_tag>().find(name);
349 if (it_fe != finiteElements.get<FiniteElement_name_mi_tag>().end()) {
350
351 const auto fe_uid = (*it_fe)->getFEUId();
352
353 for (Range::const_pair_iterator p_eit = ents.pair_begin();
354 p_eit != ents.pair_end(); p_eit++) {
355
356
359
360
362 EntFiniteElement::getLocalUniqueIdCalculate(first, fe_uid);
364 EntFiniteElement::getLocalUniqueIdCalculate(second, fe_uid);
365
366
367 FieldEntityEntFiniteElementAdjacencyMap_multiIndex::index<
368 FE_Unique_mi_tag>::type::iterator ait,
369 hi_ait;
370 ait = entFEAdjacencies.get<FE_Unique_mi_tag>().lower_bound(first_uid);
371 hi_ait = entFEAdjacencies.get<FE_Unique_mi_tag>().upper_bound(second_uid);
372 entFEAdjacencies.get<FE_Unique_mi_tag>().erase(ait, hi_ait);
373 }
374 }
376}
377
378MoFEMErrorCode Core::remove_ents_from_finite_element(
const std::string name,
380 const EntityType type,
381 int verb) {
383 if (verb == -1)
384 verb = verbose;
386 CHKERR get_moab().get_entities_by_type(meshset, type, ents,
false);
387 CHKERR remove_ents_from_finite_element(name, ents, verb);
389}
390
391MoFEMErrorCode Core::remove_ents_from_finite_element(
const std::string name,
393 int verb) {
395 if (verb == -1)
396 verb = verbose;
397 CHKERR clear_finite_elements(name, ents, verb);
398 const EntityHandle idm = get_finite_element_meshset(name);
399 CHKERR get_moab().remove_entities(idm, ents);
401}
402
404 int verb) {
406 if (verb == -1)
407 verb = verbose;
408 CHKERR clear_finite_elements(ents, verb);
409 for (FiniteElement_multiIndex::iterator fe_it = finiteElements.begin();
410 fe_it != finiteElements.end(); fe_it++) {
412 CHKERR get_moab().remove_entities(meshset, ents);
413 }
415}
416
418 const BitRefLevel
bit,
const BitRefLevel mask,
int verb) {
420 if (verb == -1)
421 verb = verbose;
423 CHKERR BitRefManager(*this).getEntitiesByRefLevel(
bit, mask, ents, verb);
424 CHKERR remove_ents_from_finite_element(ents, verb);
426}
427
430 if (verb == -1)
431 verb = verbose;
432 CHKERR remove_ents_from_finite_element(ents, verb);
433 CHKERR remove_ents_from_field(ents, verb);
434
435 for (Range::const_pair_iterator p_eit = ents.pair_begin();
436 p_eit != ents.pair_end(); ++p_eit) {
437
438 RefElement_multiIndex::index<Ent_mi_tag>::type::iterator frit, hi_frit;
439 frit = refinedFiniteElements.get<Ent_mi_tag>().lower_bound(p_eit->first);
440 hi_frit =
441 refinedFiniteElements.get<Ent_mi_tag>().upper_bound(p_eit->second);
442 refinedFiniteElements.get<Ent_mi_tag>().erase(frit, hi_frit);
443
444 RefEntity_multiIndex::index<Ent_mi_tag>::type::iterator rit, hi_rit;
445 rit = refinedEntities.get<Ent_mi_tag>().lower_bound(p_eit->first);
446 hi_rit = refinedEntities.get<Ent_mi_tag>().upper_bound(p_eit->second);
447 refinedEntities.get<Ent_mi_tag>().erase(rit, hi_rit);
448 }
449
451}
452
454 const BitRefLevel mask, int verb) {
456 if (verb == -1)
457 verb = verbose;
459 CHKERR BitRefManager(*this).getEntitiesByRefLevel(
bit, mask, ents, verb);
460 CHKERR remove_ents(ents, verb);
462}
463
465 const BitRefLevel mask,
466 int verb) {
468 if (verb == -1)
469 verb = verbose;
471 CHKERR BitRefManager(*this).getEntitiesByRefLevel(
bit, mask, ents, verb);
472 CHKERR remove_parents_by_ents(ents, verb);
474}
475
478
479 std::vector<EntityHandle> leftovers_ents;
480 leftovers_ents.reserve(ents.size());
481
482 for (auto pit = ents.pair_begin(); pit != ents.pair_end(); ++pit) {
483
486 auto lo = refinedEntities.lower_bound(f);
487 for (;
f <= s; ++
f) {
488
489 auto check = [
this](
auto lo,
auto f) {
490 if (lo == refinedEntities.end())
491 return false;
492 if ((*lo)->getEnt() ==
f)
493 return true;
494 return false;
495 };
496
497 if (check(lo, f)) {
498 bool success = refinedEntities.modify(lo, RefEntity_change_parent(0));
499 if (!success)
501 "Operation of removing parent unsuccessful");
502 ++lo;
503 } else
504 leftovers_ents.emplace_back(f);
505 }
506 }
507
508 if (!leftovers_ents.empty()) {
509 std::vector<EntityHandle> zero_parents(leftovers_ents.size());
510 CHKERR get_moab().tag_set_data(th_RefParentHandle, &leftovers_ents[0],
511 leftovers_ents.size(),
512 &*zero_parents.begin());
513 }
515}
516
519 for (Range::iterator eit = ents.begin(); eit != ents.end(); ++eit) {
520 RefEntity_multiIndex::index<Ent_Ent_mi_tag>::type::iterator it;
521 while ((it = refinedEntities.get<Ent_Ent_mi_tag>().find(*eit)) !=
522 refinedEntities.get<Ent_Ent_mi_tag>().end()) {
523 bool success = refinedEntities.get<Ent_Ent_mi_tag>().modify(
524 it, RefEntity_change_parent(0));
525 if (!success) {
527 "Operation of removing parent unsuccessful");
528 }
529 }
530 }
532}
533
535 const BitRefLevel mask,
536 const bool remove_parent, int verb,
539 if (verb == -1)
540 verb = verbose;
541
543 CHKERR BitRefManager(*this).getEntitiesByRefLevel(
bit, mask, ents, verb);
544 Range ents_meshsets = ents.subset_by_type(MBENTITYSET);
545 ents = subtract(ents, ents_meshsets);
546 if(ents.empty()) {
548 MOFEM_LOG(
"WORLD", Sev::verbose) <<
"Nb. of deleted entities 0";
550 }
551
553 MOFEM_LOG(
"WORLD", Sev::noisy) <<
"Deleted ents:\n" << ents;
554
555 CHKERR remove_ents(ents, verb);
556
557
558 if (remove_parent) {
559 CHKERR remove_parents_by_parents(ents);
560 }
561
563 CHKERR get_moab().get_entities_by_type(0, MBENTITYSET, meshsets,
true);
564 for (
auto m : meshsets) {
565 CHKERR get_moab().remove_entities(
m, ents);
566
567 }
568
569 rval = get_moab().delete_entities(ents);
570 if (rval != MB_SUCCESS) {
573 MOFEM_LOG(
"SELF", Sev::noisy) <<
"Problem deleting:\n" << ents;
574 } else {
575 MOFEM_LOG(
"SELF", Sev::warning) <<
"Problem deleting:\n" << ents;
576 }
581 } else {
582 rval = MB_SUCCESS;
583 }
584 }
585
586 MOFEM_LOG_C(
"SELF", Sev::noisy,
"Nb. of deleted entities %d", ents.size());
587
589}
590
591MoFEMErrorCode Core::delete_finite_element(
const std::string name,
int verb) {
593 auto &fe = finiteElements.get<FiniteElement_name_mi_tag>();
594 auto mit = fe.find(name);
595 if (mit == fe.end()) {
597 "Finite element <%s> not found", name.c_str());
598 }
601 CHKERR get_moab().get_entities_by_handle(meshset, ents,
false);
602 CHKERR remove_ents_from_finite_element(name, ents, verb);
603 fe.erase(mit);
604 CHKERR get_moab().delete_entities(&meshset, 1);
606}
607
608MoFEMErrorCode Core::delete_field(
const std::string name,
int verb) {
610 auto &
f = fIelds.get<FieldName_mi_tag>();
611 auto mit =
f.find(name);
612 if (mit ==
f.end()) {
614 "Finite element <%s> not found", name.c_str());
615 }
618 CHKERR get_moab().get_entities_by_handle(meshset, ents,
false);
619 CHKERR remove_ents_from_field(name, ents, verb);
620 CHKERR get_moab().tag_delete((*mit)->th_FieldDataVerts);
621 CHKERR get_moab().tag_delete((*mit)->th_FieldData);
622 CHKERR get_moab().tag_delete((*mit)->th_AppOrder);
624 CHKERR get_moab().delete_entities(&meshset, 1);
626}
627}
#define DeleteCoreFunctionBegin
#define MOFEM_LOG_C(channel, severity, format,...)
MoFEMTypes
Those types control how functions respond on arguments, f.e. error handling.
#define MoFEMFunctionReturnHot(a)
Last executable line of each PETSc function used for error handling. Replaces return()
#define CHK_MOAB_THROW(err, msg)
Check error code of MoAB function and throw MoFEM exception.
@ MOFEM_OPERATION_UNSUCCESSFUL
#define MoFEMFunctionReturn(a)
Last executable line of each PETSc function used for error handling. Replaces return()
#define CHKERR
Inline error check.
#define MoFEMFunctionBeginHot
First executable line of each MoFEM function, used for error handling. Final line of MoFEM functions ...
#define MOFEM_LOG(channel, severity)
Log.
#define MOFEM_LOG_TAG(channel, tag)
Tag channel.
#define MOFEM_LOG_CHANNEL(channel)
Set and reset channel.
#define MOFEM_LOG_ATTRIBUTES(channel, bit)
Add attributes to channel.
PetscErrorCode MoFEMErrorCode
MoFEM/PETSc error code.
FTensor::Index< 'm', 3 > m