diff --git a/dune/istl/paamg/fastamg.hh b/dune/istl/paamg/fastamg.hh index a148a6fb0c8d8db8e9fe7d78d0a4cd4ee814ca15..84621a878715b29c2c1137b84ce3dd30d02003f7 100644 --- a/dune/istl/paamg/fastamg.hh +++ b/dune/istl/paamg/fastamg.hh @@ -103,11 +103,11 @@ namespace Dune * @param pinfo The information about the parallel distribution of the data. */ template<class C> - FastAMG(std::shared_ptr<Operator> fineOperator, + FastAMG(std::shared_ptr<const Operator> fineOperator, const C& criterion, const Parameters& parms=Parameters(), bool symmetric=true, - std::shared_ptr<ParallelInformation> pinfo=std::make_shared<ParallelInformation>()); + const ParallelInformation& pinfo=ParallelInformation()); /** * @brief Construct an AMG with an inexact coarse solver based on the smoother. @@ -125,21 +125,10 @@ namespace Dune FastAMG(const Operator& fineOperator, const C& criterion, const Parameters& parms=Parameters(), - bool symmetric=true) - : FastAMG(stackobject_to_shared_ptr(const_cast<Operator&>(fineOperator)), - criterion, parms, symmetric) - {} - - //! \copydoc FastAMG(const std::shared_ptr<Operator>&,const C&,const Parameters&,bool,std::shared_ptr<ParallelInformation>) - template<class C> - FastAMG(const Operator& fineOperator, - const C& criterion, - const Parameters& parms, - bool symmetric, - const ParallelInformation& pinfo) - : FastAMG(stackobject_to_shared_ptr(const_cast<Operator&>(fineOperator)), - criterion, parms, symmetric, - stackobject_to_shared_ptr(const_cast<ParallelInformation&>(pinfo))) + bool symmetric=true, + const ParallelInformation& pinfo=ParallelInformation()) + : FastAMG(stackobject_to_shared_ptr(fineOperator), + criterion, parms, symmetric, pinfo) {} /** @@ -201,8 +190,8 @@ namespace Dune */ template<class C> void createHierarchies(C& criterion, - std::shared_ptr<Operator> fineOperator, - std::shared_ptr<PI> pinfo); + std::shared_ptr<const Operator> fineOperator, + const PI& pinfo); /** * @brief A struct that holds the context of the current level. @@ -348,11 +337,11 @@ namespace Dune } template<class M, class X, class PI, class A> template<class C> - FastAMG<M,X,PI,A>::FastAMG(std::shared_ptr<Operator> fineOperator, + FastAMG<M,X,PI,A>::FastAMG(std::shared_ptr<const Operator> fineOperator, const C& criterion, const Parameters& parms, bool symmetric_, - std::shared_ptr<PI> pinfo) + const PI& pinfo) : solver_(), rhs_(), lhs_(), residual_(), scalarProduct_(), gamma_(parms.getGamma()), preSteps_(parms.getNoPreSmoothSteps()), postSteps_(parms.getNoPostSmoothSteps()), buildHierarchy_(true), @@ -369,17 +358,19 @@ namespace Dune // TODO: reestablish compile time checks. //static_assert(static_cast<int>(PI::category)==static_cast<int>(S::category), // "Matrix and Solver must match in terms of category!"); - createHierarchies(criterion, std::move(fineOperator), std::move(pinfo)); + createHierarchies(criterion, std::move(fineOperator), pinfo); } template<class M, class X, class PI, class A> template<class C> void FastAMG<M,X,PI,A>::createHierarchies(C& criterion, - std::shared_ptr<Operator> fineOperator, - std::shared_ptr<PI> pinfo) + std::shared_ptr<const Operator> fineOperator, + const PI& pinfo) { Timer watch; - matrices_ = std::make_shared<OperatorHierarchy>(std::move(fineOperator), std::move(pinfo)); + matrices_ = std::make_shared<OperatorHierarchy>( + std::const_pointer_cast<Operator>(std::move(fineOperator)), + stackobject_to_shared_ptr(const_cast<PI&>(pinfo))); matrices_->template build<NegateSet<typename PI::OwnerSet> >(criterion);