hierarchicalsimplexp2localbasis.hh

Go to the documentation of this file.
00001 // -*- tab-width: 4; indent-tabs-mode: nil -*-
00002 #ifndef DUNE_HIERARCHICAL_SIMPLEX_P2_LOCALBASIS_HH
00003 #define DUNE_HIERARCHICAL_SIMPLEX_P2_LOCALBASIS_HH
00004 
00009 #include <dune/common/fvector.hh>
00010 #include <dune/common/fmatrix.hh>
00011 
00012 #include <dune/localfunctions/common/localbasis.hh>
00013 
00014 namespace Dune
00015 {
00016   template<class D, class R, int dim>
00017   class HierarchicalSimplexP2LocalBasis
00018   {
00019     public:
00020         HierarchicalSimplexP2LocalBasis()
00021         {
00022             DUNE_THROW(Dune::NotImplemented,"HierarchicalSimplexP2LocalBasis not implemented for dim > 3.");
00023         }
00024   };
00025 
00040   template<class D, class R>
00041   class HierarchicalSimplexP2LocalBasis<D,R,1>
00042   {
00043   public:
00045     typedef LocalBasisTraits<D,1,Dune::FieldVector<D,1>,R,1,Dune::FieldVector<R,1>,
00046                                Dune::FieldMatrix<R,1,1> > Traits;
00047 
00049     unsigned int size () const
00050     {
00051       return 3;
00052     }
00053 
00055     inline void evaluateFunction (const typename Traits::DomainType& in,
00056                                   std::vector<typename Traits::RangeType>& out) const
00057     { 
00058       out.resize(3);
00059 
00060       out[0] = 1-in[0];
00061       out[1] = in[0];
00062       out[2] = 1-4*(in[0]-0.5)*(in[0]-0.5);
00063     }
00064 
00066     inline void 
00067     evaluateJacobian (const typename Traits::DomainType& in,         // position
00068                       std::vector<typename Traits::JacobianType>& out) const      // return value
00069     {  
00070       out.resize(3);
00071 
00072       out[0][0][0] = -1;
00073       out[1][0][0] =  1;
00074       out[2][0][0] = 4-8*in[0];
00075     }
00076 
00079     unsigned int order () const
00080     {
00081       return 2;
00082     }
00083 
00084   };
00085 
00105   template<class D, class R>
00106   class HierarchicalSimplexP2LocalBasis<D,R,2>
00107   {
00108   public:
00110     typedef LocalBasisTraits<D,2,Dune::FieldVector<D,2>,R,1,Dune::FieldVector<R,1>,
00111                                Dune::FieldMatrix<R,1,2> > Traits;
00112 
00114     unsigned int size () const
00115     {
00116       return 6;
00117     }
00118 
00120     inline void evaluateFunction (const typename Traits::DomainType& in,
00121                                   std::vector<typename Traits::RangeType>& out) const
00122     { 
00123       out.resize(6);
00124 
00125       out[0] = 1 - in[0] - in[1];
00126       out[1] = 4*in[0]*(1-in[0]-in[1]);
00127       out[2] = in[0];
00128       out[3] = 4*in[1]*(1-in[0]-in[1]);
00129       out[4] = 4*in[0]*in[1];
00130       out[5] = in[1];
00131 
00132     }
00133 
00135     inline void 
00136     evaluateJacobian (const typename Traits::DomainType& in,         // position
00137                       std::vector<typename Traits::JacobianType>& out) const      // return value
00138     {  
00139       out.resize(6);
00140 
00141       out[0][0][0] = -1;                    out[0][0][1] = -1;
00142       out[1][0][0] =  4-8*in[0]-4*in[1];    out[1][0][1] = -4*in[0];
00143       out[2][0][0] =  1;                    out[2][0][1] =  0;
00144       out[3][0][0] = -4*in[1];              out[3][0][1] =  4-4*in[0]-8*in[1];
00145       out[4][0][0] =  4*in[1];              out[4][0][1] =  4*in[0];
00146       out[5][0][0] =  0;                    out[5][0][1] =  1;
00147     }
00148 
00151     unsigned int order () const
00152     {
00153       return 2;
00154     }
00155 
00156   };
00157 
00181   template<class D, class R>
00182   class HierarchicalSimplexP2LocalBasis<D,R,3>
00183   {
00184   public:
00186     typedef LocalBasisTraits<D,3,Dune::FieldVector<D,3>,R,1,Dune::FieldVector<R,1>,
00187                                Dune::FieldMatrix<R,1,3> > Traits;
00188 
00190     unsigned int size () const
00191     {
00192       return 10;
00193     }
00194 
00196     void evaluateFunction (const typename Traits::DomainType& in,
00197                                   std::vector<typename Traits::RangeType>& out) const
00198     {
00199       out.resize(10);
00200 
00201       out[0] = 1 - in[0] - in[1] - in[2];
00202       out[1] = 4 * in[0] * (1 - in[0] - in[1] - in[2]);
00203       out[2] = in[0];
00204       out[3] = 4 * in[1] * (1 - in[0] - in[1] - in[2]);
00205       out[4] = 4 * in[0] * in[1];
00206       out[5] = in[1];
00207       out[6] = 4 * in[2] * (1 - in[0] - in[1] - in[2]);
00208       out[7] = 4 * in[0] * in[2];
00209       out[8] = 4 * in[1] * in[2];
00210       out[9] = in[2];
00211     }
00212 
00214     void evaluateJacobian (const typename Traits::DomainType& in,         // position
00215                            std::vector<typename Traits::JacobianType>& out) const      // return value
00216     {
00217       out.resize(10);
00218 
00219       out[0][0][0] = -1;                           out[0][0][1] = -1;                            out[0][0][2] = -1;
00220       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];
00221       out[2][0][0] =  1;                           out[2][0][1] =  0;                            out[2][0][2] =  0;
00222       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];
00223       out[4][0][0] =  4*in[1];                     out[4][0][1] =  4*in[0];                      out[4][0][2] =  0;
00224       out[5][0][0] =  0;                           out[5][0][1] =  1;                            out[5][0][2] =  0;
00225       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];
00226       out[7][0][0] =  4*in[2];                     out[7][0][1] =  0;                            out[7][0][2] =  4*in[0];
00227       out[8][0][0] =  0;                           out[8][0][1] =  4*in[2];                      out[8][0][2] =  4*in[1];
00228       out[9][0][0] =  0;                           out[9][0][1] =  0;                            out[9][0][2] =  1;
00229     }
00230 
00231 
00234     unsigned int order () const
00235     {
00236         return 2;
00237     }
00238 
00239   };
00240 }
00241 #endif

Generated on Fri Apr 29 2011 with Doxygen (ver 1.7.1) [doxygen-log,error-log].