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

#include <adaptiveTriangMesh.h>

Classes

class  DartIterator
 Dart iterator. More...
 

Public Types

typedef TriangleType ElementType
 
typedef DataTypeContainer::RealType RealType
 
typedef DataTypeContainer::DomVecType DomVecType
 
typedef DataTypeContainer::Point3DType Point3DType
 
typedef DataTypeContainer::Indices3DType Indices3DType
 
typedef DataTypeContainer::VectorType VectorType
 
typedef DataTypeContainer::MaskType MaskType
 
typedef std::vector< Indices3DTypeVertexIndicesType
 
typedef std::vector< Point3DTypeVertexCoordsType
 
- Public Types inherited from shellFE::TriangMesh< DataTypeContainer, TriangleType >
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

 AdaptiveTriangMesh (const string &fileName)
 
const std::map< int, ParentInformation< DomVecType > > & getInterpolationMap () const
 
void mark (int element)
 Mark element for refinement. More...
 
void markAll ()
 Mark all elements for refinement. More...
 
void unmark (int element)
 Ensure that element is not marked for refinement. More...
 
void unmarkAll ()
 Unmark all elements. More...
 
bool isMarkedForRefinement (int element) const
 
int pushBackTriang (const Indices3DType newTriang)
 
void refineMarkedTriangles ()
 Refines at least all triangles that have been marked. More...
 
void prolongateLinearly (VectorType &function) const
 Prolongate by linear interpolation. More...
 
LocalIndex getLongestEdgeIndex (GlobalIndex triangle) const
 Get longest edge index (starting search possibly with a preferred edge) More...
 
- Public Member Functions inherited from shellFE::TriangMesh< DataTypeContainer, TriangleType >
 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 Member Functions

GlobalIndex refine (GlobalIndex triangleToRefine)
 
GlobalIndex refine (const DartIterator &d)
 
GlobalIndex refineOnlyThis (const DartIterator &d, GlobalIndex midpoint)
 
GlobalIndex addEdgeMidpoint (const DartIterator &d)
 Add edge midpoint on d.edge, update _interpolationMap and return global index of node. More...
 

Protected Attributes

std::vector< bool > _markedForRefinement
 
std::map< int, ParentInformation< DomVecType > > _interpolationMap
 
- Protected Attributes inherited from shellFE::TriangMesh< DataTypeContainer, TriangleType >
std::vector< Point3DType_vertexIterator
 
std::vector< TriangleType_triangIterator
 
std::vector< Indices3DType_neighbour_
 

Detailed Description

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

Definition at line 21 of file adaptiveTriangMesh.h.

Member Typedef Documentation

template<typename DataTypeContainer , typename TriangleType >
typedef DataTypeContainer::DomVecType shellFE::AdaptiveTriangMesh< DataTypeContainer, TriangleType >::DomVecType

Definition at line 26 of file adaptiveTriangMesh.h.

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

Definition at line 24 of file adaptiveTriangMesh.h.

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

Definition at line 28 of file adaptiveTriangMesh.h.

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

Definition at line 30 of file adaptiveTriangMesh.h.

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

Definition at line 27 of file adaptiveTriangMesh.h.

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

Definition at line 25 of file adaptiveTriangMesh.h.

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

Definition at line 29 of file adaptiveTriangMesh.h.

template<typename DataTypeContainer , typename TriangleType >
typedef std::vector< Point3DType > shellFE::AdaptiveTriangMesh< DataTypeContainer, TriangleType >::VertexCoordsType

Definition at line 32 of file adaptiveTriangMesh.h.

template<typename DataTypeContainer , typename TriangleType >
typedef std::vector< Indices3DType > shellFE::AdaptiveTriangMesh< DataTypeContainer, TriangleType >::VertexIndicesType

Definition at line 31 of file adaptiveTriangMesh.h.

Constructor & Destructor Documentation

template<typename DataTypeContainer , typename TriangleType >
shellFE::AdaptiveTriangMesh< DataTypeContainer, TriangleType >::AdaptiveTriangMesh ( const string &  fileName)
inline

