v0.14.0
FEMultiIndices.cpp
Go to the documentation of this file.
1 /** \file FEMultiIndices.cpp
2  * \brief Multi-index containers for finite elements
3  */
4 
5 namespace MoFEM {
6 
7 constexpr int FiniteElement::ent_shift; // EntityHandle size
8 
25 constexpr std::array<const DefaultElementAdjacency::DefEntTypeMap *, MBMAXTYPE>
27 
29  moab::Interface &moab, const Field &field, const EntFiniteElement &fe,
30  std::vector<EntityHandle> &adjacency) {
32  switch (field.getSpace()) {
33  case H1:
34  adjacency.push_back(fe.getEnt());
35  // build side table
36  for (auto ent : adjacency)
37  fe.getSideNumberPtr(ent);
38  break;
39  case NOFIELD: {
40  CHKERR moab.get_entities_by_handle(field.getMeshset(), adjacency, false);
41  for (auto ent : adjacency) {
42  const_cast<SideNumber_multiIndex &>(fe.getSideNumberTable())
43  .insert(boost::shared_ptr<SideNumber>(new SideNumber(ent, -1, 0, 0)));
44  }
45  } break;
46  default:
47  SETERRQ(PETSC_COMM_SELF, MOFEM_NOT_IMPLEMENTED,
48  "this field is not implemented for VERTEX finite element");
49  }
50 
52 }
53 
56  const EntFiniteElement &fe,
57  std::vector<EntityHandle> &adjacency) {
59  EntityHandle fe_ent = fe.getEnt();
60  // Range nodes;
61  switch (field.getSpace()) {
62  case H1:
63  CHKERR moab.get_connectivity(&fe_ent, 1, adjacency, true);
64  case HCURL:
65  case L2:
66  adjacency.push_back(fe_ent);
67  // build side table
68  for (auto e : adjacency)
69  fe.getSideNumberPtr(e);
70  break;
71  case NOFIELD: {
72  CHKERR moab.get_entities_by_handle(field.getMeshset(), adjacency, false);
73  for (auto e : adjacency) {
74  const_cast<SideNumber_multiIndex &>(fe.getSideNumberTable())
75  .insert(boost::shared_ptr<SideNumber>(new SideNumber(e, -1, 0, 0)));
76  }
77  } break;
78  default:
79  SETERRQ(PETSC_COMM_SELF, MOFEM_NOT_IMPLEMENTED,
80  "this field is not implemented for EDGE finite element");
81  }
82 
84 }
85 
88  const EntFiniteElement &fe,
89  std::vector<EntityHandle> &adjacency) {
91  // Range nodes,edges;
92  const EntityHandle fe_ent = fe.getEnt();
93  switch (field.getSpace()) {
94  case H1:
95  CHKERR moab.get_connectivity(&fe_ent, 1, adjacency, true);
96  case HCURL:
97  CHKERR moab.get_adjacencies(&fe_ent, 1, 1, false, adjacency,
98  moab::Interface::UNION);
99  case HDIV:
100  case L2:
101  adjacency.push_back(fe_ent);
102  // build side table
103  for (auto ent : adjacency)
104  fe.getSideNumberPtr(ent);
105  break;
106  case NOFIELD: {
107  CHKERR moab.get_entities_by_handle(field.getMeshset(), adjacency, false);
108  for (auto ent : adjacency) {
109  const_cast<SideNumber_multiIndex &>(fe.getSideNumberTable())
110  .insert(boost::shared_ptr<SideNumber>(new SideNumber(ent, -1, 0, 0)));
111  }
112  } break;
113  default:
114  SETERRQ(PETSC_COMM_SELF, MOFEM_NOT_IMPLEMENTED,
115  "this field is not implemented for TRI finite element");
116  }
117 
119 }
120 
122  moab::Interface &moab, const Field &field, const EntFiniteElement &fe,
123  std::vector<EntityHandle> &adjacency) {
125  EntityHandle fe_ent = fe.getEnt();
126  switch (field.getSpace()) {
127  case H1:
128  CHKERR moab.get_connectivity(&fe_ent, 1, adjacency, true);
129  case HCURL:
130  CHKERR moab.get_adjacencies(&fe_ent, 1, 1, false, adjacency,
131  moab::Interface::UNION);
132  case HDIV:
133  CHKERR moab.get_adjacencies(&fe_ent, 1, 2, false, adjacency,
134  moab::Interface::UNION);
135  case L2:
136  adjacency.push_back(fe_ent);
137  // build side table
138  for (auto ent : adjacency)
139  fe.getSideNumberPtr(ent);
140  break;
141  case NOFIELD: {
142  CHKERR moab.get_entities_by_handle(field.getMeshset(), adjacency, false);
143  for (auto ent : adjacency) {
144  const_cast<SideNumber_multiIndex &>(fe.getSideNumberTable())
145  .insert(boost::shared_ptr<SideNumber>(new SideNumber(ent, -1, 0, 0)));
146  }
147  } break;
148  default:
149  SETERRQ(PETSC_COMM_SELF, MOFEM_NOT_IMPLEMENTED,
150  "this field is not implemented for TRI finite element");
151  }
152 
154 }
155 
158  const EntFiniteElement &fe,
159  std::vector<EntityHandle> &adjacency) {
161  const EntityHandle prism = fe.getEnt();
162  Range nodes;
163  // initialize side sets
164  fe.getRefElement()->getSideNumberPtr(prism);
165  EntityHandle face_side3, face_side4;
166  CHKERR moab.side_element(prism, 2, 3, face_side3);
167  CHKERR moab.side_element(prism, 2, 4, face_side4);
168  fe.getRefElement()->getSideNumberPtr(face_side3);
169  fe.getRefElement()->getSideNumberPtr(face_side4);
170  for (int qq = 0; qq < 3; qq++) {
171  EntityHandle quad = 0;
172  rval = moab.side_element(prism, 2, qq, quad);
173  if (rval != MB_SUCCESS || quad == 0)
174  continue;
175  int side_number, sense, offset;
176  rval = moab.side_number(prism, quad, side_number, sense, offset);
177  if (side_number == -1 || rval != MB_SUCCESS)
178  continue;
179  const_cast<SideNumber_multiIndex &>(fe.getSideNumberTable())
180  .insert(boost::shared_ptr<SideNumber>(
181  new SideNumber(quad, side_number, sense, offset)));
182  }
183  int ee = 0;
184  for (; ee < 3; ee++) {
185  EntityHandle edge = 0;
186  CHKERR moab.side_element(prism, 1, ee, edge);
187  boost::shared_ptr<SideNumber> side_ptr =
188  fe.getRefElement()->getSideNumberPtr(edge);
189  if (side_ptr->side_number != ee) {
190  SETERRQ2(PETSC_COMM_SELF, MOFEM_DATA_INCONSISTENCY,
191  "data inconsistency for edge %d while in FE data structure is "
192  "numbered %d.",
193  ee, side_ptr->side_number);
194  }
195  CHKERR moab.side_element(prism, 1, 6 + ee, edge);
196  side_ptr = fe.getRefElement()->getSideNumberPtr(edge);
197  if (side_ptr->side_number != ee + 6) {
198  if (side_ptr->side_number != ee) {
199  SETERRQ2(PETSC_COMM_SELF, MOFEM_DATA_INCONSISTENCY,
200  "data inconsistency for edge %d while in FE data structure "
201  "is numbered %d.",
202  ee, side_ptr->side_number);
203  } else {
204  side_ptr->brother_side_number = ee + 6;
205  }
206  }
207  }
208  for (; ee < 6; ee++) {
209  EntityHandle edge = 0;
210  rval = moab.side_element(prism, 1, ee, edge);
211  if (rval != MB_SUCCESS || edge == 0)
212  continue;
213  int side_number, sense, offset;
214  rval = moab.side_number(prism, edge, side_number, sense, offset);
215  if (side_number == -1 || rval != MB_SUCCESS)
216  continue;
217  const_cast<SideNumber_multiIndex &>(fe.getSideNumberTable())
218  .insert(boost::shared_ptr<SideNumber>(
219  new SideNumber(edge, side_number, sense, offset)));
220  }
221  int nn = 0;
222  for (; nn < 3; nn++) {
223  EntityHandle node;
224  CHKERR moab.side_element(prism, 0, nn, node);
225  boost::shared_ptr<SideNumber> side_ptr =
226  fe.getRefElement()->getSideNumberPtr(node);
227  if (side_ptr->side_number != nn) {
228  SETERRQ2(PETSC_COMM_SELF, MOFEM_DATA_INCONSISTENCY,
229  "data inconsistency for node %d while in FE datastructure is "
230  "numbered %d.",
231  nn, side_ptr->side_number);
232  }
233  CHKERR moab.side_element(prism, 0, nn + 3, node);
234  side_ptr = fe.getRefElement()->getSideNumberPtr(node);
235  if (side_ptr->side_number != nn + 3) {
236  if (side_ptr->side_number != nn) {
237  SETERRQ2(PETSC_COMM_SELF, MOFEM_DATA_INCONSISTENCY,
238  "data inconsistency for node %d while in FE datastructure is "
239  "numbered %d.",
240  nn, side_ptr->side_number);
241  } else {
242  side_ptr->brother_side_number = nn + 3;
243  }
244  }
245  }
246 
247  // get adjacencies
248  SideNumber_multiIndex &side_table = fe.getRefElement()->getSideNumberTable();
249  switch (field.getSpace()) {
250  case H1:
251  // moab.get_connectivity(&prism,1,nodes,true);
252  // use get adjacencies, this will allow take in account adjacencies set user
253  CHKERR moab.get_adjacencies(&prism, 1, 0, false, nodes,
254  moab::Interface::UNION);
255  {
256  Range topo_nodes;
257  CHKERR moab.get_connectivity(&prism, 1, topo_nodes, true);
258  Range mid_nodes;
259  CHKERR moab.get_connectivity(&prism, 1, mid_nodes, false);
260  mid_nodes = subtract(mid_nodes, topo_nodes);
261  nodes = subtract(nodes, mid_nodes);
262  }
263  adjacency.insert(adjacency.end(), nodes.begin(), nodes.end());
264  case HCURL: {
265  auto siit = side_table.get<0>().lower_bound(get_id_for_min_type<MBEDGE>());
266  auto hi_siit =
267  side_table.get<0>().upper_bound(get_id_for_max_type<MBEDGE>());
268  for (; siit != hi_siit; siit++)
269  adjacency.push_back(siit->get()->ent);
270  }
271  case HDIV: {
272  auto siit = side_table.get<0>().lower_bound(get_id_for_min_type<MBTRI>());
273  auto hi_siit =
274  side_table.get<0>().upper_bound(get_id_for_max_type<MBQUAD>());
275  for (; siit != hi_siit; siit++)
276  adjacency.push_back(siit->get()->ent);
277  }
278  case L2:
279  adjacency.push_back(prism);
280  break;
281  case NOFIELD: {
282  CHKERR moab.get_entities_by_handle(field.getMeshset(), adjacency, false);
283  for (auto ent : adjacency) {
284  const_cast<SideNumber_multiIndex &>(fe.getSideNumberTable())
285  .insert(boost::shared_ptr<SideNumber>(new SideNumber(ent, -1, 0, 0)));
286  }
287  } break;
288  default:
289  SETERRQ(PETSC_COMM_SELF, MOFEM_NOT_IMPLEMENTED,
290  "this field is not implemented for TRI finite element");
291  }
293 }
294 
296  moab::Interface &moab, const Field &field, const EntFiniteElement &fe,
297  std::vector<EntityHandle> &adjacency) {
299  EntityHandle fe_ent = fe.getEnt();
300  // resolve recursively all ents in the meshset
301  switch (field.getSpace()) {
302  case H1:
303  CHKERR moab.get_entities_by_type(fe_ent, MBVERTEX, adjacency, true);
304  case HCURL:
305  CHKERR moab.get_entities_by_type(fe_ent, MBEDGE, adjacency, true);
306  case HDIV:
307  CHKERR moab.get_entities_by_dimension(fe_ent, 2, adjacency, true);
308  case L2:
309  CHKERR moab.get_entities_by_dimension(fe_ent, 3, adjacency, true);
310  case NOFIELD: {
311  CHKERR moab.get_entities_by_handle(field.getMeshset(), adjacency, false);
312  for (auto ent : adjacency) {
313  const_cast<SideNumber_multiIndex &>(fe.getSideNumberTable())
314  .insert(boost::shared_ptr<SideNumber>(new SideNumber(ent, -1, 0, 0)));
315  }
316  } break;
317  default:
318  SETERRQ(PETSC_COMM_SELF, MOFEM_NOT_IMPLEMENTED, "not implemented");
319  }
321 }
322 
323 // FiniteElement
325  : meshset(_meshset) {
326  Tag th_FEId;
327  CHK_MOAB_THROW(moab.tag_get_handle("_FEId", th_FEId), "get tag");
329  moab.tag_get_by_ptr(th_FEId, &meshset, 1, (const void **)&tagId),
330  "get tag data");
331  Tag th_FEName;
332  CHK_MOAB_THROW(moab.tag_get_handle("_FEName", th_FEName), "get tag");
333  CHK_MOAB_THROW(moab.tag_get_by_ptr(th_FEName, &meshset, 1,
334  (const void **)&tagName, &tagNameSize),
335  "get tag data");
336  Tag th_FEIdCol, th_FEIdRow, th_FEIdData;
337  CHK_MOAB_THROW(moab.tag_get_handle("_FEIdCol", th_FEIdCol), "get_tag");
338  CHK_MOAB_THROW(moab.tag_get_by_ptr(th_FEIdCol, &meshset, 1,
339  (const void **)&tag_BitFieldId_col_data),
340  "get tag data");
341  CHK_MOAB_THROW(moab.tag_get_handle("_FEIdRow", th_FEIdRow), "get tag");
342  CHK_MOAB_THROW(moab.tag_get_by_ptr(th_FEIdRow, &meshset, 1,
343  (const void **)&tag_BitFieldId_row_data),
344  "get tag data");
345  CHK_MOAB_THROW(moab.tag_get_handle("_FEIdData", th_FEIdData), "get tag");
346  CHK_MOAB_THROW(moab.tag_get_by_ptr(th_FEIdData, &meshset, 1,
347  (const void **)&tag_BitFieldId_data),
348  "get tag data");
349 
358 
359  feUId = static_cast<UId>(getBitNumber()) << ent_shift;
360 }
361 
362 std::ostream &operator<<(std::ostream &os, const FiniteElement &e) {
363  os << e.getNameRef() << " fe_id " << e.getId().to_ulong() << " f_id_row "
364  << e.getBitFieldIdRow() << " f_id_col " << e.getBitFieldIdCol()
365  << " BitFEId_data " << e.getBitFieldIdData();
366  return os;
367 }
368 
370  boost::shared_ptr<FiniteElement> &fe) {
371  *static_cast<BitFieldId *>(fe->tag_BitFieldId_col_data) |= fIdCol;
372 }
373 
375  boost::shared_ptr<FiniteElement> &fe) {
376  *static_cast<BitFieldId *>(fe->tag_BitFieldId_row_data) |= fIdRow;
377 }
378 
380  boost::shared_ptr<FiniteElement> &fe) {
381  *static_cast<BitFieldId *>(fe->tag_BitFieldId_data) |= fIdData;
382 }
383 
385  boost::shared_ptr<FiniteElement> &fe) {
386  *static_cast<BitFieldId *>(fe->tag_BitFieldId_col_data) &= fIdCol.flip();
387 }
388 
390  boost::shared_ptr<FiniteElement> &fe) {
391  *static_cast<BitFieldId *>(fe->tag_BitFieldId_row_data) &= fIdRow.flip();
392 }
393 
395  boost::shared_ptr<FiniteElement> &fe) {
396  *static_cast<BitFieldId *>(fe->tag_BitFieldId_data) &= fIdData.flip();
397 }
398 
400  boost::shared_ptr<FiniteElement> &fe) {
401  static_cast<BitFieldId *>(fe->tag_BitFieldId_col_data)->reset();
402 }
403 
405  boost::shared_ptr<FiniteElement> &fe) {
406  static_cast<BitFieldId *>(fe->tag_BitFieldId_row_data)->reset();
407 }
408 
410  boost::shared_ptr<FiniteElement> &fe) {
411  static_cast<BitFieldId *>(fe->tag_BitFieldId_data)->reset();
412 }
413 
414 // FiniteElement data
416  const boost::shared_ptr<RefElement> &ref_finite_element,
417  const boost::shared_ptr<FiniteElement> &fe_ptr)
419  ref_finite_element),
420  dataFieldEnts(new FieldEntity_vector_view()),
421  rowFieldEnts(new FieldEntity_vector_view()),
422  colFieldEnts(new FieldEntity_vector_view()) {}
423 
424 std::ostream &operator<<(std::ostream &os, const EntFiniteElement &e) {
425  os << *e.getFiniteElementPtr() << std::endl;
426  os << *e.sPtr;
427  return os;
428 }
429 
431 EntFiniteElement::getElementAdjacency(const boost::shared_ptr<Field> field_ptr,
432  std::vector<EntityHandle> &adjacency) {
433  moab::Interface &moab = getRefEntityPtr()->getBasicDataPtr()->moab;
435  const EntFiniteElement *this_fe_ptr = this;
436  if (getFiniteElementPtr()->elementAdjacencyTable[getEntType()] == NULL)
437  SETERRQ(PETSC_COMM_SELF, MOFEM_NOT_IMPLEMENTED, "not implemented");
438  CHKERR getFiniteElementPtr()->elementAdjacencyTable[getEntType()](
439  moab, *field_ptr, *this_fe_ptr, adjacency);
441 }
442 
443 /**
444  * \Construct indexed finite element
445  */
447  const boost::shared_ptr<EntFiniteElement> &sptr)
448  : interface_EntFiniteElement<EntFiniteElement>(sptr), part(-1){};
449 
450 boost::weak_ptr<FENumeredDofEntity>
452  auto comp = [idx](const auto &a) { return a->getPetscGlobalDofIdx() == idx; };
453 
454  for (auto &it : getRowFieldEnts()) {
455  if (auto e = it.lock()) {
456  if (auto cache = e->entityCacheColDofs.lock()) {
457  auto dit = std::find_if(cache->loHi[0], cache->loHi[1], comp);
458  if (dit != cache->loHi[1])
459  return boost::reinterpret_pointer_cast<FENumeredDofEntity>(*dit);
460  } else
461  THROW_MESSAGE("Cache not set");
462  }
463  }
464 
465  return boost::weak_ptr<FENumeredDofEntity>();
466 }
467 
468 boost::weak_ptr<FENumeredDofEntity>
470 
471  auto comp = [idx](const auto &a) { return a->getPetscGlobalDofIdx() == idx; };
472 
473  for (auto &it : getColFieldEnts()) {
474  if (auto e = it.lock()) {
475  if (auto cache = e->entityCacheColDofs.lock()) {
476  auto dit = std::find_if(cache->loHi[0], cache->loHi[1], comp);
477  if (dit != cache->loHi[1])
478  return boost::reinterpret_pointer_cast<FENumeredDofEntity>(*dit);
479  } else
480  THROW_MESSAGE("Cache not set");
481  }
482  }
483 
484  return boost::weak_ptr<FENumeredDofEntity>();
485 }
486 
487 std::ostream &operator<<(std::ostream &os, const NumeredEntFiniteElement &e) {
488  os << "part " << e.part << " " << *(e.getEntFiniteElement());
489  return os;
490 }
491 
492 template <typename ENTSVIEW, typename DOFSVIEW, typename EXTRACTOR,
493  typename INSERTER>
494 inline static MoFEMErrorCode
495 get_cache_data_dofs_view(ENTSVIEW &ents_view, DOFSVIEW &dofs_view,
496  EXTRACTOR &&extractor, INSERTER &&inserter) {
498 
499  auto hint = dofs_view->end();
500  using ValType = typename std::remove_reference<decltype(**hint)>::type;
501 
502  for (auto &it : *ents_view) {
503  if (auto e = it.lock()) {
504 
505  if (auto cache = extractor(e).lock())
506  for (auto dit = cache->loHi[0]; dit != cache->loHi[1]; ++dit)
507  hint = inserter(dofs_view, hint,
508  boost::reinterpret_pointer_cast<ValType>(*dit));
509  else
510  SETERRQ(PETSC_COMM_SELF, MOFEM_DATA_INCONSISTENCY, "Cache not set");
511  }
512  }
513 
515 }
516 
517 boost::shared_ptr<FEDofEntity_multiIndex>
520  struct Extractor {
521  boost::weak_ptr<EntityCacheDofs>
522  operator()(boost::shared_ptr<FieldEntity> &e) {
523  return e->entityCacheDataDofs;
524  }
525  };
526 
527  struct Inserter {
528  FEDofEntity_multiIndex::iterator
529  operator()(boost::shared_ptr<FEDofEntity_multiIndex> &dofs_view,
530  FEDofEntity_multiIndex::iterator &hint,
531  boost::shared_ptr<FEDofEntity> &&dof) {
532  return dofs_view->emplace_hint(hint, dof);
533  }
534  };
535 
536  auto data_dofs = boost::make_shared<FEDofEntity_multiIndex>();
537  if (get_cache_data_dofs_view(dataFieldEnts, data_dofs, Extractor(),
538  Inserter()))
539  THROW_MESSAGE("data_dofs can not be created");
540  return data_dofs;
541 };
542 
543 boost::shared_ptr<std::vector<boost::shared_ptr<FEDofEntity>>>
546 
547  struct Extractor {
548  boost::weak_ptr<EntityCacheDofs>
549  operator()(boost::shared_ptr<FieldEntity> &e) {
550  return e->entityCacheDataDofs;
551  }
552  };
553 
554  struct Inserter {
555  using Vec = std::vector<boost::shared_ptr<FEDofEntity>>;
556  using It = Vec::iterator;
557  It operator()(boost::shared_ptr<Vec> &dofs_view, It &hint,
558  boost::shared_ptr<FEDofEntity> &&dof) {
559  dofs_view->emplace_back(dof);
560  return dofs_view->end();
561  }
562  };
563 
564  auto data_vector_dofs =
565  boost::make_shared<std::vector<boost::shared_ptr<FEDofEntity>>>();
566  if (get_cache_data_dofs_view(dataFieldEnts, data_vector_dofs, Extractor(),
567  Inserter()))
568  THROW_MESSAGE("dataDofs can not be created");
569 
570  return data_vector_dofs;
571 };
572 
573 boost::shared_ptr<FENumeredDofEntity_multiIndex>
576 
577  struct Extractor {
578  boost::weak_ptr<EntityCacheNumeredDofs>
579  operator()(boost::shared_ptr<FieldEntity> &e) {
580  return e->entityCacheRowDofs;
581  }
582  };
583 
584  struct Inserter {
585  using Idx = FENumeredDofEntity_multiIndex;
586  using It = Idx::iterator;
587  It operator()(boost::shared_ptr<Idx> &dofs_view, It &hint,
588  boost::shared_ptr<FENumeredDofEntity> &&dof) {
589  return dofs_view->emplace_hint(hint, dof);
590  }
591  };
592 
593  auto row_dofs = boost::make_shared<FENumeredDofEntity_multiIndex>();
594  if (get_cache_data_dofs_view(getRowFieldEntsPtr(), row_dofs, Extractor(),
595  Inserter()))
596  THROW_MESSAGE("row_dofs can not be created");
597 
598  return row_dofs;
599 }
600 
601 boost::shared_ptr<FENumeredDofEntity_multiIndex>
604 
605  struct Extractor {
606  boost::weak_ptr<EntityCacheNumeredDofs>
607  operator()(boost::shared_ptr<FieldEntity> &e) {
608  return e->entityCacheColDofs;
609  }
610  };
611 
612  struct Inserter {
613  using Idx = FENumeredDofEntity_multiIndex;
614  using It = Idx::iterator;
615  It operator()(boost::shared_ptr<Idx> &dofs_view, It &hint,
616  boost::shared_ptr<FENumeredDofEntity> &&dof) {
617  return dofs_view->emplace_hint(hint, dof);
618  }
619  };
620 
621  auto col_dofs = boost::make_shared<FENumeredDofEntity_multiIndex>();
622  if (get_cache_data_dofs_view(getColFieldEntsPtr(), col_dofs, Extractor(),
623  Inserter()))
624  THROW_MESSAGE("col_dofs can not be created");
625 
626  return col_dofs;
627 }
628 
629 } // namespace MoFEM
MoFEMFunctionReturnHot
#define MoFEMFunctionReturnHot(a)
Last executable line of each PETSc function used for error handling. Replaces return()
Definition: definitions.h:460
CHK_MOAB_THROW
#define CHK_MOAB_THROW(err, msg)
Check error code of MoAB function and throw MoFEM exception.
Definition: definitions.h:589
MoFEM::operator<<
std::ostream & operator<<(std::ostream &os, const EntitiesFieldData::EntData &e)
Definition: EntitiesFieldData.cpp:240
MoFEM::NumeredEntFiniteElement::getColDofsPtr
boost::shared_ptr< FENumeredDofEntity_multiIndex > getColDofsPtr() const
get FE dof on column
Definition: FEMultiIndices.cpp:602
MoFEM::FiniteElement_row_change_bit_add::operator()
void operator()(boost::shared_ptr< FiniteElement > &fe)
Definition: FEMultiIndices.cpp:374
H1
@ H1
continuous field
Definition: definitions.h:85
MoFEM::interface_RefElement::getSideNumberPtr
const boost::shared_ptr< SideNumber > & getSideNumberPtr(const EntityHandle ent) const
Definition: RefElementMultiIndices.hpp:153
MoFEM::FiniteElement_change_bit_off::fIdData
BitFieldId fIdData
Definition: FEMultiIndices.hpp:933
EntityHandle
MoFEM::interface_RefElement< RefElement >::getRefEntityPtr
boost::shared_ptr< RefEntity > & getRefEntityPtr() const
Definition: RefElementMultiIndices.hpp:157
MoFEM::EntFiniteElement::getDataVectorDofsPtr
boost::shared_ptr< std::vector< boost::shared_ptr< FEDofEntity > > > getDataVectorDofsPtr() const
Get data data dos multi-index structure.
Definition: FEMultiIndices.cpp:544
MoFEM::FiniteElement::getId
BitFEId getId() const
Get finite element id.
Definition: FEMultiIndices.hpp:50
MoFEM::Field::getMeshset
EntityHandle getMeshset() const
Get field meshset.
Definition: FieldMultiIndices.hpp:123
L2
@ L2
field with C-1 continuity
Definition: definitions.h:88
MoFEM::FiniteElement_col_change_bit_add::operator()
void operator()(boost::shared_ptr< FiniteElement > &fe)
Definition: FEMultiIndices.cpp:369
MoFEM::Exceptions::MoFEMErrorCode
PetscErrorCode MoFEMErrorCode
MoFEM/PETSc error code.
Definition: Exceptions.hpp:56
MoFEM::Field::getSpace
FieldSpace getSpace() const
Get field approximation space.
Definition: FieldMultiIndices.hpp:151
MoFEM::FieldEntity_vector_view
std::vector< boost::weak_ptr< FieldEntity > > FieldEntity_vector_view
Definition: FieldEntsMultiIndices.hpp:478
MoFEM::DefaultElementAdjacency::defaultEdge
static MoFEMErrorCode defaultEdge(Interface &moab, const Field &field, const EntFiniteElement &fe, std::vector< EntityHandle > &adjacency)
Definition: FEMultiIndices.cpp:55
MoFEM::FiniteElement::elementAdjacencyTable
std::array< ElementAdjacencyFunct, MBMAXTYPE > elementAdjacencyTable
Table of functions retrieving adjacencies for finite element User can alter and change default behavi...
Definition: FEMultiIndices.hpp:114
MoFEM::interface_RefEntity::sPtr
boost::shared_ptr< T > sPtr
Definition: RefEntsMultiIndices.hpp:711
MoFEM::Types::BitFieldId
std::bitset< BITFIELDID_SIZE > BitFieldId
Field Id.
Definition: Types.hpp:42
MoFEM::FiniteElement::getNameRef
boost::string_ref getNameRef() const
Get finite element name.
Definition: FEMultiIndices.hpp:62
MoFEM::interface_RefEntity::getEnt
EntityHandle getEnt() const
Get the entity handle.
Definition: RefEntsMultiIndices.hpp:603
MoFEM::EntFiniteElement::getDataDofsPtr
boost::shared_ptr< FEDofEntity_multiIndex > getDataDofsPtr() const
Get the Data Dofs Ptr object.
Definition: FEMultiIndices.cpp:518
MoFEM::EntFiniteElement
Finite element data for entity.
Definition: FEMultiIndices.hpp:501
MoFEM::FiniteElement::tagId
BitFEId * tagId
ptr to tag storing FE id
Definition: FEMultiIndices.hpp:29
MoFEM::FiniteElement_row_change_bit_add::fIdRow
BitFieldId fIdRow
Definition: FEMultiIndices.hpp:885
MoFEM::interface_RefElement::getSideNumberTable
SideNumber_multiIndex & getSideNumberTable() const
Definition: RefElementMultiIndices.hpp:148
THROW_MESSAGE
#define THROW_MESSAGE(msg)
Throw MoFEM exception.
Definition: definitions.h:574
MoFEM::Field
Provide data structure for (tensor) field approximation.
Definition: FieldMultiIndices.hpp:51
MoFEM::FiniteElement_col_change_bit_off::operator()
void operator()(boost::shared_ptr< FiniteElement > &fe)
Definition: FEMultiIndices.cpp:384
MoFEM::FiniteElement::tag_BitFieldId_row_data
BitFieldId * tag_BitFieldId_row_data
tag stores row id_id for fields
Definition: FEMultiIndices.hpp:33
MoFEM::DefaultElementAdjacency::defVertexTypeMap
static constexpr DefEntTypeMap defVertexTypeMap
Definition: FEMultiIndices.hpp:151
MoFEM::Interface
DeprecatedCoreInterface Interface
Definition: Interface.hpp:2010
MoFEM::DefaultElementAdjacency::defTypeMap
static constexpr std::array< const DefEntTypeMap *, MBMAXTYPE > defTypeMap
Definition: FEMultiIndices.hpp:287
MoFEM::Exceptions::rval
static MoFEMErrorCodeGeneric< moab::ErrorCode > rval
Definition: Exceptions.hpp:74
MoFEM::DefaultElementAdjacency::defaultPrism
static MoFEMErrorCode defaultPrism(Interface &moab, const Field &field, const EntFiniteElement &fe, std::vector< EntityHandle > &adjacency)
Definition: FEMultiIndices.cpp:157
MoFEM::FiniteElement::meshset
EntityHandle meshset
meshset stores FE ents
Definition: FEMultiIndices.hpp:28
MoFEM::interface_EntFiniteElement< EntFiniteElement >::getRowFieldEntsPtr
boost::shared_ptr< FieldEntity_vector_view > & getRowFieldEntsPtr() const
Definition: FEMultiIndices.hpp:686
CHKERR
#define CHKERR
Inline error check.
Definition: definitions.h:548
MoFEM::NumeredEntFiniteElement::getColDofsByPetscGlobalDofIdx
boost::weak_ptr< FENumeredDofEntity > getColDofsByPetscGlobalDofIdx(const int idx) const
get FE dof by petsc index
Definition: FEMultiIndices.cpp:469
MoFEM::DefaultElementAdjacency::defEdgeTypeMap
static constexpr DefEntTypeMap defEdgeTypeMap
Definition: FEMultiIndices.hpp:168
MoFEM::NumeredEntFiniteElement::getEntFiniteElement
boost::shared_ptr< EntFiniteElement > & getEntFiniteElement() const
Definition: FEMultiIndices.hpp:740
MoFEM::FiniteElement_change_bit_reset::operator()
void operator()(boost::shared_ptr< FiniteElement > &fe)
Definition: FEMultiIndices.cpp:409
MoFEM
implementation of Data Operators for Forces and Sources
Definition: Common.hpp:10
a
constexpr double a
Definition: approx_sphere.cpp:30
MoFEM::DefaultElementAdjacency::defaultVertex
static MoFEMErrorCode defaultVertex(Interface &moab, const Field &field, const EntFiniteElement &fe, std::vector< EntityHandle > &adjacency)
Definition: FEMultiIndices.cpp:28
MoFEM::NumeredEntFiniteElement::getRowDofsPtr
boost::shared_ptr< FENumeredDofEntity_multiIndex > getRowDofsPtr() const
get FE dof on row
Definition: FEMultiIndices.cpp:574
MoFEM::FiniteElement_row_change_bit_off::operator()
void operator()(boost::shared_ptr< FiniteElement > &fe)
Definition: FEMultiIndices.cpp:389
MoFEM::DefaultElementAdjacency::defaultMeshset
static MoFEMErrorCode defaultMeshset(Interface &moab, const Field &field, const EntFiniteElement &fe, std::vector< EntityHandle > &adjacency)
Definition: FEMultiIndices.cpp:295
MoFEM::Types::UId
uint128_t UId
Unique Id.
Definition: Types.hpp:31
MoFEM::FiniteElement::feUId
UId feUId
Definition: FEMultiIndices.hpp:35
MoFEM::interface_FiniteElement::getFiniteElementPtr
boost::shared_ptr< FE > & getFiniteElementPtr() const
Definition: FEMultiIndices.hpp:396
convert.type
type
Definition: convert.py:64
MoFEM::interface_EntFiniteElement< EntFiniteElement >::getRefElement
const boost::shared_ptr< RefElement > & getRefElement() const
Definition: FEMultiIndices.hpp:714
SideNumber_multiIndex
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.
Definition: RefEntsMultiIndices.hpp:101
MoFEM::FiniteElement_change_bit_add::operator()
void operator()(boost::shared_ptr< FiniteElement > &fe)
Definition: FEMultiIndices.cpp:379
MoFEM::DefaultElementAdjacency::defaultVolume
static MoFEMErrorCode defaultVolume(Interface &moab, const Field &field, const EntFiniteElement &fe, std::vector< EntityHandle > &adjacency)
Definition: FEMultiIndices.cpp:121
MoFEM::FiniteElement::ent_shift
static constexpr int ent_shift
Definition: FEMultiIndices.hpp:122
MoFEM::FiniteElement::getBitNumber
unsigned int getBitNumber() const
Get bit identifying this element.
Definition: FEMultiIndices.hpp:106
MoFEM::NumeredEntFiniteElement::part
unsigned int part
Partition number.
Definition: FEMultiIndices.hpp:738
MoFEM::FiniteElement_row_change_bit_off::fIdRow
BitFieldId fIdRow
Definition: FEMultiIndices.hpp:921
MoFEM::FiniteElement_col_change_bit_off::fIdCol
BitFieldId fIdCol
Definition: FEMultiIndices.hpp:909
MoFEM::FiniteElement::tag_BitFieldId_col_data
BitFieldId * tag_BitFieldId_col_data
tag stores col id_id for fields
Definition: FEMultiIndices.hpp:32
MoFEM::FiniteElement::tagNameSize
int tagNameSize
numer of characters in FE name
Definition: FEMultiIndices.hpp:31
MoFEM::FiniteElement::getBitFieldIdRow
BitFieldId getBitFieldIdRow() const
Get field ids on rows.
Definition: FEMultiIndices.hpp:86
MoFEM::DefaultElementAdjacency::defaultFace
static MoFEMErrorCode defaultFace(Interface &moab, const Field &field, const EntFiniteElement &fe, std::vector< EntityHandle > &adjacency)
Definition: FEMultiIndices.cpp:87
MoFEM::RefElement
keeps data about abstract refined finite element
Definition: RefElementMultiIndices.hpp:16
MoFEM::FiniteElement::tag_BitFieldId_data
BitFieldId * tag_BitFieldId_data
tag stores data id_id for fields
Definition: FEMultiIndices.hpp:34
MoFEM::FiniteElement::getBitFieldIdCol
BitFieldId getBitFieldIdCol() const
Get field ids on columns.
Definition: FEMultiIndices.hpp:78
MoFEM::interface_EntFiniteElement< EntFiniteElement >::getColFieldEnts
FieldEntity_vector_view & getColFieldEnts() const
Definition: FEMultiIndices.hpp:690
MoFEM::FiniteElement
Finite element definition.
Definition: FEMultiIndices.hpp:26
MoFEM::FiniteElement_change_bit_off::operator()
void operator()(boost::shared_ptr< FiniteElement > &fe)
Definition: FEMultiIndices.cpp:394
MoFEM::EntFiniteElement::EntFiniteElement
EntFiniteElement(const boost::shared_ptr< RefElement > &ref_finite_element, const boost::shared_ptr< FiniteElement > &fe_ptr)
Definition: FEMultiIndices.cpp:415
MoFEM::DefaultElementAdjacency::DefEntTypeMap
std::array< bool, MBMAXTYPE > DefEntTypeMap
Definition: FEMultiIndices.hpp:149
Range
MoFEM::SideNumber
keeps information about side number for the finite element
Definition: RefEntsMultiIndices.hpp:57
MoFEM::interface_EntFiniteElement< EntFiniteElement >::getColFieldEntsPtr
boost::shared_ptr< FieldEntity_vector_view > & getColFieldEntsPtr() const
Definition: FEMultiIndices.hpp:695
MoFEM::EntFiniteElement::getElementAdjacency
MoFEMErrorCode getElementAdjacency(const boost::shared_ptr< Field > field_ptr, std::vector< EntityHandle > &adjacency)
Definition: FEMultiIndices.cpp:431
MoFEM::interface_EntFiniteElement
interface to EntFiniteElement
Definition: FEMultiIndices.hpp:661
MoFEM::NumeredEntFiniteElement::getRowDofsByPetscGlobalDofIdx
boost::weak_ptr< FENumeredDofEntity > getRowDofsByPetscGlobalDofIdx(const int idx) const
get FE dof by petsc index
Definition: FEMultiIndices.cpp:451
MoFEM::FiniteElement_change_bit_add::fIdData
BitFieldId fIdData
Definition: FEMultiIndices.hpp:897
MoFEM::DefaultElementAdjacency::defHexTypeMap
static constexpr DefEntTypeMap defHexTypeMap
Definition: FEMultiIndices.hpp:236
MoFEM::DefaultElementAdjacency::defMeshsetTypeMap
static constexpr DefEntTypeMap defMeshsetTypeMap
Definition: FEMultiIndices.hpp:270
MoFEM::FiniteElement::getBitFieldIdData
BitFieldId getBitFieldIdData() const
Get field ids on data.
Definition: FEMultiIndices.hpp:94
MoFEM::FiniteElement_row_change_bit_reset::operator()
void operator()(boost::shared_ptr< FiniteElement > &fe)
Definition: FEMultiIndices.cpp:404
HCURL
@ HCURL
field with continuous tangents
Definition: definitions.h:86
EigenMatrix::Vec
const FTensor::Tensor2< T, Dim, Dim > Vec
Definition: MatrixFunction.hpp:66
MOFEM_DATA_INCONSISTENCY
@ MOFEM_DATA_INCONSISTENCY
Definition: definitions.h:31
MoFEM::DefaultElementAdjacency::defTriTypeMap
static constexpr DefEntTypeMap defTriTypeMap
Definition: FEMultiIndices.hpp:185
MoFEM::interface_RefEntity< RefElement >::getEntType
EntityType getEntType() const
Get entity type.
Definition: RefEntsMultiIndices.hpp:643
MoFEM::interface_FiniteElement
Definition: FEMultiIndices.hpp:328
MoFEM::FiniteElement_col_change_bit_reset::operator()
void operator()(boost::shared_ptr< FiniteElement > &fe)
Definition: FEMultiIndices.cpp:399
MoFEM::interface_RefElement::getRefElement
boost::shared_ptr< T > & getRefElement() const
Definition: RefElementMultiIndices.hpp:161
MoFEM::NumeredEntFiniteElement
Partitioned (Indexed) Finite Element in Problem.
Definition: FEMultiIndices.hpp:728
MoFEM::interface_EntFiniteElement< EntFiniteElement >::getRowFieldEnts
FieldEntity_vector_view & getRowFieldEnts() const
Definition: FEMultiIndices.hpp:681
MoFEMFunctionBeginHot
#define MoFEMFunctionBeginHot
First executable line of each MoFEM function, used for error handling. Final line of MoFEM functions ...
Definition: definitions.h:453
MoFEM::EntFiniteElement::dataFieldEnts
boost::shared_ptr< FieldEntity_vector_view > dataFieldEnts
Definition: FEMultiIndices.hpp:651
MoFEM::DefaultElementAdjacency::defTetTypeMap
static constexpr DefEntTypeMap defTetTypeMap
Definition: FEMultiIndices.hpp:219
MoFEM::DefaultElementAdjacency::defPrismTypeMap
static constexpr DefEntTypeMap defPrismTypeMap
Definition: FEMultiIndices.hpp:253
MoFEM::FiniteElement_col_change_bit_add::fIdCol
BitFieldId fIdCol
Definition: FEMultiIndices.hpp:873
MoFEM::get_cache_data_dofs_view
static MoFEMErrorCode get_cache_data_dofs_view(ENTSVIEW &ents_view, DOFSVIEW &dofs_view, EXTRACTOR &&extractor, INSERTER &&inserter)
Definition: FEMultiIndices.cpp:495
FENumeredDofEntity_multiIndex
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.
Definition: DofsMultiIndices.hpp:417
MoFEM::NumeredEntFiniteElement::NumeredEntFiniteElement
NumeredEntFiniteElement(const boost::shared_ptr< EntFiniteElement > &sptr)
Definition: FEMultiIndices.cpp:446
MoFEMFunctionReturn
#define MoFEMFunctionReturn(a)
Last executable line of each PETSc function used for error handling. Replaces return()
Definition: definitions.h:429
HDIV
@ HDIV
field with continuous normal traction
Definition: definitions.h:87
MOFEM_NOT_IMPLEMENTED
@ MOFEM_NOT_IMPLEMENTED
Definition: definitions.h:32
MoFEM::RefEntityTmp
Definition: RefEntsMultiIndices.hpp:118
MoFEM::FiniteElement::tagName
void * tagName
ptr to tag storing FE name
Definition: FEMultiIndices.hpp:30
MoFEMFunctionBegin
#define MoFEMFunctionBegin
First executable line of each MoFEM function, used for error handling. Final line of MoFEM functions ...
Definition: definitions.h:359
MoFEM::FiniteElement::FiniteElement
FiniteElement(Interface &moab, const EntityHandle _meshset)
Definition: FEMultiIndices.cpp:324
NOFIELD
@ NOFIELD
scalar or vector of scalars describe (no true field)
Definition: definitions.h:84
MoFEM::DefaultElementAdjacency::defQuadTypeMap
static constexpr DefEntTypeMap defQuadTypeMap
Definition: FEMultiIndices.hpp:202