Dune Core Modules (2.6.0)

pk2dlocalcoefficients.hh
1 // -*- tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 2 -*-
2 // vi: set et ts=4 sw=2 sts=2:
3 
4 #ifndef DUNE_PK2DLOCALCOEFFICIENTS_HH
5 #define DUNE_PK2DLOCALCOEFFICIENTS_HH
6 
7 #include <cstddef>
8 #include <vector>
9 
10 #include <dune/localfunctions/common/localkey.hh>
11 
12 namespace Dune
13 {
14 
21  template<unsigned int k>
23  {
24  enum {N = (k+1)*(k+2)/2};
25 
26  public:
29  {
30  fill_default();
31  }
32 
34  Pk2DLocalCoefficients (int variant) : li(N)
35  {
36  fill_default();
37  bool flip[3];
38  for (int i = 0; i < 3; ++i)
39  flip[i] = variant & (1<<i);
40  for (int i=0; i<N; i++)
41  if (li[i].codim()==1 && flip[li[i].subEntity()])
42  li[i].index(k-2-li[i].index());
43  }
44 
54  template<class VertexMap>
55  explicit Pk2DLocalCoefficients(const VertexMap &vertexmap) : li(N)
56  {
57  fill_default();
58  bool flip[3];
59  flip[0] = vertexmap[0] > vertexmap[1];
60  flip[1] = vertexmap[0] > vertexmap[2];
61  flip[2] = vertexmap[1] > vertexmap[2];
62  for (std::size_t i=0; i<N; i++)
63  if (li[i].codim()==1 && flip[li[i].subEntity()])
64  li[i].index(k-2-li[i].index());
65  }
66 
68  std::size_t size () const
69  {
70  return N;
71  }
72 
74  const LocalKey& localKey (std::size_t i) const
75  {
76  return li[i];
77  }
78 
79  private:
80  std::vector<LocalKey> li;
81 
82  void fill_default ()
83  {
84  if (k==0)
85  {
86  li[0] = LocalKey(0,0,0);
87  return;
88  }
89  int n=0;
90  int c=0;
91  for (unsigned int j=0; j<=k; j++)
92  for (unsigned int i=0; i<=k-j; i++)
93  {
94  if (i==0 && j==0)
95  {
96  li[n++] = LocalKey(0,2,0);
97  continue;
98  }
99  if (i==k && j==0)
100  {
101  li[n++] = LocalKey(1,2,0);
102  continue;
103  }
104  if (i==0 && j==k)
105  {
106  li[n++] = LocalKey(2,2,0);
107  continue;
108  }
109  if (j==0)
110  {
111  li[n++] = LocalKey(0,1,i-1);
112  continue;
113  }
114  if (i==0)
115  {
116  li[n++] = LocalKey(1,1,j-1);
117  continue;
118  }
119  if (i+j==k)
120  {
121  li[n++] = LocalKey(2,1,j-1);
122  continue;
123  }
124  li[n++] = LocalKey(0,0,c++);
125  }
126  }
127  };
128 
129 }
130 
131 #endif
Describe position of one degree of freedom.
Definition: localkey.hh:21
Layout map for P0 elements.
Definition: pk2dlocalcoefficients.hh:23
Pk2DLocalCoefficients()
Standard constructor.
Definition: pk2dlocalcoefficients.hh:28
const LocalKey & localKey(std::size_t i) const
get i'th index
Definition: pk2dlocalcoefficients.hh:74
std::size_t size() const
number of coefficients
Definition: pk2dlocalcoefficients.hh:68
Pk2DLocalCoefficients(const VertexMap &vertexmap)
Definition: pk2dlocalcoefficients.hh:55
Pk2DLocalCoefficients(int variant)
constructor for eight variants with order on edges flipped
Definition: pk2dlocalcoefficients.hh:34
Dune namespace.
Definition: alignedallocator.hh:10
Creative Commons License   |  Legal Statements / Impressum  |  Hosted by TU Dresden  |  generated with Hugo v0.80.0 (Apr 26, 22:29, 2024)