Definition at line 206 of file adaptiveTriangMesh.h.

206  :
207  TriangMesh<DataTypeContainer, TriangleType >( fileName ),
208  _markedForRefinement( this->getNumTriangs(), false )
209  {
210  this->makeNeighbour();
211  }
void makeNeighbour() const
Definition: triangMesh.h:180
std::vector< bool > _markedForRefinement
int getNumTriangs() const
Definition: triangMesh.h:46

Member Function Documentation

template<typename DataTypeContainer , typename TriangleType >
GlobalIndex shellFE::AdaptiveTriangMesh< DataTypeContainer, TriangleType >::addEdgeMidpoint ( const DartIterator d)
inlineprotected

Add edge midpoint on d.edge, update _interpolationMap and return global index of node.

Note
For the lab, _interpolationMap can be ignored

Definition at line 395 of file adaptiveTriangMesh.h.

396  {
397  DartIterator d1 = d;
398  d1.flipNode();
399 
401  parents.globalIndices[0] = d.getGlobalNodeIndex();
402  parents.globalIndices[1] = d1.getGlobalNodeIndex();
403  parents.ElementIndex = d.getGlobalTriangleIndex();
404 
405  // get edge midpoint between nodes n1 and n2
406  Point3DType newVertex;
407  newVertex.setZero();
408  newVertex += this->getVertex ( d.getGlobalNodeIndex() );
409  newVertex += this->getVertex ( d1.getGlobalNodeIndex() );
410  newVertex /= 2.;
411 
412  // add new vertex
413  int newNodeIdx = this->pushBackVertex( newVertex );
414  _interpolationMap.insert( std::pair< int, ParentInformation<DomVecType> >( newNodeIdx, parents ) );
415  return newNodeIdx;
416  }
const Point3DType & getVertex(const int num) const
Definition: triangMesh.h:66
std::map< int, ParentInformation< DomVecType > > _interpolationMap
int pushBackVertex(const Point3DType newVertex)
Insert new vertex and return global index.
Definition: triangMesh.h:52
DataTypeContainer::Point3DType Point3DType
template<typename DataTypeContainer , typename TriangleType >
const std::map< int, ParentInformation<DomVecType> >& shellFE::AdaptiveTriangMesh< DataTypeContainer, TriangleType >::getInterpolationMap ( ) const
inline

Definition at line 213 of file adaptiveTriangMesh.h.

214  {
215  return _interpolationMap;
216  }
std::map< int, ParentInformation< DomVecType > > _interpolationMap
template<typename DataTypeContainer , typename TriangleType >
LocalIndex shellFE::AdaptiveTriangMesh< DataTypeContainer, TriangleType >::getLongestEdgeIndex ( GlobalIndex  triangle) const
inline

Get longest edge index (starting search possibly with a preferred edge)

Definition at line 281 of file adaptiveTriangMesh.h.

282  {
283  // get global node indices of triangle
284  const Indices3DType &triangIdx ( this->getTriang( triangle ).getGlobalNodeIdx() );
285  // assume that edge 0 is longest edge
286  LocalIndex localIdx = 0;
287  Point3DType edge = this->getVertex( triangIdx[1] );
288  edge -= this->getVertex( triangIdx[2] );
289  RealType maxLength = edge.squaredNorm();
290  // now check if edge 1 is longer
291  edge = this->getVertex( triangIdx[2] );
292  edge -= this->getVertex( triangIdx[0] );
293  RealType candidate = edge.squaredNorm();
294  if( candidate > maxLength ) {
295  localIdx = 1;
296  maxLength = candidate;
297  }
298  // now check if edge 2 is longer
299  edge = this->getVertex( triangIdx[0] );
300  edge -= this->getVertex( triangIdx[1] );
301  candidate = edge.squaredNorm();
302  if( candidate > maxLength ) localIdx = 2;
303 
304  return localIdx;
305  }
const TriangleType & getTriang(const int num) const
Definition: triangMesh.h:87
const Point3DType & getVertex(const int num) const
Definition: triangMesh.h:66
short LocalIndex
defines for local node and edge numbering
DataTypeContainer::Point3DType Point3DType
double RealType
Definition: ex1.cpp:22
DataTypeContainer::Indices3DType Indices3DType
template<typename DataTypeContainer , typename TriangleType >
bool shellFE::AdaptiveTriangMesh< DataTypeContainer, TriangleType >::isMarkedForRefinement ( int  element) const
inline

