dune-localfunctions  2.2.1
hierarchicalsimplexp2localbasis.hh
Go to the documentation of this file.
1 // -*- tab-width: 4; indent-tabs-mode: nil -*-
2 #ifndef DUNE_HIERARCHICAL_SIMPLEX_P2_LOCALBASIS_HH
3 #define DUNE_HIERARCHICAL_SIMPLEX_P2_LOCALBASIS_HH
4 
9 #include <dune/common/fvector.hh>
10 #include <dune/common/fmatrix.hh>
11 
13 
14 namespace Dune
15 {
16  template<class D, class R, int dim>
18  {
19  public:
21  {
22  DUNE_THROW(Dune::NotImplemented,"HierarchicalSimplexP2LocalBasis not implemented for dim > 3.");
23  }
24  };
25 
40  template<class D, class R>
42  {
43  public:
45  typedef LocalBasisTraits<D,1,Dune::FieldVector<D,1>,R,1,Dune::FieldVector<R,1>,
46  Dune::FieldMatrix<R,1,1> > Traits;
47 
49  unsigned int size () const
50  {
51  return 3;
52  }
53 
55  inline void evaluateFunction (const typename Traits::DomainType& in,
56  std::vector<typename Traits::RangeType>& out) const
57  {
58  out.resize(3);
59 
60  out[0] = 1-in[0];
61  out[1] = in[0];
62  out[2] = 1-4*(in[0]-0.5)*(in[0]-0.5);
63  }
64 
66  inline void
67  evaluateJacobian (const typename Traits::DomainType& in, // position
68  std::vector<typename Traits::JacobianType>& out) const // return value
69  {
70  out.resize(3);
71 
72  out[0][0][0] = -1;
73  out[1][0][0] = 1;
74  out[2][0][0] = 4-8*in[0];
75  }
76 
79  unsigned int order () const
80  {
81  return 2;
82  }
83 
84  };
85 
105  template<class D, class R>
107  {
108  public:
110  typedef LocalBasisTraits<D,2,Dune::FieldVector<D,2>,R,1,Dune::FieldVector<R,1>,
111  Dune::FieldMatrix<R,1,2> > Traits;
112 
114  unsigned int size () const
115  {
116  return 6;
117  }
118 
120  inline void evaluateFunction (const typename Traits::DomainType& in,
121  std::vector<typename Traits::RangeType>& out) const
122  {
123  out.resize(6);
124 
125  out[0] = 1 - in[0] - in[1];
126  out[1] = 4*in[0]*(1-in[0]-in[1]);
127  out[2] = in[0];
128  out[3] = 4*in[1]*(1-in[0]-in[1]);
129  out[4] = 4*in[0]*in[1];
130  out[5] = in[1];
131 
132  }
133 
135  inline void
136  evaluateJacobian (const typename Traits::DomainType& in, // position
137  std::vector<typename Traits::JacobianType>& out) const // return value
138  {
139  out.resize(6);
140 
141  out[0][0][0] = -1; out[0][0][1] = -1;
142  out[1][0][0] = 4-8*in[0]-4*in[1]; out[1][0][1] = -4*in[0];
143  out[2][0][0] = 1; out[2][0][1] = 0;
144  out[3][0][0] = -4*in[1]; out[3][0][1] = 4-4*in[0]-8*in[1];
145  out[4][0][0] = 4*in[1]; out[4][0][1] = 4*in[0];
146  out[5][0][0] = 0; out[5][0][1] = 1;
147  }
148 
151  unsigned int order () const
152  {
153  return 2;
154  }
155 
156  };
157 
181  template<class D, class R>
183  {
184  public:
186  typedef LocalBasisTraits<D,3,Dune::FieldVector<D,3>,R,1,Dune::FieldVector<R,1>,
187  Dune::FieldMatrix<R,1,3> > Traits;
188 
190  unsigned int size () const
191  {
192  return 10;
193  }
194 
196  void evaluateFunction (const typename Traits::DomainType& in,
197  std::vector<typename Traits::RangeType>& out) const
198  {
199  out.resize(10);
200 
201  out[0] = 1 - in[0] - in[1] - in[2];
202  out[1] = 4 * in[0] * (1 - in[0] - in[1] - in[2]);
203  out[2] = in[0];
204  out[3] = 4 * in[1] * (1 - in[0] - in[1] - in[2]);
205  out[4] = 4 * in[0] * in[1];
206  out[5] = in[1];
207  out[6] = 4 * in[2] * (1 - in[0] - in[1] - in[2]);
208  out[7] = 4 * in[0] * in[2];
209  out[8] = 4 * in[1] * in[2];
210  out[9] = in[2];
211  }
212 
214  void evaluateJacobian (const typename Traits::DomainType& in, // position
215  std::vector<typename Traits::JacobianType>& out) const // return value
216  {
217  out.resize(10);
218 
219  out[0][0][0] = -1; out[0][0][1] = -1; out[0][0][2] = -1;
220  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];
221  out[2][0][0] = 1; out[2][0][1] = 0; out[2][0][2] = 0;
222  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];
223  out[4][0][0] = 4*in[1]; out[4][0][1] = 4*in[0]; out[4][0][2] = 0;
224  out[5][0][0] = 0; out[5][0][1] = 1; out[5][0][2] = 0;
225  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];
226  out[7][0][0] = 4*in[2]; out[7][0][1] = 0; out[7][0][2] = 4*in[0];
227  out[8][0][0] = 0; out[8][0][1] = 4*in[2]; out[8][0][2] = 4*in[1];
228  out[9][0][0] = 0; out[9][0][1] = 0; out[9][0][2] = 1;
229  }
230 
231 
234  unsigned int order () const
235  {
236  return 2;
237  }
238 
239  };
240 }
241 #endif