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 15*6e0dc72eSMatthew G. Knepley Note: 16*6e0dc72eSMatthew G. Knepley $ PETSCPARTITIONERCHACO - The Chaco partitioner (--download-chaco) 17*6e0dc72eSMatthew G. Knepley $ PETSCPARTITIONERPARMETIS - The ParMetis partitioner (--download-parmetis) 18*6e0dc72eSMatthew G. Knepley $ PETSCPARTITIONERSHELL - A shell partitioner implemented by the user 19*6e0dc72eSMatthew G. Knepley $ PETSCPARTITIONERSIMPLE - A simple partitioner that divides cells into equal, contiguous chunks 20*6e0dc72eSMatthew G. Knepley $ PETSCPARTITIONERGATHER - Gathers all cells onto process 0 21*6e0dc72eSMatthew 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 PetscErrorCode ierr; 31abe9303eSLisandro Dalcin 32abe9303eSLisandro Dalcin PetscFunctionBegin; 33abe9303eSLisandro Dalcin PetscValidHeaderSpecific(part, PETSCPARTITIONER_CLASSID, 1); 34abe9303eSLisandro Dalcin ierr = PetscObjectTypeCompare((PetscObject) part, name, &match);CHKERRQ(ierr); 35abe9303eSLisandro Dalcin if (match) PetscFunctionReturn(0); 36abe9303eSLisandro Dalcin 37abe9303eSLisandro Dalcin ierr = PetscPartitionerRegisterAll();CHKERRQ(ierr); 38abe9303eSLisandro Dalcin ierr = PetscFunctionListFind(PetscPartitionerList, name, &r);CHKERRQ(ierr); 392c71b3e2SJacob Faibussowitsch PetscCheckFalse(!r,PetscObjectComm((PetscObject) part), PETSC_ERR_ARG_UNKNOWN_TYPE, "Unknown PetscPartitioner type: %s", name); 40abe9303eSLisandro Dalcin 41abe9303eSLisandro Dalcin if (part->ops->destroy) { 42abe9303eSLisandro Dalcin ierr = (*part->ops->destroy)(part);CHKERRQ(ierr); 43abe9303eSLisandro Dalcin } 44abe9303eSLisandro Dalcin part->noGraph = PETSC_FALSE; 45abe9303eSLisandro Dalcin ierr = PetscMemzero(part->ops, sizeof(*part->ops));CHKERRQ(ierr); 46abe9303eSLisandro Dalcin ierr = PetscObjectChangeTypeName((PetscObject) part, name);CHKERRQ(ierr); 47abe9303eSLisandro Dalcin ierr = (*r)(part);CHKERRQ(ierr); 48abe9303eSLisandro Dalcin PetscFunctionReturn(0); 49abe9303eSLisandro Dalcin } 50abe9303eSLisandro Dalcin 51abe9303eSLisandro Dalcin /*@C 52abe9303eSLisandro Dalcin PetscPartitionerGetType - Gets the PetscPartitioner type name (as a string) from the object. 53abe9303eSLisandro Dalcin 54abe9303eSLisandro Dalcin Not Collective 55abe9303eSLisandro Dalcin 56abe9303eSLisandro Dalcin Input Parameter: 57abe9303eSLisandro Dalcin . part - The PetscPartitioner 58abe9303eSLisandro Dalcin 59abe9303eSLisandro Dalcin Output Parameter: 60abe9303eSLisandro Dalcin . name - The PetscPartitioner type name 61abe9303eSLisandro Dalcin 62abe9303eSLisandro Dalcin Level: intermediate 63abe9303eSLisandro Dalcin 64abe9303eSLisandro Dalcin .seealso: PetscPartitionerSetType(), PetscPartitionerCreate() 65abe9303eSLisandro Dalcin @*/ 66abe9303eSLisandro Dalcin PetscErrorCode PetscPartitionerGetType(PetscPartitioner part, PetscPartitionerType *name) 67abe9303eSLisandro Dalcin { 68abe9303eSLisandro Dalcin PetscFunctionBegin; 69abe9303eSLisandro Dalcin PetscValidHeaderSpecific(part, PETSCPARTITIONER_CLASSID, 1); 70abe9303eSLisandro Dalcin PetscValidPointer(name, 2); 71abe9303eSLisandro Dalcin *name = ((PetscObject) part)->type_name; 72abe9303eSLisandro Dalcin PetscFunctionReturn(0); 73abe9303eSLisandro Dalcin } 74abe9303eSLisandro Dalcin 75abe9303eSLisandro Dalcin /*@C 76abe9303eSLisandro Dalcin PetscPartitionerViewFromOptions - View from Options 77abe9303eSLisandro Dalcin 78abe9303eSLisandro Dalcin Collective on PetscPartitioner 79abe9303eSLisandro Dalcin 80abe9303eSLisandro Dalcin Input Parameters: 81abe9303eSLisandro Dalcin + A - the PetscPartitioner object 82abe9303eSLisandro Dalcin . obj - Optional object 83abe9303eSLisandro Dalcin - name - command line option 84abe9303eSLisandro Dalcin 85abe9303eSLisandro Dalcin Level: intermediate 86abe9303eSLisandro Dalcin .seealso: PetscPartitionerView(), PetscObjectViewFromOptions() 87abe9303eSLisandro Dalcin @*/ 88abe9303eSLisandro Dalcin PetscErrorCode PetscPartitionerViewFromOptions(PetscPartitioner A,PetscObject obj,const char name[]) 89abe9303eSLisandro Dalcin { 90abe9303eSLisandro Dalcin PetscErrorCode ierr; 91abe9303eSLisandro Dalcin 92abe9303eSLisandro Dalcin PetscFunctionBegin; 93abe9303eSLisandro Dalcin PetscValidHeaderSpecific(A,PETSCPARTITIONER_CLASSID,1); 94abe9303eSLisandro Dalcin ierr = PetscObjectViewFromOptions((PetscObject)A,obj,name);CHKERRQ(ierr); 95abe9303eSLisandro Dalcin PetscFunctionReturn(0); 96abe9303eSLisandro Dalcin } 97abe9303eSLisandro Dalcin 98abe9303eSLisandro Dalcin /*@ 99abe9303eSLisandro Dalcin PetscPartitionerView - Views a PetscPartitioner 100abe9303eSLisandro Dalcin 101abe9303eSLisandro Dalcin Collective on PetscPartitioner 102abe9303eSLisandro Dalcin 103d8d19677SJose E. Roman Input Parameters: 104abe9303eSLisandro Dalcin + part - the PetscPartitioner object to view 105abe9303eSLisandro Dalcin - v - the viewer 106abe9303eSLisandro Dalcin 107abe9303eSLisandro Dalcin Level: developer 108abe9303eSLisandro Dalcin 109abe9303eSLisandro Dalcin .seealso: PetscPartitionerDestroy() 110abe9303eSLisandro Dalcin @*/ 111abe9303eSLisandro Dalcin PetscErrorCode PetscPartitionerView(PetscPartitioner part, PetscViewer v) 112abe9303eSLisandro Dalcin { 113abe9303eSLisandro Dalcin PetscMPIInt size; 114abe9303eSLisandro Dalcin PetscBool isascii; 115abe9303eSLisandro Dalcin PetscErrorCode ierr; 116abe9303eSLisandro Dalcin 117abe9303eSLisandro Dalcin PetscFunctionBegin; 118abe9303eSLisandro Dalcin PetscValidHeaderSpecific(part, PETSCPARTITIONER_CLASSID, 1); 119abe9303eSLisandro Dalcin if (!v) {ierr = PetscViewerASCIIGetStdout(PetscObjectComm((PetscObject) part), &v);CHKERRQ(ierr);} 120abe9303eSLisandro Dalcin ierr = PetscObjectTypeCompare((PetscObject) v, PETSCVIEWERASCII, &isascii);CHKERRQ(ierr); 121abe9303eSLisandro Dalcin if (isascii) { 122ffc4695bSBarry Smith ierr = MPI_Comm_size(PetscObjectComm((PetscObject) part), &size);CHKERRMPI(ierr); 123abe9303eSLisandro Dalcin ierr = PetscViewerASCIIPrintf(v, "Graph Partitioner: %d MPI Process%s\n", size, size > 1 ? "es" : "");CHKERRQ(ierr); 124abe9303eSLisandro Dalcin ierr = PetscViewerASCIIPrintf(v, " type: %s\n", ((PetscObject)part)->type_name);CHKERRQ(ierr); 125abe9303eSLisandro Dalcin ierr = PetscViewerASCIIPrintf(v, " edge cut: %D\n", part->edgeCut);CHKERRQ(ierr); 126abe9303eSLisandro Dalcin ierr = PetscViewerASCIIPrintf(v, " balance: %.2g\n", part->balance);CHKERRQ(ierr); 127abe9303eSLisandro Dalcin ierr = PetscViewerASCIIPrintf(v, " use vertex weights: %d\n", part->usevwgt);CHKERRQ(ierr); 128abe9303eSLisandro Dalcin } 129abe9303eSLisandro Dalcin if (part->ops->view) {ierr = (*part->ops->view)(part, v);CHKERRQ(ierr);} 130abe9303eSLisandro Dalcin PetscFunctionReturn(0); 131abe9303eSLisandro Dalcin } 132abe9303eSLisandro Dalcin 133d7cc930eSLisandro Dalcin static PetscErrorCode PetscPartitionerGetDefaultType(MPI_Comm comm, const char **defaultType) 134abe9303eSLisandro Dalcin { 135abe9303eSLisandro Dalcin PetscMPIInt size; 136abe9303eSLisandro Dalcin PetscErrorCode ierr; 137abe9303eSLisandro Dalcin 138abe9303eSLisandro Dalcin PetscFunctionBegin; 139ffc4695bSBarry Smith ierr = MPI_Comm_size(comm, &size);CHKERRMPI(ierr); 140abe9303eSLisandro Dalcin if (size == 1) { 141abe9303eSLisandro Dalcin *defaultType = PETSCPARTITIONERSIMPLE; 142abe9303eSLisandro Dalcin } else { 143abe9303eSLisandro Dalcin #if defined(PETSC_HAVE_PARMETIS) 144abe9303eSLisandro Dalcin *defaultType = PETSCPARTITIONERPARMETIS; 145abe9303eSLisandro Dalcin #elif defined(PETSC_HAVE_PTSCOTCH) 146abe9303eSLisandro Dalcin *defaultType = PETSCPARTITIONERPTSCOTCH; 147abe9303eSLisandro Dalcin #elif defined(PETSC_HAVE_CHACO) 148abe9303eSLisandro Dalcin *defaultType = PETSCPARTITIONERCHACO; 149abe9303eSLisandro Dalcin #else 150abe9303eSLisandro Dalcin *defaultType = PETSCPARTITIONERSIMPLE; 151abe9303eSLisandro Dalcin #endif 152abe9303eSLisandro Dalcin } 153abe9303eSLisandro Dalcin PetscFunctionReturn(0); 154abe9303eSLisandro Dalcin } 155abe9303eSLisandro Dalcin 156abe9303eSLisandro Dalcin /*@ 157abe9303eSLisandro Dalcin PetscPartitionerSetFromOptions - sets parameters in a PetscPartitioner from the options database 158abe9303eSLisandro Dalcin 159abe9303eSLisandro Dalcin Collective on PetscPartitioner 160abe9303eSLisandro Dalcin 161abe9303eSLisandro Dalcin Input Parameter: 162abe9303eSLisandro Dalcin . part - the PetscPartitioner object to set options for 163abe9303eSLisandro Dalcin 164abe9303eSLisandro Dalcin Options Database Keys: 165abe9303eSLisandro Dalcin + -petscpartitioner_type <type> - Sets the PetscPartitioner type; use -help for a list of available types 166abe9303eSLisandro Dalcin . -petscpartitioner_use_vertex_weights - Uses weights associated with the graph vertices 167abe9303eSLisandro Dalcin - -petscpartitioner_view_graph - View the graph each time PetscPartitionerPartition is called. Viewer can be customized, see PetscOptionsGetViewer() 168abe9303eSLisandro Dalcin 169abe9303eSLisandro Dalcin Level: developer 170abe9303eSLisandro Dalcin 171abe9303eSLisandro Dalcin .seealso: PetscPartitionerView(), PetscPartitionerSetType(), PetscPartitionerPartition() 172abe9303eSLisandro Dalcin @*/ 173abe9303eSLisandro Dalcin PetscErrorCode PetscPartitionerSetFromOptions(PetscPartitioner part) 174abe9303eSLisandro Dalcin { 175d7cc930eSLisandro Dalcin const char *currentType = NULL; 176abe9303eSLisandro Dalcin char name[256]; 177abe9303eSLisandro Dalcin PetscBool flg; 178abe9303eSLisandro Dalcin PetscErrorCode ierr; 179abe9303eSLisandro Dalcin 180abe9303eSLisandro Dalcin PetscFunctionBegin; 181abe9303eSLisandro Dalcin PetscValidHeaderSpecific(part, PETSCPARTITIONER_CLASSID, 1); 182abe9303eSLisandro Dalcin ierr = PetscObjectOptionsBegin((PetscObject) part);CHKERRQ(ierr); 183d7cc930eSLisandro Dalcin ierr = PetscPartitionerGetType(part, ¤tType);CHKERRQ(ierr); 184d7cc930eSLisandro Dalcin ierr = PetscOptionsFList("-petscpartitioner_type", "Graph partitioner", "PetscPartitionerSetType", PetscPartitionerList, currentType, name, sizeof(name), &flg);CHKERRQ(ierr); 185abe9303eSLisandro Dalcin if (flg) { 186abe9303eSLisandro Dalcin ierr = PetscPartitionerSetType(part, name);CHKERRQ(ierr); 187abe9303eSLisandro Dalcin } 188abe9303eSLisandro Dalcin ierr = PetscOptionsBool("-petscpartitioner_use_vertex_weights","Use vertex weights","",part->usevwgt,&part->usevwgt,NULL);CHKERRQ(ierr); 189abe9303eSLisandro Dalcin if (part->ops->setfromoptions) { 190abe9303eSLisandro Dalcin ierr = (*part->ops->setfromoptions)(PetscOptionsObject,part);CHKERRQ(ierr); 191abe9303eSLisandro Dalcin } 192abe9303eSLisandro Dalcin ierr = PetscViewerDestroy(&part->viewer);CHKERRQ(ierr); 193abe9303eSLisandro Dalcin ierr = PetscViewerDestroy(&part->viewerGraph);CHKERRQ(ierr); 194abe9303eSLisandro Dalcin ierr = PetscOptionsGetViewer(((PetscObject) part)->comm, ((PetscObject) part)->options, ((PetscObject) part)->prefix, "-petscpartitioner_view", &part->viewer, NULL, NULL);CHKERRQ(ierr); 195abe9303eSLisandro Dalcin ierr = PetscOptionsGetViewer(((PetscObject) part)->comm, ((PetscObject) part)->options, ((PetscObject) part)->prefix, "-petscpartitioner_view_graph", &part->viewerGraph, NULL, &part->viewGraph);CHKERRQ(ierr); 196abe9303eSLisandro Dalcin /* process any options handlers added with PetscObjectAddOptionsHandler() */ 197abe9303eSLisandro Dalcin ierr = PetscObjectProcessOptionsHandlers(PetscOptionsObject,(PetscObject) part);CHKERRQ(ierr); 198abe9303eSLisandro Dalcin ierr = PetscOptionsEnd();CHKERRQ(ierr); 199abe9303eSLisandro Dalcin PetscFunctionReturn(0); 200abe9303eSLisandro Dalcin } 201abe9303eSLisandro Dalcin 202abe9303eSLisandro Dalcin /*@ 203abe9303eSLisandro Dalcin PetscPartitionerSetUp - Construct data structures for the PetscPartitioner 204abe9303eSLisandro Dalcin 205abe9303eSLisandro Dalcin Collective on PetscPartitioner 206abe9303eSLisandro Dalcin 207abe9303eSLisandro Dalcin Input Parameter: 208abe9303eSLisandro Dalcin . part - the PetscPartitioner object to setup 209abe9303eSLisandro Dalcin 210abe9303eSLisandro Dalcin Level: developer 211abe9303eSLisandro Dalcin 212abe9303eSLisandro Dalcin .seealso: PetscPartitionerView(), PetscPartitionerDestroy() 213abe9303eSLisandro Dalcin @*/ 214abe9303eSLisandro Dalcin PetscErrorCode PetscPartitionerSetUp(PetscPartitioner part) 215abe9303eSLisandro Dalcin { 216abe9303eSLisandro Dalcin PetscErrorCode ierr; 217abe9303eSLisandro Dalcin 218abe9303eSLisandro Dalcin PetscFunctionBegin; 219abe9303eSLisandro Dalcin PetscValidHeaderSpecific(part, PETSCPARTITIONER_CLASSID, 1); 220abe9303eSLisandro Dalcin if (part->ops->setup) {ierr = (*part->ops->setup)(part);CHKERRQ(ierr);} 221abe9303eSLisandro Dalcin PetscFunctionReturn(0); 222abe9303eSLisandro Dalcin } 223abe9303eSLisandro Dalcin 224abe9303eSLisandro Dalcin /*@ 225abe9303eSLisandro Dalcin PetscPartitionerReset - Resets data structures for the PetscPartitioner 226abe9303eSLisandro Dalcin 227abe9303eSLisandro Dalcin Collective on PetscPartitioner 228abe9303eSLisandro Dalcin 229abe9303eSLisandro Dalcin Input Parameter: 230abe9303eSLisandro Dalcin . part - the PetscPartitioner object to reset 231abe9303eSLisandro Dalcin 232abe9303eSLisandro Dalcin Level: developer 233abe9303eSLisandro Dalcin 234abe9303eSLisandro Dalcin .seealso: PetscPartitionerSetUp(), PetscPartitionerDestroy() 235abe9303eSLisandro Dalcin @*/ 236abe9303eSLisandro Dalcin PetscErrorCode PetscPartitionerReset(PetscPartitioner part) 237abe9303eSLisandro Dalcin { 238abe9303eSLisandro Dalcin PetscErrorCode ierr; 239abe9303eSLisandro Dalcin 240abe9303eSLisandro Dalcin PetscFunctionBegin; 241abe9303eSLisandro Dalcin PetscValidHeaderSpecific(part, PETSCPARTITIONER_CLASSID, 1); 242abe9303eSLisandro Dalcin if (part->ops->reset) {ierr = (*part->ops->reset)(part);CHKERRQ(ierr);} 243abe9303eSLisandro Dalcin PetscFunctionReturn(0); 244abe9303eSLisandro Dalcin } 245abe9303eSLisandro Dalcin 246abe9303eSLisandro Dalcin /*@ 247abe9303eSLisandro Dalcin PetscPartitionerDestroy - Destroys a PetscPartitioner object 248abe9303eSLisandro Dalcin 249abe9303eSLisandro Dalcin Collective on PetscPartitioner 250abe9303eSLisandro Dalcin 251abe9303eSLisandro Dalcin Input Parameter: 252abe9303eSLisandro Dalcin . part - the PetscPartitioner object to destroy 253abe9303eSLisandro Dalcin 254abe9303eSLisandro Dalcin Level: developer 255abe9303eSLisandro Dalcin 256abe9303eSLisandro Dalcin .seealso: PetscPartitionerView() 257abe9303eSLisandro Dalcin @*/ 258abe9303eSLisandro Dalcin PetscErrorCode PetscPartitionerDestroy(PetscPartitioner *part) 259abe9303eSLisandro Dalcin { 260abe9303eSLisandro Dalcin PetscErrorCode ierr; 261abe9303eSLisandro Dalcin 262abe9303eSLisandro Dalcin PetscFunctionBegin; 263abe9303eSLisandro Dalcin if (!*part) PetscFunctionReturn(0); 264abe9303eSLisandro Dalcin PetscValidHeaderSpecific((*part), PETSCPARTITIONER_CLASSID, 1); 265abe9303eSLisandro Dalcin 266ea78f98cSLisandro Dalcin if (--((PetscObject)(*part))->refct > 0) {*part = NULL; PetscFunctionReturn(0);} 267abe9303eSLisandro Dalcin ((PetscObject) (*part))->refct = 0; 268abe9303eSLisandro Dalcin 269abe9303eSLisandro Dalcin ierr = PetscPartitionerReset(*part);CHKERRQ(ierr); 270abe9303eSLisandro Dalcin 271abe9303eSLisandro Dalcin ierr = PetscViewerDestroy(&(*part)->viewer);CHKERRQ(ierr); 272abe9303eSLisandro Dalcin ierr = PetscViewerDestroy(&(*part)->viewerGraph);CHKERRQ(ierr); 273abe9303eSLisandro Dalcin if ((*part)->ops->destroy) {ierr = (*(*part)->ops->destroy)(*part);CHKERRQ(ierr);} 274abe9303eSLisandro Dalcin ierr = PetscHeaderDestroy(part);CHKERRQ(ierr); 275abe9303eSLisandro Dalcin PetscFunctionReturn(0); 276abe9303eSLisandro Dalcin } 277abe9303eSLisandro Dalcin 278abe9303eSLisandro Dalcin /*@ 279abe9303eSLisandro Dalcin PetscPartitionerPartition - Partition a graph 280abe9303eSLisandro Dalcin 281abe9303eSLisandro Dalcin Collective on PetscPartitioner 282abe9303eSLisandro Dalcin 283abe9303eSLisandro Dalcin Input Parameters: 284abe9303eSLisandro Dalcin + part - The PetscPartitioner 285abe9303eSLisandro Dalcin . nparts - Number of partitions 286abe9303eSLisandro Dalcin . numVertices - Number of vertices in the local part of the graph 287abe9303eSLisandro Dalcin . start - row pointers for the local part of the graph (CSR style) 288abe9303eSLisandro Dalcin . adjacency - adjacency list (CSR style) 289abe9303eSLisandro Dalcin . vertexSection - PetscSection describing the absolute weight of each local vertex (can be NULL) 290abe9303eSLisandro Dalcin - targetSection - PetscSection describing the absolute weight of each partition (can be NULL) 291abe9303eSLisandro Dalcin 292abe9303eSLisandro Dalcin Output Parameters: 293abe9303eSLisandro Dalcin + partSection - The PetscSection giving the division of points by partition 294abe9303eSLisandro Dalcin - partition - The list of points by partition 295abe9303eSLisandro Dalcin 296abe9303eSLisandro Dalcin Options Database: 297abe9303eSLisandro Dalcin + -petscpartitioner_view - View the partitioner information 298abe9303eSLisandro Dalcin - -petscpartitioner_view_graph - View the graph we are partitioning 299abe9303eSLisandro Dalcin 300abe9303eSLisandro Dalcin Notes: 301abe9303eSLisandro 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. 302abe9303eSLisandro 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. 303abe9303eSLisandro Dalcin 304abe9303eSLisandro Dalcin Level: developer 305abe9303eSLisandro Dalcin 306*6e0dc72eSMatthew G. Knepley .seealso PetscPartitionerCreate(), PetscPartitionerSetType(), PetscSectionCreate(), PetscSectionSetChart(), PetscSectionSetDof() 307abe9303eSLisandro Dalcin @*/ 308abe9303eSLisandro Dalcin PetscErrorCode PetscPartitionerPartition(PetscPartitioner part, PetscInt nparts, PetscInt numVertices, PetscInt start[], PetscInt adjacency[], PetscSection vertexSection, PetscSection targetSection, PetscSection partSection, IS *partition) 309abe9303eSLisandro Dalcin { 310abe9303eSLisandro Dalcin PetscErrorCode ierr; 311abe9303eSLisandro Dalcin 312abe9303eSLisandro Dalcin PetscFunctionBegin; 313abe9303eSLisandro Dalcin PetscValidHeaderSpecific(part, PETSCPARTITIONER_CLASSID, 1); 314abe9303eSLisandro Dalcin PetscValidLogicalCollectiveInt(part, nparts, 2); 3152c71b3e2SJacob Faibussowitsch PetscCheckFalse(nparts <= 0,PetscObjectComm((PetscObject) part), PETSC_ERR_ARG_OUTOFRANGE, "Number of parts must be positive"); 3162c71b3e2SJacob Faibussowitsch PetscCheckFalse(numVertices < 0,PETSC_COMM_SELF, PETSC_ERR_ARG_OUTOFRANGE, "Number of vertices must be non-negative"); 317abe9303eSLisandro Dalcin if (numVertices && !part->noGraph) { 318abe9303eSLisandro Dalcin PetscValidIntPointer(start, 4); 319abe9303eSLisandro Dalcin PetscValidIntPointer(start + numVertices, 4); 320abe9303eSLisandro Dalcin if (start[numVertices]) PetscValidIntPointer(adjacency, 5); 321abe9303eSLisandro Dalcin } 322abe9303eSLisandro Dalcin if (vertexSection) { 323abe9303eSLisandro Dalcin PetscInt s,e; 324abe9303eSLisandro Dalcin 325abe9303eSLisandro Dalcin PetscValidHeaderSpecific(vertexSection, PETSC_SECTION_CLASSID, 6); 326abe9303eSLisandro Dalcin ierr = PetscSectionGetChart(vertexSection, &s, &e);CHKERRQ(ierr); 3272c71b3e2SJacob Faibussowitsch PetscCheckFalse(s > 0 || e < numVertices,PETSC_COMM_SELF,PETSC_ERR_ARG_OUTOFRANGE,"Invalid vertexSection chart [%D,%D)",s,e); 328abe9303eSLisandro Dalcin } 329abe9303eSLisandro Dalcin if (targetSection) { 330abe9303eSLisandro Dalcin PetscInt s,e; 331abe9303eSLisandro Dalcin 332abe9303eSLisandro Dalcin PetscValidHeaderSpecific(targetSection, PETSC_SECTION_CLASSID, 7); 333abe9303eSLisandro Dalcin ierr = PetscSectionGetChart(targetSection, &s, &e);CHKERRQ(ierr); 3342c71b3e2SJacob Faibussowitsch PetscCheckFalse(s > 0 || e < nparts,PETSC_COMM_SELF,PETSC_ERR_ARG_OUTOFRANGE,"Invalid targetSection chart [%D,%D)",s,e); 335abe9303eSLisandro Dalcin } 336abe9303eSLisandro Dalcin PetscValidHeaderSpecific(partSection, PETSC_SECTION_CLASSID, 8); 337abe9303eSLisandro Dalcin PetscValidPointer(partition, 9); 338abe9303eSLisandro Dalcin 339abe9303eSLisandro Dalcin ierr = PetscSectionReset(partSection);CHKERRQ(ierr); 340abe9303eSLisandro Dalcin ierr = PetscSectionSetChart(partSection, 0, nparts);CHKERRQ(ierr); 341abe9303eSLisandro Dalcin if (nparts == 1) { /* quick */ 342abe9303eSLisandro Dalcin ierr = PetscSectionSetDof(partSection, 0, numVertices);CHKERRQ(ierr); 343abe9303eSLisandro Dalcin ierr = ISCreateStride(PetscObjectComm((PetscObject)part),numVertices,0,1,partition);CHKERRQ(ierr); 344abe9303eSLisandro Dalcin } else { 3452c71b3e2SJacob Faibussowitsch PetscCheckFalse(!part->ops->partition,PetscObjectComm((PetscObject) part), PETSC_ERR_SUP, "PetscPartitioner %s has no partitioning method", ((PetscObject)part)->type_name); 346abe9303eSLisandro Dalcin ierr = (*part->ops->partition)(part, nparts, numVertices, start, adjacency, vertexSection, targetSection, partSection, partition);CHKERRQ(ierr); 347abe9303eSLisandro Dalcin } 348abe9303eSLisandro Dalcin ierr = PetscSectionSetUp(partSection);CHKERRQ(ierr); 349abe9303eSLisandro Dalcin if (part->viewerGraph) { 350abe9303eSLisandro Dalcin PetscViewer viewer = part->viewerGraph; 351abe9303eSLisandro Dalcin PetscBool isascii; 352abe9303eSLisandro Dalcin PetscInt v, i; 353abe9303eSLisandro Dalcin PetscMPIInt rank; 354abe9303eSLisandro Dalcin 355ffc4695bSBarry Smith ierr = MPI_Comm_rank(PetscObjectComm((PetscObject) viewer), &rank);CHKERRMPI(ierr); 356abe9303eSLisandro Dalcin ierr = PetscObjectTypeCompare((PetscObject) viewer, PETSCVIEWERASCII, &isascii);CHKERRQ(ierr); 357abe9303eSLisandro Dalcin if (isascii) { 358abe9303eSLisandro Dalcin ierr = PetscViewerASCIIPushSynchronized(viewer);CHKERRQ(ierr); 359abe9303eSLisandro Dalcin ierr = PetscViewerASCIISynchronizedPrintf(viewer, "[%d]Nv: %D\n", rank, numVertices);CHKERRQ(ierr); 360abe9303eSLisandro Dalcin for (v = 0; v < numVertices; ++v) { 361abe9303eSLisandro Dalcin const PetscInt s = start[v]; 362abe9303eSLisandro Dalcin const PetscInt e = start[v+1]; 363abe9303eSLisandro Dalcin 364abe9303eSLisandro Dalcin ierr = PetscViewerASCIISynchronizedPrintf(viewer, "[%d] ", rank);CHKERRQ(ierr); 365abe9303eSLisandro Dalcin for (i = s; i < e; ++i) {ierr = PetscViewerASCIISynchronizedPrintf(viewer, "%D ", adjacency[i]);CHKERRQ(ierr);} 366abe9303eSLisandro Dalcin ierr = PetscViewerASCIISynchronizedPrintf(viewer, "[%D-%D)\n", s, e);CHKERRQ(ierr); 367abe9303eSLisandro Dalcin } 368abe9303eSLisandro Dalcin ierr = PetscViewerFlush(viewer);CHKERRQ(ierr); 369abe9303eSLisandro Dalcin ierr = PetscViewerASCIIPopSynchronized(viewer);CHKERRQ(ierr); 370abe9303eSLisandro Dalcin } 371abe9303eSLisandro Dalcin } 372abe9303eSLisandro Dalcin if (part->viewer) { 373abe9303eSLisandro Dalcin ierr = PetscPartitionerView(part,part->viewer);CHKERRQ(ierr); 374abe9303eSLisandro Dalcin } 375abe9303eSLisandro Dalcin PetscFunctionReturn(0); 376abe9303eSLisandro Dalcin } 377abe9303eSLisandro Dalcin 378abe9303eSLisandro Dalcin /*@ 379abe9303eSLisandro Dalcin PetscPartitionerCreate - Creates an empty PetscPartitioner object. The type can then be set with PetscPartitionerSetType(). 380abe9303eSLisandro Dalcin 381abe9303eSLisandro Dalcin Collective 382abe9303eSLisandro Dalcin 383abe9303eSLisandro Dalcin Input Parameter: 384abe9303eSLisandro Dalcin . comm - The communicator for the PetscPartitioner object 385abe9303eSLisandro Dalcin 386abe9303eSLisandro Dalcin Output Parameter: 387abe9303eSLisandro Dalcin . part - The PetscPartitioner object 388abe9303eSLisandro Dalcin 389abe9303eSLisandro Dalcin Level: beginner 390abe9303eSLisandro Dalcin 391*6e0dc72eSMatthew G. Knepley .seealso: PetscPartitionerSetType(), PetscPartitionerDestroy() 392abe9303eSLisandro Dalcin @*/ 393abe9303eSLisandro Dalcin PetscErrorCode PetscPartitionerCreate(MPI_Comm comm, PetscPartitioner *part) 394abe9303eSLisandro Dalcin { 395abe9303eSLisandro Dalcin PetscPartitioner p; 396abe9303eSLisandro Dalcin const char *partitionerType = NULL; 397abe9303eSLisandro Dalcin PetscErrorCode ierr; 398abe9303eSLisandro Dalcin 399abe9303eSLisandro Dalcin PetscFunctionBegin; 400abe9303eSLisandro Dalcin PetscValidPointer(part, 2); 401abe9303eSLisandro Dalcin *part = NULL; 402abe9303eSLisandro Dalcin ierr = PetscPartitionerInitializePackage();CHKERRQ(ierr); 403abe9303eSLisandro Dalcin 404abe9303eSLisandro Dalcin ierr = PetscHeaderCreate(p, PETSCPARTITIONER_CLASSID, "PetscPartitioner", "Graph Partitioner", "PetscPartitioner", comm, PetscPartitionerDestroy, PetscPartitionerView);CHKERRQ(ierr); 405d7cc930eSLisandro Dalcin ierr = PetscPartitionerGetDefaultType(comm, &partitionerType);CHKERRQ(ierr); 406abe9303eSLisandro Dalcin ierr = PetscPartitionerSetType(p, partitionerType);CHKERRQ(ierr); 407abe9303eSLisandro Dalcin 408abe9303eSLisandro Dalcin p->edgeCut = 0; 409abe9303eSLisandro Dalcin p->balance = 0.0; 410abe9303eSLisandro Dalcin p->usevwgt = PETSC_TRUE; 411abe9303eSLisandro Dalcin 412abe9303eSLisandro Dalcin *part = p; 413abe9303eSLisandro Dalcin PetscFunctionReturn(0); 414abe9303eSLisandro Dalcin } 415