Definition at line 242 of file adaptiveTriangMesh.h.

243  {
244  return _markedForRefinement[element];
245  }
std::vector< bool > _markedForRefinement
template<typename DataTypeContainer , typename TriangleType >
void shellFE::AdaptiveTriangMesh< DataTypeContainer, TriangleType >::mark ( int  element)
inline

Mark element for refinement.

Definition at line 219 of file adaptiveTriangMesh.h.

220  {
221  _markedForRefinement[ element ] = true;
222  }
std::vector< bool > _markedForRefinement
template<typename DataTypeContainer , typename TriangleType >
void shellFE::AdaptiveTriangMesh< DataTypeContainer, TriangleType >::markAll ( )
inline

Mark all elements for refinement.

Definition at line 225 of file adaptiveTriangMesh.h.

226  {
227  for( unsigned i = 0; i < _markedForRefinement.size(); i++ ) _markedForRefinement[i] = true;
228  }
std::vector< bool > _markedForRefinement
template<typename DataTypeContainer , typename TriangleType >
void shellFE::AdaptiveTriangMesh< DataTypeContainer, TriangleType >::prolongateLinearly ( VectorType function) const
inline

Prolongate by linear interpolation.

Definition at line 266 of file adaptiveTriangMesh.h.

267  {
268  VectorType oldFunction = function;
269  int oldSize = function.size();
270  function.resize( this->getNumVertices() );
271  for( int i = 0; i < oldSize; ++i ) function[i] = oldFunction[i];
272  typename std::map< int, ParentInformation<DomVecType> >::const_iterator iter;
273  for( int i = oldSize; i < function.size(); ++i ) {
274  iter = _interpolationMap.find( i );
275  if( iter == _interpolationMap.end() ) throw std::invalid_argument ( aol::strprintf ( "unknown vertex in File %s at line %d.", __FILE__, __LINE__ ).c_str() );
276  function[i] = 0.5 * ( function[iter->second.globalIndices[0]] + function[iter->second.globalIndices[1]] );
277  }
278  }
std::map< int, ParentInformation< DomVecType > > _interpolationMap
int getNumVertices() const
Definition: triangMesh.h:42
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
ConfiguratorType::VectorType VectorType
Definition: ex1.cpp:27
template<typename DataTypeContainer , typename TriangleType >
int shellFE::AdaptiveTriangMesh< DataTypeContainer, TriangleType >::pushBackTriang ( const Indices3DType  newTriang)
inline
Note
when adding a new face we have to expand the array _markedForRefinement correspondingly

Definition at line 248 of file adaptiveTriangMesh.h.

249  {
250  _markedForRefinement.push_back( false );
252  }
int pushBackTriang(const Indices3DType nodeIdx)
Insert new triangle and return global index.
Definition: triangMesh.h:59
std::vector< bool > _markedForRefinement
template<typename DataTypeContainer , typename TriangleType >
GlobalIndex shellFE::AdaptiveTriangMesh< DataTypeContainer, TriangleType >::refine ( GlobalIndex  triangleToRefine)
inlineprotected

Definition at line 309 of file adaptiveTriangMesh.h.

310  {
311  DartIterator d( *this, triangleToRefine, getLongestEdgeIndex( triangleToRefine ) );
312  return refine( d );
313  }
GlobalIndex refine(GlobalIndex triangleToRefine)
LocalIndex getLongestEdgeIndex(GlobalIndex triangle) const
Get longest edge index (starting search possibly with a preferred edge)
template<typename DataTypeContainer , typename TriangleType >
GlobalIndex shellFE::AdaptiveTriangMesh< DataTypeContainer, TriangleType >::refine ( const DartIterator d)
inlineprotected

