18 : moab(moab), meshSet(meshset), tagId(NULL), tagSpaceData(NULL),
19 tagFieldContinuityData(NULL), tagNbCoeffData(NULL), tagName(NULL),
22 auto get_tag_data_ptr = [&](
const auto name,
auto &tag_data) {
26 CHKERR moab.tag_get_by_ptr(
th, &meshset, 1, (
const void **)&tag_data);
31 ierr = get_tag_data_ptr(
"_FieldId",
tagId);
32 CHKERRABORT(PETSC_COMM_SELF,
ierr);
35 CHKERRABORT(PETSC_COMM_SELF,
ierr);
38 CHKERRABORT(PETSC_COMM_SELF,
ierr);
42 CHKERRABORT(PETSC_COMM_SELF,
ierr);
46 CHKERR moab.tag_get_handle(
"_FieldName", th_field_name);
50 Tag th_field_name_data_name_prefix;
51 CHKERR moab.tag_get_handle(
"_FieldName_DataNamePrefix",
52 th_field_name_data_name_prefix);
59 std::string Tag_rank_name =
"_Field_Rank_" +
getName();
64 auto get_all_tags = [&]() {
68 std::string tag_approximation_order_name =
"_App_Order_" +
getName();
69 rval =
moab.tag_get_handle(tag_approximation_order_name.c_str(), 1,
71 MB_TAG_CREAT | MB_TAG_SPARSE, &def_approx_order);
72 if (
rval == MB_ALREADY_ALLOCATED)
77 std::string tag_data_name = name_data_prefix +
getName();
78 const int def_len = 0;
80 tag_data_name.c_str(), def_len, MB_TYPE_DOUBLE,
th_FieldData,
81 MB_TAG_CREAT | MB_TAG_VARLEN | MB_TAG_SPARSE, NULL);
82 if (
rval == MB_ALREADY_ALLOCATED)
86 std::string tag_data_name_verts = name_data_prefix +
getName() +
"_V";
88 if (
rval == MB_SUCCESS)
96 def_vert_data.clear();
100 &*def_vert_data.begin());
101 if (
rval == MB_ALREADY_ALLOCATED)
109 auto get_all_tags_deprecated = [&]() {
113 std::string tag_approximation_order_name =
"_App_Order_" +
getName();
114 rval =
moab.tag_get_handle(tag_approximation_order_name.c_str(), 1,
116 MB_TAG_CREAT | MB_TAG_SPARSE, &def_approx_order);
117 if (
rval == MB_ALREADY_ALLOCATED)
122 std::string tag_data_name = name_data_prefix +
getName();
123 const int def_len = 0;
125 tag_data_name.c_str(), def_len, MB_TYPE_DOUBLE,
th_FieldData,
126 MB_TAG_CREAT | MB_TAG_VARLEN | MB_TAG_SPARSE, NULL);
127 if (
rval == MB_ALREADY_ALLOCATED)
131 std::string tag_data_name_verts = name_data_prefix +
getName() +
"V";
133 if (
rval == MB_SUCCESS)
141 def_vert_data.clear();
145 &*def_vert_data.begin());
146 if (
rval == MB_ALREADY_ALLOCATED)
159 ierr = get_all_tags();
160 CHKERRABORT(PETSC_COMM_SELF,
ierr);
162 ierr = get_all_tags_deprecated();
163 CHKERRABORT(PETSC_COMM_SELF,
ierr);
168 auto reset_entity_order_table = [&]() {
169 for (
int tt = 0; tt != MBMAXTYPE; ++tt)
173 auto set_continuous_entity_order_table = [&]() {
179 forderTable[MBVERTEX] = [](
int P) ->
int {
return (P > 0) ? 1 : 0; };
244 forderTable[MBVERTEX] = [](
int P) ->
int {
return (P > 0) ? 1 : 0; };
263 THROW_MESSAGE(
"unknown approximation space or not yet implemented");
269 forderTable[MBVERTEX] = [](
int P) ->
int {
return (P > 0) ? 1 : 0; };
332 THROW_MESSAGE(
"unknown approximation space or not yet implemented");
336 for (
int ee = 0; ee < MBMAXTYPE; ee++) {
347 for (EntityType
t = MBVERTEX;
t < MBMAXTYPE;
t++)
356 auto set_discontinuous_entity_order_table = [&]() {
413 THROW_MESSAGE(
"unknown approximation space or not implemented");
417 THROW_MESSAGE(
"unknown approximation space or not yet implemented");
474 THROW_MESSAGE(
"unknown approximation space or not yet implemented");
478 for (
int ee = 0; ee < MBMAXTYPE; ee++) {
489 for (EntityType
t = MBVERTEX;
t < MBMAXTYPE;
t++)
498 reset_entity_order_table();
501 set_continuous_entity_order_table();
504 set_discontinuous_entity_order_table();
508 set_continuous_entity_order_table();
510 <<
"unknown field continuity, set CONTINUOUS";
514 CHKERRABORT(PETSC_COMM_SELF,
ierr);
520 for (
auto t = MBVERTEX;
t != MBMAXTYPE; ++
t) {
523 int nb_last_order_dofs = 0;
524 const int rank = (*tagNbCoeffData);
530 const int diff_oo = nb_order_dofs - nb_last_order_dofs;
534 for (
int dd = 0; dd < diff_oo; ++dd)
535 for (
int rr = 0; rr != rank; ++rr, ++DD)
540 nb_last_order_dofs = nb_order_dofs;
555 os << e.
getNameRef() <<
" field_id " << e.
getId().to_ulong() <<
" space "
565 const boost::shared_ptr<FieldEntity> &ent_field_ptr,
566 const boost::shared_ptr<EntFiniteElement> &ent_fe_ptr)
567 : byWhat(0), entFieldPtr(ent_field_ptr), entFePtr(ent_fe_ptr) {}
573 << *e.
entFePtr->getFiniteElementPtr();
#define MAX_DOFS_ON_ENTITY
Maximal number of DOFs on entity.
@ AINSWORTH_LEGENDRE_BASE
Ainsworth Cole (Legendre) approx. base nme:nme847.
@ USER_BASE
user implemented approximation base
@ AINSWORTH_BERNSTEIN_BEZIER_BASE
#define MOAB_THROW(err)
Check error code of MoAB function and throw MoFEM exception.
#define CHK_THROW_MESSAGE(err, msg)
Check and throw MoFEM exception.
@ 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
@ CONTINUOUS
Regular field.
@ DISCONTINUOUS
Broken continuity (No effect on L2 space)
#define MoFEMFunctionBegin
First executable line of each MoFEM function, used for error handling. Final line of MoFEM functions ...
#define MoFEMFunctionReturn(a)
Last executable line of each PETSc function used for error handling. Replaces return()
#define CHKERR
Inline error check.
#define THROW_MESSAGE(msg)
Throw MoFEM exception.
#define MOFEM_LOG(channel, severity)
Log.
#define NBFACEQUAD_DEMKOWICZ_HDIV(P)
#define NBVOLUMETET_AINSWORTH_EDGE_HDIV(P)
#define NBEDGE_DEMKOWICZ_HCURL(P)
#define NBVOLUMETET_H1(P)
Number of base functions on tetrahedron for H1 space.
#define NBVOLUMEHEX_DEMKOWICZ_HCURL(P)
#define NBFACEQUAD_H1(P)
Number of base functions on quad for H1 space.
#define NBVOLUMETET_AINSWORTH_HCURL(P)
#define NBFACETRI_AINSWORTH_HCURL(P)
#define NBFACEQUAD_L2(P)
Number of base functions on quad for L2 space.
#define NBVOLUMEHEX_H1(P)
Number of base functions on hex for H1 space.
#define NBFACETRI_L2(P)
Number of base functions on triangle for L2 space.
#define NBVOLUMETET_DEMKOWICZ_HDIV(P)
#define NBVOLUMETET_AINSWORTH_FACE_HDIV(P)
#define NBVOLUMEPRISM_H1(P)
Number of base functions on prism for H1 space.
#define NBVOLUMEHEX_DEMKOWICZ_HDIV(P)
#define NBFACEQUAD_DEMKOWICZ_HCURL(P)
#define NBEDGE_H1(P)
Number of base function on edge for H1 space.
#define NBFACETRI_DEMKOWICZ_HDIV(P)
#define NBEDGE_L2(P)
Number of base functions on edge from L2 space.
#define NBVOLUMEHEX_L2(P)
Number of base functions on hexahedron for L2 space.
#define NBVOLUMETET_DEMKOWICZ_HCURL(P)
#define NBFACETRI_DEMKOWICZ_HCURL(P)
#define NBFACETRI_AINSWORTH_FACE_HDIV(P)
#define NBVOLUMETET_AINSWORTH_VOLUME_HDIV(P)
#define NBFACETRI_AINSWORTH_EDGE_HDIV(P)
#define NBEDGE_AINSWORTH_HCURL(P)
#define NBFACETRI_H1(P)
Number of base function on triangle for H1 space.
#define NBVOLUMETET_L2(P)
Number of base functions on tetrahedron for L2 space.
static MoFEMErrorCodeGeneric< PetscErrorCode > ierr
static MoFEMErrorCodeGeneric< moab::ErrorCode > rval
PetscErrorCode MoFEMErrorCode
MoFEM/PETSc error code.
int ApproximationOrder
Approximation on the entity.
implementation of Data Operators for Forces and Sources
std::ostream & operator<<(std::ostream &os, const EntitiesFieldData::EntData &e)
constexpr double t
plate stiffness
static boost::function< int(int)> broken_nbvolumetet_edge_hdiv
static boost::function< int(int)> broken_nbvolumetet_face_hdiv
static boost::function< int(int)> broken_nbfacetri_face_hdiv
static boost::function< int(int)> broken_nbvolumetet_volume_hdiv
static boost::function< int(int)> broken_nbfacetri_edge_hdiv
FieldEntityEntFiniteElementAdjacencyMap of mofem finite element and entities.
const boost::shared_ptr< FieldEntity > entFieldPtr
field entity
unsigned int byWhat
see options ByWhat
FieldEntityEntFiniteElementAdjacencyMap(const boost::shared_ptr< FieldEntity > &ent_field_ptr, const boost::shared_ptr< EntFiniteElement > &ent_fe_ptr)
const boost::shared_ptr< EntFiniteElement > entFePtr
finite element entity
Provide data structure for (tensor) field approximation.
FieldCoefficientsNumber getNbOfCoeffs() const
Get number of field coefficients.
const void * tagNamePrefixData
tag keeps name prefix of the field
FieldOrderTable forderTable
nb. DOFs table for entities
const void * tagName
tag keeps name of the field
int tagNameSize
number of bits necessary to keep field name
std::string getName() const
Get field name.
auto getSpaceName() const
Get field approximation space.
EntityHandle meshSet
keeps entities for this meshset
FieldSpace * tagSpaceData
tag keeps field space
FieldBitNumber getBitNumberCalculate() const
Calculate number of set bit in Field ID. Each field has uid, get getBitNumber get number of bit set f...
auto getApproxBaseName() const
Get approximation base.
Tag th_FieldData
Tag storing field values on entity in the field.
MoFEMErrorCode rebuildDofsOrderMap()
FieldContinuity * tagFieldContinuityData
tag keeps field continuity
FieldCoefficientsNumber * tagNbCoeffData
BitFieldId * tagId
Tag field rank.
static constexpr int maxBrokenDofsOrder
max number of broken dofs
Field(moab::Interface &moab, const EntityHandle meshset)
constructor for moab field
Tag th_FieldDataVerts
Tag storing field values on vertices in the field.
FieldApproximationBase * tagBaseData
tag keeps field base
auto getContinuityName() const
Get field space continuity name.
TagType tagFieldDataVertsType
Tag th_AppOrder
Tag storing approximation order on entity.
boost::string_ref getNameRef() const
Get string reference to field name.
const BitFieldId & getId() const
Get unique field id.
static const bool IamNotPartitioned
static const bool IamNotPartitioned
static const bool IamNotPartitioned
static MoFEMErrorCode getFileVersion(moab::Interface &moab, Version &version)
Get database major version.