Nektar++
Public Member Functions | Protected Member Functions | Protected Attributes | List of all members
Nektar::NekMeshUtils::Module Class Referenceabstract

#include <Module.h>

Inheritance diagram for Nektar::NekMeshUtils::Module:
[legend]

Public Member Functions

NEKMESHUTILS_EXPORT Module (MeshSharedPtr p_m)
 
virtual NEKMESHUTILS_EXPORT void Process ()=0
 
NEKMESHUTILS_EXPORT void RegisterConfig (std::string key, std::string value=std::string())
 Register a configuration option with a module. More...
 
NEKMESHUTILS_EXPORT void PrintConfig ()
 Print out all configuration options for a module. More...
 
NEKMESHUTILS_EXPORT void SetDefaults ()
 Sets default configuration options for those which have not been set. More...
 
NEKMESHUTILS_EXPORT MeshSharedPtr GetMesh ()
 
virtual NEKMESHUTILS_EXPORT void ProcessVertices ()
 Extract element vertices. More...
 
virtual NEKMESHUTILS_EXPORT void ProcessEdges (bool ReprocessEdges=true)
 Extract element edges. More...
 
virtual NEKMESHUTILS_EXPORT void ProcessFaces (bool ReprocessFaces=true)
 Extract element faces. More...
 
virtual NEKMESHUTILS_EXPORT void ProcessElements ()
 Generate element IDs. More...
 
virtual NEKMESHUTILS_EXPORT void ProcessComposites ()
 Generate composites. More...
 
virtual NEKMESHUTILS_EXPORT void ClearElementLinks ()
 

Protected Member Functions

NEKMESHUTILS_EXPORT void ReorderPrisms (PerMap &perFaces)
 Reorder node IDs so that prisms and tetrahedra are aligned correctly. More...
 
NEKMESHUTILS_EXPORT void PrismLines (int prism, PerMap &perFaces, std::set< int > &prismsDone, std::vector< ElementSharedPtr > &line)
 

Protected Attributes

MeshSharedPtr m_mesh
 Mesh object. More...
 
std::map< std::string, ConfigOptionm_config
 List of configuration values. More...
 

Detailed Description

Abstract base class for mesh converter modules. Each subclass implements the Process() function, which in some way alters the mesh #m.

Definition at line 156 of file NekMeshUtils/Module/Module.h.

Constructor & Destructor Documentation

◆ Module()

NEKMESHUTILS_EXPORT Nektar::NekMeshUtils::Module::Module ( MeshSharedPtr  p_m)
inline

Definition at line 159 of file NekMeshUtils/Module/Module.h.

References NEKMESHUTILS_EXPORT, and Nektar::NekMeshUtils::ConfigOption::value.

159 : m_mesh(p_m) {}

Member Function Documentation

◆ ClearElementLinks()

void Nektar::NekMeshUtils::Module::ClearElementLinks ( )
virtual

clear all element link information from mesh entities to be able to reprocess new mesh

Definition at line 450 of file NekMeshUtils/Module/Module.cpp.

References m_mesh.

Referenced by Nektar::NekMeshUtils::VolumeMesh::Process(), Nektar::Utilities::ProcessOptiExtract::Process(), Nektar::Utilities::ProcessLinkCheck::Process(), and Nektar::Utilities::ProcessProjectCAD::Process().

451 {
452  EdgeSet::iterator eit;
453 
454  for(eit = m_mesh->m_edgeSet.begin(); eit != m_mesh->m_edgeSet.end(); eit++)
455  {
456  (*eit)->m_elLink.clear();
457  }
458 
459  FaceSet::iterator fit;
460 
461  for(fit = m_mesh->m_faceSet.begin(); fit != m_mesh->m_faceSet.end(); fit++)
462  {
463  (*fit)->m_elLink.clear();
464  }
465 }

◆ GetMesh()

NEKMESHUTILS_EXPORT MeshSharedPtr Nektar::NekMeshUtils::Module::GetMesh ( )
inline

Definition at line 166 of file NekMeshUtils/Module/Module.h.

References NEKMESHUTILS_EXPORT.

167  {
168  return m_mesh;
169  }

◆ PrintConfig()

void Nektar::NekMeshUtils::Module::PrintConfig ( )

Print out all configuration options for a module.

Definition at line 871 of file NekMeshUtils/Module/Module.cpp.

References m_config.

872 {
873  map<string, ConfigOption>::iterator it;
874 
875  if (m_config.size() == 0)
876  {
877  cerr << "No configuration options for this module." << endl;
878  return;
879  }
880 
881  for (it = m_config.begin(); it != m_config.end(); ++it)
882  {
883  cerr << setw(10) << it->first << ": " << it->second.desc
884  << endl;
885  }
886 }
std::map< std::string, ConfigOption > m_config
List of configuration values.

◆ PrismLines()

void Nektar::NekMeshUtils::Module::PrismLines ( int  prism,
PerMap perFaces,
std::set< int > &  prismsDone,
std::vector< ElementSharedPtr > &  line 
)
protected

Definition at line 785 of file NekMeshUtils/Module/Module.cpp.

References m_mesh.

Referenced by ReorderPrisms().

789 {
790  int i;
791  set<int>::iterator it = prismsDone.find(prism);
792  PerMap::iterator it2;
793 
794  if (it == prismsDone.end())
795  {
796  return;
797  }
798 
799  // Remove this prism from the list.
800  prismsDone.erase(it);
801  line.push_back(m_mesh->m_element[3][prism]);
802 
803  // Now find prisms connected to this one through a triangular face.
804  for (i = 1; i <= 3; i += 2)
805  {
806  FaceSharedPtr f = m_mesh->m_element[3][prism]->GetFace(i);
807  int nextId;
808 
809  // See if this face is periodic.
810  it2 = perFaces.find(f->m_id);
811 
812  if (it2 != perFaces.end())
813  {
814  int id2 = it2->second.first->m_id;
815  nextId = it2->second.first->m_elLink[0].first->GetId();
816  perFaces.erase(it2);
817  perFaces.erase(id2);
818  PrismLines(nextId, perFaces, prismsDone, line);
819  }
820 
821  // Nothing else connected to this face.
822  if (f->m_elLink.size() == 1)
823  {
824  continue;
825  }
826 
827  nextId = f->m_elLink[0].first->GetId();
828  if (nextId == m_mesh->m_element[3][prism]->GetId())
829  {
830  nextId = f->m_elLink[1].first->GetId();
831  }
832 
833  PrismLines(nextId, perFaces, prismsDone, line);
834  }
835 }
std::shared_ptr< Face > FaceSharedPtr
Definition: Face.h:155
NEKMESHUTILS_EXPORT void PrismLines(int prism, PerMap &perFaces, std::set< int > &prismsDone, std::vector< ElementSharedPtr > &line)

