Select Git revision
PolynomialBasis.hpp
-
Emmanuel Labourasse authoredEmmanuel Labourasse authored
PolynomialBasis.hpp 1.97 KiB
#ifndef POLYNOMIALBASIS_HPP
#define POLYNOMIALBASIS_HPP
#include <algebra/TinyVector.hpp>
#include <analysis/Polynomial.hpp>
#include <utils/Messenger.hpp>
enum class BasisType
{
canonical
};
template <size_t N>
class PolynomialBasis
{
private:
static_assert((N >= 0), "Number of elements in the basis must be non-negative");
TinyVector<N + 1, Polynomial<N>> m_elements;
BasisType m_basis_type;
PUGS_INLINE
constexpr PolynomialBasis<N>&
_buildCanonicalBasis()
{
for (size_t i = 0; i <= N; i++) {
TinyVector<N + 1> coefficients(zero);
coefficients[i] = 1;
elements()[i] = Polynomial<N>(coefficients);
}
return *this;
}
public:
PUGS_INLINE
constexpr size_t
size() const
{
return N + 1;
}
PUGS_INLINE
constexpr size_t
degree() const
{
return N;
}
PUGS_INLINE
constexpr BasisType&
type()
{
return m_basis_type;
}
PUGS_INLINE
std::string_view
displayType()
{
switch (m_basis_type) {
case BasisType::canonical:
return "canonical";
default:
return "unknown basis type";
}
}
PUGS_INLINE
constexpr const TinyVector<N + 1, Polynomial<N>>&
elements() const
{
return m_elements;
}
PUGS_INLINE
constexpr TinyVector<N + 1, Polynomial<N>>&
elements()
{
return m_elements;
}
PUGS_INLINE
constexpr PolynomialBasis<N>&
build(BasisType basis_type)
{
type() = basis_type;
switch (basis_type) {
case BasisType::canonical: {
return _buildCanonicalBasis();
break;
}
default:
throw UnexpectedError("unknown basis type");
}
}
PUGS_INLINE constexpr PolynomialBasis(const TinyVector<N + 1, Polynomial<N>>& elements) noexcept
: m_elements{elements}
{}
PUGS_INLINE
constexpr PolynomialBasis(TinyVector<N + 1, Polynomial<N>>&& elements) noexcept : m_elements{elements} {}
PUGS_INLINE
constexpr PolynomialBasis() noexcept = default;
~PolynomialBasis() = default;
};
#endif // POLYNOMIAL_HPP