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