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