How can ParMETIS_V3_PartMeshKWay be influenced to result in less cut edges like ParMETIS_V3_PartKway for same unstructured mesh?


The software I am working on uses ParMETIS to partitioning unstructured meshes.
It takes two different kinds of unstructured meshes: face-based or cell-based connectivity specified.

For face-based meshes, we treat each cell/element in the unstructured mesh as a vertex in a graph where the edges in that graph are the cell neighbors, then use ParMETIS_V3_PartKway to partition the mesh. The weighting on each vertex is the number of faces associated with that cell. No edge weighting is in use.

For cell-based meshes, we use ParMETIS_V3_PartMeshKway and just assign the cell connectivity data based on the node values. The weighting on each element is still the number of faces associated with that cell and the ncommonnodes parameter is set to 2 since our unstructured meshes can have any combination of tetrahedral, prism, pyramid, and hexahedral elements/cells.

Initial distribution for both routine uses is approximately equal fractions of the total cells in the unstructured mesh assigned to each processor so that processor 0 has the first sequential chunk by cell index, processor 2 has the second sequential chunk by index, etc. TPWGTS for both are 1 / nprocs and nprocs == nparts. UBVEC for both are 1.05 as advised.

When running the exact same mesh (one stored as face-based, the other stored as cell-base, but otherwise identical) through the two different ParMETIS routines, the ParMETIS_v3_PartMeshKway results in ~15% more cut edges (processor boundary breaks) than ParMETIS_V3_PartKway.

We would rather not reordering the cell-based data in memory to use the ParMETIS_V3_PartKWay routine.
Instead is there a way to influence ParMETIS_V3_PartMeshKWay to behave better and result in less cut edges/partition boundaries like ParMETIS_V3_PartKway?

Thanks for your help!

RE: Parmetis for graph partitioning

I want to use Parmetis for partitioning of several graphs. I do not know how should I develop my code to call the Parmetis for partitioning and which arguments to pass. Could you please explain briefly how does it work?

RE: Do you see the same

Do you see the same consistent 15% degradation even if you compute different seed (via the options[] array)?
Also, are you sure that the number of edges that the graph that ParMetis creates for the mesh (given ncommonnodes==2) is the same as the first case?