38 #ifndef EIGEN_IDRSTABL_H
39 #define EIGEN_IDRSTABL_H
45 template <
typename MatrixType,
typename Rhs,
typename Dest,
typename Preconditioner>
61 const Index maxIters = iters;
78 if (
S >=
N ||
L >=
N) {
90 DenseMatrixType u(
N,
L + 1);
91 DenseMatrixType
r(
N,
L + 1);
93 DenseMatrixType
V(
N * (
L + 1),
S);
104 r.col(0) = rhs -
mat *
x;
107 tol_error =
r.col(0).stableNorm();
113 DenseMatrixType
U(
N * (
L + 1),
S);
114 for (
Index col_index = 0; col_index <
S; ++col_index) {
119 if (col_index != 0) {
124 for (
Index i = 0;
i < col_index; ++
i) {
125 auto v =
U.col(
i).head(
N);
126 h_FOM(
i, col_index - 1) =
v.dot(
w);
127 w -= h_FOM(
i, col_index - 1) *
v;
130 h_FOM(col_index, col_index - 1) = u.col(0).stableNorm();
157 u.col(0) /= h_FOM(col_index, col_index - 1);
161 u.col(0).normalize();
164 U.col(col_index).head(
N) = u.col(0);
172 lu_solver.
compute(h_FOM.topLeftCorner(
S - 1,
S - 1));
180 if (FOM_residual < tol) {
184 x = precond.solve(
x2);
187 tol_error = FOM_residual / rhs_norm;
205 DenseMatrixType R_T = (
qr.householderQ() * DenseMatrixType::Identity(
N,
S)).
adjoint();
206 DenseMatrixType AR_T = DenseMatrixType(R_T *
mat);
211 bool reset_while =
false;
213 while (
k < maxIters) {
220 sigma.col(
i).noalias() = AR_T * precond.solve(
U.block(
N * (
j - 1),
i,
N, 1));
230 alpha.noalias() = lu_solver.
solve(AR_T * precond.solve(
r.col(
j - 2)));
234 update.noalias() =
U.topRows(
N) *
alpha;
235 r.col(0) -=
mat * precond.solve(update);
244 r.col(
j - 1).noalias() =
mat * precond.solve(
r.col(
j - 2));
246 tol_error =
r.col(0).stableNorm();
248 if (tol_error < tol) {
254 bool break_normalization =
false;
258 u.leftCols(
j + 1) =
r.leftCols(
j + 1);
261 u.leftCols(
j) = u.middleCols(1,
j);
266 u.reshaped().head(u.rows() *
j) -=
U.topRows(
N *
j) * lu_solver.
solve(AR_T * precond.solve(u.col(
j - 1)));
269 u.col(
j).noalias() =
mat * precond.solve(u.col(
j - 1));
281 auto v =
V.col(
i).segment(
N *
j,
N);
283 h =
v.dot(u.col(
j)) / h;
284 u.reshaped().head(u.rows() * (
j + 1)) -= h *
V.block(0,
i,
N * (
j + 1), 1);
288 Scalar normalization_constant = u.col(
j).stableNorm();
291 if (normalization_constant ==
RealScalar(0.0)) {
292 break_normalization =
true;
295 u.leftCols(
j + 1) /= normalization_constant;
298 V.block(0,
q - 1,
N * (
j + 1), 1).noalias() = u.reshaped().head(u.rows() * (
j + 1));
301 if (break_normalization ==
false) {
310 r.col(
L).noalias() =
mat * precond.solve(
r.col(
L - 1));
319 update.noalias() =
r.leftCols(
L) *
gamma;
321 r.col(0) -=
mat * precond.solve(update);
325 tol_error =
r.col(0).stableNorm();
327 if (tol_error < tol) {
350 x = precond.solve(
x);
353 tol_error = tol_error / rhs_norm;
359 template <
typename MatrixType_,
typename Preconditioner_ = DiagonalPreconditioner<
typename MatrixType_::Scalar>>
364 template <
typename MatrixType_,
typename Preconditioner_>
411 template <
typename MatrixType_,
typename Preconditioner_>
442 template <
typename MatrixDerived>
451 template <
typename Rhs,
typename Dest>
AnnoyingScalar abs(const AnnoyingScalar &x)
Definition: AnnoyingScalar.h:135
Array< int, Dynamic, 1 > v
Definition: Array_initializer_list_vector_cxx11.cpp:1
int i
Definition: BiCGSTAB_step_by_step.cpp:9
MatrixXcd V
Definition: EigenSolver_EigenSolver_MatrixType.cpp:15
HouseholderQR< MatrixXf > qr(A)
MatrixXd L
Definition: LLT_example.cpp:6
#define eigen_assert(x)
Definition: Macros.h:910
RowVector3d w
Definition: Matrix_resize_int.cpp:3
void adjoint(const MatrixType &m)
Definition: adjoint.cpp:85
Scalar * b
Definition: benchVecAdd.cpp:17
SCALAR Scalar
Definition: bench_gemm.cpp:45
NumTraits< Scalar >::Real RealScalar
Definition: bench_gemm.cpp:46
EIGEN_DONT_INLINE T::Scalar stableNorm(T &v)
Definition: bench_norm.cpp:14
MatrixXf MatrixType
Definition: benchmark-blocking-sizes.cpp:52
Householder rank-revealing QR decomposition of a matrix with column-pivoting.
Definition: ColPivHouseholderQR.h:54
LU decomposition of a matrix with complete pivoting, and related features.
Definition: FullPivLU.h:63
FullPivLU & compute(const EigenBase< InputType > &matrix)
Definition: FullPivLU.h:123
Householder QR decomposition of a matrix.
Definition: HouseholderQR.h:59
The IDR(s)STAB(l) is a combination of IDR(s) and BiCGSTAB(l). It is a short-recurrences Krylov method...
Definition: IDRSTABL.h:412
void setL(Index L)
Definition: IDRSTABL.h:462
Preconditioner_ Preconditioner
Definition: IDRSTABL.h:426
ComputationInfo m_info
Definition: IterativeSolverBase.h:389
MatrixType::Scalar Scalar
Definition: IDRSTABL.h:424
IDRSTABL()
Definition: IDRSTABL.h:430
Index m_S
Definition: IDRSTABL.h:420
void setS(Index S)
Definition: IDRSTABL.h:468
Index m_L
Definition: IDRSTABL.h:419
MatrixType_ MatrixType
Definition: IDRSTABL.h:423
IDRSTABL(const EigenBase< MatrixDerived > &A)
Definition: IDRSTABL.h:443
IterativeSolverBase< IDRSTABL > Base
Definition: IDRSTABL.h:413
RealScalar m_error
Definition: IterativeSolverBase.h:387
MatrixType::RealScalar RealScalar
Definition: IDRSTABL.h:425
Index m_iterations
Definition: IterativeSolverBase.h:388
void _solve_vector_with_guess_impl(const Rhs &b, Dest &x) const
Definition: IDRSTABL.h:452
const ActualMatrixType & matrix() const
Definition: IterativeSolverBase.h:374
Base class for linear iterative solvers.
Definition: IterativeSolverBase.h:124
Index maxIterations() const
Definition: IterativeSolverBase.h:251
ComputationInfo m_info
Definition: IterativeSolverBase.h:389
RealScalar m_error
Definition: IterativeSolverBase.h:387
Preconditioner m_preconditioner
Definition: IterativeSolverBase.h:382
Index m_iterations
Definition: IterativeSolverBase.h:388
bool m_isInitialized
Definition: SparseSolverBase.h:110
RealScalar m_tolerance
Definition: IterativeSolverBase.h:385
IDRSTABL< MatrixType_, Preconditioner_ > & derived()
Definition: SparseSolverBase.h:76
const ActualMatrixType & matrix() const
Definition: IterativeSolverBase.h:374
const Solve< Derived, Rhs > solve(const MatrixBase< Rhs > &b) const
Definition: SolverBase.h:106
@ N
Definition: constructor.cpp:22
@ NumericalIssue
Definition: Constants.h:442
@ Success
Definition: Constants.h:440
@ NoConvergence
Definition: Constants.h:444
Eigen::DenseIndex ret
Definition: level1_cplx_impl.h:43
RealScalar alpha
Definition: level1_cplx_impl.h:151
Scalar beta
Definition: level2_cplx_impl.h:36
char char char int int * k
Definition: level2_impl.h:374
bool idrstabl(const MatrixType &mat, const Rhs &rhs, Dest &x, const Preconditioner &precond, Index &iters, typename Dest::RealScalar &tol_error, Index L, Index S)
Definition: IDRSTABL.h:46
@ Rhs
Definition: TensorContractionMapper.h:20
const Scalar & y
Definition: RandomImpl.h:36
EIGEN_DEVICE_FUNC EIGEN_ALWAYS_INLINE std::enable_if_t< NumTraits< T >::IsSigned||NumTraits< T >::IsComplex, typename NumTraits< T >::Real > abs(const T &x)
Definition: MathFunctions.h:1355
EIGEN_DEVICE_FUNC const Scalar & q
Definition: SpecialFunctionsImpl.h:2019
EIGEN_DEVICE_FUNC EIGEN_ALWAYS_INLINE float sqrt(const float &x)
Definition: arch/SSE/MathFunctions.h:69
Namespace containing all symbols from the Eigen library.
Definition: bench_norm.cpp:70
EIGEN_DEFAULT_DENSE_INDEX_TYPE Index
The Index type as used for the API.
Definition: Meta.h:83
unsigned Preconditioner
----------------------—Domain Properties------------------------—
Definition: space_time_oscillating_cylinder.cc:725
Vector< double > x2(const Vector< double > &coord)
Cartesian coordinates centered at the point (1.5,1)
Definition: poisson/poisson_with_singularity/two_d_poisson.cc:102
Vector< double > x0(2, 0.0)
double U
Swimming speed.
Definition: two_d_variable_diff_adapt.cc:53
int sigma
Definition: calibrate.py:179
Definition: Eigen_Colamd.h:49
Mdouble gamma(Mdouble gamma_in)
This is the gamma function returns the true value for the half integer value.
Definition: ExtendedMath.cc:116
double Zero
Definition: pseudosolid_node_update_elements.cc:35
@ S
Definition: quadtree.h:62
list x
Definition: plotDoE.py:28
Definition: EigenBase.h:33
MatrixType_ MatrixType
Definition: IDRSTABL.h:366
Preconditioner_ Preconditioner
Definition: IDRSTABL.h:367
Definition: ForwardDeclarations.h:21
Definition: fft_test_shared.h:66
std::ptrdiff_t j
Definition: tut_arithmetic_redux_minmax.cpp:2