Programming tasks to Scientific Computing I
Public Types | Public Member Functions | Protected Attributes | List of all members
shellFE::TriangMesh< DataTypeContainer, TriangleType > Class Template Reference

#include <triangMesh.h>

Public Types

typedef TriangleType ElementType
 
typedef DataTypeContainer::RealType RealType
 
typedef DataTypeContainer::Point3DType Point3DType
 
typedef DataTypeContainer::TangentVecType TangentVecType
 
typedef DataTypeContainer::Indices3DType Indices3DType
 
typedef DataTypeContainer::VectorType VectorType
 
typedef DataTypeContainer::MaskType MaskType
 

Public Member Functions

 TriangMesh ()
 Create empty TriangMesh. More...
 
 TriangMesh (const string &fileName)
 
virtual ~TriangMesh ()
 
int getNumVertices () const
 
int getNumTriangs () const
 
int pushBackVertex (const Point3DType newVertex)
 Insert new vertex and return global index. More...
 
int pushBackTriang (const Indices3DType nodeIdx)
 Insert new triangle and return global index. More...
 
const Point3DTypegetVertex (const int num) const
 
void setVertex (const int num, const Point3DType Arg)
 
int getNeighbour (const int elementID, const int acrossLocalEdge) const
 Get neighbor on edge. More...
 
void setNeighbour (const int elementID, const int acrossLocalEdge, const int value) const
 Set neighbor on edge. More...
 
const TriangleTypegetTriang (const int num) const
 
TriangleTypegetTriang (const int num)
 Returns a triangle. More...
 
void setTriang (const int num, const TriangleType Arg)
 
int getTriangNodeIdx (const int num, const int localNode) const
 
void setTriangNodeIdx (const int num, const int localNode, const int newIdx)
 
void updateAllTriangles ()
 
void print ()
 
void loadFromLegacyVTK (const string &filename)
 load from file in the .vtk file format. Currently only loads geometric information. More...
 
void makeNeighbour () const
 
void makeOrientationConsistent ()
 

Protected Attributes

std::vector< Point3DType_vertexIterator
 
std::vector< TriangleType_triangIterator
 
std::vector< Indices3DType_neighbour_
 

Detailed Description

template<typename DataTypeContainer, typename TriangleType>
class shellFE::TriangMesh< DataTypeContainer, TriangleType >

Definition at line 10 of file triangMesh.h.

Member Typedef Documentation

template<typename DataTypeContainer , typename TriangleType >
typedef TriangleType shellFE::TriangMesh< DataTypeContainer, TriangleType >::ElementType

Definition at line 13 of file triangMesh.h.

template<typename DataTypeContainer , typename TriangleType >
typedef DataTypeContainer::Indices3DType shellFE::TriangMesh< DataTypeContainer, TriangleType >::Indices3DType

Definition at line 17 of file triangMesh.h.

template<typename DataTypeContainer , typename TriangleType >
typedef DataTypeContainer::MaskType shellFE::TriangMesh< DataTypeContainer, TriangleType >::MaskType

Definition at line 19 of file triangMesh.h.

template<typename DataTypeContainer , typename TriangleType >
typedef DataTypeContainer::Point3DType shellFE::TriangMesh< DataTypeContainer, TriangleType >::Point3DType

Definition at line 15 of file triangMesh.h.

template<typename DataTypeContainer , typename TriangleType >
typedef DataTypeContainer::RealType shellFE::TriangMesh< DataTypeContainer, TriangleType >::RealType

Definition at line 14 of file triangMesh.h.

template<typename DataTypeContainer , typename TriangleType >
typedef DataTypeContainer::TangentVecType shellFE::TriangMesh< DataTypeContainer, TriangleType >::TangentVecType

Definition at line 16 of file triangMesh.h.

template<typename DataTypeContainer , typename TriangleType >
typedef DataTypeContainer::VectorType shellFE::TriangMesh< DataTypeContainer, TriangleType >::VectorType

Definition at line 18 of file triangMesh.h.

