numerics 0.1.0
Loading...
Searching...
No Matches
thomas.cpp
Go to the documentation of this file.
1/// @file linalg/factorization/backends/lapack/thomas.cpp
2/// @brief LAPACK tridiagonal solver via LAPACKE_dgtsv.
3#include "../seq/impl.hpp"
4#include "impl.hpp"
5#include <stdexcept>
6#include <string>
7#include <vector>
8
9#if defined(NUMERICS_HAS_LAPACK)
10#include <lapacke.h>
11#endif
12
13namespace num::backends::lapack {
14
15void thomas(const Vector &a, const Vector &b, const Vector &c, const Vector &d,
16 Vector &x) {
17#if defined(NUMERICS_HAS_LAPACK)
18 const idx n = b.size();
19 // dgtsv overwrites its inputs; work on copies
20 std::vector<double> dl(a.data(), a.data() + (n - 1));
21 std::vector<double> diag(b.data(), b.data() + n);
22 std::vector<double> du(c.data(), c.data() + (n - 1));
23 x = d;
24 int info = LAPACKE_dgtsv(LAPACK_ROW_MAJOR, static_cast<lapack_int>(n), 1,
25 dl.data(), diag.data(), du.data(), x.data(),
26 1); // ldb = nrhs = 1 (row-major: cols of RHS)
27 if (info != 0)
28 throw std::runtime_error("thomas (lapack): dgtsv failed, info=" +
29 std::to_string(info));
30#else
31 seq::thomas(a, b, c, d, x);
32#endif
33}
34
35} // namespace num::backends::lapack
constexpr idx size() const noexcept
Definition vector.hpp:80
void thomas(const Vector &a, const Vector &b, const Vector &c, const Vector &d, Vector &x)
Definition thomas.cpp:15
void thomas(const Vector &a, const Vector &b, const Vector &c, const Vector &d, Vector &x)
Definition thomas.cpp:8
std::size_t idx
Definition types.hpp:11
std::experimental::simd butterfly for FFT.