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