dune-localfunctions  2.4.1
hierarchicalsimplexp2withelementbubble.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_HIERARCHICAL_SIMPLEX_P2_WITH_ELEMENT_BUBBLE_LOCALBASIS_HH
4 #define DUNE_HIERARCHICAL_SIMPLEX_P2_WITH_ELEMENT_BUBBLE_LOCALBASIS_HH
5 
10 #include <vector>
11 #include <dune/common/fvector.hh>
12 #include <dune/common/fmatrix.hh>
13 
16 
17 namespace Dune
18 {
19  template<class D, class R, int dim>
21  {
22  public:
24  {
25  DUNE_THROW(Dune::NotImplemented,"HierarchicalSimplexP2LocalBasis not implemented for dim > 3.");
26  }
27  };
28 
43  template<class D, class R>
45  {
46  public:
48  typedef LocalBasisTraits<D,1,Dune::FieldVector<D,1>,R,1,Dune::FieldVector<R,1>,
49  Dune::FieldMatrix<R,1,1> > Traits;
50 
52  unsigned int size () const
53  {
54  return 3;
55  }
56 
58  inline void evaluateFunction (const typename Traits::DomainType& in,
59  std::vector<typename Traits::RangeType>& out) const
60  {
61  out.resize(3);
62 
63  out[0] = 1-in[0];
64  out[1] = in[0];
65  out[2] = 1-4*(in[0]-0.5)*(in[0]-0.5);
66  }
67 
69  inline void
70  evaluateJacobian (const typename Traits::DomainType& in, // position
71  std::vector<typename Traits::JacobianType>& out) const // return value
72  {
73  out.resize(3);
74 
75  out[0][0][0] = -1;
76  out[1][0][0] = 1;
77  out[2][0][0] = 4-8*in[0];
78  }
79 
82  unsigned int order () const
83  {
84  return 2;
85  }
86 
87  };
88 
109  template<class D, class R>
111  {
112  public:
114  typedef LocalBasisTraits<D,2,Dune::FieldVector<D,2>,R,1,Dune::FieldVector<R,1>,
115  Dune::FieldMatrix<R,1,2> > Traits;
116 
118  unsigned int size () const
119  {
120  return 7;
121  }
122 
124  inline void evaluateFunction (const typename Traits::DomainType& in,
125  std::vector<typename Traits::RangeType>& out) const
126  {
127  out.resize(7);
128 
129  out[0] = 1 - in[0] - in[1];
130  out[1] = 4*in[0]*(1-in[0]-in[1]);
131  out[2] = in[0];
132  out[3] = 4*in[1]*(1-in[0]-in[1]);
133  out[4] = 4*in[0]*in[1];
134  out[5] = in[1];
135  out[6] = 27*in[0]*in[1]*(1-in[0]-in[1]);
136 
137  }
138 
140  inline void
141  evaluateJacobian (const typename Traits::DomainType& in, // position
142  std::vector<typename Traits::JacobianType>& out) const // return value
143  {
144  out.resize(7);
145 
146  out[0][0][0] = -1; out[0][0][1] = -1;
147  out[1][0][0] = 4-8*in[0]-4*in[1]; out[1][0][1] = -4*in[0];
148  out[2][0][0] = 1; out[2][0][1] = 0;
149  out[3][0][0] = -4*in[1]; out[3][0][1] = 4-4*in[0]-8*in[1];
150  out[4][0][0] = 4*in[1]; out[4][0][1] = 4*in[0];
151  out[5][0][0] = 0; out[5][0][1] = 1;
152 
153  // Cubic bubble
154  out[6][0][0] = 27 * in[1] * (1 - 2*in[0] - in[1]);
155  out[6][0][1] = 27 * in[0] * (1 - 2*in[1] - in[0]);
156 
157  }
158 
161  unsigned int order () const
162  {
163  return 3;
164  }
165 
166  };
167 
192  template<class D, class R>
194  {
195  public:
197  typedef LocalBasisTraits<D,3,Dune::FieldVector<D,3>,R,1,Dune::FieldVector<R,1>,
198  Dune::FieldMatrix<R,1,3> > Traits;
199 
201  unsigned int size () const
202  {
203  return 11;
204  }
205 
207  void evaluateFunction (const typename Traits::DomainType& in,
208  std::vector<typename Traits::RangeType>& out) const
209  {
210  out.resize(10);
211 
212  out[0] = 1 - in[0] - in[1] - in[2];
213  out[1] = 4 * in[0] * (1 - in[0] - in[1] - in[2]);
214  out[2] = in[0];
215  out[3] = 4 * in[1] * (1 - in[0] - in[1] - in[2]);
216  out[4] = 4 * in[0] * in[1];
217  out[5] = in[1];
218  out[6] = 4 * in[2] * (1 - in[0] - in[1] - in[2]);
219  out[7] = 4 * in[0] * in[2];
220  out[8] = 4 * in[1] * in[2];
221  out[9] = in[2];
222 
223  // quartic element bubble
224  out[10] = 81*in[0]*in[1]*in[2]*(1-in[0]-in[1]-in[2]);
225  }
226 
228  void evaluateJacobian (const typename Traits::DomainType& in, // position
229  std::vector<typename Traits::JacobianType>& out) const // return value
230  {
231  out.resize(10);
232 
233  out[0][0][0] = -1; out[0][0][1] = -1; out[0][0][2] = -1;
234  out[1][0][0] = 4-8*in[0]-4*in[1]-4*in[2]; out[1][0][1] = -4*in[0]; out[1][0][2] = -4*in[0];
235  out[2][0][0] = 1; out[2][0][1] = 0; out[2][0][2] = 0;
236  out[3][0][0] = -4*in[1]; out[3][0][1] = 4-4*in[0]-8*in[1]-4*in[2]; out[3][0][2] = -4*in[1];
237  out[4][0][0] = 4*in[1]; out[4][0][1] = 4*in[0]; out[4][0][2] = 0;
238  out[5][0][0] = 0; out[5][0][1] = 1; out[5][0][2] = 0;
239  out[6][0][0] = -4*in[2]; out[6][0][1] = -4*in[2]; out[6][0][2] = 4-4*in[0]-4*in[1]-8*in[2];
240  out[7][0][0] = 4*in[2]; out[7][0][1] = 0; out[7][0][2] = 4*in[0];
241  out[8][0][0] = 0; out[8][0][1] = 4*in[2]; out[8][0][2] = 4*in[1];
242  out[9][0][0] = 0; out[9][0][1] = 0; out[9][0][2] = 1;
243 
244  out[10][0][0] = 81 * in[1] * in[2] * (1 - 2*in[0] - in[1] - in[2]);
245  out[10][0][1] = 81 * in[0] * in[2] * (1 - in[0] - 2*in[1] - in[2]);
246  out[10][0][2] = 81 * in[0] * in[1] * (1 - in[0] - in[1] - 2*in[2]);
247  }
248 
249 
252  unsigned int order () const
253  {
254  return 4;
255  }
256 
257  };
258 
259 
285  template <int dim>
287  {
288  // The binomial coefficient: dim+1 over 1
289  static const int numVertices = dim+1;
290 
291  // The binomial coefficient: dim+1 over 2
292  static const int numEdges = (dim+1)*dim / 2;
293 
294  public:
297  : li(numVertices+numEdges + 1)
298  {
299  if (dim!=2)
300  DUNE_THROW(NotImplemented, "only for 2d");
301 
302  li[0] = Dune::LocalKey(0,2,0); // Vertex (0,0)
303  li[1] = Dune::LocalKey(0,1,0); // Edge (0.5, 0)
304  li[2] = Dune::LocalKey(1,2,0); // Vertex (1,0)
305  li[3] = Dune::LocalKey(1,1,0); // Edge (0, 0.5)
306  li[4] = Dune::LocalKey(2,1,0); // Edge (0.5, 0.5)
307  li[5] = Dune::LocalKey(2,2,0); // Vertex (0,1)
308  li[6] = Dune::LocalKey(0,0,0); // Element (1/3, 1/3)
309  }
310 
312  size_t size () const
313  {
314  return numVertices+numEdges + 1;
315  }
316 
318  const Dune::LocalKey& localKey (size_t i) const
319  {
320  return li[i];
321  }
322 
323  private:
324  std::vector<Dune::LocalKey> li;
325  };
326 
327  template<class LB>
329  {
330  public:
331 
333  template<typename F, typename C>
334  void interpolate (const F& f, std::vector<C>& out) const
335  {
336  typename LB::Traits::DomainType x;
337  typename LB::Traits::RangeType y;
338 
339  out.resize(7);
340 
341  // vertices
342  x[0] = 0.0; x[1] = 0.0; f.evaluate(x,y); out[0] = y;
343  x[0] = 1.0; x[1] = 0.0; f.evaluate(x,y); out[2] = y;
344  x[0] = 0.0; x[1] = 1.0; f.evaluate(x,y); out[5] = y;
345 
346  // edge bubbles
347  x[0] = 0.5; x[1] = 0.0; f.evaluate(x,y);
348  out[1] = y - out[0]*(1-x[0]) - out[2]*x[0];
349 
350  x[0] = 0.0; x[1] = 0.5; f.evaluate(x,y);
351  out[3] = y - out[0]*(1-x[1]) - out[5]*x[1];
352 
353  x[0] = 0.5; x[1] = 0.5; f.evaluate(x,y);
354  out[4] = y - out[2]*x[0] - out[5]*x[1];
355 
356  // element bubble
357  x[0] = 1.0/3; x[1] = 1.0/3; f.evaluate(x,y);
358 
361  std::vector<typename LB::Traits::RangeType> sfValues;
362  shapeFunctions.evaluateFunction(x, sfValues);
363 
364  out[6] = y;
365  for (int i=0; i<6; i++)
366  out[6] -= out[i]*sfValues[i];
367 
368  }
369 
370  };
371 
372 
373 }
374 #endif
Definition: hierarchicalsimplexp2withelementbubble.hh:328
void evaluateFunction(const typename Traits::DomainType &in, std::vector< typename Traits::RangeType > &out) const
Evaluate all shape functions.
Definition: hierarchicalsimplexp2withelementbubble.hh:58
size_t size() const
number of coefficients
Definition: hierarchicalsimplexp2withelementbubble.hh:312
void interpolate(const F &f, std::vector< C > &out) const
Local interpolation of a function.
Definition: hierarchicalsimplexp2withelementbubble.hh:334
The local finite element needed for the Zou-Kornhuber estimator for Signorini problems.
Definition: hierarchicalsimplexp2withelementbubble.hh:286
void evaluateFunction(const typename Traits::DomainType &in, std::vector< typename Traits::RangeType > &out) const
Evaluate all shape functions.
Definition: hierarchicalsimplexp2withelementbubble.hh:207
Definition: brezzidouglasmarini1cube2dlocalbasis.hh:14
unsigned int size() const
number of shape functions
Definition: hierarchicalsimplexp2withelementbubble.hh:52
void evaluateJacobian(const typename Traits::DomainType &in, std::vector< typename Traits::JacobianType > &out) const
Evaluate Jacobian of all shape functions.
Definition: hierarchicalsimplexp2withelementbubble.hh:70
HierarchicalSimplexP2WithElementBubbleLocalBasis()
Definition: hierarchicalsimplexp2withelementbubble.hh:23
unsigned int size() const
number of shape functions
Definition: hierarchicalsimplexp2withelementbubble.hh:118
unsigned int order() const
Polynomial order of the shape functions (4 in this case)
Definition: hierarchicalsimplexp2withelementbubble.hh:252
LocalBasisTraits< D, 3, Dune::FieldVector< D, 3 >, R, 1, Dune::FieldVector< R, 1 >, Dune::FieldMatrix< R, 1, 3 > > Traits
export type traits for function signature
Definition: hierarchicalsimplexp2withelementbubble.hh:198
void evaluateJacobian(const typename Traits::DomainType &in, std::vector< typename Traits::JacobianType > &out) const
Evaluate Jacobian of all shape functions.
Definition: hierarchicalsimplexp2withelementbubble.hh:228
unsigned int order() const
Polynomial order of the shape functions (3 in this case)
Definition: hierarchicalsimplexp2withelementbubble.hh:161
Type traits for LocalBasisVirtualInterface.
Definition: localbasis.hh:37
LocalBasisTraits< D, 2, Dune::FieldVector< D, 2 >, R, 1, Dune::FieldVector< R, 1 >, Dune::FieldMatrix< R, 1, 2 > > Traits
export type traits for function signature
Definition: hierarchicalsimplexp2withelementbubble.hh:115
unsigned int size() const
number of shape functions
Definition: hierarchicalsimplexp2withelementbubble.hh:201
const Dune::LocalKey & localKey(size_t i) const
get i'th index
Definition: hierarchicalsimplexp2withelementbubble.hh:318
LocalBasisTraits< D, 1, Dune::FieldVector< D, 1 >, R, 1, Dune::FieldVector< R, 1 >, Dune::FieldMatrix< R, 1, 1 > > Traits
export type traits for function signature
Definition: hierarchicalsimplexp2withelementbubble.hh:49
D DomainType
domain type
Definition: localbasis.hh:49
void evaluateJacobian(const typename Traits::DomainType &in, std::vector< typename Traits::JacobianType > &out) const
Evaluate Jacobian of all shape functions.
Definition: hierarchicalsimplexp2withelementbubble.hh:141
void evaluateFunction(const typename Traits::DomainType &in, std::vector< typename Traits::RangeType > &out) const
Evaluate all shape functions.
Definition: hierarchicalsimplexp2withelementbubble.hh:124
Describe position of one degree of freedom.
Definition: localkey.hh:21
Definition: hierarchicalsimplexp2withelementbubble.hh:20
HierarchicalSimplexP2WithElementBubbleLocalCoefficients()
Standard constructor.
Definition: hierarchicalsimplexp2withelementbubble.hh:296
unsigned int order() const
Polynomial order of the shape functions (2, in this case)
Definition: hierarchicalsimplexp2withelementbubble.hh:82