1 static char help[] = "Tests PetscPartitioner.\n\n"; 2 3 #include <petscdmplex.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 17 ierr = PetscInitialize(&argc, &argv, NULL, help);if (ierr) return ierr; 18 ierr = MPI_Comm_size(PETSC_COMM_WORLD,&size);CHKERRQ(ierr); 19 ierr = MPI_Comm_rank(PETSC_COMM_WORLD,&rank);CHKERRQ(ierr); 20 npar = size; 21 ierr = PetscOptionsGetInt(NULL,NULL,"-nparts",&npar,NULL);CHKERRQ(ierr); 22 23 /* create PetscPartitioner */ 24 ierr = PetscSectionCreate(PETSC_COMM_WORLD,&partSection);CHKERRQ(ierr); 25 ierr = PetscPartitionerCreate(PETSC_COMM_WORLD,&p);CHKERRQ(ierr); 26 ierr = PetscPartitionerSetType(p,PETSCPARTITIONERSIMPLE);CHKERRQ(ierr); 27 ierr = PetscPartitionerSetFromOptions(p);CHKERRQ(ierr); 28 29 /* test partitioning an empty graph */ 30 ierr = PetscPartitionerPartition(p,npar,0,NULL,NULL,NULL,NULL,partSection,&partition);CHKERRQ(ierr); 31 ierr = PetscObjectSetName((PetscObject)partSection,"NULL SECTION"); 32 ierr = PetscSectionView(partSection,NULL);CHKERRQ(ierr); 33 ierr = ISOnComm(partition,PETSC_COMM_WORLD,PETSC_USE_POINTER,&is);CHKERRQ(ierr); 34 ierr = PetscObjectSetName((PetscObject)is,"NULL PARTITION"); 35 ierr = ISView(is,NULL);CHKERRQ(ierr); 36 ierr = ISDestroy(&is);CHKERRQ(ierr); 37 ierr = ISDestroy(&partition);CHKERRQ(ierr); 38 39 /* test partitioning a graph on one process only (not master) */ 40 if (rank == size - 1) { 41 ierr = PetscPartitionerPartition(p,npar,nv,vv,vadj,NULL,NULL,partSection,&partition);CHKERRQ(ierr); 42 } else { 43 ierr = PetscPartitionerPartition(p,npar,0,NULL,NULL,NULL,NULL,partSection,&partition);CHKERRQ(ierr); 44 } 45 ierr = PetscObjectSetName((PetscObject)partSection,"SEQ SECTION"); 46 ierr = PetscSectionView(partSection,NULL);CHKERRQ(ierr); 47 ierr = ISOnComm(partition,PETSC_COMM_WORLD,PETSC_USE_POINTER,&is);CHKERRQ(ierr); 48 ierr = PetscObjectSetName((PetscObject)is,"SEQ PARTITION"); 49 ierr = ISView(is,NULL);CHKERRQ(ierr); 50 ierr = ISDestroy(&is);CHKERRQ(ierr); 51 ierr = ISDestroy(&partition);CHKERRQ(ierr); 52 53 /* test partitioning a graph on a subset of the processess only */ 54 if (rank%2) { 55 ierr = PetscPartitionerPartition(p,npar,0,NULL,NULL,NULL,NULL,partSection,&partition);CHKERRQ(ierr); 56 } else { 57 PetscInt i,totv = nv*((size+1)/2),*pvadj; 58 59 ierr = PetscMalloc1(2*nv,&pvadj);CHKERRQ(ierr); 60 for (i = 0; i < nv; i++) { 61 pvadj[2*i] = (nv*(rank/2) + totv + i - 1)%totv; 62 pvadj[2*i+1] = (nv*(rank/2) + totv + i + 1)%totv; 63 } 64 ierr = PetscPartitionerPartition(p,npar,nv,vv,pvadj,NULL,NULL,partSection,&partition);CHKERRQ(ierr); 65 ierr = PetscFree(pvadj);CHKERRQ(ierr); 66 } 67 ierr = PetscObjectSetName((PetscObject)partSection,"PARVOID SECTION"); 68 ierr = PetscSectionView(partSection,NULL);CHKERRQ(ierr); 69 ierr = ISOnComm(partition,PETSC_COMM_WORLD,PETSC_USE_POINTER,&is);CHKERRQ(ierr); 70 ierr = PetscObjectSetName((PetscObject)is,"PARVOID PARTITION"); 71 ierr = ISView(is,NULL);CHKERRQ(ierr); 72 ierr = ISDestroy(&is);CHKERRQ(ierr); 73 ierr = ISDestroy(&partition);CHKERRQ(ierr); 74 75 ierr = PetscSectionDestroy(&partSection);CHKERRQ(ierr); 76 ierr = PetscPartitionerDestroy(&p);CHKERRQ(ierr); 77 ierr = PetscFinalize(); 78 return ierr; 79 } 80 81 /*TEST 82 83 test: 84 suffix: simple 85 nsize: {{1 2 3}separate output} 86 args: -nparts {{1 2 3}separate output} -petscpartitioner_type simple -petscpartitioner_view -petscpartitioner_view_graph 87 88 test: 89 requires: parmetis 90 suffix: parmetis 91 nsize: {{1 2 3}separate output} 92 args: -nparts {{1 2 3}separate output} -petscpartitioner_type parmetis -petscpartitioner_view -petscpartitioner_view_graph 93 94 test: 95 requires: ptscotch 96 suffix: ptscotch 97 nsize: {{1 2 3}separate output} 98 args: -nparts {{1 2 3}separate output} -petscpartitioner_type ptscotch -petscpartitioner_view -petscpartitioner_view_graph 99 100 TEST*/ 101