v0.14.0
FieldMultiIndices.cpp
Go to the documentation of this file.
1 /** \file FieldMultiIndices.cpp
2  * \brief Multi-index containers for fields
3  */
4 
5 namespace MoFEM {
6 
7 // Not partitioned
8 const bool Idx_mi_tag::IamNotPartitioned = true;
9 
10 // This tag is used for partitioned problems
13 
14 // fields
16  : moab(moab), meshSet(meshset), tagId(NULL), tagSpaceData(NULL),
17  tagFieldContinuityData(NULL), tagNbCoeffData(NULL), tagName(NULL),
18  tagNameSize(0) {
19 
20  auto get_tag_data_ptr = [&](const auto name, auto &tag_data) {
22  Tag th;
23  CHKERR moab.tag_get_handle(name, th);
24  CHKERR moab.tag_get_by_ptr(th, &meshset, 1, (const void **)&tag_data);
26  };
27 
28  // id
29  ierr = get_tag_data_ptr("_FieldId", tagId);
30  CHKERRABORT(PETSC_COMM_SELF, ierr);
31  // space
32  ierr = get_tag_data_ptr("_FieldSpace", tagSpaceData);
33  CHKERRABORT(PETSC_COMM_SELF, ierr);
34  // continuity
35  ierr = get_tag_data_ptr("_FieldContinuity", tagFieldContinuityData);
36  CHKERRABORT(PETSC_COMM_SELF, ierr);
37 
38  // approx. base
39  ierr = get_tag_data_ptr("_FieldBase", tagBaseData);
40  CHKERRABORT(PETSC_COMM_SELF, ierr);
41 
42  // name
43  Tag th_field_name;
44  CHKERR moab.tag_get_handle("_FieldName", th_field_name);
45  CHKERR moab.tag_get_by_ptr(th_field_name, &meshSet, 1,
46  (const void **)&tagName, &tagNameSize);
47  // name prefix
48  Tag th_field_name_data_name_prefix;
49  CHKERR moab.tag_get_handle("_FieldName_DataNamePrefix",
50  th_field_name_data_name_prefix);
51  CHKERR moab.tag_get_by_ptr(th_field_name_data_name_prefix, &meshSet, 1,
52  (const void **)&tagNamePrefixData,
54  std::string name_data_prefix((char *)tagNamePrefixData, tagNamePrefixSize);
55 
56  // rank
57  std::string Tag_rank_name = "_Field_Rank_" + getName();
58  CHKERR moab.tag_get_handle(Tag_rank_name.c_str(), th_FieldRank);
59  CHKERR moab.tag_get_by_ptr(th_FieldRank, &meshSet, 1,
60  (const void **)&tagNbCoeffData);
61 
62  auto get_all_tags = [&]() {
64  // order
65  ApproximationOrder def_approx_order = -1;
66  std::string tag_approximation_order_name = "_App_Order_" + getName();
67  rval = moab.tag_get_handle(tag_approximation_order_name.c_str(), 1,
68  MB_TYPE_INTEGER, th_AppOrder,
69  MB_TAG_CREAT | MB_TAG_SPARSE, &def_approx_order);
70  if (rval == MB_ALREADY_ALLOCATED)
71  rval = MB_SUCCESS;
73 
74  // data
75  std::string tag_data_name = name_data_prefix + getName();
76  const int def_len = 0;
77  rval = moab.tag_get_handle(
78  tag_data_name.c_str(), def_len, MB_TYPE_DOUBLE, th_FieldData,
79  MB_TAG_CREAT | MB_TAG_VARLEN | MB_TAG_SPARSE, NULL);
80  if (rval == MB_ALREADY_ALLOCATED)
81  rval = MB_SUCCESS;
83 
84  std::string tag_data_name_verts = name_data_prefix + getName() + "_V";
85  rval = moab.tag_get_handle(tag_data_name_verts.c_str(), th_FieldDataVerts);
86  if (rval == MB_SUCCESS)
88  else {
89  // Since vertex tag is not it mesh that tag is not dense, it is sparse,
90  // sinc it is set to all vertices on the mesh. Is unlikely that mesh has
91  // no vertices, then above assumption does not hold.
92  tagFieldDataVertsType = MB_TAG_SPARSE;
93  VectorDouble def_vert_data(*tagNbCoeffData);
94  def_vert_data.clear();
95  rval = moab.tag_get_handle(tag_data_name_verts.c_str(), *tagNbCoeffData,
96  MB_TYPE_DOUBLE, th_FieldDataVerts,
97  MB_TAG_CREAT | tagFieldDataVertsType,
98  &*def_vert_data.begin());
99  if (rval == MB_ALREADY_ALLOCATED)
100  rval = MB_SUCCESS;
101  MOAB_THROW(rval);
102  }
103 
105  };
106 
107  auto get_all_tags_deprecated = [&]() {
109  // order
110  ApproximationOrder def_approx_order = -1;
111  std::string tag_approximation_order_name = "_App_Order_" + getName();
112  rval = moab.tag_get_handle(tag_approximation_order_name.c_str(), 1,
113  MB_TYPE_INTEGER, th_AppOrder,
114  MB_TAG_CREAT | MB_TAG_SPARSE, &def_approx_order);
115  if (rval == MB_ALREADY_ALLOCATED)
116  rval = MB_SUCCESS;
117  MOAB_THROW(rval);
118 
119  // data
120  std::string tag_data_name = name_data_prefix + getName();
121  const int def_len = 0;
122  rval = moab.tag_get_handle(
123  tag_data_name.c_str(), def_len, MB_TYPE_DOUBLE, th_FieldData,
124  MB_TAG_CREAT | MB_TAG_VARLEN | MB_TAG_SPARSE, NULL);
125  if (rval == MB_ALREADY_ALLOCATED)
126  rval = MB_SUCCESS;
127  MOAB_THROW(rval);
128 
129  std::string tag_data_name_verts = name_data_prefix + getName() + "V";
130  rval = moab.tag_get_handle(tag_data_name_verts.c_str(), th_FieldDataVerts);
131  if (rval == MB_SUCCESS)
133  else {
134  // Since vertex tag is not it mesh that tag is not dense, it is sparse,
135  // sinc it is set to all vertices on the mesh. Is unlikely that mesh has
136  // no vertices, then above assumption does not hold.
137  tagFieldDataVertsType = MB_TAG_SPARSE;
138  VectorDouble def_vert_data(*tagNbCoeffData);
139  def_vert_data.clear();
140  rval = moab.tag_get_handle(tag_data_name_verts.c_str(), *tagNbCoeffData,
141  MB_TYPE_DOUBLE, th_FieldDataVerts,
142  MB_TAG_CREAT | tagFieldDataVertsType,
143  &*def_vert_data.begin());
144  if (rval == MB_ALREADY_ALLOCATED)
145  rval = MB_SUCCESS;
146  MOAB_THROW(rval);
147  }
148 
150  };
151 
152  Version file_ver;
154  CHK_THROW_MESSAGE(ierr, "Not known file version");
155  if (file_ver.majorVersion >= 0 && file_ver.minorVersion >= 12 &&
156  file_ver.buildVersion >= 1) {
157  ierr = get_all_tags();
158  CHKERRABORT(PETSC_COMM_SELF, ierr);
159  } else {
160  ierr = get_all_tags_deprecated();
161  CHKERRABORT(PETSC_COMM_SELF, ierr);
162  }
163 
165 
166  auto reset_entity_order_table = [&]() {
167  for (int tt = 0; tt != MBMAXTYPE; ++tt)
168  forderTable[tt] = NULL;
169  };
170 
171  auto set_continuos_entity_order_table = [&]() {
172  switch (*tagBaseData) {
175  switch (*tagSpaceData) {
176  case H1:
177  forderTable[MBVERTEX] = [](int P) -> int { return (P > 0) ? 1 : 0; };
178  forderTable[MBEDGE] = [](int P) -> int { return NBEDGE_H1(P); };
179  forderTable[MBTRI] = [](int P) -> int { return NBFACETRI_H1(P); };
180  forderTable[MBQUAD] = [](int P) -> int { return NBFACEQUAD_H1(P); };
181  forderTable[MBTET] = [](int P) -> int { return NBVOLUMETET_H1(P); };
182  forderTable[MBHEX] = [](int P) -> int { return NBVOLUMEHEX_H1(P); };
183  forderTable[MBPRISM] = [](int P) -> int { return NBVOLUMEPRISM_H1(P); };
184  break;
185  case HCURL:
186  forderTable[MBVERTEX] = [](int P) -> int {
187  (void)P;
188  return 0;
189  };
190  forderTable[MBEDGE] = [](int P) -> int {
191  return NBEDGE_AINSWORTH_HCURL(P);
192  };
193  forderTable[MBTRI] = [](int P) -> int {
195  };
196  forderTable[MBTET] = [](int P) -> int {
198  };
199  break;
200  case HDIV:
201  forderTable[MBVERTEX] = [](int P) -> int {
202  (void)P;
203  return 0;
204  };
205  forderTable[MBEDGE] = [](int P) -> int {
206  (void)P;
207  return NBEDGE_HDIV(P);
208  };
209  forderTable[MBTRI] = [](int P) -> int {
210  return NBFACETRI_AINSWORTH_HDIV(P);
211  };
212  forderTable[MBTET] = [](int P) -> int {
214  };
215  break;
216  case L2:
217  forderTable[MBVERTEX] = [](int P) -> int {
218  (void)P;
219  return 1;
220  };
221  forderTable[MBEDGE] = [](int P) -> int { return NBEDGE_L2(P); };
222  forderTable[MBTRI] = [](int P) -> int { return NBFACETRI_L2(P); };
223  forderTable[MBQUAD] = [](int P) -> int { return NBFACEQUAD_L2(P); };
224  forderTable[MBTET] = [](int P) -> int { return NBVOLUMETET_L2(P); };
225  forderTable[MBHEX] = [](int P) -> int { return NBVOLUMEHEX_L2(P); };
226  break;
227  default:
228  THROW_MESSAGE("unknown approximation space");
229  }
230  break;
232  switch (*tagSpaceData) {
233  case H1:
234  forderTable[MBVERTEX] = [](int P) -> int { return (P > 0) ? 1 : 0; };
235  forderTable[MBEDGE] = [](int P) -> int { return NBEDGE_H1(P); };
236  forderTable[MBTRI] = [](int P) -> int { return NBFACETRI_H1(P); };
237  forderTable[MBQUAD] = [](int P) -> int { return NBFACEQUAD_H1(P); };
238  forderTable[MBTET] = [](int P) -> int { return NBVOLUMETET_H1(P); };
239  forderTable[MBPRISM] = [](int P) -> int { return NBVOLUMEPRISM_H1(P); };
240  break;
241  case L2:
242  forderTable[MBVERTEX] = [](int P) -> int {
243  (void)P;
244  return 1;
245  };
246  forderTable[MBEDGE] = [](int P) -> int { return NBEDGE_L2(P); };
247  forderTable[MBTRI] = [](int P) -> int { return NBFACETRI_L2(P); };
248  forderTable[MBQUAD] = [](int P) -> int { return NBFACEQUAD_L2(P); };
249  forderTable[MBTET] = [](int P) -> int { return NBVOLUMETET_L2(P); };
250  forderTable[MBHEX] = [](int P) -> int { return NBVOLUMEHEX_L2(P); };
251  break;
252  default:
253  THROW_MESSAGE("unknown approximation space or not yet implemented");
254  }
255  break;
257  switch (*tagSpaceData) {
258  case H1:
259  forderTable[MBVERTEX] = [](int P) -> int { return (P > 0) ? 1 : 0; };
260  forderTable[MBEDGE] = [](int P) -> int { return NBEDGE_H1(P); };
261  forderTable[MBTRI] = [](int P) -> int { return NBFACETRI_H1(P); };
262  forderTable[MBQUAD] = [](int P) -> int { return NBFACEQUAD_H1(P); };
263  forderTable[MBTET] = [](int P) -> int { return NBVOLUMETET_H1(P); };
264  forderTable[MBHEX] = [](int P) -> int { return NBVOLUMEHEX_H1(P); };
265  forderTable[MBPRISM] = [](int P) -> int { return NBVOLUMEPRISM_H1(P); };
266  break;
267  case HCURL:
268  forderTable[MBVERTEX] = [](int P) -> int {
269  (void)P;
270  return 0;
271  };
272  forderTable[MBEDGE] = [](int P) -> int {
273  return NBEDGE_DEMKOWICZ_HCURL(P);
274  };
275  forderTable[MBTRI] = [](int P) -> int {
277  };
278  forderTable[MBQUAD] = [](int P) -> int {
280  };
281  forderTable[MBTET] = [](int P) -> int {
283  };
284  forderTable[MBHEX] = [](int P) -> int {
286  };
287  break;
288  case HDIV:
289  forderTable[MBVERTEX] = [](int P) -> int {
290  (void)P;
291  return 0;
292  };
293  forderTable[MBEDGE] = [](int P) -> int {
294  (void)P;
295  return 0;
296  };
297  forderTable[MBTRI] = [](int P) -> int {
298  return NBFACETRI_DEMKOWICZ_HDIV(P);
299  };
300  forderTable[MBQUAD] = [](int P) -> int {
302  };
303  forderTable[MBTET] = [](int P) -> int {
305  };
306  forderTable[MBHEX] = [](int P) -> int {
308  };
309  break;
310  case L2:
311  forderTable[MBVERTEX] = [](int P) -> int {
312  (void)P;
313  return 1;
314  };
315  forderTable[MBEDGE] = [](int P) -> int { return NBEDGE_L2(P); };
316  forderTable[MBTRI] = [](int P) -> int { return NBFACETRI_L2(P); };
317  forderTable[MBQUAD] = [](int P) -> int { return NBFACEQUAD_L2(P); };
318  forderTable[MBTET] = [](int P) -> int { return NBVOLUMETET_L2(P); };
319  forderTable[MBHEX] = [](int P) -> int { return NBVOLUMEHEX_L2(P); };
320  break;
321  default:
322  THROW_MESSAGE("unknown approximation space or not yet implemented");
323  }
324  break;
325  case USER_BASE:
326  for (int ee = 0; ee < MBMAXTYPE; ee++) {
327  forderTable[ee] = [](int P) -> int {
328  (void)P;
329  return 0;
330  };
331  }
332  break;
333  default:
334  if (*tagSpaceData != NOFIELD) {
335  THROW_MESSAGE("unknown approximation base");
336  } else {
337  for (EntityType t = MBVERTEX; t < MBMAXTYPE; t++)
338  forderTable[t] = [](int P) -> int {
339  (void)P;
340  return 1;
341  };
342  }
343  }
344  };
345 
346  auto set_discontinuous_entity_order_table = [&]() {
347  switch (*tagBaseData) {
350  switch (*tagSpaceData) {
351  case HCURL:
352  forderTable[MBVERTEX] = [](int P) -> int {
353  (void)P;
354  return 0;
355  };
356  forderTable[MBEDGE] = [](int P) -> int {
357  (void)P;
358  return 0;
359  };
360  forderTable[MBTRI] = [](int P) -> int {
362  };
363  forderTable[MBTET] = [](int P) -> int {
364  return 6 * NBEDGE_AINSWORTH_HCURL(P) +
367  };
368  break;
369  case HDIV:
370  forderTable[MBVERTEX] = [](int P) -> int {
371  (void)P;
372  return 0;
373  };
374  forderTable[MBEDGE] = [](int P) -> int {
375  (void)P;
376  return 0;
377  };
378  forderTable[MBTRI] = [](int P) -> int {
379  (void)P;
380  return 0;
381  };
382  forderTable[MBTET] = [](int P) -> int {
383  return 4 * NBFACETRI_AINSWORTH_HDIV(P) +
385  };
386  break;
387  default:
388  THROW_MESSAGE("unknown approximation space or not implemented");
389  }
390  break;
392  THROW_MESSAGE("unknown approximation space or not yet implemented");
393  break;
395  switch (*tagSpaceData) {
396  case HCURL:
397  forderTable[MBVERTEX] = [](int P) -> int {
398  (void)P;
399  return 0;
400  };
401  forderTable[MBEDGE] = [](int P) -> int {
402  (void)P;
403  return 0;
404  };
405  forderTable[MBTRI] = [](int P) -> int {
407  };
408  forderTable[MBQUAD] = [](int P) -> int {
410  };
411  forderTable[MBTET] = [](int P) -> int {
412  return 6 * NBEDGE_DEMKOWICZ_HCURL(P) +
415  };
416  forderTable[MBHEX] = [](int P) -> int {
417  return 12 * NBEDGE_DEMKOWICZ_HCURL(P) +
420  };
421  break;
422  case HDIV:
423  forderTable[MBVERTEX] = [](int P) -> int {
424  (void)P;
425  return 0;
426  };
427  forderTable[MBEDGE] = [](int P) -> int {
428  (void)P;
429  return 0;
430  };
431  forderTable[MBTRI] = [](int P) -> int {
432  (void)P;
433  return 0;
434  };
435  forderTable[MBQUAD] = [](int P) -> int {
436  (void)P;
437  return 0;
438  };
439  forderTable[MBTET] = [](int P) -> int {
440  return 4 * NBFACETRI_DEMKOWICZ_HDIV(P) +
442  };
443  forderTable[MBHEX] = [](int P) -> int {
444  return 6 * NBFACEQUAD_DEMKOWICZ_HDIV(P) +
446  };
447  break;
448  default:
449  THROW_MESSAGE("unknown approximation space or not yet implemented");
450  }
451  break;
452  case USER_BASE:
453  for (int ee = 0; ee < MBMAXTYPE; ee++) {
454  forderTable[ee] = [](int P) -> int {
455  (void)P;
456  return 0;
457  };
458  }
459  break;
460  default:
461  if (*tagSpaceData != NOFIELD) {
462  THROW_MESSAGE("unknown approximation base");
463  } else {
464  for (EntityType t = MBVERTEX; t < MBMAXTYPE; t++)
465  forderTable[t] = [](int P) -> int {
466  (void)P;
467  return 1;
468  };
469  }
470  }
471  };
472 
473  reset_entity_order_table();
474  switch (*tagFieldContinuityData) {
475  case CONTINUOUS:
476  set_continuos_entity_order_table();
477  break;
478  case DISCONTINUOUS:
479  set_discontinuous_entity_order_table();
480  break;
481  default:
482  THROW_MESSAGE("unknown field continuity");
483  break;
484  }
486  CHKERRABORT(PETSC_COMM_SELF, ierr);
487 };
488 
491 
492  for (auto t = MBVERTEX; t != MBMAXTYPE; ++t) {
493 
494  int DD = 0;
495  int nb_last_order_dofs = 0;
496  const int rank = (*tagNbCoeffData);
497  if (forderTable[t]) {
498 
499  for (int oo = 0; oo < MAX_DOFS_ON_ENTITY; ++oo) {
500 
501  const int nb_order_dofs = forderTable[t](oo);
502  const int diff_oo = nb_order_dofs - nb_last_order_dofs;
503  if (diff_oo >= 0) {
504 
505  if ((DD + rank * diff_oo) < MAX_DOFS_ON_ENTITY)
506  for (int dd = 0; dd < diff_oo; ++dd)
507  for (int rr = 0; rr != rank; ++rr, ++DD)
508  dofOrderMap[t][DD] = oo;
509  else
510  break;
511 
512  nb_last_order_dofs = nb_order_dofs;
513 
514  } else {
515  break;
516  }
517  }
518  }
519 
520  std::fill(&dofOrderMap[t][DD], dofOrderMap[t].end(), -1);
521  }
522 
524 }
525 
526 std::ostream &operator<<(std::ostream &os, const Field &e) {
527  os << e.getNameRef() << " field_id " << e.getId().to_ulong() << " space "
528  << e.getSpaceName() << " field continuity " << e.getContinuityName()
529  << " approximation base " << e.getApproxBaseName() << " nb coefficients "
530  << e.getNbOfCoeffs() << " meshset " << e.meshSet;
531  return os;
532 }
533 
534 // FieldEntityEntFiniteElementAdjacencyMap
537  const boost::shared_ptr<FieldEntity> &ent_field_ptr,
538  const boost::shared_ptr<EntFiniteElement> &ent_fe_ptr)
539  : byWhat(0), entFieldPtr(ent_field_ptr), entFePtr(ent_fe_ptr) {}
540 
541 std::ostream &operator<<(std::ostream &os,
543  os << "byWhat " << std::bitset<3>(e.byWhat) << " " << *e.entFieldPtr
544  << std::endl
545  << *e.entFePtr->getFiniteElementPtr();
546  return os;
547 }
548 
549 } // namespace MoFEM
MoFEM::Field::getSpaceName
auto getSpaceName() const
Get field approximation space.
Definition: FieldMultiIndices.hpp:157
MoFEM::FieldEntityEntFiniteElementAdjacencyMap::byWhat
unsigned int byWhat
see options ByWhat
Definition: AdjacencyMultiIndices.hpp:19
MoFEM::operator<<
std::ostream & operator<<(std::ostream &os, const EntitiesFieldData::EntData &e)
Definition: EntitiesFieldData.cpp:240
MoFEM::PetscLocalIdx_mi_tag::IamNotPartitioned
static const bool IamNotPartitioned
Definition: TagMultiIndices.hpp:46
MoFEM::Field::tagFieldDataVertsType
TagType tagFieldDataVertsType
Definition: FieldMultiIndices.hpp:75
MoFEM::Field::getNbOfCoeffs
FieldCoefficientsNumber getNbOfCoeffs() const
Get number of field coefficients.
Definition: FieldMultiIndices.hpp:202
H1
@ H1
continuous field
Definition: definitions.h:85
NBVOLUMEHEX_DEMKOWICZ_HCURL
#define NBVOLUMEHEX_DEMKOWICZ_HCURL(P)
Definition: h1_hdiv_hcurl_l2.h:124
NBEDGE_H1
#define NBEDGE_H1(P)
Numer of base function on edge for H1 space.
Definition: h1_hdiv_hcurl_l2.h:55
MoFEM::Version::majorVersion
int majorVersion
Definition: UnknownInterface.hpp:13
EntityHandle
MoFEM::Field::moab
moab::Interface & moab
Definition: FieldMultiIndices.hpp:71
NBVOLUMETET_DEMKOWICZ_HCURL
#define NBVOLUMETET_DEMKOWICZ_HCURL(P)
Definition: h1_hdiv_hcurl_l2.h:110
CHK_THROW_MESSAGE
#define CHK_THROW_MESSAGE(err, msg)
Check and throw MoFEM exception.
Definition: definitions.h:609
L2
@ L2
field with C-1 continuity
Definition: definitions.h:88
MoFEM::Field::tagSpaceData
FieldSpace * tagSpaceData
tag keeps field space
Definition: FieldMultiIndices.hpp:82
MoFEM::Field::rebuildDofsOrderMap
MoFEMErrorCode rebuildDofsOrderMap()
Definition: FieldMultiIndices.cpp:489
MoFEM::Field::tagFieldContinuityData
FieldContinuity * tagFieldContinuityData
tag keeps field continuity
Definition: FieldMultiIndices.hpp:83
MoFEM::Exceptions::MoFEMErrorCode
PetscErrorCode MoFEMErrorCode
MoFEM/PETSc error code.
Definition: Exceptions.hpp:56
MoFEM::th
Tag th
Definition: Projection10NodeCoordsOnField.cpp:122
MoFEM::Field::th_FieldData
Tag th_FieldData
Tag storing field values on entity in the field.
Definition: FieldMultiIndices.hpp:77
MoFEM::UnknownInterface::getFileVersion
static MoFEMErrorCode getFileVersion(moab::Interface &moab, Version &version)
Get database major version.
Definition: UnknownInterface.cpp:16
NBVOLUMETET_H1
#define NBVOLUMETET_H1(P)
Number of base functions on tetrahedron for H1 space.
Definition: h1_hdiv_hcurl_l2.h:75
MOAB_THROW
#define MOAB_THROW(err)
Check error code of MoAB function and throw MoFEM exception.
Definition: definitions.h:554
MoFEM::Field::getName
std::string getName() const
Get field name.
Definition: FieldMultiIndices.hpp:143
NBVOLUMETET_L2
#define NBVOLUMETET_L2(P)
Number of base functions on tetrahedron for L2 space.
Definition: h1_hdiv_hcurl_l2.h:27
NBFACEQUAD_DEMKOWICZ_HCURL
#define NBFACEQUAD_DEMKOWICZ_HCURL(P)
Definition: h1_hdiv_hcurl_l2.h:118
MoFEM::Field::th_FieldRank
Tag th_FieldRank
Definition: FieldMultiIndices.hpp:79
THROW_MESSAGE
#define THROW_MESSAGE(msg)
Throw MoFEM exception.
Definition: definitions.h:574
MoFEM::Field::getApproxBaseName
auto getApproxBaseName() const
Get approximation base.
Definition: FieldMultiIndices.hpp:184
MoFEM::Field
Provide data structure for (tensor) field approximation.
Definition: FieldMultiIndices.hpp:51
USER_BASE
@ USER_BASE
user implemented approximation base
Definition: definitions.h:68
MoFEM::Interface
DeprecatedCoreInterface Interface
Definition: Interface.hpp:2002
MoFEM::Field::tagNamePrefixSize
int tagNamePrefixSize
Definition: FieldMultiIndices.hpp:92
MoFEM::Field::tagNameSize
int tagNameSize
number of bits necessary to keep field name
Definition: FieldMultiIndices.hpp:90
MoFEM::Field::getId
const BitFieldId & getId() const
Get unique field id.
Definition: FieldMultiIndices.hpp:129
MoFEM::Exceptions::rval
static MoFEMErrorCodeGeneric< moab::ErrorCode > rval
Definition: Exceptions.hpp:74
MoFEM::PetscGlobalIdx_mi_tag::IamNotPartitioned
static const bool IamNotPartitioned
Definition: TagMultiIndices.hpp:39
CHKERR
#define CHKERR
Inline error check.
Definition: definitions.h:548
MoFEM
implementation of Data Operators for Forces and Sources
Definition: Common.hpp:10
NBFACEQUAD_L2
#define NBFACEQUAD_L2(P)
Number of base functions on quad for L2 space.
Definition: h1_hdiv_hcurl_l2.h:70
MoFEM::Field::getNameRef
boost::string_ref getNameRef() const
Get string reference to field name.
Definition: FieldMultiIndices.hpp:135
NBVOLUMEHEX_DEMKOWICZ_HDIV
#define NBVOLUMEHEX_DEMKOWICZ_HDIV(P)
Definition: h1_hdiv_hcurl_l2.h:149
MoFEM::Field::th_FieldDataVerts
Tag th_FieldDataVerts
Tag storing field values on vertices in the field.
Definition: FieldMultiIndices.hpp:76
NBEDGE_L2
#define NBEDGE_L2(P)
Number of base functions on edge fro L2 space.
Definition: h1_hdiv_hcurl_l2.h:48
NBFACETRI_DEMKOWICZ_HDIV
#define NBFACETRI_DEMKOWICZ_HDIV(P)
Definition: h1_hdiv_hcurl_l2.h:139
MoFEM::Version
Definition: UnknownInterface.hpp:12
MoFEM::Version::buildVersion
int buildVersion
Definition: UnknownInterface.hpp:15
EshelbianPlasticity::P
@ P
Definition: EshelbianContact.cpp:193
MoFEM::Field::tagBaseData
FieldApproximationBase * tagBaseData
tag keeps field base
Definition: FieldMultiIndices.hpp:84
NBVOLUMETET_DEMKOWICZ_HDIV
#define NBVOLUMETET_DEMKOWICZ_HDIV(P)
Definition: h1_hdiv_hcurl_l2.h:140
MoFEM::Field::getContinuityName
auto getContinuityName() const
Get field space continuity name.
Definition: FieldMultiIndices.hpp:170
NBEDGE_DEMKOWICZ_HCURL
#define NBEDGE_DEMKOWICZ_HCURL(P)
Definition: h1_hdiv_hcurl_l2.h:108
MoFEM::FieldEntityEntFiniteElementAdjacencyMap::entFePtr
const boost::shared_ptr< EntFiniteElement > entFePtr
finite element entity
Definition: AdjacencyMultiIndices.hpp:21
MoFEM::Field::tagName
const void * tagName
tag keeps name of the field
Definition: FieldMultiIndices.hpp:89
AINSWORTH_LOBATTO_BASE
@ AINSWORTH_LOBATTO_BASE
Definition: definitions.h:62
MoFEM::Field::tagNbCoeffData
FieldCoefficientsNumber * tagNbCoeffData
Definition: FieldMultiIndices.hpp:88
NBFACEQUAD_H1
#define NBFACEQUAD_H1(P)
Number of base functions on quad for H1 space.
Definition: h1_hdiv_hcurl_l2.h:65
t
constexpr double t
plate stiffness
Definition: plate.cpp:59
MoFEM::Field::dofOrderMap
DofsOrderMap dofOrderMap
Definition: FieldMultiIndices.hpp:290
NBFACETRI_DEMKOWICZ_HCURL
#define NBFACETRI_DEMKOWICZ_HCURL(P)
Definition: h1_hdiv_hcurl_l2.h:109
AINSWORTH_BERNSTEIN_BEZIER_BASE
@ AINSWORTH_BERNSTEIN_BEZIER_BASE
Definition: definitions.h:64
NBEDGE_HDIV
#define NBEDGE_HDIV(P)
Definition: h1_hdiv_hcurl_l2.h:129
MAX_DOFS_ON_ENTITY
#define MAX_DOFS_ON_ENTITY
Maximal number of DOFs on entity.
Definition: definitions.h:249
MoFEM::Version::minorVersion
int minorVersion
Definition: UnknownInterface.hpp:14
MoFEM::FieldEntityEntFiniteElementAdjacencyMap
FieldEntityEntFiniteElementAdjacencyMap of mofem finite element and entities.
Definition: AdjacencyMultiIndices.hpp:18
NBEDGE_AINSWORTH_HCURL
#define NBEDGE_AINSWORTH_HCURL(P)
Definition: h1_hdiv_hcurl_l2.h:97
FTensor::dd
const Tensor2_symmetric_Expr< const ddTensor0< T, Dim, i, j >, typename promote< T, double >::V, Dim, i, j > dd(const Tensor0< T * > &a, const Index< i, Dim > index1, const Index< j, Dim > index2, const Tensor1< int, Dim > &d_ijk, const Tensor1< double, Dim > &d_xyz)
Definition: ddTensor0.hpp:33
NBFACETRI_H1
#define NBFACETRI_H1(P)
Number of base function on triangle for H1 space.
Definition: h1_hdiv_hcurl_l2.h:60
MoFEM::Field::th_AppOrder
Tag th_AppOrder
Tag storing approximation order on entity.
Definition: FieldMultiIndices.hpp:78
MoFEM::FieldEntityEntFiniteElementAdjacencyMap::FieldEntityEntFiniteElementAdjacencyMap
FieldEntityEntFiniteElementAdjacencyMap(const boost::shared_ptr< FieldEntity > &ent_field_ptr, const boost::shared_ptr< EntFiniteElement > &ent_fe_ptr)
Definition: FieldMultiIndices.cpp:536
MoFEM::Field::Field
Field(moab::Interface &moab, const EntityHandle meshset)
constructor for moab field
Definition: FieldMultiIndices.cpp:15
MoFEM::Types::ApproximationOrder
int ApproximationOrder
Approximation on the entity.
Definition: Types.hpp:26
DEMKOWICZ_JACOBI_BASE
@ DEMKOWICZ_JACOBI_BASE
Definition: definitions.h:66
MoFEM::FieldEntityEntFiniteElementAdjacencyMap::entFieldPtr
const boost::shared_ptr< FieldEntity > entFieldPtr
field entity
Definition: AdjacencyMultiIndices.hpp:20
NBFACEQUAD_DEMKOWICZ_HDIV
#define NBFACEQUAD_DEMKOWICZ_HDIV(P)
Definition: h1_hdiv_hcurl_l2.h:145
MoFEM::Field::bitNumber
unsigned int bitNumber
Definition: FieldMultiIndices.hpp:107
MoFEM::Idx_mi_tag::IamNotPartitioned
static const bool IamNotPartitioned
Definition: TagMultiIndices.hpp:32
NBVOLUMETET_AINSWORTH_HCURL
#define NBVOLUMETET_AINSWORTH_HCURL(P)
Definition: h1_hdiv_hcurl_l2.h:105
NBFACETRI_L2
#define NBFACETRI_L2(P)
Number of base functions on triangle for L2 space.
Definition: h1_hdiv_hcurl_l2.h:42
DISCONTINUOUS
@ DISCONTINUOUS
Broken continuity (No effect on L2 space)
Definition: definitions.h:101
UBlasVector< double >
MoFEM::Exceptions::ierr
static MoFEMErrorCodeGeneric< PetscErrorCode > ierr
Definition: Exceptions.hpp:76
AINSWORTH_LEGENDRE_BASE
@ AINSWORTH_LEGENDRE_BASE
Ainsworth Cole (Legendre) approx. base .
Definition: definitions.h:60
HCURL
@ HCURL
field with continuous tangents
Definition: definitions.h:86
NBVOLUMETET_AINSWORTH_HDIV
#define NBVOLUMETET_AINSWORTH_HDIV(P)
Definition: h1_hdiv_hcurl_l2.h:137
NBVOLUMEHEX_H1
#define NBVOLUMEHEX_H1(P)
Number of base functions on hex for H1 space.
Definition: h1_hdiv_hcurl_l2.h:93
MoFEM::Field::tagNamePrefixData
const void * tagNamePrefixData
tag keeps name prefix of the field
Definition: FieldMultiIndices.hpp:91
NBFACETRI_AINSWORTH_HCURL
#define NBFACETRI_AINSWORTH_HCURL(P)
Definition: h1_hdiv_hcurl_l2.h:100
NBVOLUMEPRISM_H1
#define NBVOLUMEPRISM_H1(P)
Number of base functions on prism for H1 space.
Definition: h1_hdiv_hcurl_l2.h:80
MoFEM::Field::getBitNumberCalculate
FieldBitNumber getBitNumberCalculate() const
Calculate number of set bit in Field ID. Each field has uid, get getBitNumber get number of bit set f...
Definition: FieldMultiIndices.hpp:232
NBFACETRI_AINSWORTH_HDIV
#define NBFACETRI_AINSWORTH_HDIV(P)
Definition: h1_hdiv_hcurl_l2.h:132
CONTINUOUS
@ CONTINUOUS
Regular field.
Definition: definitions.h:100
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::Field::forderTable
FieldOrderTable forderTable
nb. DOFs table for entities
Definition: FieldMultiIndices.hpp:94
MoFEM::Field::meshSet
EntityHandle meshSet
keeps entities for this meshset
Definition: FieldMultiIndices.hpp:73
MoFEMFunctionBegin
#define MoFEMFunctionBegin
First executable line of each MoFEM function, used for error handling. Final line of MoFEM functions ...
Definition: definitions.h:359
NBVOLUMEHEX_L2
#define NBVOLUMEHEX_L2(P)
Number of base functions on hexahedron for L2 space.
Definition: h1_hdiv_hcurl_l2.h:37
NOFIELD
@ NOFIELD
scalar or vector of scalars describe (no true field)
Definition: definitions.h:84
MoFEM::Field::tagId
BitFieldId * tagId
Tag field rank.
Definition: FieldMultiIndices.hpp:81