Constructor & Destructor Documentation

template<typename DataTypeContainer , typename TriangleType >
shellFE::TriangMesh< DataTypeContainer, TriangleType >::TriangMesh ( )
inline

Create empty TriangMesh.

Definition at line 29 of file triangMesh.h.

31  {}
std::vector< TriangleType > _triangIterator
Definition: triangMesh.h:23
std::vector< Point3DType > _vertexIterator
Definition: triangMesh.h:22
template<typename DataTypeContainer , typename TriangleType >
shellFE::TriangMesh< DataTypeContainer, TriangleType >::TriangMesh ( const string &  fileName)
inline

Definition at line 33 of file triangMesh.h.

34  {
35  this->loadFromLegacyVTK ( fileName );
36  }
void loadFromLegacyVTK(const string &filename)
load from file in the .vtk file format. Currently only loads geometric information.
Definition: triangMesh.h:131
template<typename DataTypeContainer , typename TriangleType >
virtual shellFE::TriangMesh< DataTypeContainer, TriangleType >::~TriangMesh ( )
inlinevirtual

Definition at line 38 of file triangMesh.h.

39  {}

Member Function Documentation

template<typename DataTypeContainer , typename TriangleType >
int shellFE::TriangMesh< DataTypeContainer, TriangleType >::getNeighbour ( const int  elementID,
const int  acrossLocalEdge 
) const
inline

Get neighbor on edge.

Definition at line 76 of file triangMesh.h.

77  {
78  return _neighbour_[elementID][acrossLocalEdge];
79  }
std::vector< Indices3DType > _neighbour_
Definition: triangMesh.h:25
template<typename DataTypeContainer , typename TriangleType >
int shellFE::TriangMesh< DataTypeContainer, TriangleType >::getNumTriangs ( ) const
inline

Definition at line 46 of file triangMesh.h.

47  {
48  return ( static_cast<int> ( _triangIterator.size() ) );
49  }
std::vector< TriangleType > _triangIterator
Definition: triangMesh.h:23
template<typename DataTypeContainer , typename TriangleType >
int shellFE::TriangMesh< DataTypeContainer, TriangleType >::getNumVertices ( ) const
inline

Definition at line 42 of file triangMesh.h.

43  {
44  return ( _vertexIterator.size() );
45  }
std::vector< Point3DType > _vertexIterator
Definition: triangMesh.h:22
template<typename DataTypeContainer , typename TriangleType >
const TriangleType& shellFE::TriangMesh< DataTypeContainer, TriangleType >::getTriang ( const int  num) const
inline

Definition at line 87 of file triangMesh.h.

88  {
89  return _triangIterator[num];
90  }
std::vector< TriangleType > _triangIterator
Definition: triangMesh.h:23
template<typename DataTypeContainer , typename TriangleType >
TriangleType& shellFE::TriangMesh< DataTypeContainer, TriangleType >::getTriang ( const int  num)
inline

Returns a triangle.

Parameters
[in]numTriangle index

Definition at line 94 of file triangMesh.h.

95  {
96  return _triangIterator[num];
97  }
std::vector< TriangleType > _triangIterator
Definition: triangMesh.h:23
template<typename DataTypeContainer , typename TriangleType >
int shellFE::TriangMesh< DataTypeContainer, TriangleType >::getTriangNodeIdx ( const int  num,
const int  localNode 
) const
inline

Definition at line 104 of file triangMesh.h.

105  {
106  return _triangIterator[num].getGlobalNodeIdx(localNode);
107  }
std::vector< TriangleType > _triangIterator
Definition: triangMesh.h:23
template<typename DataTypeContainer , typename TriangleType >
const Point3DType& shellFE::TriangMesh< DataTypeContainer, TriangleType >::getVertex ( const int  num) const
inline

Definition at line 66 of file triangMesh.h.

67  {
68  return _vertexIterator[num];
69  }
std::vector< Point3DType > _vertexIterator
Definition: triangMesh.h:22
template<typename DataTypeContainer , typename TriangleType >
void shellFE::TriangMesh< DataTypeContainer, TriangleType >::loadFromLegacyVTK ( const string &  filename)
inline