Definition at line 315 of file adaptiveTriangMesh.h.

316  {
317  // first cut the neighbour on edge l in two triangles:
318  GlobalIndex P_new = addEdgeMidpoint( d );
319  DartIterator d_prime = d;
320  bool hasNeighbourOn_d_prime = d_prime.canFlipTriangle();
321  GlobalIndex T_l_new = IndexNotSet;
322 
323  if ( hasNeighbourOn_d_prime ) {
324  d_prime.flipTriangle();
325  T_l_new = refineOnlyThis(d_prime, P_new);
326  }
327 
328  // create new triangle T_new and connect with neighbours
329  GlobalIndex T_new = refineOnlyThis(d, P_new);
330 
331  // take care of neighbours
332  if (hasNeighbourOn_d_prime) {
333  // set d_prime to edge which lies in T_l_new, opposite to edge d2.edge of T_new
334  d_prime.flipNode();
335  d_prime.flipEdge();
336  // flipTriangle() here will always work, as we have just created this triangle. Thus, no canFlipTriangle() call is needed.
337  d_prime.flipTriangle();
338  d_prime.flipEdge();
339  // set neighbour GlobalIndex in T_l_new
340  this->setNeighbour ( d_prime.getGlobalTriangleIndex(), d_prime.getLocalEdgeIndex(), T_new );
341  // move d1 to T_new
342  DartIterator d1 = d;
343  d1.flipNode();
344  d1.flipEdge();
345  d1.flipTriangle();
346  d1.flipEdge();
347  // set neighbour in T_new
348  this->setNeighbour ( d1.getGlobalTriangleIndex(), d1.getLocalEdgeIndex(), T_l_new );
349  }
350 
351  return T_new;
352  }
int GlobalIndex
void setNeighbour(const int elementID, const int acrossLocalEdge, const int value) const
Set neighbor on edge.
Definition: triangMesh.h:82
GlobalIndex addEdgeMidpoint(const DartIterator &d)
Add edge midpoint on d.edge, update _interpolationMap and return global index of node.
const int IndexNotSet
GlobalIndex refineOnlyThis(const DartIterator &d, GlobalIndex midpoint)
template<typename DataTypeContainer , typename TriangleType >
void shellFE::AdaptiveTriangMesh< DataTypeContainer, TriangleType >::refineMarkedTriangles ( )
inline

Refines at least all triangles that have been marked.

Note
May refine unmarked triangles

Definition at line 256 of file adaptiveTriangMesh.h.

257  {
258  const int numElements = this->getNumTriangs();
259  for ( int elementIndex = 0; elementIndex < numElements; ++elementIndex )
260  if ( isMarkedForRefinement( elementIndex ) ) refine( elementIndex );
262  this->updateAllTriangles();
263  }
GlobalIndex refine(GlobalIndex triangleToRefine)
void updateAllTriangles()
Definition: triangMesh.h:115
int getNumTriangs() const
Definition: triangMesh.h:46
void makeOrientationConsistent()
Definition: triangMesh.h:252
bool isMarkedForRefinement(int element) const
template<typename DataTypeContainer , typename TriangleType >
GlobalIndex shellFE::AdaptiveTriangMesh< DataTypeContainer, TriangleType >::refineOnlyThis ( const DartIterator d,
GlobalIndex  midpoint 
)
inlineprotected

Definition at line 354 of file adaptiveTriangMesh.h.

