1abe9303eSLisandro Dalcin #include <petsc/private/partitionerimpl.h> /*I "petscpartitioner.h" I*/ 2abe9303eSLisandro Dalcin 3abe9303eSLisandro Dalcin /*@C 4abe9303eSLisandro Dalcin PetscPartitionerSetType - Builds a particular PetscPartitioner 5abe9303eSLisandro Dalcin 6abe9303eSLisandro Dalcin Collective on PetscPartitioner 7abe9303eSLisandro Dalcin 8abe9303eSLisandro Dalcin Input Parameters: 9abe9303eSLisandro Dalcin + part - The PetscPartitioner object 10abe9303eSLisandro Dalcin - name - The kind of partitioner 11abe9303eSLisandro Dalcin 12abe9303eSLisandro Dalcin Options Database Key: 13abe9303eSLisandro Dalcin . -petscpartitioner_type <type> - Sets the PetscPartitioner type; use -help for a list of available types 14abe9303eSLisandro Dalcin 156e0dc72eSMatthew G. Knepley Note: 166e0dc72eSMatthew G. Knepley $ PETSCPARTITIONERCHACO - The Chaco partitioner (--download-chaco) 176e0dc72eSMatthew G. Knepley $ PETSCPARTITIONERPARMETIS - The ParMetis partitioner (--download-parmetis) 186e0dc72eSMatthew G. Knepley $ PETSCPARTITIONERSHELL - A shell partitioner implemented by the user 196e0dc72eSMatthew G. Knepley $ PETSCPARTITIONERSIMPLE - A simple partitioner that divides cells into equal, contiguous chunks 206e0dc72eSMatthew G. Knepley $ PETSCPARTITIONERGATHER - Gathers all cells onto process 0 216e0dc72eSMatthew G. Knepley 22abe9303eSLisandro Dalcin Level: intermediate 23abe9303eSLisandro Dalcin 24abe9303eSLisandro Dalcin .seealso: PetscPartitionerGetType(), PetscPartitionerCreate() 25abe9303eSLisandro Dalcin @*/ 26abe9303eSLisandro Dalcin PetscErrorCode PetscPartitionerSetType(PetscPartitioner part, PetscPartitionerType name) 27abe9303eSLisandro Dalcin { 28abe9303eSLisandro Dalcin PetscErrorCode (*r)(PetscPartitioner); 29abe9303eSLisandro Dalcin PetscBool match; 30abe9303eSLisandro Dalcin 31abe9303eSLisandro Dalcin PetscFunctionBegin; 32abe9303eSLisandro Dalcin PetscValidHeaderSpecific(part, PETSCPARTITIONER_CLASSID, 1); 335f80ce2aSJacob Faibussowitsch CHKERRQ(PetscObjectTypeCompare((PetscObject) part, name, &match)); 34abe9303eSLisandro Dalcin if (match) PetscFunctionReturn(0); 35abe9303eSLisandro Dalcin 365f80ce2aSJacob Faibussowitsch CHKERRQ(PetscPartitionerRegisterAll()); 375f80ce2aSJacob Faibussowitsch CHKERRQ(PetscFunctionListFind(PetscPartitionerList, name, &r)); 38*28b400f6SJacob Faibussowitsch PetscCheck(r,PetscObjectComm((PetscObject) part), PETSC_ERR_ARG_UNKNOWN_TYPE, "Unknown PetscPartitioner type: %s", name); 39abe9303eSLisandro Dalcin 40abe9303eSLisandro Dalcin if (part->ops->destroy) { 415f80ce2aSJacob Faibussowitsch CHKERRQ((*part->ops->destroy)(part)); 42abe9303eSLisandro Dalcin } 43abe9303eSLisandro Dalcin part->noGraph = PETSC_FALSE; 445f80ce2aSJacob Faibussowitsch CHKERRQ(PetscMemzero(part->ops, sizeof(*part->ops))); 455f80ce2aSJacob Faibussowitsch CHKERRQ(PetscObjectChangeTypeName((PetscObject) part, name)); 465f80ce2aSJacob Faibussowitsch CHKERRQ((*r)(part)); 47abe9303eSLisandro Dalcin PetscFunctionReturn(0); 48abe9303eSLisandro Dalcin } 49abe9303eSLisandro Dalcin 50abe9303eSLisandro Dalcin /*@C 51abe9303eSLisandro Dalcin PetscPartitionerGetType - Gets the PetscPartitioner type name (as a string) from the object. 52abe9303eSLisandro Dalcin 53abe9303eSLisandro Dalcin Not Collective 54abe9303eSLisandro Dalcin 55abe9303eSLisandro Dalcin Input Parameter: 56abe9303eSLisandro Dalcin . part - The PetscPartitioner 57abe9303eSLisandro Dalcin 58abe9303eSLisandro Dalcin Output Parameter: 59abe9303eSLisandro Dalcin . name - The PetscPartitioner type name 60abe9303eSLisandro Dalcin 61abe9303eSLisandro Dalcin Level: intermediate 62abe9303eSLisandro Dalcin 63abe9303eSLisandro Dalcin .seealso: PetscPartitionerSetType(), PetscPartitionerCreate() 64abe9303eSLisandro Dalcin @*/ 65abe9303eSLisandro Dalcin PetscErrorCode PetscPartitionerGetType(PetscPartitioner part, PetscPartitionerType *name) 66abe9303eSLisandro Dalcin { 67abe9303eSLisandro Dalcin PetscFunctionBegin; 68abe9303eSLisandro Dalcin PetscValidHeaderSpecific(part, PETSCPARTITIONER_CLASSID, 1); 69abe9303eSLisandro Dalcin PetscValidPointer(name, 2); 70abe9303eSLisandro Dalcin *name = ((PetscObject) part)->type_name; 71abe9303eSLisandro Dalcin PetscFunctionReturn(0); 72abe9303eSLisandro Dalcin } 73abe9303eSLisandro Dalcin 74abe9303eSLisandro Dalcin /*@C 75abe9303eSLisandro Dalcin PetscPartitionerViewFromOptions - View from Options 76abe9303eSLisandro Dalcin 77abe9303eSLisandro Dalcin Collective on PetscPartitioner 78abe9303eSLisandro Dalcin 79abe9303eSLisandro Dalcin Input Parameters: 80abe9303eSLisandro Dalcin + A - the PetscPartitioner object 81abe9303eSLisandro Dalcin . obj - Optional object 82abe9303eSLisandro Dalcin - name - command line option 83abe9303eSLisandro Dalcin 84abe9303eSLisandro Dalcin Level: intermediate 85abe9303eSLisandro Dalcin .seealso: PetscPartitionerView(), PetscObjectViewFromOptions() 86abe9303eSLisandro Dalcin @*/ 87abe9303eSLisandro Dalcin PetscErrorCode PetscPartitionerViewFromOptions(PetscPartitioner A,PetscObject obj,const char name[]) 88abe9303eSLisandro Dalcin { 89abe9303eSLisandro Dalcin PetscFunctionBegin; 90abe9303eSLisandro Dalcin PetscValidHeaderSpecific(A,PETSCPARTITIONER_CLASSID,1); 915f80ce2aSJacob Faibussowitsch CHKERRQ(PetscObjectViewFromOptions((PetscObject)A,obj,name)); 92abe9303eSLisandro Dalcin PetscFunctionReturn(0); 93abe9303eSLisandro Dalcin } 94abe9303eSLisandro Dalcin 95abe9303eSLisandro Dalcin /*@ 96abe9303eSLisandro Dalcin PetscPartitionerView - Views a PetscPartitioner 97abe9303eSLisandro Dalcin 98abe9303eSLisandro Dalcin Collective on PetscPartitioner 99abe9303eSLisandro Dalcin 100d8d19677SJose E. Roman Input Parameters: 101abe9303eSLisandro Dalcin + part - the PetscPartitioner object to view 102abe9303eSLisandro Dalcin - v - the viewer 103abe9303eSLisandro Dalcin 104abe9303eSLisandro Dalcin Level: developer 105abe9303eSLisandro Dalcin 106abe9303eSLisandro Dalcin .seealso: PetscPartitionerDestroy() 107abe9303eSLisandro Dalcin @*/ 108abe9303eSLisandro Dalcin PetscErrorCode PetscPartitionerView(PetscPartitioner part, PetscViewer v) 109abe9303eSLisandro Dalcin { 110abe9303eSLisandro Dalcin PetscMPIInt size; 111abe9303eSLisandro Dalcin PetscBool isascii; 112abe9303eSLisandro Dalcin 113abe9303eSLisandro Dalcin PetscFunctionBegin; 114abe9303eSLisandro Dalcin PetscValidHeaderSpecific(part, PETSCPARTITIONER_CLASSID, 1); 1155f80ce2aSJacob Faibussowitsch if (!v) CHKERRQ(PetscViewerASCIIGetStdout(PetscObjectComm((PetscObject) part), &v)); 1165f80ce2aSJacob Faibussowitsch CHKERRQ(PetscObjectTypeCompare((PetscObject) v, PETSCVIEWERASCII, &isascii)); 117abe9303eSLisandro Dalcin if (isascii) { 1185f80ce2aSJacob Faibussowitsch CHKERRMPI(MPI_Comm_size(PetscObjectComm((PetscObject) part), &size)); 1195f80ce2aSJacob Faibussowitsch CHKERRQ(PetscViewerASCIIPrintf(v, "Graph Partitioner: %d MPI Process%s\n", size, size > 1 ? "es" : "")); 1205f80ce2aSJacob Faibussowitsch CHKERRQ(PetscViewerASCIIPrintf(v, " type: %s\n", ((PetscObject)part)->type_name)); 1215f80ce2aSJacob Faibussowitsch CHKERRQ(PetscViewerASCIIPrintf(v, " edge cut: %D\n", part->edgeCut)); 1225f80ce2aSJacob Faibussowitsch CHKERRQ(PetscViewerASCIIPrintf(v, " balance: %.2g\n", part->balance)); 1235f80ce2aSJacob Faibussowitsch CHKERRQ(PetscViewerASCIIPrintf(v, " use vertex weights: %d\n", part->usevwgt)); 124abe9303eSLisandro Dalcin } 1255f80ce2aSJacob Faibussowitsch if (part->ops->view) CHKERRQ((*part->ops->view)(part, v)); 126abe9303eSLisandro Dalcin PetscFunctionReturn(0); 127abe9303eSLisandro Dalcin } 128abe9303eSLisandro Dalcin 129d7cc930eSLisandro Dalcin static PetscErrorCode PetscPartitionerGetDefaultType(MPI_Comm comm, const char **defaultType) 130abe9303eSLisandro Dalcin { 131abe9303eSLisandro Dalcin PetscMPIInt size; 132abe9303eSLisandro Dalcin 133abe9303eSLisandro Dalcin PetscFunctionBegin; 1345f80ce2aSJacob Faibussowitsch CHKERRMPI(MPI_Comm_size(comm, &size)); 135abe9303eSLisandro Dalcin if (size == 1) { 136abe9303eSLisandro Dalcin *defaultType = PETSCPARTITIONERSIMPLE; 137abe9303eSLisandro Dalcin } else { 138abe9303eSLisandro Dalcin #if defined(PETSC_HAVE_PARMETIS) 139abe9303eSLisandro Dalcin *defaultType = PETSCPARTITIONERPARMETIS; 140abe9303eSLisandro Dalcin #elif defined(PETSC_HAVE_PTSCOTCH) 141abe9303eSLisandro Dalcin *defaultType = PETSCPARTITIONERPTSCOTCH; 142abe9303eSLisandro Dalcin #elif defined(PETSC_HAVE_CHACO) 143abe9303eSLisandro Dalcin *defaultType = PETSCPARTITIONERCHACO; 144abe9303eSLisandro Dalcin #else 145abe9303eSLisandro Dalcin *defaultType = PETSCPARTITIONERSIMPLE; 146abe9303eSLisandro Dalcin #endif 147abe9303eSLisandro Dalcin } 148abe9303eSLisandro Dalcin PetscFunctionReturn(0); 149abe9303eSLisandro Dalcin } 150abe9303eSLisandro Dalcin 151abe9303eSLisandro Dalcin /*@ 152abe9303eSLisandro Dalcin PetscPartitionerSetFromOptions - sets parameters in a PetscPartitioner from the options database 153abe9303eSLisandro Dalcin 154abe9303eSLisandro Dalcin Collective on PetscPartitioner 155abe9303eSLisandro Dalcin 156abe9303eSLisandro Dalcin Input Parameter: 157abe9303eSLisandro Dalcin . part - the PetscPartitioner object to set options for 158abe9303eSLisandro Dalcin 159abe9303eSLisandro Dalcin Options Database Keys: 160abe9303eSLisandro Dalcin + -petscpartitioner_type <type> - Sets the PetscPartitioner type; use -help for a list of available types 161abe9303eSLisandro Dalcin . -petscpartitioner_use_vertex_weights - Uses weights associated with the graph vertices 162abe9303eSLisandro Dalcin - -petscpartitioner_view_graph - View the graph each time PetscPartitionerPartition is called. Viewer can be customized, see PetscOptionsGetViewer() 163abe9303eSLisandro Dalcin 164abe9303eSLisandro Dalcin Level: developer 165abe9303eSLisandro Dalcin 166abe9303eSLisandro Dalcin .seealso: PetscPartitionerView(), PetscPartitionerSetType(), PetscPartitionerPartition() 167abe9303eSLisandro Dalcin @*/ 168abe9303eSLisandro Dalcin PetscErrorCode PetscPartitionerSetFromOptions(PetscPartitioner part) 169abe9303eSLisandro Dalcin { 170d7cc930eSLisandro Dalcin const char *currentType = NULL; 171abe9303eSLisandro Dalcin char name[256]; 172abe9303eSLisandro Dalcin PetscBool flg; 173abe9303eSLisandro Dalcin PetscErrorCode ierr; 174abe9303eSLisandro Dalcin 175abe9303eSLisandro Dalcin PetscFunctionBegin; 176abe9303eSLisandro Dalcin PetscValidHeaderSpecific(part, PETSCPARTITIONER_CLASSID, 1); 177abe9303eSLisandro Dalcin ierr = PetscObjectOptionsBegin((PetscObject) part);CHKERRQ(ierr); 1785f80ce2aSJacob Faibussowitsch CHKERRQ(PetscPartitionerGetType(part, ¤tType)); 1795f80ce2aSJacob Faibussowitsch CHKERRQ(PetscOptionsFList("-petscpartitioner_type", "Graph partitioner", "PetscPartitionerSetType", PetscPartitionerList, currentType, name, sizeof(name), &flg)); 180abe9303eSLisandro Dalcin if (flg) { 1815f80ce2aSJacob Faibussowitsch CHKERRQ(PetscPartitionerSetType(part, name)); 182abe9303eSLisandro Dalcin } 1835f80ce2aSJacob Faibussowitsch CHKERRQ(PetscOptionsBool("-petscpartitioner_use_vertex_weights","Use vertex weights","",part->usevwgt,&part->usevwgt,NULL)); 184abe9303eSLisandro Dalcin if (part->ops->setfromoptions) { 1855f80ce2aSJacob Faibussowitsch CHKERRQ((*part->ops->setfromoptions)(PetscOptionsObject,part)); 186abe9303eSLisandro Dalcin } 1875f80ce2aSJacob Faibussowitsch CHKERRQ(PetscViewerDestroy(&part->viewer)); 1885f80ce2aSJacob Faibussowitsch CHKERRQ(PetscViewerDestroy(&part->viewerGraph)); 1895f80ce2aSJacob Faibussowitsch CHKERRQ(PetscOptionsGetViewer(((PetscObject) part)->comm, ((PetscObject) part)->options, ((PetscObject) part)->prefix, "-petscpartitioner_view", &part->viewer, NULL, NULL)); 1905f80ce2aSJacob Faibussowitsch CHKERRQ(PetscOptionsGetViewer(((PetscObject) part)->comm, ((PetscObject) part)->options, ((PetscObject) part)->prefix, "-petscpartitioner_view_graph", &part->viewerGraph, NULL, &part->viewGraph)); 191abe9303eSLisandro Dalcin /* process any options handlers added with PetscObjectAddOptionsHandler() */ 1925f80ce2aSJacob Faibussowitsch CHKERRQ(PetscObjectProcessOptionsHandlers(PetscOptionsObject,(PetscObject) part)); 193abe9303eSLisandro Dalcin ierr = PetscOptionsEnd();CHKERRQ(ierr); 194abe9303eSLisandro Dalcin PetscFunctionReturn(0); 195abe9303eSLisandro Dalcin } 196abe9303eSLisandro Dalcin 197abe9303eSLisandro Dalcin /*@ 198abe9303eSLisandro Dalcin PetscPartitionerSetUp - Construct data structures for the PetscPartitioner 199abe9303eSLisandro Dalcin 200abe9303eSLisandro Dalcin Collective on PetscPartitioner 201abe9303eSLisandro Dalcin 202abe9303eSLisandro Dalcin Input Parameter: 203abe9303eSLisandro Dalcin . part - the PetscPartitioner object to setup 204abe9303eSLisandro Dalcin 205abe9303eSLisandro Dalcin Level: developer 206abe9303eSLisandro Dalcin 207abe9303eSLisandro Dalcin .seealso: PetscPartitionerView(), PetscPartitionerDestroy() 208abe9303eSLisandro Dalcin @*/ 209abe9303eSLisandro Dalcin PetscErrorCode PetscPartitionerSetUp(PetscPartitioner part) 210abe9303eSLisandro Dalcin { 211abe9303eSLisandro Dalcin PetscFunctionBegin; 212abe9303eSLisandro Dalcin PetscValidHeaderSpecific(part, PETSCPARTITIONER_CLASSID, 1); 2135f80ce2aSJacob Faibussowitsch if (part->ops->setup) CHKERRQ((*part->ops->setup)(part)); 214abe9303eSLisandro Dalcin PetscFunctionReturn(0); 215abe9303eSLisandro Dalcin } 216abe9303eSLisandro Dalcin 217abe9303eSLisandro Dalcin /*@ 218abe9303eSLisandro Dalcin PetscPartitionerReset - Resets data structures for the PetscPartitioner 219abe9303eSLisandro Dalcin 220abe9303eSLisandro Dalcin Collective on PetscPartitioner 221abe9303eSLisandro Dalcin 222abe9303eSLisandro Dalcin Input Parameter: 223abe9303eSLisandro Dalcin . part - the PetscPartitioner object to reset 224abe9303eSLisandro Dalcin 225abe9303eSLisandro Dalcin Level: developer 226abe9303eSLisandro Dalcin 227abe9303eSLisandro Dalcin .seealso: PetscPartitionerSetUp(), PetscPartitionerDestroy() 228abe9303eSLisandro Dalcin @*/ 229abe9303eSLisandro Dalcin PetscErrorCode PetscPartitionerReset(PetscPartitioner part) 230abe9303eSLisandro Dalcin { 231abe9303eSLisandro Dalcin PetscFunctionBegin; 232abe9303eSLisandro Dalcin PetscValidHeaderSpecific(part, PETSCPARTITIONER_CLASSID, 1); 2335f80ce2aSJacob Faibussowitsch if (part->ops->reset) CHKERRQ((*part->ops->reset)(part)); 234abe9303eSLisandro Dalcin PetscFunctionReturn(0); 235abe9303eSLisandro Dalcin } 236abe9303eSLisandro Dalcin 237abe9303eSLisandro Dalcin /*@ 238abe9303eSLisandro Dalcin PetscPartitionerDestroy - Destroys a PetscPartitioner object 239abe9303eSLisandro Dalcin 240abe9303eSLisandro Dalcin Collective on PetscPartitioner 241abe9303eSLisandro Dalcin 242abe9303eSLisandro Dalcin Input Parameter: 243abe9303eSLisandro Dalcin . part - the PetscPartitioner object to destroy 244abe9303eSLisandro Dalcin 245abe9303eSLisandro Dalcin Level: developer 246abe9303eSLisandro Dalcin 247abe9303eSLisandro Dalcin .seealso: PetscPartitionerView() 248abe9303eSLisandro Dalcin @*/ 249abe9303eSLisandro Dalcin PetscErrorCode PetscPartitionerDestroy(PetscPartitioner *part) 250abe9303eSLisandro Dalcin { 251abe9303eSLisandro Dalcin PetscFunctionBegin; 252abe9303eSLisandro Dalcin if (!*part) PetscFunctionReturn(0); 253abe9303eSLisandro Dalcin PetscValidHeaderSpecific((*part), PETSCPARTITIONER_CLASSID, 1); 254abe9303eSLisandro Dalcin 255ea78f98cSLisandro Dalcin if (--((PetscObject)(*part))->refct > 0) {*part = NULL; PetscFunctionReturn(0);} 256abe9303eSLisandro Dalcin ((PetscObject) (*part))->refct = 0; 257abe9303eSLisandro Dalcin 2585f80ce2aSJacob Faibussowitsch CHKERRQ(PetscPartitionerReset(*part)); 259abe9303eSLisandro Dalcin 2605f80ce2aSJacob Faibussowitsch CHKERRQ(PetscViewerDestroy(&(*part)->viewer)); 2615f80ce2aSJacob Faibussowitsch CHKERRQ(PetscViewerDestroy(&(*part)->viewerGraph)); 2625f80ce2aSJacob Faibussowitsch if ((*part)->ops->destroy) CHKERRQ((*(*part)->ops->destroy)(*part)); 2635f80ce2aSJacob Faibussowitsch CHKERRQ(PetscHeaderDestroy(part)); 264abe9303eSLisandro Dalcin PetscFunctionReturn(0); 265abe9303eSLisandro Dalcin } 266abe9303eSLisandro Dalcin 267abe9303eSLisandro Dalcin /*@ 268abe9303eSLisandro Dalcin PetscPartitionerPartition - Partition a graph 269abe9303eSLisandro Dalcin 270abe9303eSLisandro Dalcin Collective on PetscPartitioner 271abe9303eSLisandro Dalcin 272abe9303eSLisandro Dalcin Input Parameters: 273abe9303eSLisandro Dalcin + part - The PetscPartitioner 274abe9303eSLisandro Dalcin . nparts - Number of partitions 275abe9303eSLisandro Dalcin . numVertices - Number of vertices in the local part of the graph 276abe9303eSLisandro Dalcin . start - row pointers for the local part of the graph (CSR style) 277abe9303eSLisandro Dalcin . adjacency - adjacency list (CSR style) 278abe9303eSLisandro Dalcin . vertexSection - PetscSection describing the absolute weight of each local vertex (can be NULL) 279abe9303eSLisandro Dalcin - targetSection - PetscSection describing the absolute weight of each partition (can be NULL) 280abe9303eSLisandro Dalcin 281abe9303eSLisandro Dalcin Output Parameters: 282abe9303eSLisandro Dalcin + partSection - The PetscSection giving the division of points by partition 283abe9303eSLisandro Dalcin - partition - The list of points by partition 284abe9303eSLisandro Dalcin 285abe9303eSLisandro Dalcin Options Database: 286abe9303eSLisandro Dalcin + -petscpartitioner_view - View the partitioner information 287abe9303eSLisandro Dalcin - -petscpartitioner_view_graph - View the graph we are partitioning 288abe9303eSLisandro Dalcin 289abe9303eSLisandro Dalcin Notes: 290abe9303eSLisandro Dalcin The chart of the vertexSection (if present) must contain [0,numVertices), with the number of dofs in the section specifying the absolute weight for each vertex. 291abe9303eSLisandro Dalcin The chart of the targetSection (if present) must contain [0,nparts), with the number of dofs in the section specifying the absolute weight for each partition. This information must be the same across processes, PETSc does not check it. 292abe9303eSLisandro Dalcin 293abe9303eSLisandro Dalcin Level: developer 294abe9303eSLisandro Dalcin 2956e0dc72eSMatthew G. Knepley .seealso PetscPartitionerCreate(), PetscPartitionerSetType(), PetscSectionCreate(), PetscSectionSetChart(), PetscSectionSetDof() 296abe9303eSLisandro Dalcin @*/ 297abe9303eSLisandro Dalcin PetscErrorCode PetscPartitionerPartition(PetscPartitioner part, PetscInt nparts, PetscInt numVertices, PetscInt start[], PetscInt adjacency[], PetscSection vertexSection, PetscSection targetSection, PetscSection partSection, IS *partition) 298abe9303eSLisandro Dalcin { 299abe9303eSLisandro Dalcin PetscFunctionBegin; 300abe9303eSLisandro Dalcin PetscValidHeaderSpecific(part, PETSCPARTITIONER_CLASSID, 1); 301abe9303eSLisandro Dalcin PetscValidLogicalCollectiveInt(part, nparts, 2); 3022c71b3e2SJacob Faibussowitsch PetscCheckFalse(nparts <= 0,PetscObjectComm((PetscObject) part), PETSC_ERR_ARG_OUTOFRANGE, "Number of parts must be positive"); 3032c71b3e2SJacob Faibussowitsch PetscCheckFalse(numVertices < 0,PETSC_COMM_SELF, PETSC_ERR_ARG_OUTOFRANGE, "Number of vertices must be non-negative"); 304abe9303eSLisandro Dalcin if (numVertices && !part->noGraph) { 305abe9303eSLisandro Dalcin PetscValidIntPointer(start, 4); 306abe9303eSLisandro Dalcin PetscValidIntPointer(start + numVertices, 4); 307abe9303eSLisandro Dalcin if (start[numVertices]) PetscValidIntPointer(adjacency, 5); 308abe9303eSLisandro Dalcin } 309abe9303eSLisandro Dalcin if (vertexSection) { 310abe9303eSLisandro Dalcin PetscInt s,e; 311abe9303eSLisandro Dalcin 312abe9303eSLisandro Dalcin PetscValidHeaderSpecific(vertexSection, PETSC_SECTION_CLASSID, 6); 3135f80ce2aSJacob Faibussowitsch CHKERRQ(PetscSectionGetChart(vertexSection, &s, &e)); 3142c71b3e2SJacob Faibussowitsch PetscCheckFalse(s > 0 || e < numVertices,PETSC_COMM_SELF,PETSC_ERR_ARG_OUTOFRANGE,"Invalid vertexSection chart [%D,%D)",s,e); 315abe9303eSLisandro Dalcin } 316abe9303eSLisandro Dalcin if (targetSection) { 317abe9303eSLisandro Dalcin PetscInt s,e; 318abe9303eSLisandro Dalcin 319abe9303eSLisandro Dalcin PetscValidHeaderSpecific(targetSection, PETSC_SECTION_CLASSID, 7); 3205f80ce2aSJacob Faibussowitsch CHKERRQ(PetscSectionGetChart(targetSection, &s, &e)); 3212c71b3e2SJacob Faibussowitsch PetscCheckFalse(s > 0 || e < nparts,PETSC_COMM_SELF,PETSC_ERR_ARG_OUTOFRANGE,"Invalid targetSection chart [%D,%D)",s,e); 322abe9303eSLisandro Dalcin } 323abe9303eSLisandro Dalcin PetscValidHeaderSpecific(partSection, PETSC_SECTION_CLASSID, 8); 324abe9303eSLisandro Dalcin PetscValidPointer(partition, 9); 325abe9303eSLisandro Dalcin 3265f80ce2aSJacob Faibussowitsch CHKERRQ(PetscSectionReset(partSection)); 3275f80ce2aSJacob Faibussowitsch CHKERRQ(PetscSectionSetChart(partSection, 0, nparts)); 328abe9303eSLisandro Dalcin if (nparts == 1) { /* quick */ 3295f80ce2aSJacob Faibussowitsch CHKERRQ(PetscSectionSetDof(partSection, 0, numVertices)); 3305f80ce2aSJacob Faibussowitsch CHKERRQ(ISCreateStride(PetscObjectComm((PetscObject)part),numVertices,0,1,partition)); 331abe9303eSLisandro Dalcin } else { 332*28b400f6SJacob Faibussowitsch PetscCheck(part->ops->partition,PetscObjectComm((PetscObject) part), PETSC_ERR_SUP, "PetscPartitioner %s has no partitioning method", ((PetscObject)part)->type_name); 3335f80ce2aSJacob Faibussowitsch CHKERRQ((*part->ops->partition)(part, nparts, numVertices, start, adjacency, vertexSection, targetSection, partSection, partition)); 334abe9303eSLisandro Dalcin } 3355f80ce2aSJacob Faibussowitsch CHKERRQ(PetscSectionSetUp(partSection)); 336abe9303eSLisandro Dalcin if (part->viewerGraph) { 337abe9303eSLisandro Dalcin PetscViewer viewer = part->viewerGraph; 338abe9303eSLisandro Dalcin PetscBool isascii; 339abe9303eSLisandro Dalcin PetscInt v, i; 340abe9303eSLisandro Dalcin PetscMPIInt rank; 341abe9303eSLisandro Dalcin 3425f80ce2aSJacob Faibussowitsch CHKERRMPI(MPI_Comm_rank(PetscObjectComm((PetscObject) viewer), &rank)); 3435f80ce2aSJacob Faibussowitsch CHKERRQ(PetscObjectTypeCompare((PetscObject) viewer, PETSCVIEWERASCII, &isascii)); 344abe9303eSLisandro Dalcin if (isascii) { 3455f80ce2aSJacob Faibussowitsch CHKERRQ(PetscViewerASCIIPushSynchronized(viewer)); 3465f80ce2aSJacob Faibussowitsch CHKERRQ(PetscViewerASCIISynchronizedPrintf(viewer, "[%d]Nv: %D\n", rank, numVertices)); 347abe9303eSLisandro Dalcin for (v = 0; v < numVertices; ++v) { 348abe9303eSLisandro Dalcin const PetscInt s = start[v]; 349abe9303eSLisandro Dalcin const PetscInt e = start[v+1]; 350abe9303eSLisandro Dalcin 3515f80ce2aSJacob Faibussowitsch CHKERRQ(PetscViewerASCIISynchronizedPrintf(viewer, "[%d] ", rank)); 3525f80ce2aSJacob Faibussowitsch for (i = s; i < e; ++i) CHKERRQ(PetscViewerASCIISynchronizedPrintf(viewer, "%D ", adjacency[i])); 3535f80ce2aSJacob Faibussowitsch CHKERRQ(PetscViewerASCIISynchronizedPrintf(viewer, "[%D-%D)\n", s, e)); 354abe9303eSLisandro Dalcin } 3555f80ce2aSJacob Faibussowitsch CHKERRQ(PetscViewerFlush(viewer)); 3565f80ce2aSJacob Faibussowitsch CHKERRQ(PetscViewerASCIIPopSynchronized(viewer)); 357abe9303eSLisandro Dalcin } 358abe9303eSLisandro Dalcin } 359abe9303eSLisandro Dalcin if (part->viewer) { 3605f80ce2aSJacob Faibussowitsch CHKERRQ(PetscPartitionerView(part,part->viewer)); 361abe9303eSLisandro Dalcin } 362abe9303eSLisandro Dalcin PetscFunctionReturn(0); 363abe9303eSLisandro Dalcin } 364abe9303eSLisandro Dalcin 365abe9303eSLisandro Dalcin /*@ 366abe9303eSLisandro Dalcin PetscPartitionerCreate - Creates an empty PetscPartitioner object. The type can then be set with PetscPartitionerSetType(). 367abe9303eSLisandro Dalcin 368abe9303eSLisandro Dalcin Collective 369abe9303eSLisandro Dalcin 370abe9303eSLisandro Dalcin Input Parameter: 371abe9303eSLisandro Dalcin . comm - The communicator for the PetscPartitioner object 372abe9303eSLisandro Dalcin 373abe9303eSLisandro Dalcin Output Parameter: 374abe9303eSLisandro Dalcin . part - The PetscPartitioner object 375abe9303eSLisandro Dalcin 376abe9303eSLisandro Dalcin Level: beginner 377abe9303eSLisandro Dalcin 3786e0dc72eSMatthew G. Knepley .seealso: PetscPartitionerSetType(), PetscPartitionerDestroy() 379abe9303eSLisandro Dalcin @*/ 380abe9303eSLisandro Dalcin PetscErrorCode PetscPartitionerCreate(MPI_Comm comm, PetscPartitioner *part) 381abe9303eSLisandro Dalcin { 382abe9303eSLisandro Dalcin PetscPartitioner p; 383abe9303eSLisandro Dalcin const char *partitionerType = NULL; 384abe9303eSLisandro Dalcin 385abe9303eSLisandro Dalcin PetscFunctionBegin; 386abe9303eSLisandro Dalcin PetscValidPointer(part, 2); 387abe9303eSLisandro Dalcin *part = NULL; 3885f80ce2aSJacob Faibussowitsch CHKERRQ(PetscPartitionerInitializePackage()); 389abe9303eSLisandro Dalcin 3905f80ce2aSJacob Faibussowitsch CHKERRQ(PetscHeaderCreate(p, PETSCPARTITIONER_CLASSID, "PetscPartitioner", "Graph Partitioner", "PetscPartitioner", comm, PetscPartitionerDestroy, PetscPartitionerView)); 3915f80ce2aSJacob Faibussowitsch CHKERRQ(PetscPartitionerGetDefaultType(comm, &partitionerType)); 3925f80ce2aSJacob Faibussowitsch CHKERRQ(PetscPartitionerSetType(p, partitionerType)); 393abe9303eSLisandro Dalcin 394abe9303eSLisandro Dalcin p->edgeCut = 0; 395abe9303eSLisandro Dalcin p->balance = 0.0; 396abe9303eSLisandro Dalcin p->usevwgt = PETSC_TRUE; 397abe9303eSLisandro Dalcin 398abe9303eSLisandro Dalcin *part = p; 399abe9303eSLisandro Dalcin PetscFunctionReturn(0); 400abe9303eSLisandro Dalcin } 401