v0.16.0
Loading...
Searching...
No Matches
PrismsFromSurfaceInterface.cpp
Go to the documentation of this file.
1/** \file PrismsFromSurfaceInterface.cpp
2 * \brief Interface for creating prisms from surface elements
3 */
4
5
6
7namespace MoFEM {
8
10 const EntityHandle tri3_nodes[3], const EntityHandle tri4_nodes[3],
11 const SwapType swap_type, EntityHandle &prism) {
13 Interface &m_field = cOre;
14
15 EntityHandle prism_nodes[6] = {tri3_nodes[0], tri3_nodes[1], tri3_nodes[2],
16 tri4_nodes[0], tri4_nodes[1], tri4_nodes[2]};
17
18 switch (swap_type) {
20 std::swap(prism_nodes[1], prism_nodes[2]);
21 std::swap(prism_nodes[4], prism_nodes[5]);
22 break;
24 std::swap(prism_nodes[0], prism_nodes[3]);
25 std::swap(prism_nodes[1], prism_nodes[4]);
26 std::swap(prism_nodes[2], prism_nodes[5]);
27 break;
28 case NO_SWAP:
29 default:
30 break;
31 }
32
33 CHKERR m_field.get_moab().create_element(MBPRISM, prism_nodes, 6, prism);
34
36}
37
39 boost::typeindex::type_index type_index, UnknownInterface **iface) const {
40 *iface = const_cast<PrismsFromSurfaceInterface *>(this);
41 return 0;
42}
43
50
52 const Range &ents, const SwapType swap_type, Range &prisms, int verb) {
54 Interface &m_field = cOre;
55 Range tris = ents.subset_by_type(MBTRI);
56 for (Range::iterator tit = tris.begin(); tit != tris.end(); tit++) {
57 const EntityHandle *conn;
58 int number_nodes = 0;
59 CHKERR m_field.get_moab().get_connectivity(*tit, conn, number_nodes, false);
60 double coords[3 * number_nodes];
61 CHKERR m_field.get_moab().get_coords(conn, number_nodes, coords);
62 EntityHandle prism_face3[3];
63 EntityHandle prism_face4[3];
64 for (int nn = 0; nn < 3; nn++) {
65 prism_face3[nn] = conn[nn];
66 if (createdVertices.find(conn[nn]) != createdVertices.end()) {
67 prism_face4[nn] = createdVertices[prism_face3[nn]];
68 } else {
69 CHKERR m_field.get_moab().create_vertex(&coords[3 * nn], prism_face4[nn]);
70 createdVertices[conn[nn]] = prism_face4[nn];
71 CHKERR m_field.get_moab().tag_set_data(cOre.get_th_RefParentHandle(),
72 &prism_face4[nn], 1,
73 &prism_face3[nn]);
74 }
75 }
76
77 EntityHandle prism;
78 CHKERR createPrism(prism_face3, prism_face4, swap_type, prism);
79 Range edges;
80 CHKERR m_field.get_moab().get_adjacencies(&prism, 1, 1, true, edges,
81 moab::Interface::UNION);
82 Range faces;
83 CHKERR m_field.get_moab().get_adjacencies(&prism, 1, 2, true, faces,
84 moab::Interface::UNION);
85 prisms.insert(prism);
86 for (int ee = 0; ee <= 2; ee++) {
87 EntityHandle e1;
88 CHKERR m_field.get_moab().side_element(prism, 1, ee, e1);
89 EntityHandle e2;
90 CHKERR m_field.get_moab().side_element(prism, 1, ee + 6, e2);
91 CHKERR m_field.get_moab().tag_set_data(cOre.get_th_RefParentHandle(), &e2,
92 1, &e1);
93 }
94 EntityHandle f3, f4;
95 {
96 CHKERR m_field.get_moab().side_element(prism, 2, 3, f3);
97 CHKERR m_field.get_moab().side_element(prism, 2, 4, f4);
98 CHKERR m_field.get_moab().tag_set_data(cOre.get_th_RefParentHandle(), &f4,
99 1, &f3);
100 }
101 if (number_nodes > 3) {
102 EntityHandle meshset;
103 CHKERR m_field.get_moab().create_meshset(MESHSET_SET, meshset);
104 CHKERR m_field.get_moab().add_entities(meshset, &f4, 1);
105 for (int ee = 0; ee <= 2; ee++) {
106 EntityHandle e2;
107 CHKERR m_field.get_moab().side_element(prism, 1, ee + 6, e2);
108 CHKERR m_field.get_moab().add_entities(meshset, &e2, 1);
109 }
110 CHKERR m_field.get_moab().convert_entities(meshset, true, false, false);
111 CHKERR m_field.get_moab().delete_entities(&meshset, 1);
112 const EntityHandle *conn_f4;
113 int number_nodes_f4 = 0;
114 CHKERR m_field.get_moab().get_connectivity(f4, conn_f4, number_nodes_f4,
115 false);
116 if (number_nodes_f4 != number_nodes) {
117 SETERRQ(PETSC_COMM_SELF, MOFEM_DATA_INCONSISTENCY,
118 "data inconsistency");
119 }
120 CHKERR m_field.get_moab().set_coords(&conn_f4[3], 3, &coords[9]);
121 }
122 }
124}
125
127 Range &prisms, const BitRefLevel &bit, int verb) {
128 Interface &m_field = cOre;
129 auto ref_ents_ptr = m_field.get_ref_ents();
131 MPI_Comm comm = m_field.get_comm();
132 RefEntity_multiIndex *refined_entities_ptr;
133 refined_entities_ptr =
134 const_cast<RefEntity_multiIndex *>(ref_ents_ptr);
135 if (!prisms.empty()) {
136 int dim = m_field.get_moab().dimension_from_handle(prisms[0]);
137 for (int dd = 0; dd <= dim; dd++) {
138 Range ents;
139 CHKERR m_field.get_moab().get_adjacencies(prisms, dd, true, ents,
140 moab::Interface::UNION);
141 Range::iterator eit = ents.begin();
142 for (; eit != ents.end(); eit++) {
143 std::pair<RefEntity_multiIndex::iterator, bool> p_ent =
144 refined_entities_ptr->insert(boost::shared_ptr<RefEntity>(
145 new RefEntity(m_field.get_basic_entity_data_ptr(), *eit)));
146 *(const_cast<RefEntity *>(p_ent.first->get())->getBitRefLevelPtr()) |=
147 bit;
148 if (verb >= VERY_VERBOSE) {
149 std::ostringstream ss;
150 ss << *(p_ent.first);
151 PetscSynchronizedPrintf(comm, "%s\n", ss.str().c_str());
152 }
153 }
154 }
155 }
157}
158
160 const Range &prisms, bool from_down, Range &out_prisms, int verb) {
162 Interface &m_field = cOre;
163 Range tris;
164 for (Range::iterator pit = prisms.begin(); pit != prisms.end(); pit++) {
165 EntityHandle face;
166 if (from_down) {
167 CHKERR m_field.get_moab().side_element(*pit, 2, 3, face);
168 } else {
169 CHKERR m_field.get_moab().side_element(*pit, 2, 4, face);
170 }
171 tris.insert(face);
172 }
173 CHKERR createPrisms(tris, NO_SWAP, out_prisms, verb);
175}
176
178 const Range &prisms, const double director3[], const double director4[]) {
180 Interface &m_field = cOre;
181 Range nodes_f3, nodes_f4;
182 for (Range::iterator pit = prisms.begin(); pit != prisms.end(); pit++) {
183 for (int ff = 3; ff <= 4; ff++) {
184 EntityHandle face;
185 CHKERR m_field.get_moab().side_element(*pit, 2, ff, face);
186 const EntityHandle *conn;
187 int number_nodes = 0;
188 CHKERR m_field.get_moab().get_connectivity(face, conn, number_nodes,
189 false);
190 if (ff == 3) {
191 nodes_f3.insert(&conn[0], &conn[number_nodes]);
192 } else {
193 nodes_f4.insert(&conn[0], &conn[number_nodes]);
194 }
195 }
196 }
197 double coords[3];
198 for (Range::iterator nit = nodes_f3.begin(); nit != nodes_f3.end(); nit++) {
199 CHKERR m_field.get_moab().get_coords(&*nit, 1, coords);
200 cblas_daxpy(3, 1, director3, 1, coords, 1);
201 CHKERR m_field.get_moab().set_coords(&*nit, 1, coords);
202 }
203 for (Range::iterator nit = nodes_f4.begin(); nit != nodes_f4.end(); nit++) {
204 CHKERR m_field.get_moab().get_coords(&*nit, 1, coords);
205 cblas_daxpy(3, 1, director4, 1, coords, 1);
206 CHKERR m_field.get_moab().set_coords(&*nit, 1, coords);
207 }
209}
210
212 const Range &prisms, double thickness3, double thickness4) {
213 Interface &m_field = cOre;
215
216 auto add_normal = [&](std::map<EntityHandle, std::array<double, 3>> &nodes,
217 EntityHandle face) {
219 const EntityHandle *conn;
220 int number_nodes;
221 CHKERR m_field.get_moab().get_connectivity(face, conn, number_nodes, false);
222 std::array<double, 9> coords;
223 CHKERR m_field.get_moab().get_coords(conn, number_nodes, coords.data());
224 std::array<double, 3> normal;
225 CHKERR Tools::getTriNormal(coords.data(), normal.data());
226 double a = sqrt(normal[0] * normal[0] + normal[1] * normal[1] +
227 normal[2] * normal[2]);
228 for (auto d : {0, 1, 2})
229 normal[d] /= a;
230 for (auto n : {0, 1, 2}) {
231 try {
232 for (auto d : {0, 1, 2})
233 nodes.at(conn[n])[d] += normal[d];
234 } catch (...) {
235 nodes.insert(
236 std::pair<EntityHandle, std::array<double, 3>>(conn[n], normal));
237 }
238 }
240 };
241
242 auto apply_map = [&](auto &nodes, double t) {
244 for (auto &m : nodes) {
245 std::array<double, 3> coords;
246 CHKERR m_field.get_moab().get_coords(&m.first, 1, coords.data());
247 auto &normal = m.second;
248 double a = sqrt(normal[0] * normal[0] + normal[1] * normal[1] +
249 normal[2] * normal[2]);
250 for (auto d : {0, 1, 2})
251 coords[d] += (normal[d] / a) * t;
252 CHKERR m_field.get_moab().set_coords(&m.first, 1, coords.data());
253 }
255 };
256
257 map<EntityHandle, std::array<double, 3>> nodes_f3, nodes_f4;
258 for (Range::iterator pit = prisms.begin(); pit != prisms.end(); pit++) {
259 for (int ff = 3; ff <= 4; ff++) {
260 EntityHandle face;
261 CHKERR m_field.get_moab().side_element(*pit, 2, ff, face);
262 if (ff == 3)
263 CHKERR add_normal(nodes_f3, face);
264 else
265 CHKERR add_normal(nodes_f4, face);
266 }
267 }
268
269 CHKERR apply_map(nodes_f3, thickness3);
270 CHKERR apply_map(nodes_f4, thickness4);
271
273}
274
277 Interface &m_field = cOre;
279 Range prisms_edges;
280 CHKERR m_field.get_moab().get_adjacencies(prisms, 1, true, prisms_edges,
281 moab::Interface::UNION);
282 Range prisms_faces;
283 CHKERR m_field.get_moab().get_adjacencies(prisms, 2, true, prisms_faces,
284 moab::Interface::UNION);
285 for (_IT_CUBITMESHSETS_FOR_LOOP_(m_field, it)) {
286 Range edges;
287 CHKERR m_field.get_moab().get_entities_by_type(it->meshset, MBEDGE, edges,
288 true);
289 edges = intersect(edges, prisms_edges);
290 if (!edges.empty()) {
291 Range edges_faces;
292 CHKERR m_field.get_moab().get_adjacencies(edges, 2, false, edges_faces,
293 moab::Interface::UNION);
294 edges_faces = intersect(edges_faces, prisms_faces.subset_by_type(MBQUAD));
295 EntityHandle meshset = it->getMeshset();
296 CHKERR m_field.get_moab().add_entities(meshset, edges_faces);
297 }
298 }
300}
301
304 Interface &m_field = cOre;
306 Range prisms_tris;
307 CHKERR m_field.get_moab().get_adjacencies(prisms, 2, true, prisms_tris,
308 moab::Interface::UNION);
309 prisms_tris = prisms_tris.subset_by_type(MBTRI);
310 for (_IT_CUBITMESHSETS_FOR_LOOP_(m_field, it)) {
311 Range tris;
312 CHKERR m_field.get_moab().get_entities_by_type(it->meshset, MBTRI, tris,
313 true);
314 tris = intersect(tris, prisms_tris);
315 if (!tris.empty()) {
316 Range tris_ents;
317 CHKERR m_field.get_moab().get_adjacencies(tris, 3, false, tris_ents,
318 moab::Interface::UNION);
319 tris_ents = intersect(tris_ents, prisms);
320 EntityHandle meshset = it->getMeshset();
321 CHKERR m_field.get_moab().add_entities(meshset, tris_ents);
322 }
323 }
325}
326
327} // namespace MoFEM
constexpr double a
@ VERY_VERBOSE
#define MoFEMFunctionReturnHot(a)
Last executable line of each PETSc function used for error handling. Replaces return()
#define MoFEMFunctionBegin
First executable line of each MoFEM function, used for error handling. Final line of MoFEM functions ...
@ MOFEM_DATA_INCONSISTENCY
Definition definitions.h:31
#define DEPRECATED
Definition definitions.h:17
#define MoFEMFunctionReturn(a)
Last executable line of each PETSc function used for error handling. Replaces return()
#define CHKERR
Inline error check.
#define MoFEMFunctionBeginHot
First executable line of each MoFEM function, used for error handling. Final line of MoFEM functions ...
virtual const RefEntity_multiIndex * get_ref_ents() const =0
Get the ref ents object.
#define _IT_CUBITMESHSETS_FOR_LOOP_(MESHSET_MANAGER, IT)
Iterator that loops over all the Cubit MeshSets in a moFEM field.
auto bit
set bit
const double n
refractive index of diffusive medium
PetscErrorCode MoFEMErrorCode
MoFEM/PETSc error code.
std::bitset< BITREFLEVEL_SIZE > BitRefLevel
Bit structure attached to each entity identifying to what mesh entity is attached.
Definition Types.hpp:40
implementation of Data Operators for Forces and Sources
Definition Common.hpp:10
multi_index_container< boost::shared_ptr< RefEntity >, indexed_by< ordered_unique< tag< Ent_mi_tag >, const_mem_fun< RefEntity, EntityHandle, &RefEntity::getEnt > >, ordered_non_unique< tag< Ent_Ent_mi_tag >, const_mem_fun< RefEntity, EntityHandle, &RefEntity::getParentEnt > >, ordered_non_unique< tag< Composite_EntType_and_ParentEntType_mi_tag >, composite_key< RefEntity, const_mem_fun< RefEntity, EntityType, &RefEntity::getEntType >, const_mem_fun< RefEntity, EntityType, &RefEntity::getParentEntType > > >, ordered_non_unique< tag< Composite_ParentEnt_And_EntType_mi_tag >, composite_key< RefEntity, const_mem_fun< RefEntity, EntityType, &RefEntity::getEntType >, const_mem_fun< RefEntity, EntityHandle, &RefEntity::getParentEnt > > > > > RefEntity_multiIndex
RefEntityTmp< 0 > RefEntity
constexpr double t
plate stiffness
Definition plate.cpp:58
FTensor::Index< 'm', 3 > m
virtual moab::Interface & get_moab()=0
virtual MPI_Comm & get_comm() const =0
virtual boost::shared_ptr< BasicEntityData > & get_basic_entity_data_ptr()=0
Get pointer to basic entity data.
Tag get_th_RefParentHandle() const
Definition Core.hpp:202
Deprecated interface functions.
std::map< EntityHandle, EntityHandle > createdVertices
MoFEMErrorCode createPrism(const EntityHandle tri3_nodes[3], const EntityHandle tri4_nodes[3], const SwapType swap_type, EntityHandle &prism)
Create a prism from two triangle node triplets.
MoFEMErrorCode setNormalThickness(const Range &prisms, double thickness3, double thickness4)
MoFEMErrorCode createPrisms(const Range &ents, const SwapType swap_type, Range &prisms, int verb=-1)
Make prisms from triangles.
MoFEMErrorCode updateMeshestByEdgeBlock(const Range &prisms)
Add quads to bockset.
MoFEMErrorCode setThickness(const Range &prisms, const double director3[], const double director4[])
SwapType
List of types of node swapping performed on a created prism Node swapping is required to satisfy the ...
MoFEMErrorCode query_interface(boost::typeindex::type_index type_index, UnknownInterface **iface) const
MoFEMErrorCode seedPrismsEntities(Range &prisms, const BitRefLevel &bit, int verb=-1)
Seed prism entities by bit level.
MoFEMErrorCode createPrismsFromPrisms(const Range &prisms, bool from_down, Range &out_prisms, int verb=-1)
Make prisms by extruding top or bottom prisms.
MoFEMErrorCode updateMeshestByTriBlock(const Range &prisms)
Add prism to bockset.
Struct keeps handle to refined handle.
static MoFEMErrorCode getTriNormal(const double *coords, double *normal, double *d_normal=nullptr)
Get the Tri Normal objectGet triangle normal.
Definition Tools.cpp:353
base class for all interface classes