changed interface to only have minimal overhead using true impes.

It gives overhead in constructor when linear system is created. No overhead if reuse is used.

This commit 141903a26 cherry-picked, cleaned and made compilable with
recent changes
This commit is contained in:
hnil 2019-08-21 22:22:02 +02:00 committed by Markus Blatt
parent bfa859c099
commit 90b22d8713
7 changed files with 46 additions and 22 deletions

View File

@ -148,6 +148,9 @@ public:
assert(recreate_solver == false); assert(recreate_solver == false);
// Never recreate solver. // Never recreate solver.
} }
VectorType weights;
if( prm_.get<std::string>("preconditioner.type") == "cpr" || if( prm_.get<std::string>("preconditioner.type") == "cpr" ||
prm_.get<std::string>("preconditioner.type") == "cprt" prm_.get<std::string>("preconditioner.type") == "cprt"
) )
@ -157,17 +160,21 @@ public:
transpose = true; transpose = true;
} }
if(prm_.get<std::string>("preconditioner.weight_type") == "quasiimpes") { if(prm_.get<std::string>("preconditioner.weight_type") == "quasiimpes") {
VectorType weights = Opm::Amg::getQuasiImpesWeights<MatrixType, VectorType>( if( not( recreate_solver || !solver_) ){
// weighs will be created as default in the solver
weights = Opm::Amg::getQuasiImpesWeights<MatrixType, VectorType>(
mat.istlMatrix(), mat.istlMatrix(),
prm_.get<int>("preconditioner.pressure_var_index"), transpose); prm_.get<int>("preconditioner.pressure_var_index"), transpose);
prm_.put("preconditioner.weights",weights); }
}else if(prm_.get<std::string>("preconditioner.weight_type") == "trueimpes" ){ }else if(prm_.get<std::string>("preconditioner.weight_type") == "trueimpes" ){
VectorType weights = weights =
this->getTrueImpesWeights(b, prm_.get<int>("preconditioner.pressure_var_index")); this->getTrueImpesWeights(b, prm_.get<int>("preconditioner.pressure_var_index"));
if( recreate_solver || !solver_){
// need weights for the constructor
prm_.put("preconditioner.weights",weights); prm_.put("preconditioner.weights",weights);
}
}else{ }else{
throw std::runtime_error("no such weights implemented for cpr"); throw std::runtime_error("no such weights implemented for cpr");
} }
@ -183,7 +190,7 @@ public:
} }
rhs_ = b; rhs_ = b;
} else { } else {
solver_->preconditioner().update(prm_); solver_->preconditioner().update(weights, prm_.get_child("preconditioner"));
rhs_ = b; rhs_ = b;
} }
} }

View File

@ -63,9 +63,9 @@ public:
} }
// The update() function does nothing for a wrapped preconditioner. // The update() function does nothing for a wrapped preconditioner.
virtual void update(const boost::property_tree::ptree& p) override virtual void update(const X& w,const boost::property_tree::ptree& pt) override
{ {
orig_precond_.update(p); orig_precond_.update(w, pt);
} }
private: private:

View File

