xref: /petsc/src/dm/partitioner/tests/ex33.c (revision f2ed2dc71a2ab9ffda85eae8afa0cbea9ed570de)
1 static char help[] = "Tests PetscPartitioner.\n\n";
2 
3 #include <petscpartitioner.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   PetscBool        sequential;
17 
18   ierr = PetscInitialize(&argc, &argv, NULL, help);if (ierr) return ierr;
19   ierr = MPI_Comm_size(PETSC_COMM_WORLD,&size);CHKERRQ(ierr);
20   ierr = MPI_Comm_rank(PETSC_COMM_WORLD,&rank);CHKERRQ(ierr);
21   npar = size;
22   ierr = PetscOptionsGetInt(NULL,NULL,"-nparts",&npar,NULL);CHKERRQ(ierr);
23 
24   /* create PetscPartitioner */
25   ierr = PetscSectionCreate(PETSC_COMM_WORLD,&partSection);CHKERRQ(ierr);
26   ierr = PetscPartitionerCreate(PETSC_COMM_WORLD,&p);CHKERRQ(ierr);
27   ierr = PetscPartitionerSetType(p,PETSCPARTITIONERSIMPLE);CHKERRQ(ierr);
28   ierr = PetscPartitionerSetFromOptions(p);CHKERRQ(ierr);
29 
30   /* test partitioning an empty graph */
31   ierr = PetscPartitionerPartition(p,npar,0,NULL,NULL,NULL,NULL,partSection,&partition);CHKERRQ(ierr);
32   ierr = PetscObjectSetName((PetscObject)partSection,"NULL SECTION");
33   ierr = PetscSectionView(partSection,NULL);CHKERRQ(ierr);
34   ierr = ISOnComm(partition,PETSC_COMM_WORLD,PETSC_USE_POINTER,&is);CHKERRQ(ierr);
35   ierr = PetscObjectSetName((PetscObject)is,"NULL PARTITION");
36   ierr = ISView(is,NULL);CHKERRQ(ierr);
37   ierr = ISDestroy(&is);CHKERRQ(ierr);
38   ierr = ISDestroy(&partition);CHKERRQ(ierr);
39 
40   /* test partitioning a graph on one process only (not master) */
41   if (rank == size - 1) {
42     ierr = PetscPartitionerPartition(p,npar,nv,vv,vadj,NULL,NULL,partSection,&partition);CHKERRQ(ierr);
43   } else {
44     ierr = PetscPartitionerPartition(p,npar,0,NULL,NULL,NULL,NULL,partSection,&partition);CHKERRQ(ierr);
45   }
46   ierr = PetscObjectSetName((PetscObject)partSection,"SEQ SECTION");
47   ierr = PetscSectionView(partSection,NULL);CHKERRQ(ierr);
48   ierr = ISOnComm(partition,PETSC_COMM_WORLD,PETSC_USE_POINTER,&is);CHKERRQ(ierr);
49   ierr = PetscObjectSetName((PetscObject)is,"SEQ PARTITION");
50   ierr = ISView(is,NULL);CHKERRQ(ierr);
51   ierr = ISDestroy(&is);CHKERRQ(ierr);
52   ierr = ISDestroy(&partition);CHKERRQ(ierr);
53 
54   ierr = PetscObjectTypeCompareAny((PetscObject)p,&sequential,PETSCPARTITIONERCHACO,NULL);CHKERRQ(ierr);
55   if (sequential) goto finally;
56 
57   /* test partitioning a graph on a subset of the processess only */
58   if (rank%2) {
59     ierr = PetscPartitionerPartition(p,npar,0,NULL,NULL,NULL,NULL,partSection,&partition);CHKERRQ(ierr);
60   } else {
61     PetscInt i,totv = nv*((size+1)/2),*pvadj;
62 
63     ierr = PetscMalloc1(2*nv,&pvadj);CHKERRQ(ierr);
64     for (i = 0; i < nv; i++) {
65       pvadj[2*i]   = (nv*(rank/2) + totv + i - 1)%totv;
66       pvadj[2*i+1] = (nv*(rank/2) + totv + i + 1)%totv;
67     }
68     ierr = PetscPartitionerPartition(p,npar,nv,vv,pvadj,NULL,NULL,partSection,&partition);CHKERRQ(ierr);
69     ierr = PetscFree(pvadj);CHKERRQ(ierr);
70   }
71   ierr = PetscObjectSetName((PetscObject)partSection,"PARVOID SECTION");
72   ierr = PetscSectionView(partSection,NULL);CHKERRQ(ierr);
73   ierr = ISOnComm(partition,PETSC_COMM_WORLD,PETSC_USE_POINTER,&is);CHKERRQ(ierr);
74   ierr = PetscObjectSetName((PetscObject)is,"PARVOID PARTITION");
75   ierr = ISView(is,NULL);CHKERRQ(ierr);
76   ierr = ISDestroy(&is);CHKERRQ(ierr);
77   ierr = ISDestroy(&partition);CHKERRQ(ierr);
78 
79 finally:
80   ierr = PetscSectionDestroy(&partSection);CHKERRQ(ierr);
81   ierr = PetscPartitionerDestroy(&p);CHKERRQ(ierr);
82   ierr = PetscFinalize();
83   return ierr;
84 }
85 
86 /*TEST
87 
88   test:
89     suffix: simple
90     nsize: {{1 2 3}separate output}
91     args: -nparts {{1 2 3}separate output} -petscpartitioner_type simple -petscpartitioner_view -petscpartitioner_view_graph
92 
93   test:
94     suffix: gather
95     nsize: {{1 2 3}separate output}
96     args: -nparts {{1 2 3}separate output} -petscpartitioner_type gather -petscpartitioner_view -petscpartitioner_view_graph
97 
98   test:
99     requires: parmetis
100     suffix: parmetis
101     nsize: {{1 2 3}separate output}
102     args: -nparts {{1 2 3}separate output} -petscpartitioner_type parmetis -petscpartitioner_view -petscpartitioner_view_graph
103 
104   test:
105     requires: ptscotch
106     suffix: ptscotch
107     nsize: {{1 2 3}separate output}
108     args: -nparts {{1 2 3}separate output} -petscpartitioner_type ptscotch -petscpartitioner_view -petscpartitioner_view_graph
109 
110   test:
111     TODO: broken
112     requires: chaco
113     suffix: chaco
114     nsize: {{1 2 3}separate output}
115     args: -nparts {{1 2 3}separate output} -petscpartitioner_type chaco -petscpartitioner_view -petscpartitioner_view_graph
116 
117 TEST*/
118