00001 #ifndef DUNE_ALBERTAGRID_REFERENCETOPO_HH
00002 #define DUNE_ALBERTAGRID_REFERENCETOPO_HH
00003
00004 #ifdef __ALBERTApp__
00005 namespace Albert {
00006 #endif
00007
00008 namespace AlbertHelp {
00009
00010
00011
00012
00013
00014
00015 static const int localTriangleFaceNumber [3][2] = { {1,2} , {2,0} , {0,1} };
00016
00017
00018
00019
00020
00021 static const int localEdgeNumber [6][2] =
00022 {
00023 {0,1} , {0,2} , {0,3} ,
00024 {1,2} , {1,3} , {2,3}
00025 };
00026
00027
00028
00029
00030
00031
00032 static const int tetraFace_0[3] = {1,3,2};
00033 static const int tetraFace_1[3] = {0,2,3};
00034 static const int tetraFace_2[3] = {0,3,1};
00035 static const int tetraFace_3[3] = {0,1,2};
00036
00037
00038 static const int localDuneTetraFaceNumber[4][3] =
00039 { {1,2,3},
00040 {0,3,2},
00041 {0,1,3},
00042 {0,2,1}
00043 };
00044
00045 static const int * localAlbertaFaceNumber[4] = {tetraFace_0, tetraFace_1,
00046 tetraFace_2 , tetraFace_3 };
00047
00048 static const int dune2AlbertaEdgeMap[6] = {0, 3, 1, 2, 4, 5};
00049
00050 template <int dim>
00051 class AlbertaGridReferenceTopology
00052 {
00053
00054 int em_[6];
00055 const int (&edgemap_)[6];
00056
00057 public:
00059 AlbertaGridReferenceTopology()
00060 : edgemap_ (em_)
00061 {
00062
00063 for(int i=0; i<6; i++) em_[i] = dune2AlbertaEdgeMap[i];
00064 }
00065
00068 int dune2albertaVertex( int i ) const { return i; }
00069
00071 int dune2albertaEdge( int i ) const
00072 {
00073 assert( i >= 0 );
00074 assert( i < 6 );
00075 return edgemap_[i];
00076 }
00077 };
00078
00079
00080
00081
00082
00083
00084
00085 template <int md, int cd>
00086 struct MapVertices
00087 {
00088 static int mapVertices (int i, int face, int edge, int vertex)
00089 {
00090 return i;
00091 }
00092 };
00093
00094
00095 template <>
00096 struct MapVertices<1,2>
00097 {
00098 static int mapVertices (int i, int face, int edge, int vertex)
00099 {
00100 assert( i >= 0);
00101 assert( i < 2 );
00102 assert( face >= 0 );
00103 assert( face < 3 );
00104 return ALBERTA AlbertHelp::localTriangleFaceNumber[face][i];
00105 }
00106 };
00107
00108
00109 template <>
00110 struct MapVertices<2,3>
00111 {
00112 static int mapVertices (int i, int face, int edge, int vertex)
00113 {
00114
00115 assert( i >= 0);
00116 assert( i < 3 );
00117 assert( face >= 0 );
00118 assert( face < 4 );
00119 return ALBERTA AlbertHelp::localDuneTetraFaceNumber[face][i];
00120 }
00121 };
00122
00123
00124 template <>
00125 struct MapVertices<1,3>
00126 {
00127 static int mapVertices (int i, int face, int edge, int vertex)
00128 {
00129 assert( i >= 0 );
00130 assert( i < 2 );
00131 assert( edge >= 0 );
00132 assert( edge < 6 );
00133 return ALBERTA AlbertHelp :: localEdgeNumber[
00134 ALBERTA AlbertHelp :: dune2AlbertaEdgeMap [edge] ][i];
00135 }
00136 };
00137
00138
00139 template <int cd>
00140 struct MapVertices<0,cd>
00141 {
00142 static int mapVertices (int i, int face, int edge, int vertex)
00143 {
00144
00145 return vertex;
00146 }
00147 };
00148
00149
00150 }
00151
00152 #ifdef __ALBERTApp__
00153 }
00154 #endif
00155
00156 #endif