Wildmeshing Toolkit
Loading...
Searching...
No Matches
Partitioning.h
1#pragma once
2
3#include <Eigen/Core>
4
5#include <memory>
6
7namespace wmtk {
8
10using metis_index_t = int32_t;
11
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)
25{
26 const auto num_elems = static_cast<metis_index_t>(facets.rows());
27 const auto elem_size = static_cast<metis_index_t>(facets.cols());
28
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);
35 }
36 }
37 e_ptr[num_elems] = num_elems * elem_size;
38 return std::make_pair(std::move(e_ptr), std::move(e_ind));
39}
40
52Eigen::Matrix<metis_index_t, Eigen::Dynamic, 1> partition_mesh_vertices_raw(
53 metis_index_t num_elems,
54 metis_index_t num_nodes,
55 metis_index_t* e_ptr,
56 metis_index_t* e_ind,
57 metis_index_t num_partitions);
58
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)
73{
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(
78 num_elems,
79 num_nodes,
80 res.first.get(),
81 res.second.get(),
82 num_partitions);
83}
84
85} // namespace wmtk