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

Dart iterator. More...

#include <adaptiveTriangMesh.h>

Public Member Functions

 DartIterator (const MeshType &Mesh, GlobalIndex triangleIndex, LocalIndex localEdgeIndex, LocalIndex localNodeIndex)
 Constructor. More...
 
 DartIterator (const MeshType &Mesh, GlobalIndex triangleIndex, LocalIndex localEdgeIndex)
 Constructor. Does not take a note, but orients the DartIterator counterclockwise. More...
 
void set (const GlobalIndex triangle, const LocalIndex edge, const LocalIndex node)
 
GlobalIndex getGlobalTriangleIndex () const
 
GlobalIndex getGlobalNodeIndex () const
 
LocalIndex getLocalNodeIndex () const
 
LocalIndex getLocalEdgeIndex () const
 
LocalIndex getNextNodeLocalIndex () const
 
LocalIndex getNextEdgeLocalIndex () const
 
GlobalIndex getNextNodeGlobalIndex () const
 
GlobalIndex getNextTriangleIndex () const
 
template<typename DartIteratorType >
LocalIndex getCommonNodeLocalIndex (const DartIteratorType &d) const
 Returns local index of common node (first checking if "d" also refers to _triangle, but to a different node) More...
 
template<typename DartIteratorType >
GlobalIndex getCommonNodeGlobalIndex (const DartIteratorType &d) const
 Returns global index of common node (also if "d" refers to a different triangle than _triangle ) More...
 
void print () const
 
bool canFlipTriangle () const
 Does _triangle have a neighbour across _edge? More...
 
void flipTriangle ()
 Moves to neighbouring triangle across _edge. More...
 
void flipNode ()
 Moves to other node along _edge (inside current triangle) More...
 
void flipEdge ()
 moves to other edge with _node (inside current triangle) More...
 

Protected Attributes

const MeshType_mesh
 
GlobalIndex _triangle
 
LocalIndex _node
 
LocalIndex _edge
 

Private Types

typedef AdaptiveTriangMesh< DataTypeContainer, TriangleTypeMeshType
 

Detailed Description

template<typename DataTypeContainer, typename TriangleType>
class shellFE::AdaptiveTriangMesh< DataTypeContainer, TriangleType >::DartIterator

Dart iterator.

This iterator can be used for grid refinement. Please refer to the exercise sheet for a short introduction.

Definition at line 39 of file adaptiveTriangMesh.h.

Member Typedef Documentation

template<typename DataTypeContainer , typename TriangleType >
typedef AdaptiveTriangMesh<DataTypeContainer, TriangleType> shellFE::AdaptiveTriangMesh< DataTypeContainer, TriangleType >::DartIterator::MeshType
private

Definition at line 41 of file adaptiveTriangMesh.h.

Constructor & Destructor Documentation

template<typename DataTypeContainer , typename TriangleType >
shellFE::AdaptiveTriangMesh< DataTypeContainer, TriangleType >::DartIterator::DartIterator ( const MeshType Mesh,
GlobalIndex  triangleIndex,
LocalIndex  localEdgeIndex,
LocalIndex  localNodeIndex 
)
inline

Constructor.

Parameters
[in]MeshThe mesh containing the element
[in]triangleIndexThe index of the triangle to use
[in]localEdgeIndexLocal index of the edge along which the DartIterator will be oriented
[in]localNodeIndexLocal index of the node

Definition at line 56 of file adaptiveTriangMesh.h.

template<typename DataTypeContainer , typename TriangleType >
shellFE::AdaptiveTriangMesh< DataTypeContainer, TriangleType >::DartIterator::DartIterator ( const MeshType Mesh,
GlobalIndex  triangleIndex,
LocalIndex  localEdgeIndex 
)
inline

Constructor. Does not take a note, but orients the DartIterator counterclockwise.

Parameters
[in]MeshThe mesh containing the element
[in]triangleIndexThe index of the triangle to use
[in]localEdgeIndexLocal index of the edge along which the DartIterator will be oriented

Definition at line 64 of file adaptiveTriangMesh.h.

64  :
65  _mesh(Mesh), _triangle (triangleIndex), _node((localEdgeIndex + 1) % 3), _edge(localEdgeIndex) {}

Member Function Documentation

template<typename DataTypeContainer , typename TriangleType >
bool shellFE::AdaptiveTriangMesh< DataTypeContainer, TriangleType >::DartIterator::canFlipTriangle ( ) const
inline

Does _triangle have a neighbour across _edge?

Definition at line 143 of file adaptiveTriangMesh.h.

144  {
145  return this->getNextTriangleIndex() != IndexNotSet ;
146  }
const int IndexNotSet
template<typename DataTypeContainer , typename TriangleType >
void shellFE::AdaptiveTriangMesh< DataTypeContainer, TriangleType >::DartIterator::flipEdge ( )
inline

