7#define FECoreFunctionBegin \
9 MOFEM_LOG_CHANNEL("WORLD"); \
10 MOFEM_LOG_CHANNEL("SYNC"); \
11 MOFEM_LOG_FUNCTION(); \
12 MOFEM_LOG_TAG("WORLD", "FECore"); \
13 MOFEM_LOG_TAG("SYNC", "FECore");
25 std::string(
"finite element < " + name +
26 " > not in database (top tip: check spelling)")
46 *buildMoFEM &= 1 << 0;
54 auto add_meshset_to_partition = [&](
auto meshset) {
56 const void *tag_vals[] = {&rAnk};
57 ParallelComm *pcomm = ParallelComm::get_pcomm(
58 &get_moab(), get_basic_entity_data_ptr()->pcommID);
59 Tag part_tag = pcomm->part_tag();
61 CHKERR get_moab().get_entities_by_type_and_tag(0, MBENTITYSET, &part_tag,
62 tag_vals, 1, tagged_sets,
63 moab::Interface::UNION);
64 for (
auto s : tagged_sets)
65 CHKERR get_moab().add_entities(s, &meshset, 1);
69 auto &finite_element_name_set =
71 auto it_fe = finite_element_name_set.find(fe_name);
74 if (it_fe != finite_element_name_set.end()) {
80 if (it_fe != finite_element_name_set.end())
84 CHKERR get_moab().create_meshset(MESHSET_SET, meshset);
85 CHKERR add_meshset_to_partition(meshset);
94 auto id =
BitFEId().set(fe_shift);
95 CHKERR get_moab().tag_set_data(th_FEId, &meshset, 1, &
id);
98 void const *tag_data[] = {fe_name.c_str()};
100 tag_sizes[0] = fe_name.size();
101 CHKERR get_moab().tag_set_by_ptr(th_FEName, &meshset, 1, tag_data, tag_sizes);
104 auto p = finiteElements.insert(
105 boost::shared_ptr<FiniteElement>(
new FiniteElement(moab, meshset)));
108 "FiniteElement not inserted");
111 MOFEM_LOG(
"WORLD", Sev::inform) <<
"Add finite element " << fe_name;
121 *buildMoFEM &= 1 << 0;
122 typedef FiniteElement_multiIndex::index<FiniteElement_name_mi_tag>::type
123 FiniteElements_by_name;
124 FiniteElements_by_name &finite_element_name_set =
126 FiniteElements_by_name::iterator it_fe =
127 finite_element_name_set.find(fe_name);
128 if (it_fe == finite_element_name_set.end())
130 "This finite element is not defined (advise: check spelling)");
131 boost::shared_ptr<FiniteElement> fe;
133 fe->elementAdjacencyTable[type] = function;
139 const std::string name_data) {
141 *buildMoFEM &= 1 << 0;
142 typedef FiniteElement_multiIndex::index<FiniteElement_name_mi_tag>::type
143 FiniteElements_by_name;
144 FiniteElements_by_name &finite_element_name_set =
146 FiniteElements_by_name::iterator it_fe =
147 finite_element_name_set.find(fe_name);
148 if (it_fe == finite_element_name_set.end())
150 "This finite element is not defined (advise: check spelling)");
151 bool success = finite_element_name_set.modify(
155 "modification unsuccessful");
161 const std::string name_row) {
163 *buildMoFEM &= 1 << 0;
164 typedef FiniteElement_multiIndex::index<FiniteElement_name_mi_tag>::type
165 FiniteElements_by_name;
166 FiniteElements_by_name &finite_element_name_set =
168 FiniteElements_by_name::iterator it_fe =
169 finite_element_name_set.find(fe_name);
170 if (it_fe == finite_element_name_set.end())
173 bool success = finite_element_name_set.modify(
177 "modification unsuccessful");
183 const std::string name_col) {
185 *buildMoFEM &= 1 << 0;
186 typedef FiniteElement_multiIndex::index<FiniteElement_name_mi_tag>::type
187 FiniteElements_by_name;
188 FiniteElements_by_name &finite_element_name_set =
190 FiniteElements_by_name::iterator it_fe =
191 finite_element_name_set.find(fe_name);
192 if (it_fe == finite_element_name_set.end())
194 "this FiniteElement is there");
195 bool success = finite_element_name_set.modify(
199 "modification unsuccessful");
205 const std::string name_data) {
207 *buildMoFEM &= 1 << 0;
208 auto &finite_element_name_set =
210 auto it_fe = finite_element_name_set.find(fe_name);
211 if (it_fe == finite_element_name_set.end())
213 bool success = finite_element_name_set.modify(
217 "modification unsuccessful");
223 const std::string name_row) {
225 *buildMoFEM &= 1 << 0;
226 auto &finite_element_name_set =
228 auto it_fe = finite_element_name_set.find(fe_name);
229 if (it_fe == finite_element_name_set.end())
232 bool success = finite_element_name_set.modify(
236 "modification unsuccessful");
242 const std::string name_col) {
244 *buildMoFEM &= 1 << 0;
245 auto &finite_element_name_set =
247 auto it_fe = finite_element_name_set.find(fe_name);
248 if (it_fe == finite_element_name_set.end())
250 bool success = finite_element_name_set.modify(
254 "modification unsuccessful");
260 auto miit = fe_by_id.find(fe_name);
261 if (miit == fe_by_id.end())
263 (
"finite element < " + fe_name +
" > not found (top tip: check spelling)")
265 return (*miit)->getId();
270 auto miit = fe_by_id.find(
id);
271 if (miit == fe_by_id.end())
273 return (*miit)->getName();
278 auto miit = fe_by_id.find(
id);
279 if (miit == fe_by_id.end())
281 return (*miit)->meshset;
285 return get_finite_element_meshset(getBitFEId(name));
294 EntityHandle meshset = get_finite_element_meshset(name);
295 CHKERR get_moab().get_entities_by_dimension(meshset,
dim, ents,
true);
305 EntityHandle meshset = get_finite_element_meshset(name);
306 CHKERR get_moab().get_entities_by_type(meshset, type, ents,
true);
317 EntityHandle meshset = get_finite_element_meshset(name);
318 CHKERR get_moab().get_entities_by_handle(meshset, ents,
true);
334 const bool recursive) {
335 *buildMoFEM &= 1 << 0;
339 idm = get_finite_element_meshset(getBitFEId(name));
341 CHKERR get_moab().get_entities_by_type(meshset, type, ents, recursive);
342 CHKERR getInterface<BitRefManager>()->setElementsBitRefLevel(ents);
343 CHKERR get_moab().add_entities(idm, ents);
350 const int dim,
const std::string &name,
351 const bool recursive) {
353 *buildMoFEM &= 1 << 0;
355 idm = get_finite_element_meshset(getBitFEId(name));
357 CHKERR get_moab().get_entities_by_dimension(meshset,
dim, ents, recursive);
358 CHKERR getInterface<BitRefManager>()->setElementsBitRefLevel(ents);
359 CHKERR get_moab().add_entities(idm, ents);
366 *buildMoFEM &= 1 << 0;
368 idm = get_finite_element_meshset(getBitFEId(name));
369 CHKERR getInterface<BitRefManager>()->setElementsBitRefLevel(
370 ents.subset_by_type(type));
371 CHKERR get_moab().add_entities(idm, ents.subset_by_type(type));
377 const std::string &name) {
379 *buildMoFEM &= 1 << 0;
381 idm = get_finite_element_meshset(getBitFEId(name));
382 CHKERR getInterface<BitRefManager>()->setElementsBitRefLevel(
383 ents.subset_by_dimension(
dim));
384 CHKERR get_moab().add_entities(idm, ents.subset_by_dimension(
dim));
390 const std::string &name,
403 CHKERR add_ents_to_finite_element_by_bit_ref(
bit, mask, name, type, verb);
415 *buildMoFEM &= 1 << 0;
416 const BitFEId id = getBitFEId(name);
417 const EntityHandle idm = get_finite_element_meshset(
id);
419 auto &ref_MoFEMFiniteElement = refinedFiniteElements.get<
Ent_mi_tag>();
424 for (; miit != hi_miit; miit++) {
425 const auto &bit2 = miit->get()->getBitRefLevel();
426 if ((bit2 & mask) != bit2)
428 if ((bit2 &
bit).any()) {
430 CHKERR get_moab().add_entities(idm, &ent, 1);
436 <<
"Finite element " << name <<
" added. Nb. of elements added "
437 << nb_add_fes <<
" out of " << std::distance(miit, hi_miit);
445 const EntityHandle meshset,
const std::string &name,
const bool recursive) {
447 *buildMoFEM &= 1 << 0;
448 const BitFEId id = getBitFEId(name);
449 const EntityHandle idm = get_finite_element_meshset(
id);
450 if (recursive ==
false) {
451 CHKERR get_moab().add_entities(idm, &meshset, 1);
454 CHKERR get_moab().get_entities_by_type(meshset, MBENTITYSET, meshsets,
456 CHKERR get_moab().add_entities(idm, meshsets);
463 const Range *ents_ptr,
int verb) {
470 <<
"Build Finite Elements " << fe->getName();
476 std::array<BitFieldId, LAST> fe_fields = {fe.get()->getBitFieldIdRow(),
477 fe.get()->getBitFieldIdCol(),
478 fe.get()->getBitFieldIdData()};
481 EntityHandle meshset = get_finite_element_meshset(fe.get()->getId());
485 CHKERR get_moab().get_entities_by_handle(meshset, fe_ents,
false);
488 fe_ents = intersect(fe_ents, *ents_ptr);
491 typedef std::vector<boost::weak_ptr<EntFiniteElement>> VecOfWeakFEPtrs;
492 VecOfWeakFEPtrs processed_fes;
493 processed_fes.reserve(fe_ents.size());
495 int last_data_field_ents_view_size = 0;
496 int last_row_field_ents_view_size = 0;
497 int last_col_field_ents_view_size = 0;
500 std::vector<EntityHandle> adj_ents;
503 for (Range::const_pair_iterator peit = fe_ents.const_pair_begin();
504 peit != fe_ents.const_pair_end(); peit++) {
506 const auto first = peit->first;
507 const auto second = peit->second;
513 refinedFiniteElements.get<
Ent_mi_tag>().lower_bound(first);
514 if (ref_fe_miit == refinedFiniteElements.get<
Ent_mi_tag>().end()) {
515 std::ostringstream ss;
516 ss <<
"refinedFiniteElements not in database ent = " << first <<
" type "
520 auto hi_ref_fe_miit =
521 refinedFiniteElements.get<
Ent_mi_tag>().upper_bound(second);
523 EntFiniteElement_multiIndex::iterator hint_p = entsFiniteElements.end();
524 for (; ref_fe_miit != hi_ref_fe_miit; ref_fe_miit++) {
527 hint_p = entsFiniteElements.emplace_hint(
528 hint_p, boost::make_shared<EntFiniteElement>(*ref_fe_miit, fe));
529 processed_fes.emplace_back(*hint_p);
530 auto fe_raw_ptr = hint_p->get();
533 bool row_as_data =
false, col_as_row =
false;
534 if (fe_fields[
DATA] == fe_fields[
ROW])
536 if (fe_fields[
ROW] == fe_fields[
COL])
539 fe_raw_ptr->getDataFieldEntsPtr()->reserve(
540 last_data_field_ents_view_size);
543 fe_raw_ptr->getRowFieldEntsPtr() = fe_raw_ptr->getDataFieldEntsPtr();
546 if (fe_raw_ptr->getRowFieldEntsPtr() ==
547 fe_raw_ptr->getDataFieldEntsPtr())
548 fe_raw_ptr->getRowFieldEntsPtr() =
549 boost::make_shared<FieldEntity_vector_view>();
550 fe_raw_ptr->getRowFieldEntsPtr()->reserve(
551 last_row_field_ents_view_size);
554 if (row_as_data && col_as_row) {
555 fe_raw_ptr->getColFieldEntsPtr() = fe_raw_ptr->getDataFieldEntsPtr();
556 }
else if (col_as_row) {
557 fe_raw_ptr->getColFieldEntsPtr() = fe_raw_ptr->getRowFieldEntsPtr();
561 fe_raw_ptr->getColFieldEntsPtr() ==
562 fe_raw_ptr->getRowFieldEntsPtr() ||
563 fe_raw_ptr->getColFieldEntsPtr() ==
564 fe_raw_ptr->getDataFieldEntsPtr()
567 fe_raw_ptr->getColFieldEntsPtr() =
568 boost::make_shared<FieldEntity_vector_view>();
569 fe_raw_ptr->getColFieldEntsPtr()->reserve(
570 last_col_field_ents_view_size);
574 for (
unsigned int ii = 0; ii !=
BitFieldId().size(); ++ii) {
579 for (
int ss = 0; ss < LAST; ss++) {
580 id_common |= fe_fields[ss] &
BitFieldId().set(ii);
582 if (id_common.none())
587 auto miit = fields_by_id.find(field_id);
588 if (miit == fields_by_id.end())
590 auto field_bit_number = (*miit)->getBitNumber();
594 const std::string
field_name = miit->get()->getName();
595 const bool add_to_data = (field_id & fe_fields[
DATA]).any();
596 const bool add_to_row = (field_id & fe_fields[
ROW]).any();
597 const bool add_to_col = (field_id & fe_fields[
COL]).any();
602 CHKERR fe_raw_ptr->getElementAdjacency(*miit, adj_ents);
604 for (
auto ent : adj_ents) {
611 fe_raw_ptr->getDataFieldEntsPtr()->emplace_back(*dof_it);
613 if (add_to_row && !row_as_data) {
614 fe_raw_ptr->getRowFieldEntsPtr()->emplace_back(*dof_it);
616 if (add_to_col && !col_as_row) {
617 fe_raw_ptr->getColFieldEntsPtr()->emplace_back(*dof_it);
625 auto uid_comp = [](
const auto &
a,
const auto &b) {
626 return a.lock()->getLocalUniqueId() < b.lock()->getLocalUniqueId();
632 sort(fe_raw_ptr->getDataFieldEntsPtr()->begin(),
633 fe_raw_ptr->getDataFieldEntsPtr()->end(), uid_comp);
634 last_data_field_ents_view_size =
635 fe_raw_ptr->getDataFieldEntsPtr()->size();
639 sort(fe_raw_ptr->getRowFieldEntsPtr()->begin(),
640 fe_raw_ptr->getRowFieldEntsPtr()->end(), uid_comp);
641 last_row_field_ents_view_size =
642 fe_raw_ptr->getRowFieldEntsPtr()->size();
647 sort(fe_raw_ptr->getColFieldEntsPtr()->begin(),
648 fe_raw_ptr->getColFieldEntsPtr()->end(), uid_comp);
649 last_col_field_ents_view_size =
650 fe_raw_ptr->getColFieldEntsPtr()->size();
665 for (
auto &fe : finiteElements)
666 CHKERR buildFiniteElements(fe, NULL, verb);
671 for (
auto &fe : finiteElements) {
672 auto miit = fe_ents.lower_bound(
676 get_id_for_max_type<MBENTITYSET>(), fe->getFEUId()));
677 const auto count = std::distance(miit, hi_miit);
679 <<
"Finite element " << fe->getName()
680 <<
" added. Nb. of elements added " << count;
684 for (
auto &field : fIelds) {
685 auto rec = slg.open_record(keywords::severity = Sev::verbose);
687 logging::record_ostream strm(rec);
688 strm <<
"Field " << field->getName() <<
" on finite element: ";
689 if ((field->getId() & fe->getBitFieldIdRow()).any())
691 if ((field->getId() & fe->getBitFieldIdCol()).any())
693 if ((field->getId() & fe->getBitFieldIdData()).any())
696 slg.push_record(boost::move(rec));
704 *buildMoFEM |= 1 << 1;
715 const Range *
const ents_ptr,
726 CHKERR buildFiniteElements(*fe_miit, ents_ptr, verb);
730 auto miit = fe_ents.lower_bound(
734 get_id_for_max_type<MBENTITYSET>(), (*fe_miit)->getFEUId()));
735 const auto count = std::distance(miit, hi_miit);
736 MOFEM_LOG(
"SYNC", Sev::inform) <<
"Finite element " << fe_name
737 <<
" added. Nb. of elements added " << count;
741 *buildMoFEM |= 1 << 1;
750 if (!((*buildMoFEM) & BUILD_FIELD))
752 if (!((*buildMoFEM) & BUILD_FE))
754 for (
auto peit = ents.pair_begin(); peit != ents.pair_end(); ++peit) {
755 auto fit = entsFiniteElements.get<
Ent_mi_tag>().lower_bound(peit->first);
757 entsFiniteElements.get<
Ent_mi_tag>().upper_bound(peit->second);
758 for (; fit != hi_fit; ++fit) {
759 if ((*fit)->getBitFieldIdRow().none() &&
760 (*fit)->getBitFieldIdCol().none() &&
761 (*fit)->getBitFieldIdData().none())
764 if ((*fit)->getBitFieldIdRow() != (*fit)->getBitFieldIdCol())
766 if ((*fit)->getBitFieldIdRow() != (*fit)->getBitFieldIdData())
769 auto hint = entFEAdjacencies.end();
770 for (
auto e : *(*fit)->getRowFieldEntsPtr()) {
771 hint = entFEAdjacencies.emplace_hint(hint, e.lock(), *fit);
772 bool success = entFEAdjacencies.modify(hint, modify_row);
775 "modification unsuccessful");
777 if ((*fit)->getBitFieldIdRow() != (*fit)->getBitFieldIdCol()) {
779 if ((*fit)->getBitFieldIdCol() != (*fit)->getBitFieldIdData())
782 auto hint = entFEAdjacencies.end();
783 for (
auto e : *(*fit)->getColFieldEntsPtr()) {
784 hint = entFEAdjacencies.emplace_hint(hint, e.lock(), *fit);
785 bool success = entFEAdjacencies.modify(hint, modify_col);
788 "modification unsuccessful");
791 if ((*fit)->getBitFieldIdRow() != (*fit)->getBitFieldIdData() ||
792 (*fit)->getBitFieldIdCol() != (*fit)->getBitFieldIdData()) {
795 auto hint = entFEAdjacencies.end();
796 for (
auto &e : (*fit)->getDataFieldEnts()) {
797 hint = entFEAdjacencies.emplace_hint(hint, e.lock(), *fit);
798 bool success = entFEAdjacencies.modify(hint, modify_data);
801 "modification unsuccessful");
809 <<
"Number of adjacencies " << entFEAdjacencies.size();
813 *buildMoFEM |= 1 << 2;
825 CHKERR build_adjacencies(ents, verb);
838EntFiniteElement_multiIndex::index<Unique_mi_tag>::type::iterator
849EntFiniteElement_multiIndex::index<Unique_mi_tag>::type::iterator
855 get_id_for_max_type<MBENTITYSET>(), (*miit)->getFEUId()));
862 const std::string &name)
const {
864 FiniteElement_multiIndex::index<FiniteElement_name_mi_tag>::type::iterator it;
867 SETERRQ1(mofemComm, 1,
"finite element not found < %s >", name.c_str());
872 CHKERR get_moab().get_number_entities_by_handle(meshset, num_entities);
874 auto counts_fes = [&]() {
875 return std::distance(get_fe_by_name_begin((*it)->getName()),
876 get_fe_by_name_end((*it)->getName()));
879 if (counts_fes() !=
static_cast<size_t>(num_entities)) {
881 "not equal number of entities in meshset and finite elements "
883 (*it)->getName().c_str());
890 FiniteElement_multiIndex::index<FiniteElement_name_mi_tag>::type::iterator it;
896 CHKERR get_moab().get_number_entities_by_handle(meshset, num_entities);
898 auto counts_fes = [&]() {
899 return std::distance(get_fe_by_name_begin((*it)->getName()),
900 get_fe_by_name_end((*it)->getName()));
903 if (counts_fes() !=
static_cast<size_t>(num_entities)) {
905 "not equal number of entities in meshset and finite elements "
907 (*it)->getName().c_str());
915 const std::string &fe_name,
919 auto p_miit = prb.find(problem_name);
920 if (p_miit == prb.end())
922 "No such problem like < %s >", problem_name.c_str());
927 p_miit->numeredFiniteElementsPtr->get<
Unique_mi_tag>().lower_bound(
929 0, (*fe_miit)->getFEUId()));
931 p_miit->numeredFiniteElementsPtr->get<
Unique_mi_tag>().upper_bound(
933 get_id_for_max_type<MBENTITYSET>(), (*fe_miit)->getFEUId()));
935 if (miit != hi_miit) {
936 std::vector<EntityHandle> ents;
937 ents.reserve(std::distance(miit, hi_miit));
938 for (; miit != hi_miit; ++miit)
939 ents.push_back((*miit)->getEnt());
940 int part = (*miit)->getPart();
941 CHKERR get_moab().tag_clear_data(th_Part, &*ents.begin(), ents.size(),
943 CHKERR get_moab().add_entities(meshset, &*ents.begin(), ents.size());
#define FECoreFunctionBegin
#define MOFEM_LOG_SYNCHRONISE(comm)
Synchronise "SYNC" channel.
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 MoFEMFunctionBegin
First executable line of each MoFEM function, used for error handling. Final line of MoFEM functions ...
@ MOFEM_OPERATION_UNSUCCESSFUL
@ MOFEM_DATA_INCONSISTENCY
#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 THROW_MESSAGE(msg)
Throw MoFEM exception.
boost::function< MoFEMErrorCode(Interface &moab, const Field &field, const EntFiniteElement &fe, std::vector< EntityHandle > &adjacency)> ElementAdjacencyFunct
user adjacency function
MoFEMErrorCode getEntitiesByRefLevel(const BitRefLevel bit, const BitRefLevel mask, const EntityHandle meshset, const int verb=QUIET) const
add all ents from ref level given by bit to meshset
#define MOFEM_LOG(channel, severity)
Log.
static LoggerType & getLog(const std::string channel)
Get logger by channel.
PetscErrorCode MoFEMErrorCode
MoFEM/PETSc error code.
std::bitset< BITFEID_SIZE > BitFEId
Finite element Id.
std::bitset< BITFIELDID_SIZE > BitFieldId
Field Id.
std::bitset< BITREFLEVEL_SIZE > BitRefLevel
Bit structure attached to each entity identifying to what mesh entity is attached.
implementation of Data Operators for Forces and Sources
auto type_from_handle(const EntityHandle h)
get type from entity handle
EntityHandle get_id_for_max_type()
EntityHandle get_id_for_min_type()
const EntityHandle no_handle
No entity handle is indicated by zero handle, i.e. root meshset.
constexpr auto field_name
MoFEMErrorCode get_finite_element_entities_by_dimension(const std::string name, int dim, Range &ents) const
get entities in the finite element by dimension
MoFEMErrorCode modify_finite_element_off_field_row(const std::string &fe_name, const std::string name_row)
unset field row which finite element use
MoFEMErrorCode check_number_of_ents_in_ents_finite_element() const
check data consistency in entsFiniteElements
MoFEMErrorCode get_problem_finite_elements_entities(const std::string name, const std::string &fe_name, const EntityHandle meshset)
add finite elements to the meshset
MoFEMErrorCode modify_finite_element_add_field_col(const std::string &fe_name, const std::string name_col)
set field col which finite element use
EntityHandle get_finite_element_meshset(const BitFEId id) const
EntFiniteElement_multiIndex::index< Unique_mi_tag >::type::iterator get_fe_by_name_end(const std::string &fe_name) const
get end iterator of finite elements of given name (instead you can use IT_GET_FES_BY_NAME_FOR_LOOP(MF...
MoFEMErrorCode modify_finite_element_add_field_data(const std::string &fe_name, const std::string name_filed)
set finite element field data
MoFEMErrorCode add_finite_element(const std::string &fe_name, enum MoFEMTypes bh=MF_EXCL, int verb=DEFAULT_VERBOSITY)
add finite element
MoFEMErrorCode add_ents_to_finite_element_by_MESHSET(const EntityHandle meshset, const std::string &name, const bool recursive=false)
add MESHSET element to finite element database given by name
EntFiniteElement_multiIndex::index< Unique_mi_tag >::type::iterator get_fe_by_name_begin(const std::string &fe_name) const
get begin iterator of finite elements of given name (instead you can use IT_GET_FES_BY_NAME_FOR_LOOP(...
std::string getBitFEIdName(const BitFEId id) const
Get field name.
MoFEMErrorCode add_ents_to_finite_element_by_dim(const EntityHandle meshset, const int dim, const std::string &name, const bool recursive=true)
add entities to finite element
MoFEMErrorCode get_finite_element_entities_by_handle(const std::string name, Range &ents) const
get entities in the finite element by handle
MoFEMErrorCode add_ents_to_finite_element_by_type(const EntityHandle meshset, const EntityType type, const std::string &name, const bool recursive=true)
add entities to finite element
MoFEMErrorCode modify_finite_element_off_field_col(const std::string &fe_name, const std::string name_col)
unset field col which finite element use
MoFEMErrorCode modify_finite_element_off_field_data(const std::string &fe_name, const std::string name_filed)
unset finite element field data
MoFEMErrorCode add_ents_to_finite_element_by_bit_ref(const BitRefLevel &bit, const BitRefLevel &mask, const std::string &name, EntityType type, int verb=DEFAULT_VERBOSITY)
add TET entities from given refinement level to finite element database given by name
MoFEMErrorCode modify_finite_element_add_field_row(const std::string &fe_name, const std::string name_row)
set field row which finite element use
bool check_finite_element(const std::string &name) const
Check if finite element is in database.
MoFEMErrorCode build_finite_elements(int verb=DEFAULT_VERBOSITY)
Build finite elements.
BitFEId getBitFEId(const std::string &fe_name) const
Get field Id.
DEPRECATED MoFEMErrorCode add_ents_to_finite_element_EntType_by_bit_ref(const BitRefLevel &bit, const std::string &name, EntityType type, int verb=DEFAULT_VERBOSITY)
MoFEMErrorCode build_adjacencies(const Range &ents, int verb=DEFAULT_VERBOSITY)
build adjacencies
MoFEMErrorCode buildFiniteElements(const boost::shared_ptr< FiniteElement > &fe, const Range *ents_ptr=NULL, int verb=DEFAULT_VERBOSITY)
const FiniteElement * get_finite_element_structure(const std::string &name, enum MoFEMTypes bh=MF_EXCL) const
get finite element struture
MoFEMErrorCode list_finite_elements() const
list finite elements in database
MoFEMErrorCode modify_finite_element_adjacency_table(const std::string &fe_name, const EntityType type, ElementAdjacencyFunct function)
modify finite element table, only for advanced user
MoFEMErrorCode get_finite_element_entities_by_type(const std::string name, EntityType type, Range &ents) const
get entities in the finite element by type
UId getLocalUniqueIdCalculate() const
Generate UId for finite element entity.
UId getLocalUniqueIdCalculate()
Get the Local Unique Id Calculate object.
Finite element definition.