◆ Process()

virtual NEKMESHUTILS_EXPORT void Nektar::NekMeshUtils::Module::Process ( )
pure virtual

◆ ProcessComposites()

void Nektar::NekMeshUtils::Module::ProcessComposites ( )
virtual

Generate composites.

Generate a list of composites (groups of elements) from tag IDs stored in mesh vertices/edges/faces/elements.

Each element is assigned to a composite ID by an input module. First we scan the element list and generate a list of composite IDs. We then generate the composite objects and populate them with a second scan through the element list.

Definition at line 400 of file NekMeshUtils/Module/Module.cpp.

References m_mesh.

Referenced by Nektar::Utilities::InputMCF::Process(), Nektar::Utilities::InputGmsh::Process(), Nektar::Utilities::InputSem::Process(), Nektar::Utilities::InputNekpp::Process(), Nektar::NekMeshUtils::VolumeMesh::Process(), Nektar::Utilities::InputNek5000::Process(), Nektar::Utilities::ProcessOptiExtract::Process(), Nektar::Utilities::InputTec::Process(), Nektar::Utilities::ProcessExtrude::Process(), Nektar::Utilities::InputPly::Process(), Nektar::Utilities::InputSwan::Process(), Nektar::Utilities::InputVtk::Process(), Nektar::Utilities::InputStar::Process(), Nektar::NekMeshUtils::CFIMesh::Process(), Nektar::NekMeshUtils::SurfaceMesh::Process(), Nektar::Utilities::InputNek::Process(), Nektar::Utilities::ProcessTetSplit::Process(), Nektar::Utilities::ProcessLinkCheck::Process(), Nektar::Utilities::ProcessExtractTetPrismInterface::Process(), Nektar::Utilities::ProcessJac::Process(), Nektar::NekMeshUtils::Generator2D::Process(), and Nektar::Utilities::ProcessBL::Process().

401 {
402  m_mesh->m_composite.clear();
403 
404  // For each element, check to see if a composite has been
405  // created. If not, create a new composite. Otherwise, add the
406  // element to the composite.
407  for (int d = 0; d <= m_mesh->m_expDim; ++d)
408  {
409  vector<ElementSharedPtr> &elmt = m_mesh->m_element[d];
410 
411  for (int i = 0; i < elmt.size(); ++i)
412  {
413  CompositeMap::iterator it;
414  unsigned int tagid = elmt[i]->GetTagList()[0];
415 
416  it = m_mesh->m_composite.find(tagid);
417 
418  if (it == m_mesh->m_composite.end())
419  {
420  CompositeSharedPtr tmp = std::shared_ptr<Composite>(
421  new Composite());
422  pair<CompositeMap::iterator, bool> testIns;
423  tmp->m_id = tagid;
424  tmp->m_tag = elmt[i]->GetTag();
425  if(m_mesh->m_faceLabels.count(tmp->m_id) != 0)
426  {
427  tmp->m_label = m_mesh->m_faceLabels[tmp->m_id];
428  }
429 
430  testIns = m_mesh->m_composite.insert(
431  pair<unsigned int, CompositeSharedPtr>(tagid,tmp));
432  it = testIns.first;
433  }
434 
435  if (elmt[i]->GetTag() != it->second->m_tag)
436  {
437  cout << "Different types of elements in same composite!" << endl;
438  cout << " -> Composite uses " << it->second->m_tag << endl;
439  cout << " -> Element uses " << elmt[i]->GetTag() << endl;
440  cout << "Have you specified physical volumes and surfaces?" << endl;
441  }
442  it->second->m_items.push_back(elmt[i]);
443  }
444  }
445 }
std::shared_ptr< Composite > CompositeSharedPtr
Shared pointer to a composite.
Definition: Composite.h:70

◆ ProcessEdges()

void Nektar::NekMeshUtils::Module::ProcessEdges ( bool  ReprocessEdges = true)
virtual

Extract element edges.

Create a unique set of mesh edges from elements stored in Mesh::element.

All elements are first scanned and a list of unique, enumerated edges produced in #m_edgeSet. Since each element generated its edges independently, we must now ensure that each element only uses edge objects from the #m_edgeSet set This ensures there are no duplicate edge objects. Finally, we scan the list of elements for 1-D boundary elements which correspond to an edge in #m_edgeSet. For such elements, we set its edgeLink to reference the corresponding edge in #m_edgeSet.

This routine only proceeds if the expansion dimension is 2 or 3.

Definition at line 174 of file NekMeshUtils/Module/Module.cpp.

References m_mesh.

Referenced by Nektar::Utilities::InputMCF::Process(), Nektar::Utilities::InputGmsh::Process(), Nektar::Utilities::InputSem::Process(), Nektar::Utilities::InputNekpp::Process(), Nektar::NekMeshUtils::VolumeMesh::Process(), Nektar::Utilities::InputNek5000::Process(), Nektar::Utilities::InputTec::Process(), Nektar::Utilities::ProcessExtrude::Process(), Nektar::Utilities::InputPly::Process(), Nektar::Utilities::InputSwan::Process(), Nektar::Utilities::InputVtk::Process(), Nektar::Utilities::InputStar::Process(), Nektar::NekMeshUtils::CFIMesh::Process(), Nektar::Utilities::InputNek::Process(), Nektar::NekMeshUtils::SurfaceMesh::Process(), Nektar::Utilities::ProcessExtractTetPrismInterface::Process(), Nektar::Utilities::ProcessTetSplit::Process(), Nektar::Utilities::ProcessLinkCheck::Process(), Nektar::Utilities::ProcessJac::Process(), Nektar::NekMeshUtils::Generator2D::Process(), Nektar::Utilities::ProcessBL::Process(), and ReorderPrisms().

