From 1761cbff1b97207171d8d75a983574235e3fd705 Mon Sep 17 00:00:00 2001 From: grahambenharper Date: Thu, 8 Aug 2019 18:27:26 -0600 Subject: [PATCH] Implement the PolynomialsBase class --- .../deal.II/base/tensor_polynomials_base.h | 174 ++++++++++++++++++ source/base/CMakeLists.txt | 1 + source/base/tensor_polynomials_base.cc | 42 +++++ 3 files changed, 217 insertions(+) create mode 100644 include/deal.II/base/tensor_polynomials_base.h create mode 100644 source/base/tensor_polynomials_base.cc diff --git a/include/deal.II/base/tensor_polynomials_base.h b/include/deal.II/base/tensor_polynomials_base.h new file mode 100644 index 0000000000..cbd82f3767 --- /dev/null +++ b/include/deal.II/base/tensor_polynomials_base.h @@ -0,0 +1,174 @@ +// --------------------------------------------------------------------- +// +// Copyright (C) 2005 - 2019 by the deal.II authors +// +// This file is part of the deal.II library. +// +// The deal.II library is free software; you can use it, redistribute +// it, and/or modify it under the terms of the GNU Lesser General +// Public License as published by the Free Software Foundation; either +// version 2.1 of the License, or (at your option) any later version. +// The full text of the license can be found in the file LICENSE.md at +// the top level directory of deal.II. +// +// --------------------------------------------------------------------- + +#ifndef dealii_tensor_polynomials_base_h +#define dealii_tensor_polynomials_base_h + + +#include + +#include +#include +#include + +#include + +DEAL_II_NAMESPACE_OPEN + +/** + * This class provides a framework for the finite element polynomial + * classes for use with finite element classes that are derived from + * @p FE_Poly and @p FE_PolyTensor. An object of this type is stored + * as a member variable in the finite element class. + * + *

Deriving classes

+ * + * Any derived class must provide the most basic properties for shape + * functions evaluated on the reference cell. This includes, but is not + * limited to, implementing the compute, name, and + * clone member functions. These functions are necessary to store the + * most basic information of how the polynomials in the derived class evaluate + * at a given point on the reference cell. More information on each function can + * be found in the corresponding function's documentation. + * + * Some classes that derive from this class include + *
    + *
  • PolynomialsABF + *
  • PolynomialsBDM + *
  • PolynomialsBernardiRaugel + *
  • PolynomialsNedelec + *
  • PolynomialsRaviartThomas + *
  • PolynomialsRT_Bubbles + *
+ * + * @ingroup Polynomials + * @author Graham Harper + * @date 2019 + */ +template +class TensorPolynomialsBase +{ +public: + /** + * Constructor. This takes the degree of the space, @p deg from the finite element + * class, and @p n, the number of polynomials for the space. + */ + TensorPolynomialsBase(const unsigned int deg, + const unsigned int n_polynomials); + + /** + * Move constructor. + */ + TensorPolynomialsBase(TensorPolynomialsBase &&) = default; // NOLINT + + /** + * Copy constructor. + */ + TensorPolynomialsBase(const TensorPolynomialsBase &) = default; + + /** + * Virtual destructor. Makes sure that pointers to this class are deleted + * properly. + */ + virtual ~TensorPolynomialsBase() = default; + + /** + * Compute the value and the derivatives of the polynomials at + * @p unit_point. + * + * The size of the vectors must either be zero or equal n(). In + * the first case, the function will not compute these values. + * + * If you need values or derivatives of all polynomials then use this + * function, rather than using any of the compute_value, + * compute_grad or compute_grad_grad functions, see below, + * in a loop over all tensor product polynomials. + */ + virtual void + compute(const Point & unit_point, + std::vector> &values, + std::vector> &grads, + std::vector> &grad_grads, + std::vector> &third_derivatives, + std::vector> &fourth_derivatives) const = 0; + + /** + * Return the number of polynomials. + */ + unsigned int + n() const; + + /** + * Return the highest polynomial degree of polynomials represented by this + * class. A derived class may override this if its value is different from + * @p my_degree. + */ + unsigned int + degree() const; + + /** + * A sort of virtual copy constructor, this function returns a copy of + * the polynomial space object. Derived classes need to override the function + * here in this base class and return an object of the same type as the + * derived class. + * + * Some places in the library, for example the constructors of FE_PolyTensor, + * need to make copies of polynomial spaces without knowing their exact type. + * They do so through this function. + */ + virtual std::unique_ptr> + clone() const = 0; + + /** + * Return the name of the space. + */ + virtual std::string + name() const = 0; + +private: + /** + * The highest polynomial degree of this functions represented by this object. + */ + const unsigned int polynomial_degree; + + /** + * The number of polynomials represented by this object. + */ + const unsigned int n_pols; +}; + + + +template +inline unsigned int +TensorPolynomialsBase::n() const +{ + return n_pols; +} + + + +template +inline unsigned int +TensorPolynomialsBase::degree() const +{ + return polynomial_degree; +} + + + +DEAL_II_NAMESPACE_CLOSE + +#endif diff --git a/source/base/CMakeLists.txt b/source/base/CMakeLists.txt index a2c2cf9e74..fa6554fb48 100644 --- a/source/base/CMakeLists.txt +++ b/source/base/CMakeLists.txt @@ -59,6 +59,7 @@ SET(_unity_include_src polynomial.cc polynomials_abf.cc polynomials_adini.cc + tensor_polynomials_base.cc polynomials_bernstein.cc polynomials_bdm.cc polynomials_bernardi_raugel.cc diff --git a/source/base/tensor_polynomials_base.cc b/source/base/tensor_polynomials_base.cc new file mode 100644 index 0000000000..1a4bae0e93 --- /dev/null +++ b/source/base/tensor_polynomials_base.cc @@ -0,0 +1,42 @@ +// --------------------------------------------------------------------- +// +// Copyright (C) 2005 - 2019 by the deal.II authors +// +// This file is part of the deal.II library. +// +// The deal.II library is free software; you can use it, redistribute +// it, and/or modify it under the terms of the GNU Lesser General +// Public License as published by the Free Software Foundation; either +// version 2.1 of the License, or (at your option) any later version. +// The full text of the license can be found in the file LICENSE.md at +// the top level directory of deal.II. +// +// --------------------------------------------------------------------- + + +#include +#include +#include + +#include +#include + +DEAL_II_NAMESPACE_OPEN + +template +TensorPolynomialsBase::TensorPolynomialsBase( + const unsigned int deg, + const unsigned int n_polynomials) + : polynomial_degree(deg) + , n_pols(n_polynomials) +{ + // nothing to do here for now +} + + + +template class TensorPolynomialsBase<1>; +template class TensorPolynomialsBase<2>; +template class TensorPolynomialsBase<3>; + +DEAL_II_NAMESPACE_CLOSE -- 2.39.5