From: guido Date: Sun, 22 May 2005 11:55:28 +0000 (+0000) Subject: new class PolynomialsRaviartThomas X-Git-Url: https://gitweb.dealii.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=467d7c40f1fee48d665f304cf127f953aa296fbc;p=dealii-svn.git new class PolynomialsRaviartThomas git-svn-id: https://svn.dealii.org/trunk@10695 0785d39b-7218-0410-832d-ea1e28bc413d --- diff --git a/deal.II/base/include/base/polynomials_raviart_thomas.h b/deal.II/base/include/base/polynomials_raviart_thomas.h index 95025e45c0..cebc454e4a 100644 --- a/deal.II/base/include/base/polynomials_raviart_thomas.h +++ b/deal.II/base/include/base/polynomials_raviart_thomas.h @@ -20,6 +20,7 @@ #include #include #include +#include #include #include @@ -57,6 +58,11 @@ class PolynomialsRaviartThomas */ PolynomialsRaviartThomas (const unsigned int k); + /** + * Destructor deleting the polynomials. + */ + ~PolynomialsRaviartThomas (); + /** * Computes the value and the * first and second derivatives @@ -110,12 +116,20 @@ class PolynomialsRaviartThomas static unsigned int compute_n_pols(unsigned int degree); private: + /** + * The degree of this object as + * given to the constructor. + */ + const unsigned int my_degree; + /** * An object representing the - * onedimensional polynomial - * space used here. + * polynomial space for a single + * component. We can re-use it by + * rotating the coordinates of + * the evaluation point. */ - const PolynomialSpace<1> polynomial_space; + AnisotropicPolynomials* polynomial_space; /** * Number of Raviart-Thomas @@ -127,6 +141,16 @@ class PolynomialsRaviartThomas * Auxiliary memory. */ mutable std::vector p_values; + + /** + * Auxiliary memory. + */ + mutable std::vector > p_grads; + + /** + * Auxiliary memory. + */ + mutable std::vector > p_grad_grads; }; @@ -142,7 +166,7 @@ template inline unsigned int PolynomialsRaviartThomas::degree() const { - return polynomial_space.degree() - 1; + return my_degree; } #endif diff --git a/deal.II/base/source/polynomials_raviart_thomas.cc b/deal.II/base/source/polynomials_raviart_thomas.cc new file mode 100644 index 0000000000..15de6d7b70 --- /dev/null +++ b/deal.II/base/source/polynomials_raviart_thomas.cc @@ -0,0 +1,109 @@ +//--------------------------------------------------------------------------- +// $Id$ +// Version: $Name$ +// +// Copyright (C) 2004, 2005 by the deal.II authors +// +// This file is subject to QPL and may not be distributed +// without copyright and license information. Please refer +// to the file deal.II/doc/license.html for the text and +// further information on this license. +// +//--------------------------------------------------------------------------- + +#include +#include +#include +#include +using namespace std; +using namespace Polynomials; + + +template +PolynomialsRaviartThomas::PolynomialsRaviartThomas (const unsigned int k) + : + my_degree(k), + n_pols(compute_n_pols(k)) +{ + std::vector > > pols(dim); + pols[0] = Polynomials::LagrangeEquidistant::generate_complete_basis(k+1); + if (k == 0) + for (unsigned int d=1;d(pols); +} + + +template +PolynomialsRaviartThomas::~PolynomialsRaviartThomas () +{ + delete polynomial_space; +} + + +template +void +PolynomialsRaviartThomas::compute (const Point &unit_point, + std::vector > &values, + std::vector > &grads, + std::vector > &grad_grads) const +{ + Assert(values.size()==n_pols || values.size()==0, + ExcDimensionMismatch(values.size(), n_pols)); + Assert(grads.size()==n_pols|| grads.size()==0, + ExcDimensionMismatch(grads.size(), n_pols)); + Assert(grad_grads.size()==n_pols|| grad_grads.size()==0, + ExcDimensionMismatch(grad_grads.size(), n_pols)); + + const unsigned int n_sub = polynomial_space->n(); + p_values.resize((values.size() == 0) ? 0 : n_sub); + p_grads.resize((grads.size() == 0) ? 0 : n_sub); + p_grad_grads.resize((grad_grads.size() == 0) ? 0 : n_sub); + + // Compute values of complete space + // and insert into tensors. Result + // will have first all polynomials + // in the x-component, then y and + // z. + for (unsigned int d=0;d p; + for (unsigned int c=0;ccompute (p, p_values, p_grads, p_grad_grads); + + for (unsigned int i=0;i +unsigned int +PolynomialsRaviartThomas::compute_n_pols(unsigned int k) +{ + if (dim == 1) return k+1; + if (dim == 2) return 2*(k+1)*(k+2); + if (dim == 3) return 3*(k+1)*(k+1)*(k+2); + + Assert(false, ExcNotImplemented()); + return 0; +} + + +template class PolynomialsRaviartThomas<1>; +template class PolynomialsRaviartThomas<2>; +template class PolynomialsRaviartThomas<3>; +