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 
6 namespace MoFEM {
7 
8 // Not partitioned
9 const bool Idx_mi_tag::IamNotPartitioned = true;
10 
11 // This tag is used for partitioned problems
14 
15 // fields
17  : moab(moab), meshSet(meshset), tagId(NULL), tagSpaceData(NULL),
18  tagNbCoeffData(NULL), tagName(NULL), 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 
35  // approx. base
36  ierr = get_tag_data_ptr("_FieldBase", tagBaseData);
37  CHKERRABORT(PETSC_COMM_SELF, ierr);
38 
39  // name
40  Tag th_field_name;
41  CHKERR moab.tag_get_handle("_FieldName", th_field_name);
42  CHKERR moab.tag_get_by_ptr(th_field_name, &meshSet, 1,
43  (const void **)&tagName, &tagNameSize);
44  // name prefix
45  Tag th_field_name_data_name_prefix;
46  CHKERR moab.tag_get_handle("_FieldName_DataNamePrefix",
47  th_field_name_data_name_prefix);
48  CHKERR moab.tag_get_by_ptr(th_field_name_data_name_prefix, &meshSet, 1,
49  (const void **)&tagNamePrefixData,
51  std::string name_data_prefix((char *)tagNamePrefixData, tagNamePrefixSize);
52 
53  // rank
54  std::string Tag_rank_name = "_Field_Rank_" + getName();
55  CHKERR moab.tag_get_handle(Tag_rank_name.c_str(), th_FieldRank);
56  CHKERR moab.tag_get_by_ptr(th_FieldRank, &meshSet, 1,
57  (const void **)&tagNbCoeffData);
58 
59  auto get_all_tags = [&]() {
61  // order
62  ApproximationOrder def_approx_order = -1;
63  std::string tag_approximation_order_name = "_App_Order_" + getName();
64  rval = moab.tag_get_handle(tag_approximation_order_name.c_str(), 1,
65  MB_TYPE_INTEGER, th_AppOrder,
66  MB_TAG_CREAT | MB_TAG_SPARSE, &def_approx_order);
67  if (rval == MB_ALREADY_ALLOCATED)
68  rval = MB_SUCCESS;
70 
71  // data
72  std::string tag_data_name = name_data_prefix + getName();
73  const int def_len = 0;
74  rval = moab.tag_get_handle(
75  tag_data_name.c_str(), def_len, MB_TYPE_DOUBLE, th_FieldData,
76  MB_TAG_CREAT | MB_TAG_VARLEN | MB_TAG_SPARSE, NULL);
77  if (rval == MB_ALREADY_ALLOCATED)
78  rval = MB_SUCCESS;
80 
81  std::string tag_data_name_verts = name_data_prefix + getName() + "_V";
82  rval = moab.tag_get_handle(tag_data_name_verts.c_str(), th_FieldDataVerts);
83  if (rval == MB_SUCCESS)
85  else {
86  // Since vertex tag is not it mesh that tag is not dense, it is sparse,
87  // sinc it is set to all vertices on the mesh. Is unlikely that mesh has
88  // no vertices, then above assumption does not hold.
89  tagFieldDataVertsType = MB_TAG_SPARSE;
90  VectorDouble def_vert_data(*tagNbCoeffData);
91  def_vert_data.clear();
92  rval = moab.tag_get_handle(tag_data_name_verts.c_str(), *tagNbCoeffData,
93  MB_TYPE_DOUBLE, th_FieldDataVerts,
94  MB_TAG_CREAT | tagFieldDataVertsType,
95  &*def_vert_data.begin());
96  if (rval == MB_ALREADY_ALLOCATED)
97  rval = MB_SUCCESS;
99  }
100 
102  };
103 
104  auto get_all_tags_deprecated = [&]() {
106  // order
107  ApproximationOrder def_approx_order = -1;
108  std::string tag_approximation_order_name = "_App_Order_" + getName();
109  rval = moab.tag_get_handle(tag_approximation_order_name.c_str(), 1,
110  MB_TYPE_INTEGER, th_AppOrder,
111  MB_TAG_CREAT | MB_TAG_SPARSE, &def_approx_order);
112  if (rval == MB_ALREADY_ALLOCATED)
113  rval = MB_SUCCESS;
114  MOAB_THROW(rval);
115 
116  // data
117  std::string tag_data_name = name_data_prefix + getName();
118  const int def_len = 0;
119  rval = moab.tag_get_handle(
120  tag_data_name.c_str(), def_len, MB_TYPE_DOUBLE, th_FieldData,
121  MB_TAG_CREAT | MB_TAG_VARLEN | MB_TAG_SPARSE, NULL);
122  if (rval == MB_ALREADY_ALLOCATED)
123  rval = MB_SUCCESS;
124  MOAB_THROW(rval);
125 
126  std::string tag_data_name_verts = name_data_prefix + getName() + "V";
127  rval = moab.tag_get_handle(tag_data_name_verts.c_str(), th_FieldDataVerts);
128  if (rval == MB_SUCCESS)
130  else {
131  // Since vertex tag is not it mesh that tag is not dense, it is sparse,
132  // sinc it is set to all vertices on the mesh. Is unlikely that mesh has
133  // no vertices, then above assumption does not hold.
134  tagFieldDataVertsType = MB_TAG_SPARSE;
135  VectorDouble def_vert_data(*tagNbCoeffData);
136  def_vert_data.clear();
137  rval = moab.tag_get_handle(tag_data_name_verts.c_str(), *tagNbCoeffData,
138  MB_TYPE_DOUBLE, th_FieldDataVerts,
139  MB_TAG_CREAT | tagFieldDataVertsType,
140  &*def_vert_data.begin());
141  if (rval == MB_ALREADY_ALLOCATED)
142  rval = MB_SUCCESS;
143  MOAB_THROW(rval);
144  }
145 
147  };
148 
149  Version file_ver;
151  CHK_THROW_MESSAGE(ierr, "Not known file version");
152  if (file_ver.majorVersion >= 0 && file_ver.minorVersion >= 12 &&
153  file_ver.buildVersion >= 1) {
154  ierr = get_all_tags();
155  CHKERRABORT(PETSC_COMM_SELF, ierr);
156  } else {
157  ierr = get_all_tags_deprecated();
158  CHKERRABORT(PETSC_COMM_SELF, ierr);
159  }
160 
162 
163  auto reset_entity_order_table = [&]() {
164  for (int tt = 0; tt != MBMAXTYPE; ++tt)
165  forderTable[tt] = NULL;
166  };
167 
168  auto set_entity_order_table = [&]() {
169  switch (*tagBaseData) {
172  switch (*tagSpaceData) {
173  case H1:
174  forderTable[MBVERTEX] = [](int P) -> int { return (P > 0) ? 1 : 0; };
175  forderTable[MBEDGE] = [](int P) -> int { return NBEDGE_H1(P); };
176  forderTable[MBTRI] = [](int P) -> int { return NBFACETRI_H1(P); };
177  forderTable[MBQUAD] = [](int P) -> int { return NBFACEQUAD_H1(P); };
178  forderTable[MBTET] = [](int P) -> int { return NBVOLUMETET_H1(P); };
179  forderTable[MBHEX] = [](int P) -> int { return NBVOLUMEHEX_H1(P); };
180  forderTable[MBPRISM] = [](int P) -> int { return NBVOLUMEPRISM_H1(P); };
181  break;
182  case HCURL:
183  forderTable[MBVERTEX] = [](int P) -> int {
184  (void)P;
185  return 0;
186  };
187  forderTable[MBEDGE] = [](int P) -> int {
188  return NBEDGE_AINSWORTH_HCURL(P);
189  };
190  forderTable[MBTRI] = [](int P) -> int {
192  };
193  forderTable[MBTET] = [](int P) -> int {
195  };
196  break;
197  case HDIV:
198  forderTable[MBVERTEX] = [](int P) -> int {
199  (void)P;
200  return 0;
201  };
202  forderTable[MBEDGE] = [](int P) -> int {
203  (void)P;
204  return NBEDGE_HDIV(P);
205  };
206  forderTable[MBTRI] = [](int P) -> int {
207  return NBFACETRI_AINSWORTH_HDIV(P);
208  };
209  forderTable[MBTET] = [](int P) -> int {
211  };
212  break;
213  case L2:
214  forderTable[MBVERTEX] = [](int P) -> int {
215  (void)P;
216  return 1;
217  };
218  forderTable[MBEDGE] = [](int P) -> int { return NBEDGE_L2(P); };
219  forderTable[MBTRI] = [](int P) -> int { return NBFACETRI_L2(P); };
220  forderTable[MBQUAD] = [](int P) -> int { return NBFACEQUAD_L2(P); };
221  forderTable[MBTET] = [](int P) -> int { return NBVOLUMETET_L2(P); };
222  forderTable[MBHEX] = [](int P) -> int { return NBVOLUMEHEX_L2(P); };
223  break;
224  default:
225  THROW_MESSAGE("unknown approximation space");
226  }
227  break;
229  switch (*tagSpaceData) {
230  case H1:
231  forderTable[MBVERTEX] = [](int P) -> int { return (P > 0) ? 1 : 0; };
232  forderTable[MBEDGE] = [](int P) -> int { return NBEDGE_H1(P); };
233  forderTable[MBTRI] = [](int P) -> int { return NBFACETRI_H1(P); };
234  forderTable[MBQUAD] = [](int P) -> int { return NBFACEQUAD_H1(P); };
235  forderTable[MBTET] = [](int P) -> int { return NBVOLUMETET_H1(P); };
236  forderTable[MBPRISM] = [](int P) -> int { return NBVOLUMEPRISM_H1(P); };
237  break;
238  case L2:
239  forderTable[MBVERTEX] = [](int P) -> int {
240  (void)P;
241  return 1;
242  };
243  forderTable[MBEDGE] = [](int P) -> int { return NBEDGE_L2(P); };
244  forderTable[MBTRI] = [](int P) -> int { return NBFACETRI_L2(P); };
245  forderTable[MBQUAD] = [](int P) -> int { return NBFACEQUAD_L2(P); };
246  forderTable[MBTET] = [](int P) -> int { return NBVOLUMETET_L2(P); };
247  forderTable[MBHEX] = [](int P) -> int { return NBVOLUMEHEX_L2(P); };
248  break;
249  default:
250  THROW_MESSAGE("unknown approximation space or not yet implemented");
251  }
252  break;
254  switch (*tagSpaceData) {
255  case H1:
256  forderTable[MBVERTEX] = [](int P) -> int { return (P > 0) ? 1 : 0; };
257  forderTable[MBEDGE] = [](int P) -> int { return NBEDGE_H1(P); };
258  forderTable[MBTRI] = [](int P) -> int { return NBFACETRI_H1(P); };
259  forderTable[MBQUAD] = [](int P) -> int { return NBFACEQUAD_H1(P); };
260  forderTable[MBTET] = [](int P) -> int { return NBVOLUMETET_H1(P); };
261  forderTable[MBHEX] = [](int P) -> int { return NBVOLUMEHEX_H1(P); };
262  forderTable[MBPRISM] = [](int P) -> int { return NBVOLUMEPRISM_H1(P); };
263  break;
264  case HCURL:
265  forderTable[MBVERTEX] = [](int P) -> int {
266  (void)P;
267  return 0;
268  };
269  forderTable[MBEDGE] = [](int P) -> int {
270  return NBEDGE_DEMKOWICZ_HCURL(P);
271  };
272  forderTable[MBTRI] = [](int P) -> int {
274  };
275  forderTable[MBQUAD] = [](int P) -> int {
277  };
278  forderTable[MBTET] = [](int P) -> int {
280  };
281  forderTable[MBHEX] = [](int P) -> int {
283  };
284  break;
285  case HDIV:
286  forderTable[MBVERTEX] = [](int P) -> int {
287  (void)P;
288  return 0;
289  };
290  forderTable[MBEDGE] = [](int P) -> int {
291  (void)P;
292  return 0;
293  };
294  forderTable[MBTRI] = [](int P) -> int {
295  return NBFACETRI_DEMKOWICZ_HDIV(P);
296  };
297  forderTable[MBQUAD] = [](int P) -> int {
299  };
300  forderTable[MBTET] = [](int P) -> int {
302  };
303  forderTable[MBHEX] = [](int P) -> int {
305  };
306  break;
307  case L2:
308  forderTable[MBVERTEX] = [](int P) -> int {
309  (void)P;
310  return 1;
311  };
312  forderTable[MBEDGE] = [](int P) -> int { return NBEDGE_L2(P); };
313  forderTable[MBTRI] = [](int P) -> int { return NBFACETRI_L2(P); };
314  forderTable[MBQUAD] = [](int P) -> int { return NBFACEQUAD_L2(P); };
315  forderTable[MBTET] = [](int P) -> int { return NBVOLUMETET_L2(P); };
316  forderTable[MBHEX] = [](int P) -> int { return NBVOLUMEHEX_L2(P); };
317  break;
318  default:
319  THROW_MESSAGE("unknown approximation space or not yet implemented");
320  }
321  break;
322  case USER_BASE:
323  for (int ee = 0; ee < MBMAXTYPE; ee++) {
324  forderTable[ee] = [](int P) -> int {
325  (void)P;
326  return 0;
327  };
328  }
329  break;
330  default:
331  if (*tagSpaceData != NOFIELD) {
332  THROW_MESSAGE("unknown approximation base");
333  } else {
334  for (EntityType t = MBVERTEX; t < MBMAXTYPE; t++)
335  forderTable[t] = [](int P) -> int {
336  (void)P;
337  return 1;
338  };
339  }
340  }
341  };
342 
343  reset_entity_order_table();
344  set_entity_order_table();
346  CHKERRABORT(PETSC_COMM_SELF, ierr);
347 };
348 
351 
352  for (auto t = MBVERTEX; t != MBMAXTYPE; ++t) {
353 
354  int DD = 0;
355  int nb_last_order_dofs = 0;
356  const int rank = (*tagNbCoeffData);
357  if (forderTable[t]) {
358 
359  for (int oo = 0; oo < MAX_DOFS_ON_ENTITY; ++oo) {
360 
361  const int nb_order_dofs = forderTable[t](oo);
362  const int diff_oo = nb_order_dofs - nb_last_order_dofs;
363  if (diff_oo >= 0) {
364 
365  if ((DD + rank * diff_oo) < MAX_DOFS_ON_ENTITY)
366  for (int dd = 0; dd < diff_oo; ++dd)
367  for (int rr = 0; rr != rank; ++rr, ++DD)
368  dofOrderMap[t][DD] = oo;
369  else
370  break;
371 
372  nb_last_order_dofs = nb_order_dofs;
373 
374  } else {
375  break;
376  }
377  }
378  }
379 
380  std::fill(&dofOrderMap[t][DD], dofOrderMap[t].end(), -1);
381  }
382 
384 }
385 
386 std::ostream &operator<<(std::ostream &os, const Field &e) {
387  os << e.getNameRef() << " field_id " << e.getId().to_ulong() << " space "
388  << FieldSpaceNames[e.getSpace()] << " approximation base "
389  << ApproximationBaseNames[e.getApproxBase()] << " nb coefficients "
390  << e.getNbOfCoeffs() << " meshset " << e.meshSet;
391  return os;
392 }
393 
394 // FieldEntityEntFiniteElementAdjacencyMap
397  const boost::shared_ptr<FieldEntity> &ent_field_ptr,
398  const boost::shared_ptr<EntFiniteElement> &ent_fe_ptr)
399  : byWhat(0), entFieldPtr(ent_field_ptr), entFePtr(ent_fe_ptr) {}
400 
401 std::ostream &operator<<(std::ostream &os,
403  os << "byWhat " << std::bitset<3>(e.byWhat) << " " << *e.entFieldPtr
404  << std::endl
405  << *e.entFePtr->getFiniteElementPtr();
406  return os;
407 }
408 
409 } // namespace MoFEM
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:188
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:596
ApproximationBaseNames
const static char *const ApproximationBaseNames[]
Definition: definitions.h:72
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:349
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:150
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:541
MoFEM::Field::getName
std::string getName() const
Get field name.
Definition: FieldMultiIndices.hpp:142
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:561
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:1975
MoFEM::Field::tagNamePrefixSize
int tagNamePrefixSize
Definition: FieldMultiIndices.hpp:91
MoFEM::Field::tagNameSize
int tagNameSize
number of bits necessary to keep field name
Definition: FieldMultiIndices.hpp:89
MoFEM::Field::getId
const BitFieldId & getId() const
Get unique field id.
Definition: FieldMultiIndices.hpp:128
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:535
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:134
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:83
MoFEM::Field::getApproxBase
FieldApproximationBase getApproxBase() const
Get approximation base.
Definition: FieldMultiIndices.hpp:164
NBVOLUMETET_DEMKOWICZ_HDIV
#define NBVOLUMETET_DEMKOWICZ_HDIV(P)
Definition: h1_hdiv_hcurl_l2.h:140
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:88
AINSWORTH_LOBATTO_BASE
@ AINSWORTH_LOBATTO_BASE
Definition: definitions.h:62
MoFEM::Field::tagNbCoeffData
FieldCoefficientsNumber * tagNbCoeffData
Definition: FieldMultiIndices.hpp:87
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:276
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:236
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
FieldSpaceNames
const static char *const FieldSpaceNames[]
Definition: definitions.h:92
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:396
MoFEM::Field::Field
Field(moab::Interface &moab, const EntityHandle meshset)
constructor for moab field
Definition: FieldMultiIndices.cpp:16
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:106
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
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:90
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:218
NBFACETRI_AINSWORTH_HDIV
#define NBFACETRI_AINSWORTH_HDIV(P)
Definition: h1_hdiv_hcurl_l2.h:132
MoFEMFunctionReturn
#define MoFEMFunctionReturn(a)
Last executable line of each PETSc function used for error handling. Replaces return()
Definition: definitions.h:416
HDIV
@ HDIV
field with continuous normal traction
Definition: definitions.h:87
MoFEM::Field::forderTable
FieldOrderTable forderTable
nb. DOFs table for entities
Definition: FieldMultiIndices.hpp:93
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:346
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