dune-localfunctions  2.2.0
raviartthomas1q2dlocalbasis.hh
Go to the documentation of this file.
00001 #ifndef DUNE_LOCALFUNCTIONS_RAVIARTTHOMAS1Q2DLOCALBASIS_HH
00002 #define DUNE_LOCALFUNCTIONS_RAVIARTTHOMAS1Q2DLOCALBASIS_HH
00003 
00004 #include <vector>
00005 
00006 #include <dune/common/fmatrix.hh>
00007 
00008 #include "../../common/localbasis.hh"
00009 
00010 namespace Dune 
00011 {
00021   template<class D, class R>
00022   class RT1Q2DLocalBasis
00023   {
00024 
00025 public:
00026     typedef LocalBasisTraits<D,2,Dune::FieldVector<D,2>,R,2,Dune::FieldVector<R,2>,
00027                              Dune::FieldMatrix<R,2,2> > Traits;
00028 
00030     RT1Q2DLocalBasis ()
00031     {
00032       sign0 = sign1 = sign2 = sign3 = 1.0;
00033     }
00034 
00040     RT1Q2DLocalBasis (unsigned int s)
00041     {
00042       sign0 = sign1 = sign2 = sign3 = 1.0;
00043       if (s & 1)
00044       {
00045         sign0 = -1.0;
00046       }
00047       if (s & 2)
00048       {
00049         sign1 = -1.0;
00050       }
00051       if (s & 4)
00052       {
00053         sign2 = -1.0;
00054       }
00055       if (s & 8)
00056       {
00057         sign3 = -1.0;
00058       }
00059     }
00060 
00062     unsigned int size () const
00063     {
00064       return 12;
00065     }
00066 
00073     inline void evaluateFunction (const typename Traits::DomainType& in,
00074                                   std::vector<typename Traits::RangeType>& out) const
00075     { 
00076       out.resize(12);
00077       
00078       out[0][0] = sign0*(-1.0 + 4.0*in[0]-3*in[0]*in[0]);
00079       out[0][1] = 0.0;
00080       out[1][0] = 3.0 - 12.0*in[0] - 6.0*in[1] + 24.0*in[0]*in[1]+9*in[0]*in[0] - 18.0*in[0]*in[0]*in[1];
00081       out[1][1] = 0.0;
00082       out[2][0] = sign1*(-2.0*in[0] + 3.0*in[0]*in[0]);
00083       out[2][1] = 0.0;
00084       out[3][0] = -6.0*in[0] + 12.0*in[0]*in[1] + 9.0*in[0]*in[0] - 18.0*in[0]*in[0]*in[1];
00085       out[3][1] = 0.0;
00086       out[4][0] = 0.0;
00087       out[4][1] = sign2*(-1.0 + 4.0*in[1] - 3.0*in[1]*in[1]);
00088       out[5][0] = 0.0;
00089       out[5][1] = -3.0 + 6.0*in[0] + 12.0*in[1] - 24.0*in[0]*in[1] - 9.0*in[1]*in[1] + 18.0*in[0]*in[1]*in[1];
00090       out[6][0] = 0.0;
00091       out[6][1] = sign3*(-2.0*in[1] + 3.0*in[1]*in[1]);
00092       out[7][0] = 0.0;
00093       out[7][1] = 6.0*in[1] - 12.0*in[0]*in[1] - 9.0*in[1]*in[1] + 18.0*in[0]*in[1]*in[1];
00094       out[8][0] = 24.0*in[0] - 36.0*in[0]*in[1] - 24.0*in[0]*in[0] + 36.0*in[0]*in[0]*in[1];
00095       out[8][1] = 0.0;
00096       out[9][0] = 0.0;
00097       out[9][1] = 24.0*in[1] - 36.0*in[0]*in[1] - 24.0*in[1]*in[1] + 36.0*in[0]*in[1]*in[1];
00098       out[10][0] = -36.0*in[0] + 72.0*in[0]*in[1] + 36.0*in[0]*in[0] - 72.0*in[0]*in[0]*in[1];
00099       out[10][1] = 0.0;
00100       out[11][0] = 0.0;
00101       out[11][1] = -36.0*in[1] + 72.0*in[0]*in[1] + 36*in[1]*in[1] - 72.0*in[0]*in[1]*in[1];
00102     }
00103 
00110     inline void evaluateJacobian (const typename Traits::DomainType& in,
00111                                   std::vector<typename Traits::JacobianType>& out) const
00112     {  
00113       out.resize(12);
00114 
00115       out[0][0][0] = sign0*(4.0 - 6.0*in[0]);
00116       out[0][0][1] = 0.0;
00117       out[0][1][0] = 0.0;
00118       out[0][1][1] = 0.0;
00119       
00120       out[1][0][0] = -12.0 + 24.0*in[1] + 18.0*in[0] - 36.0*in[0]*in[1];
00121       out[1][0][1] = -6 + 24.0*in[0] - 18.0*in[0]*in[0];
00122       out[1][1][0] = 0.0;
00123       out[1][1][1] = 0.0;
00124       
00125       out[2][0][0] = sign1*(-2.0 + 6.0*in[0]);
00126       out[2][0][1] = 0.0;
00127       out[2][1][0] = 0.0;
00128       out[2][1][1] = 0.0;
00129       
00130       out[3][0][0] = -6.0 + 12.0*in[1] + 18.0*in[0] - 36.0*in[0]*in[1];
00131       out[3][0][1] = 12.0*in[0] - 18.0*in[0]*in[0];
00132       out[3][1][0] = 0.0;
00133       out[3][1][1] = 0.0;
00134       
00135       out[4][0][0] = 0.0;
00136       out[4][0][1] = 0.0;
00137       out[4][1][0] = 0.0;
00138       out[4][1][1] = sign2*(4.0 - 6.0*in[1]);
00139       
00140       out[5][0][0] = 0.0;
00141       out[5][0][1] = 0.0;
00142       out[5][1][0] = 6.0 - 24.0*in[1] + 18.0*in[1]*in[1];
00143       out[5][1][1] = 12.0 - 24.0*in[0] - 18.0*in[1] + 36.0*in[0]*in[1];
00144       
00145       out[6][0][0] = 0.0;
00146       out[6][0][1] = 0.0;
00147       out[6][1][0] = 0.0;
00148       out[6][1][1] = sign3*(-2.0 + 6.0*in[1]);
00149       
00150       out[7][0][0] = 0.0;
00151       out[7][0][1] = 0.0;
00152       out[7][1][0] = -12.0*in[1] + 18.0*in[1]*in[1];
00153       out[7][1][1] = 6.0 - 12.0*in[0] - 18.0*in[1] + 36.0*in[1]*in[0];
00154 
00155       out[8][0][0] = 24.0 - 36.0*in[1] - 48.0*in[0] + 72.0*in[0]*in[1];
00156       out[8][0][1] = -36.0*in[0] + 36.0*in[0]*in[0];
00157       out[8][1][0] = 0.0;
00158       out[8][1][1] = 0.0;
00159       
00160       out[9][0][0] = 0.0;
00161       out[9][0][1] = 0.0;
00162       out[9][1][0] = -36.0*in[1] + 36.0*in[1]*in[1];
00163       out[9][1][1] = 24.0 - 36.0*in[0] - 48.0*in[1] + 72.0*in[0]*in[1];
00164       
00165       out[10][0][0] = -36.0 + 72.0*in[1] + 72.0*in[0] - 144.0*in[0]*in[1];
00166       out[10][0][1] = 72.0*in[0] - 72.0*in[0]*in[0];
00167       out[10][1][0] = 0.0;
00168       out[10][1][1] = 0.0;
00169       
00170       out[11][0][0] = 0.0;
00171       out[11][0][1] = 0.0;
00172       out[11][1][0] = 72.0*in[1] - 72.0*in[1]*in[1];
00173       out[11][1][1] = -36.0 + 72.0*in[0] + 72.0*in[1] - 144.0*in[0]*in[1];
00174     }
00175 
00177     unsigned int order () const
00178     {
00179       return 3;
00180     }
00181 
00182 private:
00183     R sign0, sign1, sign2, sign3;
00184   };
00185 }
00186 #endif // DUNE_LOCALFUNCTIONS_RAVIARTTHOMAS1Q2DLOCALBASIS_HH