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