Nektar++
Public Member Functions | Private Attributes | Friends | List of all members
Nektar::NekMeshUtils::TetMesh Class Reference

class for taking surface mesh and octree spec and making a 3d tet mesh More...

#include <TetMesh.h>

Public Member Functions

 TetMesh (MeshSharedPtr m, int id, std::vector< ElementSharedPtr > e=std::vector< ElementSharedPtr >())
 default constructor More...
 
void Mesh ()
 execute tet meshing More...
 

Private Attributes

MeshSharedPtr m_mesh
 
std::vector< ElementSharedPtrm_surface
 
int m_numtet
 number of tetrahedra More...
 
int m_id
 
std::vector< Array< OneD, int > > m_tetconnect
 conncetivity of the tets from the interface More...
 
TetGenInterfaceSharedPtr tetgen
 

Friends

class MemoryManager< TetMesh >
 

Detailed Description

class for taking surface mesh and octree spec and making a 3d tet mesh

Definition at line 53 of file TetMesh.h.

Constructor & Destructor Documentation

◆ TetMesh()

Nektar::NekMeshUtils::TetMesh::TetMesh ( MeshSharedPtr  m,
int  id,
std::vector< ElementSharedPtr e = std::vector<ElementSharedPtr>() 
)
inline

default constructor

Definition at line 61 of file TetMesh.h.

References Mesh().

63  : m_mesh(m), m_surface(e), m_id(id)
64  {
65  };
std::vector< ElementSharedPtr > m_surface
Definition: TetMesh.h:75

Member Function Documentation

◆ Mesh()

void Nektar::NekMeshUtils::TetMesh::Mesh ( )

execute tet meshing

Definition at line 44 of file TetMesh.cpp.

References Nektar::LibUtilities::NekFactory< tKey, tBase, tParam >::CreateInstance(), Nektar::LibUtilities::eTetrahedron, Nektar::NekMeshUtils::GetElementFactory(), and class_topology::Node.

Referenced by TetMesh().

