00001 #ifndef DUNE_ALU3DGRIDTOPOLOGY_HH
00002 #define DUNE_ALU3DGRIDTOPOLOGY_HH
00003
00004
00005 #include <cassert>
00006
00007 namespace Dune {
00008
00009
00010
00011 enum ALU3dGridElementType { tetra = 4, hexa = 7, mixed, error };
00012
00013 template <ALU3dGridElementType type>
00014 struct EntityCount {};
00015
00016 template <>
00017 struct EntityCount<tetra> {
00018 enum {numFaces = 4};
00019 enum {numVertices = 4};
00020 enum {numEdges = 6};
00021 enum {numVerticesPerFace = 3};
00022 enum {numEdgesPerFace = 3};
00023 };
00024
00025 template <>
00026 struct EntityCount<hexa> {
00027 enum {numFaces = 6};
00028 enum {numVertices = 8};
00029 enum {numEdges = 12};
00030 enum {numVerticesPerFace = 4};
00031 enum {numEdgesPerFace = 4};
00032 };
00033
00034
00037 template <ALU3dGridElementType type>
00038 class ElementTopologyMapping
00039 {
00040 public:
00041 enum { numFaces = EntityCount<type>::numFaces };
00042 enum { numVertices = EntityCount<type>::numVertices };
00043 enum { numEdges = EntityCount<type>::numEdges };
00044 enum { numVerticesPerFace = EntityCount<type>::numVerticesPerFace };
00045
00047 static int dune2aluFace(int index);
00049 static int alu2duneFace(int index);
00050
00052 static int dune2aluEdge(int index);
00054 static int alu2duneEdge(int index);
00055
00057 static int dune2aluVertex(int index);
00059 static int alu2duneVertex(int index);
00060
00065 static int faceOrientation(int index);
00066
00073 static int dune2aluFaceVertex(int face, int localVertex);
00080 static int alu2duneFaceVertex(int face, int localVertex);
00081
00082 private:
00083 const static int dune2aluFace_[numFaces];
00084 const static int alu2duneFace_[numFaces];
00085
00086 const static int dune2aluEdge_[numEdges];
00087 const static int alu2duneEdge_[numEdges];
00088
00089 const static int dune2aluVertex_[numVertices];
00090 const static int alu2duneVertex_[numVertices];
00091
00092 const static int faceOrientation_[numFaces];
00093
00094 const static int dune2aluFaceVertex_[numFaces][numVerticesPerFace];
00095 const static int alu2duneFaceVertex_[numFaces][numVerticesPerFace];
00096 };
00097
00100 template <ALU3dGridElementType type>
00101 class FaceTopologyMapping {
00102 public:
00104 static int dune2aluVertex(int index);
00112 static int dune2aluVertex(int index, int twist);
00114 static int alu2duneVertex(int index);
00123 static int alu2duneVertex(int index, int twist);
00125 static int dune2aluEdge(int index);
00127 static int alu2duneEdge(int index);
00128
00129 static int twist(int index, int faceTwist);
00130 static int invTwist(int index, int faceTwist);
00131 private:
00132 const static int dune2aluVertex_[EntityCount<type>::numVerticesPerFace];
00133 const static int alu2duneVertex_[EntityCount<type>::numVerticesPerFace];
00134
00135 const static int dune2aluEdge_[EntityCount<type>::numEdgesPerFace];
00136 const static int alu2duneEdge_[EntityCount<type>::numEdgesPerFace];
00137 };
00138
00139
00140
00141 template <ALU3dGridElementType type>
00142 inline int ElementTopologyMapping<type>::dune2aluFace(int index) {
00143 assert(index >= 0 && index < numFaces);
00144 return dune2aluFace_[index];
00145 }
00146
00147 template <ALU3dGridElementType type>
00148 inline int ElementTopologyMapping<type>::alu2duneFace(int index) {
00149 assert(index >= 0 && index < numFaces);
00150 return alu2duneFace_[index];
00151 }
00152
00153 template <ALU3dGridElementType type>
00154 inline int ElementTopologyMapping<type>::dune2aluEdge(int index) {
00155 assert(index >= 0 && index < numEdges);
00156 return dune2aluEdge_[index];
00157 }
00158
00159 template <ALU3dGridElementType type>
00160 inline int ElementTopologyMapping<type>::alu2duneEdge(int index) {
00161 assert(index >= 0 && index < numEdges);
00162 return alu2duneEdge_[index];
00163 }
00164
00165 template <ALU3dGridElementType type>
00166 inline int ElementTopologyMapping<type>::dune2aluVertex(int index)
00167 {
00168 assert(index >= 0 && index < numVertices);
00169 return dune2aluVertex_[index];
00170 }
00171
00172 template <ALU3dGridElementType type>
00173 inline int ElementTopologyMapping<type>::alu2duneVertex(int index) {
00174 assert(index >= 0 && index < numVertices);
00175 return alu2duneVertex_[index];
00176 }
00177
00178 template <ALU3dGridElementType type>
00179 inline int ElementTopologyMapping<type>::faceOrientation(int index) {
00180 assert(index >= 0 && index < numVertices);
00181 return faceOrientation_[index];
00182 }
00183
00184 template <ALU3dGridElementType type>
00185 inline int ElementTopologyMapping<type>::
00186 dune2aluFaceVertex(int face, int localVertex) {
00187 assert(face >= 0 && face < numFaces);
00188 assert(localVertex >= 0 && localVertex < numVerticesPerFace);
00189 return dune2aluFaceVertex_[face][localVertex];
00190 }
00191
00192 template <ALU3dGridElementType type>
00193 inline int ElementTopologyMapping<type>::
00194 alu2duneFaceVertex(int face, int localVertex) {
00195 assert(face >= 0 && face < numFaces);
00196 assert(localVertex >= 0 && localVertex < numVerticesPerFace);
00197 return alu2duneFaceVertex_[face][localVertex];
00198 }
00199
00200
00201 template <ALU3dGridElementType type>
00202 inline int FaceTopologyMapping<type>::dune2aluVertex(int index) {
00203 assert(index >= 0 && index < EntityCount<type>::numVerticesPerFace);
00204 return dune2aluVertex_[index];
00205 }
00206
00207 template <ALU3dGridElementType type>
00208 inline int FaceTopologyMapping<type>::dune2aluVertex(int index, int twist) {
00209 assert(index >= 0 && index < EntityCount<type>::numVerticesPerFace);
00210 return invTwist(dune2aluVertex_[index], twist);
00211 }
00212
00213 template <ALU3dGridElementType type>
00214 inline int FaceTopologyMapping<type>::alu2duneVertex(int index) {
00215 assert(index >= 0 && index < EntityCount<type>::numVerticesPerFace);
00216 return alu2duneVertex_[index];
00217 }
00218
00219 template <ALU3dGridElementType type>
00220 inline int FaceTopologyMapping<type>::alu2duneVertex(int index, int twist) {
00221 assert(index >= 0 && index < EntityCount<type>::numVerticesPerFace);
00222 return alu2duneVertex_[invTwist(index, twist)];
00223 }
00224
00225 template <ALU3dGridElementType type>
00226 inline int FaceTopologyMapping<type>::alu2duneEdge(int index) {
00227 assert(index >= 0 && index < EntityCount<type>::numEdgesPerFace);
00228 return alu2duneEdge_[index];
00229 }
00230
00231 template <ALU3dGridElementType type>
00232 inline int FaceTopologyMapping<type>::dune2aluEdge(int index) {
00233 assert(index >= 0 && index < EntityCount<type>::numEdgesPerFace);
00234 return dune2aluEdge_[index];
00235 }
00236
00237 }
00238 #endif