numbering.hh

00001 #ifndef DUNE_NUMBERING_HH
00002 #define DUNE_NUMBERING_HH
00003 
00004 #include <dune/common/fixedarray.hh>
00005 
00006 namespace Dune {
00007 
00009 template<int dim>
00010 class LexOrder {
00011 public:
00013     void init (const FixedArray<int, dim>& _NN);
00014 
00016     int tupels () const;
00017 
00019     int n (const FixedArray<int,dim>& z) const;
00020 
00022     FixedArray<int,dim> z (int n) const;
00023 
00024 private:
00025     FixedArray<int,dim> N; // number of elements per direction
00026     int P[dim+1];     // P[i] = Prod_{i=0}^{i} N[i];
00027 };
00028 
00030 template<int dim>
00031 class JoinOrder {
00032 public:
00034         void init (const FixedArray<int,dim>& _NN);
00035 
00037         int size () const;
00038 
00040         int n (int subset, int index) const;
00041 
00043         int subset (int n) const;
00044 
00046         int index (int n) const;
00047 
00048 private:
00049         FixedArray<int,dim> N;   // number of elements per direction
00050         int offset[dim+1];  // P[i] = Sum_{i=0}^{i} N[i];
00051 };
00052 
00053 
00076 template<int dim>
00077 class CubeMapper {
00078 public:
00080         CubeMapper (const FixedArray<int,dim>& _NN);
00081 
00083         CubeMapper ();
00084 
00086         void make (const FixedArray<int,dim>& _NN);
00087 
00089         int elements (int codim) const;
00090 
00092         int codim (const FixedArray<int,dim>& z) const;
00093 
00097         int n (const FixedArray<int,dim>& z) const;
00098 
00100         FixedArray<int,dim> z (int i, int codim) const;
00101 
00103         FixedArray<int,dim> compress (const FixedArray<int,dim>& z) const; 
00104 
00106         FixedArray<int,dim> expand (const FixedArray<int,dim>& r, int b) const; 
00107 
00109         int partition (const FixedArray<int,dim>& z) const; 
00110 
00112         void print (std::ostream& ss, int indent) const;
00113 
00114 private:
00115         FixedArray<int,dim> N; // number of elements per direction
00116         int ne[dim+1];    // number of elements per codimension
00117         int nb[1<<dim];   // number of elements per binary partition
00118         int cb[1<<dim];   // codimension of binary partition
00119         LexOrder<dim> lex[1<<dim];     // lex ordering within binary partition
00120         JoinOrder<1<<dim> join[dim+1]; // join subsets of codimension
00121 
00122         int power2 (int i) const {return 1<<i;}
00123         int ones (int b) const; // count number of bits set in binary rep of b
00124 };
00125 
00126 } // end namespace
00127 
00128 #include"numbering.cc"
00129 
00130 #endif

Generated on 12 Dec 2007 with Doxygen (ver 1.5.1)