3#ifndef pRC_ALGORITHMS_SOLVER_GMRES_H
4#define pRC_ALGORITHMS_SOLVER_GMRES_H
19 template<Size M = 32, Bool MGS = true, Size K = 0>
24 static constexpr Size defaultMaxIterations()
30 constexpr GMRES(
Size const maxIterations = defaultMaxIterations())
31 : mMaxIterations(maxIterations)
37 return mMaxIterations;
49 inline constexpr auto operator()(XA &&A, XB &&b, XX &&x0 =
zero<RX>(),
57 using T =
typename V::Type;
59 auto const scaledTolerance = tolerance *
norm(b)();
62 Bool converged =
false;
74 auto vNorm =
norm(v[0])();
80 if(
norm(g(m)) <= scaledTolerance)
94 z.front(m - (M -
z.size())));
111 v[m + 1] -= R(
i, m) * v[
i];
119 v[m + 1] -= R(
i, m) * v[
i];
123 vNorm =
norm(v[m + 1])();
133 apply(G[m], g, m, m + 1);
138 "Inner Iteration:", m,
"Residual:",
norm(g(m)),
139 "Target:", scaledTolerance);
147 auto dx =
eval(v[0] *
y(0));
148 for(
Index i = 1;
i < m &&
i < M -
z.size(); ++
i)
154 dx +=
z.front(
i) *
y((M -
z.size()) +
i);
159 z.pushFront(dx / dxn);
169 while(iteration < maxIterations() && !converged);
173 if constexpr(M <= 512)
176 "GMRES failed to converge within allowed max "
177 "iterations for M =",
178 M,
"and K =", K,
"- doubling M and K and continuing");
184 "GMRES failed to converge within allowed max "
198 Logging::debug(
"GMRES converged after", iteration,
"iterations.");
202 return forward<XX>(x0);
211 Size const mMaxIterations;
constexpr auto maxIterations() const
Definition gmres.hpp:35
constexpr GMRES(Size const maxIterations=defaultMaxIterations())
Definition gmres.hpp:30
Definition concepts.hpp:25
Definition concepts.hpp:31
Definition concepts.hpp:19
int i
Definition gmock-matchers-comparisons_test.cc:603
Uncopyable z
Definition gmock-matchers-containers_test.cc:378
const double y
Definition gmock-matchers-containers_test.cc:377
int x
Definition gmock-matchers-containers_test.cc:376
static void info(Xs &&...args)
Definition log.hpp:27
static void debug(Xs &&...args)
Definition log.hpp:33
static void error(Xs &&...args)
Definition log.hpp:14
Restrict
Definition restrict.hpp:9
Hint
Definition hint.hpp:9
Transform
Definition transform.hpp:9
Definition backward_substitution.hpp:13
static constexpr decltype(auto) solve(Solver &&solver, XA &&A, XB &&b)
Definition solve.hpp:18
static constexpr Conditional< C, RemoveConstReference< X >, RemoveConst< X > > copy(X &&a)
Definition copy.hpp:13
Size Index
Definition basics.hpp:32
std::size_t Size
Definition basics.hpp:31
std::invoke_result_t< F, Args... > ResultOf
Definition basics.hpp:59
std::remove_reference_t< T > RemoveReference
Definition basics.hpp:41
static constexpr decltype(auto) apply(JacobiRotation< T > const &r, X &&m, Index const p, Index const q)
Definition jacobi_rotation.hpp:321
JacobiRotation(Tensor< T, M, N > const &a, Index const p, Index const q) -> JacobiRotation< T >
static constexpr auto innerProduct(TA const &a, TB const &b)
Definition inner_product.hpp:11
static constexpr auto slice(X &&a, Os const ... offsets)
Definition slice.hpp:17
std::common_type_t< Ts... > Common
Definition basics.hpp:53
typename ValueType< T >::Type Value
Definition value.hpp:72
Conditional<((Ns *... *1) *sizeof(T) > cHugepageSizeByte), HeapArray< T, Ns... >, StackArray< T, Ns... > > Array
Definition declarations.hpp:21
static constexpr auto chip(Sequence< T, Is... > const)
Definition sequence.hpp:584
static constexpr auto isApprox(XE &&expected, XA &&approx, TT const &tolerance=NumericLimits< TT >::tolerance())
Definition is_approx.hpp:14
constexpr auto cDebugLevel
Definition config.hpp:48
RemoveConst< RemoveReference< T > > RemoveConstReference
Definition basics.hpp:47
static constexpr auto identity()
Definition identity.hpp:13
static constexpr auto zero()
Definition zero.hpp:12
static constexpr auto round(T const &a)
Definition round.hpp:11
static constexpr decltype(auto) eval(X &&a)
Definition eval.hpp:12
static constexpr auto norm(T const &a)
Definition norm.hpp:12
Definition gtest_pred_impl_unittest.cc:54