175 {
176  if (m_mesh->m_expDim < 2) return;
177 
178  if(ReprocessEdges)
179  {
180  vector<ElementSharedPtr> &elmt = m_mesh->m_element[m_mesh->m_expDim];
181 
182  m_mesh->m_edgeSet.clear();
183 
184  // Clear all edge links
185 
186  // Scan all elements and generate list of unique edges
187  for (int i = 0, eid = 0; i < elmt.size(); ++i)
188  {
189  for (int j = 0; j < elmt[i]->GetEdgeCount(); ++j)
190  {
191  pair<EdgeSet::iterator,bool> testIns;
192  EdgeSharedPtr ed = elmt[i]->GetEdge(j);
193  testIns = m_mesh->m_edgeSet.insert(ed);
194 
195  if (testIns.second)
196  {
197  EdgeSharedPtr ed2 = *testIns.first;
198  ed2->m_id = eid++;
199  ed2->m_elLink.push_back(
200  pair<ElementSharedPtr,int>(elmt[i],j));
201  }
202  else
203  {
204  EdgeSharedPtr e2 = *(testIns.first);
205  elmt[i]->SetEdge(j, e2);
206  if (e2->m_edgeNodes.size() == 0 &&
207  ed->m_edgeNodes.size() > 0)
208  {
209  e2->m_curveType = ed->m_curveType;
210  e2->m_edgeNodes = ed->m_edgeNodes;
211 
212  // Reverse nodes if appropriate.
213  if (e2->m_n1->m_id != ed->m_n1->m_id)
214  {
215  reverse(e2->m_edgeNodes.begin(),
216  e2->m_edgeNodes.end());
217  }
218  }
219 
220  e2->m_parentCAD = ed->m_parentCAD;
221 
222  // Update edge to element map.
223  e2->m_elLink.push_back(
224  pair<ElementSharedPtr,int>(elmt[i],j));
225  }
226  }
227  }
228  }
229 
230  // Create links for 1D elements
231  for (int i = 0; i < m_mesh->m_element[1].size(); ++i)
232  {
233  ElementSharedPtr elmt = m_mesh->m_element[1][i];
234  NodeSharedPtr v0 = elmt->GetVertex(0);
235  NodeSharedPtr v1 = elmt->GetVertex(1);
236  vector<NodeSharedPtr> edgeNodes;
237  EdgeSharedPtr E = std::shared_ptr<Edge>(
238  new Edge(v0, v1, edgeNodes, elmt->GetConf().m_edgeCurveType));
239 
240  EdgeSet::iterator it = m_mesh->m_edgeSet.find(E);
241  if (it == m_mesh->m_edgeSet.end())
242  {
243  cerr << "Cannot find corresponding element edge for "
244  << "1D element " << i << endl;
245  abort();
246  }
247  elmt->SetEdgeLink(*it);
248 
249  // Update 2D element boundary map.
250  pair<ElementSharedPtr, int> eMap = (*it)->m_elLink.at(0);
251  eMap.first->SetBoundaryLink(eMap.second, i);
252 
253  // Update vertices
254  elmt->SetVertex(0, (*it)->m_n1, false);
255  elmt->SetVertex(1, (*it)->m_n2, false);
256 
257  // Copy curvature to edge.
258  if ((*it)->m_edgeNodes.size() > 0)
259  {
260  ElementSharedPtr edge = elmt;
261  if (edge->GetVertex(0) == (*it)->m_n1)
262  {
263  edge->SetVolumeNodes((*it)->m_edgeNodes);
264  }
265  elmt->SetCurveType((*it)->m_curveType);
266  }
267  }
268 }
std::shared_ptr< Edge > EdgeSharedPtr
Shared pointer to an edge.
Definition: Edge.h:136
std::shared_ptr< Node > NodeSharedPtr
Definition: CADVert.h:49
std::shared_ptr< Element > ElementSharedPtr
Definition: Edge.h:49

◆ ProcessElements()

void Nektar::NekMeshUtils::Module::ProcessElements ( )
virtual

Generate element IDs.

Enumerate elements stored in Mesh::element.

For all elements of equal dimension to the mesh dimension, we enumerate sequentially. All other elements in the list should be of lower dimension and have ID set by a corresponding edgeLink or faceLink (as set in ProcessEdges or ProcessFaces).

Definition at line 382 of file NekMeshUtils/Module/Module.cpp.

References m_mesh.

Referenced by Nektar::Utilities::InputMCF::Process(), Nektar::Utilities::InputGmsh::Process(), Nektar::Utilities::InputSem::Process(), Nektar::NekMeshUtils::VolumeMesh::Process(), Nektar::Utilities::InputNek5000::Process(), Nektar::Utilities::InputTec::Process(), Nektar::Utilities::ProcessExtrude::Process(), Nektar::Utilities::InputSwan::Process(), Nektar::Utilities::InputVtk::Process(), Nektar::Utilities::InputPly::Process(), Nektar::Utilities::InputStar::Process(), Nektar::NekMeshUtils::CFIMesh::Process(), Nektar::Utilities::InputNek::Process(), Nektar::NekMeshUtils::SurfaceMesh::Process(), Nektar::Utilities::ProcessJac::Process(), Nektar::Utilities::ProcessExtractTetPrismInterface::Process(), Nektar::Utilities::ProcessLinkCheck::Process(), Nektar::Utilities::ProcessTetSplit::Process(), Nektar::NekMeshUtils::Generator2D::Process(), Nektar::Utilities::ProcessBL::Process(), and ReorderPrisms().

383 {
384  int cnt = 0;
385  for (int i = 0; i < m_mesh->m_element[m_mesh->m_expDim].size(); ++i)
386  {
387  m_mesh->m_element[m_mesh->m_expDim][i]->SetId(cnt++);
388  }
389 }

◆ ProcessFaces()

void Nektar::NekMeshUtils::Module::ProcessFaces ( bool  ReprocessFaces = true)
virtual

Extract element faces.

Create a unique set of mesh faces from elements stored in Mesh::element.

