pk2dlocalcoefficients.hh
Go to the documentation of this file.00001 #ifndef DUNE_PK2DLOCALCOEFFICIENTS_HH
00002 #define DUNE_PK2DLOCALCOEFFICIENTS_HH
00003
00004 #include <cstddef>
00005 #include <iostream>
00006 #include <vector>
00007
00008 #include <dune/localfunctions/common/localkey.hh>
00009
00010 namespace Dune
00011 {
00012
00019 template<unsigned int k>
00020 class Pk2DLocalCoefficients
00021 {
00022 enum {N = (k+1)*(k+2)/2};
00023
00024 public:
00026 Pk2DLocalCoefficients () : li(N)
00027 {
00028 fill_default();
00029 }
00030
00032 Pk2DLocalCoefficients (int variant) : li(N)
00033 {
00034 fill_default();
00035 bool flip[3];
00036 for (int i = 0; i < 3; ++i)
00037 flip[i] = variant & (1<<i);
00038 for (int i=0; i<N; i++)
00039 if (li[i].codim()==1 && flip[li[i].subEntity()])
00040 li[i].index(k-2-li[i].index());
00041 }
00042
00049 Pk2DLocalCoefficients (const unsigned int vertexmap[3]) : li(N)
00050 {
00051 fill_default();
00052 bool flip[3];
00053 flip[0] = vertexmap[0] > vertexmap[1];
00054 flip[1] = vertexmap[0] > vertexmap[2];
00055 flip[2] = vertexmap[1] > vertexmap[2];
00056 for (std::size_t i=0; i<N; i++)
00057 if (li[i].codim()==1 && flip[li[i].subEntity()])
00058 li[i].index(k-2-li[i].index());
00059 }
00060
00062 std::size_t size () const
00063 {
00064 return N;
00065 }
00066
00068 const LocalKey& localKey (std::size_t i) const
00069 {
00070 return li[i];
00071 }
00072
00073 private:
00074 std::vector<LocalKey> li;
00075
00076 void fill_default ()
00077 {
00078 if (k==0)
00079 {
00080 li[0] = LocalKey(0,0,0);
00081 return;
00082 }
00083 int n=0;
00084 int c=0;
00085 for (unsigned int j=0; j<=k; j++)
00086 for (unsigned int i=0; i<=k-j; i++)
00087 {
00088 if (i==0 && j==0)
00089 {
00090 li[n++] = LocalKey(0,2,0);
00091 continue;
00092 }
00093 if (i==k && j==0)
00094 {
00095 li[n++] = LocalKey(1,2,0);
00096 continue;
00097 }
00098 if (i==0 && j==k)
00099 {
00100 li[n++] = LocalKey(2,2,0);
00101 continue;
00102 }
00103 if (j==0)
00104 {
00105 li[n++] = LocalKey(0,1,i-1);
00106 continue;
00107 }
00108 if (i==0)
00109 {
00110 li[n++] = LocalKey(1,1,j-1);
00111 continue;
00112 }
00113 if (i+j==k)
00114 {
00115 li[n++] = LocalKey(2,1,j-1);
00116 continue;
00117 }
00118 li[n++] = LocalKey(0,0,c++);
00119 }
00120 }
00121 };
00122
00123 }
00124
00125 #endif