load from file in the .vtk file format. Currently only loads geometric information.

Definition at line 131 of file triangMesh.h.

132  {
133  /*std::ifstream vtkFile ( filename.c_str() ); */
134  std::ifstream vtkFile;
135  vtkFile.open ( filename.c_str() );
136  if ( vtkFile.fail() ) throw std::invalid_argument( aol::strprintf ( "Cannot open file. In File %s at line %d.", __FILE__, __LINE__ ).c_str() );
137  bool readVertices = false;
138  bool readFaces = false;
139  while ( !vtkFile.eof() ) {
140  char line[256];
141  vtkFile.getline ( line, 256 );
142  // first: expect vertices
143  if( !strncmp ( line, "POINTS ", strlen ( "POINTS " ) ) ) {
144  readVertices = true;
145  continue;
146  }
147  // second: expect triangles (i.e. starting with "3 " )
148  if( !strncmp ( line, "POLYGONS ", strlen ( "POLYGONS " ) ) ) {
149  readVertices = false;
150  readFaces = true;
151  continue;
152  }
153  // geometric information ends with the first line that does not start with "3 " anymore
154  if( readFaces && strncmp ( line, "3 ", strlen ( "3 " ) ) ) break;
155  // read in the vertex coordinates and add it to the mesh
156  if( readVertices ) {
157  Point3DType vertex;
158  char * substring = strtok ( line, " " );
159  for ( int i = 0; i < 3; i++ ) {
160  vertex[i] = atof( substring );
161  substring = strtok (NULL, " ");
162  }
163  pushBackVertex ( vertex );
164  }
165  // read in the face and add it to the mesh
166  if( readFaces ) {
167  Indices3DType triangle;
168  char * substring = strtok ( line, " " );
169  for ( int i = 0; i < 3; i++ ) {
170  substring = strtok (NULL, " ");
171  triangle[i] = atof( substring );
172  }
173  pushBackTriang( triangle );
174  }
175  }
176  vtkFile.close();
177  }
DataTypeContainer::Indices3DType Indices3DType
Definition: triangMesh.h:17
int pushBackTriang(const Indices3DType nodeIdx)
Insert new triangle and return global index.
Definition: triangMesh.h:59
int pushBackVertex(const Point3DType newVertex)
Insert new vertex and return global index.
Definition: triangMesh.h:52
string strprintf(const char *format,...)
Give back formatted string, analogously to sprintf, but save the long way &#39;round with char arrays...
Definition: aol.cpp:5
DataTypeContainer::Point3DType Point3DType
Definition: triangMesh.h:15
template<typename DataTypeContainer , typename TriangleType >
void shellFE::TriangMesh< DataTypeContainer, TriangleType >::makeNeighbour ( ) const
inline

Definition at line 180 of file triangMesh.h.

