16 #include <deal.II/base/polynomials_piecewise.h> 19 DEAL_II_NAMESPACE_OPEN
26 template <
typename number>
28 const unsigned int n_intervals,
29 const unsigned int interval,
30 const bool spans_next_interval)
32 polynomial (coefficients_on_interval),
33 n_intervals (n_intervals),
35 spans_two_intervals (spans_next_interval)
43 template <
typename number>
46 std::vector<number> &values)
const 48 Assert (values.size() > 0, ExcZero());
49 const unsigned int values_size=values.size();
53 double derivative_change_sign = 1.;
56 const number step = 1./n_intervals;
58 if (spans_two_intervals)
60 const double offset = step * interval;
61 if (x<offset || x>offset+step+step)
63 for (
unsigned int k=0; k<values.size(); ++k)
67 else if (x<offset+step)
71 derivative_change_sign = -1.;
72 y = offset+step+step-x;
77 const double offset = step * interval;
78 if (x<offset || x>offset+step)
80 for (
unsigned int k=0; k<values.size(); ++k)
90 if ((std::abs(y)<1e-14 && (interval > 0 ||
91 derivative_change_sign == -1.))
93 (std::abs(y-step)<1e-14 &&
94 (interval < n_intervals-1 || derivative_change_sign == -1.)))
97 for (
unsigned int d=1; d<values_size; ++d)
103 polynomial.value(y, values);
106 for (
unsigned int j=1; j<values_size; j+=2)
107 values[j] *= derivative_change_sign;
112 std::vector<PiecewisePolynomial<double> >
114 const unsigned int base_degree)
116 std::vector<Polynomial<double> > p_base =
117 LagrangeEquidistant::generate_complete_basis(base_degree);
118 for (
unsigned int i=0; i<p_base.size(); ++i)
119 p_base[i].scale(n_subdivisions);
121 std::vector<PiecewisePolynomial<double> > p;
122 p.reserve (n_subdivisions * base_degree + 1);
126 for (
unsigned int s=0; s<n_subdivisions; ++s)
127 for (
unsigned int i=0; i<base_degree; ++i)
130 i==(base_degree-1) &&
131 s<n_subdivisions-1));
146 DEAL_II_NAMESPACE_CLOSE
::ExceptionBase & ExcMessage(std::string arg1)
#define AssertIndexRange(index, range)
#define Assert(cond, exc)
std::vector< PiecewisePolynomial< double > > generate_complete_Lagrange_basis_on_subdivisions(const unsigned int n_subdivisions, const unsigned int base_degree)
PiecewisePolynomial(const Polynomial< number > &coefficients_on_interval, const unsigned int n_intervals, const unsigned int interval, const bool spans_next_interval)
void value(const number x, std::vector< number > &values) const