All elements are scanned and a unique list of enumerated faces is produced in #m_faceSet. Since elements created their own faces independently, we examine each element only uses face objects from #m_faceSet. Duplicate faces of those in #m_face are replaced with the corresponding entry in #m_faceSet. Finally, we scan the list of elements for 2-D boundary faces which correspond to faces in #m_faceSet. For such elements, we set its faceLink to reference the corresponding face in #m_faceSet.

This routine only proceeds if the expansion dimension is 3.

Definition at line 286 of file NekMeshUtils/Module/Module.cpp.

References m_mesh.

Referenced by Nektar::Utilities::InputMCF::Process(), Nektar::Utilities::InputGmsh::Process(), Nektar::Utilities::InputSem::Process(), Nektar::Utilities::InputNekpp::Process(), Nektar::NekMeshUtils::VolumeMesh::Process(), Nektar::Utilities::InputNek5000::Process(), Nektar::Utilities::ProcessOptiExtract::Process(), Nektar::Utilities::InputTec::Process(), Nektar::Utilities::ProcessExtrude::Process(), Nektar::Utilities::InputPly::Process(), Nektar::Utilities::InputSwan::Process(), Nektar::Utilities::InputVtk::Process(), Nektar::Utilities::InputStar::Process(), Nektar::NekMeshUtils::CFIMesh::Process(), Nektar::NekMeshUtils::SurfaceMesh::Process(), Nektar::Utilities::InputNek::Process(), Nektar::Utilities::ProcessExtractTetPrismInterface::Process(), Nektar::Utilities::ProcessTetSplit::Process(), Nektar::Utilities::ProcessJac::Process(), Nektar::Utilities::ProcessLinkCheck::Process(), Nektar::NekMeshUtils::Generator2D::Process(), Nektar::Utilities::ProcessBL::Process(), and ReorderPrisms().

287 {
288  if (m_mesh->m_expDim < 3) return;
289 
290  if(ReprocessFaces)
291  {
292  vector<ElementSharedPtr> &elmt = m_mesh->m_element[m_mesh->m_expDim];
293 
294  m_mesh->m_faceSet.clear();
295 
296  // Scan all elements and generate list of unique faces
297  for (int i = 0, fid = 0; i < elmt.size(); ++i)
298  {
299  for (int j = 0; j < elmt[i]->GetFaceCount(); ++j)
300  {
301  pair<FaceSet::iterator,bool> testIns;
302  testIns = m_mesh->m_faceSet.insert(elmt[i]->GetFace(j));
303 
304  if (testIns.second)
305  {
306  (*(testIns.first))->m_id = fid++;
307  (*(testIns.first))->m_elLink.push_back(
308  pair<ElementSharedPtr,int>(elmt[i],j));
309  }
310  else
311  {
312  elmt[i]->SetFace(j,*testIns.first);
313  // Update face to element map.
314  (*(testIns.first))->m_elLink.push_back(
315  pair<ElementSharedPtr,int>(elmt[i],j));
316  }
317  }
318  }
319  }
320 
321  // Create links for 2D elements
322  for (int i = 0; i < m_mesh->m_element[2].size(); ++i)
323  {
324  ElementSharedPtr elmt = m_mesh->m_element[2][i];
325  vector<NodeSharedPtr> vertices = elmt->GetVertexList();
326  vector<NodeSharedPtr> faceNodes;
327  vector<EdgeSharedPtr> edgeList = elmt->GetEdgeList();
328  FaceSharedPtr F = std::shared_ptr<Face>(
329  new Face(vertices, faceNodes, edgeList,
330  elmt->GetConf().m_faceCurveType));
331 
332  FaceSet::iterator it = m_mesh->m_faceSet.find(F);
333  if (it == m_mesh->m_faceSet.end())
334  {
335  cout << "Cannot find corresponding element face for 2D "
336  << "element " << i << endl;
337  abort();
338  }
339 
340  elmt->SetFaceLink(*it);
341 
342  // Set edges/vertices
343  for (int j = 0; j < elmt->GetVertexCount(); ++j)
344  {
345  elmt->SetVertex(j, (*it)->m_vertexList[j], false);
346  elmt->SetEdge(j, (*it)->m_edgeList[j], false);
347  }
348 
349  EdgeSet tmp(edgeList.begin(),edgeList.end());
350 
351  for (int j = 0; j < elmt->GetEdgeCount(); ++j)
352  {
353  EdgeSharedPtr e = elmt->GetEdge(j);
354  EdgeSet::iterator f = tmp.find(e);
355  if(f != tmp.end())
356  {
357  e->m_parentCAD = (*f)->m_parentCAD;
358  }
359  }
360 
361  // Update 3D element boundary map.
362  pair<ElementSharedPtr, int> eMap = (*it)->m_elLink.at(0);
363  eMap.first->SetBoundaryLink(eMap.second, i);
364 
365  // Copy face curvature
366  if ((*it)->m_faceNodes.size() > 0)
367  {
368  elmt->SetVolumeNodes((*it)->m_faceNodes);
369  elmt->SetCurveType((*it)->m_curveType);
370  }
371  }
372 }
std::unordered_set< EdgeSharedPtr, EdgeHash > EdgeSet
Definition: Edge.h:159
std::shared_ptr< Edge > EdgeSharedPtr
Shared pointer to an edge.
Definition: Edge.h:136
std::shared_ptr< Face > FaceSharedPtr
Definition: Face.h:155
std::shared_ptr< Element > ElementSharedPtr
Definition: Edge.h:49

◆ ProcessVertices()

void Nektar::NekMeshUtils::Module::ProcessVertices ( )
virtual

Extract element vertices.

Create a unique set of mesh vertices from elements stored in Mesh::element.

Each element is processed in turn and the vertices extracted and inserted into #m_vertexSet, which at the end of the routine contains all unique vertices in the mesh.

Definition at line 134 of file NekMeshUtils/Module/Module.cpp.

References m_mesh.

