LCOV - code coverage report
Current view: top level - ugbase/lib_disc/reference_element - reference_element.h (source / functions) Coverage Total Hit
Test: coverage.info Lines: 25.9 % 27 7
Test Date: 2025-09-21 23:31:46 Functions: 0.0 % 14 0

            Line data    Source code
       1              : /*
       2              :  * Copyright (c) 2010-2021:  G-CSC, Goethe University Frankfurt
       3              :  * Authors: Andreas Vogel, Martin Stepniewski
       4              :  * 
       5              :  * This file is part of UG4.
       6              :  * 
       7              :  * UG4 is free software: you can redistribute it and/or modify it under the
       8              :  * terms of the GNU Lesser General Public License version 3 (as published by the
       9              :  * Free Software Foundation) with the following additional attribution
      10              :  * requirements (according to LGPL/GPL v3 §7):
      11              :  * 
      12              :  * (1) The following notice must be displayed in the Appropriate Legal Notices
      13              :  * of covered and combined works: "Based on UG4 (www.ug4.org/license)".
      14              :  * 
      15              :  * (2) The following notice must be displayed at a prominent place in the
      16              :  * terminal output of covered works: "Based on UG4 (www.ug4.org/license)".
      17              :  * 
      18              :  * (3) The following bibliography is recommended for citation and must be
      19              :  * preserved in all covered files:
      20              :  * "Reiter, S., Vogel, A., Heppner, I., Rupp, M., and Wittum, G. A massively
      21              :  *   parallel geometric multigrid solver on hierarchically distributed grids.
      22              :  *   Computing and visualization in science 16, 4 (2013), 151-164"
      23              :  * "Vogel, A., Reiter, S., Rupp, M., Nägel, A., and Wittum, G. UG4 -- a novel
      24              :  *   flexible software system for simulating pde based models on high performance
      25              :  *   computers. Computing and visualization in science 16, 4 (2013), 165-179"
      26              :  * 
      27              :  * This program is distributed in the hope that it will be useful,
      28              :  * but WITHOUT ANY WARRANTY; without even the implied warranty of
      29              :  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
      30              :  * GNU Lesser General Public License for more details.
      31              :  */
      32              : 
      33              : #ifndef __H__UG__LIB_DISC__REFERENCE_ELEMENT__REFERENCE_ELEMENT__
      34              : #define __H__UG__LIB_DISC__REFERENCE_ELEMENT__REFERENCE_ELEMENT__
      35              : 
      36              : #include <cassert>
      37              : #include <iostream>
      38              : #include <sstream>
      39              : #include "common/common.h"
      40              : #include "common/math/ugmath.h"
      41              : #include "lib_grid/grid/grid_base_objects.h"
      42              : 
      43              : namespace ug{
      44              : 
      45              : ///////////////////////////////////////////////////////////////////////////////
      46              : // Reference Element Common Base Class
      47              : ///////////////////////////////////////////////////////////////////////////////
      48              : 
      49              : /// base class for reference elements
      50              : /**
      51              :  * Reference element interface. A reference element describes in local
      52              :  * coordinates the structure an element type. Physical elements of a grid are
      53              :  * thought to be constructed by a mapping from a reference element into the
      54              :  * real world space.
      55              :  *
      56              :  * Each ReferenceElement may be constructed from other (lower dimensional)
      57              :  * geometric objects, that are themselves a mapping from a (lower dimensional)
      58              :  * reference element. (E.g. a triangle is constructed by three edges and
      59              :  * three vertices) Thus, these relationships are also specified by the reference
      60              :  * element and methods of this function provide the number of constructing
      61              :  * sub-geometric objects and the relationship between those.
      62              :  *
      63              :  * Note, that we use one base class in order to implement all reference elements
      64              :  * providing enough space to store all data for each derivation. This enlarges
      65              :  * the memory consumption slightly but allows fast and inlined code. Since
      66              :  * usually only one reference element (singleton) per program is created memory
      67              :  * consumption is not an issue.
      68              :  */
      69              : class ReferenceElement
      70              : {
      71              :         public:
      72              :         ///     Constructor filling the arrays
      73              :                 ReferenceElement();
      74              : 
      75              :         /// returns the reference object id
      76              :                 ReferenceObjectID roid() const
      77           29 :                         {return m_vRefElemType[m_dim][0];}
      78              : 
      79              :         /// returns the dimension where reference element lives
      80           57 :                 int dimension() const {return m_dim;}
      81              : 
      82              :         /// returns the size (e.g. area or volume) of the reference element
      83            0 :                 number size() const     {return m_size;}
      84              : 
      85              :         /// returns the number of geometric objects of dim
      86              :         /**
      87              :          * A reference element is constructed by several geometric objects, that
      88              :          * are mapped by a reference element by themselves. This method returns how
      89              :          * many (sub-)geometric objects of a given dimension are contained in this
      90              :          * reference element.
      91              :          *
      92              :          * \param[in]   dim             dimension
      93              :          * \returns             number of objects of the dimension contained in the ref elem
      94              :          */
      95          618 :                 size_t num(int dim) const       {return m_vNum[dim];}
      96              : 
      97              :         /// returns the number of object of dim for a sub-geometric object
      98              :         /**
      99              :          * A reference element is constructed by several geometric objects, that
     100              :          * are mapped by a reference element by themselves. This method returns how
     101              :          * many (sub-)geometric objects of a given dimension are contained in a
     102              :          * (sub-)geometric object of this reference element.
     103              :          *
     104              :          * \param[in]   dim_i           dimension of sub geometric object
     105              :          * \param[in]   i                       number of sub geometric object
     106              :          * \param[in]   dim_j           dimension for elems contained in the sub-object
     107              :          * \returns             number of objects of the dimension dim_j that are
     108              :          *                              contained in the i*th (sub-)geom object of dimension dim_i
     109              :          */
     110              :                 size_t num(int dim_i, size_t i, int dim_j) const
     111          158 :                         {return m_vSubNum[dim_i][i][dim_j];}
     112              : 
     113              :         /// id of object j in dimension dim_j of obj i in dimension dim_i
     114              :         /**
     115              :          * A reference element is constructed by several geometric objects, that
     116              :          * are mapped by a reference element by themselves. This method returns the
     117              :          * id (w.r.t. this reference element) of a sub-geometric object that is
     118              :          * part of a sub-geometric object of the reference element
     119              :          *
     120              :          * \param[in]   dim_i           dimension of sub geometric object
     121              :          * \param[in]   i                       id of sub geometric object
     122              :          * \param[in]   dim_j           dimension for obj contained in the sub-object
     123              :          * \param[in]   j                       number of obj contained in the sub-object
     124              :          * \returns             id of the j'th object of the dimension dim_j that are
     125              :          *                              contained in the i*th (sub-)geom object of dimension dim_i
     126              :          */
     127              :                 int id(int dim_i, size_t i, int dim_j, size_t j) const
     128          169 :                         {return m_id[dim_i][i][dim_j][j];}
     129              : 
     130              :         /// number of reference elements this element contains
     131              :                 size_t num(ReferenceObjectID type) const
     132            0 :                         {return m_vNumRefElem[type];}
     133              : 
     134              :         /// reference element type of obj nr i in dimension dim_i
     135              :                 ReferenceObjectID roid(int dim_i, size_t i) const
     136           10 :                         {return m_vRefElemType[dim_i][i];}
     137              : 
     138              :         /// print informations about the reference element
     139              :                 void print_info() const;
     140              : 
     141              :         protected:
     142              :         /// to make it more readable
     143              :                 enum{POINT = 0, EDGE = 1, FACE = 2, VOLUME= 3};
     144              : 
     145              :         ///     maximum number of Objects in all dimensions
     146              :                 enum{MAXOBJECTS = 12};
     147              : 
     148              :         ///     maximum dimension
     149              :                 enum{MAXDIM = 3};
     150              : 
     151              :         ///     dimension of the reference world
     152              :                 int m_dim;
     153              : 
     154              :         ///     size of reference element
     155              :                 number m_size;
     156              : 
     157              :         /// number of Geometric Objects of a dimension
     158              :                 size_t m_vNum[MAXDIM+1];
     159              : 
     160              :         /// number of Geometric Objects contained in a (Sub-)Geometric Object of the Element
     161              :                 size_t m_vSubNum[MAXDIM+1][MAXOBJECTS][MAXDIM+1];
     162              : 
     163              :         /// indices of GeomObjects
     164              :                 int m_id[MAXDIM+1][MAXOBJECTS][MAXDIM+1][MAXOBJECTS];
     165              : 
     166              :         ///     number of reference elements
     167              :                 size_t m_vNumRefElem[NUM_REFERENCE_OBJECTS];
     168              : 
     169              :         ///     type of reference elements
     170              :                 ReferenceObjectID m_vRefElemType[MAXDIM+1][MAXOBJECTS];
     171              : };
     172              : 
     173              : /// dimension dependent base class for reference elements
     174              : /**
     175              :  * This is the base class for reference elements with their dimension. It
     176              :  * simply adds to the ReferenceElement base class the corner position of the
     177              :  * reference element vertices in local coordinates.
     178              :  *
     179              :  * \tparam              d               dimension, where reference element lives
     180              :  */
     181              : template <int d>
     182            0 : class DimReferenceElement : public ReferenceElement
     183              : {
     184              :         public:
     185              :         ///     dimension, where the reference element is defined
     186              :                 static const int dim = d;
     187              : 
     188              :         /// coordinates of reference corner in a vector
     189            0 :                 const MathVector<dim>* corners() const {return &m_vCorner[0];}
     190              : 
     191              :         /// coordinates of reference corner (i = 0 ... num(0))
     192            0 :                 const MathVector<dim>& corner(size_t i) const {return m_vCorner[i];}
     193              : 
     194              :         /// coordinates of reference corner as integer
     195           54 :                 const MathVector<dim,int>* corner() const {return m_vCoInt;}
     196              : 
     197              :         /// print informations about the reference element
     198              :                 void print_info() const;
     199              : 
     200              :         protected:
     201              :         ///     maximum number of corners for fixed reference elements
     202              :                 enum{MAXCORNERS = 8};
     203              : 
     204              :         ///     coordinates of Reference Corner
     205              :                 MathVector<dim> m_vCorner[MAXCORNERS];
     206              :                 MathVector<dim, int> m_vCoInt[MAXCORNERS];
     207              : };
     208              : 
     209              : ///////////////////////////////////////////////////////////////////////////////
     210              : // Reference Element Providers
     211              : ///////////////////////////////////////////////////////////////////////////////
     212              : 
     213              : /// Exception thrown when reference element not found
     214              : struct UGError_ReferenceElementMissing : public UGError
     215              : {
     216              :         UGError_ReferenceElementMissing(int dim_, ReferenceObjectID roid_)
     217              :         : UGError(""), dim(dim_), roid(roid_)
     218              :         {
     219              :                 std::stringstream ss; ss << "Reference Element not found for "
     220              :                                                         <<roid<<" (dim="<<dim<<")";
     221              :                 UGError::push_msg(ss.str());
     222              :         }
     223              :         int dim;
     224              :         ReferenceObjectID roid;
     225              : };
     226              : 
     227              : /// Provider for Reference Elements
     228              : class ReferenceElementProvider
     229              : {
     230              :         private:
     231              :         ///     constructor
     232              :                 ReferenceElementProvider();
     233              : 
     234              :         //      intentionally left unimplemented
     235              :                 ReferenceElementProvider(const ReferenceElementProvider&){};
     236              :                 ReferenceElementProvider& operator=(const ReferenceElementProvider&);
     237              : 
     238              :         ///     provide instance of singleton
     239            0 :                 static ReferenceElementProvider& instance()
     240              :                 {
     241            0 :                         static ReferenceElementProvider inst;
     242            0 :                         return inst;
     243              :                 }
     244              : 
     245              :         ///     adds a Reference Element
     246              :                 static bool add_elem(const ReferenceElement& elem);
     247              : 
     248              :         ///     returns a Reference Element
     249              :                 static const ReferenceElement& get_elem(ReferenceObjectID roid);
     250              : 
     251              :         ///     vector storing all ReferenceElement
     252              :                 static const ReferenceElement* m_vElem[NUM_REFERENCE_OBJECTS];
     253              : 
     254              :         ///     adds a Reference Element
     255              :                 template <int dim>
     256              :                 static bool add_dim_elem(const DimReferenceElement<dim>& elem);
     257              : 
     258              :         ///     returns a Reference Element
     259              :                 template <int dim>
     260            0 :                 static const DimReferenceElement<dim>& get_dim_elem(ReferenceObjectID roid)
     261              :                 {
     262              :                         UG_ASSERT(roid >= 0, "roid ="<<roid<<" wrong")
     263              :                         UG_ASSERT(roid < NUM_REFERENCE_OBJECTS, "roid ="<<roid<<" wrong")
     264            0 :                         static const DimReferenceElement<dim>** vDimElem = get_vector<dim>();
     265              :                         UG_ASSERT(vDimElem[roid] != NULL, "Null pointer for roid ="<<roid);
     266            0 :                         return *vDimElem[roid];
     267              :                 }
     268              : 
     269              :         ///     returns vector of DimReferenceElement
     270              :                 template <int dim>
     271              :                 static const DimReferenceElement<dim>** get_vector()
     272              :                 {
     273              :                         static const DimReferenceElement<dim>* sVec[NUM_REFERENCE_OBJECTS];
     274              :                         return sVec;
     275              :                 }
     276              : 
     277              :         public:
     278              :         ///     returns a dimension dependent Reference Element
     279              :                 template <int dim>
     280              :                 inline static const DimReferenceElement<dim>& get(ReferenceObjectID roid)
     281              :                 {
     282            0 :                         return instance().get_dim_elem<dim>(roid);
     283              :                 }
     284              : 
     285              :         ///     returns a Reference Element
     286              :                 inline static const ReferenceElement& get(ReferenceObjectID roid)
     287              :                 {
     288            0 :                         return instance().get_elem(roid);
     289              :                 }
     290              : };
     291              : 
     292              : ///////////////////////////////////////////////////////////////////////////////
     293              : ///////////////////////////////////////////////////////////////////////////////
     294              : // Concrete Reference Elements
     295              : ///////////////////////////////////////////////////////////////////////////////
     296              : ///////////////////////////////////////////////////////////////////////////////
     297              : 
     298              : ///////////////////////////////////////////////////////////////////////////////
     299              : // Reference RegularVertex
     300              : ///////////////////////////////////////////////////////////////////////////////
     301              : 
     302              : class ReferenceVertex : public DimReferenceElement<0>
     303              : {
     304              :         public:
     305              :         ///     type of reference element
     306              :                 static const ReferenceObjectID REFERENCE_OBJECT_ID = ROID_VERTEX;
     307              : 
     308              :         ///     dimension of reference element
     309              :                 static const int dim = 0;
     310              : 
     311              :         ///     number of corners
     312              :                 static const int numCorners = 1;
     313              : 
     314              :         ///     number of eges
     315              :                 static const int numEdges = 0;
     316              : 
     317              :         ///     number of faces
     318              :                 static const int numFaces = 0;
     319              : 
     320              :         ///     number of volumes
     321              :                 static const int numVolumes = 0;
     322              : 
     323              :         ///     number of sides
     324              :                 static const int numSides = 0;
     325              : 
     326              :         public:
     327              :         ///     Constructor filling the arrays
     328              :                 ReferenceVertex();
     329              : 
     330              :         /// \copydoc ug::ReferenceElement::reference_object_id()
     331              :                 ReferenceObjectID reference_object_id() const {return REFERENCE_OBJECT_ID;}
     332              : 
     333              :         /// \copydoc ug::ReferenceElement::dimension()
     334              :                 int dimension() const {return dim;}
     335              : 
     336              :         /// \copydoc ug::ReferenceElement::size()
     337              :                 number size() const     {return 1.0;}
     338              : };
     339              : 
     340              : ///////////////////////////////////////////////////////////////////////////////
     341              : // Reference Edge
     342              : ///////////////////////////////////////////////////////////////////////////////
     343              : 
     344              : class ReferenceEdge : public DimReferenceElement<1>
     345              : {
     346              :         public:
     347              :         ///     type of reference element
     348              :                 static const ReferenceObjectID REFERENCE_OBJECT_ID = ROID_EDGE;
     349              : 
     350              :         ///     dimension of reference element
     351              :                 static const int dim = 1;
     352              : 
     353              :         ///     number of corners
     354              :                 static const int numCorners = 2;
     355              : 
     356              :         ///     number of eges
     357              :                 static const int numEdges = 1;
     358              : 
     359              :         ///     number of faces
     360              :                 static const int numFaces = 0;
     361              : 
     362              :         ///     number of volumes
     363              :                 static const int numVolumes = 0;
     364              : 
     365              :         ///     number of sides
     366              :                 static const int numSides = numCorners;
     367              : 
     368              :         public:
     369              :         ///     Constructor
     370              :                 ReferenceEdge();
     371              : 
     372              :         /// \copydoc ug::ReferenceElement::reference_object_id()
     373              :                 ReferenceObjectID reference_object_id() const {return REFERENCE_OBJECT_ID;}
     374              : 
     375              :         /// \copydoc ug::ReferenceElement::dimension()
     376              :                 int dimension() const {return dim;}
     377              : 
     378              :         /// \copydoc ug::ReferenceElement::size()
     379              :                 number size() const     {return 0.5;}
     380              : 
     381              :         ///     \copydoc ug::DimReferenceElement::check_position()
     382              :                 inline static void check_position(const MathVector<dim>& pos)
     383              :                 {
     384              :                         UG_ASSERT(pos[0] >= 0.0 && pos[0] <= 1.0,
     385              :                                   "Local position "<<pos<<" outside Reference Element");
     386              :                 }
     387              : };
     388              : 
     389              : ///////////////////////////////////////////////////////////////////////////////
     390              : // Reference Triangle
     391              : ///////////////////////////////////////////////////////////////////////////////
     392              : 
     393              : class ReferenceTriangle : public DimReferenceElement<2>
     394              : {
     395              :         public:
     396              :         ///     type of reference element
     397              :                 static const ReferenceObjectID REFERENCE_OBJECT_ID = ROID_TRIANGLE;
     398              : 
     399              :         ///     dimension of reference element
     400              :                 static const int dim = 2;
     401              : 
     402              :         ///     number of corners
     403              :                 static const int numCorners = 3;
     404              : 
     405              :         ///     number of eges
     406              :                 static const int numEdges = 3;
     407              : 
     408              :         ///     number of faces
     409              :                 static const int numFaces = 1;
     410              : 
     411              :         ///     number of volumes
     412              :                 static const int numVolumes = 0;
     413              : 
     414              :         ///     number of sides
     415              :                 static const int numSides = numEdges;
     416              : 
     417              :         public:
     418              :         ///     Constructor filling the arrays
     419              :                 ReferenceTriangle();
     420              : 
     421              :         /// \copydoc ug::ReferenceElement::reference_object_id()
     422              :                 ReferenceObjectID reference_object_id() const {return REFERENCE_OBJECT_ID;}
     423              : 
     424              :         /// \copydoc ug::ReferenceElement::dimension()
     425              :                 int dimension() const {return dim;}
     426              : 
     427              :         /// \copydoc ug::ReferenceElement::size()
     428              :                 number size() const     {return 0.5;}
     429              : 
     430              :         ///     \copydoc ug::DimReferenceElement::check_position()
     431              :                 inline static void check_position(const MathVector<dim>& pos)
     432              :                 {
     433              :                         UG_ASSERT(pos[0] >= 0.0 && pos[0] <= 1.0 &&
     434              :                                   pos[1] >= 0.0 && pos[1] <= 1.0 &&
     435              :                                   pos[0]+pos[1] <= 1.0,
     436              :                                           "Local position "<<pos<<" outside Reference Element");
     437            0 :                 }
     438              : };
     439              : 
     440              : ///////////////////////////////////////////////////////////////////////////////
     441              : // Reference Quadrilateral
     442              : ///////////////////////////////////////////////////////////////////////////////
     443              : 
     444              : class ReferenceQuadrilateral : public DimReferenceElement<2>
     445              : {
     446              :         public:
     447              :         ///     type of reference element
     448              :                 static const ReferenceObjectID REFERENCE_OBJECT_ID = ROID_QUADRILATERAL;
     449              : 
     450              :         ///     dimension of reference element
     451              :                 static const int dim = 2;
     452              : 
     453              :         ///     number of corners
     454              :                 static const int numCorners = 4;
     455              : 
     456              :         ///     number of eges
     457              :                 static const int numEdges = 4;
     458              : 
     459              :         ///     number of faces
     460              :                 static const int numFaces = 1;
     461              : 
     462              :         ///     number of volumes
     463              :                 static const int numVolumes = 0;
     464              : 
     465              :         ///     number of sides
     466              :                 static const int numSides = numEdges;
     467              : 
     468              :         public:
     469              :                 ReferenceQuadrilateral();
     470              : 
     471              :         /// \copydoc ug::ReferenceElement::reference_object_id()
     472              :                 ReferenceObjectID reference_object_id() const {return REFERENCE_OBJECT_ID;}
     473              : 
     474              :         /// \copydoc ug::ReferenceElement::dimension()
     475              :                 int dimension() const {return dim;}
     476              : 
     477              :         /// \copydoc ug::ReferenceElement::size()
     478              :                 number size() const     {return 1.0;}
     479              : 
     480              :         ///     \copydoc ug::DimReferenceElement::check_position()
     481              :                 inline static void check_position(const MathVector<dim>& pos)
     482              :                 {
     483              :                         UG_ASSERT(pos[0] >= 0.0 && pos[0] <= 1.0 &&
     484              :                                           pos[1] >= 0.0 && pos[1] <= 1.0,
     485              :                                           "Local position "<<pos<<" outside Reference Element");
     486            0 :                 }
     487              : };
     488              : 
     489              : ///////////////////////////////////////////////////////////////////////////////
     490              : // Reference Tetrahedron
     491              : ///////////////////////////////////////////////////////////////////////////////
     492              : 
     493              : class ReferenceTetrahedron : public DimReferenceElement<3>
     494              : {
     495              :         public:
     496              :         ///     type of reference element
     497              :                 static const ReferenceObjectID REFERENCE_OBJECT_ID = ROID_TETRAHEDRON;
     498              : 
     499              :         ///     dimension of reference element
     500              :                 static const int dim = 3;
     501              : 
     502              :         ///     number of corners
     503              :                 static const int numCorners = 4;
     504              : 
     505              :         ///     number of eges
     506              :                 static const int numEdges = 6;
     507              : 
     508              :         ///     number of faces
     509              :                 static const int numFaces = 4;
     510              : 
     511              :         ///     number of volumes
     512              :                 static const int numVolumes = 1;
     513              : 
     514              :         ///     number of sides
     515              :                 static const int numSides = numFaces;
     516              : 
     517              :         public:
     518              :         ///     Constructor
     519              :                 ReferenceTetrahedron();
     520              : 
     521              :         /// \copydoc ug::ReferenceElement::reference_object_id()
     522              :                 ReferenceObjectID reference_object_id() const {return REFERENCE_OBJECT_ID;}
     523              : 
     524              :         /// \copydoc ug::ReferenceElement::dimension()
     525              :                 int dimension() const {return dim;}
     526              : 
     527              :         /// \copydoc ug::ReferenceElement::size()
     528              :                 number size() const     {return 1.0/6.0;}
     529              : 
     530              :         ///     \copydoc ug::DimReferenceElement::check_position()
     531              :                 inline static void check_position(const MathVector<dim>& pos)
     532              :                 {
     533              :                         UG_ASSERT(pos[0] >= 0.0 && pos[0] <= 1.0 &&
     534              :                                           pos[1] >= 0.0 && pos[1] <= 1.0 &&
     535              :                                           pos[2] >= 0.0 && pos[2] <= 1.0 &&
     536              :                                           pos[0]+pos[1]+pos[2] <= 1.0,
     537              :                                           "Local position "<<pos<<" outside Reference Element");
     538            0 :                 }
     539              : };
     540              : 
     541              : ///////////////////////////////////////////////////////////////////////////////
     542              : // Reference Pyramid
     543              : ///////////////////////////////////////////////////////////////////////////////
     544              : 
     545              : class ReferencePyramid : public DimReferenceElement<3>
     546              : {
     547              :         public:
     548              :         ///     type of reference element
     549              :                 static const ReferenceObjectID REFERENCE_OBJECT_ID = ROID_PYRAMID;
     550              : 
     551              :         ///     dimension of reference element
     552              :                 static const int dim = 3;
     553              : 
     554              :         ///     number of corners
     555              :                 static const int numCorners = 5;
     556              : 
     557              :         ///     number of eges
     558              :                 static const int numEdges = 8;
     559              : 
     560              :         ///     number of faces
     561              :                 static const int numFaces = 5;
     562              : 
     563              :         ///     number of volumes
     564              :                 static const int numVolumes = 1;
     565              : 
     566              :         ///     number of sides
     567              :                 static const int numSides = numFaces;
     568              : 
     569              :         public:
     570              :         ///     Constructor
     571              :                 ReferencePyramid();
     572              : 
     573              :         /// \copydoc ug::ReferenceElement::reference_object_id()
     574              :                 ReferenceObjectID reference_object_id() const {return REFERENCE_OBJECT_ID;}
     575              : 
     576              :         /// \copydoc ug::ReferenceElement::dimension()
     577              :                 int dimension() const {return dim;}
     578              : 
     579              :         /// \copydoc ug::ReferenceElement::size()
     580              :                 number size() const     {return 1.0/3.0;}
     581              : 
     582              :         ///     \copydoc ug::DimReferenceElement::check_position()
     583              :                 inline static void check_position(const MathVector<dim>& pos)
     584              :                 {
     585              :                         //\todo: add check
     586            0 :                 }
     587              : };
     588              : 
     589              : 
     590              : ///////////////////////////////////////////////////////////////////////////////
     591              : // Reference Prism
     592              : ///////////////////////////////////////////////////////////////////////////////
     593              : 
     594              : class ReferencePrism : public DimReferenceElement<3>
     595              : {
     596              :         public:
     597              :         ///     type of reference element
     598              :                 static const ReferenceObjectID REFERENCE_OBJECT_ID = ROID_PRISM;
     599              : 
     600              :         ///     dimension of reference element
     601              :                 static const int dim = 3;
     602              : 
     603              :         ///     number of corners
     604              :                 static const int numCorners = 6;
     605              : 
     606              :         ///     number of eges
     607              :                 static const int numEdges = 9;
     608              : 
     609              :         ///     number of faces
     610              :                 static const int numFaces = 5;
     611              : 
     612              :         ///     number of volumes
     613              :                 static const int numVolumes = 1;
     614              : 
     615              :         ///     number of sides
     616              :                 static const int numSides = numFaces;
     617              : 
     618              :         public:
     619              :         ///     Constructor
     620              :                 ReferencePrism();
     621              : 
     622              :         /// \copydoc ug::ReferenceElement::reference_object_id()
     623              :                 ReferenceObjectID reference_object_id() const {return REFERENCE_OBJECT_ID;}
     624              : 
     625              :         /// \copydoc ug::ReferenceElement::dimension()
     626              :                 int dimension() const {return dim;}
     627              : 
     628              :         /// \copydoc ug::ReferenceElement::size()
     629              :                 number size() const     {return 0.5;}
     630              : 
     631              :         ///     \copydoc ug::DimReferenceElement::check_position()
     632              :                 inline static void check_position(const MathVector<dim>& pos)
     633              :                 {
     634              :                         UG_ASSERT(pos[0] >= 0.0 && pos[0] <= 1.0 &&
     635              :                                           pos[1] >= 0.0 && pos[1] <= 1.0 &&
     636              :                                           pos[0]+pos[1] <= 1.0 &&
     637              :                                           pos[2] >= 0.0 && pos[2] <= 1.0,
     638              :                                           "Local position "<<pos<<" outside Reference Element");
     639            0 :                 }
     640              : };
     641              : 
     642              : ///////////////////////////////////////////////////////////////////////////////
     643              : // Reference Hexahedron
     644              : ///////////////////////////////////////////////////////////////////////////////
     645              : 
     646              : ///     reference element for a hexahedron
     647              : class ReferenceHexahedron : public DimReferenceElement<3>
     648              : {
     649              :         public:
     650              :         ///     type of reference element
     651              :                 static const ReferenceObjectID REFERENCE_OBJECT_ID = ROID_HEXAHEDRON;
     652              : 
     653              :         ///     dimension of reference element
     654              :                 static const int dim = 3;
     655              : 
     656              :         ///     number of corners
     657              :                 static const int numCorners = 8;
     658              : 
     659              :         ///     number of eges
     660              :                 static const int numEdges = 12;
     661              : 
     662              :         ///     number of faces
     663              :                 static const int numFaces = 6;
     664              : 
     665              :         ///     number of volumes
     666              :                 static const int numVolumes = 1;
     667              : 
     668              :         ///     number of sides
     669              :                 static const int numSides = numFaces;
     670              : 
     671              :         public:
     672              :         ///     Constructor filling the arrays
     673              :                 ReferenceHexahedron();
     674              : 
     675              :         /// \copydoc ug::ReferenceElement::reference_object_id()
     676              :                 ReferenceObjectID reference_object_id() const {return REFERENCE_OBJECT_ID;}
     677              : 
     678              :         /// \copydoc ug::ReferenceElement::dimension()
     679              :                 int dimension() const {return dim;}
     680              : 
     681              :         /// \copydoc ug::ReferenceElement::size()
     682              :                 number size() const     {return 1.0;}
     683              : 
     684              :         ///     \copydoc ug::DimReferenceElement::check_position()
     685              :                 inline static void check_position(const MathVector<dim>& pos)
     686              :                 {
     687              :                         UG_ASSERT(pos[0] >= 0.0 && pos[0] <= 1.0 &&
     688              :                                           pos[1] >= 0.0 && pos[1] <= 1.0 &&
     689              :                                           pos[2] >= 0.0 && pos[2] <= 1.0,
     690              :                                           "Local position "<<pos<<" outside Reference Element");
     691            0 :                 }
     692              : };
     693              : 
     694              : ///////////////////////////////////////////////////////////////////////////////
     695              : // Reference Octahedron
     696              : ///////////////////////////////////////////////////////////////////////////////
     697              : 
     698              : class ReferenceOctahedron : public DimReferenceElement<3>
     699              : {
     700              :         public:
     701              :         ///     type of reference element
     702              :                 static const ReferenceObjectID REFERENCE_OBJECT_ID = ROID_OCTAHEDRON;
     703              : 
     704              :         ///     dimension of reference element
     705              :                 static const int dim = 3;
     706              : 
     707              :         ///     number of corners
     708              :                 static const int numCorners = 6;
     709              : 
     710              :         ///     number of edges
     711              :                 static const int numEdges = 12;
     712              : 
     713              :         ///     number of faces
     714              :                 static const int numFaces = 8;
     715              : 
     716              :         ///     number of volumes
     717              :                 static const int numVolumes = 1;
     718              : 
     719              :         ///     number of sides
     720              :                 static const int numSides = numFaces;
     721              : 
     722              :         public:
     723              :         ///     Constructor
     724              :                 ReferenceOctahedron();
     725              : 
     726              :         /// \copydoc ug::ReferenceElement::reference_object_id()
     727              :                 ReferenceObjectID reference_object_id() const {return REFERENCE_OBJECT_ID;}
     728              : 
     729              :         /// \copydoc ug::ReferenceElement::dimension()
     730              :                 int dimension() const {return dim;}
     731              : 
     732              :         /// \copydoc ug::ReferenceElement::size()
     733              :                 number size() const     {return 2.0/3.0;}
     734              : 
     735              :         ///     \copydoc ug::DimReferenceElement::check_position()
     736              :                 inline static void check_position(const MathVector<dim>& pos)
     737              :                 {
     738              :                         //\todo: add check
     739            0 :                 }
     740              : };
     741              : 
     742              : } // end namespace ug
     743              : 
     744              : #include "reference_element_traits.h"
     745              : 
     746              : #endif /* __H__UG__LIB_DISC__REFERENCE_ELEMENT__REFERENCE_ELEMENT__ */
        

Generated by: LCOV version 2.0-1