10using metis_index_t = int32_t;
22template <
typename DerivedF>
23std::pair<std::unique_ptr<metis_index_t[]>, std::unique_ptr<metis_index_t[]>> convert_index_buffer(
24 const Eigen::MatrixBase<DerivedF>& facets)
26 const auto num_elems =
static_cast<metis_index_t
>(facets.rows());
27 const auto elem_size =
static_cast<metis_index_t
>(facets.cols());
29 auto e_ptr = std::unique_ptr<metis_index_t[]>(
new metis_index_t[num_elems + 1]);
30 auto e_ind = std::unique_ptr<metis_index_t[]>(
new metis_index_t[num_elems * elem_size]);
31 for (metis_index_t f = 0; f < num_elems; ++f) {
32 e_ptr[f] = f * elem_size;
33 for (metis_index_t lv = 0; lv < elem_size; ++lv) {
34 e_ind[f * elem_size + lv] = facets(f, lv);
37 e_ptr[num_elems] = num_elems * elem_size;
38 return std::make_pair(std::move(e_ptr), std::move(e_ind));
52Eigen::Matrix<metis_index_t, Eigen::Dynamic, 1> partition_mesh_vertices_raw(
53 metis_index_t num_elems,
54 metis_index_t num_nodes,
57 metis_index_t num_partitions);
69template <
typename DerivedF>
70Eigen::Matrix<metis_index_t, Eigen::Dynamic, 1> partition_mesh_vertices(
71 const Eigen::MatrixBase<DerivedF>& facets,
72 metis_index_t num_partitions)
74 const auto num_elems =
static_cast<metis_index_t
>(facets.rows());
75 const auto num_nodes =
static_cast<metis_index_t
>(facets.maxCoeff() + 1);
76 auto res = convert_index_buffer(facets);
77 return partition_mesh_vertices_raw(