diff --git a/src/utils/Partitioner.cpp b/src/utils/Partitioner.cpp index 7a7eb2d9071bd9466611379efa3a950bb3c65d7c..347b07da6bffdf62d0218ca5231ed9e03a9c698f 100644 --- a/src/utils/Partitioner.cpp +++ b/src/utils/Partitioner.cpp @@ -26,7 +26,7 @@ Partitioner::partition(const CRSGraph& graph) std::vector<float> tpwgts(npart, 1. / npart); std::vector<float> ubvec{1.05}; - std::vector<int> options{1, 1, 0}; + std::vector<int> options{1, 0, 0}; int edgecut = 0; Array<int> part(0); @@ -66,9 +66,11 @@ Partitioner::partition(const CRSGraph& graph) int result = ParMETIS_V3_PartKway(&(vtxdist[0]), entries_ptr, neighbors_ptr, NULL, NULL, &wgtflag, &numflag, &ncon, &npart, &(tpwgts[0]), &(ubvec[0]), &(options[0]), &edgecut, &(part[0]), &parmetis_comm); + // LCOV_EXCL_START if (result == METIS_ERROR) { throw UnexpectedError("Metis Error"); } + // LCOV_EXCL_STOP MPI_Comm_free(&parmetis_comm); } @@ -81,9 +83,11 @@ Partitioner::partition(const CRSGraph& graph) #else // PUGS_HAS_MPI Array<int> -Partitioner::partition(const CRSGraph&) +Partitioner::partition(const CRSGraph& graph) { - return Array<int>(0); + Array<int> partition{graph.entries().size() - 1}; + partition.fill(0); + return partition; } #endif // PUGS_HAS_MPI diff --git a/tests/CMakeLists.txt b/tests/CMakeLists.txt index 6d032f7a668dcb041db8296b45e80c59919afcd4..a08e1a689cf3041dd62b90c81630381581b83f38 100644 --- a/tests/CMakeLists.txt +++ b/tests/CMakeLists.txt @@ -94,6 +94,7 @@ add_executable (unit_tests add_executable (mpi_unit_tests mpi_test_main.cpp test_Messenger.cpp + test_Partitioner.cpp ) add_library(test_Pugs_MeshDataBase diff --git a/tests/test_Partitioner.cpp b/tests/test_Partitioner.cpp new file mode 100644 index 0000000000000000000000000000000000000000..f40663976571587b42bcdbf618e93de3e1827415 --- /dev/null +++ b/tests/test_Partitioner.cpp @@ -0,0 +1,91 @@ +#ifndef TEST_PARTITIONER_HPP +#define TEST_PARTITIONER_HPP + +#include <catch2/catch.hpp> + +#include <utils/Messenger.hpp> +#include <utils/Partitioner.hpp> + +#include <set> + +// clazy:excludeall=non-pod-global-static + +TEST_CASE("Partitioner", "[utils]") +{ + SECTION("one graph split to all") + { + Partitioner partitioner; + + std::vector<int> entries_vector; + std::vector<int> neighbors_vector; + + entries_vector.push_back(neighbors_vector.size()); + + if (parallel::rank() == 0) { + neighbors_vector.push_back(1); + neighbors_vector.push_back(2); + neighbors_vector.push_back(4); + entries_vector.push_back(neighbors_vector.size()); + + neighbors_vector.push_back(0); + neighbors_vector.push_back(3); + neighbors_vector.push_back(5); + entries_vector.push_back(neighbors_vector.size()); + + neighbors_vector.push_back(0); + neighbors_vector.push_back(2); + neighbors_vector.push_back(5); + entries_vector.push_back(neighbors_vector.size()); + + neighbors_vector.push_back(0); + neighbors_vector.push_back(2); + neighbors_vector.push_back(5); + entries_vector.push_back(neighbors_vector.size()); + + neighbors_vector.push_back(3); + neighbors_vector.push_back(5); + neighbors_vector.push_back(7); + entries_vector.push_back(neighbors_vector.size()); + + neighbors_vector.push_back(3); + neighbors_vector.push_back(5); + neighbors_vector.push_back(6); + entries_vector.push_back(neighbors_vector.size()); + + neighbors_vector.push_back(5); + neighbors_vector.push_back(6); + neighbors_vector.push_back(7); + entries_vector.push_back(neighbors_vector.size()); + + neighbors_vector.push_back(3); + neighbors_vector.push_back(5); + neighbors_vector.push_back(7); + entries_vector.push_back(neighbors_vector.size()); + + neighbors_vector.push_back(4); + neighbors_vector.push_back(6); + neighbors_vector.push_back(7); + entries_vector.push_back(neighbors_vector.size()); + } + + Array<int> entries = convert_to_array(entries_vector); + Array<int> neighbors = convert_to_array(neighbors_vector); + + CRSGraph graph{entries, neighbors}; + + Array<int> partitioned = partitioner.partition(graph); + + REQUIRE((partitioned.size() + 1) == entries.size()); + + if (parallel::rank() == 0) { + std::set<int> assigned_ranks; + for (size_t i = 0; i < partitioned.size(); ++i) { + assigned_ranks.insert(partitioned[i]); + } + + REQUIRE(assigned_ranks.size() == parallel::size()); + } + } +} + +#endif // TEST_PARTITIONER_HPP