36 M
const& mat, P
const& precond,
int maxiter, T rel_tol)
38 static_assert(std::is_floating_point_v<T>);
41 for (
int i = 0; i < N; ++i) {
42 rnorm0 = std::max(rnorm0, std::abs(r[i]));
44 if (rnorm0 == 0) {
return 0; }
49 for (iter = 1; iter <= maxiter; ++iter) {
53 for (
int i = 0; i < N; ++i) { rho += r[i]*
z[i]; }
54 if (rho == 0) {
break; }
56 for (
int i = 0; i < N; ++i) {
p[i] =
z[i]; }
58 auto rr = rho * (T(1.0)/rho_prev);
59 for (
int i = 0; i < N; ++i) {
60 p[i] =
z[i] + rr *
p[i];
66 for (
int i = 0; i < N; ++i) { pq +=
p[i]*q[i]; }
67 if (pq == 0) {
break; }
68 T alpha = rho * (T(1.0)/pq);
70 for (
int i = 0; i < N; ++i) {
73 rnorm = std::max(rnorm, std::abs(r[i]));
75 if (rnorm <= rnorm0*rel_tol) {
break; }
while parser_exe_t p
Definition AMReX_Parser_Exe_Body.H:33
__host__ __device__ int pcg_solve(T *__restrict__ x, T *__restrict__ r, M const &mat, P const &precond, int maxiter, T rel_tol)
Fixed-size preconditioned conjugate-gradient solver.
Definition AMReX_PCGSolver.H:35