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 24db781477SPatrick Sanan .seealso: `PetscPartitionerGetType()`, `PetscPartitionerCreate()` 25abe9303eSLisandro Dalcin @*/ 26*d71ae5a4SJacob Faibussowitsch PetscErrorCode PetscPartitionerSetType(PetscPartitioner part, PetscPartitionerType name) 27*d71ae5a4SJacob Faibussowitsch { 28abe9303eSLisandro Dalcin PetscErrorCode (*r)(PetscPartitioner); 29abe9303eSLisandro Dalcin PetscBool match; 30abe9303eSLisandro Dalcin 31abe9303eSLisandro Dalcin PetscFunctionBegin; 32abe9303eSLisandro Dalcin PetscValidHeaderSpecific(part, PETSCPARTITIONER_CLASSID, 1); 339566063dSJacob Faibussowitsch PetscCall(PetscObjectTypeCompare((PetscObject)part, name, &match)); 34abe9303eSLisandro Dalcin if (match) PetscFunctionReturn(0); 35abe9303eSLisandro Dalcin 369566063dSJacob Faibussowitsch PetscCall(PetscPartitionerRegisterAll()); 379566063dSJacob Faibussowitsch PetscCall(PetscFunctionListFind(PetscPartitionerList, name, &r)); 3828b400f6SJacob Faibussowitsch PetscCheck(r, PetscObjectComm((PetscObject)part), PETSC_ERR_ARG_UNKNOWN_TYPE, "Unknown PetscPartitioner type: %s", name); 39abe9303eSLisandro Dalcin 40dbbe0bcdSBarry Smith PetscTryTypeMethod(part, destroy); 41abe9303eSLisandro Dalcin part->noGraph = PETSC_FALSE; 429566063dSJacob Faibussowitsch PetscCall(PetscMemzero(part->ops, sizeof(*part->ops))); 439566063dSJacob Faibussowitsch PetscCall(PetscObjectChangeTypeName((PetscObject)part, name)); 449566063dSJacob Faibussowitsch PetscCall((*r)(part)); 45abe9303eSLisandro Dalcin PetscFunctionReturn(0); 46abe9303eSLisandro Dalcin } 47abe9303eSLisandro Dalcin 48abe9303eSLisandro Dalcin /*@C 49abe9303eSLisandro Dalcin PetscPartitionerGetType - Gets the PetscPartitioner type name (as a string) from the object. 50abe9303eSLisandro Dalcin 51abe9303eSLisandro Dalcin Not Collective 52abe9303eSLisandro Dalcin 53abe9303eSLisandro Dalcin Input Parameter: 54abe9303eSLisandro Dalcin . part - The PetscPartitioner 55abe9303eSLisandro Dalcin 56abe9303eSLisandro Dalcin Output Parameter: 57abe9303eSLisandro Dalcin . name - The PetscPartitioner type name 58abe9303eSLisandro Dalcin 59abe9303eSLisandro Dalcin Level: intermediate 60abe9303eSLisandro Dalcin 61db781477SPatrick Sanan .seealso: `PetscPartitionerSetType()`, `PetscPartitionerCreate()` 62abe9303eSLisandro Dalcin @*/ 63*d71ae5a4SJacob Faibussowitsch PetscErrorCode PetscPartitionerGetType(PetscPartitioner part, PetscPartitionerType *name) 64*d71ae5a4SJacob Faibussowitsch { 65abe9303eSLisandro Dalcin PetscFunctionBegin; 66abe9303eSLisandro Dalcin PetscValidHeaderSpecific(part, PETSCPARTITIONER_CLASSID, 1); 67abe9303eSLisandro Dalcin PetscValidPointer(name, 2); 68abe9303eSLisandro Dalcin *name = ((PetscObject)part)->type_name; 69abe9303eSLisandro Dalcin PetscFunctionReturn(0); 70abe9303eSLisandro Dalcin } 71abe9303eSLisandro Dalcin 72abe9303eSLisandro Dalcin /*@C 73abe9303eSLisandro Dalcin PetscPartitionerViewFromOptions - View from Options 74abe9303eSLisandro Dalcin 75abe9303eSLisandro Dalcin Collective on PetscPartitioner 76abe9303eSLisandro Dalcin 77abe9303eSLisandro Dalcin Input Parameters: 78abe9303eSLisandro Dalcin + A - the PetscPartitioner object 79abe9303eSLisandro Dalcin . obj - Optional object 80abe9303eSLisandro Dalcin - name - command line option 81abe9303eSLisandro Dalcin 82abe9303eSLisandro Dalcin Level: intermediate 83db781477SPatrick Sanan .seealso: `PetscPartitionerView()`, `PetscObjectViewFromOptions()` 84abe9303eSLisandro Dalcin @*/ 85*d71ae5a4SJacob Faibussowitsch PetscErrorCode PetscPartitionerViewFromOptions(PetscPartitioner A, PetscObject obj, const char name[]) 86*d71ae5a4SJacob Faibussowitsch { 87abe9303eSLisandro Dalcin PetscFunctionBegin; 88abe9303eSLisandro Dalcin PetscValidHeaderSpecific(A, PETSCPARTITIONER_CLASSID, 1); 899566063dSJacob Faibussowitsch PetscCall(PetscObjectViewFromOptions((PetscObject)A, obj, name)); 90abe9303eSLisandro Dalcin PetscFunctionReturn(0); 91abe9303eSLisandro Dalcin } 92abe9303eSLisandro Dalcin 93abe9303eSLisandro Dalcin /*@ 94abe9303eSLisandro Dalcin PetscPartitionerView - Views a PetscPartitioner 95abe9303eSLisandro Dalcin 96abe9303eSLisandro Dalcin Collective on PetscPartitioner 97abe9303eSLisandro Dalcin 98d8d19677SJose E. Roman Input Parameters: 99abe9303eSLisandro Dalcin + part - the PetscPartitioner object to view 100abe9303eSLisandro Dalcin - v - the viewer 101abe9303eSLisandro Dalcin 102abe9303eSLisandro Dalcin Level: developer 103abe9303eSLisandro Dalcin 104db781477SPatrick Sanan .seealso: `PetscPartitionerDestroy()` 105abe9303eSLisandro Dalcin @*/ 106*d71ae5a4SJacob Faibussowitsch PetscErrorCode PetscPartitionerView(PetscPartitioner part, PetscViewer v) 107*d71ae5a4SJacob Faibussowitsch { 108abe9303eSLisandro Dalcin PetscMPIInt size; 109abe9303eSLisandro Dalcin PetscBool isascii; 110abe9303eSLisandro Dalcin 111abe9303eSLisandro Dalcin PetscFunctionBegin; 112abe9303eSLisandro Dalcin PetscValidHeaderSpecific(part, PETSCPARTITIONER_CLASSID, 1); 1139566063dSJacob Faibussowitsch if (!v) PetscCall(PetscViewerASCIIGetStdout(PetscObjectComm((PetscObject)part), &v)); 1149566063dSJacob Faibussowitsch PetscCall(PetscObjectTypeCompare((PetscObject)v, PETSCVIEWERASCII, &isascii)); 115abe9303eSLisandro Dalcin if (isascii) { 1169566063dSJacob Faibussowitsch PetscCallMPI(MPI_Comm_size(PetscObjectComm((PetscObject)part), &size)); 1179566063dSJacob Faibussowitsch PetscCall(PetscViewerASCIIPrintf(v, "Graph Partitioner: %d MPI Process%s\n", size, size > 1 ? "es" : "")); 1189566063dSJacob Faibussowitsch PetscCall(PetscViewerASCIIPrintf(v, " type: %s\n", ((PetscObject)part)->type_name)); 11963a3b9bcSJacob Faibussowitsch PetscCall(PetscViewerASCIIPrintf(v, " edge cut: %" PetscInt_FMT "\n", part->edgeCut)); 12063a3b9bcSJacob Faibussowitsch PetscCall(PetscViewerASCIIPrintf(v, " balance: %.2g\n", (double)part->balance)); 1219566063dSJacob Faibussowitsch PetscCall(PetscViewerASCIIPrintf(v, " use vertex weights: %d\n", part->usevwgt)); 122abe9303eSLisandro Dalcin } 123dbbe0bcdSBarry Smith PetscTryTypeMethod(part, view, v); 124abe9303eSLisandro Dalcin PetscFunctionReturn(0); 125abe9303eSLisandro Dalcin } 126abe9303eSLisandro Dalcin 127*d71ae5a4SJacob Faibussowitsch static PetscErrorCode PetscPartitionerGetDefaultType(MPI_Comm comm, const char **defaultType) 128*d71ae5a4SJacob Faibussowitsch { 129abe9303eSLisandro Dalcin PetscMPIInt size; 130abe9303eSLisandro Dalcin 131abe9303eSLisandro Dalcin PetscFunctionBegin; 1329566063dSJacob Faibussowitsch PetscCallMPI(MPI_Comm_size(comm, &size)); 133abe9303eSLisandro Dalcin if (size == 1) { 134abe9303eSLisandro Dalcin *defaultType = PETSCPARTITIONERSIMPLE; 135abe9303eSLisandro Dalcin } else { 136abe9303eSLisandro Dalcin #if defined(PETSC_HAVE_PARMETIS) 137abe9303eSLisandro Dalcin *defaultType = PETSCPARTITIONERPARMETIS; 138abe9303eSLisandro Dalcin #elif defined(PETSC_HAVE_PTSCOTCH) 139abe9303eSLisandro Dalcin *defaultType = PETSCPARTITIONERPTSCOTCH; 140abe9303eSLisandro Dalcin #elif defined(PETSC_HAVE_CHACO) 141abe9303eSLisandro Dalcin *defaultType = PETSCPARTITIONERCHACO; 142abe9303eSLisandro Dalcin #else 143abe9303eSLisandro Dalcin *defaultType = PETSCPARTITIONERSIMPLE; 144abe9303eSLisandro Dalcin #endif 145abe9303eSLisandro Dalcin } 146abe9303eSLisandro Dalcin PetscFunctionReturn(0); 147abe9303eSLisandro Dalcin } 148abe9303eSLisandro Dalcin 149abe9303eSLisandro Dalcin /*@ 150abe9303eSLisandro Dalcin PetscPartitionerSetFromOptions - sets parameters in a PetscPartitioner from the options database 151abe9303eSLisandro Dalcin 152abe9303eSLisandro Dalcin Collective on PetscPartitioner 153abe9303eSLisandro Dalcin 154abe9303eSLisandro Dalcin Input Parameter: 155abe9303eSLisandro Dalcin . part - the PetscPartitioner object to set options for 156abe9303eSLisandro Dalcin 157abe9303eSLisandro Dalcin Options Database Keys: 158abe9303eSLisandro Dalcin + -petscpartitioner_type <type> - Sets the PetscPartitioner type; use -help for a list of available types 159abe9303eSLisandro Dalcin . -petscpartitioner_use_vertex_weights - Uses weights associated with the graph vertices 160abe9303eSLisandro Dalcin - -petscpartitioner_view_graph - View the graph each time PetscPartitionerPartition is called. Viewer can be customized, see PetscOptionsGetViewer() 161abe9303eSLisandro Dalcin 162abe9303eSLisandro Dalcin Level: developer 163abe9303eSLisandro Dalcin 164db781477SPatrick Sanan .seealso: `PetscPartitionerView()`, `PetscPartitionerSetType()`, `PetscPartitionerPartition()` 165abe9303eSLisandro Dalcin @*/ 166*d71ae5a4SJacob Faibussowitsch PetscErrorCode PetscPartitionerSetFromOptions(PetscPartitioner part) 167*d71ae5a4SJacob Faibussowitsch { 168d7cc930eSLisandro Dalcin const char *currentType = NULL; 169abe9303eSLisandro Dalcin char name[256]; 170abe9303eSLisandro Dalcin PetscBool flg; 171abe9303eSLisandro Dalcin 172abe9303eSLisandro Dalcin PetscFunctionBegin; 173abe9303eSLisandro Dalcin PetscValidHeaderSpecific(part, PETSCPARTITIONER_CLASSID, 1); 174d0609cedSBarry Smith PetscObjectOptionsBegin((PetscObject)part); 1759566063dSJacob Faibussowitsch PetscCall(PetscPartitionerGetType(part, ¤tType)); 1769566063dSJacob Faibussowitsch PetscCall(PetscOptionsFList("-petscpartitioner_type", "Graph partitioner", "PetscPartitionerSetType", PetscPartitionerList, currentType, name, sizeof(name), &flg)); 1771baa6e33SBarry Smith if (flg) PetscCall(PetscPartitionerSetType(part, name)); 1789566063dSJacob Faibussowitsch PetscCall(PetscOptionsBool("-petscpartitioner_use_vertex_weights", "Use vertex weights", "", part->usevwgt, &part->usevwgt, NULL)); 179dbbe0bcdSBarry Smith PetscTryTypeMethod(part, setfromoptions, PetscOptionsObject); 1809566063dSJacob Faibussowitsch PetscCall(PetscViewerDestroy(&part->viewer)); 1819566063dSJacob Faibussowitsch PetscCall(PetscViewerDestroy(&part->viewerGraph)); 1829566063dSJacob Faibussowitsch PetscCall(PetscOptionsGetViewer(((PetscObject)part)->comm, ((PetscObject)part)->options, ((PetscObject)part)->prefix, "-petscpartitioner_view", &part->viewer, NULL, NULL)); 1839566063dSJacob Faibussowitsch PetscCall(PetscOptionsGetViewer(((PetscObject)part)->comm, ((PetscObject)part)->options, ((PetscObject)part)->prefix, "-petscpartitioner_view_graph", &part->viewerGraph, NULL, &part->viewGraph)); 184abe9303eSLisandro Dalcin /* process any options handlers added with PetscObjectAddOptionsHandler() */ 185dbbe0bcdSBarry Smith PetscCall(PetscObjectProcessOptionsHandlers((PetscObject)part, PetscOptionsObject)); 186d0609cedSBarry Smith PetscOptionsEnd(); 187abe9303eSLisandro Dalcin PetscFunctionReturn(0); 188abe9303eSLisandro Dalcin } 189abe9303eSLisandro Dalcin 190abe9303eSLisandro Dalcin /*@ 191abe9303eSLisandro Dalcin PetscPartitionerSetUp - Construct data structures for the PetscPartitioner 192abe9303eSLisandro Dalcin 193abe9303eSLisandro Dalcin Collective on PetscPartitioner 194abe9303eSLisandro Dalcin 195abe9303eSLisandro Dalcin Input Parameter: 196abe9303eSLisandro Dalcin . part - the PetscPartitioner object to setup 197abe9303eSLisandro Dalcin 198abe9303eSLisandro Dalcin Level: developer 199abe9303eSLisandro Dalcin 200db781477SPatrick Sanan .seealso: `PetscPartitionerView()`, `PetscPartitionerDestroy()` 201abe9303eSLisandro Dalcin @*/ 202*d71ae5a4SJacob Faibussowitsch PetscErrorCode PetscPartitionerSetUp(PetscPartitioner part) 203*d71ae5a4SJacob Faibussowitsch { 204abe9303eSLisandro Dalcin PetscFunctionBegin; 205abe9303eSLisandro Dalcin PetscValidHeaderSpecific(part, PETSCPARTITIONER_CLASSID, 1); 206dbbe0bcdSBarry Smith PetscTryTypeMethod(part, setup); 207abe9303eSLisandro Dalcin PetscFunctionReturn(0); 208abe9303eSLisandro Dalcin } 209abe9303eSLisandro Dalcin 210abe9303eSLisandro Dalcin /*@ 211abe9303eSLisandro Dalcin PetscPartitionerReset - Resets data structures for the PetscPartitioner 212abe9303eSLisandro Dalcin 213abe9303eSLisandro Dalcin Collective on PetscPartitioner 214abe9303eSLisandro Dalcin 215abe9303eSLisandro Dalcin Input Parameter: 216abe9303eSLisandro Dalcin . part - the PetscPartitioner object to reset 217abe9303eSLisandro Dalcin 218abe9303eSLisandro Dalcin Level: developer 219abe9303eSLisandro Dalcin 220db781477SPatrick Sanan .seealso: `PetscPartitionerSetUp()`, `PetscPartitionerDestroy()` 221abe9303eSLisandro Dalcin @*/ 222*d71ae5a4SJacob Faibussowitsch PetscErrorCode PetscPartitionerReset(PetscPartitioner part) 223*d71ae5a4SJacob Faibussowitsch { 224abe9303eSLisandro Dalcin PetscFunctionBegin; 225abe9303eSLisandro Dalcin PetscValidHeaderSpecific(part, PETSCPARTITIONER_CLASSID, 1); 226dbbe0bcdSBarry Smith PetscTryTypeMethod(part, reset); 227abe9303eSLisandro Dalcin PetscFunctionReturn(0); 228abe9303eSLisandro Dalcin } 229abe9303eSLisandro Dalcin 230abe9303eSLisandro Dalcin /*@ 231abe9303eSLisandro Dalcin PetscPartitionerDestroy - Destroys a PetscPartitioner object 232abe9303eSLisandro Dalcin 233abe9303eSLisandro Dalcin Collective on PetscPartitioner 234abe9303eSLisandro Dalcin 235abe9303eSLisandro Dalcin Input Parameter: 236abe9303eSLisandro Dalcin . part - the PetscPartitioner object to destroy 237abe9303eSLisandro Dalcin 238abe9303eSLisandro Dalcin Level: developer 239abe9303eSLisandro Dalcin 240db781477SPatrick Sanan .seealso: `PetscPartitionerView()` 241abe9303eSLisandro Dalcin @*/ 242*d71ae5a4SJacob Faibussowitsch PetscErrorCode PetscPartitionerDestroy(PetscPartitioner *part) 243*d71ae5a4SJacob Faibussowitsch { 244abe9303eSLisandro Dalcin PetscFunctionBegin; 245abe9303eSLisandro Dalcin if (!*part) PetscFunctionReturn(0); 246abe9303eSLisandro Dalcin PetscValidHeaderSpecific((*part), PETSCPARTITIONER_CLASSID, 1); 247abe9303eSLisandro Dalcin 2489371c9d4SSatish Balay if (--((PetscObject)(*part))->refct > 0) { 2499371c9d4SSatish Balay *part = NULL; 2509371c9d4SSatish Balay PetscFunctionReturn(0); 2519371c9d4SSatish Balay } 252abe9303eSLisandro Dalcin ((PetscObject)(*part))->refct = 0; 253abe9303eSLisandro Dalcin 2549566063dSJacob Faibussowitsch PetscCall(PetscPartitionerReset(*part)); 255abe9303eSLisandro Dalcin 2569566063dSJacob Faibussowitsch PetscCall(PetscViewerDestroy(&(*part)->viewer)); 2579566063dSJacob Faibussowitsch PetscCall(PetscViewerDestroy(&(*part)->viewerGraph)); 258dbbe0bcdSBarry Smith PetscTryTypeMethod((*part), destroy); 2599566063dSJacob Faibussowitsch PetscCall(PetscHeaderDestroy(part)); 260abe9303eSLisandro Dalcin PetscFunctionReturn(0); 261abe9303eSLisandro Dalcin } 262abe9303eSLisandro Dalcin 263abe9303eSLisandro Dalcin /*@ 264abe9303eSLisandro Dalcin PetscPartitionerPartition - Partition a graph 265abe9303eSLisandro Dalcin 266abe9303eSLisandro Dalcin Collective on PetscPartitioner 267abe9303eSLisandro Dalcin 268abe9303eSLisandro Dalcin Input Parameters: 269abe9303eSLisandro Dalcin + part - The PetscPartitioner 270abe9303eSLisandro Dalcin . nparts - Number of partitions 271abe9303eSLisandro Dalcin . numVertices - Number of vertices in the local part of the graph 272abe9303eSLisandro Dalcin . start - row pointers for the local part of the graph (CSR style) 273abe9303eSLisandro Dalcin . adjacency - adjacency list (CSR style) 274abe9303eSLisandro Dalcin . vertexSection - PetscSection describing the absolute weight of each local vertex (can be NULL) 275abe9303eSLisandro Dalcin - targetSection - PetscSection describing the absolute weight of each partition (can be NULL) 276abe9303eSLisandro Dalcin 277abe9303eSLisandro Dalcin Output Parameters: 278abe9303eSLisandro Dalcin + partSection - The PetscSection giving the division of points by partition 279abe9303eSLisandro Dalcin - partition - The list of points by partition 280abe9303eSLisandro Dalcin 281abe9303eSLisandro Dalcin Options Database: 282abe9303eSLisandro Dalcin + -petscpartitioner_view - View the partitioner information 283abe9303eSLisandro Dalcin - -petscpartitioner_view_graph - View the graph we are partitioning 284abe9303eSLisandro Dalcin 285abe9303eSLisandro Dalcin Notes: 286abe9303eSLisandro 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. 287abe9303eSLisandro 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. 288abe9303eSLisandro Dalcin 289abe9303eSLisandro Dalcin Level: developer 290abe9303eSLisandro Dalcin 291db781477SPatrick Sanan .seealso `PetscPartitionerCreate()`, `PetscPartitionerSetType()`, `PetscSectionCreate()`, `PetscSectionSetChart()`, `PetscSectionSetDof()` 292abe9303eSLisandro Dalcin @*/ 293*d71ae5a4SJacob Faibussowitsch PetscErrorCode PetscPartitionerPartition(PetscPartitioner part, PetscInt nparts, PetscInt numVertices, PetscInt start[], PetscInt adjacency[], PetscSection vertexSection, PetscSection targetSection, PetscSection partSection, IS *partition) 294*d71ae5a4SJacob Faibussowitsch { 295abe9303eSLisandro Dalcin PetscFunctionBegin; 296abe9303eSLisandro Dalcin PetscValidHeaderSpecific(part, PETSCPARTITIONER_CLASSID, 1); 297abe9303eSLisandro Dalcin PetscValidLogicalCollectiveInt(part, nparts, 2); 29808401ef6SPierre Jolivet PetscCheck(nparts > 0, PetscObjectComm((PetscObject)part), PETSC_ERR_ARG_OUTOFRANGE, "Number of parts must be positive"); 29908401ef6SPierre Jolivet PetscCheck(numVertices >= 0, PETSC_COMM_SELF, PETSC_ERR_ARG_OUTOFRANGE, "Number of vertices must be non-negative"); 300abe9303eSLisandro Dalcin if (numVertices && !part->noGraph) { 301abe9303eSLisandro Dalcin PetscValidIntPointer(start, 4); 302abe9303eSLisandro Dalcin PetscValidIntPointer(start + numVertices, 4); 303abe9303eSLisandro Dalcin if (start[numVertices]) PetscValidIntPointer(adjacency, 5); 304abe9303eSLisandro Dalcin } 305abe9303eSLisandro Dalcin if (vertexSection) { 306abe9303eSLisandro Dalcin PetscInt s, e; 307abe9303eSLisandro Dalcin 308abe9303eSLisandro Dalcin PetscValidHeaderSpecific(vertexSection, PETSC_SECTION_CLASSID, 6); 3099566063dSJacob Faibussowitsch PetscCall(PetscSectionGetChart(vertexSection, &s, &e)); 3101dca8a05SBarry Smith PetscCheck(s <= 0 && e >= numVertices, PETSC_COMM_SELF, PETSC_ERR_ARG_OUTOFRANGE, "Invalid vertexSection chart [%" PetscInt_FMT ",%" PetscInt_FMT ")", s, e); 311abe9303eSLisandro Dalcin } 312abe9303eSLisandro Dalcin if (targetSection) { 313abe9303eSLisandro Dalcin PetscInt s, e; 314abe9303eSLisandro Dalcin 315abe9303eSLisandro Dalcin PetscValidHeaderSpecific(targetSection, PETSC_SECTION_CLASSID, 7); 3169566063dSJacob Faibussowitsch PetscCall(PetscSectionGetChart(targetSection, &s, &e)); 3171dca8a05SBarry Smith PetscCheck(s <= 0 && e >= nparts, PETSC_COMM_SELF, PETSC_ERR_ARG_OUTOFRANGE, "Invalid targetSection chart [%" PetscInt_FMT ",%" PetscInt_FMT ")", s, e); 318abe9303eSLisandro Dalcin } 319abe9303eSLisandro Dalcin PetscValidHeaderSpecific(partSection, PETSC_SECTION_CLASSID, 8); 320abe9303eSLisandro Dalcin PetscValidPointer(partition, 9); 321abe9303eSLisandro Dalcin 3229566063dSJacob Faibussowitsch PetscCall(PetscSectionReset(partSection)); 3239566063dSJacob Faibussowitsch PetscCall(PetscSectionSetChart(partSection, 0, nparts)); 324abe9303eSLisandro Dalcin if (nparts == 1) { /* quick */ 3259566063dSJacob Faibussowitsch PetscCall(PetscSectionSetDof(partSection, 0, numVertices)); 3269566063dSJacob Faibussowitsch PetscCall(ISCreateStride(PetscObjectComm((PetscObject)part), numVertices, 0, 1, partition)); 327dbbe0bcdSBarry Smith } else PetscUseTypeMethod(part, partition, nparts, numVertices, start, adjacency, vertexSection, targetSection, partSection, partition); 3289566063dSJacob Faibussowitsch PetscCall(PetscSectionSetUp(partSection)); 329abe9303eSLisandro Dalcin if (part->viewerGraph) { 330abe9303eSLisandro Dalcin PetscViewer viewer = part->viewerGraph; 331abe9303eSLisandro Dalcin PetscBool isascii; 332abe9303eSLisandro Dalcin PetscInt v, i; 333abe9303eSLisandro Dalcin PetscMPIInt rank; 334abe9303eSLisandro Dalcin 3359566063dSJacob Faibussowitsch PetscCallMPI(MPI_Comm_rank(PetscObjectComm((PetscObject)viewer), &rank)); 3369566063dSJacob Faibussowitsch PetscCall(PetscObjectTypeCompare((PetscObject)viewer, PETSCVIEWERASCII, &isascii)); 337abe9303eSLisandro Dalcin if (isascii) { 3389566063dSJacob Faibussowitsch PetscCall(PetscViewerASCIIPushSynchronized(viewer)); 33963a3b9bcSJacob Faibussowitsch PetscCall(PetscViewerASCIISynchronizedPrintf(viewer, "[%d]Nv: %" PetscInt_FMT "\n", rank, numVertices)); 340abe9303eSLisandro Dalcin for (v = 0; v < numVertices; ++v) { 341abe9303eSLisandro Dalcin const PetscInt s = start[v]; 342abe9303eSLisandro Dalcin const PetscInt e = start[v + 1]; 343abe9303eSLisandro Dalcin 3449566063dSJacob Faibussowitsch PetscCall(PetscViewerASCIISynchronizedPrintf(viewer, "[%d] ", rank)); 34563a3b9bcSJacob Faibussowitsch for (i = s; i < e; ++i) PetscCall(PetscViewerASCIISynchronizedPrintf(viewer, "%" PetscInt_FMT " ", adjacency[i])); 34663a3b9bcSJacob Faibussowitsch PetscCall(PetscViewerASCIISynchronizedPrintf(viewer, "[%" PetscInt_FMT "-%" PetscInt_FMT ")\n", s, e)); 347abe9303eSLisandro Dalcin } 3489566063dSJacob Faibussowitsch PetscCall(PetscViewerFlush(viewer)); 3499566063dSJacob Faibussowitsch PetscCall(PetscViewerASCIIPopSynchronized(viewer)); 350abe9303eSLisandro Dalcin } 351abe9303eSLisandro Dalcin } 3521baa6e33SBarry Smith if (part->viewer) PetscCall(PetscPartitionerView(part, part->viewer)); 353abe9303eSLisandro Dalcin PetscFunctionReturn(0); 354abe9303eSLisandro Dalcin } 355abe9303eSLisandro Dalcin 356abe9303eSLisandro Dalcin /*@ 357abe9303eSLisandro Dalcin PetscPartitionerCreate - Creates an empty PetscPartitioner object. The type can then be set with PetscPartitionerSetType(). 358abe9303eSLisandro Dalcin 359abe9303eSLisandro Dalcin Collective 360abe9303eSLisandro Dalcin 361abe9303eSLisandro Dalcin Input Parameter: 362abe9303eSLisandro Dalcin . comm - The communicator for the PetscPartitioner object 363abe9303eSLisandro Dalcin 364abe9303eSLisandro Dalcin Output Parameter: 365abe9303eSLisandro Dalcin . part - The PetscPartitioner object 366abe9303eSLisandro Dalcin 367abe9303eSLisandro Dalcin Level: beginner 368abe9303eSLisandro Dalcin 369db781477SPatrick Sanan .seealso: `PetscPartitionerSetType()`, `PetscPartitionerDestroy()` 370abe9303eSLisandro Dalcin @*/ 371*d71ae5a4SJacob Faibussowitsch PetscErrorCode PetscPartitionerCreate(MPI_Comm comm, PetscPartitioner *part) 372*d71ae5a4SJacob Faibussowitsch { 373abe9303eSLisandro Dalcin PetscPartitioner p; 374abe9303eSLisandro Dalcin const char *partitionerType = NULL; 375abe9303eSLisandro Dalcin 376abe9303eSLisandro Dalcin PetscFunctionBegin; 377abe9303eSLisandro Dalcin PetscValidPointer(part, 2); 378abe9303eSLisandro Dalcin *part = NULL; 3799566063dSJacob Faibussowitsch PetscCall(PetscPartitionerInitializePackage()); 380abe9303eSLisandro Dalcin 3819566063dSJacob Faibussowitsch PetscCall(PetscHeaderCreate(p, PETSCPARTITIONER_CLASSID, "PetscPartitioner", "Graph Partitioner", "PetscPartitioner", comm, PetscPartitionerDestroy, PetscPartitionerView)); 3829566063dSJacob Faibussowitsch PetscCall(PetscPartitionerGetDefaultType(comm, &partitionerType)); 3839566063dSJacob Faibussowitsch PetscCall(PetscPartitionerSetType(p, partitionerType)); 384abe9303eSLisandro Dalcin 385abe9303eSLisandro Dalcin p->edgeCut = 0; 386abe9303eSLisandro Dalcin p->balance = 0.0; 387abe9303eSLisandro Dalcin p->usevwgt = PETSC_TRUE; 388abe9303eSLisandro Dalcin 389abe9303eSLisandro Dalcin *part = p; 390abe9303eSLisandro Dalcin PetscFunctionReturn(0); 391abe9303eSLisandro Dalcin } 392