// ============================================================================ // == == // == AMDiS - Adaptive multidimensional simulations == // == == // ============================================================================ // == == // == crystal growth group == // == == // == Stiftung caesar == // == Ludwig-Erhard-Allee 2 == // == 53175 Bonn == // == germany == // == == // ============================================================================ // == == // == http://www.caesar.de/cg/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: /** \brief * calls base class contructor. */ Triangle(Mesh* aMesh) : Element(aMesh) {} ~Triangle() {} /** \brief * implements Element::clone */ inline Element *clone() { return new Triangle(mesh); } /** \brief * implements Element::getVertexOfEdge */ inline int getVertexOfEdge(int i, int j) const { return vertexOfEdge[i][j]; } /** \brief * implements Element::getVertexOfPosition */ int getVertexOfPosition(GeoIndex position, int positionIndex, int vertexIndex) const; /** \brief * 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; } } /** \brief * implements Element::hasSide */ bool hasSide(Element* sideElem) const; /** \brief * implements Element::sortFaceIndices */ const FixVec& sortFaceIndices(int face, FixVec *vec) const; /** \brief * implements Element::isLine. Returns false because this element is a * Triangle */ inline bool isLine() const { return false; } /** \brief * implements Element::isTriangle. Returns true because this element is a * Triangle */ inline bool isTriangle() const { return true; } /** \brief * implements Element::isTetrahedron. Returns false because this element is a * Triangle */ inline bool isTetrahedron() const { return false; } /** \brief * 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]; } /** \brief * 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; } // ===== Serializable implementation ===== std::string getTypeName() const { return "Triangle"; } 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