Mundy: Multibody Nonlocal Dynamics Version of the Day
Loading...
Searching...
No Matches
mundy::CGInvOp< Backend, Op, Precond > Class Template Reference

Wraps an SPD operator as its inverse: apply(rhs, out) solves op * out = rhs via matrix-free CG. More...

#include <linear_system.hpp>

Classes

struct  Workspace

Public Types

using backend_t = Backend
using range_vector_t = decltype(Backend::make_range_vector(std::declval<const Op&>()))
using value_type = impl::vector_value_type<range_vector_t>
using config_t = CGConfig<value_type>

Public Member Functions

 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

Static Public Member Functions

static constexpr size_t static_domain_size ()
static constexpr size_t static_range_size ()

Detailed Description

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.

Member Typedef Documentation

◆ backend_t

template<typename Backend, typename Op, typename Precond = NoPreconditioner>
using mundy::CGInvOp< Backend, Op, Precond >::backend_t = Backend

◆ range_vector_t

template<typename Backend, typename Op, typename Precond = NoPreconditioner>
using mundy::CGInvOp< Backend, Op, Precond >::range_vector_t = decltype(Backend::make_range_vector(std::declval<const Op&>()))

◆ value_type

template<typename Backend, typename Op, typename Precond = NoPreconditioner>
using mundy::CGInvOp< Backend, Op, Precond >::value_type = impl::vector_value_type<range_vector_t>

◆ config_t

template<typename Backend, typename Op, typename Precond = NoPreconditioner>
using mundy::CGInvOp< Backend, Op, Precond >::config_t = CGConfig<value_type>

Constructor & Destructor Documentation

◆ CGInvOp() [1/2]

template<typename Backend, typename Op, typename Precond = NoPreconditioner>
mundy::CGInvOp< Backend, Op, Precond >::CGInvOp ( Backend ,
Op && op,
const config_t & cfg )
inline

◆ CGInvOp() [2/2]

template<typename Backend, typename Op, typename Precond = NoPreconditioner>
mundy::CGInvOp< Backend, Op, Precond >::CGInvOp ( Backend ,
Op && op,
const config_t & cfg,
Precond && precond )
inline

Member Function Documentation

◆ backend()

template<typename Backend, typename Op, typename Precond = NoPreconditioner>
Backend mundy::CGInvOp< Backend, Op, Precond >::backend ( ) const
inline

◆ op()

template<typename Backend, typename Op, typename Precond = NoPreconditioner>
const auto & mundy::CGInvOp< Backend, Op, Precond >::op ( ) const
inline

◆ domain_size()

template<typename Backend, typename Op, typename Precond = NoPreconditioner>
size_t mundy::CGInvOp< Backend, Op, Precond >::domain_size ( ) const
inline

◆ range_size()

template<typename Backend, typename Op, typename Precond = NoPreconditioner>
size_t mundy::CGInvOp< Backend, Op, Precond >::range_size ( ) const
inline

◆ static_domain_size()

template<typename Backend, typename Op, typename Precond = NoPreconditioner>
constexpr size_t mundy::CGInvOp< Backend, Op, Precond >::static_domain_size ( )
inlinestaticconstexpr

◆ static_range_size()

template<typename Backend, typename Op, typename Precond = NoPreconditioner>
constexpr size_t mundy::CGInvOp< Backend, Op, Precond >::static_range_size ( )
inlinestaticconstexpr

◆ make_domain_vector()

template<typename Backend, typename Op, typename Precond = NoPreconditioner>
auto mundy::CGInvOp< Backend, Op, Precond >::make_domain_vector ( ) const
inline

◆ make_range_vector()

template<typename Backend, typename Op, typename Precond = NoPreconditioner>
auto mundy::CGInvOp< Backend, Op, Precond >::make_range_vector ( ) const
inline

◆ make_workspace() [1/2]

template<typename Backend, typename Op, typename Precond = NoPreconditioner>
auto mundy::CGInvOp< Backend, Op, Precond >::make_workspace ( bool committed = false) const
inline

◆ make_workspace() [2/2]

template<typename Backend, typename Op, typename Precond = NoPreconditioner>
template<class RVector, class PVector, class ApVector, class OpWorkspace>
auto mundy::CGInvOp< Backend, Op, Precond >::make_workspace ( RVector && r,
PVector && p,
ApVector && ap,
OpWorkspace && op_workspace,
bool committed = false ) const
inline

◆ apply() [1/2]

template<typename Backend, typename Op, typename Precond = NoPreconditioner>
template<class RhsVector, class OutVector, class WorkspaceType>
void mundy::CGInvOp< Backend, Op, Precond >::apply ( const RhsVector & rhs,
OutVector & out,
WorkspaceType & workspace ) const
inline

◆ apply() [2/2]

template<typename Backend, typename Op, typename Precond = NoPreconditioner>
template<class RhsVector, class OutVector>
void mundy::CGInvOp< Backend, Op, Precond >::apply ( const RhsVector & rhs,
OutVector & out ) const
inline

◆ last_result()

template<typename Backend, typename Op, typename Precond = NoPreconditioner>
const CGResult< value_type > & mundy::CGInvOp< Backend, Op, Precond >::last_result ( ) const
inline