topology.hh

00001 #ifndef DUNE_ALU3DGRIDTOPOLOGY_HH
00002 #define DUNE_ALU3DGRIDTOPOLOGY_HH
00003 
00004 //- system includes 
00005 #include <cassert>
00006 
00007 namespace Dune {
00008 
00009   // types of the elementes, 
00010   // i.e . tetra or hexa, mixed is not implemeneted 
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     //  private:
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   //- IMPLEMENTATION
00140   //- class ElementTopologyMapping
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   //- class FaceTopologyMapping
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 } // end namespace Dune
00238 #endif

Generated on 6 Nov 2008 with Doxygen (ver 1.5.6) [logfile].