Skip to content
Snippets Groups Projects
Commit 514b6ce9 authored by Jonathan Youett's avatar Jonathan Youett
Browse files

Take ownership of transferoperators when handing over shared pointer

parent fb1c0dc4
No related branches found
No related tags found
1 merge request!20Let mutligridstep take over ownership of transfer operators if handed over in shared pointer
......@@ -58,7 +58,7 @@ void MultigridStep<MatrixType, VectorType, BitVectorType>::preprocess()
// Check that transfer operators have been supplied
// //////////////////////////////////////////////////////////
for (size_t i=0; i<this->mgTransfer_.size(); i++)
if (this->mgTransfer_[i] == NULL)
if (!this->mgTransfer_[i])
DUNE_THROW(SolverError, "You have not supplied a multigrid restriction operator "
"for level " << i);
......
......@@ -9,7 +9,6 @@
#include <dune/solvers/transferoperators/multigridtransfer.hh>
#include <dune/solvers/solvers/iterativesolver.hh>
#include <dune/solvers/common/wrapownshare.hh>
#include "lineariterationstep.hh"
......@@ -101,35 +100,30 @@ namespace Dune {
{
mgTransfer_.resize(transfer.size());
for(size_t j=0; j<transfer.size(); ++j)
mgTransfer_[j] = transfer[j];
mgTransfer_[j] = Dune::stackobject_to_shared_ptr(*transfer[j]);
}
/**
* \brief Set transfer operator hierarchy from vector of shared_ptr's.
*
* Be careful: The Multigrid step does currently not share ownership
* afterwards. This may change in the future.
*/
* \brief Set transfer operator hierarchy from vector of shared_ptr's taking over ownership. */
template <class DerivedTransfer>
void setTransferOperators(const std::vector<typename std::shared_ptr<DerivedTransfer> >& transfer)
{
mgTransfer_.resize(transfer.size());
for(size_t j=0; j<transfer.size(); ++j)
mgTransfer_[j] = transfer[j].get();
mgTransfer_[j] = transfer[j];
}
/**
* \brief Set transfer operator hierarchy from vector.
*
* Be careful: The Multigrid step will not copy the transfer operators
* or share ownership
*/
template <class DerivedTransfer>
void setTransferOperators(const std::vector<DerivedTransfer>& transfer)
{
mgTransfer_.resize(transfer.size());
for(size_t j=0; j<transfer.size(); ++j)
mgTransfer_[j] = &transfer[j];
mgTransfer_[j] = Dune::stackobject_to_shared_ptr(transfer[j]);
}
virtual void iterate();
......@@ -242,7 +236,7 @@ namespace Dune {
std::vector<VectorType> rhsHierarchy_;
//protected:
std::vector<MultigridTransfer<VectorType, BitVectorType, MatrixType>* > mgTransfer_;
std::vector<std::shared_ptr<MultigridTransfer<VectorType, BitVectorType, MatrixType> > > mgTransfer_;
protected:
......
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Please register or to comment