1abe9303eSLisandro Dalcin #include <petsc/private/partitionerimpl.h> /*I "petscpartitioner.h" I*/ 2abe9303eSLisandro Dalcin 3abe9303eSLisandro Dalcin /*@C 420f4b53cSBarry Smith PetscPartitionerSetType - Builds a particular `PetscPartitioner` 5abe9303eSLisandro Dalcin 620f4b53cSBarry Smith Collective 7abe9303eSLisandro Dalcin 8abe9303eSLisandro Dalcin Input Parameters: 920f4b53cSBarry Smith + part - The `PetscPartitioner` object 10abe9303eSLisandro Dalcin - name - The kind of partitioner 11abe9303eSLisandro Dalcin 12abe9303eSLisandro Dalcin Options Database Key: 1320f4b53cSBarry Smith . -petscpartitioner_type <type> - Sets the `PetscPartitioner` type 146e0dc72eSMatthew G. Knepley 15abe9303eSLisandro Dalcin Level: intermediate 16abe9303eSLisandro Dalcin 1720f4b53cSBarry Smith Note: 1820f4b53cSBarry Smith .vb 1920f4b53cSBarry Smith PETSCPARTITIONERCHACO - The Chaco partitioner (--download-chaco) 2020f4b53cSBarry Smith PETSCPARTITIONERPARMETIS - The ParMetis partitioner (--download-parmetis) 2120f4b53cSBarry Smith PETSCPARTITIONERSHELL - A shell partitioner implemented by the user 2220f4b53cSBarry Smith PETSCPARTITIONERSIMPLE - A simple partitioner that divides cells into equal, contiguous chunks 2320f4b53cSBarry Smith PETSCPARTITIONERGATHER - Gathers all cells onto process 0 2420f4b53cSBarry Smith .ve 2520f4b53cSBarry Smith 26db781477SPatrick Sanan .seealso: `PetscPartitionerGetType()`, `PetscPartitionerCreate()` 27abe9303eSLisandro Dalcin @*/ 28d71ae5a4SJacob Faibussowitsch PetscErrorCode PetscPartitionerSetType(PetscPartitioner part, PetscPartitionerType name) 29d71ae5a4SJacob Faibussowitsch { 30abe9303eSLisandro Dalcin PetscErrorCode (*r)(PetscPartitioner); 31abe9303eSLisandro Dalcin PetscBool match; 32abe9303eSLisandro Dalcin 33abe9303eSLisandro Dalcin PetscFunctionBegin; 34abe9303eSLisandro Dalcin PetscValidHeaderSpecific(part, PETSCPARTITIONER_CLASSID, 1); 359566063dSJacob Faibussowitsch PetscCall(PetscObjectTypeCompare((PetscObject)part, name, &match)); 363ba16761SJacob Faibussowitsch if (match) PetscFunctionReturn(PETSC_SUCCESS); 37abe9303eSLisandro Dalcin 389566063dSJacob Faibussowitsch PetscCall(PetscPartitionerRegisterAll()); 399566063dSJacob Faibussowitsch PetscCall(PetscFunctionListFind(PetscPartitionerList, name, &r)); 4028b400f6SJacob Faibussowitsch PetscCheck(r, PetscObjectComm((PetscObject)part), PETSC_ERR_ARG_UNKNOWN_TYPE, "Unknown PetscPartitioner type: %s", name); 41abe9303eSLisandro Dalcin 42dbbe0bcdSBarry Smith PetscTryTypeMethod(part, destroy); 43abe9303eSLisandro Dalcin part->noGraph = PETSC_FALSE; 449566063dSJacob Faibussowitsch PetscCall(PetscMemzero(part->ops, sizeof(*part->ops))); 459566063dSJacob Faibussowitsch PetscCall(PetscObjectChangeTypeName((PetscObject)part, name)); 469566063dSJacob Faibussowitsch PetscCall((*r)(part)); 473ba16761SJacob Faibussowitsch PetscFunctionReturn(PETSC_SUCCESS); 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 63db781477SPatrick Sanan .seealso: `PetscPartitionerSetType()`, `PetscPartitionerCreate()` 64abe9303eSLisandro Dalcin @*/ 65d71ae5a4SJacob Faibussowitsch PetscErrorCode PetscPartitionerGetType(PetscPartitioner part, PetscPartitionerType *name) 66d71ae5a4SJacob Faibussowitsch { 67abe9303eSLisandro Dalcin PetscFunctionBegin; 68abe9303eSLisandro Dalcin PetscValidHeaderSpecific(part, PETSCPARTITIONER_CLASSID, 1); 694f572ea9SToby Isaac PetscAssertPointer(name, 2); 70abe9303eSLisandro Dalcin *name = ((PetscObject)part)->type_name; 713ba16761SJacob Faibussowitsch PetscFunctionReturn(PETSC_SUCCESS); 72abe9303eSLisandro Dalcin } 73abe9303eSLisandro Dalcin 74abe9303eSLisandro Dalcin /*@C 7520f4b53cSBarry Smith PetscPartitionerViewFromOptions - View a `PetscPartitioner` object based on options in the options database 76abe9303eSLisandro Dalcin 7720f4b53cSBarry Smith Collective 78abe9303eSLisandro Dalcin 79abe9303eSLisandro Dalcin Input Parameters: 8020f4b53cSBarry Smith + A - the `PetscPartitioner` object 8120f4b53cSBarry Smith . obj - Optional `PetscObject` that provides the options prefix 82abe9303eSLisandro Dalcin - name - command line option 83abe9303eSLisandro Dalcin 84abe9303eSLisandro Dalcin Level: intermediate 8520f4b53cSBarry Smith 8620f4b53cSBarry Smith Note: 8720f4b53cSBarry Smith See `PetscObjectViewFromOptions()` for the various forms of viewers that may be used 8820f4b53cSBarry Smith 89db781477SPatrick Sanan .seealso: `PetscPartitionerView()`, `PetscObjectViewFromOptions()` 90abe9303eSLisandro Dalcin @*/ 91d71ae5a4SJacob Faibussowitsch PetscErrorCode PetscPartitionerViewFromOptions(PetscPartitioner A, PetscObject obj, const char name[]) 92d71ae5a4SJacob Faibussowitsch { 93abe9303eSLisandro Dalcin PetscFunctionBegin; 94abe9303eSLisandro Dalcin PetscValidHeaderSpecific(A, PETSCPARTITIONER_CLASSID, 1); 959566063dSJacob Faibussowitsch PetscCall(PetscObjectViewFromOptions((PetscObject)A, obj, name)); 963ba16761SJacob Faibussowitsch PetscFunctionReturn(PETSC_SUCCESS); 97abe9303eSLisandro Dalcin } 98abe9303eSLisandro Dalcin 99abe9303eSLisandro Dalcin /*@ 10020f4b53cSBarry Smith PetscPartitionerView - Views a `PetscPartitioner` 101abe9303eSLisandro Dalcin 10220f4b53cSBarry Smith Collective 103abe9303eSLisandro Dalcin 104d8d19677SJose E. Roman Input Parameters: 10520f4b53cSBarry Smith + part - the `PetscPartitioner` object to view 106abe9303eSLisandro Dalcin - v - the viewer 107abe9303eSLisandro Dalcin 108abe9303eSLisandro Dalcin Level: developer 109abe9303eSLisandro Dalcin 110db781477SPatrick Sanan .seealso: `PetscPartitionerDestroy()` 111abe9303eSLisandro Dalcin @*/ 112d71ae5a4SJacob Faibussowitsch PetscErrorCode PetscPartitionerView(PetscPartitioner part, PetscViewer v) 113d71ae5a4SJacob Faibussowitsch { 114abe9303eSLisandro Dalcin PetscMPIInt size; 115abe9303eSLisandro Dalcin PetscBool isascii; 116abe9303eSLisandro Dalcin 117abe9303eSLisandro Dalcin PetscFunctionBegin; 118abe9303eSLisandro Dalcin PetscValidHeaderSpecific(part, PETSCPARTITIONER_CLASSID, 1); 1199566063dSJacob Faibussowitsch if (!v) PetscCall(PetscViewerASCIIGetStdout(PetscObjectComm((PetscObject)part), &v)); 1209566063dSJacob Faibussowitsch PetscCall(PetscObjectTypeCompare((PetscObject)v, PETSCVIEWERASCII, &isascii)); 121abe9303eSLisandro Dalcin if (isascii) { 1229566063dSJacob Faibussowitsch PetscCallMPI(MPI_Comm_size(PetscObjectComm((PetscObject)part), &size)); 1239566063dSJacob Faibussowitsch PetscCall(PetscViewerASCIIPrintf(v, "Graph Partitioner: %d MPI Process%s\n", size, size > 1 ? "es" : "")); 1249566063dSJacob Faibussowitsch PetscCall(PetscViewerASCIIPrintf(v, " type: %s\n", ((PetscObject)part)->type_name)); 12563a3b9bcSJacob Faibussowitsch PetscCall(PetscViewerASCIIPrintf(v, " edge cut: %" PetscInt_FMT "\n", part->edgeCut)); 12663a3b9bcSJacob Faibussowitsch PetscCall(PetscViewerASCIIPrintf(v, " balance: %.2g\n", (double)part->balance)); 1279566063dSJacob Faibussowitsch PetscCall(PetscViewerASCIIPrintf(v, " use vertex weights: %d\n", part->usevwgt)); 128abe9303eSLisandro Dalcin } 129dbbe0bcdSBarry Smith PetscTryTypeMethod(part, view, v); 1303ba16761SJacob Faibussowitsch PetscFunctionReturn(PETSC_SUCCESS); 131abe9303eSLisandro Dalcin } 132abe9303eSLisandro Dalcin 133d71ae5a4SJacob Faibussowitsch static PetscErrorCode PetscPartitionerGetDefaultType(MPI_Comm comm, const char **defaultType) 134d71ae5a4SJacob Faibussowitsch { 135abe9303eSLisandro Dalcin PetscMPIInt size; 136abe9303eSLisandro Dalcin 137abe9303eSLisandro Dalcin PetscFunctionBegin; 1389566063dSJacob Faibussowitsch PetscCallMPI(MPI_Comm_size(comm, &size)); 139abe9303eSLisandro Dalcin if (size == 1) { 140abe9303eSLisandro Dalcin *defaultType = PETSCPARTITIONERSIMPLE; 141abe9303eSLisandro Dalcin } else { 142abe9303eSLisandro Dalcin #if defined(PETSC_HAVE_PARMETIS) 143abe9303eSLisandro Dalcin *defaultType = PETSCPARTITIONERPARMETIS; 144abe9303eSLisandro Dalcin #elif defined(PETSC_HAVE_PTSCOTCH) 145abe9303eSLisandro Dalcin *defaultType = PETSCPARTITIONERPTSCOTCH; 146abe9303eSLisandro Dalcin #elif defined(PETSC_HAVE_CHACO) 147abe9303eSLisandro Dalcin *defaultType = PETSCPARTITIONERCHACO; 148abe9303eSLisandro Dalcin #else 149abe9303eSLisandro Dalcin *defaultType = PETSCPARTITIONERSIMPLE; 150abe9303eSLisandro Dalcin #endif 151abe9303eSLisandro Dalcin } 1523ba16761SJacob Faibussowitsch PetscFunctionReturn(PETSC_SUCCESS); 153abe9303eSLisandro Dalcin } 154abe9303eSLisandro Dalcin 155abe9303eSLisandro Dalcin /*@ 15620f4b53cSBarry Smith PetscPartitionerSetFromOptions - sets parameters in a `PetscPartitioner` from the options database 157abe9303eSLisandro Dalcin 15820f4b53cSBarry Smith Collective 159abe9303eSLisandro Dalcin 160abe9303eSLisandro Dalcin Input Parameter: 16120f4b53cSBarry Smith . part - the `PetscPartitioner` object to set options for 162abe9303eSLisandro Dalcin 163abe9303eSLisandro Dalcin Options Database Keys: 16420f4b53cSBarry Smith + -petscpartitioner_type <type> - Sets the `PetscPartitioner` type; use -help for a list of available types 165abe9303eSLisandro Dalcin . -petscpartitioner_use_vertex_weights - Uses weights associated with the graph vertices 16620f4b53cSBarry Smith - -petscpartitioner_view_graph - View the graph each time PetscPartitionerPartition is called. Viewer can be customized, see `PetscOptionsGetViewer()` 167abe9303eSLisandro Dalcin 168abe9303eSLisandro Dalcin Level: developer 169abe9303eSLisandro Dalcin 170db781477SPatrick Sanan .seealso: `PetscPartitionerView()`, `PetscPartitionerSetType()`, `PetscPartitionerPartition()` 171abe9303eSLisandro Dalcin @*/ 172d71ae5a4SJacob Faibussowitsch PetscErrorCode PetscPartitionerSetFromOptions(PetscPartitioner part) 173d71ae5a4SJacob Faibussowitsch { 174d7cc930eSLisandro Dalcin const char *currentType = NULL; 175abe9303eSLisandro Dalcin char name[256]; 176abe9303eSLisandro Dalcin PetscBool flg; 177abe9303eSLisandro Dalcin 178abe9303eSLisandro Dalcin PetscFunctionBegin; 179abe9303eSLisandro Dalcin PetscValidHeaderSpecific(part, PETSCPARTITIONER_CLASSID, 1); 180d0609cedSBarry Smith PetscObjectOptionsBegin((PetscObject)part); 1819566063dSJacob Faibussowitsch PetscCall(PetscPartitionerGetType(part, ¤tType)); 1829566063dSJacob Faibussowitsch PetscCall(PetscOptionsFList("-petscpartitioner_type", "Graph partitioner", "PetscPartitionerSetType", PetscPartitionerList, currentType, name, sizeof(name), &flg)); 1831baa6e33SBarry Smith if (flg) PetscCall(PetscPartitionerSetType(part, name)); 1849566063dSJacob Faibussowitsch PetscCall(PetscOptionsBool("-petscpartitioner_use_vertex_weights", "Use vertex weights", "", part->usevwgt, &part->usevwgt, NULL)); 185dbbe0bcdSBarry Smith PetscTryTypeMethod(part, setfromoptions, PetscOptionsObject); 1869566063dSJacob Faibussowitsch PetscCall(PetscViewerDestroy(&part->viewer)); 1879566063dSJacob Faibussowitsch PetscCall(PetscViewerDestroy(&part->viewerGraph)); 1889566063dSJacob Faibussowitsch PetscCall(PetscOptionsGetViewer(((PetscObject)part)->comm, ((PetscObject)part)->options, ((PetscObject)part)->prefix, "-petscpartitioner_view", &part->viewer, NULL, NULL)); 1899566063dSJacob Faibussowitsch PetscCall(PetscOptionsGetViewer(((PetscObject)part)->comm, ((PetscObject)part)->options, ((PetscObject)part)->prefix, "-petscpartitioner_view_graph", &part->viewerGraph, NULL, &part->viewGraph)); 190abe9303eSLisandro Dalcin /* process any options handlers added with PetscObjectAddOptionsHandler() */ 191dbbe0bcdSBarry Smith PetscCall(PetscObjectProcessOptionsHandlers((PetscObject)part, PetscOptionsObject)); 192d0609cedSBarry Smith PetscOptionsEnd(); 1933ba16761SJacob Faibussowitsch PetscFunctionReturn(PETSC_SUCCESS); 194abe9303eSLisandro Dalcin } 195abe9303eSLisandro Dalcin 196abe9303eSLisandro Dalcin /*@ 19720f4b53cSBarry Smith PetscPartitionerSetUp - Construct data structures for the `PetscPartitioner` 198abe9303eSLisandro Dalcin 19920f4b53cSBarry Smith Collective 200abe9303eSLisandro Dalcin 201abe9303eSLisandro Dalcin Input Parameter: 20220f4b53cSBarry Smith . part - the `PetscPartitioner` object to setup 203abe9303eSLisandro Dalcin 204abe9303eSLisandro Dalcin Level: developer 205abe9303eSLisandro Dalcin 206db781477SPatrick Sanan .seealso: `PetscPartitionerView()`, `PetscPartitionerDestroy()` 207abe9303eSLisandro Dalcin @*/ 208d71ae5a4SJacob Faibussowitsch PetscErrorCode PetscPartitionerSetUp(PetscPartitioner part) 209d71ae5a4SJacob Faibussowitsch { 210abe9303eSLisandro Dalcin PetscFunctionBegin; 211abe9303eSLisandro Dalcin PetscValidHeaderSpecific(part, PETSCPARTITIONER_CLASSID, 1); 212dbbe0bcdSBarry Smith PetscTryTypeMethod(part, setup); 2133ba16761SJacob Faibussowitsch PetscFunctionReturn(PETSC_SUCCESS); 214abe9303eSLisandro Dalcin } 215abe9303eSLisandro Dalcin 216abe9303eSLisandro Dalcin /*@ 21720f4b53cSBarry Smith PetscPartitionerReset - Resets data structures for the `PetscPartitioner` 218abe9303eSLisandro Dalcin 21920f4b53cSBarry Smith Collective 220abe9303eSLisandro Dalcin 221abe9303eSLisandro Dalcin Input Parameter: 22220f4b53cSBarry Smith . part - the `PetscPartitioner` object to reset 223abe9303eSLisandro Dalcin 224abe9303eSLisandro Dalcin Level: developer 225abe9303eSLisandro Dalcin 226db781477SPatrick Sanan .seealso: `PetscPartitionerSetUp()`, `PetscPartitionerDestroy()` 227abe9303eSLisandro Dalcin @*/ 228d71ae5a4SJacob Faibussowitsch PetscErrorCode PetscPartitionerReset(PetscPartitioner part) 229d71ae5a4SJacob Faibussowitsch { 230abe9303eSLisandro Dalcin PetscFunctionBegin; 231abe9303eSLisandro Dalcin PetscValidHeaderSpecific(part, PETSCPARTITIONER_CLASSID, 1); 232dbbe0bcdSBarry Smith PetscTryTypeMethod(part, reset); 2333ba16761SJacob Faibussowitsch PetscFunctionReturn(PETSC_SUCCESS); 234abe9303eSLisandro Dalcin } 235abe9303eSLisandro Dalcin 236abe9303eSLisandro Dalcin /*@ 23720f4b53cSBarry Smith PetscPartitionerDestroy - Destroys a `PetscPartitioner` object 238abe9303eSLisandro Dalcin 23920f4b53cSBarry Smith Collective 240abe9303eSLisandro Dalcin 241abe9303eSLisandro Dalcin Input Parameter: 24220f4b53cSBarry Smith . part - the `PetscPartitioner` object to destroy 243abe9303eSLisandro Dalcin 244abe9303eSLisandro Dalcin Level: developer 245abe9303eSLisandro Dalcin 246db781477SPatrick Sanan .seealso: `PetscPartitionerView()` 247abe9303eSLisandro Dalcin @*/ 248d71ae5a4SJacob Faibussowitsch PetscErrorCode PetscPartitionerDestroy(PetscPartitioner *part) 249d71ae5a4SJacob Faibussowitsch { 250abe9303eSLisandro Dalcin PetscFunctionBegin; 2513ba16761SJacob Faibussowitsch if (!*part) PetscFunctionReturn(PETSC_SUCCESS); 252abe9303eSLisandro Dalcin PetscValidHeaderSpecific((*part), PETSCPARTITIONER_CLASSID, 1); 253abe9303eSLisandro Dalcin 2549371c9d4SSatish Balay if (--((PetscObject)(*part))->refct > 0) { 2559371c9d4SSatish Balay *part = NULL; 2563ba16761SJacob Faibussowitsch PetscFunctionReturn(PETSC_SUCCESS); 2579371c9d4SSatish Balay } 258abe9303eSLisandro Dalcin ((PetscObject)(*part))->refct = 0; 259abe9303eSLisandro Dalcin 2609566063dSJacob Faibussowitsch PetscCall(PetscPartitionerReset(*part)); 261abe9303eSLisandro Dalcin 2629566063dSJacob Faibussowitsch PetscCall(PetscViewerDestroy(&(*part)->viewer)); 2639566063dSJacob Faibussowitsch PetscCall(PetscViewerDestroy(&(*part)->viewerGraph)); 264dbbe0bcdSBarry Smith PetscTryTypeMethod((*part), destroy); 2659566063dSJacob Faibussowitsch PetscCall(PetscHeaderDestroy(part)); 2663ba16761SJacob Faibussowitsch PetscFunctionReturn(PETSC_SUCCESS); 267abe9303eSLisandro Dalcin } 268abe9303eSLisandro Dalcin 269abe9303eSLisandro Dalcin /*@ 270abe9303eSLisandro Dalcin PetscPartitionerPartition - Partition a graph 271abe9303eSLisandro Dalcin 27220f4b53cSBarry Smith Collective 273abe9303eSLisandro Dalcin 274abe9303eSLisandro Dalcin Input Parameters: 27520f4b53cSBarry Smith + part - The `PetscPartitioner` 276abe9303eSLisandro Dalcin . nparts - Number of partitions 277abe9303eSLisandro Dalcin . numVertices - Number of vertices in the local part of the graph 278abe9303eSLisandro Dalcin . start - row pointers for the local part of the graph (CSR style) 279abe9303eSLisandro Dalcin . adjacency - adjacency list (CSR style) 280abe9303eSLisandro Dalcin . vertexSection - PetscSection describing the absolute weight of each local vertex (can be NULL) 281abe9303eSLisandro Dalcin - targetSection - PetscSection describing the absolute weight of each partition (can be NULL) 282abe9303eSLisandro Dalcin 283abe9303eSLisandro Dalcin Output Parameters: 28420f4b53cSBarry Smith + partSection - The `PetscSection` giving the division of points by partition 285abe9303eSLisandro Dalcin - partition - The list of points by partition 286abe9303eSLisandro Dalcin 28720f4b53cSBarry Smith Options Databasen Keys: 288abe9303eSLisandro Dalcin + -petscpartitioner_view - View the partitioner information 289abe9303eSLisandro Dalcin - -petscpartitioner_view_graph - View the graph we are partitioning 290abe9303eSLisandro Dalcin 29120f4b53cSBarry Smith Level: developer 29220f4b53cSBarry Smith 293abe9303eSLisandro Dalcin Notes: 294abe9303eSLisandro 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. 295abe9303eSLisandro 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. 296abe9303eSLisandro Dalcin 297*a4e35b19SJacob Faibussowitsch .seealso: `PetscPartitionerCreate()`, `PetscPartitionerSetType()`, `PetscSectionCreate()`, `PetscSectionSetChart()`, `PetscSectionSetDof()` 298abe9303eSLisandro Dalcin @*/ 299d71ae5a4SJacob Faibussowitsch PetscErrorCode PetscPartitionerPartition(PetscPartitioner part, PetscInt nparts, PetscInt numVertices, PetscInt start[], PetscInt adjacency[], PetscSection vertexSection, PetscSection targetSection, PetscSection partSection, IS *partition) 300d71ae5a4SJacob Faibussowitsch { 301abe9303eSLisandro Dalcin PetscFunctionBegin; 302abe9303eSLisandro Dalcin PetscValidHeaderSpecific(part, PETSCPARTITIONER_CLASSID, 1); 303abe9303eSLisandro Dalcin PetscValidLogicalCollectiveInt(part, nparts, 2); 30408401ef6SPierre Jolivet PetscCheck(nparts > 0, PetscObjectComm((PetscObject)part), PETSC_ERR_ARG_OUTOFRANGE, "Number of parts must be positive"); 30508401ef6SPierre Jolivet PetscCheck(numVertices >= 0, PETSC_COMM_SELF, PETSC_ERR_ARG_OUTOFRANGE, "Number of vertices must be non-negative"); 306abe9303eSLisandro Dalcin if (numVertices && !part->noGraph) { 3074f572ea9SToby Isaac PetscAssertPointer(start, 4); 3084f572ea9SToby Isaac PetscAssertPointer(start + numVertices, 4); 3094f572ea9SToby Isaac if (start[numVertices]) PetscAssertPointer(adjacency, 5); 310abe9303eSLisandro Dalcin } 311abe9303eSLisandro Dalcin if (vertexSection) { 312abe9303eSLisandro Dalcin PetscInt s, e; 313abe9303eSLisandro Dalcin 314abe9303eSLisandro Dalcin PetscValidHeaderSpecific(vertexSection, PETSC_SECTION_CLASSID, 6); 3159566063dSJacob Faibussowitsch PetscCall(PetscSectionGetChart(vertexSection, &s, &e)); 3161dca8a05SBarry Smith PetscCheck(s <= 0 && e >= numVertices, PETSC_COMM_SELF, PETSC_ERR_ARG_OUTOFRANGE, "Invalid vertexSection chart [%" PetscInt_FMT ",%" PetscInt_FMT ")", s, e); 317abe9303eSLisandro Dalcin } 318abe9303eSLisandro Dalcin if (targetSection) { 319abe9303eSLisandro Dalcin PetscInt s, e; 320abe9303eSLisandro Dalcin 321abe9303eSLisandro Dalcin PetscValidHeaderSpecific(targetSection, PETSC_SECTION_CLASSID, 7); 3229566063dSJacob Faibussowitsch PetscCall(PetscSectionGetChart(targetSection, &s, &e)); 3231dca8a05SBarry Smith PetscCheck(s <= 0 && e >= nparts, PETSC_COMM_SELF, PETSC_ERR_ARG_OUTOFRANGE, "Invalid targetSection chart [%" PetscInt_FMT ",%" PetscInt_FMT ")", s, e); 324abe9303eSLisandro Dalcin } 325abe9303eSLisandro Dalcin PetscValidHeaderSpecific(partSection, PETSC_SECTION_CLASSID, 8); 3264f572ea9SToby Isaac PetscAssertPointer(partition, 9); 327abe9303eSLisandro Dalcin 3289566063dSJacob Faibussowitsch PetscCall(PetscSectionReset(partSection)); 3299566063dSJacob Faibussowitsch PetscCall(PetscSectionSetChart(partSection, 0, nparts)); 330abe9303eSLisandro Dalcin if (nparts == 1) { /* quick */ 3319566063dSJacob Faibussowitsch PetscCall(PetscSectionSetDof(partSection, 0, numVertices)); 3329566063dSJacob Faibussowitsch PetscCall(ISCreateStride(PetscObjectComm((PetscObject)part), numVertices, 0, 1, partition)); 333dbbe0bcdSBarry Smith } else PetscUseTypeMethod(part, partition, nparts, numVertices, start, adjacency, vertexSection, targetSection, partSection, partition); 3349566063dSJacob Faibussowitsch PetscCall(PetscSectionSetUp(partSection)); 335abe9303eSLisandro Dalcin if (part->viewerGraph) { 336abe9303eSLisandro Dalcin PetscViewer viewer = part->viewerGraph; 337abe9303eSLisandro Dalcin PetscBool isascii; 338abe9303eSLisandro Dalcin PetscInt v, i; 339abe9303eSLisandro Dalcin PetscMPIInt rank; 340abe9303eSLisandro Dalcin 3419566063dSJacob Faibussowitsch PetscCallMPI(MPI_Comm_rank(PetscObjectComm((PetscObject)viewer), &rank)); 3429566063dSJacob Faibussowitsch PetscCall(PetscObjectTypeCompare((PetscObject)viewer, PETSCVIEWERASCII, &isascii)); 343abe9303eSLisandro Dalcin if (isascii) { 3449566063dSJacob Faibussowitsch PetscCall(PetscViewerASCIIPushSynchronized(viewer)); 34563a3b9bcSJacob Faibussowitsch PetscCall(PetscViewerASCIISynchronizedPrintf(viewer, "[%d]Nv: %" PetscInt_FMT "\n", rank, numVertices)); 346abe9303eSLisandro Dalcin for (v = 0; v < numVertices; ++v) { 347abe9303eSLisandro Dalcin const PetscInt s = start[v]; 348abe9303eSLisandro Dalcin const PetscInt e = start[v + 1]; 349abe9303eSLisandro Dalcin 3509566063dSJacob Faibussowitsch PetscCall(PetscViewerASCIISynchronizedPrintf(viewer, "[%d] ", rank)); 35163a3b9bcSJacob Faibussowitsch for (i = s; i < e; ++i) PetscCall(PetscViewerASCIISynchronizedPrintf(viewer, "%" PetscInt_FMT " ", adjacency[i])); 35263a3b9bcSJacob Faibussowitsch PetscCall(PetscViewerASCIISynchronizedPrintf(viewer, "[%" PetscInt_FMT "-%" PetscInt_FMT ")\n", s, e)); 353abe9303eSLisandro Dalcin } 3549566063dSJacob Faibussowitsch PetscCall(PetscViewerFlush(viewer)); 3559566063dSJacob Faibussowitsch PetscCall(PetscViewerASCIIPopSynchronized(viewer)); 356abe9303eSLisandro Dalcin } 357abe9303eSLisandro Dalcin } 3581baa6e33SBarry Smith if (part->viewer) PetscCall(PetscPartitionerView(part, part->viewer)); 3593ba16761SJacob Faibussowitsch PetscFunctionReturn(PETSC_SUCCESS); 360abe9303eSLisandro Dalcin } 361abe9303eSLisandro Dalcin 362abe9303eSLisandro Dalcin /*@ 36320f4b53cSBarry Smith PetscPartitionerCreate - Creates an empty `PetscPartitioner` object. The type can then be set with `PetscPartitionerSetType()`. 364abe9303eSLisandro Dalcin 365abe9303eSLisandro Dalcin Collective 366abe9303eSLisandro Dalcin 367abe9303eSLisandro Dalcin Input Parameter: 36820f4b53cSBarry Smith . comm - The communicator for the `PetscPartitioner` object 369abe9303eSLisandro Dalcin 370abe9303eSLisandro Dalcin Output Parameter: 37120f4b53cSBarry Smith . part - The `PetscPartitioner` object 372abe9303eSLisandro Dalcin 373abe9303eSLisandro Dalcin Level: beginner 374abe9303eSLisandro Dalcin 375db781477SPatrick Sanan .seealso: `PetscPartitionerSetType()`, `PetscPartitionerDestroy()` 376abe9303eSLisandro Dalcin @*/ 377d71ae5a4SJacob Faibussowitsch PetscErrorCode PetscPartitionerCreate(MPI_Comm comm, PetscPartitioner *part) 378d71ae5a4SJacob Faibussowitsch { 379abe9303eSLisandro Dalcin PetscPartitioner p; 380abe9303eSLisandro Dalcin const char *partitionerType = NULL; 381abe9303eSLisandro Dalcin 382abe9303eSLisandro Dalcin PetscFunctionBegin; 3834f572ea9SToby Isaac PetscAssertPointer(part, 2); 384abe9303eSLisandro Dalcin *part = NULL; 3859566063dSJacob Faibussowitsch PetscCall(PetscPartitionerInitializePackage()); 386abe9303eSLisandro Dalcin 3879566063dSJacob Faibussowitsch PetscCall(PetscHeaderCreate(p, PETSCPARTITIONER_CLASSID, "PetscPartitioner", "Graph Partitioner", "PetscPartitioner", comm, PetscPartitionerDestroy, PetscPartitionerView)); 3889566063dSJacob Faibussowitsch PetscCall(PetscPartitionerGetDefaultType(comm, &partitionerType)); 3899566063dSJacob Faibussowitsch PetscCall(PetscPartitionerSetType(p, partitionerType)); 390abe9303eSLisandro Dalcin 391abe9303eSLisandro Dalcin p->edgeCut = 0; 392abe9303eSLisandro Dalcin p->balance = 0.0; 393abe9303eSLisandro Dalcin p->usevwgt = PETSC_TRUE; 394abe9303eSLisandro Dalcin 395abe9303eSLisandro Dalcin *part = p; 3963ba16761SJacob Faibussowitsch PetscFunctionReturn(PETSC_SUCCESS); 397abe9303eSLisandro Dalcin } 398