95class PreconditionerRuntime
99 using backend_type = Backend;
100 using BackendType = Backend;
102 typedef typename Backend::value_type value_type;
103 typedef typename Backend::matrix matrix;
104 typedef typename Backend::vector vector;
105 typedef typename Backend::params backend_params;
109 template <
class Matrix>
110 PreconditionerRuntime(
const Matrix& A,
111 params prm = params(),
112 const backend_params& bprm = backend_params())
113 : _class(prm.get(
"class", ePreconditionerType::amg))
116 if (!prm.erase(
"class"))
117 ARCCORE_ALINA_PARAM_MISSING(
"class");
118 std::cout <<
"PreconditionerClass=" << _class <<
"\n";
120 case ePreconditionerType::amg: {
122 handle =
static_cast<void*
>(
new Precond(A, prm, bprm));
124 case ePreconditionerType::relaxation: {
126 handle =
static_cast<void*
>(
new Precond(A, prm, bprm));
128 case ePreconditionerType::dummy: {
130 handle =
static_cast<void*
>(
new Precond(A, prm, bprm));
132 case ePreconditionerType::nested: {
134 handle =
static_cast<void*
>(
new Precond(A, prm, bprm));
137 throw std::invalid_argument(
"Unsupported preconditioner class");
141 ~PreconditionerRuntime()
144 case ePreconditionerType::amg: {
146 delete static_cast<Precond*
>(handle);
148 case ePreconditionerType::relaxation: {
150 delete static_cast<Precond*
>(handle);
152 case ePreconditionerType::dummy: {
154 delete static_cast<Precond*
>(handle);
156 case ePreconditionerType::nested: {
158 delete static_cast<Precond*
>(handle);
165 template <
class Matrix>
166 void rebuild(
const Matrix& A,
const backend_params& bprm = backend_params())
169 case ePreconditionerType::amg: {
171 static_cast<Precond*
>(handle)->rebuild(A, bprm);
174 std::cerr <<
"rebuild is a noop unless the preconditioner is AMG" << std::endl;
179 template <
class Vec1,
class Vec2>
180 void apply(
const Vec1& rhs, Vec2& x)
const
183 case ePreconditionerType::amg: {
185 static_cast<Precond*
>(handle)->apply(rhs, x);
187 case ePreconditionerType::relaxation: {
189 static_cast<Precond*
>(handle)->apply(rhs, x);
191 case ePreconditionerType::dummy: {
193 static_cast<Precond*
>(handle)->apply(rhs, x);
195 case ePreconditionerType::nested: {
197 static_cast<Precond*
>(handle)->apply(rhs, x);
200 throw std::invalid_argument(
"Unsupported preconditioner class");
204 std::shared_ptr<matrix> system_matrix_ptr()
const
207 case ePreconditionerType::amg: {
209 return static_cast<Precond*
>(handle)->system_matrix_ptr();
211 case ePreconditionerType::relaxation: {
213 return static_cast<Precond*
>(handle)->system_matrix_ptr();
215 case ePreconditionerType::dummy: {
217 return static_cast<Precond*
>(handle)->system_matrix_ptr();
219 case ePreconditionerType::nested: {
221 return static_cast<Precond*
>(handle)->system_matrix_ptr();
224 throw std::invalid_argument(
"Unsupported preconditioner class");
228 const matrix& system_matrix()
const
230 return *system_matrix_ptr();
235 return backend::nbRow(system_matrix());
241 case ePreconditionerType::amg: {
243 return backend::bytes(*
static_cast<Precond*
>(handle));
245 case ePreconditionerType::relaxation: {
247 return backend::bytes(*
static_cast<Precond*
>(handle));
249 case ePreconditionerType::dummy: {
251 return backend::bytes(*
static_cast<Precond*
>(handle));
253 case ePreconditionerType::nested: {
255 return backend::bytes(*
static_cast<Precond*
>(handle));
258 throw std::invalid_argument(
"Unsupported preconditioner class");
262 friend std::ostream& operator<<(std::ostream& os,
const PreconditionerRuntime& p)
265 case ePreconditionerType::amg: {
267 return os << *static_cast<Precond*>(p.handle);
269 case ePreconditionerType::relaxation: {
271 return os << *static_cast<Precond*>(p.handle);
273 case ePreconditionerType::dummy: {
275 return os << *static_cast<Precond*>(p.handle);
277 case ePreconditionerType::nested: {
279 return os << *static_cast<Precond*>(p.handle);
282 throw std::invalid_argument(
"Unsupported preconditioner class");
288 const ePreconditionerType _class;
290 void* handle =
nullptr;