From 8404a6f5a2ae195404efc723d80fe6073476850b Mon Sep 17 00:00:00 2001
From: Stephane Del Pino <stephane.delpino44@gmail.com>
Date: Tue, 25 Sep 2018 19:15:55 +0200
Subject: [PATCH] Add Partitioner class

- Relies on ParMETIS
- Start testing/playing with it
---
 src/utils/CMakeLists.txt  |  1 +
 src/utils/Partitioner.cpp | 78 +++++++++++++++++++++++++++++++++++++++
 src/utils/Partitioner.hpp | 13 +++++++
 src/utils/PastisUtils.cpp |  5 +++
 4 files changed, 97 insertions(+)
 create mode 100644 src/utils/Partitioner.cpp
 create mode 100644 src/utils/Partitioner.hpp

diff --git a/src/utils/CMakeLists.txt b/src/utils/CMakeLists.txt
index d21584923..e4596de3d 100644
--- a/src/utils/CMakeLists.txt
+++ b/src/utils/CMakeLists.txt
@@ -10,6 +10,7 @@ add_library(
   ConsoleManager.cpp
   FPEManager.cpp
   Messenger.cpp
+  Partitioner.cpp
   PastisOStream.cpp
   PastisUtils.cpp
   RevisionInfo.cpp
diff --git a/src/utils/Partitioner.cpp b/src/utils/Partitioner.cpp
new file mode 100644
index 000000000..f5e0c945b
--- /dev/null
+++ b/src/utils/Partitioner.cpp
@@ -0,0 +1,78 @@
+#include <Partitioner.hpp>
+#include <Messenger.hpp>
+
+#include <parmetis.h>
+#include <vector>
+
+Partitioner::
+Partitioner()
+{
+  std::cout << commRank() << " / " << commSize() << '\n' << std::flush;
+
+  MPI_Barrier(MPI_COMM_WORLD);
+  if (commSize() != 3) {
+    Messenger::destroy();
+    std::cerr << "Commsize=" << commSize() << ". Need 3 PE to test";
+    std::exit(1);
+  }
+
+  idx_t wgtflag = 0;
+  idx_t numflag = 0;
+  idx_t ncon = 1;
+  idx_t npart= 3;
+  real_t wgts = 1./npart;
+  std::vector<real_t> tpwgts{wgts, wgts, wgts};
+  std::vector<real_t> ubvec{1.05};
+  std::vector<idx_t> options{0,0,0};
+  idx_t edgecut = 0;
+  std::vector<idx_t> part(5);
+
+  MPI_Comm mpi_comm_;
+  MPI_Comm_dup(MPI_COMM_WORLD, &mpi_comm_);
+  MPI_Comm* mpi_comm = & mpi_comm_;
+  switch (commRank()) {
+    case 0: {
+      std::vector<idx_t> xadj   {0,2,5,8,11,13};
+      std::vector<idx_t> adjncy {1,5,0,2,6,1,3,7,2,4,8,3,9};
+      std::vector<idx_t> vtxdist{0,5,10,15};
+
+      ParMETIS_V3_PartKway(&(vtxdist[0]), &(xadj[0]), &(adjncy[0]),
+                           NULL, NULL, &wgtflag, &numflag,
+                           &ncon, &npart, &(tpwgts[0]), &(ubvec[0]),
+                           &(options[0]), &edgecut, &(part[0]), mpi_comm);
+      break;
+    }
+    case 1: {
+      std::vector<idx_t> xadj   {0,3,7,11,15,18};
+      std::vector<idx_t> adjncy {0,6,10,1,5,7,11,2,6,8,12,3,7,9,13,4,8,14};
+      std::vector<idx_t> vtxdist{0,5,10,15};
+
+      ParMETIS_V3_PartKway(&(vtxdist[0]), &(xadj[0]), &(adjncy[0]),
+                           NULL, NULL, &wgtflag, &numflag,
+                           &ncon, &npart, &(tpwgts[0]), &(ubvec[0]),
+                           &(options[0]), &edgecut, &(part[0]), mpi_comm);
+      break;
+    }
+    case 2: {
+      std::vector<idx_t> xadj   {0,2,5,8,11,13};
+      std::vector<idx_t> adjncy {5,11,6,10,12,7,11,13,8,12,14,9,13};
+      std::vector<idx_t> vtxdist{0,5,10,15};
+
+      ParMETIS_V3_PartKway(&(vtxdist[0]), &(xadj[0]), &(adjncy[0]),
+                           NULL, NULL, &wgtflag, &numflag,
+                           &ncon, &npart, &(tpwgts[0]), &(ubvec[0]),
+                           &(options[0]), &edgecut, &(part[0]), mpi_comm);
+      break;
+    }
+    default: {
+      std::cerr << "unexpected rank " << commRank() << "!\n";
+      std::exit(0);
+    }
+  }
+
+  std::cerr << commRank() << " FINISHED\n";
+  MPI_Barrier(MPI_COMM_WORLD);
+
+  Messenger::destroy();
+  std::exit(0);
+}
diff --git a/src/utils/Partitioner.hpp b/src/utils/Partitioner.hpp
new file mode 100644
index 000000000..88e3e2672
--- /dev/null
+++ b/src/utils/Partitioner.hpp
@@ -0,0 +1,13 @@
+#ifndef PARTITIONER_HPP
+#define PARTITIONER_HPP
+
+class Partitioner
+{
+ public:
+  Partitioner();
+  Partitioner(const Partitioner&) = default;
+  ~Partitioner() = default;
+};
+
+
+#endif // PARTITIONER_HPP
diff --git a/src/utils/PastisUtils.cpp b/src/utils/PastisUtils.cpp
index 66aa50b49..ab6271606 100644
--- a/src/utils/PastisUtils.cpp
+++ b/src/utils/PastisUtils.cpp
@@ -16,10 +16,15 @@
 
 #include <CLI/CLI.hpp>
 
+#include <Partitioner.hpp>
+
 std::string initialize(int& argc, char* argv[])
 {
   Messenger::create(argc, argv);
 
+
+  Partitioner P;
+
   long unsigned number = 10;
   std::string filename;
 
-- 
GitLab