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