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;
00026 int P[dim+1];
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;
00050 int offset[dim+1];
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;
00116 int ne[dim+1];
00117 int nb[1<<dim];
00118 int cb[1<<dim];
00119 LexOrder<dim> lex[1<<dim];
00120 JoinOrder<1<<dim> join[dim+1];
00121
00122 int power2 (int i) const {return 1<<i;}
00123 int ones (int b) const;
00124 };
00125
00126 }
00127
00128 #include"numbering.cc"
00129
00130 #endif