Referenced by Nektar::Utilities::InputMCF::Process(), Nektar::Utilities::InputGmsh::Process(), Nektar::Utilities::InputSem::Process(), Nektar::NekMeshUtils::VolumeMesh::Process(), Nektar::Utilities::InputSwan::Process(), Nektar::Utilities::InputVtk::Process(), Nektar::Utilities::InputPly::Process(), Nektar::NekMeshUtils::CFIMesh::Process(), Nektar::NekMeshUtils::SurfaceMesh::Process(), Nektar::Utilities::ProcessExtractTetPrismInterface::Process(), Nektar::Utilities::ProcessLinkCheck::Process(), Nektar::Utilities::ProcessJac::Process(), Nektar::Utilities::ProcessTetSplit::Process(), Nektar::NekMeshUtils::Generator2D::Process(), Nektar::Utilities::ProcessBL::Process(), and Nektar::Utilities::InputTec::ReadZone().

135 {
136  vector<ElementSharedPtr> &elmt = m_mesh->m_element[m_mesh->m_expDim];
137 
138  m_mesh->m_vertexSet.clear();
139 
140  for (int i = 0, vid = 0; i < elmt.size(); ++i)
141  {
142  for (int j = 0; j < elmt[i]->GetVertexCount(); ++j)
143  {
144  pair<NodeSet::iterator,bool> testIns =
145  m_mesh->m_vertexSet.insert(elmt[i]->GetVertex(j));
146 
147  if (testIns.second)
148  {
149  (*(testIns.first))->m_id = vid++;
150  }
151  else
152  {
153  elmt[i]->SetVertex(j,*testIns.first);
154  }
155  }
156  }
157 }

◆ RegisterConfig()

void Nektar::NekMeshUtils::Module::RegisterConfig ( std::string  key,
std::string  value = std::string() 
)

Register a configuration option with a module.

Definition at line 840 of file NekMeshUtils/Module/Module.cpp.

References m_config.

841 {
842  map<string, ConfigOption>::iterator it = m_config.find(key);
843  if (it == m_config.end())
844  {
845  cerr << "WARNING: Unrecognised config option " << key
846  << ", proceeding anyway." << endl;
847  }
848 
849  it->second.beenSet = true;
850 
851  if (it->second.isBool)
852  {
853  it->second.value = "1";
854  }
855  else
856  {
857  if(val.size() == 0)
858  {
859  it->second.value = it->second.defValue;
860  }
861  else
862  {
863  it->second.value = val;
864  }
865  }
866 }
std::map< std::string, ConfigOption > m_config
List of configuration values.

◆ ReorderPrisms()

void Nektar::NekMeshUtils::Module::ReorderPrisms ( PerMap perFaces)
protected

Reorder node IDs so that prisms and tetrahedra are aligned correctly.

Orientation of prism lines (i.e. a large prism which has been split into subprisms) cannot be guaranteed when elements are created one-by-one, or when periodic boundary conditions are used. This routine uses the following strategy:

  • Destroy the existing node numbering.
  • Detect a line of prisms using the PrismLines routine.
  • For each line, renumber node IDs consistently so that highest ID per-element corresponds to the line of collapsed coordinate points.
  • Recreate each prism in the line using the new ordering, and apply the existing OrientPrism routine to orient nodes accordingly.
  • When all prism lines are processed, recreate all tetrahedra using the existing orientation code.
  • Finally renumber any other nodes (i.e. those belonging to hexahedra).

The last step is to eliminate duplicate edges/faces and reenumerate.

NOTE: This routine does not copy face-interior high-order information yet!

Definition at line 493 of file NekMeshUtils/Module/Module.cpp.

References ASSERTL0, ASSERTL1, Nektar::LibUtilities::NekFactory< tKey, tBase, tParam >::CreateInstance(), Nektar::LibUtilities::ePrism, Nektar::LibUtilities::eTetrahedron, Nektar::NekMeshUtils::GetElementFactory(), m_mesh, PrismLines(), ProcessEdges(), ProcessElements(), and ProcessFaces().

Referenced by Nektar::Utilities::ProcessPerAlign::Process().