181  {
182  int *n_to_t, *num_of_n, *start_of_n;
183  const int numNodes = getNumVertices();
184  const int numElements = getNumTriangs();
185 
186  if ( int(_neighbour_.size()) != numElements ) _neighbour_.resize ( numElements );
187 
188  n_to_t = new int[numElements*3];
189  num_of_n = new int[numNodes];
190  start_of_n = new int[numNodes+1];
191 
192  // iterate over all vertices and set num_of_n to zero, i.e. initialize
193  for ( int nodeIndex = 0; nodeIndex < numNodes; nodeIndex++ ) num_of_n[nodeIndex] = 0;
194 
195  // iterate over all triangles and all neighbours, i.e. 3, since every triangle has 3 neighbours for closed meshes
196  for ( int elementIndex = 0; elementIndex < numElements; elementIndex++ )
197  for ( int j = 0; j < 3; j++ ) {
198  num_of_n[getTriangNodeIdx ( elementIndex,j ) ]++;
199  setNeighbour ( elementIndex, j, -1 );
200  }
201 
202  // get Startindex for node
203  int nodeIdx = 0;
204  start_of_n[nodeIdx++] = 0;
205  while ( nodeIdx < numNodes ) {
206  start_of_n[nodeIdx] = start_of_n[nodeIdx-1] + num_of_n[nodeIdx-1];
207  nodeIdx++;
208  }
209  start_of_n[numNodes] = 3 * numElements;
210 
211  // initialize reference
212  for ( int elementIndex = 0; elementIndex < numElements*3; ++elementIndex ) n_to_t[elementIndex] = -1;
213 
214  // build reference
215  for ( int elementIndex = 0; elementIndex < numElements; elementIndex++ )
216  for ( int j = 0; j < 3; j++ ) {
217  int k = start_of_n[getTriangNodeIdx ( elementIndex,j ) ];
218  while ( n_to_t[k] > -1 ) k++;
219  n_to_t[k] = elementIndex;
220  }
221  // find neighbour
222  for ( int elementIndex = 0; elementIndex < numElements; elementIndex++ )
223  for ( int j = 0; j < 3; j++ ) {
224  int node1 = getTriangNodeIdx ( elementIndex, j );
225  int node2 = getTriangNodeIdx ( elementIndex, ( j + 1 ) % 3 );
226  int node3 = getTriangNodeIdx ( elementIndex, ( j + 2 ) % 3 );
227 
228  for ( int k = start_of_n[node1]; k < start_of_n[node1+1]; k++ ) {
229  int n = n_to_t[k]; // Tetraeder
230  if ( elementIndex < n ) // set neighborhood only once
231  for ( int l = 0; l < 3; l++ ) {
232  if ( node3 == getTriangNodeIdx ( n, l ) ) {
233  setNeighbour ( elementIndex, ( j + 1 ) % 3, n );
234  for ( int v = 0; v < 3; v++ )
235  if ( v != l && getTriangNodeIdx ( n, v ) != node1 ) setNeighbour ( n, v, elementIndex );
236  } else {
237  if ( node2 == getTriangNodeIdx ( n, l ) ) {
238  setNeighbour ( elementIndex, ( j + 2 ) % 3, n );
239  for ( int v = 0; v < 3; v++ )
240  if ( v != l && getTriangNodeIdx ( n, v ) != node1 ) setNeighbour ( n, v, elementIndex );
241  }
242  }
243  }
244  }
245  }
246 
247  delete[] n_to_t;
248  delete[] num_of_n;
249  delete[] start_of_n;
250  }
int getNumVertices() const
Definition: triangMesh.h:42
int getNumTriangs() const
Definition: triangMesh.h:46
int getTriangNodeIdx(const int num, const int localNode) const
Definition: triangMesh.h:104
void setNeighbour(const int elementID, const int acrossLocalEdge, const int value) const
Set neighbor on edge.
Definition: triangMesh.h:82
std::vector< Indices3DType > _neighbour_
Definition: triangMesh.h:25
template<typename DataTypeContainer , typename TriangleType >
void shellFE::TriangMesh< DataTypeContainer, TriangleType >::makeOrientationConsistent ( )
inline

Definition at line 252 of file triangMesh.h.