355  {
356  // in comments for this function, we write T for *this.
357  LocalIndex l = getLongestEdgeIndex( d.getGlobalTriangleIndex() );
358  if (l != d.getLocalEdgeIndex()) {
359  DartIterator d_l(*this, d.getGlobalTriangleIndex(), l);
360  LocalIndex commonNode = d.getCommonNodeLocalIndex(d_l);
361  DartIterator d_prime( *this, d.getGlobalTriangleIndex(), l, commonNode);
362  // bisect T along the longest edge
363  refine(d_prime);
364  // because d_prime.node also lies on d.edge, T is now modifies in such a way that d.edge has remained unchanged. Proceed by recursion until d.edge is the longest edge in T.
365  return refineOnlyThis(d, midpoint);
366  }
367  // create DartIterators to all edges, starting from l
368  DartIterator d1 = d;
369  d1.flipNode();
370  d1.flipEdge();
371  DartIterator d2 = d1;
372  d2.flipNode();
373  d2.flipEdge();
374  // create new triangle T_new and connect with neighbours
375  GlobalIndex T_newIndex = this->pushBackTriang ( Indices3DType( midpoint, d1.getGlobalNodeIndex(), d2.getGlobalNodeIndex() ) );
376  this->_neighbour_.push_back( Indices3DType ( d1.getNextTriangleIndex(), d.getGlobalTriangleIndex(), d.getNextTriangleIndex() ) );
377  // set neighbour GlobalIndex in triangle lying opposite to d1.edge to T_new
378  DartIterator d1_prime = d1;
379  if (d1_prime.canFlipTriangle()) {
380  d1_prime.flipTriangle();
381  this->setNeighbour ( d1_prime.getGlobalTriangleIndex(), d1_prime.getLocalEdgeIndex(), T_newIndex );
382  }
383  // connect ourselves (i. e., connect T) to T_new:
384  this->setNeighbour( d1.getGlobalTriangleIndex(), d1.getLocalEdgeIndex(), T_newIndex );
385  // do not have to refine this triangle again
386  unmark( d1.getGlobalTriangleIndex() );
387  // old triangle now has a new vertex, ie the midpoint
388  this->getTriang( d1.getGlobalTriangleIndex() ).setGlobalNodeIdx( d1.getLocalNodeIndex(), midpoint);
389 
390  return T_newIndex;
391  }
GlobalIndex refine(GlobalIndex triangleToRefine)
const TriangleType & getTriang(const int num) const
Definition: triangMesh.h:87
short LocalIndex
defines for local node and edge numbering
int pushBackTriang(const Indices3DType newTriang)
int GlobalIndex
LocalIndex getLongestEdgeIndex(GlobalIndex triangle) const
Get longest edge index (starting search possibly with a preferred edge)
void setNeighbour(const int elementID, const int acrossLocalEdge, const int value) const
Set neighbor on edge.
Definition: triangMesh.h:82
DataTypeContainer::Indices3DType Indices3DType
void unmark(int element)
Ensure that element is not marked for refinement.
std::vector< Indices3DType > _neighbour_
Definition: triangMesh.h:25
GlobalIndex refineOnlyThis(const DartIterator &d, GlobalIndex midpoint)
template<typename DataTypeContainer , typename TriangleType >
void shellFE::AdaptiveTriangMesh< DataTypeContainer, TriangleType >::unmark ( int  element)
inline

Ensure that element is not marked for refinement.

Definition at line 231 of file adaptiveTriangMesh.h.

232  {
233  _markedForRefinement[ element ] = false;
234  }
std::vector< bool > _markedForRefinement
template<typename DataTypeContainer , typename TriangleType >
void shellFE::AdaptiveTriangMesh< DataTypeContainer, TriangleType >::unmarkAll ( )
inline

Unmark all elements.

Definition at line 237 of file adaptiveTriangMesh.h.

238  {
239  for( unsigned i = 0; i < _markedForRefinement.size(); i++ )
240  _markedForRefinement[i] = false;
241  }
std::vector< bool > _markedForRefinement

Member Data Documentation

template<typename DataTypeContainer , typename TriangleType >
std::map< int, ParentInformation<DomVecType> > shellFE::AdaptiveTriangMesh< DataTypeContainer, TriangleType >::_interpolationMap
protected

Definition at line 203 of file adaptiveTriangMesh.h.

template<typename DataTypeContainer , typename TriangleType >
std::vector<bool> shellFE::AdaptiveTriangMesh< DataTypeContainer, TriangleType >::_markedForRefinement
protected

Definition at line 202 of file adaptiveTriangMesh.h.


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