// ============================================================================
// == ==
// == AMDiS - Adaptive multidimensional simulations ==
// == ==
// ============================================================================
// == ==
// == TU Dresden ==
// == ==
// == Institut für Wissenschaftliches Rechnen ==
// == Zellescher Weg 12-14 ==
// == 01069 Dresden ==
// == germany ==
// == ==
// ============================================================================
// == ==
// == https://gforge.zih.tu-dresden.de/projects/amdis/ ==
// == ==
// ============================================================================
/** \file Triangle.h */
#ifndef AMDIS_TRIANGLE_H
#define AMDIS_TRIANGLE_H
#include "Element.h"
namespace AMDiS {
/** \ingroup Triangulation
* \brief
* A Triangle is a 2-dimensional Element.
*
* A Triangle and its refinements:
*
*
*/
class Triangle : public Element
{
public:
/// calls base class contructor.
Triangle(Mesh* aMesh)
: Element(aMesh)
{}
~Triangle() {}
/// implements Element::clone
inline Element *clone()
{
return new Triangle(mesh);
}
/// implements Element::getVertexOfEdge
inline int getVertexOfEdge(int i, int j) const
{
return vertexOfEdge[i][j];
}
/// implements Element::getVertexOfPosition
int getVertexOfPosition(GeoIndex position,
int positionIndex,
int vertexIndex) const;
/// implements Element::getGeo
inline int getGeo(GeoIndex i) const
{
switch (i) {
case VERTEX: case PARTS: case NEIGH:
return 3;
break;
case EDGE:
return 3;
case FACE:
return 0;
case CENTER:
return 1;
break;
case DIMEN:
return 2;
break;
case BOUNDARY:
return 6;
break;
case PROJECTION:
return 3;
break;
default:
ERROR_EXIT("invalid geo-index\n");
return 0;
}
}
/// implements Element::hasSide
bool hasSide(Element* sideElem) const;
/// implements Element::sortFaceIndices
const FixVec& sortFaceIndices(int face, FixVec *vec) const;
/// implements Element::isLine. Returns false because this element is a Triangle
inline bool isLine() const
{
return false;
}
/// implements Element::isTriangle. Returns true because this element is a Triangle
inline bool isTriangle() const
{
return true;
}
/// implements Element::isTetrahedron. Returns false because this element is a Triangle
inline bool isTetrahedron() const
{
return false;
}
/// Element type number is not used in 2d, so return 0.
inline int getChildType(int) const
{
return 0;
}
/// implements Element::getSideOfChild()
virtual int getSideOfChild(int child, int side, int) const
{
FUNCNAME("Triangle::getSideOfChild()");
TEST_EXIT_DBG(child==0 || child==1)("child must be in (0,1)\n");
TEST_EXIT_DBG(side >= 0 && side <= 2)("side must be between 0 and 2\n");
return sideOfChild[child][side];
}
/// implements Element::getVertexOfParent()
virtual int getVertexOfParent(int child, int side, int = 0) const
{
FUNCNAME("Triangle::getVertexOfParent()");
TEST_EXIT_DBG(child==0 || child==1)("child must be in (0,1)\n");
TEST_EXIT_DBG(side >= 0 && side <= 2)("side must be between 0 and 2\n");
return vertexOfParent[child][side];
}
virtual int getPositionOfVertex(int side, int vertex) const
{
static int positionOfVertex[3][3] = {{-1, 0, 1}, {1, -1, 0}, {0, 1, -1}};
return positionOfVertex[side][vertex];
}
inline int getEdgeOfFace(int face, int edge) const
{
TEST_EXIT_DBG(face == 0)("face must be zero at triangle\n");
TEST_EXIT_DBG(edge >= 0 && edge < 3)("invalid edge\n");
return edge;
}
std::string getTypeName() const
{
return "Triangle";
}
void getVertexDofs(FiniteElemSpace* feSpace,
BoundaryObject bound,
DofContainer& dofs,
bool parentVertices = false) const;
void getNonVertexDofs(FiniteElemSpace* feSpace,
BoundaryObject bound,
DofContainer& dofs) const;
protected:
/** \brief
* vertexOfEdge[i][j] is the local number of the j-th vertex of the i-th
* edge of this element.
*/
static const int vertexOfEdge[3][2];
static const int sideOfChild[2][3];
static const int vertexOfParent[2][3];
};
}
#endif // AMDIS_TRIANGLE_H