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