- Home
- About DUNE
- Download
- Documentation
- Community
- Development
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].