00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020 #ifndef LAGRANGIAN_FINITE_ELEMENT_HPP
00021 #define LAGRANGIAN_FINITE_ELEMENT_HPP
00022
00039 template <size_t numberOfDegreesOfFreedom,
00040 typename FiniteElementType,
00041 typename GivenQuadratureType>
00042 class LagrangianFiniteElement
00043 {
00044 public:
00045 typedef GivenQuadratureType
00046 QuadratureType;
00048 enum {
00049 numberOfQuadraturePoints = QuadratureType::numberOfQuadraturePoints
00050 };
00051
00052 typedef
00053 TinyVector<numberOfDegreesOfFreedom>
00054 ElementaryVector;
00056 typedef
00057 TinyMatrix<numberOfDegreesOfFreedom,
00058 numberOfDegreesOfFreedom>
00059 ElementaryMatrix;
00061 private:
00067 FiniteElementType& self()
00068 {
00069 return static_cast<FiniteElementType&>(*this);
00070 }
00071
00072 protected:
00081 real_t __W (const size_t& i, const size_t& j)
00082 {
00083 return self().W(i,self().integrationVertices()[j]);
00084 }
00085
00094 real_t __dxW(const size_t& i, const size_t& j)
00095 {
00096 return self().dxW(i,self().integrationVertices()[j]);
00097 }
00098
00107 real_t __dyW(const size_t& i, const size_t& j)
00108 {
00109 return self().dyW(i,self().integrationVertices()[j]);
00110 }
00111
00120 real_t __dzW(const size_t& i, const size_t& j)
00121 {
00122 return self().dzW(i,self().integrationVertices()[j]);
00123 }
00124
00125
00126 TinyMatrix<numberOfDegreesOfFreedom,numberOfQuadraturePoints>
00127 __w;
00129 TinyMatrix<numberOfDegreesOfFreedom,numberOfQuadraturePoints>
00130 __dxw;
00132 TinyMatrix<numberOfDegreesOfFreedom,numberOfQuadraturePoints>
00133 __dyw;
00135 TinyMatrix<numberOfDegreesOfFreedom,numberOfQuadraturePoints>
00136 __dzw;
00138 public:
00147 inline const real_t& W(const size_t& i, const size_t& j) const
00148 {
00149 return __w(i,j);
00150 }
00151
00161 inline const real_t& dxW(const size_t& i, const size_t& j) const
00162 {
00163 return __dxw(i,j);
00164 }
00165
00175 inline const real_t& dyW(const size_t& i, const size_t& j) const
00176 {
00177 return __dyw(i,j);
00178 }
00179
00189 inline const real_t& dzW(const size_t& i, const size_t& j) const
00190 {
00191 return __dzw(i,j);
00192 }
00193
00194 public:
00202 template <typename ConformTransformation>
00203 inline void integrateWjWi(ElementaryMatrix& matElem,
00204 const ConformTransformation& T) const
00205 {
00206 ElementaryMatrix tmp = 0;
00207
00208 for (size_t k=0; k<numberOfQuadraturePoints; ++k) {
00209 for (size_t j=0; j<numberOfDegreesOfFreedom; ++j) {
00210 for (size_t i=0; i<=j; ++i) {
00211 tmp(i,j)
00212 += W(i,k) * W(j,k) * QuadratureType::instance().weight(k);
00213 }
00214 }
00215 }
00216
00217
00218 for (size_t j=0; j<numberOfDegreesOfFreedom; ++j)
00219 for (size_t i=j+1; i<numberOfDegreesOfFreedom; ++i)
00220 tmp(i,j) = tmp(j,i);
00221
00222 matElem += tmp;
00223 }
00224
00234 template <typename ConformTransformation>
00235 inline void integrateDWjWi(ElementaryMatrix& matElem,
00236 const size_t& n,
00237 const ConformTransformation& T) const
00238 {
00239 ElementaryMatrix tmp = 0;
00240
00241 for (size_t k=0; k<numberOfQuadraturePoints; ++k) {
00242 for (size_t j=0; j<numberOfDegreesOfFreedom; ++j) {
00243 const real_t fj
00244 = dxW(j,k)*T.invJacobian(0,n)
00245 + dyW(j,k)*T.invJacobian(1,n)
00246 + dzW(j,k)*T.invJacobian(2,n);
00247 for (size_t i=0; i<numberOfDegreesOfFreedom; ++i) {
00248 tmp(i,j)
00249 += fj * W(i,k) * QuadratureType::instance().weight(k);
00250 }
00251 }
00252 }
00253 matElem += tmp;
00254 }
00255
00265 template <typename ConformTransformation>
00266 inline void integrateWjDWi(ElementaryMatrix& matElem,
00267 const size_t& n,
00268 const ConformTransformation& T) const
00269 {
00270 ElementaryMatrix tmp = 0;
00271
00272 for (size_t k=0; k<numberOfQuadraturePoints; ++k) {
00273 for (size_t i=0; i<numberOfDegreesOfFreedom; ++i) {
00274 const real_t fi
00275 = dxW(i,k)*T.invJacobian(0,n)
00276 + dyW(i,k)*T.invJacobian(1,n)
00277 + dzW(i,k)*T.invJacobian(2,n);
00278 for (size_t j=0; j<numberOfDegreesOfFreedom; ++j) {
00279 tmp(i,j)
00280 += fi * W(j,k) * QuadratureType::instance().weight(k);
00281 }
00282 }
00283 }
00284 matElem += tmp;
00285 }
00286
00297 template <typename ConformTransformation>
00298 inline void integrateDWjDWi(ElementaryMatrix& matElem,
00299 const size_t& n,
00300 const size_t& m,
00301 const ConformTransformation& T) const
00302 {
00303 ElementaryMatrix tmp = 0;
00304
00305 for (size_t k=0; k<numberOfQuadraturePoints; ++k) {
00306 for (size_t j=0; j<numberOfDegreesOfFreedom; ++j) {
00307 const real_t fj
00308 = dxW(j,k)*T.invJacobian(0,n)
00309 + dyW(j,k)*T.invJacobian(1,n)
00310 + dzW(j,k)*T.invJacobian(2,n);
00311 for (size_t i=0; i<numberOfDegreesOfFreedom; ++i) {
00312 tmp(i,j)
00313 += fj
00314 * ( dxW(i,k)*T.invJacobian(0,m)
00315 + dyW(i,k)*T.invJacobian(1,m)
00316 + dzW(i,k)*T.invJacobian(2,m) )
00317 * QuadratureType::instance().weight(k);
00318 }
00319 }
00320 }
00321
00322 matElem += tmp;
00323 }
00324
00333 template <typename ConformTransformation>
00334 inline void integrateWj(ElementaryVector& vectElem,
00335 const ConformTransformation& T,
00336 const TinyVector<numberOfQuadraturePoints, real_t>& f) const
00337 {
00338 vectElem = 0;
00339
00340 for (size_t k=0; k<numberOfQuadraturePoints; ++k)
00341 for (size_t j=0; j<numberOfDegreesOfFreedom; ++j) {
00342 vectElem[j]
00343 += W(j,k)
00344 * f[k]
00345 * QuadratureType::instance().weight(k);
00346 }
00347 }
00348
00353 LagrangianFiniteElement()
00354 {
00355 try {
00356 for (size_t i=0; i<numberOfDegreesOfFreedom; ++i) {
00357 for(size_t j=0; j<numberOfQuadraturePoints; ++j) {
00358 __w(i,j) = __W(i,j);
00359 __dxw(i,j) = __dxW(i,j);
00360 __dyw(i,j) = __dyW(i,j);
00361 __dzw(i,j) = __dzW(i,j);
00362 }
00363 }
00364 }
00365 catch(ErrorHandler e) {
00366 e.writeErrorMessage();
00367 }
00368 catch(...) {
00369 fferr(0) << "error: Unknown exception caught!\n";
00370 fferr(0) << __FILE__ << ':' << __LINE__ << ": Not implemented\n";
00371 }
00372 }
00373
00378 virtual ~LagrangianFiniteElement()
00379 {
00380 ;
00381 }
00382 };
00383
00384 #endif // LAGRANGIAN_FINITE_ELEMENT_HPP