v0.15.0
Loading...
Searching...
No Matches
FieldEntsMultiIndices.cpp
Go to the documentation of this file.
1/** \file FieldEntsMultiIndices.cpp
2 * \brief Multi-index containers for entities
3 */
4
5
6#define IS_BUILDING_MB
7#include <moab/Error.hpp>
8
9namespace MoFEM {
10
11constexpr int FieldEntity::dof_shift; // Maximal number of DOFs on entity
12constexpr int FieldEntity::ent_shift; // EntityHandle size
13constexpr int FieldEntity::proc_shift; // Maximal number of 1024 processors
14
16 const boost::shared_ptr<Field> field_ptr,
17 const boost::shared_ptr<RefEntity> ref_ents_ptr,
18 boost::shared_ptr<double *const> field_data_adaptor_ptr,
19 boost::shared_ptr<const int> t_max_order_ptr)
20 : interface_Field<Field, RefEntity>(field_ptr, ref_ents_ptr),
21 tagMaxOrderPtr(t_max_order_ptr),
22 fieldDataAdaptorPtr(field_data_adaptor_ptr) {
23
24 localUId = getLocalUniqueIdCalculate(field_ptr->getBitNumber(),
25 ref_ents_ptr->getEnt());
26#ifndef NDEBUG
27 if (PetscUnlikely(!fieldDataAdaptorPtr))
28 THROW_MESSAGE("Pointer to field data adaptor not set");
29
30 if (PetscUnlikely(!tagMaxOrderPtr))
31 THROW_MESSAGE("Pointer to max order not set");
32#endif
33}
34
35boost::shared_ptr<FieldData *const> FieldEntity::makeSharedFieldDataAdaptorPtr(
36 const boost::shared_ptr<Field> &field_ptr,
37 const boost::shared_ptr<RefEntity> &ref_ents_ptr) {
38 int size;
39 FieldData *ptr;
40 switch (ref_ents_ptr->getEntType()) {
41 case MBVERTEX:
42 size = field_ptr->getNbOfCoeffs();
43 ptr = static_cast<FieldData *>(
44 MoFEM::get_tag_ptr(field_ptr->moab, field_ptr->th_FieldDataVerts,
45 ref_ents_ptr->ent, &size));
46 break;
47 default:
48 ptr = static_cast<FieldData *>(MoFEM::get_tag_ptr(
49 field_ptr->moab, field_ptr->th_FieldData, ref_ents_ptr->ent, &size));
50 }
51 return boost::make_shared<FieldData *const>(ptr);
52}
53
54std::ostream &operator<<(std::ostream &os, const FieldEntity &e) {
55 os << "ent_global_uid " << e.getLocalUniqueId() << " entity " << e.getEnt()
56 << " type " << e.getEntTypeName() << " pstatus "
57 << std::bitset<8>(e.getPStatus()) << " owner handle " << e.getOwnerEnt()
58 << " owner proc " << e.getOwnerProc() << " order " << e.getMaxOrder()
59 << " " << *e.getFieldRawPtr();
60 return os;
61}
62
64
65 moab::Interface &moab = e->sPtr->getBasicDataPtr()->moab;
66 const EntityHandle ent = e->getEnt();
67 *const_cast<ApproximationOrder *>(e->getMaxOrderPtr()) = order;
68 std::size_t nb_dofs = e->getOrderNbDofs(order) * e->getNbOfCoeffs();
69
70 double *tag_field_data = nullptr;
71 int tag_field_data_size = 0;
72
73 auto set_verts = [&]() {
74 if (e->getFieldRawPtr()->tagFieldDataVertsType == MB_TAG_SPARSE) {
75 // Get pointer and size of field values tag
76 rval = moab.tag_get_by_ptr(e->getFieldRawPtr()->th_FieldDataVerts, &ent,
77 1, (const void **)&tag_field_data,
78 &tag_field_data_size);
79 if (nb_dofs) {
80 if (nb_dofs != tag_field_data_size) {
81 rval = moab.tag_set_data(e->getFieldRawPtr()->th_FieldDataVerts, &ent,
82 1, &*data.begin());
84 }
85 } else if (rval == MB_SUCCESS) {
86 rval = moab.tag_delete_data(e->getFieldRawPtr()->th_FieldDataVerts,
87 &ent, 1);
89 }
90 } else {
91 rval = moab.tag_get_by_ptr(e->getFieldRawPtr()->th_FieldDataVerts, &ent,
92 1, (const void **)&tag_field_data);
94 rval = moab.tag_set_data(e->getFieldRawPtr()->th_FieldDataVerts, &ent, 1,
95 tag_field_data);
97 }
98 };
99
100 auto set_default = [&]() {
101 if (reduceTagSize || nb_dofs) {
102
103 // Get pointer and size of field values tag
104 rval = moab.tag_get_by_ptr(e->getFieldRawPtr()->th_FieldData, &ent, 1,
105 (const void **)&tag_field_data,
106 &tag_field_data_size);
107
108 if ((reduceTagSize && nb_dofs != tag_field_data_size) ||
109 nb_dofs > tag_field_data_size) {
110
111 // Tag exist and are some data on it
112 if (rval == MB_SUCCESS) {
113 // Size of tag is different than new size, so copy data to new
114 // container
115 data.resize(tag_field_data_size);
116 FieldData *ptr_begin = static_cast<FieldData *>(tag_field_data);
117 FieldData *ptr_end =
118 static_cast<FieldData *>(tag_field_data) + tag_field_data_size;
119 std::copy(ptr_begin, ptr_end, data.begin());
120 }
121
122 if (rval != MB_SUCCESS || nb_dofs) {
123
124 // Set field dof data
125 data.resize(nb_dofs, 0);
126 int tag_size[1];
127 tag_size[0] = data.size();
128 void const *tag_data[] = {&data[0]};
129 rval = moab.tag_set_by_ptr(e->getFieldRawPtr()->th_FieldData, &ent, 1,
130 tag_data, tag_size);
132 rval = moab.tag_get_by_ptr(e->getFieldRawPtr()->th_FieldData, &ent, 1,
133 (const void **)&tag_field_data,
134 &tag_field_data_size);
136
137 } else {
138
139 rval =
140 moab.tag_delete_data(e->getFieldRawPtr()->th_FieldData, &ent, 1);
142 }
143 }
144 }
145 };
146
147 switch (e->getEntType()) {
148 case MBVERTEX:
149 set_verts();
150 break;
151 default:
152 set_default();
153 }
154
155 if (nb_dofs)
156 const_cast<double *&>(*(e->getEntFieldDataPtr())) = tag_field_data;
157 else
158 const_cast<double *&>(*(e->getEntFieldDataPtr())) = nullptr;
159}
160
161} // namespace MoFEM
#define MOAB_THROW(err)
Check error code of MoAB function and throw MoFEM exception.
#define THROW_MESSAGE(msg)
Throw MoFEM exception.
static MoFEMErrorCodeGeneric< moab::ErrorCode > rval
int ApproximationOrder
Approximation on the entity.
Definition Types.hpp:26
implementation of Data Operators for Forces and Sources
Definition Common.hpp:10
std::ostream & operator<<(std::ostream &os, const EntitiesFieldData::EntData &e)
void * get_tag_ptr(moab::Interface &moab, Tag th, EntityHandle ent, int *tag_size)
Get the tag ptr object.
void operator()(boost::shared_ptr< FieldEntity > &e)
Struct keeps handle to entity in the field.
static constexpr int dof_shift
UId getLocalUniqueIdCalculate()
Get the Local Unique Id Calculate object.
boost::shared_ptr< FieldData *const > fieldDataAdaptorPtr
static boost::shared_ptr< FieldData *const > makeSharedFieldDataAdaptorPtr(const boost::shared_ptr< Field > &field_ptr, const boost::shared_ptr< RefEntity > &ref_ents_ptr)
Return shared pointer to entity field data vector adaptor.
static constexpr int proc_shift
boost::shared_ptr< FieldData *const > & getEntFieldDataPtr() const
Get shared ptr to vector adaptor pointing to the field tag data on entity.
FieldEntity(const boost::shared_ptr< Field > field_ptr, const boost::shared_ptr< RefEntity > ref_ents_ptr, boost::shared_ptr< double *const > field_data_adaptor_ptr, boost::shared_ptr< const int > t_max_order_ptr)
ApproximationOrder getMaxOrder() const
Get order set to the entity (Allocated tag size for such number)
const ApproximationOrder * getMaxOrderPtr() const
Get pinter to Tag keeping approximation order.
UId localUId
Local unique id for this entity. Unique on CPU partition.
static constexpr int ent_shift
const UId & getLocalUniqueId() const
Get global unique id.
int getOrderNbDofs(ApproximationOrder order) const
Get number of DOFs on entity for given order of approximation.
boost::shared_ptr< const ApproximationOrder > tagMaxOrderPtr
Field data structure for finite element approximation.
Tag th_FieldData
Tag for field values on entities.
Tag th_FieldDataVerts
Tag for field values on vertices.
TagType tagFieldDataVertsType
Tag type for vertex data storage.
Struct keeps handle to refined handle.
Field interface with separate field and reference entity types.
FieldCoefficientsNumber getNbOfCoeffs() const
Get number of coefficients per DOF.
const Field * getFieldRawPtr() const
Get raw field pointer.
const char * getEntTypeName() const