494 {
495  // Loop over elements and extract any that are prisms.
496  int i, j, k;
497 
498  if (m_mesh->m_expDim < 3)
499  {
500  return;
501  }
502 
503  map<int, int> lines;
504  set<int> prismsDone, tetsDone;
505  PerMap::iterator pIt;
506 
507  // Compile list of prisms and tets.
508  for (i = 0; i < m_mesh->m_element[3].size(); ++i)
509  {
510  ElementSharedPtr el = m_mesh->m_element[3][i];
511 
512  if (el->GetConf().m_e == LibUtilities::ePrism)
513  {
514  prismsDone.insert(i);
515  }
516  else if (el->GetConf().m_e == LibUtilities::eTetrahedron)
517  {
518  tetsDone.insert(i);
519  }
520  }
521 
522  // Destroy existing node numbering.
523  NodeSet::iterator it;
524  for (it = m_mesh->m_vertexSet.begin(); it != m_mesh->m_vertexSet.end(); ++it)
525  {
526  (*it)->m_id = -1;
527  }
528 
529  // Counter for new node IDs.
530  int nodeId = 0;
531  int prismTris[2][3] = {{0,1,4}, {3,2,5}};
532 
533  // Warning flag for high-order curvature information.
534  bool warnCurvature = false;
535 
536  // facesDone tracks face IDs inside prisms which have already been
537  // aligned.
538  std::unordered_set<int> facesDone;
539  std::unordered_set<int>::iterator fIt[2], fIt2;
540 
541  // Loop over prisms until we've found all lines of prisms.
542  while (prismsDone.size() > 0)
543  {
544  vector<ElementSharedPtr> line;
545 
546  // Call PrismLines to identify all prisms connected to
547  // prismDone.begin() and place them in line[].
548  PrismLines(*prismsDone.begin(), perFaces, prismsDone, line);
549 
550  // Loop over each prism, figure out which line of vertices
551  // contains the vertex with highest ID.
552  for (i = 0; i < line.size(); ++i)
553  {
554  // Copy tags and nodes from existing element.
555  vector<int> tags = line[i]->GetTagList();
556  vector<NodeSharedPtr> nodes = line[i]->GetVertexList();
557 
558  // See if either face of this prism has been renumbered
559  // already.
560  FaceSharedPtr f[2] = {
561  line[i]->GetFace(1), line[i]->GetFace(3)
562  };
563 
564  fIt[0] = facesDone.find(f[0]->m_id);
565  fIt[1] = facesDone.find(f[1]->m_id);
566 
567  // See if either of these faces is periodic. If it is, then
568  // assign ids accordingly.
569  for (j = 0; j < 2; ++j)
570  {
571  pIt = perFaces.find(f[j]->m_id);
572 
573  if (pIt == perFaces.end())
574  {
575  continue;
576  }
577 
578  fIt2 = facesDone.find(pIt->second.first->m_id);
579 
580  if (fIt[j] == facesDone.end() &&
581  fIt2 != facesDone.end())
582  {
583  fIt[j] = fIt2;
584  }
585  }
586 
587  if (fIt[0] != facesDone.end() &&
588  fIt[1] != facesDone.end())
589  {
590  // Should not be the case that both faces have already
591  // been renumbered.
592  ASSERTL0(false, "Renumbering error!");
593  }
594  else if (fIt[0] == facesDone.end() &&
595  fIt[1] == facesDone.end())
596  {
597  // Renumber both faces.
598  for (j = 0; j < 2; ++j)
599  {
600  for (k = 0; k < 3; ++k)
601  {
602  NodeSharedPtr n = nodes[prismTris[j][k]];
603  if (n->m_id == -1)
604  {
605  n->m_id = nodeId++;
606  }
607  }
608  }
609 
610  facesDone.insert(f[0]->m_id);
611  facesDone.insert(f[1]->m_id);
612  }
613  else
614  {
615  // Renumber face. t identifies the face not yet
616  // numbered, o identifies the other face.
617  int t = fIt[0] == facesDone.end() ? 0 : 1;
618  int o = (t+1) % 2;
619  ASSERTL1(fIt[o] != facesDone.end(),"Renumbering error");
620 
621  // Determine which of the three vertices on the 'other'
622  // face corresponds to the highest ID - this signifies
623  // the singular point of the line of prisms.
624  int tmp1[3] = {
625  nodes[prismTris[o][0]]->m_id,
626  nodes[prismTris[o][1]]->m_id,
627  nodes[prismTris[o][2]]->m_id
628  };
629  int tmp2[3] = {0,1,2};
630 
631  if (tmp1[0] > tmp1[1])
632  {
633  swap(tmp1[0], tmp1[1]);
634  swap(tmp2[0], tmp2[1]);
635  }
636 
637  if (tmp1[1] > tmp1[2])
638  {
639  swap(tmp1[1], tmp1[2]);
640  swap(tmp2[1], tmp2[2]);
641  }
642 
643  if (tmp1[0] > tmp1[2])
644  {
645  swap(tmp1[0], tmp1[2]);
646  swap(tmp2[0], tmp2[2]);
647  }
648 
649  // Renumber this face so that highest ID matches.
650  for (j = 0; j < 3; ++j)
651  {
652  NodeSharedPtr n = nodes[prismTris[t][tmp2[j]]];
653  if (n->m_id == -1)
654  {
655  n->m_id = nodeId++;
656  }
657  }
658 
659  facesDone.insert(f[t]->m_id);
660  }
661 
662  for (j = 0; j < 6; ++j)
663  {
664  ASSERTL1(nodes[j]->m_id != -1, "Renumbering error");
665  }
666 
667  // Recreate prism with the new ordering.
668  ElmtConfig conf(LibUtilities::ePrism, 1, false, false, true);
670  LibUtilities::ePrism, conf, nodes, tags);
671 
672  // Now transfer high-order information back into
673  // place. TODO: Face curvature.
674  for (j = 0; j < 9; ++j)
675  {
676  EdgeSharedPtr e1 = line[i]->GetEdge(j);
677  for (k = 0; k < 9; ++k)
678  {
679  EdgeSharedPtr e2 = el->GetEdge(k);
680  if (e1->m_n1 == e2->m_n1 && e1->m_n2 == e2->m_n2)
681  {
682  e2->m_edgeNodes = e1->m_edgeNodes;
683  }
684  else if (e1->m_n1 == e2->m_n1 && e1->m_n2 == e2->m_n2)
685  {
686  e2->m_edgeNodes = e1->m_edgeNodes;
687  std::reverse(e2->m_edgeNodes.begin(),
688  e2->m_edgeNodes.end());
689  }
690  }
691  }
692 
693  // Warn users that we're throwing away face curvature
694  if (!warnCurvature)
695  {
696  for (j = 0; j < 5; ++j)
697  {
698  if (line[i]->GetFace(j)->m_faceNodes.size() > 0)
699  {
700  warnCurvature = true;
701  break;
702  }
703  }
704  }
705 
706  // Replace old prism.
707  m_mesh->m_element[3][line[i]->GetId()] = el;
708  }
709  }
710 
711  if (warnCurvature)
712  {
713  cerr << "[ReorderPrisms] WARNING: Face curvature detected in "
714  << "some prisms; this will be ignored in further module "
715  << "evaluations."
716  << endl;
717  }
718 
719  // Loop over periodic faces, enumerate vertices.
720  for (pIt = perFaces.begin(); pIt != perFaces.end(); ++pIt)
721  {
722  FaceSharedPtr f2 = pIt->second.first;
723  FaceSharedPtr f1 = perFaces[f2->m_id].first;
724  vector<int> perVerts = pIt->second.second;
725  int nVerts = perVerts.size();
726 
727  // Number periodic vertices first.
728  for (j = 0; j < nVerts; ++j)
729  {
730  NodeSharedPtr n1 = f1->m_vertexList[j];
731  NodeSharedPtr n2 = f2->m_vertexList[perVerts[j]];
732 
733  if (n1->m_id == -1 && n2->m_id == -1)
734  {
735  n1->m_id = nodeId++;
736  n2->m_id = nodeId++;
737  }
738  else if (n1->m_id != -1 && n2->m_id != -1)
739  {
740  continue;
741  }
742  else
743  {
744  ASSERTL0(false, "Periodic face renumbering error");
745  }
746  }
747  }
748 
749  // Recreate tets.
750  set<int>::iterator it2;
751  for (it2 = tetsDone.begin(); it2 != tetsDone.end(); ++it2)
752  {
753  ElementSharedPtr el = m_mesh->m_element[3][*it2];
754  vector<NodeSharedPtr> nodes = el->GetVertexList();
755  vector<int> tags = el->GetTagList();
756 
757  for (i = 0; i < 4; ++i)
758  {
759  if (nodes[i]->m_id == -1)
760  {
761  nodes[i]->m_id = nodeId++;
762  }
763  }
764 
765  // Recreate tet.
766  ElmtConfig conf(LibUtilities::eTetrahedron, 1, false, false, true);
767  m_mesh->m_element[3][*it2] = GetElementFactory().CreateInstance(
768  LibUtilities::eTetrahedron, conf, nodes, tags);
769  }
770 
771  // Enumerate rest of vertices.
772  for (it = m_mesh->m_vertexSet.begin(); it != m_mesh->m_vertexSet.end(); ++it)
773  {
774  if ((*it)->m_id == -1)
775  {
776  (*it)->m_id = nodeId++;
777  }
778  }
779 
780  ProcessEdges ();
781  ProcessFaces ();
782  ProcessElements();
783 }
#define ASSERTL0(condition, msg)
Definition: ErrorUtil.hpp:216
std::shared_ptr< Edge > EdgeSharedPtr
Shared pointer to an edge.
Definition: Edge.h:136
ElementFactory & GetElementFactory()
Definition: Element.cpp:44
std::shared_ptr< Node > NodeSharedPtr
Definition: CADVert.h:49
std::shared_ptr< Face > FaceSharedPtr
Definition: Face.h:155
tBaseSharedPtr CreateInstance(tKey idKey, tParam... args)
Create an instance of the class referred to by idKey.
Definition: NekFactory.hpp:144
virtual NEKMESHUTILS_EXPORT void ProcessFaces(bool ReprocessFaces=true)
Extract element faces.
std::shared_ptr< Element > ElementSharedPtr
Definition: Edge.h:49
virtual NEKMESHUTILS_EXPORT void ProcessElements()
Generate element IDs.
NEKMESHUTILS_EXPORT void PrismLines(int prism, PerMap &perFaces, std::set< int > &prismsDone, std::vector< ElementSharedPtr > &line)
virtual NEKMESHUTILS_EXPORT void ProcessEdges(bool ReprocessEdges=true)
Extract element edges.
#define ASSERTL1(condition, msg)
Assert Level 1 – Debugging which is used whether in FULLDEBUG or DEBUG compilation mode...
Definition: ErrorUtil.hpp:250

