25constexpr std::array<const DefaultElementAdjacency::DefEntTypeMap *, MBMAXTYPE>
29 static Tag th_no_field;
32 1, MB_TYPE_HANDLE, th_no_field,
33 MB_TAG_CREAT | MB_TAG_SPARSE,
35 "Cannot get or create _NOFIELD_ tag");
51 std::vector<EntityHandle> &fe_ents,
55 CHKERR moab.tag_clear_data(th_no_field, fe_ents.data(), fe_ents.size(),
66 "Cannot get _NOFIELD_ tag data");
72 std::vector<EntityHandle> &adjacency) {
76 adjacency.push_back(fe.
getEnt());
78 for (
auto ent : adjacency)
82 auto adjacency_meshset =
84 CHKERR moab.get_entities_by_handle(adjacency_meshset, adjacency,
false);
85 for (
auto ent : adjacency) {
87 .insert(boost::shared_ptr<SideNumber>(
new SideNumber(ent, -1, 0, 0)));
92 "this field is not implemented for VERTEX finite element");
101 std::vector<EntityHandle> &adjacency) {
107 CHKERR moab.get_connectivity(&fe_ent, 1, adjacency,
true);
110 adjacency.push_back(fe_ent);
112 for (
auto e : adjacency)
116 auto adjacency_meshset =
118 CHKERR moab.get_entities_by_handle(adjacency_meshset, adjacency,
false);
119 for (
auto e : adjacency) {
121 .insert(boost::shared_ptr<SideNumber>(
new SideNumber(e, -1, 0, 0)));
126 "this field is not implemented for EDGE finite element");
135 std::vector<EntityHandle> &adjacency) {
141 CHKERR moab.get_connectivity(&fe_ent, 1, adjacency,
true);
143 CHKERR moab.get_adjacencies(&fe_ent, 1, 1,
false, adjacency,
144 moab::Interface::UNION);
147 adjacency.push_back(fe_ent);
149 for (
auto ent : adjacency)
153 auto adjacency_meshset =
155 CHKERR moab.get_entities_by_handle(adjacency_meshset, adjacency,
false);
156 for (
auto ent : adjacency) {
158 .insert(boost::shared_ptr<SideNumber>(
new SideNumber(ent, -1, 0, 0)));
163 "this field is not implemented for TRI finite element");
171 std::vector<EntityHandle> &adjacency) {
176 CHKERR moab.get_connectivity(&fe_ent, 1, adjacency,
true);
178 CHKERR moab.get_adjacencies(&fe_ent, 1, 1,
false, adjacency,
179 moab::Interface::UNION);
181 CHKERR moab.get_adjacencies(&fe_ent, 1, 2,
false, adjacency,
182 moab::Interface::UNION);
184 adjacency.push_back(fe_ent);
186 for (
auto ent : adjacency)
190 auto adjacency_meshset =
192 CHKERR moab.get_entities_by_handle(adjacency_meshset, adjacency,
false);
193 for (
auto ent : adjacency) {
195 .insert(boost::shared_ptr<SideNumber>(
new SideNumber(ent, -1, 0, 0)));
200 "this field is not implemented for TRI finite element");
209 std::vector<EntityHandle> &adjacency) {
216 CHKERR moab.side_element(prism, 2, 3, face_side3);
217 CHKERR moab.side_element(prism, 2, 4, face_side4);
220 for (
int qq = 0; qq < 3; qq++) {
222 rval = moab.side_element(prism, 2, qq, quad);
223 if (
rval != MB_SUCCESS || quad == 0)
225 int side_number, sense, offset;
226 rval = moab.side_number(prism, quad, side_number, sense, offset);
227 if (side_number == -1 ||
rval != MB_SUCCESS)
230 .insert(boost::shared_ptr<SideNumber>(
231 new SideNumber(quad, side_number, sense, offset)));
234 for (; ee < 3; ee++) {
236 CHKERR moab.side_element(prism, 1, ee, edge);
237 boost::shared_ptr<SideNumber> side_ptr =
239 if (side_ptr->side_number != ee) {
241 "data inconsistency for edge %d while in FE data structure is "
243 ee, side_ptr->side_number);
245 CHKERR moab.side_element(prism, 1, 6 + ee, edge);
247 if (side_ptr->side_number != ee + 6) {
248 if (side_ptr->side_number != ee) {
250 "data inconsistency for edge %d while in FE data structure "
252 ee, side_ptr->side_number);
254 side_ptr->brother_side_number = ee + 6;
258 for (; ee < 6; ee++) {
260 rval = moab.side_element(prism, 1, ee, edge);
261 if (
rval != MB_SUCCESS || edge == 0)
263 int side_number, sense, offset;
264 rval = moab.side_number(prism, edge, side_number, sense, offset);
265 if (side_number == -1 ||
rval != MB_SUCCESS)
268 .insert(boost::shared_ptr<SideNumber>(
269 new SideNumber(edge, side_number, sense, offset)));
272 for (; nn < 3; nn++) {
274 CHKERR moab.side_element(prism, 0, nn, node);
275 boost::shared_ptr<SideNumber> side_ptr =
277 if (side_ptr->side_number != nn) {
279 "data inconsistency for node %d while in FE datastructure is "
281 nn, side_ptr->side_number);
283 CHKERR moab.side_element(prism, 0, nn + 3, node);
285 if (side_ptr->side_number != nn + 3) {
286 if (side_ptr->side_number != nn) {
288 "data inconsistency for node %d while in FE datastructure is "
290 nn, side_ptr->side_number);
292 side_ptr->brother_side_number = nn + 3;
303 CHKERR moab.get_adjacencies(&prism, 1, 0,
false, nodes,
304 moab::Interface::UNION);
307 CHKERR moab.get_connectivity(&prism, 1, topo_nodes,
true);
309 CHKERR moab.get_connectivity(&prism, 1, mid_nodes,
false);
310 mid_nodes = subtract(mid_nodes, topo_nodes);
311 nodes = subtract(nodes, mid_nodes);
313 adjacency.insert(adjacency.end(), nodes.begin(), nodes.end());
318 for (; siit != hi_siit; siit++)
319 adjacency.push_back(siit->get()->ent);
325 for (; siit != hi_siit; siit++)
326 adjacency.push_back(siit->get()->ent);
329 adjacency.push_back(prism);
332 auto adjacency_meshset =
334 CHKERR moab.get_entities_by_handle(adjacency_meshset, adjacency,
false);
335 for (
auto ent : adjacency) {
337 .insert(boost::shared_ptr<SideNumber>(
new SideNumber(ent, -1, 0, 0)));
342 "this field is not implemented for TRI finite element");
349 std::vector<EntityHandle> &adjacency) {
355 "Finite element is not of type MBENTITYSET");
366 CHKERR moab.get_entities_by_handle(fe.
getEnt(), adjacency,
false);
367 for (
auto ent : adjacency) {
369 .insert(boost::shared_ptr<SideNumber>(
new SideNumber(ent, -1, 0, 0)));
373 auto adjacency_meshset =
375 CHKERR moab.get_entities_by_handle(adjacency_meshset, adjacency,
false);
376 for (
auto ent : adjacency) {
378 .insert(boost::shared_ptr<SideNumber>(
new SideNumber(ent, -1, 0, 0)));
389 : meshset(_meshset) {
393 moab.tag_get_by_ptr(th_FEId, &
meshset, 1, (
const void **)&
tagId),
396 CHK_MOAB_THROW(moab.tag_get_handle(
"_FEName", th_FEName),
"get tag");
400 Tag th_FEIdCol, th_FEIdRow, th_FEIdData;
401 CHK_MOAB_THROW(moab.tag_get_handle(
"_FEIdCol", th_FEIdCol),
"get_tag");
405 CHK_MOAB_THROW(moab.tag_get_handle(
"_FEIdRow", th_FEIdRow),
"get tag");
409 CHK_MOAB_THROW(moab.tag_get_handle(
"_FEIdData", th_FEIdData),
"get tag");
427 os << e.
getNameRef() <<
" fe_id " << e.
getId().to_ulong() <<
" f_id_row "
434 boost::shared_ptr<FiniteElement> &fe) {
439 boost::shared_ptr<FiniteElement> &fe) {
444 boost::shared_ptr<FiniteElement> &fe) {
449 boost::shared_ptr<FiniteElement> &fe) {
454 boost::shared_ptr<FiniteElement> &fe) {
459 boost::shared_ptr<FiniteElement> &fe) {
464 boost::shared_ptr<FiniteElement> &fe) {
465 static_cast<BitFieldId *
>(fe->tag_BitFieldId_col_data)->reset();
469 boost::shared_ptr<FiniteElement> &fe) {
470 static_cast<BitFieldId *
>(fe->tag_BitFieldId_row_data)->reset();
474 boost::shared_ptr<FiniteElement> &fe) {
475 static_cast<BitFieldId *
>(fe->tag_BitFieldId_data)->reset();
480 const boost::shared_ptr<RefElement> &ref_finite_element,
481 const boost::shared_ptr<FiniteElement> &fe_ptr)
496 std::vector<EntityHandle> &adjacency) {
505 moab, *field_ptr, *this_fe_ptr, adjacency);
513 const boost::shared_ptr<EntFiniteElement> &sptr)
516boost::weak_ptr<FENumeredDofEntity>
518 auto comp = [idx](
const auto &
a) {
return a->getPetscGlobalDofIdx() == idx; };
521 if (
auto e = it.lock()) {
522 if (
auto cache = e->entityCacheColDofs.lock()) {
523 auto dit = std::find_if(cache->loHi[0], cache->loHi[1], comp);
524 if (dit != cache->loHi[1])
525 return boost::reinterpret_pointer_cast<FENumeredDofEntity>(*dit);
531 return boost::weak_ptr<FENumeredDofEntity>();
534boost::weak_ptr<FENumeredDofEntity>
537 auto comp = [idx](
const auto &
a) {
return a->getPetscGlobalDofIdx() == idx; };
540 if (
auto e = it.lock()) {
541 if (
auto cache = e->entityCacheColDofs.lock()) {
542 auto dit = std::find_if(cache->loHi[0], cache->loHi[1], comp);
543 if (dit != cache->loHi[1])
544 return boost::reinterpret_pointer_cast<FENumeredDofEntity>(*dit);
550 return boost::weak_ptr<FENumeredDofEntity>();
558template <
typename ENTSVIEW,
typename DOFSVIEW,
typename EXTRACTOR,
562 EXTRACTOR &&extractor, INSERTER &&inserter) {
565 auto hint = dofs_view->end();
566 using ValType =
typename std::remove_reference<
decltype(**hint)>::type;
568 for (
auto &it : *ents_view) {
569 if (
auto e = it.lock()) {
571 if (
auto cache = extractor(e).lock())
572 for (
auto dit = cache->loHi[0]; dit != cache->loHi[1]; ++dit)
573 hint = inserter(dofs_view, hint,
574 boost::reinterpret_pointer_cast<ValType>(*dit));
583boost::shared_ptr<FEDofEntity_multiIndex>
587 boost::weak_ptr<EntityCacheDofs>
588 operator()(boost::shared_ptr<FieldEntity> &e) {
589 return e->entityCacheDataDofs;
594 FEDofEntity_multiIndex::iterator
595 operator()(boost::shared_ptr<FEDofEntity_multiIndex> &dofs_view,
596 FEDofEntity_multiIndex::iterator &hint,
597 boost::shared_ptr<FEDofEntity> &&dof) {
598 return dofs_view->emplace_hint(hint, dof);
602 auto data_dofs = boost::make_shared<FEDofEntity_multiIndex>();
609boost::shared_ptr<std::vector<boost::shared_ptr<FEDofEntity>>>
614 boost::weak_ptr<EntityCacheDofs>
615 operator()(boost::shared_ptr<FieldEntity> &e) {
616 return e->entityCacheDataDofs;
621 using Vec = std::vector<boost::shared_ptr<FEDofEntity>>;
622 using It = Vec::iterator;
623 It operator()(boost::shared_ptr<Vec> &dofs_view, It &hint,
624 boost::shared_ptr<FEDofEntity> &&dof) {
625 dofs_view->emplace_back(dof);
626 return dofs_view->end();
630 auto data_vector_dofs =
631 boost::make_shared<std::vector<boost::shared_ptr<FEDofEntity>>>();
636 return data_vector_dofs;
639boost::shared_ptr<FENumeredDofEntity_multiIndex>
644 boost::weak_ptr<EntityCacheNumeredDofs>
645 operator()(boost::shared_ptr<FieldEntity> &e) {
646 return e->entityCacheRowDofs;
652 using It = Idx::iterator;
653 It operator()(boost::shared_ptr<Idx> &dofs_view, It &hint,
654 boost::shared_ptr<FENumeredDofEntity> &&dof) {
655 return dofs_view->emplace_hint(hint, dof);
659 auto row_dofs = boost::make_shared<FENumeredDofEntity_multiIndex>();
667boost::shared_ptr<FENumeredDofEntity_multiIndex>
672 boost::weak_ptr<EntityCacheNumeredDofs>
673 operator()(boost::shared_ptr<FieldEntity> &e) {
674 return e->entityCacheColDofs;
680 using It = Idx::iterator;
681 It operator()(boost::shared_ptr<Idx> &dofs_view, It &hint,
682 boost::shared_ptr<FENumeredDofEntity> &&dof) {
683 return dofs_view->emplace_hint(hint, dof);
687 auto col_dofs = boost::make_shared<FENumeredDofEntity_multiIndex>();
#define CHK_THROW_MESSAGE(err, msg)
Check and throw MoFEM exception.
#define MoFEMFunctionReturnHot(a)
Last executable line of each PETSc function used for error handling. Replaces return()
@ L2
field with C-1 continuity
@ NOFIELD
scalar or vector of scalars describe (no true field)
@ HCURL
field with continuous tangents
@ HDIV
field with continuous normal traction
#define MoFEMFunctionBegin
First executable line of each MoFEM function, used for error handling. Final line of MoFEM functions ...
#define CHK_MOAB_THROW(err, msg)
Check error code of MoAB function and throw MoFEM exception.
@ 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.
multi_index_container< boost::shared_ptr< FENumeredDofEntity >, indexed_by< ordered_unique< tag< Unique_mi_tag >, const_mem_fun< FENumeredDofEntity::interface_type_DofEntity, UId, &FENumeredDofEntity::getLocalUniqueId > >, ordered_non_unique< tag< Ent_mi_tag >, const_mem_fun< FENumeredDofEntity::interface_type_DofEntity, EntityHandle, &FENumeredDofEntity::getEnt > > > > FENumeredDofEntity_multiIndex
MultiIndex container keeps FENumeredDofEntity.
multi_index_container< boost::shared_ptr< SideNumber >, indexed_by< ordered_unique< member< SideNumber, EntityHandle, &SideNumber::ent > >, ordered_non_unique< composite_key< SideNumber, const_mem_fun< SideNumber, EntityType, &SideNumber::getEntType >, member< SideNumber, signed char, &SideNumber::side_number > > > > > SideNumber_multiIndex
SideNumber_multiIndex for SideNumber.
static MoFEMErrorCodeGeneric< moab::ErrorCode > rval
PetscErrorCode MoFEMErrorCode
MoFEM/PETSc error code.
std::bitset< BITFIELDID_SIZE > BitFieldId
Field Id.
implementation of Data Operators for Forces and Sources
EntityHandle get_id_for_max_type()
EntityHandle get_id_for_min_type()
std::ostream & operator<<(std::ostream &os, const EntitiesFieldData::EntData &e)
std::vector< boost::weak_ptr< FieldEntity > > FieldEntity_vector_view
static MoFEMErrorCode get_cache_data_dofs_view(ENTSVIEW &ents_view, DOFSVIEW &dofs_view, EXTRACTOR &&extractor, INSERTER &&inserter)
static constexpr DefEntTypeMap defVertexTypeMap
static constexpr DefEntTypeMap defEdgeTypeMap
std::array< bool, MBMAXTYPE > DefEntTypeMap
static constexpr DefEntTypeMap defQuadTypeMap
static constexpr DefEntTypeMap defTriTypeMap
static MoFEMErrorCode defaultMeshset(Interface &moab, const Field &field, const EntFiniteElement &fe, std::vector< EntityHandle > &adjacency)
static MoFEMErrorCode defaultVertex(Interface &moab, const Field &field, const EntFiniteElement &fe, std::vector< EntityHandle > &adjacency)
static MoFEMErrorCode defaultVolume(Interface &moab, const Field &field, const EntFiniteElement &fe, std::vector< EntityHandle > &adjacency)
static constexpr std::array< const DefEntTypeMap *, MBMAXTYPE > defTypeMap
static constexpr DefEntTypeMap defTetTypeMap
static constexpr DefEntTypeMap defHexTypeMap
static constexpr DefEntTypeMap defMeshsetTypeMap
static MoFEMErrorCode defaultEdge(Interface &moab, const Field &field, const EntFiniteElement &fe, std::vector< EntityHandle > &adjacency)
static MoFEMErrorCode defaultPrism(Interface &moab, const Field &field, const EntFiniteElement &fe, std::vector< EntityHandle > &adjacency)
static MoFEMErrorCode defaultFace(Interface &moab, const Field &field, const EntFiniteElement &fe, std::vector< EntityHandle > &adjacency)
static constexpr DefEntTypeMap defPrismTypeMap
Finite element data for entity.
EntFiniteElement(const boost::shared_ptr< RefElement > &ref_finite_element, const boost::shared_ptr< FiniteElement > &fe_ptr)
boost::shared_ptr< std::vector< boost::shared_ptr< FEDofEntity > > > getDataVectorDofsPtr() const
Get data data dos multi-index structure.
boost::shared_ptr< FieldEntity_vector_view > dataFieldEnts
boost::shared_ptr< FEDofEntity_multiIndex > getDataDofsPtr() const
Get the Data Dofs Ptr object.
MoFEMErrorCode getElementAdjacency(const boost::shared_ptr< Field > field_ptr, std::vector< EntityHandle > &adjacency)
Provide data structure for (tensor) field approximation.
std::string getName() const
Get field name.
EntityHandle getMeshset() const
Get field meshset.
FieldSpace getSpace() const
Get field approximation space.
void operator()(boost::shared_ptr< FiniteElement > &fe)
void operator()(boost::shared_ptr< FiniteElement > &fe)
void operator()(boost::shared_ptr< FiniteElement > &fe)
void operator()(boost::shared_ptr< FiniteElement > &fe)
void operator()(boost::shared_ptr< FiniteElement > &fe)
void operator()(boost::shared_ptr< FiniteElement > &fe)
void operator()(boost::shared_ptr< FiniteElement > &fe)
void operator()(boost::shared_ptr< FiniteElement > &fe)
void operator()(boost::shared_ptr< FiniteElement > &fe)
Finite element definition.
BitFieldId * tag_BitFieldId_col_data
tag stores col id_id for fields
void * tagName
ptr to tag storing FE name
unsigned int getBitNumber() const
Get bit identifying this element.
BitFieldId * tag_BitFieldId_data
tag stores data id_id for fields
static MoFEMErrorCode setNoFieldTagField(moab::Interface &moab, Range &fe_ents, const Field &field, EntityHandle meshset)
Set the No Field meshset to finite element entities storing no field adjacencies to it.
static Tag getNoFieldTag(moab::Interface &moab, const Field &field)
Get the tag storing meshset with adjacent entities to finite element.
BitFEId * tagId
ptr to tag storing FE id
BitFieldId getBitFieldIdRow() const
Get field ids on rows.
BitFEId getId() const
Get finite element id.
FiniteElement(Interface &moab, const EntityHandle _meshset)
BitFieldId * tag_BitFieldId_row_data
tag stores row id_id for fields
static EntityHandle getNoFieldAdjacencyMeshset(moab::Interface &moab, EntityHandle fe_ent, const Field &field)
Get the No Field adjacency meshset from finite element entity.
static constexpr int ent_shift
boost::string_ref getNameRef() const
Get finite element name.
BitFieldId getBitFieldIdData() const
Get field ids on data.
BitFieldId getBitFieldIdCol() const
Get field ids on columns.
int tagNameSize
numer of characters in FE name
EntityHandle meshset
meshset stores FE ents
std::array< ElementAdjacencyFunct, MBMAXTYPE > elementAdjacencyTable
Table of functions retrieving adjacencies for finite element User can alter and change default behavi...
Partitioned (Indexed) Finite Element in Problem.
boost::weak_ptr< FENumeredDofEntity > getRowDofsByPetscGlobalDofIdx(const int idx) const
get FE dof by petsc index
boost::weak_ptr< FENumeredDofEntity > getColDofsByPetscGlobalDofIdx(const int idx) const
get FE dof by petsc index
NumeredEntFiniteElement(const boost::shared_ptr< EntFiniteElement > &sptr)
boost::shared_ptr< EntFiniteElement > & getEntFiniteElement() const
boost::shared_ptr< FENumeredDofEntity_multiIndex > getRowDofsPtr() const
get FE dof on row
boost::shared_ptr< FENumeredDofEntity_multiIndex > getColDofsPtr() const
get FE dof on column
unsigned int part
Partition number.
keeps data about abstract refined finite element
keeps information about side number for the finite element
interface to EntFiniteElement
boost::shared_ptr< FieldEntity_vector_view > & getColFieldEntsPtr() const
FieldEntity_vector_view & getColFieldEnts() const
FieldEntity_vector_view & getRowFieldEnts() const
boost::shared_ptr< FieldEntity_vector_view > & getRowFieldEntsPtr() const
const boost::shared_ptr< RefElement > & getRefElement() const
boost::shared_ptr< FE > & getFiniteElementPtr() const
const boost::shared_ptr< SideNumber > & getSideNumberPtr(const EntityHandle ent) const
boost::shared_ptr< RefEntity > & getRefEntityPtr() const
SideNumber_multiIndex & getSideNumberTable() const
boost::shared_ptr< T > & getRefElement() const
boost::shared_ptr< T > sPtr
EntityType getEntType() const
EntityHandle getEnt() const