#include <deal.II/lac/solver_cg.h>
#include <deal.II/lac/vector_memory.templates.h>
class MyVector : public dealii::Subscriptor
{
public:
MyVector(){};
using value_type = double;
};
template class dealii::VectorMemory<MyVector>;
template class dealii::GrowingVectorMemory<MyVector>;
class MySystemMatrix : public dealii::Subscriptor
{
public:
MySystemMatrix();
void vmult(MyVector & dst,
const MyVector &src) const;
};
class InverseMatrix : public dealii::Subscriptor
{
public:
InverseMatrix(const MySystemMatrix & matrix);
void vmult(MyVector &dst, const MyVector &src) const;
private:
const dealii::SmartPointer<const MySystemMatrix> _matrix;
};
void InverseMatrix::vmult(
MyVector& dst,
const MyVector& src) const
{
dealii::SolverControl solver_control( 100, 1e-6 );
dealii::GrowingVectorMemory<MyVector> GVM;
dealii::SolverCG<MyVector> solver(solver_control, GVM);
solver.solve<MySystemMatrix, MySystemMatrix>(*_matrix, dst, src, *_matrix);
}
InverseMatrix::InverseMatrix(
const MySystemMatrix & matrix)
: _matrix(&matrix)
{}