dune-localfunctions  2.2.1
refinedp1localbasis.hh
Go to the documentation of this file.
1 // -*- tab-width: 4; indent-tabs-mode: nil -*-
2 #ifndef DUNE_REFINED_P1_LOCALBASIS_HH
3 #define DUNE_REFINED_P1_LOCALBASIS_HH
4 
9 #include <dune/common/fmatrix.hh>
10 
12 
13 namespace Dune
14 {
15  template<class D, class R, int dim>
17  : public RefinedSimplexLocalBasis<D,dim>
18  {
19  public:
21  {
22  DUNE_THROW(Dune::NotImplemented,"RefinedP1LocalBasis not implemented for dim > 3.");
23  }
24  };
25 
49  template<class D, class R>
50  class RefinedP1LocalBasis<D,R,1>
51  : public RefinedSimplexLocalBasis<D,1>
52  {
53  public:
55  typedef LocalBasisTraits<D,1,Dune::FieldVector<D,1>,R,1,Dune::FieldVector<R,1>,
56  Dune::FieldMatrix<R,1,1> > Traits;
57 
59  unsigned int size () const
60  {
61  return 3;
62  }
63 
65  inline void evaluateFunction (const typename Traits::DomainType& in,
66  std::vector<typename Traits::RangeType>& out) const
67  {
68  out.resize(3);
69 
70  int subElement;
71  typename Traits::DomainType local;
72  this->getSubElement(in, subElement, local);
73 
74  switch (subElement) {
75  case 0:
76 
77  out[0] = 1 - local[0];
78  out[1] = local[0];
79  out[2] = 0;
80  break;
81 
82  case 1:
83 
84  out[0] = 0;
85  out[1] = 1 - local[0];
86  out[2] = local[0];
87  break;
88 
89  }
90 
91  }
92 
94  inline void
95  evaluateJacobian (const typename Traits::DomainType& in, // position
96  std::vector<typename Traits::JacobianType>& out) const // return value
97  {
98  out.resize(3);
99 
100  int subElement;
101  typename Traits::DomainType local;
102  this->getSubElement(in, subElement, local);
103 
104  switch (subElement) {
105  case 0:
106 
107  out[0][0][0] = -2;
108  out[1][0][0] = 2;
109  out[2][0][0] = 0;
110  break;
111 
112  case 1:
113 
114  out[0][0][0] = 0;
115  out[1][0][0] = -2;
116  out[2][0][0] = 2;
117  break;
118 
119  }
120 
121  }
122 
126  unsigned int order () const
127  {
128  return 1;
129  }
130 
131  };
132 
157  template<class D, class R>
158  class RefinedP1LocalBasis<D,R,2>
159  : public RefinedSimplexLocalBasis<D,2>
160  {
161  public:
163  typedef LocalBasisTraits<D,2,Dune::FieldVector<D,2>,R,1,Dune::FieldVector<R,1>,
164  Dune::FieldMatrix<R,1,2> > Traits;
165 
167  unsigned int size () const
168  {
169  return 6;
170  }
171 
173  inline void evaluateFunction (const typename Traits::DomainType& in,
174  std::vector<typename Traits::RangeType>& out) const
175  {
176  out.resize(6);
177 
178  int subElement;
179  typename Traits::DomainType local;
180  this->getSubElement(in, subElement, local);
181 
182  switch (subElement) {
183  case 0:
184 
185  out[0] = 1 - local[0] - local[1];
186  out[1] = local[0];
187  out[2] = 0;
188  out[3] = local[1];
189  out[4] = 0;
190  out[5] = 0;
191  break;
192 
193  case 1:
194 
195  out[0] = 0;
196  out[1] = 1 - local[0] - local[1];
197  out[2] = local[0];
198  out[3] = 0;
199  out[4] = local[1];
200  out[5] = 0;
201  break;
202 
203  case 2:
204 
205  out[0] = 0;
206  out[1] = 0;
207  out[2] = 0;
208  out[3] = 1 - local[0] - local[1];
209  out[4] = local[0];
210  out[5] = local[1];
211  break;
212  case 3:
213 
214  out[0] = 0;
215  out[1] = local[1];
216  out[2] = 0;
217  out[3] = local[0];
218  out[4] = 1 - local[0] - local[1];
219  out[5] = 0;
220  }
221 
222  }
223 
225  inline void
226  evaluateJacobian (const typename Traits::DomainType& in, // position
227  std::vector<typename Traits::JacobianType>& out) const // return value
228  {
229  out.resize(6);
230 
231  int subElement;
232  typename Traits::DomainType local;
233  this->getSubElement(in, subElement, local);
234 
235  switch (subElement) {
236  case 0:
237 
238  out[0][0][0] = -2; out[0][0][1] = -2;
239  out[1][0][0] = 2; out[1][0][1] = 0;
240  out[2][0][0] = 0; out[2][0][1] = 0;
241  out[3][0][0] = 0; out[3][0][1] = 2;
242  out[4][0][0] = 0; out[4][0][1] = 0;
243  out[5][0][0] = 0; out[5][0][1] = 0;
244  break;
245 
246  case 1:
247 
248  out[0][0][0] = 0; out[0][0][1] = 0;
249  out[1][0][0] = -2; out[1][0][1] = -2;
250  out[2][0][0] = 2; out[2][0][1] = 0;
251  out[3][0][0] = 0; out[3][0][1] = 0;
252  out[4][0][0] = 0; out[4][0][1] = 2;
253  out[5][0][0] = 0; out[5][0][1] = 0;
254  break;
255 
256  case 2:
257 
258  out[0][0][0] = 0; out[0][0][1] = 0;
259  out[1][0][0] = 0; out[1][0][1] = 0;
260  out[2][0][0] = 0; out[2][0][1] = 0;
261  out[3][0][0] = -2; out[3][0][1] = -2;
262  out[4][0][0] = 2; out[4][0][1] = 0;
263  out[5][0][0] = 0; out[5][0][1] = 2;
264  break;
265  case 3:
266 
267  out[0][0][0] = 0; out[0][0][1] = 0;
268  out[1][0][0] = 0; out[1][0][1] = -2;
269  out[2][0][0] = 0; out[2][0][1] = 0;
270  out[3][0][0] = -2; out[3][0][1] = 0;
271  out[4][0][0] = 2; out[4][0][1] = 2;
272  out[5][0][0] = 0; out[5][0][1] = 0;
273  }
274 
275  }
276 
280  unsigned int order () const
281  {
282  return 1;
283  }
284 
285  };
286 
315  template<class D, class R>
316  class RefinedP1LocalBasis<D,R,3>
317  : public RefinedSimplexLocalBasis<D,3>
318  {
319  public:
321  typedef LocalBasisTraits<D,3,Dune::FieldVector<D,3>,R,1,Dune::FieldVector<R,1>,
322  Dune::FieldMatrix<R,1,3> > Traits;
323 
325  unsigned int size () const
326  {
327  return 10;
328  }
329 
331  inline void evaluateFunction (const typename Traits::DomainType& in,
332  std::vector<typename Traits::RangeType>& out) const
333  {
334  out.resize(10);
335 
336  int subElement;
337  typename Traits::DomainType local;
338  this->getSubElement(in, subElement, local);
339 
340  switch (subElement) {
341  case 0:
342 
343  out[0] = 1 - local[0] - local[1] - local[2];
344  out[1] = local[0];
345  out[2] = 0;
346  out[3] = local[1];
347  out[4] = 0;
348  out[5] = 0;
349  out[6] = local[2];
350  out[7] = 0;
351  out[8] = 0;
352  out[9] = 0;
353  break;
354 
355  case 1:
356 
357  out[0] = 0;
358  out[1] = 1 - local[0] - local[1] -local[2];
359  out[2] = local[0];
360  out[3] = 0;
361  out[4] = local[1];
362  out[5] = 0;
363  out[6] = 0;
364  out[7] = local[2];
365  out[8] = 0;
366  out[9] = 0;
367  break;
368 
369  case 2:
370 
371  out[0] = 0;
372  out[1] = 0;
373  out[2] = 0;
374  out[3] = 1 - local[0] - local[1] -local[2];
375  out[4] = local[0];
376  out[5] = local[1];
377  out[6] = 0;
378  out[7] = 0;
379  out[8] = local[2];
380  out[9] = 0;
381  break;
382 
383  case 3:
384 
385  out[0] = 0;
386  out[1] = 0;
387  out[2] = 0;
388  out[3] = 0;
389  out[4] = 0;
390  out[5] = 0;
391  out[6] = 1 - local[0] - local[1] -local[2];
392  out[7] = local[0];
393  out[8] = local[1];
394  out[9] = local[2];
395  break;
396 
397  case 4:
398 
399  out[0] = 0;
400  out[1] = 1 - local[0] - local[1] -local[2];
401  out[2] = 0;
402  out[3] = local[0];
403  out[4] = 0;
404  out[5] = 0;
405  out[6] = local[1];
406  out[7] = local[2];
407  out[8] = 0;
408  out[9] = 0;
409  break;
410 
411  case 5:
412 
413  out[0] = 0;
414  out[1] = local[1];
415  out[2] = 0;
416  out[3] = local[0];
417  out[4] = 1 - local[0] - local[1] -local[2];
418  out[5] = 0;
419  out[6] = 0;
420  out[7] = local[2];
421  out[8] = 0;
422  out[9] = 0;
423  break;
424 
425  case 6:
426 
427  out[0] = 0;
428  out[1] = 0;
429  out[2] = 0;
430  out[3] = 1 - local[0] - local[1] -local[2];
431  out[4] = 0;
432  out[5] = 0;
433  out[6] = local[0];
434  out[7] = local[1];
435  out[8] = local[2];
436  out[9] = 0;
437  break;
438 
439  case 7:
440 
441  out[0] = 0;
442  out[1] = 0;
443  out[2] = 0;
444  out[3] = 1 - local[0] - local[1] -local[2];
445  out[4] = local[2];
446  out[5] = 0;
447  out[6] = 0;
448  out[7] = local[1];
449  out[8] = local[0];
450  out[9] = 0;
451  break;
452  }
453 
454  }
455 
457  inline void
458  evaluateJacobian (const typename Traits::DomainType& in, // position
459  std::vector<typename Traits::JacobianType>& out) const // return value
460  {
461  out.resize(10);
462 
463  int subElement;
464  typename Traits::DomainType local;
465  this->getSubElement(in, subElement, local);
466 
467  switch (subElement) {
468  case 0:
469 
470  out[0][0][0] = -2; out[0][0][1] = -2; out[0][0][2] = -2;
471  out[1][0][0] = 2; out[1][0][1] = 0; out[1][0][2] = 0;
472  out[2][0][0] = 0; out[2][0][1] = 0; out[2][0][2] = 0;
473  out[3][0][0] = 0; out[3][0][1] = 2; out[3][0][2] = 0;
474  out[4][0][0] = 0; out[4][0][1] = 0; out[4][0][2] = 0;
475  out[5][0][0] = 0; out[5][0][1] = 0; out[5][0][2] = 0;
476  out[6][0][0] = 0; out[6][0][1] = 0; out[6][0][2] = 2;
477  out[7][0][0] = 0; out[7][0][1] = 0; out[7][0][2] = 0;
478  out[8][0][0] = 0; out[8][0][1] = 0; out[8][0][2] = 0;
479  out[9][0][0] = 0; out[9][0][1] = 0; out[9][0][2] = 0;
480  break;
481 
482  case 1:
483 
484  out[0][0][0] = 0; out[0][0][1] = 0; out[0][0][2] = 0;
485  out[1][0][0] = -2; out[1][0][1] = -2; out[1][0][2] = -2;
486  out[2][0][0] = 2; out[2][0][1] = 0; out[2][0][2] = 0;
487  out[3][0][0] = 0; out[3][0][1] = 0; out[3][0][2] = 0;
488  out[4][0][0] = 0; out[4][0][1] = 2; out[4][0][2] = 0;
489  out[5][0][0] = 0; out[5][0][1] = 0; out[5][0][2] = 0;
490  out[6][0][0] = 0; out[6][0][1] = 0; out[6][0][2] = 0;
491  out[7][0][0] = 0; out[7][0][1] = 0; out[7][0][2] = 2;
492  out[8][0][0] = 0; out[8][0][1] = 0; out[8][0][2] = 0;
493  out[9][0][0] = 0; out[9][0][1] = 0; out[9][0][2] = 0;
494  break;
495 
496  case 2:
497 
498  out[0][0][0] = 0; out[0][0][1] = 0; out[0][0][2] = 0;
499  out[1][0][0] = 0; out[1][0][1] = 0; out[1][0][2] = 0;
500  out[2][0][0] = 0; out[2][0][1] = 0; out[2][0][2] = 0;
501  out[3][0][0] = -2; out[3][0][1] = -2; out[3][0][2] = -2;
502  out[4][0][0] = 2; out[4][0][1] = 0; out[4][0][2] = 0;
503  out[5][0][0] = 0; out[5][0][1] = 2; out[5][0][2] = 0;
504  out[6][0][0] = 0; out[6][0][1] = 0; out[6][0][2] = 0;
505  out[7][0][0] = 0; out[7][0][1] = 0; out[7][0][2] = 0;
506  out[8][0][0] = 0; out[8][0][1] = 0; out[8][0][2] = 2;
507  out[9][0][0] = 0; out[9][0][1] = 0; out[9][0][2] = 0;
508  break;
509 
510  case 3:
511 
512  out[0][0][0] = 0; out[0][0][1] = 0; out[0][0][2] = 0;
513  out[1][0][0] = 0; out[1][0][1] = 0; out[1][0][2] = 0;
514  out[2][0][0] = 0; out[2][0][1] = 0; out[2][0][2] = 0;
515  out[3][0][0] = 0; out[3][0][1] = 0; out[3][0][2] = 0;
516  out[4][0][0] = 0; out[4][0][1] = 0; out[4][0][2] = 0;
517  out[5][0][0] = 0; out[5][0][1] = 0; out[5][0][2] = 0;
518  out[6][0][0] = -2; out[6][0][1] = -2; out[6][0][2] = -2;
519  out[7][0][0] = 2; out[7][0][1] = 0; out[7][0][2] = 0;
520  out[8][0][0] = 0; out[8][0][1] = 2; out[8][0][2] = 0;
521  out[9][0][0] = 0; out[9][0][1] = 0; out[9][0][2] = 2;
522  break;
523 
524  case 4:
525 
526  out[0][0][0] = 0; out[0][0][1] = 0; out[0][0][2] = 0;
527  out[1][0][0] = 0; out[1][0][1] = -2; out[1][0][2] = -2;
528  out[2][0][0] = 0; out[2][0][1] = 0; out[2][0][2] = 0;
529  out[3][0][0] = 0; out[3][0][1] = 2; out[3][0][2] = 0;
530  out[4][0][0] = 0; out[4][0][1] = 0; out[4][0][2] = 0;
531  out[5][0][0] = 0; out[5][0][1] = 0; out[5][0][2] = 0;
532  out[6][0][0] = -2; out[6][0][1] = -2; out[6][0][2] = 0;
533  out[7][0][0] = 2; out[7][0][1] = 2; out[7][0][2] = 2;
534  out[8][0][0] = 0; out[8][0][1] = 0; out[8][0][2] = 0;
535  out[9][0][0] = 0; out[9][0][1] = 0; out[9][0][2] = 0;
536  break;
537 
538  case 5:
539 
540  out[0][0][0] = 0; out[0][0][1] = 0; out[0][0][2] = 0;
541  out[1][0][0] = 0; out[1][0][1] = -2; out[1][0][2] = -2;
542  out[2][0][0] = 0; out[2][0][1] = 0; out[2][0][2] = 0;
543  out[3][0][0] = -2; out[3][0][1] = 0; out[3][0][2] = 0;
544  out[4][0][0] = 2; out[4][0][1] = 2; out[4][0][2] = 0;
545  out[5][0][0] = 0; out[5][0][1] = 0; out[5][0][2] = 0;
546  out[6][0][0] = 0; out[6][0][1] = 0; out[6][0][2] = 0;
547  out[7][0][0] = 0; out[7][0][1] = 0; out[7][0][2] = 2;
548  out[8][0][0] = 0; out[8][0][1] = 0; out[8][0][2] = 0;
549  out[9][0][0] = 0; out[9][0][1] = 0; out[9][0][2] = 0;
550  break;
551 
552  case 6:
553 
554  out[0][0][0] = 0; out[0][0][1] = 0; out[0][0][2] = 0;
555  out[1][0][0] = 0; out[1][0][1] = 0; out[1][0][2] = 0;
556  out[2][0][0] = 0; out[2][0][1] = 0; out[2][0][2] = 0;
557  out[3][0][0] = 0; out[3][0][1] = 0; out[3][0][2] = -2;
558  out[4][0][0] = 0; out[4][0][1] = 0; out[4][0][2] = 0;
559  out[5][0][0] = 0; out[5][0][1] = 0; out[5][0][2] = 0;
560  out[6][0][0] = -2; out[6][0][1] = -2; out[6][0][2] = 0;
561  out[7][0][0] = 2; out[7][0][1] = 0; out[7][0][2] = 0;
562  out[8][0][0] = 0; out[8][0][1] = 2; out[8][0][2] = 2;
563  out[9][0][0] = 0; out[9][0][1] = 0; out[9][0][2] = 0;
564  break;
565 
566  case 7:
567 
568  out[0][0][0] = 0; out[0][0][1] = 0; out[0][0][2] = 0;
569  out[1][0][0] = 0; out[1][0][1] = 0; out[1][0][2] = 0;
570  out[2][0][0] = 0; out[2][0][1] = 0; out[2][0][2] = 0;
571  out[3][0][0] = -2; out[3][0][1] = -2; out[3][0][2] = -2;
572  out[4][0][0] = 2; out[4][0][1] = 2; out[4][0][2] = 0;
573  out[5][0][0] = 0; out[5][0][1] = 0; out[5][0][2] = 0;
574  out[6][0][0] = 0; out[6][0][1] = 0; out[6][0][2] = 0;
575  out[7][0][0] = 0; out[7][0][1] = -2; out[7][0][2] = 0;
576  out[8][0][0] = 0; out[8][0][1] = 2; out[8][0][2] = 2;
577  out[9][0][0] = 0; out[9][0][1] = 0; out[9][0][2] = 0;
578  break;
579  }
580  }
581 
582 
586  unsigned int order () const
587  {
588  return 1;
589  }
590 
591  };
592 }
593 #endif