dune-localfunctions 3.0-git
pk3dlocalcoefficients.hh
Go to the documentation of this file.
1// -*- tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 2 -*-
2// vi: set et ts=4 sw=2 sts=2:
3#ifndef DUNE_PK3DLOCALCOEFFICIENTS_HH
4#define DUNE_PK3DLOCALCOEFFICIENTS_HH
5
6#include <cstddef>
7#include <iostream>
8#include <vector>
9
11
12namespace Dune
13{
14
21 template<unsigned int k>
23 {
24 enum {N = (k+1)*(k+2)*(k+3)/6};
25
26 public:
29 {
30 const unsigned int vertexmap[4] = {0, 1, 2, 3};
31 generate_local_keys(vertexmap);
32 }
33
40 Pk3DLocalCoefficients (const unsigned int vertexmap[4]) : li(N)
41 {
42 generate_local_keys(vertexmap);
43 }
44
46 std::size_t size () const
47 {
48 return N;
49 }
50
52 const LocalKey& localKey (std::size_t i) const
53 {
54 return li[i];
55 }
56
57 private:
58 std::vector<LocalKey> li;
59
60 void generate_local_keys(const unsigned int vertexmap[4])
61 {
62 unsigned int subindex[16];
63 unsigned int codim_count[4] = {0};
64 for (unsigned int m = 1; m < 16; ++m)
65 {
66 unsigned int codim = !(m&1) + !(m&2) + !(m&4) + !(m&8);
67 subindex[m] = codim_count[codim]++;
68 }
69
70 int a1 = (3*k + 12)*k + 11;
71 int a2 = -3*k - 6;
72 unsigned int dof_count[16] = {0};
73 unsigned int i[4];
74 for (i[3] = 0; i[3] <= k; ++i[3])
75 for (i[2] = 0; i[2] <= k - i[3]; ++i[2])
76 for (i[1] = 0; i[1] <= k - i[2] - i[3]; ++i[1])
77 {
78 i[0] = k - i[1] - i[2] - i[3];
79 unsigned int j[4];
80 unsigned int entity = 0;
81 unsigned int codim = 0;
82 for (unsigned int m = 0; m < 4; ++m)
83 {
84 j[m] = i[vertexmap[m]];
85 entity += !!j[m] << m;
86 codim += !j[m];
87 }
88 int local_index = j[3]*(a1 + (a2 + j[3])*j[3])/6
89 + j[2]*(2*(k - j[3]) + 3 - j[2])/2 + j[1];
90 li[local_index] = LocalKey(subindex[entity], codim, dof_count[entity]++);
91 }
92 }
93 };
94
95}
96
97#endif
Definition brezzidouglasmarini1cube2d.hh:14
Describe position of one degree of freedom.
Definition localkey.hh:21
Please doc me!
Definition pk3dlocalcoefficients.hh:23
std::size_t size() const
number of coefficients
Definition pk3dlocalcoefficients.hh:46
Pk3DLocalCoefficients()
Standard constructor.
Definition pk3dlocalcoefficients.hh:28
Pk3DLocalCoefficients(const unsigned int vertexmap[4])
Definition pk3dlocalcoefficients.hh:40
const LocalKey & localKey(std::size_t i) const
get i'th index
Definition pk3dlocalcoefficients.hh:52