158 {
160 const EntityHandle prism = fe.getEnt();
162
163 fe.getRefElement()->getSideNumberPtr(prism);
164 EntityHandle face_side3, face_side4;
165 CHKERR moab.side_element(prism, 2, 3, face_side3);
166 CHKERR moab.side_element(prism, 2, 4, face_side4);
167 fe.getRefElement()->getSideNumberPtr(face_side3);
168 fe.getRefElement()->getSideNumberPtr(face_side4);
169 for (int qq = 0; qq < 3; qq++) {
170 EntityHandle quad = 0;
171 rval = moab.side_element(prism, 2, qq, quad);
172 if (
rval != MB_SUCCESS || quad == 0)
173 continue;
174 int side_number, sense, offset;
175 rval = moab.side_number(prism, quad, side_number, sense, offset);
176 if (side_number == -1 ||
rval != MB_SUCCESS)
177 continue;
179 .insert(boost::shared_ptr<SideNumber>(
180 new SideNumber(quad, side_number, sense, offset)));
181 }
182 int ee = 0;
183 for (; ee < 3; ee++) {
184 EntityHandle edge = 0;
185 CHKERR moab.side_element(prism, 1, ee, edge);
186 boost::shared_ptr<SideNumber> side_ptr =
187 fe.getRefElement()->getSideNumberPtr(edge);
188 if (side_ptr->side_number != ee) {
190 "data inconsistency for edge %d while in FE datastructure is "
191 "numbered %d.",
192 ee, side_ptr->side_number);
193 }
194 CHKERR moab.side_element(prism, 1, 6 + ee, edge);
195 side_ptr = fe.getRefElement()->getSideNumberPtr(edge);
196 if (side_ptr->side_number != ee + 6) {
197 if (side_ptr->side_number != ee) {
199 "data inconsistency for edge %d while in FE datastructure "
200 "is numbered %d.",
201 ee, side_ptr->side_number);
202 } else {
203 side_ptr->brother_side_number = ee + 6;
204 }
205 }
206 }
207 for (; ee < 6; ee++) {
208 EntityHandle edge = 0;
209 rval = moab.side_element(prism, 1, ee, edge);
210 if (
rval != MB_SUCCESS || edge == 0)
211 continue;
212 int side_number, sense, offset;
213 rval = moab.side_number(prism, edge, side_number, sense, offset);
214 if (side_number == -1 ||
rval != MB_SUCCESS)
215 continue;
217 .insert(boost::shared_ptr<SideNumber>(
218 new SideNumber(edge, side_number, sense, offset)));
219 }
220 int nn = 0;
221 for (; nn < 3; nn++) {
222 EntityHandle node;
223 CHKERR moab.side_element(prism, 0, nn, node);
224 boost::shared_ptr<SideNumber> side_ptr =
225 fe.getRefElement()->getSideNumberPtr(node);
226 if (side_ptr->side_number != nn) {
228 "data inconsistency for node %d while in FE datastructure is "
229 "numbered %d.",
230 nn, side_ptr->side_number);
231 }
232 CHKERR moab.side_element(prism, 0, nn + 3, node);
233 side_ptr = fe.getRefElement()->getSideNumberPtr(node);
234 if (side_ptr->side_number != nn + 3) {
235 if (side_ptr->side_number != nn) {
237 "data inconsistency for node %d while in FE datastructure is "
238 "numbered %d.",
239 nn, side_ptr->side_number);
240 } else {
241 side_ptr->brother_side_number = nn + 3;
242 }
243 }
244 }
245
246
248 switch (field.getSpace()) {
250
251
252 CHKERR moab.get_adjacencies(&prism, 1, 0,
false, nodes,
253 moab::Interface::UNION);
254 {
256 CHKERR moab.get_connectivity(&prism, 1, topo_nodes,
true);
258 CHKERR moab.get_connectivity(&prism, 1, mid_nodes,
false);
259 mid_nodes = subtract(mid_nodes, topo_nodes);
260 nodes = subtract(nodes, mid_nodes);
261 }
262 adjacency.insert(adjacency.end(), nodes.begin(), nodes.end());
264 auto siit = side_table.get<0>().lower_bound(get_id_for_min_type<MBEDGE>());
265 auto hi_siit =
266 side_table.get<0>().upper_bound(get_id_for_max_type<MBEDGE>());
267 for (; siit != hi_siit; siit++)
268 adjacency.push_back(siit->get()->ent);
269 }
271 auto siit = side_table.get<0>().lower_bound(get_id_for_min_type<MBTRI>());
272 auto hi_siit =
273 side_table.get<0>().upper_bound(get_id_for_max_type<MBQUAD>());
274 for (; siit != hi_siit; siit++)
275 adjacency.push_back(siit->get()->ent);
276 }
278 adjacency.push_back(prism);
279 break;
281 CHKERR moab.get_entities_by_handle(field.getMeshset(), adjacency,
false);
282 for (auto ent : adjacency) {
284 .insert(boost::shared_ptr<SideNumber>(new SideNumber(ent, -1, 0, 0)));
285 }
286 } break;
287 default:
289 "this field is not implemented for TRI finite element");
290 }
292}
@ MOFEM_DATA_INCONSISTENCY
static MoFEMErrorCodeGeneric< moab::ErrorCode > rval