Programming tasks to Scientific Computing I
triangleShellFE.h
Go to the documentation of this file.
1 #ifndef __TRIANGLESHELLFE_H
2 #define __TRIANGELSHELLFE_H
3 
4 #include <aol.h>
5 
6 namespace shellFE {
7 
9 template<typename DataTypeContainer>
11 
13  typedef typename DataTypeContainer::DomVecType DomVecType;
14  typedef typename DataTypeContainer::Point3DType Point3DType;
15  typedef typename DataTypeContainer::TangentVecType TangentVecType;
16  typedef typename DataTypeContainer::Indices3DType Indices3DType;
17  typedef std::vector<Point3DType> VertexIterator;
18  typedef std::vector<TangentVecType> TangentVecIterator;
19 
20 protected:
21  // global indices of element an nodes
22  int _globIdx;
23  Indices3DType _globNodeIdx;
24  Point3DType _nodes[3];
25  TangentVecType _edges[3]; // Notation: e_i = N_{i-1} - N_{i+1} = N_{i+2} - N_{i+1}, i = 0,1,2
26 
27 public:
28 
30 
31  ShellElementWithTangentSpaceAtVertex( const int globalIdx, const Indices3DType globalNodeIndex, const VertexIterator &nodes ) :
32  _globIdx(globalIdx),
33  _globNodeIdx ( globalNodeIndex )
34  {
35  // fill nodes and edges
36  for ( int i = 0; i < 3; ++i ) _nodes[i] = nodes[ _globNodeIdx[i] ];
37  for ( int i = 0; i < 3; ++i ) _edges[i] = getNode((i+2)%3) - getNode((i+1)%3);
38  }
39 
41 
42 
43  void updateNodesAndEdges( const VertexIterator &nodes ){
44  for ( int i = 0; i < 3; ++i ) _nodes[i] = nodes[ _globNodeIdx[i] ];
45  for ( int i = 0; i < 3; ++i ) _edges[i] = getNode((i+2)%3) - getNode((i+1)%3);
46  }
47 
48  void printNodes() const { cout << "node0 = " << getNode(0).transpose() << endl << "node1 = " << getNode(1).transpose() << endl << "node2 = " << getNode(2).transpose() << endl;}
49 
50  void print() const {
51  cout << endl << "Element " << _globIdx << endl;
52  printNodes();
53  }
54 
55  //The following methods compute the weighted/normalized normal of the triangle elements and its area under the assumption that the triangle is flat
56  void getWeightedNormalForFlattenedTriangle ( TangentVecType &normal ) const {
57  TangentVecType dx1 = getNode(1), dx2 = getNode(2);
58  dx1 -= getNode(0);
59  dx2 -= getNode(0);
60  normal = TangentVecType( dx1.cross(dx2) );
61  }
62 
63  void getNormalizedNormalForFlattenedTriangle ( TangentVecType &normal ) const {
65  normal.normalize();
66  }
67 
68  inline RealType getAreaOfFlattenedTriangle() const {
69  TangentVecType n; getWeightedNormalForFlattenedTriangle ( n );
70  return n.norm() / 2.;
71  }
72 
73  // get and set functions
74  int getGlobalElementIdx() const { return _globIdx;}
75  const Indices3DType & getGlobalNodeIdx( ) const{ return _globNodeIdx;}
76  int getGlobalNodeIdx(int localIndex) const{ return _globNodeIdx[localIndex];}
77  void setGlobalNodeIdx(int localIndex, int globalIndex) { _globNodeIdx[localIndex] = globalIndex;}
78 
80  const Point3DType& getNode ( int i ) const { return _nodes[i];}
81  Point3DType& getNode ( int i ) { return _nodes[i];}
82  void setNode ( int i, const Point3DType& node ) {_nodes[i] = node;}
83 
85  const TangentVecType& getEdge(int i) const { return _edges[i]; }
86 
87  const TangentVecType& operator[] ( int i ) const { return getNode(i);}
88  TangentVecType& operator[] ( int i ) {return getNode(i);}
89 
90 };
91 
92 
93 } //end namespace
94 
95 
96 #endif
const TangentVecType & operator[](int i) const
void updateNodesAndEdges(const VertexIterator &nodes)
const Indices3DType & getGlobalNodeIdx() const
DataTypeContainer::DomVecType DomVecType
ShellElementWithTangentSpaceAtVertex(const int globalIdx, const Indices3DType globalNodeIndex, const VertexIterator &nodes)
void setGlobalNodeIdx(int localIndex, int globalIndex)
const Point3DType & getNode(int i) const
Access node i.
void setNode(int i, const Point3DType &node)
DataTypeContainer::Point3DType Point3DType
std::vector< TangentVecType > TangentVecIterator
DataTypeContainer::TangentVecType TangentVecType
void getNormalizedNormalForFlattenedTriangle(TangentVecType &normal) const
Definition: rhs.h:14
void getWeightedNormalForFlattenedTriangle(TangentVecType &normal) const
double RealType
Definition: ex1.cpp:22
Triangle which has a tangent space at each node.
const TangentVecType & getEdge(int i) const
Access edge i.
DataTypeContainer::Indices3DType Indices3DType