numerics 0.1.0
Loading...
Searching...
No Matches
thomas.cpp
Go to the documentation of this file.
1/// @file linalg/factorization/backends/seq/thomas.cpp
2/// @brief Sequential Thomas algorithm (forward elimination + back
3/// substitution).
4#include "impl.hpp"
5
6namespace num::backends::seq {
7
8void thomas(const Vector& a,
9 const Vector& b,
10 const Vector& c,
11 const Vector& d,
12 Vector& x) {
13 const idx n = b.size();
14
15 Vector b_work = b;
16 Vector d_work = d;
17
18 for (idx i = 1; i < n; ++i) {
19 real w = a[i - 1] / b_work[i - 1];
20 b_work[i] -= w * c[i - 1];
21 d_work[i] -= w * d_work[i - 1];
22 }
23
24 x[n - 1] = d_work[n - 1] / b_work[n - 1];
25 for (idx i = n - 1; i > 0; --i)
26 x[i - 1] = (d_work[i - 1] - c[i - 1] * x[i]) / b_work[i - 1];
27}
28
29} // namespace num::backends::seq
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:8
double real
Definition types.hpp:10
std::size_t idx
Definition types.hpp:11
std::experimental::simd butterfly for FFT.