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