Skip to content
Snippets Groups Projects
Commit c196b700 authored by Oliver Sander's avatar Oliver Sander
Browse files

Use a shared_ptr to store the matrix internally, instead of a reference

This makes the test compile and pass again.
parent 2202bcd2
No related branches found
No related tags found
No related merge requests found
......@@ -9,10 +9,10 @@ template <class MatrixType, class VectorType>
void CGStep<MatrixType, VectorType>::preprocess()
{
// Compute the residual (r starts out as the rhs)
matrix_.mmv(x_,r_);
matrix_->mmv(x_,r_);
if (preconditioner_) {
preconditioner_->setMatrix(matrix_);
preconditioner_->setMatrix(*matrix_);
preconditioner_->apply(p_, r_);
} else
p_ = r_;
......@@ -25,7 +25,7 @@ void CGStep<MatrixType, VectorType>::iterate()
{
VectorType q(x_);
matrix_.mv(p_, q); // q_0 = Ap_0
matrix_->mv(p_, q); // q_0 = Ap_0
const double alpha = r_squared_old_ / (p_ * q); // alpha_0 = r_0*r_0/p_0*Ap_0
x_.axpy(alpha, p_); // x_1 = x_0 + alpha_0 p_0
r_.axpy(-alpha, q); // r_1 = r_0 - alpha_0 Ap_0
......
......@@ -19,7 +19,7 @@ namespace Dune {
CGStep(const MatrixType& matrix,
VectorType& x,
const VectorType& rhs)
: p_(rhs.size()), r_(rhs), x_(x), matrix_(matrix),
: p_(rhs.size()), r_(rhs), x_(x), matrix_(stackobject_to_shared_ptr(matrix)),
preconditioner_(nullptr)
{}
......@@ -34,7 +34,7 @@ namespace Dune {
//! Set linear operator, solution and right hand side
virtual void setProblem(const MatrixType& mat, VectorType& x, const VectorType& rhs)
{
matrix_ = mat;
matrix_ = stackobject_to_shared_ptr(mat);
x_ = x;
r_ = rhs;
}
......@@ -49,7 +49,7 @@ namespace Dune {
VectorType p_; // search direction
VectorType r_; // residual
VectorType& x_;
const MatrixType& matrix_;
std::shared_ptr<const MatrixType> matrix_;
double r_squared_old_;
Preconditioner<MatrixType, VectorType>* preconditioner_;
};
......
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Please register or to comment