xref: /petsc/src/dm/impls/plex/tests/ex33.c (revision 7a7aea1f13832695eadc2fd5afef8ec0a48c5f75)
1 static char help[] = "Tests PetscPartitioner.\n\n";
2 
3 #include <petscdmplex.h>
4 
5 int main(int argc, char **argv)
6 {
7   PetscErrorCode   ierr;
8   PetscPartitioner p;
9   PetscSection     partSection;
10   IS               partition,is;
11   PetscMPIInt      size,rank;
12   PetscInt         npar;
13   PetscInt         nv = 4;
14   PetscInt         vv[5] = {0,2,4,6,8};
15   PetscInt         vadj[8] = {3,1,0,2,1,3,2,0};
16 
17   ierr = PetscInitialize(&argc, &argv, NULL, help);if (ierr) return ierr;
18   ierr = MPI_Comm_size(PETSC_COMM_WORLD,&size);CHKERRQ(ierr);
19   ierr = MPI_Comm_rank(PETSC_COMM_WORLD,&rank);CHKERRQ(ierr);
20   npar = size;
21   ierr = PetscOptionsGetInt(NULL,NULL,"-nparts",&npar,NULL);CHKERRQ(ierr);
22 
23   /* create PetscPartitioner */
24   ierr = PetscSectionCreate(PETSC_COMM_WORLD,&partSection);CHKERRQ(ierr);
25   ierr = PetscPartitionerCreate(PETSC_COMM_WORLD,&p);CHKERRQ(ierr);
26   ierr = PetscPartitionerSetType(p,PETSCPARTITIONERSIMPLE);CHKERRQ(ierr);
27   ierr = PetscPartitionerSetFromOptions(p);CHKERRQ(ierr);
28 
29   /* test partitioning an empty graph */
30   ierr = PetscPartitionerPartition(p,npar,0,NULL,NULL,NULL,NULL,partSection,&partition);CHKERRQ(ierr);
31   ierr = PetscObjectSetName((PetscObject)partSection,"NULL SECTION");
32   ierr = PetscSectionView(partSection,NULL);CHKERRQ(ierr);
33   ierr = ISOnComm(partition,PETSC_COMM_WORLD,PETSC_USE_POINTER,&is);CHKERRQ(ierr);
34   ierr = PetscObjectSetName((PetscObject)is,"NULL PARTITION");
35   ierr = ISView(is,NULL);CHKERRQ(ierr);
36   ierr = ISDestroy(&is);CHKERRQ(ierr);
37   ierr = ISDestroy(&partition);CHKERRQ(ierr);
38 
39   /* test partitioning a graph on one process only (not master) */
40   if (rank == size - 1) {
41     ierr = PetscPartitionerPartition(p,npar,nv,vv,vadj,NULL,NULL,partSection,&partition);CHKERRQ(ierr);
42   } else {
43     ierr = PetscPartitionerPartition(p,npar,0,NULL,NULL,NULL,NULL,partSection,&partition);CHKERRQ(ierr);
44   }
45   ierr = PetscObjectSetName((PetscObject)partSection,"SEQ SECTION");
46   ierr = PetscSectionView(partSection,NULL);CHKERRQ(ierr);
47   ierr = ISOnComm(partition,PETSC_COMM_WORLD,PETSC_USE_POINTER,&is);CHKERRQ(ierr);
48   ierr = PetscObjectSetName((PetscObject)is,"SEQ PARTITION");
49   ierr = ISView(is,NULL);CHKERRQ(ierr);
50   ierr = ISDestroy(&is);CHKERRQ(ierr);
51   ierr = ISDestroy(&partition);CHKERRQ(ierr);
52 
53   /* test partitioning a graph on a subset of the processess only */
54   if (rank%2) {
55     ierr = PetscPartitionerPartition(p,npar,0,NULL,NULL,NULL,NULL,partSection,&partition);CHKERRQ(ierr);
56   } else {
57     PetscInt i,totv = nv*((size+1)/2),*pvadj;
58 
59     ierr = PetscMalloc1(2*nv,&pvadj);CHKERRQ(ierr);
60     for (i = 0; i < nv; i++) {
61       pvadj[2*i]   = (nv*(rank/2) + totv + i - 1)%totv;
62       pvadj[2*i+1] = (nv*(rank/2) + totv + i + 1)%totv;
63     }
64     ierr = PetscPartitionerPartition(p,npar,nv,vv,pvadj,NULL,NULL,partSection,&partition);CHKERRQ(ierr);
65     ierr = PetscFree(pvadj);CHKERRQ(ierr);
66   }
67   ierr = PetscObjectSetName((PetscObject)partSection,"PARVOID SECTION");
68   ierr = PetscSectionView(partSection,NULL);CHKERRQ(ierr);
69   ierr = ISOnComm(partition,PETSC_COMM_WORLD,PETSC_USE_POINTER,&is);CHKERRQ(ierr);
70   ierr = PetscObjectSetName((PetscObject)is,"PARVOID PARTITION");
71   ierr = ISView(is,NULL);CHKERRQ(ierr);
72   ierr = ISDestroy(&is);CHKERRQ(ierr);
73   ierr = ISDestroy(&partition);CHKERRQ(ierr);
74 
75   ierr = PetscSectionDestroy(&partSection);CHKERRQ(ierr);
76   ierr = PetscPartitionerDestroy(&p);CHKERRQ(ierr);
77   ierr = PetscFinalize();
78   return ierr;
79 }
80 
81 /*TEST
82 
83   test:
84     suffix: simple
85     nsize: {{1 2 3}separate output}
86     args: -nparts {{1 2 3}separate output} -petscpartitioner_type simple -petscpartitioner_view -petscpartitioner_view_graph
87 
88   test:
89     requires: parmetis
90     suffix: parmetis
91     nsize: {{1 2 3}separate output}
92     args: -nparts {{1 2 3}separate output} -petscpartitioner_type parmetis -petscpartitioner_view -petscpartitioner_view_graph
93 
94   test:
95     requires: ptscotch
96     suffix: ptscotch
97     nsize: {{1 2 3}separate output}
98     args: -nparts {{1 2 3}separate output} -petscpartitioner_type ptscotch -petscpartitioner_view -petscpartitioner_view_graph
99 
100 TEST*/
101