Wraps an SPD operator as its inverse: apply(rhs, out) solves op * out = rhs via matrix-free CG.
More...
|
| | CGInvOp (Backend, Op &&op, const config_t &cfg) |
| | CGInvOp (Backend, Op &&op, const config_t &cfg, Precond &&precond) |
| Backend | backend () const |
| const auto & | op () const |
| size_t | domain_size () const |
| size_t | range_size () const |
| auto | make_domain_vector () const |
| auto | make_range_vector () const |
| auto | make_workspace (bool committed=false) const |
| template<class RVector, class PVector, class ApVector, class OpWorkspace> |
| auto | make_workspace (RVector &&r, PVector &&p, ApVector &&ap, OpWorkspace &&op_workspace, bool committed=false) const |
| template<class RhsVector, class OutVector, class WorkspaceType> |
| void | apply (const RhsVector &rhs, OutVector &out, WorkspaceType &workspace) const |
| | out := op^{-1} rhs, via CG from the guess held in out.
|
| template<class RhsVector, class OutVector> |
| void | apply (const RhsVector &rhs, OutVector &out) const |
| const CGResult< value_type > & | last_result () const |
template<typename Backend, typename Op, typename Precond = NoPreconditioner>
class mundy::CGInvOp< Backend, Op, Precond >
Each solve iterates in out, starting from the guess it holds: out must be finite (zero is a cold start) and must not alias rhs.
Precond, when not NoPreconditioner, preconditions every solve.