dune-localfunctions  2.2.1
pk3dlocalcoefficients.hh
Go to the documentation of this file.
1 #ifndef DUNE_PK3DLOCALCOEFFICIENTS_HH
2 #define DUNE_PK3DLOCALCOEFFICIENTS_HH
3 
4 #include <cstddef>
5 #include <iostream>
6 #include <vector>
7 
9 
10 namespace Dune
11 {
12 
19  template<unsigned int k>
21  {
22  enum {N = (k+1)*(k+2)*(k+3)/6};
23 
24  public:
27  {
28  const unsigned int vertexmap[4] = {0, 1, 2, 3};
29  generate_local_keys(vertexmap);
30  }
31 
38  Pk3DLocalCoefficients (const unsigned int vertexmap[4]) : li(N)
39  {
40  generate_local_keys(vertexmap);
41  }
42 
44  std::size_t size () const
45  {
46  return N;
47  }
48 
50  const LocalKey& localKey (std::size_t i) const
51  {
52  return li[i];
53  }
54 
55  private:
56  std::vector<LocalKey> li;
57 
58  void generate_local_keys(const unsigned int vertexmap[4])
59  {
60  unsigned int subindex[16];
61  unsigned int codim_count[4] = {0};
62  for (unsigned int m = 1; m < 16; ++m)
63  {
64  unsigned int codim = !(m&1) + !(m&2) + !(m&4) + !(m&8);
65  subindex[m] = codim_count[codim]++;
66  }
67 
68  int a1 = (3*k + 12)*k + 11;
69  int a2 = -3*k - 6;
70  unsigned int dof_count[16] = {0};
71  unsigned int i[4];
72  for (i[3] = 0; i[3] <= k; ++i[3])
73  for (i[2] = 0; i[2] <= k - i[3]; ++i[2])
74  for (i[1] = 0; i[1] <= k - i[2] - i[3]; ++i[1])
75  {
76  i[0] = k - i[1] - i[2] - i[3];
77  unsigned int j[4];
78  unsigned int entity = 0;
79  unsigned int codim = 0;
80  for (unsigned int m = 0; m < 4; ++m)
81  {
82  j[m] = i[vertexmap[m]];
83  entity += !!j[m] << m;
84  codim += !j[m];
85  }
86  int local_index = j[3]*(a1 + (a2 + j[3])*j[3])/6
87  + j[2]*(2*(k - j[3]) + 3 - j[2])/2 + j[1];
88  li[local_index] = LocalKey(subindex[entity], codim, dof_count[entity]++);
89  }
90  }
91  };
92 
93 }
94 
95 #endif