numerics
Loading...
Searching...
No Matches
tridiag_complex.cpp
Go to the documentation of this file.
2
3namespace num {
4
6 n = n_;
7 a_coeff = a_;
8
9 c_mod.resize(n);
10 inv_b.resize(n);
11
12 inv_b[0] = cplx(1.0, 0.0) / b_;
13 c_mod[0] = c_ * inv_b[0];
14
15 for (int k = 1; k < n; ++k) {
16 cplx bk = b_ - a_coeff * c_mod[k - 1];
17 inv_b[k] = cplx(1.0, 0.0) / bk;
18 if (k < n - 1)
19 c_mod[k] = c_ * inv_b[k];
20 }
21}
22
23void ComplexTriDiag::solve(std::vector<cplx>& d) const {
24 // Forward sweep
25 d[0] *= inv_b[0];
26 for (int k = 1; k < n; ++k)
27 d[k] = (d[k] - a_coeff * d[k - 1]) * inv_b[k];
28
29 // Back substitution
30 for (int k = n - 2; k >= 0; --k)
31 d[k] -= c_mod[k] * d[k + 1];
32}
33
34} // namespace num
constexpr T ipow(T x) noexcept
Compute x^N at compile time via repeated squaring.
std::vector< cplx > inv_b
Inverse of modified main diagonal (precomputed)
void solve(std::vector< cplx > &d) const
In-place Thomas solve.
std::complex< double > cplx
cplx a_coeff
Sub-diagonal value (constant across all rows)
void factor(int n_, cplx a_, cplx b_, cplx c_)
Factor the tridiagonal matrix.
std::vector< cplx > c_mod
Modified super-diagonal (precomputed from LU)
Precomputed LU Thomas solver for constant-coefficient complex tridiagonal systems.