ABACUS develop
Atomic-orbital Based Ab-initio Computation at UStc
Loading...
Searching...
No Matches
cubic_spline.h
Go to the documentation of this file.
1#ifndef CUBIC_SPLINE_INTERPOLATION_H_
2#define CUBIC_SPLINE_INTERPOLATION_H_
3
4#include <vector>
5#include <cstddef>
6
7namespace ModuleBase
8{
9
119{
120 //*****************************************************************
121 // boundary condition
122 //*****************************************************************
123
124public:
125
140 enum class BoundaryType
141 {
146 };
147
148
157 {
158 // for not_a_knot and periodic
159 BoundaryCondition(BoundaryType type = BoundaryType::not_a_knot);
160
161 // for first/second_deriv
163
165 double val = 0.0;
166 };
167
168
169 //*****************************************************************
170 // interpolant object
171 //*****************************************************************
172
173public:
174
175 CubicSpline() = delete;
176 CubicSpline(CubicSpline const&) = default;
178
181
182 ~CubicSpline() = default;
183
184
200 int n,
201 const double* x,
202 const double* y,
203 const BoundaryCondition& bc_start = {},
204 const BoundaryCondition& bc_end = {}
205 );
206
207
223 int n,
224 double x0,
225 double dx,
226 const double* y,
227 const BoundaryCondition& bc_start = {},
228 const BoundaryCondition& bc_end = {}
229 );
230
231
244 CubicSpline(int n, const double* x);
245
258 CubicSpline(int n, double x0, double dx);
259
273 void add(
274 const double* y,
275 const BoundaryCondition& bc_start = {},
276 const BoundaryCondition& bc_end = {}
277 );
278
279
294 void eval(
295 int n_interp,
296 const double* x_interp,
297 double* y_interp,
298 double* dy_interp = nullptr,
299 double* d2y_interp = nullptr,
300 int i_spline = 0
301 ) const;
302
303
318 void multi_eval(
319 int n_spline,
320 const int* i_spline,
321 double x_interp,
322 double* y_interp,
323 double* dy_interp = nullptr,
324 double* d2y_interp = nullptr
325 ) const;
326
327
340 void multi_eval(
341 double x_interp,
342 double* y_interp,
343 double* dy_interp = nullptr,
344 double* d2y_interp = nullptr
345 ) const;
346
347
362 void reserve(int n_spline) { y_.reserve(n_spline * n_ * 2); }
363
364
366 size_t heap_usage() const { return (x_.capacity() + y_.capacity()) * sizeof(double); }
367
369 double xmin() const { return xmin_; }
370
372 double xmax() const { return xmax_; }
373
375 int n_spline() const { return n_spline_; }
376
377
378private:
379
381 int n_spline_ = 0;
382
384 int n_ = 0;
385
387 double xmin_ = 0.0;
388
390 double xmax_ = 0.0;
391
393 double dx_ = 0.0;
394
396 std::vector<double> x_;
397
399 std::vector<double> y_;
400
401
402 //*****************************************************************
403 // static functions
404 //*****************************************************************
405
406public:
407
421 static void build(
422 int n,
423 const double* x,
424 const double* y,
425 const BoundaryCondition& bc_start,
426 const BoundaryCondition& bc_end,
427 double* dy
428 );
429
430
443 static void build(
444 int n,
445 double dx,
446 const double* y,
447 const BoundaryCondition& bc_start,
448 const BoundaryCondition& bc_end,
449 double* dy
450 );
451
452
470 static void eval(
471 int n,
472 const double* x,
473 const double* y,
474 const double* dy,
475 int n_interp,
476 const double* x_interp,
477 double* y_interp,
478 double* dy_interp = nullptr,
479 double* d2y_interp = nullptr
480 );
481
482
501 static void eval(
502 int n,
503 double x0,
504 double dx,
505 const double* y,
506 const double* dy,
507 int n_interp,
508 const double* x_interp,
509 double* y_interp,
510 double* dy_interp = nullptr,
511 double* d2y_interp = nullptr
512 );
513
514
515private:
516
518 static void _build(
519 int n,
520 const double* dx,
521 const double* y,
522 const BoundaryCondition& bc_start,
523 const BoundaryCondition& bc_end,
524 double* dy
525 );
526
527
536 static inline int _index(int n, const double* x, double target);
537
538
540 static inline int _index(int n, double x0, double dx, double target);
541
542
544 static inline void _cubic(
545 int n,
546 const double* w,
547 const double* c0,
548 const double* c1,
549 const double* c2,
550 const double* c3,
551 double* y,
552 double* dy,
553 double* d2y
554 );
555
556
558 static void _validate_build(
559 int n,
560 const double* dx,
561 const double* y,
562 const BoundaryCondition& bc_start,
563 const BoundaryCondition& bc_end
564 );
565
566
568 static void _validate_eval(
569 int n,
570 const double (&u)[2],
571 const double* x,
572 const double* y,
573 const double* dy,
574 int n_interp,
575 const double* x_interp
576 );
577
578
606 static void _solve_cyctri(int n, double* d, double* u, double* l, double* b);
607};
608
609} // namespace ModuleBase
610
611#endif
Cubic spline interplation.
Definition cubic_spline.h:119
void add(const double *y, const BoundaryCondition &bc_start={}, const BoundaryCondition &bc_end={})
Adds an interpolant that shares the same knots.
Definition cubic_spline.cpp:71
static int _index(int n, const double *x, double target)
Segment index lookup.
Definition cubic_spline.cpp:525
double xmin_
first knot
Definition cubic_spline.h:387
static void _cubic(int n, const double *w, const double *c0, const double *c1, const double *c2, const double *c3, double *y, double *dy, double *d2y)
Evaluates a batch of cubic polynomials.
Definition cubic_spline.cpp:487
CubicSpline(CubicSpline const &)=default
int n_spline_
number of cubic spline interpolants
Definition cubic_spline.h:381
static void _solve_cyctri(int n, double *d, double *u, double *l, double *b)
Solves a cyclic tridiagonal linear system.
Definition cubic_spline.cpp:539
std::vector< double > y_
values and first derivatives at knots
Definition cubic_spline.h:399
size_t heap_usage() const
heap memory usage in bytes
Definition cubic_spline.h:366
int n_spline() const
number of interpolants held by this object
Definition cubic_spline.h:375
void reserve(int n_spline)
Reserves memory for holding more interpolants.
Definition cubic_spline.h:362
static void _build(int n, const double *dx, const double *y, const BoundaryCondition &bc_start, const BoundaryCondition &bc_end, double *dy)
Computational routine for building cubic spline interpolant.
Definition cubic_spline.cpp:372
double xmin() const
first knot
Definition cubic_spline.h:369
double dx_
spacing between knots (only used for evenly-spaced knots)
Definition cubic_spline.h:393
static void build(int n, const double *x, const double *y, const BoundaryCondition &bc_start, const BoundaryCondition &bc_end, double *dy)
Computes the first derivatives at knots for cubic spline interpolation.
Definition cubic_spline.cpp:207
void eval(int n_interp, const double *x_interp, double *y_interp, double *dy_interp=nullptr, double *d2y_interp=nullptr, int i_spline=0) const
Evaluates a single interpolant at multiple places.
Definition cubic_spline.cpp:94
double xmax_
last knot
Definition cubic_spline.h:390
CubicSpline & operator=(CubicSpline const &)=default
void multi_eval(int n_spline, const int *i_spline, double x_interp, double *y_interp, double *dy_interp=nullptr, double *d2y_interp=nullptr) const
Evaluates multiple interpolants at a single place.
Definition cubic_spline.cpp:118
std::vector< double > x_
knots of the spline polynomial (remains empty for evenly-spaced knots)
Definition cubic_spline.h:396
double xmax() const
last knot
Definition cubic_spline.h:372
static void _validate_eval(int n, const double(&u)[2], const double *x, const double *y, const double *dy, int n_interp, const double *x_interp)
Asserts that the input arguments are valid for interpolating a cubic spline.
Definition cubic_spline.cpp:350
static void _validate_build(int n, const double *dx, const double *y, const BoundaryCondition &bc_start, const BoundaryCondition &bc_end)
Asserts that the input arguments are valid for constructing a cubic spline.
Definition cubic_spline.cpp:323
int n_
number of knots
Definition cubic_spline.h:384
CubicSpline & operator=(CubicSpline &&)=default
CubicSpline(CubicSpline &&)=default
BoundaryType
Types of cubic spline boundary conditions.
Definition cubic_spline.h:141
CubicSpline::BoundaryCondition BoundaryCondition
Definition cubic_spline_test.cpp:12
Definition array_pool.h:6
Boundary condition for cubic spline interpolation.
Definition cubic_spline.h:157
BoundaryType type
Definition cubic_spline.h:164
double val
Definition cubic_spline.h:165