63 {
64
65 moab::Interface &moab = e->sPtr->getBasicDataPtr()->moab;
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
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,
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 = [&]() {
102
103
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
109 nb_dofs > tag_field_data_size) {
110
111
112 if (
rval == MB_SUCCESS) {
113
114
115 data.resize(tag_field_data_size);
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
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
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}
#define MOAB_THROW(err)
Check error code of MoAB function and throw MoFEM exception.
static MoFEMErrorCodeGeneric< moab::ErrorCode > rval
double FieldData
Field data type.
int ApproximationOrder
Approximation on the entity.
std::vector< FieldData > data