◆ SetDefaults()

void Nektar::NekMeshUtils::Module::SetDefaults ( )

Sets default configuration options for those which have not been set.

Definition at line 892 of file NekMeshUtils/Module/Module.cpp.

References m_config.

893 {
894  map<string, ConfigOption>::iterator it;
895 
896  for (it = m_config.begin(); it != m_config.end(); ++it)
897  {
898  if (!it->second.beenSet)
899  {
900  it->second.value = it->second.defValue;
901  }
902  }
903 }
std::map< std::string, ConfigOption > m_config
List of configuration values.

Member Data Documentation

◆ m_config

std::map<std::string, ConfigOption> Nektar::NekMeshUtils::Module::m_config
protected

List of configuration values.

Definition at line 188 of file NekMeshUtils/Module/Module.h.

Referenced by Nektar::Utilities::ProcessBL::BoundaryLayer2D(), Nektar::Utilities::ProcessBL::BoundaryLayer3D(), Nektar::NekMeshUtils::Generator2D::Generator2D(), Nektar::NekMeshUtils::HOSurfaceMesh::HOSurfaceMesh(), Nektar::Utilities::InputStar::InitCCM(), Nektar::NekMeshUtils::InputModule::InputModule(), Nektar::Utilities::InputNek::InputNek(), Nektar::Utilities::InputStar::InputStar(), Nektar::NekMeshUtils::Generator2D::MakeBL(), Nektar::NekMeshUtils::InputModule::OpenStream(), Nektar::NekMeshUtils::OutputModule::OpenStream(), Nektar::Utilities::OutputGmsh::OutputGmsh(), Nektar::NekMeshUtils::OutputModule::OutputModule(), Nektar::Utilities::OutputNekpp::OutputNekpp(), Nektar::NekMeshUtils::Generator2D::PeriodicPrep(), PrintConfig(), Nektar::Utilities::InputMCF::Process(), Nektar::Utilities::ProcessCurvedEdges::Process(), Nektar::Utilities::InputNekpp::Process(), Nektar::Utilities::InputSem::Process(), Nektar::NekMeshUtils::HOSurfaceMesh::Process(), Nektar::NekMeshUtils::ProcessLoadCAD::Process(), Nektar::NekMeshUtils::ProcessLoadOctree::Process(), Nektar::NekMeshUtils::VolumeMesh::Process(), Nektar::Utilities::ProcessOptiExtract::Process(), Nektar::Utilities::ProcessPerAlign::Process(), Nektar::Utilities::OutputVtk::Process(), Nektar::Utilities::ProcessExtrude::Process(), Nektar::Utilities::OutputNekpp::Process(), Nektar::Utilities::InputVtk::Process(), Nektar::Utilities::ProcessSpherigon::Process(), Nektar::Utilities::ProcessLinear::Process(), Nektar::Utilities::InputNek::Process(), Nektar::Utilities::ProcessTetSplit::Process(), Nektar::Utilities::ProcessScalar::Process(), Nektar::Utilities::ProcessDetectSurf::Process(), Nektar::Utilities::ProcessExtractSurf::Process(), Nektar::Utilities::ProcessInsertSurface::Process(), Nektar::Utilities::ProcessJac::Process(), Nektar::NekMeshUtils::Generator2D::Process(), Nektar::Utilities::ProcessProjectCAD::Process(), Nektar::Utilities::OutputGmsh::Process(), Nektar::Utilities::ProcessVarOpti::Process(), Nektar::Utilities::ProcessBL::ProcessBL(), Nektar::Utilities::ProcessCurve::ProcessCurve(), Nektar::Utilities::ProcessCurvedEdges::ProcessCurvedEdges(), Nektar::Utilities::ProcessCyl::ProcessCyl(), Nektar::Utilities::ProcessDetectSurf::ProcessDetectSurf(), Nektar::Utilities::ProcessExtractSurf::ProcessExtractSurf(), Nektar::Utilities::ProcessExtrude::ProcessExtrude(), Nektar::Utilities::ProcessInsertSurface::ProcessInsertSurface(), Nektar::Utilities::ProcessJac::ProcessJac(), Nektar::Utilities::ProcessLinear::ProcessLinear(), Nektar::NekMeshUtils::ProcessLoadCAD::ProcessLoadCAD(), Nektar::NekMeshUtils::ProcessLoadOctree::ProcessLoadOctree(), Nektar::Utilities::ProcessOptiExtract::ProcessOptiExtract(), Nektar::Utilities::ProcessPerAlign::ProcessPerAlign(), Nektar::Utilities::ProcessProjectCAD::ProcessProjectCAD(), Nektar::Utilities::ProcessScalar::ProcessScalar(), Nektar::Utilities::ProcessSpherigon::ProcessSpherigon(), Nektar::Utilities::ProcessTetSplit::ProcessTetSplit(), Nektar::Utilities::ProcessVarOpti::ProcessVarOpti(), RegisterConfig(), SetDefaults(), Nektar::Utilities::InputStar::SetupElements(), Nektar::Utilities::ProcessCyl::v_GenerateEdgeNodes(), Nektar::Utilities::ProcessCurve::v_GenerateEdgeNodes(), and Nektar::NekMeshUtils::VolumeMesh::VolumeMesh().

