deal.II version GIT relicensing-6834-g5b78e6bcdf 2026-10-01 11:20:01+00:00
\(\newcommand{\dealvcentcolon}{\mathrel{\mathop{:}}}\) \(\newcommand{\dealcoloneq}{\dealvcentcolon\mathrel{\mkern-1.2mu}=}\) \(\newcommand{\jump}[1]{\left[\!\left[ #1 \right]\!\right]}\) \(\newcommand{\average}[1]{\left\{\!\left\{ #1 \right\}\!\right\}}\)
Loading...
Searching...
No Matches
polynomials_piecewise.h
Go to the documentation of this file.
1// -----------------------------------------------------------------------------
2//
3// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception OR LGPL-2.1-or-later
4// Copyright (C) 2013 - 2024 by the deal.II authors
5//
6// This file is part of the deal.II library.
7//
8// Detailed license information governing the source code and contributions
9// can be found in LICENSE.md and CONTRIBUTING.md at the top level directory.
10//
11// -----------------------------------------------------------------------------
12
13#ifndef dealii_polynomials_piecewise_h
14#define dealii_polynomials_piecewise_h
15
16
17
18#include <deal.II/base/config.h>
19
22#include <deal.II/base/point.h>
24
25#include <vector>
26
28
38namespace Polynomials
39{
60 template <typename number>
62 {
63 public:
75 PiecewisePolynomial(const Polynomial<number> &coefficients_on_interval,
76 const unsigned int n_intervals,
77 const unsigned int interval,
78 const bool spans_next_interval);
79
87 const unsigned int index);
88
95 number
96 value(const number x) const;
97
112 void
113 value(const number x, std::vector<number> &values) const;
114
130 void
131 value(const number x,
132 const unsigned int n_derivatives,
133 number *values) const;
134
139 unsigned int
140 degree() const;
141
147 template <class Archive>
148 void
149 serialize(Archive &ar, const unsigned int version);
150
154 virtual std::size_t
155 memory_consumption() const;
156
157 protected:
163
168 unsigned int n_intervals;
169
174 unsigned int interval;
175
181
186 std::vector<number> points;
187
192 std::vector<number> one_over_lengths;
193
198 unsigned int index;
199 };
200
201
202
208 std::vector<PiecewisePolynomial<double>>
210 const unsigned int n_subdivisions,
211 const unsigned int base_degree);
212
217 std::vector<PiecewisePolynomial<double>>
219 const std::vector<Point<1>> &points);
220
221} // namespace Polynomials
222
223
226/* -------------------------- inline functions --------------------- */
227
228namespace Polynomials
229{
230 template <typename number>
231 inline unsigned int
233 {
234 if (points.size() > 0)
235 return 1;
236 return polynomial.degree();
237 }
238
239
240
241 template <typename number>
242 inline number
244 {
245 if (points.size() > 0)
246 {
247 if (x > points[index])
248 return std::max<number>(0.0,
249 1.0 - (x - points[index]) *
250 one_over_lengths[index]);
251 else if (x < points[index])
252 return std::max<number>(0.0,
253 0.0 + (x - points[index - 1]) *
254 one_over_lengths[index - 1]);
255 else
256 return 1.0;
257 }
258
259 AssertIndexRange(interval, n_intervals);
260 number y = x;
261 // shift polynomial if necessary
262 if (n_intervals > 1)
263 {
264 const number step = 1. / n_intervals;
265
266 // polynomial spans over two intervals
267 if (spans_two_intervals == true)
268 {
269 const number offset = step * interval;
270 if (x < offset)
271 return 0;
272 else if (x > offset + step + step)
273 return 0;
274 else if (x < offset + step)
275 y = x - offset;
276 else
277 y = offset + step + step - x;
278 }
279 else
280 {
281 const number offset = step * interval;
282 if (x < offset || x > offset + step)
283 return 0;
284 else
285 y = x - offset;
286 }
287
288 return polynomial.value(y);
289 }
290 else
291 return polynomial.value(x);
292 }
293
294
295
296 template <typename number>
297 template <class Archive>
298 inline void
299 PiecewisePolynomial<number>::serialize(Archive &ar, const unsigned int)
300 {
301 // forward to serialization function in the base class.
302 ar &static_cast<EnableObserverPointer &>(*this);
303 ar &polynomial;
304 ar &n_intervals;
305 ar &interval;
306 ar &spans_two_intervals;
307 ar &points;
308 ar &one_over_lengths;
309 ar &index;
310 }
311} // namespace Polynomials
312
314
315#endif
Definition point.h:111
void serialize(Archive &ar, const unsigned int version)
number value(const number x) const
virtual std::size_t memory_consumption() const
#define DEAL_II_NAMESPACE_OPEN
Definition config.h:38
#define DEAL_II_NAMESPACE_CLOSE
Definition config.h:39
#define AssertIndexRange(index, range)
std::vector< PiecewisePolynomial< double > > generate_complete_linear_basis_on_subdivisions(const std::vector< Point< 1 > > &points)
std::vector< PiecewisePolynomial< double > > generate_complete_Lagrange_basis_on_subdivisions(const unsigned int n_subdivisions, const unsigned int base_degree)