xref: /petsc/src/dm/partitioner/tests/ex33.c (revision efbe7e8a80d07327753dbe0b33efee01e046af3f)
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, vertexSection = NULL, targetSection = NULL;
10   IS               partition,is;
11   PetscMPIInt      size,rank;
12   PetscInt         nparts,i;
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   PetscBool        vwgts = PETSC_FALSE;
18   PetscBool        pwgts = PETSC_FALSE;
19 
20   ierr = PetscInitialize(&argc, &argv, NULL, help);if (ierr) return ierr;
21   ierr = MPI_Comm_size(PETSC_COMM_WORLD,&size);CHKERRQ(ierr);
22   ierr = MPI_Comm_rank(PETSC_COMM_WORLD,&rank);CHKERRQ(ierr);
23   nparts = size;
24   ierr = PetscOptionsGetInt(NULL,NULL,"-nparts",&nparts,NULL);CHKERRQ(ierr);
25   ierr = PetscOptionsGetBool(NULL,NULL,"-vwgts",&vwgts,NULL);CHKERRQ(ierr);
26   ierr = PetscOptionsGetBool(NULL,NULL,"-pwgts",&pwgts,NULL);CHKERRQ(ierr);
27 
28   /* create PetscPartitioner */
29   ierr = PetscPartitionerCreate(PETSC_COMM_WORLD,&p);CHKERRQ(ierr);
30   ierr = PetscPartitionerSetType(p,PETSCPARTITIONERSIMPLE);CHKERRQ(ierr);
31   ierr = PetscPartitionerSetFromOptions(p);CHKERRQ(ierr);
32 
33   /* create partition section */
34   ierr = PetscSectionCreate(PETSC_COMM_WORLD,&partSection);CHKERRQ(ierr);
35 
36   if (vwgts) { /* create vertex weights section */
37     ierr = PetscSectionCreate(PETSC_COMM_WORLD,&vertexSection);CHKERRQ(ierr);
38     ierr = PetscSectionSetChart(vertexSection,0,nv);CHKERRQ(ierr);
39     for (i = 0; i< nv; i++) {ierr = PetscSectionSetDof(vertexSection,i,1);CHKERRQ(ierr);}
40     ierr = PetscSectionSetUp(vertexSection);CHKERRQ(ierr);
41   }
42 
43   if (pwgts) { /* create partition weights section */
44     ierr = PetscSectionCreate(PETSC_COMM_WORLD,&targetSection);CHKERRQ(ierr);
45     ierr = PetscSectionSetChart(targetSection,0,nparts);CHKERRQ(ierr);
46     for (i = 0; i< nparts; i++) {ierr = PetscSectionSetDof(targetSection,i,1);CHKERRQ(ierr);}
47     ierr = PetscSectionSetUp(targetSection);CHKERRQ(ierr);
48   }
49 
50 #if defined(PETSC_USE_LOG)
51   { /* Test logging */
52     PetscLogEvent event;
53 
54     ierr = PetscLogEventRegister("MyPartitionerEvent",PETSCPARTITIONER_CLASSID,&event);CHKERRQ(ierr);
55     { /* PetscLogEventExcludeClass is broken, new events are not deactivated */
56       char      logList[256];
57       PetscBool opt,pkg;
58 
59       ierr = PetscOptionsGetString(NULL,NULL,"-log_exclude",logList,sizeof(logList),&opt);CHKERRQ(ierr);
60       if (opt) {
61         ierr = PetscStrInList("partitioner",logList,',',&pkg);CHKERRQ(ierr);
62         if (pkg) {ierr = PetscLogEventExcludeClass(PETSCPARTITIONER_CLASSID);CHKERRQ(ierr);}
63       }
64     }
65     ierr = PetscLogEventBegin(event,p,NULL,NULL,NULL);CHKERRQ(ierr);
66     ierr = PetscLogEventEnd(event,p,NULL,NULL,NULL);CHKERRQ(ierr);
67   }
68 #endif
69 
70   /* test setup and reset */
71   ierr = PetscPartitionerSetUp(p);CHKERRQ(ierr);
72   ierr = PetscPartitionerReset(p);CHKERRQ(ierr);
73 
74   /* test partitioning an empty graph */
75   ierr = PetscPartitionerPartition(p,nparts,0,NULL,NULL,vertexSection,targetSection,partSection,&partition);CHKERRQ(ierr);
76   ierr = PetscObjectSetName((PetscObject)partSection,"NULL SECTION");
77   ierr = PetscSectionView(partSection,NULL);CHKERRQ(ierr);
78   ierr = ISOnComm(partition,PETSC_COMM_WORLD,PETSC_USE_POINTER,&is);CHKERRQ(ierr);
79   ierr = PetscObjectSetName((PetscObject)is,"NULL PARTITION");
80   ierr = ISView(is,NULL);CHKERRQ(ierr);
81   ierr = ISDestroy(&is);CHKERRQ(ierr);
82   ierr = ISDestroy(&partition);CHKERRQ(ierr);
83 
84   /* test view from options */
85   ierr = PetscPartitionerViewFromOptions(p,NULL,"-part_view");CHKERRQ(ierr);
86 
87   /* test partitioning a graph on one process only (not master) */
88   if (rank == size - 1) {
89     ierr = PetscPartitionerPartition(p,nparts,nv,vv,vadj,vertexSection,targetSection,partSection,&partition);CHKERRQ(ierr);
90   } else {
91     ierr = PetscPartitionerPartition(p,nparts,0,NULL,NULL,vertexSection,targetSection,partSection,&partition);CHKERRQ(ierr);
92   }
93   ierr = PetscObjectSetName((PetscObject)partSection,"SEQ SECTION");
94   ierr = PetscSectionView(partSection,NULL);CHKERRQ(ierr);
95   ierr = ISOnComm(partition,PETSC_COMM_WORLD,PETSC_USE_POINTER,&is);CHKERRQ(ierr);
96   ierr = PetscObjectSetName((PetscObject)is,"SEQ PARTITION");
97   ierr = ISView(is,NULL);CHKERRQ(ierr);
98   ierr = ISDestroy(&is);CHKERRQ(ierr);
99   ierr = ISDestroy(&partition);CHKERRQ(ierr);
100 
101   ierr = PetscObjectTypeCompareAny((PetscObject)p,&sequential,PETSCPARTITIONERCHACO,NULL);CHKERRQ(ierr);
102   if (sequential) goto finally;
103 
104   /* test partitioning a graph on a subset of the processess only */
105   if (rank%2) {
106     ierr = PetscPartitionerPartition(p,nparts,0,NULL,NULL,NULL,targetSection,partSection,&partition);CHKERRQ(ierr);
107   } else {
108     PetscInt i,totv = nv*((size+1)/2),*pvadj;
109 
110     ierr = PetscMalloc1(2*nv,&pvadj);CHKERRQ(ierr);
111     for (i = 0; i < nv; i++) {
112       pvadj[2*i]   = (nv*(rank/2) + totv + i - 1)%totv;
113       pvadj[2*i+1] = (nv*(rank/2) + totv + i + 1)%totv;
114     }
115     ierr = PetscPartitionerPartition(p,nparts,nv,vv,pvadj,NULL,targetSection,partSection,&partition);CHKERRQ(ierr);
116     ierr = PetscFree(pvadj);CHKERRQ(ierr);
117   }
118   ierr = PetscObjectSetName((PetscObject)partSection,"PARVOID SECTION");
119   ierr = PetscSectionView(partSection,NULL);CHKERRQ(ierr);
120   ierr = ISOnComm(partition,PETSC_COMM_WORLD,PETSC_USE_POINTER,&is);CHKERRQ(ierr);
121   ierr = PetscObjectSetName((PetscObject)is,"PARVOID PARTITION");
122   ierr = ISView(is,NULL);CHKERRQ(ierr);
123   ierr = ISDestroy(&is);CHKERRQ(ierr);
124   ierr = ISDestroy(&partition);CHKERRQ(ierr);
125 
126 finally:
127   ierr = PetscSectionDestroy(&partSection);CHKERRQ(ierr);
128   ierr = PetscSectionDestroy(&vertexSection);CHKERRQ(ierr);
129   ierr = PetscSectionDestroy(&targetSection);CHKERRQ(ierr);
130   ierr = PetscPartitionerDestroy(&p);CHKERRQ(ierr);
131   ierr = PetscFinalize();
132   return ierr;
133 }
134 
135 /*TEST
136 
137   test:
138     suffix: default
139 
140   testset:
141     requires: define(PETSC_USE_LOG)
142     args: -petscpartitioner_type simple -log_summary
143     filter: grep MyPartitionerEvent | cut -d " " -f 1
144     test:
145        suffix: log_include
146     test:
147       suffix: log_exclude
148       args: -log_exclude partitioner
149 
150   test:
151     suffix: simple
152     nsize: {{1 2 3}separate output}
153     args: -nparts {{1 2 3}separate output} -pwgts {{false true}separate output} -petscpartitioner_type simple -petscpartitioner_view
154 
155   test:
156     suffix: shell
157     nsize: {{1 2 3}separate output}
158     args: -nparts {{1 2 3}separate output} -petscpartitioner_type shell -petscpartitioner_shell_random -petscpartitioner_view
159 
160   test:
161     suffix: gather
162     nsize: {{1 2 3}separate output}
163     args: -nparts {{1 2 3}separate output} -petscpartitioner_type gather -petscpartitioner_view -petscpartitioner_view_graph
164 
165   test:
166     requires: parmetis
167     suffix: parmetis
168     nsize: {{1 2 3}separate output}
169     args: -nparts {{1 2 3}separate output} -pwgts {{false true}} -vwgts {{false true}}
170     args: -petscpartitioner_type parmetis -petscpartitioner_view -petscpartitioner_view_graph
171 
172   test:
173     requires: parmetis
174     suffix: parmetis_type
175     nsize: {{1 2}}
176     args: -petscpartitioner_type parmetis -part_view
177     args: -petscpartitioner_parmetis_type {{kway rb}separate output}
178     filter: grep "ParMetis type"
179 
180   test:
181     requires: ptscotch
182     suffix: ptscotch
183     nsize: {{1 2 3}separate output}
184     args: -nparts {{1 2 3}separate output} -pwgts {{false true}separate output} -vwgts {{false true}}
185     args: -petscpartitioner_type ptscotch -petscpartitioner_view -petscpartitioner_view_graph
186 
187   test:
188     requires: ptscotch
189     suffix: ptscotch_strategy
190     nsize: {{1 2}}
191     args: -petscpartitioner_type ptscotch -part_view
192     args: -petscpartitioner_ptscotch_strategy {{DEFAULT QUALITY SPEED BALANCE SAFETY SCALABILITY RECURSIVE REMAP}separate output}
193     filter: grep "partitioning strategy"
194 
195   test:
196     requires: chaco
197     suffix: chaco
198     nsize: {{1 2 3}separate output}
199     args: -nparts {{1}separate output} -petscpartitioner_type chaco -petscpartitioner_view -petscpartitioner_view_graph
200 
201   test:
202     TODO: non reproducible (uses C stdlib rand())
203     requires: chaco
204     suffix: chaco
205     nsize: {{1 2 3}separate output}
206     args: -nparts {{2 3}separate output} -petscpartitioner_type chaco -petscpartitioner_view -petscpartitioner_view_graph
207 
208 TEST*/
209