@ -88,7 +88,13 @@ public:
: linear_operator_(linearoperator) : linear_operator_(linearoperator)
, finesmoother_(PrecFactory::create(linearoperator, prm.get_child("finesmoother"))) , finesmoother_(PrecFactory::create(linearoperator, prm.get_child("finesmoother")))
, comm_(nullptr) , comm_(nullptr)
, weights_(prm.get<VectorType>("weights")) , weights_(
(prm.get<std::string>("weight_type") != "quasiimpes") ?
prm.get<VectorType>("weights") :
Opm::Amg::getQuasiImpesWeights<MatrixType, VectorType>(linearoperator.getmat(),
prm.get<int>("pressure_var_index"),
transpose)
)
, levelTransferPolicy_(dummy_comm_, weights_, prm.get<int>("pressure_var_index")) , levelTransferPolicy_(dummy_comm_, weights_, prm.get<int>("pressure_var_index"))
, coarseSolverPolicy_(prm.get_child("coarsesolver")) , coarseSolverPolicy_(prm.get_child("coarsesolver"))
, twolevel_method_(linearoperator, , twolevel_method_(linearoperator,
@ -112,7 +118,13 @@ public:
: linear_operator_(linearoperator) : linear_operator_(linearoperator)
, finesmoother_(PrecFactory::create(linearoperator, prm.get_child("finesmoother"), comm)) , finesmoother_(PrecFactory::create(linearoperator, prm.get_child("finesmoother"), comm))
, comm_(&comm) , comm_(&comm)
, weights_(prm.get<VectorType>("weights")) , weights_(
(prm.get<std::string>("weight_type") != "quasiimpes") ?
prm.get<VectorType>("weights") :
Opm::Amg::getQuasiImpesWeights<MatrixType, VectorType>(linearoperator.getmat(),
prm.get<int>("pressure_var_index"),
transpose)
)
, levelTransferPolicy_(*comm_, weights_, prm.get<int>("pressure_var_index")) , levelTransferPolicy_(*comm_, weights_, prm.get<int>("pressure_var_index"))
, coarseSolverPolicy_(prm.get_child("coarsesolver")) , coarseSolverPolicy_(prm.get_child("coarsesolver"))
, twolevel_method_(linearoperator, , twolevel_method_(linearoperator,
@ -149,11 +161,15 @@ public:
twolevel_method_.post(x); twolevel_method_.post(x);
} }
virtual void update(const boost::property_tree::ptree& prm) override virtual void update(const VectorType& weights, const boost::property_tree::ptree& /*prm*/) override
{ {
// if(prm.get<std::string>("weight_type") == "quasiimpes"){
// Opm::Amg::getQuasiImpesWeights<MatrixType, VectorType>( // Opm::Amg::getQuasiImpesWeights<MatrixType, VectorType>(
// linear_operator_.getmat(), prm_.get<int>("pressure_var_index"), transpose, weights_); // linear_operator_.getmat(), prm_.get<int>("pressure_var_index"), transpose, weights_);
weights_ = prm.get<VectorType>("weights"); // weights_ = prm.get<VectorType>("weights");
// }else{
weights_ = weights;
//}
updateImpl(comm_); updateImpl(comm_);
} }

View File

@ -921,7 +921,7 @@ public:
DUNE_UNUSED_PARAMETER(x); DUNE_UNUSED_PARAMETER(x);
} }
virtual void update(const boost::property_tree::ptree& = boost::property_tree::ptree()) override virtual void update(const Range& = Range(), const boost::property_tree::ptree& = boost::property_tree::ptree()) override
{ {
// (For older DUNE versions the communicator might be // (For older DUNE versions the communicator might be
// invalid if redistribution in AMG happened on the coarset level. // invalid if redistribution in AMG happened on the coarset level.

View File

@ -31,7 +31,7 @@ template <class X, class Y>
class PreconditionerWithUpdate : public Preconditioner<X, Y> class PreconditionerWithUpdate : public Preconditioner<X, Y>
{ {
public: public:
virtual void update(const boost::property_tree::ptree& pt) = 0; virtual void update(const X& w, const boost::property_tree::ptree& pt) = 0;
}; };
template <class OriginalPreconditioner> template <class OriginalPreconditioner>
@ -69,7 +69,7 @@ public:
} }
// The update() function does nothing for a wrapped preconditioner. // The update() function does nothing for a wrapped preconditioner.
virtual void update(const boost::property_tree::ptree& /* pt */) override virtual void update(const X& /*w*/, const boost::property_tree::ptree& /*pt*/) override
{ {
} }

View File

@ -85,7 +85,8 @@ namespace Amg
void updatePreconditioner() void updatePreconditioner()
{ {
pt::ptree prm; pt::ptree prm;
linsolver_->preconditioner().update(prm); X w;
linsolver_->preconditioner().update(w, prm);
} }
private: private:

View File

@ -239,7 +239,7 @@ namespace Dune
/** /**
* @brief Update the coarse solver and the hierarchies. * @brief Update the coarse solver and the hierarchies.
*/ */
virtual void update(const boost::property_tree::ptree& prm); virtual void update(const X& w, const boost::property_tree::ptree& prm);
virtual void update(); virtual void update();
/** /**
@ -470,7 +470,7 @@ namespace Dune
} }
template<class M, class X, class S, class PI, class A> template<class M, class X, class S, class PI, class A>
void AMGCPR<M,X,S,PI,A>::update(const boost::property_tree::ptree& /* prm */) void AMGCPR<M,X,S,PI,A>::update(const X& /*w*/, const boost::property_tree::ptree& /*prm*/)
{ {
update(); update();
} }