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