Actual source code: ex28.c
1: static char help[] = "Compare parallel partitioning strategies using matrix graphs\n\n";
3: #include <petscmat.h>
5: int main(int argc, char **args)
6: {
7: MatPartitioning part;
8: IS partis;
9: Mat A = NULL;
10: PetscInt max = -1;
11: PetscInt min = -1;
12: PetscReal balance = 0.0;
13: const PetscInt *ranges = NULL;
14: char filein[PETSC_MAX_PATH_LEN];
15: MPI_Comm comm;
16: PetscMPIInt size;
17: PetscInt p;
18: PetscBool flg;
20: /*load matrix*/
21: PetscFunctionBeginUser;
22: PetscCall(PetscInitialize(&argc, &args, NULL, help));
23: comm = PETSC_COMM_WORLD;
24: PetscCallMPI(MPI_Comm_size(comm, &size));
25: PetscCall(PetscOptionsGetString(NULL, NULL, "-fin", filein, sizeof(filein), &flg));
26: if (flg) {
27: PetscViewer view;
28: PetscCall(PetscViewerBinaryOpen(comm, filein, FILE_MODE_READ, &view));
29: PetscCall(MatCreate(comm, &A));
30: PetscCall(MatLoad(A, view));
31: PetscCall(PetscViewerDestroy(&view));
32: }
34: /*partition matrix*/
35: PetscCall(MatPartitioningCreate(comm, &part));
36: PetscCall(MatPartitioningSetAdjacency(part, A));
37: PetscCall(MatPartitioningSetFromOptions(part));
38: PetscCall(MatPartitioningApply(part, &partis));
39: PetscCall(MatGetOwnershipRanges(A, &ranges));
40: PetscCall(MatGetSize(A, &min, NULL));
41: for (p = 0; p < size; ++p) {
42: const PetscInt partsize = ranges[p + 1] - ranges[p];
44: max = PetscMax(max, partsize);
45: min = PetscMin(min, partsize);
46: }
47: balance = ((PetscReal)max) / min;
48: PetscCall(PetscPrintf(comm, "ranges: "));
49: for (p = 0; p <= size; ++p) {
50: if (p > 0) PetscCall(PetscPrintf(comm, ", "));
51: PetscCall(PetscPrintf(comm, "%" PetscInt_FMT, ranges[p]));
52: }
53: PetscCall(PetscPrintf(comm, "\n"));
54: PetscCall(PetscPrintf(comm, "max:%.0lf min:%.0lf balance:%.11lf\n", (double)max, (double)min, (double)balance));
55: PetscCall(PetscObjectViewFromOptions((PetscObject)partis, NULL, "-partition_view"));
56: PetscCall(MatPartitioningDestroy(&part));
57: PetscCall(ISDestroy(&partis));
58: PetscCall(MatDestroy(&A));
59: PetscCall(PetscFinalize());
60: return 0;
61: }