1 static char help[] = "Example of using graph partitioning with a matrix in which some procs have empty ownership\n\n"; 2 3 /*T 4 Concepts: Mat^mat partitioning 5 Concepts: Mat^image segmentation 6 Processors: n 7 T*/ 8 9 #include <petscmat.h> 10 11 int main(int argc, char **args) 12 { 13 Mat A; 14 MatPartitioning part; 15 IS is; 16 PetscInt i,m,N,rstart,rend,nemptyranks,*emptyranks,nbigranks,*bigranks; 17 PetscMPIInt rank,size; 18 PetscErrorCode ierr; 19 20 ierr = PetscInitialize(&argc,&args,(char*)0,help);if (ierr) return ierr; 21 ierr = MPI_Comm_rank(PETSC_COMM_WORLD,&rank);CHKERRQ(ierr); 22 ierr = MPI_Comm_size(PETSC_COMM_WORLD,&size);CHKERRQ(ierr); 23 24 nemptyranks = 10; 25 nbigranks = 10; 26 ierr = PetscMalloc2(nemptyranks,&emptyranks,nbigranks,&bigranks);CHKERRQ(ierr); 27 28 ierr = PetscOptionsBegin(PETSC_COMM_WORLD,NULL,"Partitioning example options",NULL);CHKERRQ(ierr); 29 ierr = PetscOptionsIntArray("-emptyranks","Ranks to be skipped by partition","",emptyranks,&nemptyranks,NULL);CHKERRQ(ierr); 30 ierr = PetscOptionsIntArray("-bigranks","Ranks to be overloaded","",bigranks,&nbigranks,NULL);CHKERRQ(ierr); 31 ierr = PetscOptionsEnd();CHKERRQ(ierr); 32 33 m = 1; 34 for (i=0; i<nemptyranks; i++) if (rank == emptyranks[i]) m = 0; 35 for (i=0; i<nbigranks; i++) if (rank == bigranks[i]) m = 5; 36 37 ierr = MatCreate(PETSC_COMM_WORLD,&A);CHKERRQ(ierr); 38 ierr = MatSetSizes(A,m,m,PETSC_DECIDE,PETSC_DECIDE);CHKERRQ(ierr); 39 ierr = MatSetFromOptions(A);CHKERRQ(ierr); 40 ierr = MatSeqAIJSetPreallocation(A,3,NULL);CHKERRQ(ierr); 41 ierr = MatMPIAIJSetPreallocation(A,3,NULL,2,NULL);CHKERRQ(ierr); 42 ierr = MatSeqBAIJSetPreallocation(A,1,3,NULL);CHKERRQ(ierr); 43 ierr = MatMPIBAIJSetPreallocation(A,1,3,NULL,2,NULL);CHKERRQ(ierr); 44 ierr = MatSeqSBAIJSetPreallocation(A,1,2,NULL);CHKERRQ(ierr); 45 ierr = MatMPISBAIJSetPreallocation(A,1,2,NULL,1,NULL);CHKERRQ(ierr); 46 47 ierr = MatGetSize(A,NULL,&N);CHKERRQ(ierr); 48 ierr = MatGetOwnershipRange(A,&rstart,&rend);CHKERRQ(ierr); 49 for (i=rstart; i<rend; i++) { 50 const PetscInt cols[] = {(i+N-1)%N,i,(i+1)%N}; 51 const PetscScalar vals[] = {1,1,1}; 52 ierr = MatSetValues(A,1,&i,3,cols,vals,INSERT_VALUES);CHKERRQ(ierr); 53 } 54 ierr = MatAssemblyBegin(A,MAT_FINAL_ASSEMBLY);CHKERRQ(ierr); 55 ierr = MatAssemblyEnd(A,MAT_FINAL_ASSEMBLY);CHKERRQ(ierr); 56 ierr = MatView(A,PETSC_VIEWER_STDOUT_WORLD);CHKERRQ(ierr); 57 58 ierr = MatPartitioningCreate(PETSC_COMM_WORLD,&part);CHKERRQ(ierr); 59 ierr = MatPartitioningSetAdjacency(part,A);CHKERRQ(ierr); 60 ierr = MatPartitioningSetFromOptions(part);CHKERRQ(ierr); 61 ierr = MatPartitioningApply(part,&is);CHKERRQ(ierr); 62 ierr = ISView(is,PETSC_VIEWER_STDOUT_WORLD);CHKERRQ(ierr); 63 ierr = ISDestroy(&is);CHKERRQ(ierr); 64 ierr = MatPartitioningDestroy(&part);CHKERRQ(ierr); 65 ierr = MatDestroy(&A);CHKERRQ(ierr); 66 ierr = PetscFree2(emptyranks,bigranks);CHKERRQ(ierr); 67 ierr = PetscFinalize(); 68 return ierr; 69 } 70 71 /*TEST 72 73 test: 74 nsize: 8 75 args: -emptyranks 0,2,4 -bigranks 1,3,7 -mat_partitioning_type average 76 # cannot test with external package partitioners since they produce different results on different systems 77 78 TEST*/ 79