253  {
254  if ( int(_neighbour_.size()) != this->getNumTriangs() )
255  makeNeighbour();
256  // true for all triangles T, whose neighboring triangles have already been oriented consistent with T
257  MaskType alreadyHandled( this->getNumTriangs() );
258  // true for all triangles who have already been dealt with or who are already waiting in queue
259  MaskType inQueue( this->getNumTriangs() );
260  // contains all triangles which are already oriented and whose neighbors will be dealt with next (may contain triangles twice for simplicity)
261  std::queue<int> activeTriangles;
262  activeTriangles.push( 0 );
263  inQueue[0] = true;
264  // the triangle whose neighbors are currently handled
265  int currentTriangle;
266  // while there are triangles left whose neighbors are not consistently oriented...
267  while( !activeTriangles.empty() ) {
268  currentTriangle = activeTriangles.front();
269  activeTriangles.pop();
270  // deal with all three neighbors of currentTriangle, i.e. orient them and add them to the list to deal with their neighbors
271  for ( int i = 0; i < 3; i++ ) {
272  int neighbor = getNeighbour( currentTriangle, i );
273  if ( neighbor >= 0 && neighbor < this->getNumTriangs() && !alreadyHandled[neighbor] ) {
274  // compute the nodes "currentTriangle" and "neighbor" have in common
275  int node1 = getTriangNodeIdx ( currentTriangle, ( i + 1 ) % 3 );
276  int node2 = getTriangNodeIdx ( currentTriangle, ( i + 2 ) % 3 );
277  // check whether common nodes occur in reversed order in "neighbor", if not, change order
278  int j = 0;
279  while ( getTriangNodeIdx ( neighbor, j ) != node2 )
280  j++;
281  if ( getTriangNodeIdx ( neighbor, ( j + 1 ) % 3 ) != node1 ) {
282  // change order of nodes
283  int exchangeCache = getTriangNodeIdx ( neighbor, ( j + 1 ) % 3 );
284  setTriangNodeIdx( neighbor, ( j + 1 ) % 3, getTriangNodeIdx ( neighbor, ( j + 2 ) % 3 ) );
285  setTriangNodeIdx( neighbor, ( j + 2 ) % 3, exchangeCache );
286  // change order of corresponding neighbours
287  exchangeCache = getNeighbour( neighbor, ( j + 1 ) % 3 );
288  setNeighbour( neighbor, ( j + 1 ) % 3, getNeighbour( neighbor, ( j + 2 ) % 3 ) );
289  setNeighbour( neighbor, ( j + 2 ) % 3, exchangeCache );
290  }
291  if ( !inQueue[neighbor] ) {
292  activeTriangles.push( neighbor );
293  inQueue[neighbor] = true;
294  }
295  }
296  }
297  alreadyHandled[currentTriangle] = true;
298  }
299  }
void makeNeighbour() const
Definition: triangMesh.h:180
DataTypeContainer::MaskType MaskType
Definition: triangMesh.h:19
int getNeighbour(const int elementID, const int acrossLocalEdge) const
Get neighbor on edge.
Definition: triangMesh.h:76
int getNumTriangs() const
Definition: triangMesh.h:46
void setTriangNodeIdx(const int num, const int localNode, const int newIdx)
Definition: triangMesh.h:109
int getTriangNodeIdx(const int num, const int localNode) const
Definition: triangMesh.h:104
void setNeighbour(const int elementID, const int acrossLocalEdge, const int value) const
Set neighbor on edge.
Definition: triangMesh.h:82
std::vector< Indices3DType > _neighbour_
Definition: triangMesh.h:25
template<typename DataTypeContainer , typename TriangleType >
void shellFE::TriangMesh< DataTypeContainer, TriangleType >::print ( )
inline

Definition at line 120 of file triangMesh.h.

121  {
122  for ( int nodeIndex = 0; nodeIndex < getNumVertices(); ++nodeIndex ) {
123  cout << endl << "node = " << nodeIndex << endl;
124  }
125  for ( int elementIndex = 0; elementIndex < getNumTriangs(); ++elementIndex ) _triangIterator[elementIndex].print();
126  }
std::vector< TriangleType > _triangIterator
Definition: triangMesh.h:23
int getNumVertices() const
Definition: triangMesh.h:42
int getNumTriangs() const
Definition: triangMesh.h:46
template<typename DataTypeContainer , typename TriangleType >
int shellFE::TriangMesh< DataTypeContainer, TriangleType >::pushBackTriang ( const Indices3DType  nodeIdx)
inline

Insert new triangle and return global index.

Definition at line 59 of file triangMesh.h.