45 {
46  if (m_mesh->m_verbose)
47  cout << endl << endl << "Tetrahdral mesh generation" << endl;
48 
50 
51  map<int, NodeSharedPtr> IdToNode;
52  map<NodeSharedPtr, int> IdToNodeRev;
53 
54  // build sequentially ordered maps of nodes that exist and there delta value
55  // in the octree
56  map<int, NekDouble> IdToDelta;
57  vector<Array<OneD, int> > surfacetris;
58  NodeSet alreadyInSurface;
59 
60  if(m_surface.size() == 0)
61  {
62  m_surface = m_mesh->m_element[2];
63  }
64 
65  int cnt = 0;
66  for(int i = 0; i < m_surface.size(); i++)
67  {
68  vector<NodeSharedPtr> n = m_surface[i]->GetVertexList();
69  Array<OneD, int> tri(3);
70  for(int j = 0; j < n.size(); j++)
71  {
72  pair<NodeSet::iterator,bool> testIns =
73  alreadyInSurface.insert(n[j]);
74 
75  if (testIns.second)
76  {
77  if(cnt == 2114)
78  {
79  //cout << n[j]->m_x << " " << n[j]->m_y << " " << n[j]->m_z << endl;
80  }
81  tri[j] = cnt;
82  IdToNode[cnt] = n[j];
83  IdToNodeRev[n[j]] = cnt;
84  IdToDelta[cnt] = m_mesh->m_octree->Query(n[j]->GetLoc());
85  cnt++;
86  }
87  else
88  {
89  tri[j] = IdToNodeRev[(*testIns.first)];
90  }
91  }
92  surfacetris.push_back(tri);
93  }
94 
95  //m_mesh->m_expDim--;
96  //m_mesh->m_element[3].clear();
97  //m_mesh->m_element[2] = m_surface;
98  //return;
99 
100  if (m_mesh->m_verbose)
101  {
102  cout << "\tInital Node Count: " << IdToNode.size() << endl;
103  }
104 
105  tetgen->InitialMesh(IdToNode, surfacetris);
106 
107  vector<Array<OneD, NekDouble> > newp;
108  int ctbefore = IdToNode.size();
109  int newpb;
110  do
111  {
112  newpb = newp.size();
113  newp.clear();
114  tetgen->GetNewPoints(ctbefore, newp);
115  for (int i = 0; i < newp.size(); i++)
116  {
117  NekDouble d = m_mesh->m_octree->Query(newp[i]);
118  IdToDelta[ctbefore + i] = d;
119  }
120  tetgen->RefineMesh(IdToDelta);
121  } while (newpb != newp.size());
122 
123  // make new map of all nodes to build tets.
124  newp.clear();
125  tetgen->GetNewPoints(ctbefore, newp);
126  for (int i = 0; i < newp.size(); i++)
127  {
128  NodeSharedPtr n = std::shared_ptr<Node>(
129  new Node(ctbefore + i, newp[i][0], newp[i][1], newp[i][2]));
130  IdToNode[ctbefore + i] = n;
131  }
132 
133  m_tetconnect = tetgen->Extract();
134 
135  // tetgen->freetet();
136 
137  // create tets
138  for (int i = 0; i < m_tetconnect.size(); i++)
139  {
140  vector<NodeSharedPtr> n;
141  n.push_back(IdToNode[m_tetconnect[i][0]]);
142  n.push_back(IdToNode[m_tetconnect[i][1]]);
143  n.push_back(IdToNode[m_tetconnect[i][2]]);
144  n.push_back(IdToNode[m_tetconnect[i][3]]);
145  ElmtConfig conf(LibUtilities::eTetrahedron, 1, false, false);
146  vector<int> tags;
147  tags.push_back(m_id);
149  LibUtilities::eTetrahedron, conf, n, tags);
150 
151  m_mesh->m_element[3].push_back(E);
152  }
153 
154  if (m_mesh->m_verbose)
155  cout << "\tTets :" << m_tetconnect.size() << endl;
156 }
std::vector< Array< OneD, int > > m_tetconnect
conncetivity of the tets from the interface
Definition: TetMesh.h:80
TetGenInterfaceSharedPtr tetgen
Definition: TetMesh.h:82
ElementFactory & GetElementFactory()
Definition: Element.cpp:44
std::shared_ptr< Node > NodeSharedPtr
Definition: CADVert.h:49
std::unordered_set< NodeSharedPtr, NodeHash > NodeSet
Definition: Node.h:447
tBaseSharedPtr CreateInstance(tKey idKey, tParam... args)
Create an instance of the class referred to by idKey.
Definition: NekFactory.hpp:144
std::shared_ptr< Element > ElementSharedPtr
Definition: Edge.h:49
static std::shared_ptr< DataType > AllocateSharedPtr(const Args &...args)
Allocate a shared pointer from the memory pool.
double NekDouble
std::vector< ElementSharedPtr > m_surface
Definition: TetMesh.h:75

Friends And Related Function Documentation

◆ MemoryManager< TetMesh >

friend class MemoryManager< TetMesh >
friend

Definition at line 56 of file TetMesh.h.

Member Data Documentation

◆ m_id

int Nektar::NekMeshUtils::TetMesh::m_id
private

Definition at line 78 of file TetMesh.h.

◆ m_mesh

MeshSharedPtr Nektar::NekMeshUtils::TetMesh::m_mesh
private

Definition at line 74 of file TetMesh.h.

◆ m_numtet

int Nektar::NekMeshUtils::TetMesh::m_numtet
private

number of tetrahedra

Definition at line 77 of file TetMesh.h.

◆ m_surface

std::vector<ElementSharedPtr> Nektar::NekMeshUtils::TetMesh::m_surface
private

Definition at line 75 of file TetMesh.h.

◆ m_tetconnect

std::vector<Array<OneD, int> > Nektar::NekMeshUtils::TetMesh::m_tetconnect
private

conncetivity of the tets from the interface

Definition at line 80 of file TetMesh.h.

◆ tetgen

TetGenInterfaceSharedPtr Nektar::NekMeshUtils::TetMesh::tetgen
private

Definition at line 82 of file TetMesh.h.