From 6c514a80219e438197a5d8a2d096b054bfff2c5a Mon Sep 17 00:00:00 2001 From: Sebastian Eibl <sebastian.eibl@fau.de> Date: Mon, 26 Feb 2018 13:53:36 +0100 Subject: [PATCH] added base weight and stringify functions to parmetis --- .../loadbalancing/DynamicParMetis.cpp | 53 +++++++++++++++++-- .../loadbalancing/DynamicParMetis.h | 4 ++ .../MetisAssignmentFunctor.h | 11 ++-- 3 files changed, 62 insertions(+), 6 deletions(-) diff --git a/src/blockforest/loadbalancing/DynamicParMetis.cpp b/src/blockforest/loadbalancing/DynamicParMetis.cpp index a612d4775..a2cc8f1a9 100644 --- a/src/blockforest/loadbalancing/DynamicParMetis.cpp +++ b/src/blockforest/loadbalancing/DynamicParMetis.cpp @@ -272,7 +272,7 @@ DynamicParMetis::Algorithm DynamicParMetis::stringToAlgorithm( std::string s ) else if( s == "REFINE_KWAY" ) return PARMETIS_REFINE_KWAY; else - WALBERLA_ABORT( "Illegal ParMetis algorithm specified! Valid choices are: \"PART_GEOM_KWAY\", \"PART_KWAY\", \"PART_ADAPTIVE_REPART\", or \"REFINE_KWAY\"." ); + WALBERLA_ABORT( "Illegal ParMetis algorithm specified (" << s << ")! Valid choices are: \"PART_GEOM_KWAY\", \"PART_KWAY\", \"PART_ADAPTIVE_REPART\", or \"REFINE_KWAY\"." ); } @@ -290,7 +290,7 @@ DynamicParMetis::WeightsToUse DynamicParMetis::stringToWeightsToUse( std::string else if( s == "BOTH_WEIGHTS" ) return PARMETIS_BOTH_WEIGHTS; else - WALBERLA_ABORT( "Illegal ParMetis weights usage specified! Valid choices are: \"NO_WEIGHTS\", \"EDGE_WEIGHTS\", \"VERTEX_WEIGHTS\", or \"BOTH_WEIGHTS\"." ); + WALBERLA_ABORT( "Illegal ParMetis weights usage specified (" << s << ")! Valid choices are: \"NO_WEIGHTS\", \"EDGE_WEIGHTS\", \"VERTEX_WEIGHTS\", or \"BOTH_WEIGHTS\"." ); } @@ -304,7 +304,54 @@ DynamicParMetis::EdgeSource DynamicParMetis::stringToEdgeSource( std::string s ) else if( s == "EDGES_FROM_EDGE_WEIGHTS" ) return PARMETIS_EDGES_FROM_EDGE_WEIGHTS; else - WALBERLA_ABORT( "Illegal ParMetis weights usage specified! Valid choices are: \"EDGES_FROM_FOREST\" or \"EDGES_FROM_EDGE_WEIGHTS\"" ); + WALBERLA_ABORT( "Illegal ParMetis weights usage specified (" << s << ")! Valid choices are: \"EDGES_FROM_FOREST\" or \"EDGES_FROM_EDGE_WEIGHTS\"" ); +} + + +std::string DynamicParMetis::algorithmToString( ) const +{ + switch (algorithm_) + { + case walberla::blockforest::DynamicParMetis::PARMETIS_PART_GEOM_KWAY: + return "PART_GEOM_KWAY"; + case walberla::blockforest::DynamicParMetis::PARMETIS_PART_KWAY: + return "PART_KWAY"; + case walberla::blockforest::DynamicParMetis::PARMETIS_ADAPTIVE_REPART: + return "PART_ADAPTIVE_REPART"; + case walberla::blockforest::DynamicParMetis::PARMETIS_REFINE_KWAY: + return "PARMETIS_REFINE_KWAY"; + } + return "Unknown"; +} + + +std::string DynamicParMetis::weightsToUseToString( ) const +{ + switch (weightsToUse_) + { + case walberla::blockforest::DynamicParMetis::PARMETIS_NO_WEIGHTS: + return "NO_WEIGHTS"; + case walberla::blockforest::DynamicParMetis::PARMETIS_EDGE_WEIGHTS: + return "EDGE_WEIGHTS"; + case walberla::blockforest::DynamicParMetis::PARMETIS_VERTEX_WEIGHTS: + return "VERTEX_WEIGHTS"; + case walberla::blockforest::DynamicParMetis::PARMETIS_BOTH_WEIGHTS: + return "BOTH_WEIGHTS"; + } + return "Unknown"; +} + + +std::string DynamicParMetis::edgeSourceToString( ) const +{ + switch (edgeSource_) + { + case walberla::blockforest::DynamicParMetis::PARMETIS_EDGES_FROM_FOREST: + return "EDGES_FROM_FOREST"; + case walberla::blockforest::DynamicParMetis::PARMETIS_EDGES_FROM_EDGE_WEIGHTS: + return "EDGES_FROM_EDGE_WEIGHTS"; + } + return "Unknown"; } diff --git a/src/blockforest/loadbalancing/DynamicParMetis.h b/src/blockforest/loadbalancing/DynamicParMetis.h index 927ca2569..82bc4dd43 100644 --- a/src/blockforest/loadbalancing/DynamicParMetis.h +++ b/src/blockforest/loadbalancing/DynamicParMetis.h @@ -62,6 +62,10 @@ public: static WeightsToUse stringToWeightsToUse( std::string s ); static EdgeSource stringToEdgeSource( std::string s ); + std::string algorithmToString() const; + std::string weightsToUseToString() const; + std::string edgeSourceToString() const; + protected: Algorithm algorithm_; WeightsToUse weightsToUse_; diff --git a/src/pe/amr/weight_assignment/MetisAssignmentFunctor.h b/src/pe/amr/weight_assignment/MetisAssignmentFunctor.h index bed286166..ee5647f3d 100644 --- a/src/pe/amr/weight_assignment/MetisAssignmentFunctor.h +++ b/src/pe/amr/weight_assignment/MetisAssignmentFunctor.h @@ -35,14 +35,13 @@ public: typedef blockforest::DynamicParMetisBlockInfo PhantomBlockWeight; typedef blockforest::DynamicParMetisBlockInfoPackUnpack PhantomBlockWeightPackUnpackFunctor; - MetisAssignmentFunctor( const shared_ptr<InfoCollection>& ic ) : ic_( ic ) - {} + MetisAssignmentFunctor( shared_ptr<InfoCollection>& ic, const real_t baseWeight = real_t(10.0) ) : ic_(ic), baseWeight_(baseWeight) {} void operator()( std::vector< std::pair< const PhantomBlock *, walberla::any > > & blockData, const PhantomBlockForest & ) { for( auto it = blockData.begin(); it != blockData.end(); ++it ) { - const uint_t& weight = ic_->find( it->first->getId() )->second.numberOfLocalBodies; + const uint_t& weight = ic_->find( it->first->getId() )->second.numberOfLocalBodies + uint_c(baseWeight_); blockforest::DynamicParMetisBlockInfo info( int64_c(weight) ); info.setVertexSize(int64_c( weight )); for( uint_t nb = uint_t(0); nb < it->first->getNeighborhoodSize(); ++nb ) @@ -53,8 +52,14 @@ public: } } + inline void setBaseWeight( const double weight) { baseWeight_ = weight;} + inline double getBaseWeight() const { return baseWeight_; } + private: shared_ptr< InfoCollection > ic_; + + ///Base weight due to allocated data structures. A weight of zero for blocks is dangerous as empty blocks might accumulate on one process! + double baseWeight_ = real_t(10.0); }; } -- GitLab