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,
16 const Vector& b,
17 const Vector& c,
18 const Vector& d,
19 Vector& x) {
20#if defined(NUMERICS_HAS_LAPACK)
21 const idx n = b.size();
22 // dgtsv overwrites its inputs; work on copies
23 std::vector<double> dl(a.data(), a.data() + (n - 1));
24 std::vector<double> diag(b.data(), b.data() + n);
25 std::vector<double> du(c.data(), c.data() + (n - 1));
26 x = d;
27 int info = LAPACKE_dgtsv(LAPACK_ROW_MAJOR,
28 static_cast<lapack_int>(n),
29 1,
30 dl.data(),
31 diag.data(),
32 du.data(),
33 x.data(),
34 1); // ldb = nrhs = 1 (row-major: cols of RHS)
35 if (info != 0)
36 throw std::runtime_error("thomas (lapack): dgtsv failed, info="
37 + std::to_string(info));
38#else
39 seq::thomas(a, b, c, d, x);
40#endif
41}
42
43} // namespace num::backends::lapack
constexpr idx size() const noexcept
Definition vector.hpp:83
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.