From 3cd0d9c29f6ab7ed4c571a7048c84e702627be9d Mon Sep 17 00:00:00 2001 From: Tor Harald Sandve Date: Wed, 6 Jan 2021 11:52:48 +0100 Subject: [PATCH] dynamically set zoltan imbalance tolerance --- ebos/eclbasevanguard.hh | 22 ++++++++++++++++++++++ ebos/eclcpgridvanguard.hh | 4 +++- 2 files changed, 25 insertions(+), 1 deletion(-) diff --git a/ebos/eclbasevanguard.hh b/ebos/eclbasevanguard.hh index 80bd53216..d37a0fcb3 100644 --- a/ebos/eclbasevanguard.hh +++ b/ebos/eclbasevanguard.hh @@ -116,6 +116,11 @@ struct SerialPartitioning { using type = UndefinedProperty; }; +template +struct ZoltanImbalanceTol { + using type = UndefinedProperty; +}; + template struct IgnoreKeywords { static constexpr auto value = ""; @@ -153,6 +158,12 @@ struct SerialPartitioning { static constexpr bool value = false; }; +template +struct ZoltanImbalanceTol { + using type = GetPropType; + static constexpr type value = 1.1; +}; + } // namespace Opm::Properties namespace Opm { @@ -206,6 +217,9 @@ public: "Order cells owned by rank before ghost/overlap cells."); EWOMS_REGISTER_PARAM(TypeTag, bool, SerialPartitioning, "Perform partitioning for parallel runs on a single process."); + EWOMS_REGISTER_PARAM(TypeTag, Scalar, ZoltanImbalanceTol, + "Perform partitioning for parallel runs on a single process."); + } /*! @@ -339,6 +353,7 @@ public: edgeWeightsMethod_ = Dune::EdgeWeightMethod(EWOMS_GET_PARAM(TypeTag, int, EdgeWeightsMethod)); ownersFirst_ = EWOMS_GET_PARAM(TypeTag, bool, OwnerCellsFirst); serialPartitioning_ = EWOMS_GET_PARAM(TypeTag, bool, SerialPartitioning); + zoltanImbalanceTol_ = EWOMS_GET_PARAM(TypeTag, Scalar, ZoltanImbalanceTol); // Make proper case name. { @@ -539,6 +554,12 @@ public: bool serialPartitioning() const { return serialPartitioning_; } + /*! + * \brief Parameter that sets the zoltan imbalance tolarance. + */ + Scalar zoltanImbalanceTol() const + { return zoltanImbalanceTol_; } + /*! * \brief Returns the name of the case. * @@ -791,6 +812,7 @@ private: Dune::EdgeWeightMethod edgeWeightsMethod_; bool ownersFirst_; bool serialPartitioning_; + Scalar zoltanImbalanceTol_; protected: /*! \brief The cell centroids after loadbalance was called. diff --git a/ebos/eclcpgridvanguard.hh b/ebos/eclcpgridvanguard.hh index 93dddad61..0896c4112 100644 --- a/ebos/eclcpgridvanguard.hh +++ b/ebos/eclcpgridvanguard.hh @@ -175,6 +175,7 @@ public: Dune::EdgeWeightMethod edgeWeightsMethod = this->edgeWeightsMethod(); bool ownersFirst = this->ownersFirst(); bool serialPartitioning = this->serialPartitioning(); + Scalar zoltanImbalanceTol = this->zoltanImbalanceTol(); // convert to transmissibility for faces // TODO: grid_->numFaces() is not generic. use grid_->size(1) instead? (might @@ -220,7 +221,8 @@ public: PropsCentroidsDataHandle handle(*grid_, eclState, eclGrid, this->centroids_, cartesianIndexMapper()); - this->parallelWells_ = std::get<1>(grid_->loadBalance(handle, edgeWeightsMethod, &wells, serialPartitioning, faceTrans.data(), ownersFirst)); + this->parallelWells_ = std::get<1>(grid_->loadBalance(handle, edgeWeightsMethod, &wells, serialPartitioning, + faceTrans.data(), ownersFirst, false, 1, true, zoltanImbalanceTol)); } catch(const std::bad_cast& e) {