[petsc-users] [petsc-maint] metis version of petsc - segmentation fault

Matthew Knepley knepley at gmail.com
Thu Aug 25 12:08:22 CDT 2022

```On Thu, Aug 25, 2022 at 12:38 PM Alexandre Halbach <
alexandre.halbach at gmail.com> wrote:

> Hello,
>
> I am using the metis package provided by the latest petsc version, using
> --download-metis (Linux, 32 bits). This question is arguably more a metis
> issue but since metis is used in petsc and mumps this seems relevant to ask
> here too.
>
> I systematically get a segmentation fault on this metis version (didn't
> try others) when I partition even simple and not too large graphs ( O(5
> millions)). I tried a lot of cases as well as both the 32 and 64 bits
> version of petsc and also increasing ulimit (on Linux).
> Here is the shortest possible representative example with that problem
> (c++). I double checked it and I hope there is no mistake in this example.
> The below example constructs the containers for a 1D line graph (n
> vertices connected by edges one by one as in a chain. Both end vertices
> only have a single neighbor while all other vertices have two neighbors).
> Either this is something I am doing wrong or there is a bug in at least
> the metis version proposed in petsc.
>
> Here is the example producing a segfault. If you don't get a segfault try
> a 10 millions or more vertices graph.
>

You are exceeding the stack space. I will rewrite to malloc() and take a
look.

Thanks,

Matt

>
> Alex
>
>
> #include "metis.h"
>
> int main(void)
> {
>     // Number of vertices:
>     int n = 1000000;
>     // Addresses should for example be [0 1 3 5 7 8] for 5 vertices
>     for (int i = 2; i < n; i++)
>
>     // Connected vertices should for example be [1 0 2 1 3 2 4 3] for 5
> vertices
>     idx_t connectivities[2*(n-1)];
>     connectivities[0] = 1;
>     for (int i = 1; i < n-1; i++)
>     {
>         connectivities[2*i-1] = i-1;
>         connectivities[2*i+0] = i+1;
>     }
>     connectivities[2*(n-1)-1] = connectivities[2*(n-1)-2]-1;
>
>     idx_t nvtxs = n;
>     idx_t nEdges = n-1;
>
>     idx_t metisOptions[METIS_NOPTIONS];
>     METIS_SetDefaultOptions(metisOptions);
>     metisOptions[METIS_OPTION_NUMBERING] = 0; // c numbering (start at 0)
>
>     idx_t ncon = 1;
>     idx_t nParts = 2;
>     idx_t objval;
>     idx_t part[nvtxs];
>
>     int ret = METIS_PartGraphRecursive ( &nvtxs, &ncon, addresses,
> connectivities, NULL, NULL, NULL, &nParts, NULL, NULL, metisOptions,
> &objval, part );
> }
>

--
What most experimenters take for granted before they begin their
experiments is infinitely more interesting than any results to which their