00001
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,
00068 std::vector<typename Traits::JacobianType>& out) const
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,
00137 std::vector<typename Traits::JacobianType>& out) const
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,
00215 std::vector<typename Traits::JacobianType>& out) const
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