1#ifndef AMREX_PCG_SOLVER_H_
2#define AMREX_PCG_SOLVER_H_
3#include <AMReX_Config.H>
33template <
int N,
typename T,
typename M,
typename P>
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; }
General-purpose algorithm utilities available on both host and device.
Fixed-size array types for use on GPU and CPU.
#define AMREX_FORCE_INLINE
Definition AMReX_Extension.H:124
#define AMREX_RESTRICT
Definition AMReX_Extension.H:37
#define AMREX_GPU_HOST_DEVICE
Definition AMReX_GpuQualifiers.H:20
Definition AMReX_Amr.cpp:50
__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