dune-localfunctions  2.1.1
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