60  {
61  int globalIdx = getNumTriangs();
62  _triangIterator.push_back ( TriangleType( globalIdx, nodeIdx, _vertexIterator ) );
63  return globalIdx;
64  }
std::vector< TriangleType > _triangIterator
Definition: triangMesh.h:23
std::vector< Point3DType > _vertexIterator
Definition: triangMesh.h:22
int getNumTriangs() const
Definition: triangMesh.h:46
shellFE::ShellElementWithTangentSpaceAtVertex< DataTypeContainerShellFE > TriangleType
Definition: ex2.cpp:22
template<typename DataTypeContainer , typename TriangleType >
int shellFE::TriangMesh< DataTypeContainer, TriangleType >::pushBackVertex ( const Point3DType  newVertex)
inline

Insert new vertex and return global index.

Definition at line 52 of file triangMesh.h.

53  {
54  _vertexIterator.push_back(newVertex);
55  return getNumVertices() - 1;
56  }
int getNumVertices() const
Definition: triangMesh.h:42
std::vector< Point3DType > _vertexIterator
Definition: triangMesh.h:22
template<typename DataTypeContainer , typename TriangleType >
void shellFE::TriangMesh< DataTypeContainer, TriangleType >::setNeighbour ( const int  elementID,
const int  acrossLocalEdge,
const int  value 
) const
inline

Set neighbor on edge.

Definition at line 82 of file triangMesh.h.

83  {
84  _neighbour_[elementID][acrossLocalEdge] = value;
85  }
std::vector< Indices3DType > _neighbour_
Definition: triangMesh.h:25
template<typename DataTypeContainer , typename TriangleType >
void shellFE::TriangMesh< DataTypeContainer, TriangleType >::setTriang ( const int  num,
const TriangleType  Arg 
)
inline

Definition at line 99 of file triangMesh.h.

100  {
101  _triangIterator[num] = Arg;
102  }
std::vector< TriangleType > _triangIterator
Definition: triangMesh.h:23
template<typename DataTypeContainer , typename TriangleType >
void shellFE::TriangMesh< DataTypeContainer, TriangleType >::setTriangNodeIdx ( const int  num,
const int  localNode,
const int  newIdx 
)
inline

Definition at line 109 of file triangMesh.h.

110  {
111  _triangIterator[num].setGlobalNodeIdx(localNode, newIdx );
112  }
std::vector< TriangleType > _triangIterator
Definition: triangMesh.h:23
template<typename DataTypeContainer , typename TriangleType >
void shellFE::TriangMesh< DataTypeContainer, TriangleType >::setVertex ( const int  num,
const Point3DType  Arg 
)
inline

Definition at line 70 of file triangMesh.h.

71  {
72  _vertexIterator[num] = Arg;
73  }
std::vector< Point3DType > _vertexIterator
Definition: triangMesh.h:22
template<typename DataTypeContainer , typename TriangleType >
void shellFE::TriangMesh< DataTypeContainer, TriangleType >::updateAllTriangles ( )
inline

Definition at line 115 of file triangMesh.h.

116  {
117  for ( int elementIndex = 0; elementIndex < getNumTriangs(); ++elementIndex ) _triangIterator[elementIndex].updateNodesAndEdges( _vertexIterator );
118  }
std::vector< TriangleType > _triangIterator
Definition: triangMesh.h:23
std::vector< Point3DType > _vertexIterator
Definition: triangMesh.h:22
int getNumTriangs() const
Definition: triangMesh.h:46

Member Data Documentation

template<typename DataTypeContainer , typename TriangleType >
std::vector< Indices3DType > shellFE::TriangMesh< DataTypeContainer, TriangleType >::_neighbour_
mutableprotected

Definition at line 25 of file triangMesh.h.

template<typename DataTypeContainer , typename TriangleType >
std::vector< TriangleType > shellFE::TriangMesh< DataTypeContainer, TriangleType >::_triangIterator
protected

Definition at line 23 of file triangMesh.h.

template<typename DataTypeContainer , typename TriangleType >
std::vector< Point3DType > shellFE::TriangMesh< DataTypeContainer, TriangleType >::_vertexIterator
protected

Definition at line 22 of file triangMesh.h.


The documentation for this class was generated from the following file: