numerics 0.1.0
Loading...
Searching...
No Matches
expv.cpp
Go to the documentation of this file.
1/// @file expv.cpp
2/// @brief Implementation of Krylov-Pade matrix exponential-vector product
4#include "core/matrix.hpp"
5#include "core/vector.hpp"
8#include <algorithm>
9#include <cmath>
10
11namespace num {
12namespace detail {
13
15 const idx m = A.rows();
16
17 static constexpr double c[7] =
18 {1.0, 0.5, 5.0 / 44.0, 1.0 / 66.0, 1.0 / 792.0, 1.0 / 15840.0, 1.0 / 665280.0};
19
20 double norm_inf = 0.0;
21 for (idx i = 0; i < m; i++) {
22 double row_sum = 0.0;
23 for (idx j = 0; j < m; j++) {
24 row_sum += std::abs(A(i, j));
25 }
26 norm_inf = std::max(norm_inf, row_sum);
27 }
28
29 int s = 0;
30 if (norm_inf > 0.5) {
31 s = (int)std::max(0.0, std::ceil(std::log2(norm_inf / 0.5)));
32 }
33
34 double scale = std::ldexp(1.0, -s);
35 Matrix As(m, m, 0.0);
36 for (idx i = 0; i < m; i++) {
37 for (idx j = 0; j < m; j++) {
38 As(i, j) = A(i, j) * scale;
39 }
40 }
41
42 Matrix B(m, m, 0.0);
43 matmul(As, As, B);
44
45 Matrix B2(m, m, 0.0);
46 matmul(B, B, B2);
47
48 Matrix B3(m, m, 0.0);
49 matmul(B2, B, B3);
50
51 Matrix V_mat(m, m, 0.0);
52 for (idx i = 0; i < m; i++) {
53 for (idx j = 0; j < m; j++) {
54 V_mat(i, j) = (c[6] * B3(i, j)) + (c[4] * B2(i, j)) + (c[2] * B(i, j));
55 }
56 V_mat(i, i) += c[0];
57 }
58
59 Matrix W(m, m, 0.0);
60 for (idx i = 0; i < m; i++) {
61 for (idx j = 0; j < m; j++) {
62 W(i, j) = (c[5] * B2(i, j)) + (c[3] * B(i, j));
63 }
64 W(i, i) += c[1];
65 }
66
67 Matrix U(m, m, 0.0);
68 matmul(As, W, U);
69
70 Matrix VpU(m, m, 0.0);
71 Matrix VmU(m, m, 0.0);
72 for (idx i = 0; i < m; i++) {
73 for (idx j = 0; j < m; j++) {
74 VpU(i, j) = V_mat(i, j) + U(i, j);
75 VmU(i, j) = V_mat(i, j) - U(i, j);
76 }
77 }
78
79 LUResult fac = lu(VmU);
80 Matrix E(m, m, 0.0);
81 lu_solve(fac, VpU, E);
82
83 for (int i = 0; i < s; i++) {
84 Matrix E2(m, m, 0.0);
85 matmul(E, E, E2);
86 matmul(E, E, E2);
87 E = std::move(E2);
88 }
89
90 return E;
91}
92
93} // namespace detail
94
95Vector expv(real t, const SparseMatrix& A, const Vector& v, int m_max, real tol) {
97 return expv(t, op, v, m_max, tol);
98}
99
100} // namespace num
constexpr idx rows() const noexcept
Definition matrix.hpp:87
Sparse matrix in Compressed Sparse Row (CSR) format.
Definition sparse.hpp:15
Krylov subspace matrix exponential-vector product: compute exp(t*A)*v.
LU factorization with partial pivoting.
Dense row-major matrix templated over scalar type T.
Matrix dense_expm_pade6(const Matrix &A)
Definition expv.cpp:14
double real
Definition types.hpp:10
std::size_t idx
Definition types.hpp:11
void scale(Vector &v, real alpha, Backend b=default_backend)
Compute .
Definition vector.cpp:15
Vector expv(real t, const Op &A, const Vector &v, int m_max=30, real tol=1e-8)
Compute for any adapter.
Definition expv.hpp:27
void matmul(const Matrix &A, const Matrix &B, Matrix &C, Backend b=default_backend)
C = A * B.
Definition matrix.cpp:20
void lu_solve(const LUResult &f, const Vector &b, Vector &x)
Solve from a precomputed factorization.
Definition lu.cpp:19
LUResult lu(const Matrix &A, Backend backend=lapack_backend)
Definition lu.cpp:10
Umbrella include for operator concepts and adapters.
Packed factorization .
Definition lu.hpp:12
Adapt a SparseMatrix to the operator protocol.
Definition sparse.hpp:11
Dense vector storage and operations.