44 namespace NekMeshUtils
49 "Extracts mesh from cfi");
63 cout << endl <<
"Loading mesh from CFI" << endl;
76 map<int, NodeSharedPtr> nodes;
77 vector<cfi::NodeDefinition> *cfinodes =
m_model->getFenodes();
81 cout <<
"Nodes " << cfinodes->size() << endl;
85 for (
auto &it : *cfinodes)
88 cfi::Position ps = it.node->getXYZ();
92 int id = it.node->number;
95 std::shared_ptr<Node>(
new Node(
id, xyz[0], xyz[1], xyz[2]));
96 nodes.insert(pair<int, NodeSharedPtr>(
id, n));
99 cfi::MeshableEntity *
p = it.parent;
101 if (p->type == cfi::TYPE_LINE)
103 auto f = m_nameToCurveId.find(p->getName());
104 if (f != m_nameToCurveId.end())
109 n->SetCADCurve(c, t);
111 vector<pair<CADSurfSharedPtr, CADOrientation::Orientation>> ss =
113 for (
int j = 0; j < ss.size(); j++)
116 n->SetCADSurf(ss[j].first, uv);
120 else if (p->type == cfi::TYPE_FACE)
127 n->SetCADSurf(s, uv);
130 else if (p->type == cfi::TYPE_POINT)
136 vector<CADCurveSharedPtr> cs = v->GetAdjCurves();
137 for (
int i = 0; i < cs.size(); i++)
141 n->SetCADCurve(cs[i], t);
142 vector<pair<CADSurfSharedPtr, CADOrientation::Orientation>>
143 ss = cs[i]->GetAdjSurf();
144 for (
int j = 0; j < ss.size(); j++)
147 n->SetCADSurf(ss[j].first, uv);
163 map<int, set<LibUtilities::ShapeType>> cfiIdToTypes;
165 vector<cfi::ElementDefinition> *prisms =
166 m_model->getElements(cfi::SUBTYPE_PE6, 6);
167 for (
auto &it : *prisms)
169 vector<cfi::Node *> ns = it.nodes;
170 for (
int i = 0; i < ns.size(); i++)
175 vector<cfi::ElementDefinition> *hexs =
176 m_model->getElements(cfi::SUBTYPE_HE8, 8);
177 for (
auto &it : *hexs)
179 vector<cfi::Node *> ns = it.nodes;
180 for (
int i = 0; i < ns.size(); i++)
185 vector<cfi::ElementDefinition> *tets =
186 m_model->getElements(cfi::SUBTYPE_TE4, 4);
187 for (
auto &it : *tets)
189 vector<cfi::Node *> ns = it.nodes;
190 for (
int i = 0; i < ns.size(); i++)
196 WARNINGL0(nodes.size() == cfiIdToTypes.size(),
"not all nodes marked");
200 for (
int i = 1; i <= 3; i++)
202 for (
auto &it : cfiIdToTypes)
204 if (it.second.size() == i)
206 nodes[it.first]->m_id =
id++;
211 WARNINGL0(
id == nodes.size(),
"not all nodes numbered");
213 int prefix =
m_mesh->m_cad->GetNumSurf() > 100 ? 1000 : 100;
217 cout <<
"prisms " << prisms->size() << endl;
220 int nm[6] = {3, 2, 5, 0, 1, 4};
221 for (
auto &it : *prisms)
223 vector<NodeSharedPtr> n(6);
225 vector<cfi::Node *> ns = it.nodes;
227 for (
int j = 0; j < ns.size(); j++)
229 n[nm[j]] = nodes[ns[j]->number];
233 tags.push_back(prefix + 1);
239 m_mesh->m_element[3].push_back(E);
244 cout <<
"tets " << tets->size() << endl;
247 for (
auto &it : *tets)
249 vector<NodeSharedPtr> n;
250 vector<cfi::Node *> ns = it.nodes;
252 for (
int j = 0; j < ns.size(); j++)
254 n.push_back(nodes[ns[j]->number]);
258 tags.push_back(prefix);
263 m_mesh->m_element[3].push_back(E);
268 cout <<
"hexes " << hexs->size() << endl;
271 for (
auto &it : *hexs)
273 vector<NodeSharedPtr> n;
274 vector<cfi::Node *> ns = it.nodes;
276 for (
int j = 0; j < ns.size(); j++)
278 n.push_back(nodes[ns[j]->number]);
282 tags.push_back(prefix + 2);
287 m_mesh->m_element[3].push_back(E);
296 vector<cfi::ElementDefinition> *tris =
297 m_model->getElements(cfi::SUBTYPE_TR3, 3);
300 cout <<
"tris " << tris->size() << endl;
303 for (
auto &it : *tris)
305 cfi::MeshableEntity *
p = it.parent;
310 vector<NodeSharedPtr> n;
311 vector<cfi::Node *> ns = it.nodes;
313 for (
int j = 0; j < ns.size(); j++)
315 n.push_back(nodes[ns[j]->number]);
319 tags.push_back(f->second);
325 new Face(E->GetVertexList(), vector<NodeSharedPtr>(),
328 FaceSet::iterator fnd =
m_mesh->m_faceSet.find(fc);
330 "surface element not found in mesh");
334 if (mf->m_elLink.size() == 1)
336 E->m_parentCAD =
m_mesh->m_cad->GetSurf(f->second);
337 m_mesh->m_element[2].push_back(E);
342 vector<cfi::ElementDefinition> *quads =
343 m_model->getElements(cfi::SUBTYPE_QU4, 4);
346 cout <<
"quads " << quads->size() << endl;
349 for (
auto &it : *quads)
351 cfi::MeshableEntity *
p = it.parent;
356 vector<NodeSharedPtr> n;
357 vector<cfi::Node *> ns = it.nodes;
359 for (
int j = 0; j < ns.size(); j++)
361 n.push_back(nodes[ns[j]->number]);
365 tags.push_back(f->second);
372 new Face(E->GetVertexList(), vector<NodeSharedPtr>(),
375 FaceSet::iterator fnd =
m_mesh->m_faceSet.find(fc);
377 "surface element not found in mesh");
381 if (mf->m_elLink.size() == 1)
383 E->m_parentCAD =
m_mesh->m_cad->GetSurf(f->second);
384 m_mesh->m_element[2].push_back(E);
400 for (
int i = 0; i <
m_mesh->m_element[2].size(); i++)
402 vector<EdgeSharedPtr> es =
m_mesh->m_element[2][i]->GetEdgeList();
403 for (
int j = 0; j < es.size(); j++)
405 surfaceEdges.insert(es[j]);
409 vector<cfi::ElementDefinition> *beams =
410 m_model->getElements(cfi::SUBTYPE_BE2, 2);
413 cout <<
"beams " << beams->size() << endl;
416 for (
auto &it : *beams)
418 cfi::MeshableEntity *
p = it.parent;
419 auto f = m_nameToCurveId.find(p->getName());
421 if (f != m_nameToCurveId.end())
423 vector<NodeSharedPtr> n;
424 vector<cfi::Node *> ns = it.nodes;
426 for (
int j = 0; j < ns.size(); j++)
428 n.push_back(nodes[ns[j]->number]);
437 EdgeSet::iterator
find = surfaceEdges.find(ec);
438 if (find == surfaceEdges.end())
445 me->m_parentCAD =
m_mesh->m_cad->GetCurve(f->second);
std::map< std::string, int > m_nameToFaceId
std::shared_ptr< CADSurf > CADSurfSharedPtr
#define ASSERTL0(condition, msg)
Basic information about an element.
Represents an edge which joins two points.
std::unordered_set< EdgeSharedPtr, EdgeHash > EdgeSet
std::shared_ptr< CADVert > CADVertSharedPtr
Represents a face comprised of three or more edges.
MeshSharedPtr m_mesh
Mesh object.
std::shared_ptr< Edge > EdgeSharedPtr
Shared pointer to an edge.
std::shared_ptr< Mesh > MeshSharedPtr
Shared pointer to a mesh.
ElementFactory & GetElementFactory()
std::shared_ptr< Node > NodeSharedPtr
std::shared_ptr< Face > FaceSharedPtr
1D Evenly-spaced points using Lagrange polynomial
tBaseSharedPtr CreateInstance(tKey idKey, tParam... args)
Create an instance of the class referred to by idKey.
std::pair< ModuleType, std::string > ModuleKey
virtual NEKMESHUTILS_EXPORT void ProcessFaces(bool ReprocessFaces=true)
Extract element faces.
std::shared_ptr< Element > ElementSharedPtr
virtual NEKMESHUTILS_EXPORT void ProcessElements()
Generate element IDs.
std::shared_ptr< CADCurve > CADCurveSharedPtr
#define WARNINGL0(condition, msg)
Abstract base class for processing modules.
virtual NEKMESHUTILS_EXPORT void ProcessVertices()
Extract element vertices.
std::map< std::string, int > m_nameToVertId
virtual NEKMESHUTILS_EXPORT void ProcessEdges(bool ReprocessEdges=true)
Extract element edges.
InputIterator find(InputIterator first, InputIterator last, InputIterator startingpoint, const EqualityComparable &value)
CADSystemCFISharedPtr m_cad
tKey RegisterCreatorFunction(tKey idKey, CreatorFunction classCreator, std::string pDesc="")
Register a class with the factory.
virtual NEKMESHUTILS_EXPORT void ProcessComposites()
Generate composites.
std::map< std::string, int > m_nameToCurveId
ModuleFactory & GetModuleFactory()