9#include <kernel/solver/base.hpp>
10#include <kernel/global/vector.hpp>
38 template<
typename VectorOuter_,
typename VectorInner_>
43 using VectorTypeOuter = VectorOuter_;
46 using VectorTypeInner = VectorInner_;
50 std::shared_ptr<SolverTypeInner> _inner_solver;
60 _inner_solver(inner_solver)
74 _inner_solver->init_symbolic();
81 _inner_solver->init_numeric();
87 _inner_solver->done_numeric();
94 _inner_solver->done_symbolic();
98 virtual Status apply(VectorTypeOuter& vec_cor,
const VectorTypeOuter& vec_def)
override
100 Statistics::add_solver_expression(std::make_shared<ExpressionStartSolve>(this->
name()));
102 VectorTypeInner vec_def_inner;
103 vec_def_inner.convert(vec_def);
106 Statistics::add_solver_expression(std::make_shared<ExpressionCallPrecond>(this->
name(), this->_inner_solver->name()));
107 Status status = _inner_solver->apply(vec_cor_inner, vec_def_inner);
110 Statistics::add_solver_expression(std::make_shared<ExpressionEndSolve>(this->
name(), status, 0));
114 vec_cor.convert(vec_cor_inner);
115 Statistics::add_solver_expression(std::make_shared<ExpressionEndSolve>(this->
name(),
Status::success, 0));
129 template<
typename VectorOuter_,
typename VectorInner_>
132 return std::make_shared<ConvertPrecond<VectorOuter_, VectorInner_>>(inner_solver);
139 template<
typename LocalVectorOuter_,
typename LocalVectorInner_,
typename MirrorOuter_,
typename MirrorInner_>
141 public SolverBase<Global::Vector<LocalVectorOuter_, MirrorOuter_>>
154 std::shared_ptr<SolverTypeInner> _inner_solver;
164 _inner_solver(inner_solver)
178 _inner_solver->init_symbolic();
185 _inner_solver->init_numeric();
191 _inner_solver->done_numeric();
198 _inner_solver->done_symbolic();
204 Statistics::add_solver_expression(std::make_shared<ExpressionStartSolve>(this->
name()));
207 vec_def_inner.convert(vec_def_inner.
get_gate(), vec_def);
210 Statistics::add_solver_expression(std::make_shared<ExpressionCallPrecond>(this->
name(), this->_inner_solver->name()));
211 Status status = _inner_solver->apply(vec_cor_inner, vec_def_inner);
214 Statistics::add_solver_expression(std::make_shared<ExpressionEndSolve>(this->
name(), status, 0));
218 vec_cor.convert(vec_cor.
get_gate(), vec_cor_inner);
219 Statistics::add_solver_expression(std::make_shared<ExpressionEndSolve>(this->
name(),
Status::success, 0));
233 template<
typename LocalVectorOuter_,
typename LocalVectorInner_,
typename MirrorOuter_,
typename MirrorInner_>
Global vector wrapper class template.
const GateType * get_gate() const
Returns a const pointer to the internal gate of the vector.
Vector clone(LAFEM::CloneMode mode=LAFEM::CloneMode::Weak) const
Creates and returns a clone of this global vector.
virtual void init_numeric() override
Numeric initialization method.
virtual String name() const override
Returns the name of the solver.
virtual void init_symbolic() override
Symbolic initialization method.
virtual void done_symbolic() override
Symbolic finalization method.
ConvertPrecond(std::shared_ptr< SolverTypeInner > inner_solver)
Constructor.
virtual Status apply(VectorTypeOuter &vec_cor, const VectorTypeOuter &vec_def) override
Solver application method.
virtual void done_numeric() override
Numeric finalization method.
Solver conversion module.
virtual Status apply(VectorTypeOuter &vec_cor, const VectorTypeOuter &vec_def) override
Solver application method.
virtual String name() const override
Returns the name of the solver.
ConvertPrecond(std::shared_ptr< SolverTypeInner > inner_solver)
Constructor.
virtual void done_numeric() override
Numeric finalization method.
virtual void init_numeric() override
Numeric initialization method.
virtual void init_symbolic() override
Symbolic initialization method.
virtual void done_symbolic() override
Symbolic finalization method.
Polymorphic solver interface.
virtual void init_symbolic()
Symbolic initialization method.
virtual void init_numeric()
Numeric initialization method.
virtual void done_symbolic()
Symbolic finalization method.
virtual void done_numeric()
Numeric finalization method.
String class implementation.
bool status_success(Status status)
Status success check function.
std::shared_ptr< ConvertPrecond< VectorOuter_, VectorInner_ > > new_convert_precond(std::shared_ptr< SolverBase< VectorInner_ > > inner_solver)
Creates a new ConvertPrecond solver object.
Status
Solver status return codes enumeration.
@ success
solving successful (convergence criterion fulfilled)