1 #include <petsc/private/partitionerimpl.h> /*I "petscpartitioner.h" I*/ 2 3 typedef struct { 4 PetscInt dummy; 5 } PetscPartitioner_Gather; 6 7 static PetscErrorCode PetscPartitionerDestroy_Gather(PetscPartitioner part) 8 { 9 PetscFunctionBegin; 10 PetscCall(PetscFree(part->data)); 11 PetscFunctionReturn(PETSC_SUCCESS); 12 } 13 14 static PetscErrorCode PetscPartitionerPartition_Gather(PetscPartitioner part, PetscInt nparts, PetscInt numVertices, PetscInt start[], PetscInt adjacency[], PetscSection vertSection, PetscSection edgeSection, PetscSection targetSection, PetscSection partSection, IS *partition) 15 { 16 PetscInt np; 17 18 PetscFunctionBegin; 19 PetscCall(ISCreateStride(PETSC_COMM_SELF, numVertices, 0, 1, partition)); 20 PetscCall(PetscSectionSetDof(partSection, 0, numVertices)); 21 for (np = 1; np < nparts; ++np) PetscCall(PetscSectionSetDof(partSection, np, 0)); 22 PetscFunctionReturn(PETSC_SUCCESS); 23 } 24 25 static PetscErrorCode PetscPartitionerInitialize_Gather(PetscPartitioner part) 26 { 27 PetscFunctionBegin; 28 part->noGraph = PETSC_TRUE; 29 part->ops->destroy = PetscPartitionerDestroy_Gather; 30 part->ops->partition = PetscPartitionerPartition_Gather; 31 PetscFunctionReturn(PETSC_SUCCESS); 32 } 33 34 /*MC 35 PETSCPARTITIONERGATHER = "gather" - A PetscPartitioner object 36 37 Level: intermediate 38 39 .seealso: `PetscPartitionerType`, `PetscPartitionerCreate()`, `PetscPartitionerSetType()` 40 M*/ 41 42 PETSC_EXTERN PetscErrorCode PetscPartitionerCreate_Gather(PetscPartitioner part) 43 { 44 PetscPartitioner_Gather *p; 45 46 PetscFunctionBegin; 47 PetscValidHeaderSpecific(part, PETSCPARTITIONER_CLASSID, 1); 48 PetscCall(PetscNew(&p)); 49 part->data = p; 50 51 PetscCall(PetscPartitionerInitialize_Gather(part)); 52 PetscFunctionReturn(PETSC_SUCCESS); 53 } 54