LCOV - code coverage report
Current view: top level - ugbase/lib_disc/reference_element - reference_element.cpp (source / functions) Coverage Total Hit
Test: coverage.info Lines: 75.7 % 1086 822
Test Date: 2025-09-21 23:31:46 Functions: 40.0 % 20 8

            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              : #include "reference_element.h"
      34              : #include "common/util/provider.h"
      35              : 
      36              : 
      37              : namespace ug{
      38              : 
      39              : ///////////////////////////////////////////////////////////////////////////////
      40              : // Reference Element
      41              : ///////////////////////////////////////////////////////////////////////////////
      42            7 : ReferenceElement::ReferenceElement()
      43              : {
      44           35 :         for(size_t d = 0; d < MAXDIM+1; ++d)
      45              :         {
      46           28 :                 m_vNum[d] = 0;
      47              : 
      48          364 :                 for(size_t obj = 0; obj < MAXOBJECTS; ++obj)
      49              :                 {
      50          336 :                         m_vRefElemType[d][obj] = ROID_UNKNOWN;
      51         1680 :                         for(size_t d2 = 0; d2 < MAXDIM+1; ++d2)
      52         1344 :                                 m_vSubNum[d][obj][d2] = 0;
      53              :                 }
      54              :         }
      55              : 
      56           35 :         for(size_t d = 0; d < MAXDIM+1; ++d)
      57          364 :                 for(size_t obj = 0; obj < MAXOBJECTS; ++obj)
      58         1680 :                         for(size_t d2 = 0; d2 < MAXDIM+1; ++d2)
      59        17472 :                                 for(size_t obj2 = 0; obj2 < MAXOBJECTS; ++obj2)
      60        16128 :                                         m_id[d][obj][d2][obj2] = -1;
      61              : 
      62           70 :         for(size_t roid = 0; roid < NUM_REFERENCE_OBJECTS; ++roid)
      63           63 :                 m_vNumRefElem[roid] = 0;
      64            7 : }
      65              : 
      66            0 : void ReferenceElement::print_info() const
      67              : {
      68              :         using namespace std;
      69              : 
      70            0 :         string GeomObjects[4] ={"Corner", "Edge", "Face", "Volume"};
      71              : 
      72              :         cout << "Reference Element Info: " << endl;
      73              :         cout << "----------------------- " << endl;
      74              : 
      75              :         cout << "Size: " << size() << endl;
      76            0 :         cout << "Dimension where Reference Element lives: " << dimension() << endl;
      77              : 
      78            0 :         for(int i = dimension(); i>=0 ;i--)
      79              :                 cout << "Number of " << GeomObjects[i] << "s: " << num(i) << endl;
      80              : 
      81            0 :         for(int dim_i = dimension(); dim_i>=0 ;dim_i--)
      82              :         {
      83            0 :                 for(size_t i=0; i < num(dim_i); i++)
      84              :                 {
      85              :                         cout << GeomObjects[dim_i] << " with id '" << i << "' contains the following GeomObjects:" << endl;
      86            0 :                         for(int dim_j=dim_i; dim_j>= 0; dim_j--)
      87              :                         {
      88            0 :                                 cout << num(dim_i,i,dim_j) << " " << GeomObjects[dim_j] << "s with id: ";
      89            0 :                                 for(size_t j=0; j< num(dim_i,i,dim_j); j++)
      90              :                                 {
      91            0 :                                         cout << id(dim_i,i,dim_j,j) << " ";
      92              :                                 }
      93              :                                 cout << endl;
      94              :                         }
      95              :                 }
      96              :         }
      97            0 : }
      98              : 
      99              : template <int d>
     100            0 : void DimReferenceElement<d>::print_info() const
     101              : {
     102              :         using namespace std;
     103              : 
     104            0 :         ReferenceElement::print_info();
     105              : 
     106            0 :         cout << "corners:\n";
     107            0 :         for(size_t i = 0; i< num(0); i++)
     108              :         {
     109            0 :                 cout << i << ":" << corner(i) << "\n";
     110              :         }
     111            0 : }
     112              : 
     113              : 
     114              : ///////////////////////////////////////////////////////////////////////////////
     115              : // Reference Element Provider
     116              : ///////////////////////////////////////////////////////////////////////////////
     117              : 
     118              : // register elements at factory
     119              : const ReferenceElement* ReferenceElementProvider::m_vElem[NUM_REFERENCE_OBJECTS];
     120              : 
     121            0 : ReferenceElementProvider::
     122              : ReferenceElementProvider()
     123              : {
     124              :         static bool bInit = false;
     125              : 
     126            0 :         if(!bInit)
     127              :         {
     128            0 :                 bInit = true;
     129              :                 bool bRes = true;
     130            0 :                 bRes &= add_elem(Provider<ReferenceVertex>::get());
     131              :                 // not adding for reference vertex
     132              : 
     133            0 :                 bRes &= add_elem(Provider<ReferenceEdge>::get());
     134            0 :                 bRes &= add_dim_elem<1>(Provider<ReferenceEdge>::get());
     135              : 
     136            0 :                 bRes &= add_elem(Provider<ReferenceTriangle>::get());
     137            0 :                 bRes &= add_dim_elem<2>(Provider<ReferenceTriangle>::get());
     138              : 
     139            0 :                 bRes &= add_elem(Provider<ReferenceQuadrilateral>::get());
     140            0 :                 bRes &= add_dim_elem<2>(Provider<ReferenceQuadrilateral>::get());
     141              : 
     142            0 :                 bRes &= add_elem(Provider<ReferenceTetrahedron>::get());
     143            0 :                 bRes &= add_dim_elem<3>(Provider<ReferenceTetrahedron>::get());
     144              : 
     145            0 :                 bRes &= add_elem(Provider<ReferencePrism>::get());
     146            0 :                 bRes &= add_dim_elem<3>(Provider<ReferencePrism>::get());
     147              : 
     148            0 :                 bRes &= add_elem(Provider<ReferencePyramid>::get());
     149            0 :                 bRes &= add_dim_elem<3>(Provider<ReferencePyramid>::get());
     150              : 
     151            0 :                 bRes &= add_elem(Provider<ReferenceOctahedron>::get());
     152            0 :                 bRes &= add_dim_elem<3>(Provider<ReferenceOctahedron>::get());
     153              : 
     154            0 :                 bRes &= add_elem(Provider<ReferenceHexahedron>::get());
     155            0 :                 bRes &= add_dim_elem<3>(Provider<ReferenceHexahedron>::get());
     156              : 
     157            0 :                 if(!bRes) UG_THROW("Error while registering Reference Elements");
     158              :         }
     159            0 : }
     160              : 
     161            0 : bool ReferenceElementProvider::add_elem(const ReferenceElement& elem)
     162              : {
     163              :         const ReferenceObjectID roid = elem.roid();
     164              :         UG_ASSERT(roid >= 0, "roid ="<<roid<<" wrong")
     165              :         UG_ASSERT(roid < NUM_REFERENCE_OBJECTS, "roid ="<<roid<<" wrong")
     166            0 :         m_vElem[roid] = &elem;
     167            0 :         return true;
     168              : }
     169              : 
     170            0 : const ReferenceElement& ReferenceElementProvider::get_elem(ReferenceObjectID roid)
     171              : {
     172              :         UG_ASSERT(roid >= 0, "roid ="<<roid<<" wrong")
     173              :         UG_ASSERT(roid < NUM_REFERENCE_OBJECTS, "roid ="<<roid<<" wrong")
     174              :         UG_ASSERT(m_vElem[roid] != NULL, "Null pointer for roid ="<<roid);
     175            0 :         return *m_vElem[roid];
     176              : }
     177              : 
     178              : template <int dim>
     179            0 : bool ReferenceElementProvider::add_dim_elem(const DimReferenceElement<dim>& elem)
     180              : {
     181              :         const ReferenceObjectID roid = elem.roid();
     182              :         UG_ASSERT(roid >= 0, "roid ="<<roid<<" wrong")
     183              :         UG_ASSERT(roid < NUM_REFERENCE_OBJECTS, "roid ="<<roid<<" wrong")
     184            0 :         static const DimReferenceElement<dim>** vDimElem = get_vector<dim>();
     185            0 :         vDimElem[roid] = &elem;
     186            0 :         return true;
     187              : }
     188              : 
     189              : 
     190              : ///////////////////////////////////////////////////////////////////////////////
     191              : // Explicit instantiations
     192              : ///////////////////////////////////////////////////////////////////////////////
     193              : template class DimReferenceElement<1>;
     194              : template class DimReferenceElement<2>;
     195              : template class DimReferenceElement<3>;
     196              : 
     197              : 
     198              : 
     199              : ///////////////////////////////////////////////////////////////////////////////
     200              : //      ReferenceVertex
     201              : ///////////////////////////////////////////////////////////////////////////////
     202            0 : ReferenceVertex::ReferenceVertex()
     203              : {
     204              :         // dimension
     205            0 :         m_dim = 0;
     206              : 
     207              :         // size
     208            0 :         m_size = 1.0;
     209              : 
     210              :         //number of Geometric Objects
     211            0 :         m_vNum[POINT] = 1;
     212              : 
     213              :         // number of Geometric Objects
     214            0 :         m_vSubNum[POINT][0][POINT] = 1;
     215              : 
     216            0 :         m_vRefElemType[POINT][0] = ROID_VERTEX;
     217              : 
     218              :         //reset m_id to -1
     219            0 :         for(int i=0; i<=dim; ++i)
     220            0 :                 for(size_t j=0; j<MAXOBJECTS; ++j)
     221            0 :                         for(int k=0; k<=dim; ++k)
     222            0 :                                 for(size_t l=0; l<MAXOBJECTS; l++)
     223              :                                 {
     224            0 :                                         m_id[i][j][k][l] = -1;
     225              :                                 }
     226              : 
     227              :         //self references: (i.e. Point <-> Point, Edge <-> Edge, etc.)
     228            0 :         for(int i=0; i<=dim; ++i)
     229            0 :                 for(size_t j=0; j<m_vNum[i]; ++j)
     230              :                 {
     231            0 :                         m_id[i][j][i][0] = j;
     232              :                 }
     233              : 
     234              :         // Reference Element Types
     235            0 :         for(int i = 0; i < NUM_REFERENCE_OBJECTS; ++i)
     236              :         {
     237            0 :                 m_vNumRefElem[i] = 0;
     238              :         }
     239            0 :         m_vNumRefElem[ROID_VERTEX] = 1;
     240            0 : }
     241              : 
     242              : ///////////////////////////////////////////////////////////////////////////////
     243              : //      ReferenceEdge
     244              : ///////////////////////////////////////////////////////////////////////////////
     245              : 
     246            1 : ReferenceEdge::ReferenceEdge()
     247              : {
     248              :         // dimension
     249            1 :         m_dim = 1;
     250              : 
     251              :         // size
     252            1 :         m_size = 1.0;
     253              : 
     254              :         //number of Geometric Objects
     255            1 :         m_vNum[POINT] = 2;
     256            1 :         m_vNum[EDGE] = 1;
     257              : 
     258              :         // number of Geometric Objects
     259            1 :         m_vSubNum[EDGE][0][POINT] = 2;
     260            1 :         m_vSubNum[EDGE][0][EDGE] = 1;
     261              : 
     262            1 :         m_vRefElemType[EDGE][0] = ROID_EDGE;
     263              : 
     264            3 :         for(size_t i = 0; i < m_vNum[POINT]; ++i)
     265              :         {
     266            2 :                 m_vSubNum[POINT][i][POINT] = 1;
     267            2 :                 m_vSubNum[POINT][i][EDGE] = 1;
     268              : 
     269            2 :                 m_vRefElemType[POINT][i] = ROID_VERTEX;
     270              :         }
     271              : 
     272              :         //reset m_id to -1
     273            3 :         for(int i=0; i<=dim; ++i)
     274           26 :                 for(size_t j=0; j<MAXOBJECTS; ++j)
     275           72 :                         for(int k=0; k<=dim; ++k)
     276          624 :                                 for(size_t l=0; l<MAXOBJECTS; l++)
     277              :                                 {
     278          576 :                                         m_id[i][j][k][l] = -1;
     279              :                                 }
     280              : 
     281              :         //self references: (i.e. Point <-> Point, Edge <-> Edge, etc.)
     282            3 :         for(int i=0; i<=dim; ++i)
     283            5 :                 for(size_t j=0; j<m_vNum[i]; ++j)
     284              :                 {
     285            3 :                         m_id[i][j][i][0] = j;
     286              :                 }
     287              : 
     288              :         // Points <-> Face
     289            3 :         for(size_t i=0; i<m_vNum[POINT]; ++i)
     290              :         {
     291            2 :                 m_id[EDGE][0][POINT][i] = i;
     292            2 :                 m_id[POINT][i][EDGE][0] = 0;
     293              :         }
     294              : 
     295              :         // Reference Corners
     296            1 :         m_vCorner[0][0] = 0.0;
     297            1 :         m_vCorner[1][0] = 1.0;
     298              : 
     299            1 :         m_vCoInt[0][0] = 0;
     300            1 :         m_vCoInt[1][0] = 1;
     301              : 
     302              :         // Reference Element Types
     303           10 :         for(int i = 0; i < NUM_REFERENCE_OBJECTS; ++i)
     304              :         {
     305            9 :                 m_vNumRefElem[i] = 0;
     306              :         }
     307            1 :         m_vNumRefElem[ROID_VERTEX] = 2;
     308            1 :         m_vNumRefElem[ROID_EDGE] = 1;
     309            1 : }
     310              : 
     311              : ///////////////////////////////////////////////////////////////////////////////
     312              : //      ReferenceTriangle
     313              : ///////////////////////////////////////////////////////////////////////////////
     314              : 
     315            1 : ReferenceTriangle::ReferenceTriangle()
     316              : {
     317              :         // dimension
     318            1 :         m_dim = 2;
     319              : 
     320              :         // size
     321            1 :         m_size = 0.5;
     322              : 
     323              :         //number of Geometric Objects
     324            1 :         m_vNum[POINT] = 3;
     325            1 :         m_vNum[EDGE] = 3;
     326            1 :         m_vNum[FACE] = 1;
     327              : 
     328              :         // number of Geometric Objects
     329            1 :         m_vSubNum[FACE][0][POINT] = 3;
     330            1 :         m_vSubNum[FACE][0][EDGE] = 3;
     331            1 :         m_vSubNum[FACE][0][FACE] = 1;
     332              : 
     333            1 :         m_vRefElemType[FACE][0] = ROID_TRIANGLE;
     334              : 
     335            4 :         for(size_t i = 0; i < m_vNum[EDGE]; ++i)
     336              :         {
     337            3 :                 m_vSubNum[EDGE][i][POINT] = 2;
     338            3 :                 m_vSubNum[EDGE][i][EDGE] = 1;
     339            3 :                 m_vSubNum[EDGE][i][FACE] = 1;
     340              : 
     341            3 :                 m_vRefElemType[EDGE][i] = ROID_EDGE;
     342              :         }
     343              : 
     344            4 :         for(size_t i = 0; i < m_vNum[POINT]; ++i)
     345              :         {
     346            3 :                 m_vSubNum[POINT][i][POINT] = 1;
     347            3 :                 m_vSubNum[POINT][i][EDGE] = 2;
     348            3 :                 m_vSubNum[POINT][i][FACE] = 1;
     349              : 
     350            3 :                 m_vRefElemType[POINT][i] = ROID_VERTEX;
     351              :         }
     352              : 
     353              :         //reset m_id to -1
     354            4 :         for(int i=0; i<=dim; ++i)
     355           39 :                 for(size_t j=0; j<MAXOBJECTS; ++j)
     356          144 :                         for(int k=0; k<=dim; ++k)
     357         1404 :                                 for(size_t l=0; l<MAXOBJECTS; l++)
     358              :                                 {
     359         1296 :                                         m_id[i][j][k][l] = -1;
     360              :                                 }
     361              : 
     362              :         //self references: (i.e. Point <-> Point, Edge <-> Edge, etc.)
     363            4 :         for(int i=0; i<=dim; ++i)
     364           10 :                 for(size_t j=0; j<m_vNum[i]; ++j)
     365              :                 {
     366            7 :                         m_id[i][j][i][0] = j;
     367              :                 }
     368              : 
     369              :         //Edges <-> Face
     370            4 :         for(size_t i=0; i<m_vNum[EDGE]; ++i)
     371              :         {
     372            3 :                 m_id[FACE][0][EDGE][i] = i;
     373            3 :                 m_id[EDGE][i][FACE][0] = 0;
     374              :         }
     375              : 
     376              :         // Points <-> Face
     377            4 :         for(size_t i=0; i<m_vNum[POINT]; ++i)
     378              :         {
     379            3 :                 m_id[FACE][0][POINT][i] = i;
     380            3 :                 m_id[POINT][i][FACE][0] = 0;
     381              :         }
     382              : 
     383              :         // Points of Edges
     384              :         // edge 0 = (0,1)
     385            1 :         m_id[EDGE][0][POINT][0] = 0;
     386            1 :         m_id[EDGE][0][POINT][1] = 1;
     387              :         // edge 1 = (1,2)
     388            1 :         m_id[EDGE][1][POINT][0] = 1;
     389            1 :         m_id[EDGE][1][POINT][1] = 2;
     390              :         // edge 2 = (2,0)
     391            1 :         m_id[EDGE][2][POINT][0] = 2;
     392            1 :         m_id[EDGE][2][POINT][1] = 0;
     393              : 
     394              :         // Edges of Point
     395            1 :         m_id[POINT][0][EDGE][0] = 2;
     396            1 :         m_id[POINT][0][EDGE][1] = 0;
     397              : 
     398            1 :         m_id[POINT][1][EDGE][0] = 0;
     399            1 :         m_id[POINT][1][EDGE][1] = 1;
     400              : 
     401            1 :         m_id[POINT][2][EDGE][0] = 1;
     402            1 :         m_id[POINT][2][EDGE][1] = 2;
     403              : 
     404              : 
     405              :         // Reference Corners
     406              :         m_vCorner[0] = MathVector<dim>(0.0, 0.0);
     407              :         m_vCorner[1] = MathVector<dim>(1.0, 0.0);
     408              :         m_vCorner[2] = MathVector<dim>(0.0, 1.0);
     409              : 
     410              :         m_vCoInt[0] = MathVector<dim,int>(0, 0);
     411              :         m_vCoInt[1] = MathVector<dim,int>(1, 0);
     412              :         m_vCoInt[2] = MathVector<dim,int>(0, 1);
     413              : 
     414              :         // Reference Element Types
     415           10 :         for(int i = 0; i < NUM_REFERENCE_OBJECTS; ++i)
     416              :         {
     417            9 :                 m_vNumRefElem[i] = 0;
     418              :         }
     419            1 :         m_vNumRefElem[ROID_VERTEX] = 3;
     420            1 :         m_vNumRefElem[ROID_EDGE] = 3;
     421            1 :         m_vNumRefElem[ROID_TRIANGLE] = 1;
     422            1 : }
     423              : 
     424              : ///////////////////////////////////////////////////////////////////////////////
     425              : //      ReferenceQuadrilateral
     426              : ///////////////////////////////////////////////////////////////////////////////
     427              : 
     428            1 : ReferenceQuadrilateral::ReferenceQuadrilateral()
     429              : {
     430              :         // dimension
     431            1 :         m_dim = 2;
     432              : 
     433              :         // size
     434            1 :         m_size = 1.0;
     435              : 
     436              :         //number of Geometric Objects
     437            1 :         m_vNum[POINT] = 4;
     438            1 :         m_vNum[EDGE] = 4;
     439            1 :         m_vNum[FACE] = 1;
     440              : 
     441              :         // number of Geometric Objects
     442            1 :         m_vSubNum[FACE][0][POINT] = 4;
     443            1 :         m_vSubNum[FACE][0][EDGE] = 4;
     444            1 :         m_vSubNum[FACE][0][FACE] = 1;
     445            1 :         m_vRefElemType[FACE][0] = ROID_QUADRILATERAL;
     446              : 
     447            5 :         for(size_t i = 0; i < m_vNum[EDGE]; ++i)
     448              :         {
     449            4 :                 m_vSubNum[EDGE][i][EDGE] = 1;
     450            4 :                 m_vSubNum[EDGE][i][POINT] = 2;
     451            4 :                 m_vSubNum[EDGE][i][FACE] = 1;
     452              : 
     453            4 :                 m_vRefElemType[EDGE][i] = ROID_EDGE;
     454              :         }
     455              : 
     456            5 :         for(size_t i = 0; i < m_vNum[EDGE]; ++i)
     457              :         {
     458            4 :                 m_vSubNum[POINT][i][POINT] = 1;
     459            4 :                 m_vSubNum[POINT][i][EDGE] = 2;
     460            4 :                 m_vSubNum[POINT][i][FACE] = 1;
     461              : 
     462            4 :                 m_vRefElemType[POINT][i] = ROID_VERTEX;
     463              :         }
     464              : 
     465              :         //reset m_id to -1
     466            4 :         for(int i=0; i<=dim; ++i)
     467           39 :                 for(size_t j=0; j<MAXOBJECTS; ++j)
     468          144 :                         for(int k=0; k<=dim; ++k)
     469         1404 :                                 for(size_t l=0; l<MAXOBJECTS; l++)
     470              :                                 {
     471         1296 :                                         m_id[i][j][k][l] = -1;
     472              :                                 }
     473              : 
     474              :         //self references: (i.e. Point <-> Point, Edge <-> Edge, etc.)
     475            4 :         for(int d=0; d<=dim; ++d)
     476           12 :                 for(size_t j=0; j<m_vNum[d]; ++j)
     477              :                 {
     478            9 :                         m_id[d][j][d][0] = j;
     479              :                 }
     480              : 
     481              :         //Edges <-> Face
     482            5 :         for(size_t i=0; i<m_vNum[EDGE]; ++i)
     483              :         {
     484            4 :                 m_id[FACE][0][EDGE][i] = i;
     485            4 :                 m_id[EDGE][i][FACE][0] = 0;
     486              :         }
     487              : 
     488              :         // Points <-> Face
     489            5 :         for(size_t i=0; i<m_vNum[POINT]; ++i)
     490              :         {
     491            4 :                 m_id[FACE][0][POINT][i] = i;
     492            4 :                 m_id[POINT][i][FACE][0] = 0;
     493              :         }
     494              : 
     495              :         // Points of Edges
     496              :         // edge 0 = (0,1)
     497            1 :         m_id[EDGE][0][POINT][0] = 0;
     498            1 :         m_id[EDGE][0][POINT][1] = 1;
     499              :         // edge 1 = (1,2)
     500            1 :         m_id[EDGE][1][POINT][0] = 1;
     501            1 :         m_id[EDGE][1][POINT][1] = 2;
     502              :         // edge 2 = (2,3)
     503            1 :         m_id[EDGE][2][POINT][0] = 2;
     504            1 :         m_id[EDGE][2][POINT][1] = 3;
     505              :         // edge 3 = (3,0)
     506            1 :         m_id[EDGE][3][POINT][0] = 3;
     507            1 :         m_id[EDGE][3][POINT][1] = 0;
     508              : 
     509              :         // Edges of Point
     510            1 :         m_id[POINT][0][EDGE][0] = 3;
     511            1 :         m_id[POINT][0][EDGE][1] = 0;
     512              : 
     513            1 :         m_id[POINT][1][EDGE][0] = 0;
     514            1 :         m_id[POINT][1][EDGE][1] = 1;
     515              : 
     516            1 :         m_id[POINT][2][EDGE][0] = 1;
     517            1 :         m_id[POINT][2][EDGE][1] = 2;
     518              : 
     519            1 :         m_id[POINT][3][EDGE][0] = 2;
     520            1 :         m_id[POINT][3][EDGE][1] = 3;
     521              : 
     522              :         // Reference Corners
     523              :         m_vCorner[0] = MathVector<dim>(0.0, 0.0);
     524              :         m_vCorner[1] = MathVector<dim>(1.0, 0.0);
     525              :         m_vCorner[2] = MathVector<dim>(1.0, 1.0);
     526              :         m_vCorner[3] = MathVector<dim>(0.0, 1.0);
     527              : 
     528              :         m_vCoInt[0] = MathVector<dim,int>(0, 0);
     529              :         m_vCoInt[1] = MathVector<dim,int>(1, 0);
     530              :         m_vCoInt[2] = MathVector<dim,int>(1, 1);
     531              :         m_vCoInt[3] = MathVector<dim,int>(0, 1);
     532              : 
     533              :         // Reference Element Types
     534           10 :         for(int i = 0; i < NUM_REFERENCE_OBJECTS; ++i)
     535              :         {
     536            9 :                 m_vNumRefElem[i] = 0;
     537              :         }
     538            1 :         m_vNumRefElem[ROID_VERTEX] = 4;
     539            1 :         m_vNumRefElem[ROID_EDGE] = 4;
     540            1 :         m_vNumRefElem[ROID_QUADRILATERAL] = 1;
     541            1 : }
     542              : 
     543              : ///////////////////////////////////////////////////////////////////////////////
     544              : //      ReferenceTetrahedron
     545              : ///////////////////////////////////////////////////////////////////////////////
     546              : 
     547            1 : ReferenceTetrahedron::ReferenceTetrahedron()
     548              : {
     549              :         // dimension
     550            1 :         m_dim = 3;
     551              : 
     552              :         // size
     553            1 :         m_size = 1.0/6.0;
     554              : 
     555              :         //number of Geometric Objects
     556            1 :         m_vNum[POINT] = 4;
     557            1 :         m_vNum[EDGE] = 6;
     558            1 :         m_vNum[FACE] = 4;
     559            1 :         m_vNum[VOLUME] = 1;
     560              : 
     561              :         // number of Geometric Objects
     562            1 :         m_vSubNum[VOLUME][0][POINT] = 4;
     563            1 :         m_vSubNum[VOLUME][0][EDGE] = 6;
     564            1 :         m_vSubNum[VOLUME][0][FACE] = 4;
     565            1 :         m_vSubNum[VOLUME][0][VOLUME] = 1;
     566            1 :         m_vRefElemType[VOLUME][0] = ROID_TETRAHEDRON;
     567              : 
     568            5 :         for(size_t i = 0; i < m_vNum[FACE]; ++i)
     569              :         {
     570            4 :                 m_vSubNum[FACE][i][POINT] = 3;
     571            4 :                 m_vSubNum[FACE][i][EDGE] = 3;
     572            4 :                 m_vSubNum[FACE][i][FACE] = 1;
     573            4 :                 m_vSubNum[FACE][i][VOLUME] = 1;
     574              : 
     575            4 :                 m_vRefElemType[FACE][i] = ROID_TRIANGLE;
     576              :         }
     577              : 
     578            7 :         for(size_t i = 0; i < m_vNum[EDGE]; ++i)
     579              :         {
     580            6 :                 m_vSubNum[EDGE][i][POINT] = 2;
     581            6 :                 m_vSubNum[EDGE][i][EDGE] = 1;
     582            6 :                 m_vSubNum[EDGE][i][FACE] = 2;
     583            6 :                 m_vSubNum[EDGE][i][VOLUME] = 1;
     584              : 
     585            6 :                 m_vRefElemType[EDGE][i] = ROID_EDGE;
     586              :         }
     587              : 
     588            5 :         for(size_t i = 0; i < m_vNum[POINT]; ++i)
     589              :         {
     590            4 :                 m_vSubNum[POINT][i][POINT] = 1;
     591            4 :                 m_vSubNum[POINT][i][EDGE] = 3;
     592            4 :                 m_vSubNum[POINT][i][FACE] = 3;
     593            4 :                 m_vSubNum[POINT][i][VOLUME] = 1;
     594              : 
     595            4 :                 m_vRefElemType[POINT][i] = ROID_VERTEX;
     596              :         }
     597              : 
     598              :         //reset m_id to -1
     599            5 :         for(int i=0; i<=dim; ++i)
     600           52 :                 for(size_t j=0; j<MAXOBJECTS; ++j)
     601          240 :                         for(int k=0; k<=dim; ++k)
     602         2496 :                                 for(size_t l=0; l<MAXOBJECTS; l++)
     603              :                                 {
     604         2304 :                                         m_id[i][j][k][l] = -1;
     605              :                                 }
     606              : 
     607              :         //self references: (i.e. Point <-> Point, Edge <-> Edge, etc.)
     608            5 :         for(int i=0; i<=dim; ++i)
     609           19 :                 for(size_t j=0; j<m_vNum[i]; ++j)
     610              :                 {
     611           15 :                         m_id[i][j][i][0] = j;
     612              :                 }
     613              : 
     614              :         // Face <-> Volume
     615            5 :         for(size_t i=0; i<m_vNum[FACE]; ++i)
     616              :         {
     617            4 :                 m_id[VOLUME][0][FACE][i] = i;
     618            4 :                 m_id[FACE][i][VOLUME][0] = 0;
     619              :         }
     620              : 
     621              :         // Edge <-> Volume
     622            7 :         for(size_t i=0; i<m_vNum[EDGE]; ++i)
     623              :         {
     624            6 :                 m_id[VOLUME][0][EDGE][i] = i;
     625            6 :                 m_id[EDGE][i][VOLUME][0] = 0;
     626              :         }
     627              : 
     628              :         // Point <-> Volume
     629            5 :         for(size_t i=0; i<m_vNum[POINT]; ++i)
     630              :         {
     631            4 :                 m_id[VOLUME][0][POINT][i] = i;
     632            4 :                 m_id[POINT][i][VOLUME][0] = 0;
     633              :         }
     634              : 
     635              :         // Points <-> Faces
     636            1 :         m_id[FACE][0][POINT][0] = 0;
     637            1 :         m_id[FACE][0][POINT][1] = 2;
     638            1 :         m_id[FACE][0][POINT][2] = 1;
     639              : 
     640            1 :         m_id[FACE][1][POINT][0] = 1;
     641            1 :         m_id[FACE][1][POINT][1] = 2;
     642            1 :         m_id[FACE][1][POINT][2] = 3;
     643              : 
     644            1 :         m_id[FACE][2][POINT][0] = 0;
     645            1 :         m_id[FACE][2][POINT][1] = 3;
     646            1 :         m_id[FACE][2][POINT][2] = 2;
     647              : 
     648            1 :         m_id[FACE][3][POINT][0] = 0;
     649            1 :         m_id[FACE][3][POINT][1] = 1;
     650            1 :         m_id[FACE][3][POINT][2] = 3;
     651              : 
     652              : 
     653            1 :         m_id[POINT][0][FACE][0] = 0;
     654            1 :         m_id[POINT][0][FACE][1] = 2;
     655            1 :         m_id[POINT][0][FACE][2] = 3;
     656              : 
     657            1 :         m_id[POINT][1][FACE][0] = 0;
     658            1 :         m_id[POINT][1][FACE][1] = 3;
     659            1 :         m_id[POINT][1][FACE][2] = 1;
     660              : 
     661            1 :         m_id[POINT][2][FACE][0] = 0;
     662            1 :         m_id[POINT][2][FACE][1] = 1;
     663            1 :         m_id[POINT][2][FACE][2] = 2;
     664              : 
     665            1 :         m_id[POINT][3][FACE][0] = 3;
     666            1 :         m_id[POINT][3][FACE][1] = 2;
     667            1 :         m_id[POINT][3][FACE][2] = 1;
     668              : 
     669              :         // Edges <-> Faces
     670            1 :         m_id[FACE][0][EDGE][0] = 2;
     671            1 :         m_id[FACE][0][EDGE][1] = 1;
     672            1 :         m_id[FACE][0][EDGE][2] = 0;
     673              : 
     674            1 :         m_id[FACE][1][EDGE][0] = 1;
     675            1 :         m_id[FACE][1][EDGE][1] = 5;
     676            1 :         m_id[FACE][1][EDGE][2] = 4;
     677              : 
     678            1 :         m_id[FACE][2][EDGE][0] = 3;
     679            1 :         m_id[FACE][2][EDGE][1] = 5;
     680            1 :         m_id[FACE][2][EDGE][2] = 2;
     681              : 
     682            1 :         m_id[FACE][3][EDGE][0] = 0;
     683            1 :         m_id[FACE][3][EDGE][1] = 4;
     684            1 :         m_id[FACE][3][EDGE][2] = 3;
     685              : 
     686            1 :         m_id[EDGE][0][FACE][0] = 0;
     687            1 :         m_id[EDGE][0][FACE][1] = 3;
     688              : 
     689            1 :         m_id[EDGE][1][FACE][0] = 0;
     690            1 :         m_id[EDGE][1][FACE][1] = 1;
     691              : 
     692            1 :         m_id[EDGE][2][FACE][0] = 0;
     693            1 :         m_id[EDGE][2][FACE][1] = 2;
     694              : 
     695            1 :         m_id[EDGE][3][FACE][0] = 3;
     696            1 :         m_id[EDGE][3][FACE][1] = 2;
     697              : 
     698            1 :         m_id[EDGE][4][FACE][0] = 1;
     699            1 :         m_id[EDGE][4][FACE][1] = 3;
     700              : 
     701            1 :         m_id[EDGE][5][FACE][0] = 2;
     702            1 :         m_id[EDGE][5][FACE][1] = 1;
     703              : 
     704              : 
     705              :         // Points of Edges
     706              :         // edge 0 = (0,1)
     707            1 :         m_id[EDGE][0][POINT][0] = 0;
     708            1 :         m_id[EDGE][0][POINT][1] = 1;
     709              :         // edge 1 = (1,2)
     710            1 :         m_id[EDGE][1][POINT][0] = 1;
     711            1 :         m_id[EDGE][1][POINT][1] = 2;
     712              :         // edge 2 = (2,0)
     713            1 :         m_id[EDGE][2][POINT][0] = 2;
     714            1 :         m_id[EDGE][2][POINT][1] = 0;
     715              :         // edge 3 = (0,3)
     716            1 :         m_id[EDGE][3][POINT][0] = 0;
     717            1 :         m_id[EDGE][3][POINT][1] = 3;
     718              :         // edge 4 = (1,3)
     719            1 :         m_id[EDGE][4][POINT][0] = 1;
     720            1 :         m_id[EDGE][4][POINT][1] = 3;
     721              :         // edge 5 = (2,3)
     722            1 :         m_id[EDGE][5][POINT][0] = 2;
     723            1 :         m_id[EDGE][5][POINT][1] = 3;
     724              : 
     725              :         // Edges of Point
     726            1 :         m_id[POINT][0][EDGE][0] = 2;
     727            1 :         m_id[POINT][0][EDGE][1] = 0;
     728            1 :         m_id[POINT][0][EDGE][2] = 3;
     729              : 
     730            1 :         m_id[POINT][1][EDGE][0] = 0;
     731            1 :         m_id[POINT][1][EDGE][1] = 1;
     732            1 :         m_id[POINT][1][EDGE][2] = 4;
     733              : 
     734            1 :         m_id[POINT][2][EDGE][0] = 1;
     735            1 :         m_id[POINT][2][EDGE][1] = 2;
     736            1 :         m_id[POINT][2][EDGE][2] = 5;
     737              : 
     738            1 :         m_id[POINT][3][EDGE][0] = 3;
     739            1 :         m_id[POINT][3][EDGE][1] = 4;
     740            1 :         m_id[POINT][3][EDGE][2] = 5;
     741              : 
     742              :         // Reference Corners
     743              :         m_vCorner[0] = MathVector<dim>(0.0, 0.0, 0.0);
     744              :         m_vCorner[1] = MathVector<dim>(1.0, 0.0, 0.0);
     745              :         m_vCorner[2] = MathVector<dim>(0.0, 1.0, 0.0);
     746              :         m_vCorner[3] = MathVector<dim>(0.0, 0.0, 1.0);
     747              : 
     748              :         m_vCoInt[0] = MathVector<dim,int>(0, 0, 0);
     749              :         m_vCoInt[1] = MathVector<dim,int>(1, 0, 0);
     750              :         m_vCoInt[2] = MathVector<dim,int>(0, 1, 0);
     751              :         m_vCoInt[3] = MathVector<dim,int>(0, 0, 1);
     752              : 
     753              :         // Reference Element Types
     754           10 :         for(int i = 0; i < NUM_REFERENCE_OBJECTS; ++i)
     755              :         {
     756            9 :                 m_vNumRefElem[i] = 0;
     757              :         }
     758            1 :         m_vNumRefElem[ROID_VERTEX] = 4;
     759            1 :         m_vNumRefElem[ROID_EDGE] = 6;
     760            1 :         m_vNumRefElem[ROID_TRIANGLE] = 4;
     761            1 :         m_vNumRefElem[ROID_TETRAHEDRON] = 1;
     762            1 : }
     763              : 
     764              : ///////////////////////////////////////////////////////////////////////////////
     765              : //      ReferencePyramid
     766              : ///////////////////////////////////////////////////////////////////////////////
     767              : 
     768            1 : ReferencePyramid::ReferencePyramid()
     769              : {
     770              :         // dimension
     771            1 :         m_dim = 3;
     772              : 
     773              :         // size
     774            1 :         m_size = 1.0/3.0;
     775              : 
     776              :         //number of Geometric Objects
     777            1 :         m_vNum[POINT] = 5;
     778            1 :         m_vNum[EDGE] = 8;
     779            1 :         m_vNum[FACE] = 5;
     780            1 :         m_vNum[VOLUME] = 1;
     781              : 
     782              :         // number of Geometric Objects
     783            1 :         m_vSubNum[VOLUME][0][POINT] = 5;
     784            1 :         m_vSubNum[VOLUME][0][EDGE] = 8;
     785            1 :         m_vSubNum[VOLUME][0][FACE] = 5;
     786            1 :         m_vSubNum[VOLUME][0][VOLUME] = 1;
     787            1 :         m_vRefElemType[VOLUME][0] = ROID_PYRAMID;
     788              : 
     789            1 :         m_vSubNum[FACE][0][POINT] = 4;
     790            1 :         m_vSubNum[FACE][0][EDGE] = 4;
     791            1 :         m_vSubNum[FACE][0][FACE] = 1;
     792            1 :         m_vSubNum[FACE][0][VOLUME] = 1;
     793            1 :         m_vRefElemType[FACE][0] = ROID_QUADRILATERAL;
     794              : 
     795            5 :         for(size_t i = 1; i < m_vNum[FACE]; ++i)
     796              :         {
     797            4 :                 m_vSubNum[FACE][i][POINT] = 3;
     798            4 :                 m_vSubNum[FACE][i][EDGE] = 3;
     799            4 :                 m_vSubNum[FACE][i][FACE] = 1;
     800            4 :                 m_vSubNum[FACE][i][VOLUME] = 1;
     801              : 
     802            4 :                 m_vRefElemType[FACE][i] = ROID_TRIANGLE;
     803              :         }
     804              : 
     805            9 :         for(size_t i = 0; i < m_vNum[EDGE]; ++i)
     806              :         {
     807            8 :                 m_vSubNum[EDGE][i][POINT] = 2;
     808            8 :                 m_vSubNum[EDGE][i][EDGE] = 1;
     809            8 :                 m_vSubNum[EDGE][i][FACE] = 2;
     810            8 :                 m_vSubNum[EDGE][i][VOLUME] = 1;
     811              : 
     812            8 :                 m_vRefElemType[EDGE][i] = ROID_EDGE;
     813              :         }
     814              : 
     815            5 :         for(size_t i = 0; i < m_vNum[POINT] - 1; ++i)
     816              :         {
     817            4 :                 m_vSubNum[POINT][i][POINT] = 1;
     818            4 :                 m_vSubNum[POINT][i][EDGE] = 3;
     819            4 :                 m_vSubNum[POINT][i][FACE] = 3;
     820            4 :                 m_vSubNum[POINT][i][VOLUME] = 1;
     821              : 
     822            4 :                 m_vRefElemType[POINT][i] = ROID_VERTEX;
     823              :         }
     824            1 :         m_vSubNum[POINT][4][POINT] = 1;
     825            1 :         m_vSubNum[POINT][4][EDGE] = 4;
     826            1 :         m_vSubNum[POINT][4][FACE] = 4;
     827            1 :         m_vSubNum[POINT][4][VOLUME] = 1;
     828              : 
     829            1 :         m_vRefElemType[POINT][4] = ROID_VERTEX;
     830              : 
     831              :         //reset m_id to -1
     832            5 :         for(int i=0; i<=dim; ++i)
     833           52 :                 for(size_t j=0; j<MAXOBJECTS; ++j)
     834          240 :                         for(int k=0; k<=dim; ++k)
     835         2496 :                                 for(size_t l=0; l<MAXOBJECTS; l++)
     836              :                                 {
     837         2304 :                                         m_id[i][j][k][l] = -1;
     838              :                                 }
     839              : 
     840              :         //self references: (i.e. Point <-> Point, Edge <-> Edge, etc.)
     841            5 :         for(int i=0; i<=dim; ++i)
     842           23 :                 for(size_t j=0; j<m_vNum[i]; ++j)
     843              :                 {
     844           19 :                         m_id[i][j][i][0] = j;
     845              :                 }
     846              : 
     847              :         // Face <-> Volume
     848            6 :         for(size_t i=0; i<m_vNum[FACE]; ++i)
     849              :         {
     850            5 :                 m_id[VOLUME][0][FACE][i] = i;
     851            5 :                 m_id[FACE][i][VOLUME][0] = 0;
     852              :         }
     853              : 
     854              :         // Edge <-> Volume
     855            9 :         for(size_t i=0; i<m_vNum[EDGE]; ++i)
     856              :         {
     857            8 :                 m_id[VOLUME][0][EDGE][i] = i;
     858            8 :                 m_id[EDGE][i][VOLUME][0] = 0;
     859              :         }
     860              : 
     861              :         // Point <-> Volume
     862            6 :         for(size_t i=0; i<m_vNum[POINT]; ++i)
     863              :         {
     864            5 :                 m_id[VOLUME][0][POINT][i] = i;
     865            5 :                 m_id[POINT][i][VOLUME][0] = 0;
     866              :         }
     867              : 
     868              :         // Points <-> Faces
     869            1 :         m_id[FACE][0][POINT][0] = 0;
     870            1 :         m_id[FACE][0][POINT][1] = 3;
     871            1 :         m_id[FACE][0][POINT][2] = 2;
     872            1 :         m_id[FACE][0][POINT][3] = 1;
     873              : 
     874            1 :         m_id[FACE][1][POINT][0] = 0;
     875            1 :         m_id[FACE][1][POINT][1] = 1;
     876            1 :         m_id[FACE][1][POINT][2] = 4;
     877              : 
     878            1 :         m_id[FACE][2][POINT][0] = 1;
     879            1 :         m_id[FACE][2][POINT][1] = 2;
     880            1 :         m_id[FACE][2][POINT][2] = 4;
     881              : 
     882            1 :         m_id[FACE][3][POINT][0] = 2;
     883            1 :         m_id[FACE][3][POINT][1] = 3;
     884            1 :         m_id[FACE][3][POINT][2] = 4;
     885              : 
     886            1 :         m_id[FACE][4][POINT][0] = 3;
     887            1 :         m_id[FACE][4][POINT][1] = 0;
     888            1 :         m_id[FACE][4][POINT][2] = 4;
     889              : 
     890            1 :         m_id[POINT][0][FACE][0] = 0;
     891            1 :         m_id[POINT][0][FACE][1] = 4;//1;
     892            1 :         m_id[POINT][0][FACE][2] = 1;//4;
     893              : 
     894            1 :         m_id[POINT][1][FACE][0] = 0;
     895            1 :         m_id[POINT][1][FACE][1] = 1;
     896            1 :         m_id[POINT][1][FACE][2] = 2;
     897              : 
     898            1 :         m_id[POINT][2][FACE][0] = 0;
     899            1 :         m_id[POINT][2][FACE][1] = 2;
     900            1 :         m_id[POINT][2][FACE][2] = 3;
     901              : 
     902            1 :         m_id[POINT][3][FACE][0] = 0;
     903            1 :         m_id[POINT][3][FACE][1] = 3;
     904            1 :         m_id[POINT][3][FACE][2] = 4;
     905              : 
     906            1 :         m_id[POINT][4][FACE][0] = 1;
     907            1 :         m_id[POINT][4][FACE][1] = 2;
     908            1 :         m_id[POINT][4][FACE][2] = 3;
     909            1 :         m_id[POINT][4][FACE][3] = 4;
     910              : 
     911              :         // Edges <-> Faces
     912            1 :         m_id[FACE][0][EDGE][0] = 3;
     913            1 :         m_id[FACE][0][EDGE][1] = 2;
     914            1 :         m_id[FACE][0][EDGE][2] = 1;
     915            1 :         m_id[FACE][0][EDGE][3] = 0;
     916              : 
     917            1 :         m_id[FACE][1][EDGE][0] = 0;
     918            1 :         m_id[FACE][1][EDGE][1] = 5;
     919            1 :         m_id[FACE][1][EDGE][2] = 4;
     920              : 
     921            1 :         m_id[FACE][2][EDGE][0] = 1;
     922            1 :         m_id[FACE][2][EDGE][1] = 6;
     923            1 :         m_id[FACE][2][EDGE][2] = 5;
     924              : 
     925            1 :         m_id[FACE][3][EDGE][0] = 2;
     926            1 :         m_id[FACE][3][EDGE][1] = 7;
     927            1 :         m_id[FACE][3][EDGE][2] = 6;
     928              : 
     929            1 :         m_id[FACE][4][EDGE][0] = 3;
     930            1 :         m_id[FACE][4][EDGE][1] = 4;
     931            1 :         m_id[FACE][4][EDGE][2] = 7;
     932              : 
     933            1 :         m_id[EDGE][0][FACE][0] = 0;
     934            1 :         m_id[EDGE][0][FACE][1] = 1;
     935              : 
     936            1 :         m_id[EDGE][1][FACE][0] = 0;
     937            1 :         m_id[EDGE][1][FACE][1] = 2;
     938              : 
     939            1 :         m_id[EDGE][2][FACE][0] = 0;
     940            1 :         m_id[EDGE][2][FACE][1] = 3;
     941              : 
     942            1 :         m_id[EDGE][3][FACE][0] = 0;
     943            1 :         m_id[EDGE][3][FACE][1] = 4;
     944              : 
     945            1 :         m_id[EDGE][4][FACE][0] = 1;
     946            1 :         m_id[EDGE][4][FACE][1] = 4;
     947              : 
     948            1 :         m_id[EDGE][5][FACE][0] = 2;
     949            1 :         m_id[EDGE][5][FACE][1] = 1;
     950              : 
     951            1 :         m_id[EDGE][6][FACE][0] = 3;
     952            1 :         m_id[EDGE][6][FACE][1] = 2;
     953              : 
     954            1 :         m_id[EDGE][7][FACE][0] = 4;
     955            1 :         m_id[EDGE][7][FACE][1] = 3;
     956              : 
     957              :         // Points of Edges
     958              :         // edge 0 = (0,1)
     959            1 :         m_id[EDGE][0][POINT][0] = 0;
     960            1 :         m_id[EDGE][0][POINT][1] = 1;
     961              :         // edge 1 = (1,2)
     962            1 :         m_id[EDGE][1][POINT][0] = 1;
     963            1 :         m_id[EDGE][1][POINT][1] = 2;
     964              :         // edge 2 = (2,3)
     965            1 :         m_id[EDGE][2][POINT][0] = 2;
     966            1 :         m_id[EDGE][2][POINT][1] = 3;
     967              :         // edge 3 = (3,0)
     968            1 :         m_id[EDGE][3][POINT][0] = 3;
     969            1 :         m_id[EDGE][3][POINT][1] = 0;
     970              :         // edge 4 = (0,4)
     971            1 :         m_id[EDGE][4][POINT][0] = 0;
     972            1 :         m_id[EDGE][4][POINT][1] = 4;
     973              :         // edge 5 = (1,4)
     974            1 :         m_id[EDGE][5][POINT][0] = 1;
     975            1 :         m_id[EDGE][5][POINT][1] = 4;
     976              :         // edge 6 = (2,4)
     977            1 :         m_id[EDGE][6][POINT][0] = 2;
     978            1 :         m_id[EDGE][6][POINT][1] = 4;
     979              :         // edge 7 = (3,4)
     980            1 :         m_id[EDGE][7][POINT][0] = 3;
     981            1 :         m_id[EDGE][7][POINT][1] = 4;
     982              : 
     983              :         // Edges of Point
     984            1 :         m_id[POINT][0][EDGE][0] = 3;
     985            1 :         m_id[POINT][0][EDGE][1] = 0;
     986            1 :         m_id[POINT][0][EDGE][2] = 4;
     987              : 
     988            1 :         m_id[POINT][1][EDGE][0] = 0;
     989            1 :         m_id[POINT][1][EDGE][1] = 1;//5;
     990            1 :         m_id[POINT][1][EDGE][2] = 5;//1;
     991              : 
     992            1 :         m_id[POINT][2][EDGE][0] = 1;
     993            1 :         m_id[POINT][2][EDGE][1] = 2;//6;
     994            1 :         m_id[POINT][2][EDGE][2] = 6;//2;
     995              : 
     996            1 :         m_id[POINT][3][EDGE][0] = 2;
     997            1 :         m_id[POINT][3][EDGE][1] = 3;//7;
     998            1 :         m_id[POINT][3][EDGE][2] = 7;//3;
     999              : 
    1000            1 :         m_id[POINT][4][EDGE][0] = 4;
    1001            1 :         m_id[POINT][4][EDGE][1] = 5;
    1002            1 :         m_id[POINT][4][EDGE][2] = 6;
    1003            1 :         m_id[POINT][4][EDGE][3] = 7;
    1004              : 
    1005              :         // Reference Corners
    1006              :         m_vCorner[0] = MathVector<dim>(0.0, 0.0, 0.0);
    1007              :         m_vCorner[1] = MathVector<dim>(1.0, 0.0, 0.0);
    1008              :         m_vCorner[2] = MathVector<dim>(1.0, 1.0, 0.0);
    1009              :         m_vCorner[3] = MathVector<dim>(0.0, 1.0, 0.0);
    1010              :         m_vCorner[4] = MathVector<dim>(0.0, 0.0, 1.0);
    1011              : 
    1012              :         m_vCoInt[0] = MathVector<dim,int>(0, 0, 0);
    1013              :         m_vCoInt[1] = MathVector<dim,int>(1, 0, 0);
    1014              :         m_vCoInt[2] = MathVector<dim,int>(1, 1, 0);
    1015              :         m_vCoInt[3] = MathVector<dim,int>(0, 1, 0);
    1016              :         m_vCoInt[4] = MathVector<dim,int>(0, 0, 1);
    1017              : 
    1018              :         // Reference Element Types
    1019           10 :         for(int i = 0; i < NUM_REFERENCE_OBJECTS; ++i)
    1020              :         {
    1021            9 :                 m_vNumRefElem[i] = 0;
    1022              :         }
    1023            1 :         m_vNumRefElem[ROID_VERTEX] = 5;
    1024            1 :         m_vNumRefElem[ROID_EDGE] = 8;
    1025            1 :         m_vNumRefElem[ROID_QUADRILATERAL] = 1;
    1026            1 :         m_vNumRefElem[ROID_TRIANGLE] = 4;
    1027            1 :         m_vNumRefElem[ROID_PYRAMID] = 1;
    1028            1 : }
    1029              : 
    1030              : ///////////////////////////////////////////////////////////////////////////////
    1031              : //      ReferencePrism
    1032              : ///////////////////////////////////////////////////////////////////////////////
    1033              : 
    1034            1 : ReferencePrism::ReferencePrism()
    1035              : {
    1036              :         // dimension
    1037            1 :         m_dim = 3;
    1038              : 
    1039              :         // size
    1040            1 :         m_size = 0.5;
    1041              : 
    1042              :         //number of Geometric Objects
    1043            1 :         m_vNum[POINT] = 6;
    1044            1 :         m_vNum[EDGE] = 9;
    1045            1 :         m_vNum[FACE] = 5;
    1046            1 :         m_vNum[VOLUME] = 1;
    1047              : 
    1048              :         // number of Geometric Objects
    1049            1 :         m_vSubNum[VOLUME][0][POINT] = 6;
    1050            1 :         m_vSubNum[VOLUME][0][EDGE] = 9;
    1051            1 :         m_vSubNum[VOLUME][0][FACE] = 5;
    1052            1 :         m_vSubNum[VOLUME][0][VOLUME] = 1;
    1053            1 :         m_vRefElemType[VOLUME][0] = ROID_PRISM;
    1054              : 
    1055            1 :         m_vSubNum[FACE][0][POINT] = 3;
    1056            1 :         m_vSubNum[FACE][0][EDGE] = 3;
    1057            1 :         m_vSubNum[FACE][0][FACE] = 1;
    1058            1 :         m_vSubNum[FACE][0][VOLUME] = 1;
    1059            1 :         m_vRefElemType[FACE][0] = ROID_TRIANGLE;
    1060              : 
    1061            1 :         m_vSubNum[FACE][1][POINT] = 4;
    1062            1 :         m_vSubNum[FACE][1][EDGE] = 4;
    1063            1 :         m_vSubNum[FACE][1][FACE] = 1;
    1064            1 :         m_vSubNum[FACE][1][VOLUME] = 1;
    1065            1 :         m_vRefElemType[FACE][1] = ROID_QUADRILATERAL;
    1066              : 
    1067            1 :         m_vSubNum[FACE][2][POINT] = 4;
    1068            1 :         m_vSubNum[FACE][2][EDGE] = 4;
    1069            1 :         m_vSubNum[FACE][2][FACE] = 1;
    1070            1 :         m_vSubNum[FACE][2][VOLUME] = 1;
    1071            1 :         m_vRefElemType[FACE][2] = ROID_QUADRILATERAL;
    1072              : 
    1073            1 :         m_vSubNum[FACE][3][POINT] = 4;
    1074            1 :         m_vSubNum[FACE][3][EDGE] = 4;
    1075            1 :         m_vSubNum[FACE][3][FACE] = 1;
    1076            1 :         m_vSubNum[FACE][3][VOLUME] = 1;
    1077            1 :         m_vRefElemType[FACE][3] = ROID_QUADRILATERAL;
    1078              : 
    1079            1 :         m_vSubNum[FACE][4][POINT] = 3;
    1080            1 :         m_vSubNum[FACE][4][EDGE] = 3;
    1081            1 :         m_vSubNum[FACE][4][FACE] = 1;
    1082            1 :         m_vSubNum[FACE][4][VOLUME] = 1;
    1083            1 :         m_vRefElemType[FACE][4] = ROID_TRIANGLE;
    1084              : 
    1085           10 :         for(size_t i = 0; i < m_vNum[EDGE]; ++i)
    1086              :         {
    1087            9 :                 m_vSubNum[EDGE][i][POINT] = 2;
    1088            9 :                 m_vSubNum[EDGE][i][EDGE] = 1;
    1089            9 :                 m_vSubNum[EDGE][i][FACE] = 2;
    1090            9 :                 m_vSubNum[EDGE][i][VOLUME] = 1;
    1091              : 
    1092            9 :                 m_vRefElemType[EDGE][i] = ROID_EDGE;
    1093              :         }
    1094              : 
    1095            7 :         for(size_t i = 0; i < m_vNum[POINT]; ++i)
    1096              :         {
    1097            6 :                 m_vSubNum[POINT][i][POINT] = 1;
    1098            6 :                 m_vSubNum[POINT][i][EDGE] = 3;
    1099            6 :                 m_vSubNum[POINT][i][FACE] = 3;
    1100            6 :                 m_vSubNum[POINT][i][VOLUME] = 1;
    1101              : 
    1102            6 :                 m_vRefElemType[POINT][i] = ROID_VERTEX;
    1103              :         }
    1104              : 
    1105              :         //reset m_id to -1
    1106            5 :         for(int i=0; i<=dim; ++i)
    1107           52 :                 for(size_t j=0; j<MAXOBJECTS; ++j)
    1108          240 :                         for(int k=0; k<=dim; ++k)
    1109         2496 :                                 for(size_t l=0; l<MAXOBJECTS; l++)
    1110              :                                 {
    1111         2304 :                                         m_id[i][j][k][l] = -1;
    1112              :                                 }
    1113              : 
    1114              :         //self references: (i.e. Point <-> Point, Edge <-> Edge, etc.)
    1115            5 :         for(int i=0; i<=dim; ++i)
    1116           25 :                 for(size_t j=0; j<m_vNum[i]; ++j)
    1117              :                 {
    1118           21 :                         m_id[i][j][i][0] = j;
    1119              :                 }
    1120              : 
    1121              :         // Face <-> Volume
    1122            6 :         for(size_t i=0; i<m_vNum[FACE]; ++i)
    1123              :         {
    1124            5 :                 m_id[VOLUME][0][FACE][i] = i;
    1125            5 :                 m_id[FACE][i][VOLUME][0] = 0;
    1126              :         }
    1127              : 
    1128              :         // Edge <-> Volume
    1129           10 :         for(size_t i=0; i<m_vNum[EDGE]; ++i)
    1130              :         {
    1131            9 :                 m_id[VOLUME][0][EDGE][i] = i;
    1132            9 :                 m_id[EDGE][i][VOLUME][0] = 0;
    1133              :         }
    1134              : 
    1135              :         // Point <-> Volume
    1136            7 :         for(size_t i=0; i<m_vNum[POINT]; ++i)
    1137              :         {
    1138            6 :                 m_id[VOLUME][0][POINT][i] = i;
    1139            6 :                 m_id[POINT][i][VOLUME][0] = 0;
    1140              :         }
    1141              : 
    1142              :         // Points <-> Faces
    1143            1 :         m_id[FACE][0][POINT][0] = 0;
    1144            1 :         m_id[FACE][0][POINT][1] = 2;
    1145            1 :         m_id[FACE][0][POINT][2] = 1;
    1146              : 
    1147            1 :         m_id[FACE][1][POINT][0] = 0;
    1148            1 :         m_id[FACE][1][POINT][1] = 1;
    1149            1 :         m_id[FACE][1][POINT][2] = 4;
    1150            1 :         m_id[FACE][1][POINT][3] = 3;
    1151              : 
    1152            1 :         m_id[FACE][2][POINT][0] = 1;
    1153            1 :         m_id[FACE][2][POINT][1] = 2;
    1154            1 :         m_id[FACE][2][POINT][2] = 5;
    1155            1 :         m_id[FACE][2][POINT][3] = 4;
    1156              : 
    1157            1 :         m_id[FACE][3][POINT][0] = 2;
    1158            1 :         m_id[FACE][3][POINT][1] = 0;
    1159            1 :         m_id[FACE][3][POINT][2] = 3;
    1160            1 :         m_id[FACE][3][POINT][3] = 5;
    1161              : 
    1162            1 :         m_id[FACE][4][POINT][0] = 3;
    1163            1 :         m_id[FACE][4][POINT][1] = 4;
    1164            1 :         m_id[FACE][4][POINT][2] = 5;
    1165              : 
    1166              : 
    1167            1 :         m_id[POINT][0][FACE][0] = 0;
    1168            1 :         m_id[POINT][0][FACE][1] = 3;
    1169            1 :         m_id[POINT][0][FACE][2] = 1;
    1170              : 
    1171            1 :         m_id[POINT][1][FACE][0] = 0;
    1172            1 :         m_id[POINT][1][FACE][1] = 1;
    1173            1 :         m_id[POINT][1][FACE][2] = 2;
    1174              : 
    1175            1 :         m_id[POINT][2][FACE][0] = 0;
    1176            1 :         m_id[POINT][2][FACE][1] = 2;
    1177            1 :         m_id[POINT][2][FACE][2] = 3;
    1178              : 
    1179            1 :         m_id[POINT][3][FACE][0] = 1;
    1180            1 :         m_id[POINT][3][FACE][1] = 3;
    1181            1 :         m_id[POINT][3][FACE][2] = 4;
    1182              : 
    1183            1 :         m_id[POINT][4][FACE][0] = 2;
    1184            1 :         m_id[POINT][4][FACE][1] = 1;
    1185            1 :         m_id[POINT][4][FACE][2] = 4;
    1186              : 
    1187            1 :         m_id[POINT][5][FACE][0] = 3;
    1188            1 :         m_id[POINT][5][FACE][1] = 2;
    1189            1 :         m_id[POINT][5][FACE][2] = 4;
    1190              : 
    1191              :         // Edges <-> Faces
    1192            1 :         m_id[FACE][0][EDGE][0] = 2;
    1193            1 :         m_id[FACE][0][EDGE][1] = 1;
    1194            1 :         m_id[FACE][0][EDGE][2] = 0;
    1195              : 
    1196            1 :         m_id[FACE][1][EDGE][0] = 0;
    1197            1 :         m_id[FACE][1][EDGE][1] = 4;
    1198            1 :         m_id[FACE][1][EDGE][2] = 6;
    1199            1 :         m_id[FACE][1][EDGE][3] = 3;
    1200              : 
    1201            1 :         m_id[FACE][2][EDGE][0] = 1;
    1202            1 :         m_id[FACE][2][EDGE][1] = 5;
    1203            1 :         m_id[FACE][2][EDGE][2] = 7;
    1204            1 :         m_id[FACE][2][EDGE][3] = 4;
    1205              : 
    1206            1 :         m_id[FACE][3][EDGE][0] = 2;
    1207            1 :         m_id[FACE][3][EDGE][1] = 3;
    1208            1 :         m_id[FACE][3][EDGE][2] = 8;
    1209            1 :         m_id[FACE][3][EDGE][3] = 5;
    1210              : 
    1211            1 :         m_id[FACE][4][EDGE][0] = 6;
    1212            1 :         m_id[FACE][4][EDGE][1] = 7;
    1213            1 :         m_id[FACE][4][EDGE][2] = 8;
    1214              : 
    1215            1 :         m_id[EDGE][0][FACE][0] = 0;
    1216            1 :         m_id[EDGE][0][FACE][1] = 1;
    1217              : 
    1218            1 :         m_id[EDGE][1][FACE][0] = 0;
    1219            1 :         m_id[EDGE][1][FACE][1] = 2;
    1220              : 
    1221            1 :         m_id[EDGE][2][FACE][0] = 0;
    1222            1 :         m_id[EDGE][2][FACE][1] = 3;
    1223              : 
    1224            1 :         m_id[EDGE][3][FACE][0] = 1;
    1225            1 :         m_id[EDGE][3][FACE][1] = 3;
    1226              : 
    1227            1 :         m_id[EDGE][4][FACE][0] = 2;
    1228            1 :         m_id[EDGE][4][FACE][1] = 1;
    1229              : 
    1230            1 :         m_id[EDGE][5][FACE][0] = 3;
    1231            1 :         m_id[EDGE][5][FACE][1] = 2;
    1232              : 
    1233            1 :         m_id[EDGE][6][FACE][0] = 1;
    1234            1 :         m_id[EDGE][6][FACE][1] = 4;
    1235              : 
    1236            1 :         m_id[EDGE][7][FACE][0] = 2;
    1237            1 :         m_id[EDGE][7][FACE][1] = 4;
    1238              : 
    1239            1 :         m_id[EDGE][8][FACE][0] = 3;
    1240            1 :         m_id[EDGE][8][FACE][1] = 4;
    1241              : 
    1242              :         // Points of Edges
    1243              :         // edge 0 = (0,1)
    1244            1 :         m_id[EDGE][0][POINT][0] = 0;
    1245            1 :         m_id[EDGE][0][POINT][1] = 1;
    1246              :         // edge 1 = (1,2)
    1247            1 :         m_id[EDGE][1][POINT][0] = 1;
    1248            1 :         m_id[EDGE][1][POINT][1] = 2;
    1249              :         // edge 2 = (2,0)
    1250            1 :         m_id[EDGE][2][POINT][0] = 2;
    1251            1 :         m_id[EDGE][2][POINT][1] = 0;
    1252              :         // edge 3 = (0,3)
    1253            1 :         m_id[EDGE][3][POINT][0] = 0;
    1254            1 :         m_id[EDGE][3][POINT][1] = 3;
    1255              :         // edge 4 = (1,3)
    1256            1 :         m_id[EDGE][4][POINT][0] = 1;
    1257            1 :         m_id[EDGE][4][POINT][1] = 4;
    1258              :         // edge 5 = (2,3)
    1259            1 :         m_id[EDGE][5][POINT][0] = 2;
    1260            1 :         m_id[EDGE][5][POINT][1] = 5;
    1261              :         // edge 6 = (3,4)
    1262            1 :         m_id[EDGE][6][POINT][0] = 3;
    1263            1 :         m_id[EDGE][6][POINT][1] = 4;
    1264              :         // edge 7 = (4,5)
    1265            1 :         m_id[EDGE][7][POINT][0] = 4;
    1266            1 :         m_id[EDGE][7][POINT][1] = 5;
    1267              :         // edge 8 = (5,3)
    1268            1 :         m_id[EDGE][8][POINT][0] = 5;
    1269            1 :         m_id[EDGE][8][POINT][1] = 3;
    1270              : 
    1271              :         // Edges of Point
    1272            1 :         m_id[POINT][0][EDGE][0] = 2;
    1273            1 :         m_id[POINT][0][EDGE][1] = 0;
    1274            1 :         m_id[POINT][0][EDGE][2] = 3;
    1275              : 
    1276            1 :         m_id[POINT][1][EDGE][0] = 0;
    1277            1 :         m_id[POINT][1][EDGE][1] = 1;
    1278            1 :         m_id[POINT][1][EDGE][2] = 4;
    1279              : 
    1280            1 :         m_id[POINT][2][EDGE][0] = 1;
    1281            1 :         m_id[POINT][2][EDGE][1] = 2;
    1282            1 :         m_id[POINT][2][EDGE][2] = 5;
    1283              : 
    1284            1 :         m_id[POINT][3][EDGE][0] = 3;
    1285            1 :         m_id[POINT][3][EDGE][1] = 6;
    1286            1 :         m_id[POINT][3][EDGE][2] = 8;
    1287              : 
    1288            1 :         m_id[POINT][4][EDGE][0] = 4;
    1289            1 :         m_id[POINT][4][EDGE][1] = 7;
    1290            1 :         m_id[POINT][4][EDGE][2] = 6;
    1291              : 
    1292            1 :         m_id[POINT][5][EDGE][0] = 5;
    1293            1 :         m_id[POINT][5][EDGE][1] = 8;
    1294            1 :         m_id[POINT][5][EDGE][2] = 7;
    1295              : 
    1296              :         // Reference Corners
    1297              :         m_vCorner[0] = MathVector<dim>(0.0, 0.0, 0.0);
    1298              :         m_vCorner[1] = MathVector<dim>(1.0, 0.0, 0.0);
    1299              :         m_vCorner[2] = MathVector<dim>(0.0, 1.0, 0.0);
    1300              :         m_vCorner[3] = MathVector<dim>(0.0, 0.0, 1.0);
    1301              :         m_vCorner[4] = MathVector<dim>(1.0, 0.0, 1.0);
    1302              :         m_vCorner[5] = MathVector<dim>(0.0, 1.0, 1.0);
    1303              : 
    1304              :         m_vCoInt[0] = MathVector<dim,int>(0, 0, 0);
    1305              :         m_vCoInt[1] = MathVector<dim,int>(1, 0, 0);
    1306              :         m_vCoInt[2] = MathVector<dim,int>(0, 1, 0);
    1307              :         m_vCoInt[3] = MathVector<dim,int>(0, 0, 1);
    1308              :         m_vCoInt[4] = MathVector<dim,int>(1, 0, 1);
    1309              :         m_vCoInt[5] = MathVector<dim,int>(0, 1, 1);
    1310              : 
    1311              :         // Reference Element Types
    1312           10 :         for(int i = 0; i < NUM_REFERENCE_OBJECTS; ++i)
    1313              :         {
    1314            9 :                 m_vNumRefElem[i] = 0;
    1315              :         }
    1316            1 :         m_vNumRefElem[ROID_VERTEX] = 6;
    1317            1 :         m_vNumRefElem[ROID_EDGE] = 9;
    1318            1 :         m_vNumRefElem[ROID_TRIANGLE] = 2;
    1319            1 :         m_vNumRefElem[ROID_QUADRILATERAL] = 3;
    1320            1 :         m_vNumRefElem[ROID_PRISM] = 1;
    1321            1 : }
    1322              : 
    1323              : ///////////////////////////////////////////////////////////////////////////////
    1324              : //      ReferenceHexahedron
    1325              : ///////////////////////////////////////////////////////////////////////////////
    1326              : 
    1327            1 : ReferenceHexahedron::ReferenceHexahedron()
    1328              : {
    1329              :         // dimension
    1330            1 :         m_dim = 3;
    1331              : 
    1332              :         // size
    1333            1 :         m_size = 1.0;
    1334              : 
    1335              :         //number of Geometric Objects
    1336            1 :         m_vNum[POINT] = 8;
    1337            1 :         m_vNum[EDGE] = 12;
    1338            1 :         m_vNum[FACE] = 6;
    1339            1 :         m_vNum[VOLUME] = 1;
    1340              : 
    1341              :         // number of Geometric Objects
    1342            1 :         m_vSubNum[VOLUME][0][POINT] = 8;
    1343            1 :         m_vSubNum[VOLUME][0][EDGE] = 12;
    1344            1 :         m_vSubNum[VOLUME][0][FACE] = 6;
    1345            1 :         m_vSubNum[VOLUME][0][VOLUME] = 1;
    1346            1 :         m_vRefElemType[VOLUME][0] = ROID_HEXAHEDRON;
    1347              : 
    1348            7 :         for(size_t i = 0; i < m_vNum[FACE]; ++i)
    1349              :         {
    1350            6 :                 m_vSubNum[FACE][i][POINT] = 4;
    1351            6 :                 m_vSubNum[FACE][i][EDGE] = 4;
    1352            6 :                 m_vSubNum[FACE][i][FACE] = 1;
    1353            6 :                 m_vSubNum[FACE][i][VOLUME] = 1;
    1354              : 
    1355            6 :                 m_vRefElemType[FACE][i] = ROID_QUADRILATERAL;
    1356              :         }
    1357              : 
    1358           13 :         for(size_t i = 0; i < m_vNum[EDGE]; ++i)
    1359              :         {
    1360           12 :                 m_vSubNum[EDGE][i][POINT] = 2;
    1361           12 :                 m_vSubNum[EDGE][i][EDGE] = 1;
    1362           12 :                 m_vSubNum[EDGE][i][FACE] = 2;
    1363           12 :                 m_vSubNum[EDGE][i][VOLUME] = 1;
    1364              : 
    1365           12 :                 m_vRefElemType[EDGE][i] = ROID_EDGE;
    1366              :         }
    1367              : 
    1368            9 :         for(size_t i = 0; i < m_vNum[POINT]; ++i)
    1369              :         {
    1370            8 :                 m_vSubNum[POINT][i][POINT] = 1;
    1371            8 :                 m_vSubNum[POINT][i][EDGE] = 3;
    1372            8 :                 m_vSubNum[POINT][i][FACE] = 3;
    1373            8 :                 m_vSubNum[POINT][i][VOLUME] = 1;
    1374              : 
    1375            8 :                 m_vRefElemType[POINT][i] = ROID_VERTEX;
    1376              :         }
    1377              : 
    1378              :         //reset m_id to -1
    1379            5 :         for(int i=0; i<=dim; ++i)
    1380           52 :                 for(size_t j=0; j<MAXOBJECTS; ++j)
    1381          240 :                         for(int k=0; k<=dim; ++k)
    1382         2496 :                                 for(size_t l=0; l<MAXOBJECTS; l++)
    1383              :                                 {
    1384         2304 :                                         m_id[i][j][k][l] = -1;
    1385              :                                 }
    1386              : 
    1387              :         //self references: (i.e. Point <-> Point, Edge <-> Edge, etc.)
    1388            5 :         for(int i=0; i<=dim; ++i)
    1389           31 :                 for(size_t j=0; j<m_vNum[i]; ++j)
    1390              :                 {
    1391           27 :                         m_id[i][j][i][0] = j;
    1392              :                 }
    1393              : 
    1394              :         // Face <-> Volume
    1395            7 :         for(size_t i=0; i<m_vNum[FACE]; ++i)
    1396              :         {
    1397            6 :                 m_id[VOLUME][0][FACE][i] = i;
    1398            6 :                 m_id[FACE][i][VOLUME][0] = 0;
    1399              :         }
    1400              : 
    1401              :         // Edge <-> Volume
    1402           13 :         for(size_t i=0; i<m_vNum[EDGE]; ++i)
    1403              :         {
    1404           12 :                 m_id[VOLUME][0][EDGE][i] = i;
    1405           12 :                 m_id[EDGE][i][VOLUME][0] = 0;
    1406              :         }
    1407              : 
    1408              :         // Point <-> Volume
    1409            9 :         for(size_t i=0; i<m_vNum[POINT]; ++i)
    1410              :         {
    1411            8 :                 m_id[VOLUME][0][POINT][i] = i;
    1412            8 :                 m_id[POINT][i][VOLUME][0] = 0;
    1413              :         }
    1414              : 
    1415              :         // Points <-> Faces
    1416            1 :         m_id[FACE][0][POINT][0] = 0;
    1417            1 :         m_id[FACE][0][POINT][1] = 3;
    1418            1 :         m_id[FACE][0][POINT][2] = 2;
    1419            1 :         m_id[FACE][0][POINT][3] = 1;
    1420              : 
    1421            1 :         m_id[FACE][1][POINT][0] = 0;
    1422            1 :         m_id[FACE][1][POINT][1] = 1;
    1423            1 :         m_id[FACE][1][POINT][2] = 5;
    1424            1 :         m_id[FACE][1][POINT][3] = 4;
    1425              : 
    1426            1 :         m_id[FACE][2][POINT][0] = 1;
    1427            1 :         m_id[FACE][2][POINT][1] = 2;
    1428            1 :         m_id[FACE][2][POINT][2] = 6;
    1429            1 :         m_id[FACE][2][POINT][3] = 5;
    1430              : 
    1431            1 :         m_id[FACE][3][POINT][0] = 2;
    1432            1 :         m_id[FACE][3][POINT][1] = 3;
    1433            1 :         m_id[FACE][3][POINT][2] = 7;
    1434            1 :         m_id[FACE][3][POINT][3] = 6;
    1435              : 
    1436            1 :         m_id[FACE][4][POINT][0] = 3;
    1437            1 :         m_id[FACE][4][POINT][1] = 0;
    1438            1 :         m_id[FACE][4][POINT][2] = 4;
    1439            1 :         m_id[FACE][4][POINT][3] = 7;
    1440              : 
    1441            1 :         m_id[FACE][5][POINT][0] = 4;
    1442            1 :         m_id[FACE][5][POINT][1] = 5;
    1443            1 :         m_id[FACE][5][POINT][2] = 6;
    1444            1 :         m_id[FACE][5][POINT][3] = 7;
    1445              : 
    1446            1 :         m_id[POINT][0][FACE][0] = 0;
    1447            1 :         m_id[POINT][0][FACE][1] = 4;
    1448            1 :         m_id[POINT][0][FACE][2] = 1;
    1449              : 
    1450            1 :         m_id[POINT][1][FACE][0] = 0;
    1451            1 :         m_id[POINT][1][FACE][1] = 1;
    1452            1 :         m_id[POINT][1][FACE][2] = 2;
    1453              : 
    1454            1 :         m_id[POINT][2][FACE][0] = 0;
    1455            1 :         m_id[POINT][2][FACE][1] = 2;
    1456            1 :         m_id[POINT][2][FACE][2] = 3;
    1457              : 
    1458            1 :         m_id[POINT][3][FACE][0] = 0;
    1459            1 :         m_id[POINT][3][FACE][1] = 3;
    1460            1 :         m_id[POINT][3][FACE][2] = 4;
    1461              : 
    1462            1 :         m_id[POINT][4][FACE][0] = 1;
    1463            1 :         m_id[POINT][4][FACE][1] = 4;
    1464            1 :         m_id[POINT][4][FACE][2] = 5;
    1465              : 
    1466            1 :         m_id[POINT][5][FACE][0] = 2;
    1467            1 :         m_id[POINT][5][FACE][1] = 1;
    1468            1 :         m_id[POINT][5][FACE][2] = 5;
    1469              : 
    1470            1 :         m_id[POINT][6][FACE][0] = 3;
    1471            1 :         m_id[POINT][6][FACE][1] = 2;
    1472            1 :         m_id[POINT][6][FACE][2] = 5;
    1473              : 
    1474            1 :         m_id[POINT][7][FACE][0] = 4;
    1475            1 :         m_id[POINT][7][FACE][1] = 3;
    1476            1 :         m_id[POINT][7][FACE][2] = 5;
    1477              : 
    1478              :         // Edges <-> Faces
    1479            1 :         m_id[FACE][0][EDGE][0] = 3;
    1480            1 :         m_id[FACE][0][EDGE][1] = 2;
    1481            1 :         m_id[FACE][0][EDGE][2] = 1;
    1482            1 :         m_id[FACE][0][EDGE][3] = 0;
    1483              : 
    1484            1 :         m_id[FACE][1][EDGE][0] = 0;
    1485            1 :         m_id[FACE][1][EDGE][1] = 5;
    1486            1 :         m_id[FACE][1][EDGE][2] = 8;
    1487            1 :         m_id[FACE][1][EDGE][3] = 4;
    1488              : 
    1489            1 :         m_id[FACE][2][EDGE][0] = 1;
    1490            1 :         m_id[FACE][2][EDGE][1] = 6;
    1491            1 :         m_id[FACE][2][EDGE][2] = 9;
    1492            1 :         m_id[FACE][2][EDGE][3] = 5;
    1493              : 
    1494            1 :         m_id[FACE][3][EDGE][0] = 2;
    1495            1 :         m_id[FACE][3][EDGE][1] = 7;
    1496            1 :         m_id[FACE][3][EDGE][2] = 10;
    1497            1 :         m_id[FACE][3][EDGE][3] = 6;
    1498              : 
    1499            1 :         m_id[FACE][4][EDGE][0] = 3;
    1500            1 :         m_id[FACE][4][EDGE][1] = 4;
    1501            1 :         m_id[FACE][4][EDGE][2] = 11;
    1502            1 :         m_id[FACE][4][EDGE][3] = 7;
    1503              : 
    1504            1 :         m_id[FACE][5][EDGE][0] = 8;
    1505            1 :         m_id[FACE][5][EDGE][1] = 9;
    1506            1 :         m_id[FACE][5][EDGE][2] = 10;
    1507            1 :         m_id[FACE][5][EDGE][3] = 11;
    1508              : 
    1509            1 :         m_id[EDGE][0][FACE][0] = 0;
    1510            1 :         m_id[EDGE][0][FACE][1] = 1;
    1511              : 
    1512            1 :         m_id[EDGE][1][FACE][0] = 0;
    1513            1 :         m_id[EDGE][1][FACE][1] = 2;
    1514              : 
    1515            1 :         m_id[EDGE][2][FACE][0] = 0;
    1516            1 :         m_id[EDGE][2][FACE][1] = 3;
    1517              : 
    1518            1 :         m_id[EDGE][3][FACE][0] = 0;
    1519            1 :         m_id[EDGE][3][FACE][1] = 4;
    1520              : 
    1521            1 :         m_id[EDGE][4][FACE][0] = 1;
    1522            1 :         m_id[EDGE][4][FACE][1] = 4;
    1523              : 
    1524            1 :         m_id[EDGE][5][FACE][0] = 2;
    1525            1 :         m_id[EDGE][5][FACE][1] = 1;
    1526              : 
    1527            1 :         m_id[EDGE][6][FACE][0] = 3;
    1528            1 :         m_id[EDGE][6][FACE][1] = 2;
    1529              : 
    1530            1 :         m_id[EDGE][7][FACE][0] = 4;
    1531            1 :         m_id[EDGE][7][FACE][1] = 3;
    1532              : 
    1533            1 :         m_id[EDGE][8][FACE][0] = 1;
    1534            1 :         m_id[EDGE][8][FACE][1] = 5;
    1535              : 
    1536            1 :         m_id[EDGE][9][FACE][0] = 2;
    1537            1 :         m_id[EDGE][9][FACE][1] = 5;
    1538              : 
    1539            1 :         m_id[EDGE][10][FACE][0] = 3;
    1540            1 :         m_id[EDGE][10][FACE][1] = 5;
    1541              : 
    1542            1 :         m_id[EDGE][11][FACE][0] = 4;
    1543            1 :         m_id[EDGE][11][FACE][1] = 5;
    1544              : 
    1545              :         // Points of Edges
    1546              :         // edge 0 = (0,1)
    1547            1 :         m_id[EDGE][0][POINT][0] = 0;
    1548            1 :         m_id[EDGE][0][POINT][1] = 1;
    1549              :         // edge 1 = (1,2)
    1550            1 :         m_id[EDGE][1][POINT][0] = 1;
    1551            1 :         m_id[EDGE][1][POINT][1] = 2;
    1552              :         // edge 2 = (2,3)
    1553            1 :         m_id[EDGE][2][POINT][0] = 2;
    1554            1 :         m_id[EDGE][2][POINT][1] = 3;
    1555              :         // edge 3 = (3,0)
    1556            1 :         m_id[EDGE][3][POINT][0] = 3;
    1557            1 :         m_id[EDGE][3][POINT][1] = 0;
    1558              :         // edge 4 = (0,4)
    1559            1 :         m_id[EDGE][4][POINT][0] = 0;
    1560            1 :         m_id[EDGE][4][POINT][1] = 4;
    1561              :         // edge 5 = (1,5)
    1562            1 :         m_id[EDGE][5][POINT][0] = 1;
    1563            1 :         m_id[EDGE][5][POINT][1] = 5;
    1564              :         // edge 6 = (2,6)
    1565            1 :         m_id[EDGE][6][POINT][0] = 2;
    1566            1 :         m_id[EDGE][6][POINT][1] = 6;
    1567              :         // edge 7 = (3,7)
    1568            1 :         m_id[EDGE][7][POINT][0] = 3;
    1569            1 :         m_id[EDGE][7][POINT][1] = 7;
    1570              :         // edge 8 = (4,5)
    1571            1 :         m_id[EDGE][8][POINT][0] = 4;
    1572            1 :         m_id[EDGE][8][POINT][1] = 5;
    1573              :         // edge 9 = (5,6)
    1574            1 :         m_id[EDGE][9][POINT][0] = 5;
    1575            1 :         m_id[EDGE][9][POINT][1] = 6;
    1576              :         // edge 10 = (6,7)
    1577            1 :         m_id[EDGE][10][POINT][0] = 6;
    1578            1 :         m_id[EDGE][10][POINT][1] = 7;
    1579              :         // edge 11 = (7,4)
    1580            1 :         m_id[EDGE][11][POINT][0] = 7;
    1581            1 :         m_id[EDGE][11][POINT][1] = 4;
    1582              : 
    1583              :         // Edges of Point
    1584            1 :         m_id[POINT][0][EDGE][0] = 3;
    1585            1 :         m_id[POINT][0][EDGE][1] = 0;
    1586            1 :         m_id[POINT][0][EDGE][2] = 4;
    1587              : 
    1588            1 :         m_id[POINT][1][EDGE][0] = 0;
    1589            1 :         m_id[POINT][1][EDGE][1] = 1;
    1590            1 :         m_id[POINT][1][EDGE][2] = 5;
    1591              : 
    1592            1 :         m_id[POINT][2][EDGE][0] = 1;
    1593            1 :         m_id[POINT][2][EDGE][1] = 2;
    1594            1 :         m_id[POINT][2][EDGE][2] = 6;
    1595              : 
    1596            1 :         m_id[POINT][3][EDGE][0] = 2;
    1597            1 :         m_id[POINT][3][EDGE][1] = 3;
    1598            1 :         m_id[POINT][3][EDGE][2] = 7;
    1599              : 
    1600            1 :         m_id[POINT][4][EDGE][0] = 4;
    1601            1 :         m_id[POINT][4][EDGE][1] = 8;
    1602            1 :         m_id[POINT][4][EDGE][2] = 11;
    1603              : 
    1604            1 :         m_id[POINT][5][EDGE][0] = 5;
    1605            1 :         m_id[POINT][5][EDGE][1] = 9;
    1606            1 :         m_id[POINT][5][EDGE][2] = 8;
    1607              : 
    1608            1 :         m_id[POINT][6][EDGE][0] = 6;
    1609            1 :         m_id[POINT][6][EDGE][1] = 10;
    1610            1 :         m_id[POINT][6][EDGE][2] = 9;
    1611              : 
    1612            1 :         m_id[POINT][7][EDGE][0] = 7;
    1613            1 :         m_id[POINT][7][EDGE][1] = 11;
    1614            1 :         m_id[POINT][7][EDGE][2] = 10;
    1615              : 
    1616              :         // Reference Corners
    1617              :         m_vCorner[0] = MathVector<dim>(0.0, 0.0, 0.0);
    1618              :         m_vCorner[1] = MathVector<dim>(1.0, 0.0, 0.0);
    1619              :         m_vCorner[2] = MathVector<dim>(1.0, 1.0, 0.0);
    1620              :         m_vCorner[3] = MathVector<dim>(0.0, 1.0, 0.0);
    1621              :         m_vCorner[4] = MathVector<dim>(0.0, 0.0, 1.0);
    1622              :         m_vCorner[5] = MathVector<dim>(1.0, 0.0, 1.0);
    1623              :         m_vCorner[6] = MathVector<dim>(1.0, 1.0, 1.0);
    1624              :         m_vCorner[7] = MathVector<dim>(0.0, 1.0, 1.0);
    1625              : 
    1626              :         m_vCoInt[0] = MathVector<dim,int>(0, 0, 0);
    1627              :         m_vCoInt[1] = MathVector<dim,int>(1, 0, 0);
    1628              :         m_vCoInt[2] = MathVector<dim,int>(1, 1, 0);
    1629              :         m_vCoInt[3] = MathVector<dim,int>(0, 1, 0);
    1630              :         m_vCoInt[4] = MathVector<dim,int>(0, 0, 1);
    1631              :         m_vCoInt[5] = MathVector<dim,int>(1, 0, 1);
    1632              :         m_vCoInt[6] = MathVector<dim,int>(1, 1, 1);
    1633              :         m_vCoInt[7] = MathVector<dim,int>(0, 1, 1);
    1634              : 
    1635              :         // Reference Element Types
    1636           10 :         for(int i = 0; i < NUM_REFERENCE_OBJECTS; ++i)
    1637              :         {
    1638            9 :                 m_vNumRefElem[i] = 0;
    1639              :         }
    1640            1 :         m_vNumRefElem[ROID_VERTEX] = 8;
    1641            1 :         m_vNumRefElem[ROID_EDGE] = 12;
    1642            1 :         m_vNumRefElem[ROID_QUADRILATERAL] = 6;
    1643            1 :         m_vNumRefElem[ROID_HEXAHEDRON] = 1;
    1644            1 : }
    1645              : 
    1646              : ///////////////////////////////////////////////////////////////////////////////
    1647              : //      ReferenceOctahedron
    1648              : ///////////////////////////////////////////////////////////////////////////////
    1649              : 
    1650            0 : ReferenceOctahedron::ReferenceOctahedron()
    1651              : {
    1652              :         // dimension
    1653            0 :         m_dim = 3;
    1654              : 
    1655              :         // size
    1656            0 :         m_size = 2.0/3.0;
    1657              : 
    1658              :         //number of Geometric Objects
    1659            0 :         m_vNum[POINT] = 6;
    1660            0 :         m_vNum[EDGE] = 12;
    1661            0 :         m_vNum[FACE] = 8;
    1662            0 :         m_vNum[VOLUME] = 1;
    1663              : 
    1664              :         // number of Geometric Objects
    1665            0 :         m_vSubNum[VOLUME][0][POINT] = 6;
    1666            0 :         m_vSubNum[VOLUME][0][EDGE] = 12;
    1667            0 :         m_vSubNum[VOLUME][0][FACE] = 8;
    1668            0 :         m_vSubNum[VOLUME][0][VOLUME] = 1;
    1669            0 :         m_vRefElemType[VOLUME][0] = ROID_OCTAHEDRON;
    1670              : 
    1671            0 :         for(size_t i = 0; i < m_vNum[FACE]; ++i)
    1672              :         {
    1673            0 :                 m_vSubNum[FACE][i][POINT] = 3;
    1674            0 :                 m_vSubNum[FACE][i][EDGE] = 3;
    1675            0 :                 m_vSubNum[FACE][i][FACE] = 1;
    1676            0 :                 m_vSubNum[FACE][i][VOLUME] = 1;
    1677              : 
    1678            0 :                 m_vRefElemType[FACE][i] = ROID_TRIANGLE;
    1679              :         }
    1680              : 
    1681            0 :         for(size_t i = 0; i < m_vNum[EDGE]; ++i)
    1682              :         {
    1683            0 :                 m_vSubNum[EDGE][i][POINT] = 2;
    1684            0 :                 m_vSubNum[EDGE][i][EDGE] = 1;
    1685            0 :                 m_vSubNum[EDGE][i][FACE] = 2;
    1686            0 :                 m_vSubNum[EDGE][i][VOLUME] = 1;
    1687              : 
    1688            0 :                 m_vRefElemType[EDGE][i] = ROID_EDGE;
    1689              :         }
    1690              : 
    1691            0 :         for(size_t i = 0; i < m_vNum[POINT]; ++i)
    1692              :         {
    1693            0 :                 m_vSubNum[POINT][i][POINT] = 1;
    1694            0 :                 m_vSubNum[POINT][i][EDGE] = 4;
    1695            0 :                 m_vSubNum[POINT][i][FACE] = 4;
    1696            0 :                 m_vSubNum[POINT][i][VOLUME] = 1;
    1697              : 
    1698            0 :                 m_vRefElemType[POINT][i] = ROID_VERTEX;
    1699              :         }
    1700              : 
    1701              :         //reset m_id to -1
    1702            0 :         for(int i=0; i<=dim; ++i)
    1703            0 :                 for(size_t j=0; j<MAXOBJECTS; ++j)
    1704            0 :                         for(int k=0; k<=dim; ++k)
    1705            0 :                                 for(size_t l=0; l<MAXOBJECTS; l++)
    1706              :                                 {
    1707            0 :                                         m_id[i][j][k][l] = -1;
    1708              :                                 }
    1709              : 
    1710              :         //self references: (i.e. Point <-> Point, Edge <-> Edge, etc.)
    1711            0 :         for(int i=0; i<=dim; ++i)
    1712            0 :                 for(size_t j=0; j<m_vNum[i]; ++j)
    1713              :                 {
    1714            0 :                         m_id[i][j][i][0] = j;
    1715              :                 }
    1716              : 
    1717              :         // Face <-> Volume
    1718            0 :         for(size_t i=0; i<m_vNum[FACE]; ++i)
    1719              :         {
    1720            0 :                 m_id[VOLUME][0][FACE][i] = i;
    1721            0 :                 m_id[FACE][i][VOLUME][0] = 0;
    1722              :         }
    1723              : 
    1724              :         // Edge <-> Volume
    1725            0 :         for(size_t i=0; i<m_vNum[EDGE]; ++i)
    1726              :         {
    1727            0 :                 m_id[VOLUME][0][EDGE][i] = i;
    1728            0 :                 m_id[EDGE][i][VOLUME][0] = 0;
    1729              :         }
    1730              : 
    1731              :         // Point <-> Volume
    1732            0 :         for(size_t i=0; i<m_vNum[POINT]; ++i)
    1733              :         {
    1734            0 :                 m_id[VOLUME][0][POINT][i] = i;
    1735            0 :                 m_id[POINT][i][VOLUME][0] = 0;
    1736              :         }
    1737              : 
    1738              :         // Face -> Points (ccw)
    1739            0 :         m_id[FACE][0][POINT][0] = 0;
    1740            0 :         m_id[FACE][0][POINT][1] = 2;
    1741            0 :         m_id[FACE][0][POINT][2] = 1;
    1742              : 
    1743            0 :         m_id[FACE][1][POINT][0] = 0;
    1744            0 :         m_id[FACE][1][POINT][1] = 3;
    1745            0 :         m_id[FACE][1][POINT][2] = 2;
    1746              : 
    1747            0 :         m_id[FACE][2][POINT][0] = 0;
    1748            0 :         m_id[FACE][2][POINT][1] = 4;
    1749            0 :         m_id[FACE][2][POINT][2] = 3;
    1750              : 
    1751            0 :         m_id[FACE][3][POINT][0] = 0;
    1752            0 :         m_id[FACE][3][POINT][1] = 1;
    1753            0 :         m_id[FACE][3][POINT][2] = 4;
    1754              : 
    1755            0 :         m_id[FACE][4][POINT][0] = 1;
    1756            0 :         m_id[FACE][4][POINT][1] = 2;
    1757            0 :         m_id[FACE][4][POINT][2] = 5;
    1758              : 
    1759            0 :         m_id[FACE][5][POINT][0] = 2;
    1760            0 :         m_id[FACE][5][POINT][1] = 3;
    1761            0 :         m_id[FACE][5][POINT][2] = 5;
    1762              : 
    1763            0 :         m_id[FACE][6][POINT][0] = 3;
    1764            0 :         m_id[FACE][6][POINT][1] = 4;
    1765            0 :         m_id[FACE][6][POINT][2] = 5;
    1766              : 
    1767            0 :         m_id[FACE][7][POINT][0] = 4;
    1768            0 :         m_id[FACE][7][POINT][1] = 1;
    1769            0 :         m_id[FACE][7][POINT][2] = 5;
    1770              : 
    1771              :         // Points -> Faces (cw)
    1772            0 :         m_id[POINT][0][FACE][0] = 0;
    1773            0 :         m_id[POINT][0][FACE][1] = 1;
    1774            0 :         m_id[POINT][0][FACE][2] = 2;
    1775            0 :         m_id[POINT][0][FACE][3] = 3;
    1776              : 
    1777            0 :         m_id[POINT][1][FACE][0] = 0;
    1778            0 :         m_id[POINT][1][FACE][1] = 3;
    1779            0 :         m_id[POINT][1][FACE][2] = 7;
    1780            0 :         m_id[POINT][1][FACE][3] = 4;
    1781              : 
    1782            0 :         m_id[POINT][2][FACE][0] = 0;
    1783            0 :         m_id[POINT][2][FACE][1] = 4;
    1784            0 :         m_id[POINT][2][FACE][2] = 5;
    1785            0 :         m_id[POINT][2][FACE][3] = 1;
    1786              : 
    1787            0 :         m_id[POINT][3][FACE][0] = 1;
    1788            0 :         m_id[POINT][3][FACE][1] = 5;
    1789            0 :         m_id[POINT][3][FACE][2] = 6;
    1790            0 :         m_id[POINT][3][FACE][3] = 2;
    1791              : 
    1792            0 :         m_id[POINT][4][FACE][0] = 2;
    1793            0 :         m_id[POINT][4][FACE][1] = 6;
    1794            0 :         m_id[POINT][4][FACE][2] = 7;
    1795            0 :         m_id[POINT][4][FACE][3] = 3;
    1796              : 
    1797            0 :         m_id[POINT][5][FACE][0] = 4;
    1798            0 :         m_id[POINT][5][FACE][1] = 7;
    1799            0 :         m_id[POINT][5][FACE][2] = 6;
    1800            0 :         m_id[POINT][5][FACE][3] = 5;
    1801              : 
    1802              :         // Edges <-> Faces (ccw)
    1803            0 :         m_id[FACE][0][EDGE][0] = 1;
    1804            0 :         m_id[FACE][0][EDGE][1] = 4;
    1805            0 :         m_id[FACE][0][EDGE][2] = 0;
    1806              : 
    1807            0 :         m_id[FACE][1][EDGE][0] = 2;
    1808            0 :         m_id[FACE][1][EDGE][1] = 5;
    1809            0 :         m_id[FACE][1][EDGE][2] = 1;
    1810              : 
    1811            0 :         m_id[FACE][2][EDGE][0] = 3;
    1812            0 :         m_id[FACE][2][EDGE][1] = 6;
    1813            0 :         m_id[FACE][2][EDGE][2] = 2;
    1814              : 
    1815            0 :         m_id[FACE][3][EDGE][0] = 0;
    1816            0 :         m_id[FACE][3][EDGE][1] = 7;
    1817            0 :         m_id[FACE][3][EDGE][2] = 3;
    1818              : 
    1819            0 :         m_id[FACE][4][EDGE][0] = 4;
    1820            0 :         m_id[FACE][4][EDGE][1] = 9;
    1821            0 :         m_id[FACE][4][EDGE][2] = 8;
    1822              : 
    1823            0 :         m_id[FACE][5][EDGE][0] = 5;
    1824            0 :         m_id[FACE][5][EDGE][1] = 10;
    1825            0 :         m_id[FACE][5][EDGE][2] = 9;
    1826              : 
    1827            0 :         m_id[FACE][6][EDGE][0] = 6;
    1828            0 :         m_id[FACE][6][EDGE][1] = 11;
    1829            0 :         m_id[FACE][6][EDGE][2] = 10;
    1830              : 
    1831            0 :         m_id[FACE][7][EDGE][0] = 7;
    1832            0 :         m_id[FACE][7][EDGE][1] = 8;
    1833            0 :         m_id[FACE][7][EDGE][2] = 11;
    1834              : 
    1835            0 :         m_id[EDGE][0][FACE][0] = 0;
    1836            0 :         m_id[EDGE][0][FACE][1] = 3;
    1837              : 
    1838            0 :         m_id[EDGE][1][FACE][0] = 1;
    1839            0 :         m_id[EDGE][1][FACE][1] = 0;
    1840              : 
    1841            0 :         m_id[EDGE][2][FACE][0] = 2;
    1842            0 :         m_id[EDGE][2][FACE][1] = 1;
    1843              : 
    1844            0 :         m_id[EDGE][3][FACE][0] = 3;
    1845            0 :         m_id[EDGE][3][FACE][1] = 2;
    1846              : 
    1847            0 :         m_id[EDGE][4][FACE][0] = 0;
    1848            0 :         m_id[EDGE][4][FACE][1] = 4;
    1849              : 
    1850            0 :         m_id[EDGE][5][FACE][0] = 1;
    1851            0 :         m_id[EDGE][5][FACE][1] = 5;
    1852              : 
    1853            0 :         m_id[EDGE][6][FACE][0] = 2;
    1854            0 :         m_id[EDGE][6][FACE][1] = 6;
    1855              : 
    1856            0 :         m_id[EDGE][7][FACE][0] = 3;
    1857            0 :         m_id[EDGE][7][FACE][1] = 7;
    1858              : 
    1859            0 :         m_id[EDGE][8][FACE][0] = 4;
    1860            0 :         m_id[EDGE][8][FACE][1] = 7;
    1861              : 
    1862            0 :         m_id[EDGE][9][FACE][0] = 5;
    1863            0 :         m_id[EDGE][9][FACE][1] = 4;
    1864              : 
    1865            0 :         m_id[EDGE][10][FACE][0] = 6;
    1866            0 :         m_id[EDGE][10][FACE][1] = 5;
    1867              : 
    1868            0 :         m_id[EDGE][11][FACE][0] = 7;
    1869            0 :         m_id[EDGE][11][FACE][1] = 6;
    1870              : 
    1871              :         // Points of Edges
    1872              :         // edge 0 = (0,1)
    1873            0 :         m_id[EDGE][0][POINT][0] = 0;
    1874            0 :         m_id[EDGE][0][POINT][1] = 1;
    1875              :         // edge 1 = (0,2)
    1876            0 :         m_id[EDGE][1][POINT][0] = 0;
    1877            0 :         m_id[EDGE][1][POINT][1] = 2;
    1878              :         // edge 2 = (0,3)
    1879            0 :         m_id[EDGE][2][POINT][0] = 0;
    1880            0 :         m_id[EDGE][2][POINT][1] = 3;
    1881              :         // edge 3 = (0,4)
    1882            0 :         m_id[EDGE][3][POINT][0] = 0;
    1883            0 :         m_id[EDGE][3][POINT][1] = 4;
    1884              :         // edge 4 = (1,2)
    1885            0 :         m_id[EDGE][4][POINT][0] = 1;
    1886            0 :         m_id[EDGE][4][POINT][1] = 2;
    1887              :         // edge 5 = (2,3)
    1888            0 :         m_id[EDGE][5][POINT][0] = 2;
    1889            0 :         m_id[EDGE][5][POINT][1] = 3;
    1890              :         // edge 6 = (3,4)
    1891            0 :         m_id[EDGE][6][POINT][0] = 3;
    1892            0 :         m_id[EDGE][6][POINT][1] = 4;
    1893              :         // edge 7 = (4,1)
    1894            0 :         m_id[EDGE][7][POINT][0] = 4;
    1895            0 :         m_id[EDGE][7][POINT][1] = 1;
    1896              :         // edge 8 = (1,5)
    1897            0 :         m_id[EDGE][8][POINT][0] = 1;
    1898            0 :         m_id[EDGE][8][POINT][1] = 5;
    1899              :         // edge 9 = (2,5)
    1900            0 :         m_id[EDGE][9][POINT][0] = 2;
    1901            0 :         m_id[EDGE][9][POINT][1] = 5;
    1902              :         // edge 10 = (3,5)
    1903            0 :         m_id[EDGE][10][POINT][0] = 3;
    1904            0 :         m_id[EDGE][10][POINT][1] = 5;
    1905              :         // edge 11 = (4,5)
    1906            0 :         m_id[EDGE][11][POINT][0] = 4;
    1907            0 :         m_id[EDGE][11][POINT][1] = 5;
    1908              : 
    1909              :         // Edges of Point (ccw)
    1910            0 :         m_id[POINT][0][EDGE][0] = 0;
    1911            0 :         m_id[POINT][0][EDGE][1] = 3;
    1912            0 :         m_id[POINT][0][EDGE][2] = 2;
    1913            0 :         m_id[POINT][0][EDGE][3] = 1;
    1914              : 
    1915            0 :         m_id[POINT][1][EDGE][0] = 0;
    1916            0 :         m_id[POINT][1][EDGE][1] = 4;
    1917            0 :         m_id[POINT][1][EDGE][2] = 8;
    1918            0 :         m_id[POINT][1][EDGE][3] = 7;
    1919              : 
    1920            0 :         m_id[POINT][2][EDGE][0] = 1;
    1921            0 :         m_id[POINT][2][EDGE][1] = 5;
    1922            0 :         m_id[POINT][2][EDGE][2] = 9;
    1923            0 :         m_id[POINT][2][EDGE][3] = 4;
    1924              : 
    1925            0 :         m_id[POINT][3][EDGE][0] = 2;
    1926            0 :         m_id[POINT][3][EDGE][1] = 6;
    1927            0 :         m_id[POINT][3][EDGE][2] = 10;
    1928            0 :         m_id[POINT][3][EDGE][3] = 5;
    1929              : 
    1930            0 :         m_id[POINT][4][EDGE][0] = 3;
    1931            0 :         m_id[POINT][4][EDGE][1] = 7;
    1932            0 :         m_id[POINT][4][EDGE][2] = 11;
    1933            0 :         m_id[POINT][4][EDGE][3] = 6;
    1934              : 
    1935            0 :         m_id[POINT][5][EDGE][0] = 8;
    1936            0 :         m_id[POINT][5][EDGE][1] = 9;
    1937            0 :         m_id[POINT][5][EDGE][2] = 10;
    1938            0 :         m_id[POINT][5][EDGE][3] = 11;
    1939              : 
    1940              :         // Reference Corners
    1941              :         m_vCorner[0] = MathVector<dim>(0.0, 0.0,-1.0);
    1942              :         m_vCorner[1] = MathVector<dim>(0.0, 0.0, 0.0);
    1943              :         m_vCorner[2] = MathVector<dim>(1.0, 0.0, 0.0);
    1944              :         m_vCorner[3] = MathVector<dim>(1.0, 1.0, 0.0);
    1945              :         m_vCorner[4] = MathVector<dim>(0.0, 1.0, 0.0);
    1946              :         m_vCorner[5] = MathVector<dim>(0.0, 0.0, 1.0);
    1947              : 
    1948              :         m_vCoInt[0] = MathVector<dim,int>(0, 0,-1);
    1949              :         m_vCoInt[1] = MathVector<dim,int>(0, 0, 0);
    1950              :         m_vCoInt[2] = MathVector<dim,int>(1, 0, 0);
    1951              :         m_vCoInt[3] = MathVector<dim,int>(1, 1, 0);
    1952              :         m_vCoInt[4] = MathVector<dim,int>(0, 1, 0);
    1953              :         m_vCoInt[5] = MathVector<dim,int>(0, 0, 1);
    1954              : 
    1955              :         // Reference Element Types
    1956            0 :         for(int i = 0; i < NUM_REFERENCE_OBJECTS; ++i)
    1957              :         {
    1958            0 :                 m_vNumRefElem[i] = 0;
    1959              :         }
    1960            0 :         m_vNumRefElem[ROID_VERTEX] = 6;
    1961            0 :         m_vNumRefElem[ROID_EDGE] = 12;
    1962            0 :         m_vNumRefElem[ROID_TRIANGLE] = 8;
    1963            0 :         m_vNumRefElem[ROID_OCTAHEDRON] = 1;
    1964            0 : }
    1965              : 
    1966              : 
    1967              : }; // end namespace ug
    1968              : 
        

Generated by: LCOV version 2.0-1