pk3dlocalcoefficients.hh
Go to the documentation of this file.00001 #ifndef DUNE_PK3DLOCALCOEFFICIENTS_HH
00002 #define DUNE_PK3DLOCALCOEFFICIENTS_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 Pk3DLocalCoefficients
00021 {
00022 enum {N = (k+1)*(k+2)*(k+3)/6};
00023
00024 public:
00026 Pk3DLocalCoefficients () : li(N)
00027 {
00028 const unsigned int vertexmap[4] = {0, 1, 2, 3};
00029 generate_local_keys(vertexmap);
00030 }
00031
00038 Pk3DLocalCoefficients (const unsigned int vertexmap[4]) : li(N)
00039 {
00040 generate_local_keys(vertexmap);
00041 }
00042
00044 std::size_t size () const
00045 {
00046 return N;
00047 }
00048
00050 const LocalKey& localKey (std::size_t i) const
00051 {
00052 return li[i];
00053 }
00054
00055 private:
00056 std::vector<LocalKey> li;
00057
00058 void generate_local_keys(const unsigned int vertexmap[4])
00059 {
00060 unsigned int subindex[16];
00061 unsigned int codim_count[4] = {0};
00062 for (unsigned int m = 1; m < 16; ++m)
00063 {
00064 unsigned int codim = !(m&1) + !(m&2) + !(m&4) + !(m&8);
00065 subindex[m] = codim_count[codim]++;
00066 }
00067
00068 int a1 = (3*k + 12)*k + 11;
00069 int a2 = -3*k - 6;
00070 unsigned int dof_count[16] = {0};
00071 unsigned int i[4];
00072 for (i[3] = 0; i[3] <= k; ++i[3])
00073 for (i[2] = 0; i[2] <= k - i[3]; ++i[2])
00074 for (i[1] = 0; i[1] <= k - i[2] - i[3]; ++i[1])
00075 {
00076 i[0] = k - i[1] - i[2] - i[3];
00077 unsigned int j[4];
00078 unsigned int entity = 0;
00079 unsigned int codim = 0;
00080 for (unsigned int m = 0; m < 4; ++m)
00081 {
00082 j[m] = i[vertexmap[m]];
00083 entity += !!j[m] << m;
00084 codim += !j[m];
00085 }
00086 int local_index = j[3]*(a1 + (a2 + j[3])*j[3])/6
00087 + j[2]*(2*(k - j[3]) + 3 - j[2])/2 + j[1];
00088 li[local_index] = LocalKey(subindex[entity], codim, dof_count[entity]++);
00089 }
00090 }
00091 };
00092
00093 }
00094
00095 #endif