◆ m_mesh

MeshSharedPtr Nektar::NekMeshUtils::Module::m_mesh
protected

Mesh object.

Definition at line 186 of file NekMeshUtils/Module/Module.h.

Referenced by Nektar::Utilities::ProcessVarOpti::Analytics(), Nektar::Utilities::ProcessBL::BoundaryLayer2D(), Nektar::Utilities::ProcessBL::BoundaryLayer3D(), ClearElementLinks(), Nektar::Utilities::ProcessProjectCAD::findAndProject(), Nektar::NekMeshUtils::Generator2D::FindBLEnds(), Nektar::Utilities::ProcessSpherigon::FindNormalFromPlyFile(), Nektar::Utilities::InputTec::GenElement2D(), Nektar::Utilities::InputStar::GenElement2D(), Nektar::Utilities::InputTec::GenElement3D(), Nektar::Utilities::InputStar::GenElement3D(), Nektar::Utilities::InputSem::insertEdge(), Nektar::Utilities::ProcessLinear::Invalid(), Nektar::Utilities::InputNek::LoadHOSurfaces(), Nektar::NekMeshUtils::Generator2D::MakeBL(), Nektar::NekMeshUtils::Generator2D::MakeBLPrep(), Nektar::NekMeshUtils::Generator2D::MakePeriodic(), Nektar::Utilities::InputMCF::ParseFile(), Nektar::NekMeshUtils::InputModule::PrintSummary(), PrismLines(), Nektar::Utilities::InputMCF::Process(), Nektar::Utilities::ProcessCurvedEdges::Process(), Nektar::Utilities::InputNekpp::Process(), Nektar::Utilities::InputSem::Process(), Nektar::Utilities::InputGmsh::Process(), Nektar::NekMeshUtils::ProcessLoadCAD::Process(), Nektar::NekMeshUtils::ProcessLoadOctree::Process(), Nektar::Utilities::InputNek5000::Process(), Nektar::NekMeshUtils::VolumeMesh::Process(), Nektar::NekMeshUtils::HOSurfaceMesh::Process(), Nektar::Utilities::ProcessOptiExtract::Process(), Nektar::Utilities::ProcessPerAlign::Process(), Nektar::Utilities::OutputSTL::Process(), Nektar::Utilities::InputTec::Process(), Nektar::Utilities::OutputNekpp::Process(), Nektar::Utilities::OutputVtk::Process(), Nektar::Utilities::InputSwan::Process(), Nektar::Utilities::ProcessExtrude::Process(), Nektar::Utilities::InputVtk::Process(), Nektar::Utilities::ProcessSpherigon::Process(), Nektar::Utilities::InputStar::Process(), Nektar::Utilities::ProcessLinear::Process(), Nektar::NekMeshUtils::CFIMesh::Process(), Nektar::NekMeshUtils::SurfaceMesh::Process(), Nektar::Utilities::InputNek::Process(), Nektar::Utilities::ProcessTetSplit::Process(), Nektar::Utilities::ProcessExtractSurf::Process(), Nektar::Utilities::ProcessScalar::Process(), Nektar::Utilities::ProcessExtractTetPrismInterface::Process(), Nektar::Utilities::ProcessJac::Process(), Nektar::Utilities::ProcessDetectSurf::Process(), Nektar::Utilities::ProcessInsertSurface::Process(), Nektar::Utilities::ProcessLinkCheck::Process(), Nektar::NekMeshUtils::Generator2D::Process(), Nektar::Utilities::ProcessBL::Process(), Nektar::Utilities::ProcessProjectCAD::Process(), Nektar::Utilities::OutputGmsh::Process(), Nektar::Utilities::ProcessVarOpti::Process(), ProcessComposites(), ProcessEdges(), ProcessElements(), ProcessFaces(), ProcessVertices(), Nektar::Utilities::InputGmsh::ReadNextElement(), Nektar::Utilities::InputPly::ReadPly(), Nektar::Utilities::InputTec::ReadZone(), ReorderPrisms(), Nektar::NekMeshUtils::SurfaceMesh::Report(), Nektar::NekMeshUtils::Generator2D::Report(), Nektar::Utilities::InputGmsh::SaveNode(), Nektar::Utilities::InputStar::SetupElements(), Nektar::Utilities::OutputNekpp::TransferComposites(), Nektar::Utilities::OutputNekpp::TransferCurves(), Nektar::Utilities::OutputNekpp::TransferDomain(), Nektar::Utilities::OutputNekpp::TransferEdges(), Nektar::Utilities::OutputNekpp::TransferElements(), Nektar::Utilities::OutputNekpp::TransferFaces(), and Nektar::Utilities::OutputNekpp::TransferVertices().