25 M
const& mat, P
const& precond,
int maxiter, T rel_tol)
27 static_assert(std::is_floating_point_v<T>);
30 for (
int i = 0; i < N; ++i) {
31 rnorm0 = std::max(rnorm0, std::abs(
r[i]));
33 if (rnorm0 == 0) {
return 0; }
38 for (iter = 1; iter <= maxiter; ++iter) {
42 for (
int i = 0; i < N; ++i) { rho +=
r[i]*z[i]; }
43 if (rho == 0) {
break; }
45 for (
int i = 0; i < N; ++i) { p[i] = z[i]; }
47 auto rr = rho * (T(1.0)/rho_prev);
48 for (
int i = 0; i < N; ++i) {
49 p[i] = z[i] + rr * p[i];
55 for (
int i = 0; i < N; ++i) { pq += p[i]*q[i]; }
56 if (pq == 0) {
break; }
57 T alpha = rho * (T(1.0)/pq);
59 for (
int i = 0; i < N; ++i) {
62 rnorm = std::max(rnorm, std::abs(
r[i]));
64 if (rnorm <= rnorm0*rel_tol) {
break; }
AMREX_GPU_HOST_DEVICE AMREX_FORCE_INLINE int pcg_solve(T *AMREX_RESTRICT x, T *AMREX_RESTRICT r, M const &mat, P const &precond, int maxiter, T rel_tol)
Preconditioned conjugate gradient solver.
Definition AMReX_PCGSolver.H:24