moves to other edge with _node (inside current triangle)

Definition at line 195 of file adaptiveTriangMesh.h.

template<typename DataTypeContainer , typename TriangleType >
void shellFE::AdaptiveTriangMesh< DataTypeContainer, TriangleType >::DartIterator::flipNode ( )
inline

Moves to other node along _edge (inside current triangle)

Definition at line 189 of file adaptiveTriangMesh.h.

template<typename DataTypeContainer , typename TriangleType >
void shellFE::AdaptiveTriangMesh< DataTypeContainer, TriangleType >::DartIterator::flipTriangle ( )
inline

Moves to neighbouring triangle across _edge.

Definition at line 149 of file adaptiveTriangMesh.h.

150  {
151  if( !canFlipTriangle() )
152  throw std::invalid_argument( aol::strprintf("Cannot flip triangle. In File %s at line %d.", __FILE__, __LINE__).c_str() );
153 
154  GlobalIndex newTriangleIndex = getNextTriangleIndex();
155  GlobalIndex globalNodeIndex = _mesh.getTriangNodeIdx( _triangle, _node );
156  GlobalIndex globalOtherNodesIndex = _mesh.getTriangNodeIdx( _triangle, 3 - (_node + _edge) );
157 
158  // find out which node of the new triangle is ours
159  LocalIndex newNodeIndex = IndexNotSet;
160  for (LocalIndex i = 0; i < 3; ++i) {
161  if ( _mesh.getTriangNodeIdx( newTriangleIndex, i) == globalNodeIndex ) {
162  newNodeIndex = i;
163  break;
164  }
165  }
166 
167  // find out which node of the new triangle lies on our edge
168  LocalIndex newOtherNodesIndex = IndexNotSet;
169  for (LocalIndex i = 1; i < 3; ++i) {
170  if ( _mesh.getTriangNodeIdx( newTriangleIndex,(newNodeIndex + i) % 3 ) == globalOtherNodesIndex ) {
171  newOtherNodesIndex = (newNodeIndex + i) % 3;
172  break;
173  }
174  }
175 
176  if ( min( newNodeIndex, newOtherNodesIndex ) < 0 )
177  throw std::invalid_argument( aol::strprintf( "newTriang should neighbour of _triangle but has no common node .In File %s at line %d.", __FILE__, __LINE__ ).c_str() );
178 
179  LocalIndex newEdgeIndex = (-(newNodeIndex + newOtherNodesIndex)) % 3;
180  if (newEdgeIndex < 0) newEdgeIndex += 3;
181 
182  // all information found, now set:
183  _triangle = newTriangleIndex;
184  _node = newNodeIndex;
185  _edge = newEdgeIndex;
186  }
short LocalIndex
defines for local node and edge numbering
bool canFlipTriangle() const
Does _triangle have a neighbour across _edge?
int GlobalIndex
int getTriangNodeIdx(const int num, const int localNode) const
Definition: triangMesh.h:104
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
const int IndexNotSet
template<typename DataTypeContainer , typename TriangleType >
template<typename DartIteratorType >
GlobalIndex shellFE::AdaptiveTriangMesh< DataTypeContainer, TriangleType >::DartIterator::getCommonNodeGlobalIndex ( const DartIteratorType &  d) const
inline

Returns global index of common node (also if "d" refers to a different triangle than _triangle )

Definition at line 127 of file adaptiveTriangMesh.h.

128  {
129  if ( getGlobalNodeIndex() == d.getGlobalNodeIndex() || getGlobalNodeIndex() == d.getNextNodeGlobalIndex() )
130  return getGlobalNodeIndex();
131  if ( getNextNodeGlobalIndex() == d.getGlobalNodeIndex() || getNextNodeGlobalIndex() == d.getNextNodeGlobalIndex() )
132  return getNextNodeGlobalIndex();
133  throw std::invalid_argument( aol::strprintf("Dart d and *this have no node in common. In File %s at line %d.", __FILE__, __LINE__).c_str() );
134  return -1;
135  }
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
template<typename DataTypeContainer , typename TriangleType >
template<typename DartIteratorType >
LocalIndex shellFE::AdaptiveTriangMesh< DataTypeContainer, TriangleType >::DartIterator::getCommonNodeLocalIndex ( const DartIteratorType &  d) const
inline

Returns local index of common node (first checking if "d" also refers to _triangle, but to a different node)

Definition at line 116 of file adaptiveTriangMesh.h.

