numerics 0.1.0
Loading...
Searching...
No Matches
banded.hpp
Go to the documentation of this file.
1/// @file banded.hpp
2/// @brief Banded matrix storage and solvers.
3#pragma once
4
5#include "core/policy.hpp"
6#include "core/types.hpp"
7#include "core/vector.hpp"
8#include <memory>
9
10namespace num {
11
12/// @brief LAPACK-style band storage.
13///
14/// Stores \f$A_{ij}\f$ at \f$\text{band}(k_l+k_u+i-j,j)\f$ when
15/// \f$\max(0,j-k_u)\le i\le \min(n-1,j+k_l)\f$.
17 public:
19
20 BandedMatrix(idx n, idx kl, idx ku, real val);
21
23
25 BandedMatrix(BandedMatrix&&) noexcept;
28
29 idx size() const { return n_; }
30 idx rows() const { return n_; }
31 idx cols() const { return n_; }
32
33 idx kl() const { return kl_; }
34
35 idx ku() const { return ku_; }
36
37 idx bandwidth() const { return kl_ + ku_ + 1; }
38
39 idx ldab() const { return ldab_; }
40
41 real& operator()(idx i, idx j);
42 real operator()(idx i, idx j) const;
43
44 real& band(idx band_row, idx col);
45 real band(idx band_row, idx col) const;
46
47 real* data() { return data_.get(); }
48 const real* data() const { return data_.get(); }
49
50 bool in_band(idx i, idx j) const;
51
52 void to_gpu();
53 void to_cpu();
54 real* gpu_data() { return d_data_; }
55 const real* gpu_data() const { return d_data_; }
56 bool on_gpu() const { return d_data_ != nullptr; }
57
58 private:
59 idx n_ = 0;
60 idx kl_ = 0;
61 idx ku_ = 0;
62 idx ldab_ = 0;
63 std::unique_ptr<real[]> data_;
64 real* d_data_ = nullptr;
65};
66
68 bool success = false;
70 real rcond = 0.0;
71};
72
73/// @brief In-place banded \f$PA=LU\f$ factorization.
75
76/// @brief Solve \f$Ax=b\f$ using a precomputed banded LU factorization.
77void banded_lu_solve(const BandedMatrix& A, const idx* ipiv, Vector& b);
78
79/// @brief Solve \f$AX=B\f$ using a precomputed banded LU factorization.
80void banded_lu_solve_multi(const BandedMatrix& A, const idx* ipiv, real* B, idx nrhs);
81
82/// @brief Factor and solve \f$Ax=b\f$.
84
85/// @brief Compute \f$y=Ax\f$.
86void banded_matvec(const BandedMatrix& A,
87 const Vector& x,
88 Vector& y,
89 Backend backend = default_backend);
90
91/// @brief Compute \f$y=\alpha Ax+\beta y\f$.
92void banded_gemv(real alpha,
93 const BandedMatrix& A,
94 const Vector& x,
95 real beta,
96 Vector& y,
97 Backend backend = default_backend);
98
99/// @brief Estimate \f$1/\kappa_1(A)\f$.
100real banded_rcond(const BandedMatrix& A, const idx* ipiv, real anorm);
101
102/// @brief Compute \f$\|A\|_1\f$.
104
105} // namespace num
LAPACK-style band storage.
Definition banded.hpp:16
idx kl() const
Definition banded.hpp:33
idx ldab() const
Definition banded.hpp:39
idx cols() const
Definition banded.hpp:31
idx size() const
Definition banded.hpp:29
idx bandwidth() const
Definition banded.hpp:37
BandedMatrix & operator=(const BandedMatrix &)
Definition banded.cpp:62
idx rows() const
Definition banded.hpp:30
bool on_gpu() const
Definition banded.hpp:56
const real * gpu_data() const
Definition banded.hpp:55
real & operator()(idx i, idx j)
Definition banded.cpp:98
bool in_band(idx i, idx j) const
Definition banded.cpp:114
real & band(idx band_row, idx col)
Definition banded.cpp:106
const real * data() const
Definition banded.hpp:48
idx ku() const
Definition banded.hpp:35
real * data()
Definition banded.hpp:47
real * gpu_data()
Definition banded.hpp:54
Backend enum and default backend selection.
Core type definitions.
BandedSolverResult banded_solve(const BandedMatrix &A, const Vector &b, Vector &x)
Factor and solve .
Definition banded.cpp:281
double real
Definition types.hpp:10
Backend
Definition policy.hpp:7
void banded_lu_solve_multi(const BandedMatrix &A, const idx *ipiv, real *B, idx nrhs)
Solve using a precomputed banded LU factorization.
Definition banded.cpp:247
real banded_norm1(const BandedMatrix &A)
Compute .
Definition banded.cpp:348
real beta(real a, real b)
B(a, b) – beta function.
Definition math.hpp:248
std::size_t idx
Definition types.hpp:11
BandedSolverResult banded_lu(BandedMatrix &A, idx *ipiv)
In-place banded factorization.
Definition banded.cpp:135
real banded_rcond(const BandedMatrix &A, const idx *ipiv, real anorm)
Estimate .
Definition banded.cpp:364
void banded_gemv(real alpha, const BandedMatrix &A, const Vector &x, real beta, Vector &y, Backend backend=default_backend)
Compute .
Definition banded.cpp:304
void banded_lu_solve(const BandedMatrix &A, const idx *ipiv, Vector &b)
Solve using a precomputed banded LU factorization.
Definition banded.cpp:207
constexpr Backend default_backend
Definition policy.hpp:53
void banded_matvec(const BandedMatrix &A, const Vector &x, Vector &y, Backend backend=default_backend)
Compute .
Definition banded.cpp:300
Dense vector storage and operations.