117  {
118  if(_triangle != d.getGlobalTriangleIndex())
119  throw std::invalid_argument( aol::strprintf("T=%d, but this->tringle = %d. In File %s at line %d.", d.getGlobalTriangleIndex(), _triangle, __FILE__, __LINE__).c_str() );
120  if ( _edge == d.getLocalEdgeIndex() )
121  throw std::invalid_argument( aol::strprintf("points to same edge=. In File %s at line %d.", __FILE__, __LINE__).c_str() );
122  return 3 - ( getLocalEdgeIndex() + d.getLocalEdgeIndex() );
123  }
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
template<typename DataTypeContainer , typename TriangleType >
GlobalIndex shellFE::AdaptiveTriangMesh< DataTypeContainer, TriangleType >::DartIterator::getGlobalNodeIndex ( ) const
inline

Definition at line 79 of file adaptiveTriangMesh.h.

80  {
82  }
int getTriangNodeIdx(const int num, const int localNode) const
Definition: triangMesh.h:104
template<typename DataTypeContainer , typename TriangleType >
GlobalIndex shellFE::AdaptiveTriangMesh< DataTypeContainer, TriangleType >::DartIterator::getGlobalTriangleIndex ( ) const
inline

Definition at line 74 of file adaptiveTriangMesh.h.

75  {
76  return _triangle;
77  }
template<typename DataTypeContainer , typename TriangleType >
LocalIndex shellFE::AdaptiveTriangMesh< DataTypeContainer, TriangleType >::DartIterator::getLocalEdgeIndex ( ) const
inline

Definition at line 89 of file adaptiveTriangMesh.h.

90  {
91  return _edge;
92  }
template<typename DataTypeContainer , typename TriangleType >
LocalIndex shellFE::AdaptiveTriangMesh< DataTypeContainer, TriangleType >::DartIterator::getLocalNodeIndex ( ) const
inline

Definition at line 84 of file adaptiveTriangMesh.h.

85  {
86  return _node;
87  }
template<typename DataTypeContainer , typename TriangleType >
LocalIndex shellFE::AdaptiveTriangMesh< DataTypeContainer, TriangleType >::DartIterator::getNextEdgeLocalIndex ( ) const
inline

Definition at line 99 of file adaptiveTriangMesh.h.

template<typename DataTypeContainer , typename TriangleType >
GlobalIndex shellFE::AdaptiveTriangMesh< DataTypeContainer, TriangleType >::DartIterator::getNextNodeGlobalIndex ( ) const
inline

Definition at line 104 of file adaptiveTriangMesh.h.

105  {
107  }
int getTriangNodeIdx(const int num, const int localNode) const
Definition: triangMesh.h:104
template<typename DataTypeContainer , typename TriangleType >
LocalIndex shellFE::AdaptiveTriangMesh< DataTypeContainer, TriangleType >::DartIterator::getNextNodeLocalIndex ( ) const
inline

Definition at line 94 of file adaptiveTriangMesh.h.

template<typename DataTypeContainer , typename TriangleType >
GlobalIndex shellFE::AdaptiveTriangMesh< DataTypeContainer, TriangleType >::DartIterator::getNextTriangleIndex ( ) const
inline

Definition at line 109 of file adaptiveTriangMesh.h.

110  {
111  return _mesh.getNeighbour( _triangle, _edge );
112  }
int getNeighbour(const int elementID, const int acrossLocalEdge) const
Get neighbor on edge.
Definition: triangMesh.h:76
template<typename DataTypeContainer , typename TriangleType >
void shellFE::AdaptiveTriangMesh< DataTypeContainer, TriangleType >::DartIterator::print ( ) const
inline

Definition at line 137 of file adaptiveTriangMesh.h.

138  {
139  cerr << "triangle = " << _triangle << ", node = " << _node << ", edge = " << _edge << endl;
140  }
template<typename DataTypeContainer , typename TriangleType >
void shellFE::AdaptiveTriangMesh< DataTypeContainer, TriangleType >::DartIterator::set ( const GlobalIndex  triangle,
const LocalIndex  edge,
const LocalIndex  node 
)
inline

Definition at line 67 of file adaptiveTriangMesh.h.

Member Data Documentation

template<typename DataTypeContainer , typename TriangleType >
LocalIndex shellFE::AdaptiveTriangMesh< DataTypeContainer, TriangleType >::DartIterator::_edge
protected

Definition at line 47 of file adaptiveTriangMesh.h.

template<typename DataTypeContainer , typename TriangleType >
const MeshType& shellFE::AdaptiveTriangMesh< DataTypeContainer, TriangleType >::DartIterator::_mesh
protected

Definition at line 44 of file adaptiveTriangMesh.h.

template<typename DataTypeContainer , typename TriangleType >
LocalIndex shellFE::AdaptiveTriangMesh< DataTypeContainer, TriangleType >::DartIterator::_node
protected

Definition at line 46 of file adaptiveTriangMesh.h.

template<typename DataTypeContainer , typename TriangleType >
GlobalIndex shellFE::AdaptiveTriangMesh< DataTypeContainer, TriangleType >::DartIterator::_triangle
protected

Definition at line 45 of file adaptiveTriangMesh.h.


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