18be712e4SBarry Smith #include <../src/mat/impls/adj/mpi/mpiadj.h> /*I "petscmat.h" I*/ 28be712e4SBarry Smith 38be712e4SBarry Smith #if defined(PETSC_HAVE_UNISTD_H) 48be712e4SBarry Smith #include <unistd.h> 58be712e4SBarry Smith #endif 68be712e4SBarry Smith 78be712e4SBarry Smith #if defined(PETSC_HAVE_CHACO_INT_ASSIGNMENT) 88be712e4SBarry Smith #include <chaco.h> 98be712e4SBarry Smith #else 108be712e4SBarry Smith /* Older versions of Chaco do not have an include file */ 118be712e4SBarry Smith PETSC_EXTERN int interface(int nvtxs, int *start, int *adjacency, int *vwgts, float *ewgts, float *x, float *y, float *z, char *outassignname, char *outfilename, short *assignment, int architecture, int ndims_tot, int mesh_dims[3], double *goal, int global_method, int local_method, int rqi_flag, int vmax, int ndims, double eigtol, long seed); 128be712e4SBarry Smith #endif 138be712e4SBarry Smith 148be712e4SBarry Smith extern int FREE_GRAPH; 158be712e4SBarry Smith 168be712e4SBarry Smith /* 178be712e4SBarry Smith int nvtxs; number of vertices in full graph 188be712e4SBarry Smith int *start; start of edge list for each vertex 198be712e4SBarry Smith int *adjacency; edge list data 208be712e4SBarry Smith int *vwgts; weights for all vertices 218be712e4SBarry Smith float *ewgts; weights for all edges 228be712e4SBarry Smith float *x, *y, *z; coordinates for inertial method 238be712e4SBarry Smith char *outassignname; name of assignment output file 248be712e4SBarry Smith char *outfilename; output file name 258be712e4SBarry Smith short *assignment; set number of each vtx (length n) 268be712e4SBarry Smith int architecture; 0 => hypercube, d => d-dimensional mesh 278be712e4SBarry Smith int ndims_tot; total number of cube dimensions to divide 288be712e4SBarry Smith int mesh_dims[3]; dimensions of mesh of processors 298be712e4SBarry Smith double *goal; desired set sizes for each set 308be712e4SBarry Smith int global_method; global partitioning algorithm 318be712e4SBarry Smith int local_method; local partitioning algorithm 328be712e4SBarry Smith int rqi_flag; should I use RQI/Symmlq eigensolver? 338be712e4SBarry Smith int vmax; how many vertices to coarsen down to? 348be712e4SBarry Smith int ndims; number of eigenvectors (2^d sets) 358be712e4SBarry Smith double eigtol; tolerance on eigenvectors 368be712e4SBarry Smith long seed; for random graph mutations 378be712e4SBarry Smith */ 388be712e4SBarry Smith 398be712e4SBarry Smith typedef struct { 408be712e4SBarry Smith PetscBool verbose; 418be712e4SBarry Smith PetscInt eignum; 428be712e4SBarry Smith PetscReal eigtol; 438be712e4SBarry Smith MPChacoGlobalType global_method; /* global method */ 448be712e4SBarry Smith MPChacoLocalType local_method; /* local method */ 458be712e4SBarry Smith MPChacoEigenType eigen_method; /* eigensolver */ 468be712e4SBarry Smith PetscInt nbvtxcoarsed; /* number of vertices for the coarse graph */ 478be712e4SBarry Smith } MatPartitioning_Chaco; 488be712e4SBarry Smith 498be712e4SBarry Smith #define SIZE_LOG 10000 /* size of buffer for mesg_log */ 508be712e4SBarry Smith 518be712e4SBarry Smith static PetscErrorCode MatPartitioningApply_Chaco(MatPartitioning part, IS *partitioning) 528be712e4SBarry Smith { 538be712e4SBarry Smith int cerr; 548be712e4SBarry Smith PetscInt *parttab, *locals, i, nb_locals, M, N; 558be712e4SBarry Smith PetscMPIInt size, rank; 568be712e4SBarry Smith Mat mat = part->adj, matAdj, matSeq, *A; 578be712e4SBarry Smith Mat_MPIAdj *adj; 588be712e4SBarry Smith MatPartitioning_Chaco *chaco = (MatPartitioning_Chaco *)part->data; 598be712e4SBarry Smith PetscBool flg; 608be712e4SBarry Smith IS isrow, iscol; 618be712e4SBarry Smith int nvtxs, *start, *adjacency, *vwgts, architecture, ndims_tot; 628be712e4SBarry Smith int mesh_dims[3], global_method, local_method, rqi_flag, vmax, ndims; 638be712e4SBarry Smith #if defined(PETSC_HAVE_CHACO_INT_ASSIGNMENT) 648be712e4SBarry Smith int *assignment; 658be712e4SBarry Smith #else 668be712e4SBarry Smith short *assignment; 678be712e4SBarry Smith #endif 688be712e4SBarry Smith double eigtol; 698be712e4SBarry Smith long seed; 708be712e4SBarry Smith char *mesg_log; 718be712e4SBarry Smith #if defined(PETSC_HAVE_UNISTD_H) 728be712e4SBarry Smith int fd_stdout, fd_pipe[2], count; 738be712e4SBarry Smith #endif 748be712e4SBarry Smith 758be712e4SBarry Smith PetscFunctionBegin; 768be712e4SBarry Smith PetscCheck(!part->use_edge_weights, PetscObjectComm((PetscObject)part), PETSC_ERR_SUP, "Chaco does not support edge weights"); 778be712e4SBarry Smith FREE_GRAPH = 0; /* otherwise Chaco will attempt to free memory for adjacency graph */ 788be712e4SBarry Smith PetscCallMPI(MPI_Comm_size(PetscObjectComm((PetscObject)mat), &size)); 798be712e4SBarry Smith PetscCallMPI(MPI_Comm_rank(PetscObjectComm((PetscObject)mat), &rank)); 808be712e4SBarry Smith PetscCall(PetscObjectTypeCompare((PetscObject)mat, MATMPIADJ, &flg)); 818be712e4SBarry Smith if (size > 1) { 828be712e4SBarry Smith if (flg) { 838be712e4SBarry Smith PetscCall(MatMPIAdjToSeq(mat, &matSeq)); 848be712e4SBarry Smith } else { 858be712e4SBarry Smith PetscCall(PetscInfo(part, "Converting distributed matrix to sequential: this could be a performance loss\n")); 868be712e4SBarry Smith PetscCall(MatGetSize(mat, &M, &N)); 878be712e4SBarry Smith PetscCall(ISCreateStride(PETSC_COMM_SELF, M, 0, 1, &isrow)); 888be712e4SBarry Smith PetscCall(ISCreateStride(PETSC_COMM_SELF, N, 0, 1, &iscol)); 898be712e4SBarry Smith PetscCall(MatCreateSubMatrices(mat, 1, &isrow, &iscol, MAT_INITIAL_MATRIX, &A)); 908be712e4SBarry Smith PetscCall(ISDestroy(&isrow)); 918be712e4SBarry Smith PetscCall(ISDestroy(&iscol)); 928be712e4SBarry Smith matSeq = *A; 938be712e4SBarry Smith PetscCall(PetscFree(A)); 948be712e4SBarry Smith } 958be712e4SBarry Smith } else { 968be712e4SBarry Smith PetscCall(PetscObjectReference((PetscObject)mat)); 978be712e4SBarry Smith matSeq = mat; 988be712e4SBarry Smith } 998be712e4SBarry Smith 1008be712e4SBarry Smith if (!flg) { /* convert regular matrix to MPIADJ */ 1018be712e4SBarry Smith PetscCall(MatConvert(matSeq, MATMPIADJ, MAT_INITIAL_MATRIX, &matAdj)); 1028be712e4SBarry Smith } else { 1038be712e4SBarry Smith PetscCall(PetscObjectReference((PetscObject)matSeq)); 1048be712e4SBarry Smith matAdj = matSeq; 1058be712e4SBarry Smith } 1068be712e4SBarry Smith 1078be712e4SBarry Smith adj = (Mat_MPIAdj *)matAdj->data; /* finally adj contains adjacency graph */ 1088be712e4SBarry Smith 1098be712e4SBarry Smith /* arguments for Chaco library */ 1108be712e4SBarry Smith nvtxs = mat->rmap->N; /* number of vertices in full graph */ 1118be712e4SBarry Smith start = adj->i; /* start of edge list for each vertex */ 1128be712e4SBarry Smith vwgts = part->vertex_weights; /* weights for all vertices */ 1138be712e4SBarry Smith architecture = 1; /* 0 => hypercube, d => d-dimensional mesh */ 1148be712e4SBarry Smith ndims_tot = 0; /* total number of cube dimensions to divide */ 1158be712e4SBarry Smith mesh_dims[0] = part->n; /* dimensions of mesh of processors */ 1168be712e4SBarry Smith global_method = chaco->global_method; /* global partitioning algorithm */ 1178be712e4SBarry Smith local_method = chaco->local_method; /* local partitioning algorithm */ 1188be712e4SBarry Smith rqi_flag = chaco->eigen_method; /* should I use RQI/Symmlq eigensolver? */ 1198be712e4SBarry Smith vmax = chaco->nbvtxcoarsed; /* how many vertices to coarsen down to? */ 1208be712e4SBarry Smith ndims = chaco->eignum; /* number of eigenvectors (2^d sets) */ 1218be712e4SBarry Smith eigtol = chaco->eigtol; /* tolerance on eigenvectors */ 1228be712e4SBarry Smith seed = 123636512; /* for random graph mutations */ 1238be712e4SBarry Smith 1248be712e4SBarry Smith PetscCall(PetscMalloc1(mat->rmap->N, &assignment)); 1258be712e4SBarry Smith PetscCall(PetscMalloc1(start[nvtxs], &adjacency)); 1268be712e4SBarry Smith for (i = 0; i < start[nvtxs]; i++) adjacency[i] = (adj->j)[i] + 1; /* 1-based indexing */ 1278be712e4SBarry Smith 1288be712e4SBarry Smith /* redirect output to buffer */ 1298be712e4SBarry Smith #if defined(PETSC_HAVE_UNISTD_H) 1308be712e4SBarry Smith fd_stdout = dup(1); 1318be712e4SBarry Smith PetscCheck(!pipe(fd_pipe), PETSC_COMM_SELF, PETSC_ERR_SYS, "Could not open pipe"); 1328be712e4SBarry Smith close(1); 1338be712e4SBarry Smith dup2(fd_pipe[1], 1); 1348be712e4SBarry Smith PetscCall(PetscMalloc1(SIZE_LOG, &mesg_log)); 1358be712e4SBarry Smith #endif 1368be712e4SBarry Smith 1378be712e4SBarry Smith /* library call */ 1388be712e4SBarry Smith cerr = interface(nvtxs, start, adjacency, vwgts, NULL, NULL, NULL, NULL, NULL, NULL, assignment, architecture, ndims_tot, mesh_dims, NULL, global_method, local_method, rqi_flag, vmax, ndims, eigtol, seed); 1398be712e4SBarry Smith 1408be712e4SBarry Smith #if defined(PETSC_HAVE_UNISTD_H) 1418be712e4SBarry Smith PetscCall(PetscFFlush(stdout)); 1428be712e4SBarry Smith count = read(fd_pipe[0], mesg_log, (SIZE_LOG - 1) * sizeof(char)); 1438be712e4SBarry Smith if (count < 0) count = 0; 1448be712e4SBarry Smith mesg_log[count] = 0; 1458be712e4SBarry Smith close(1); 1468be712e4SBarry Smith dup2(fd_stdout, 1); 1478be712e4SBarry Smith close(fd_stdout); 1488be712e4SBarry Smith close(fd_pipe[0]); 1498be712e4SBarry Smith close(fd_pipe[1]); 1508be712e4SBarry Smith if (chaco->verbose) PetscCall(PetscPrintf(PetscObjectComm((PetscObject)mat), "%s", mesg_log)); 1518be712e4SBarry Smith PetscCall(PetscFree(mesg_log)); 1528be712e4SBarry Smith #endif 1538be712e4SBarry Smith PetscCheck(!cerr, PETSC_COMM_SELF, PETSC_ERR_LIB, "Chaco failed"); 1548be712e4SBarry Smith 1558be712e4SBarry Smith PetscCall(PetscMalloc1(mat->rmap->N, &parttab)); 1568be712e4SBarry Smith for (i = 0; i < nvtxs; i++) parttab[i] = assignment[i]; 1578be712e4SBarry Smith 1588be712e4SBarry Smith /* creation of the index set */ 1598be712e4SBarry Smith nb_locals = mat->rmap->n; 1608be712e4SBarry Smith locals = parttab + mat->rmap->rstart; 1618be712e4SBarry Smith PetscCall(ISCreateGeneral(PetscObjectComm((PetscObject)part), nb_locals, locals, PETSC_COPY_VALUES, partitioning)); 1628be712e4SBarry Smith 1638be712e4SBarry Smith /* clean up */ 1648be712e4SBarry Smith PetscCall(PetscFree(parttab)); 1658be712e4SBarry Smith PetscCall(PetscFree(adjacency)); 1668be712e4SBarry Smith PetscCall(PetscFree(assignment)); 1678be712e4SBarry Smith PetscCall(MatDestroy(&matSeq)); 1688be712e4SBarry Smith PetscCall(MatDestroy(&matAdj)); 1698be712e4SBarry Smith PetscFunctionReturn(PETSC_SUCCESS); 1708be712e4SBarry Smith } 1718be712e4SBarry Smith 1728be712e4SBarry Smith static PetscErrorCode MatPartitioningView_Chaco(MatPartitioning part, PetscViewer viewer) 1738be712e4SBarry Smith { 1748be712e4SBarry Smith MatPartitioning_Chaco *chaco = (MatPartitioning_Chaco *)part->data; 1758be712e4SBarry Smith PetscBool isascii; 1768be712e4SBarry Smith 1778be712e4SBarry Smith PetscFunctionBegin; 1788be712e4SBarry Smith PetscCall(PetscObjectTypeCompare((PetscObject)viewer, PETSCVIEWERASCII, &isascii)); 1798be712e4SBarry Smith if (isascii) { 1808be712e4SBarry Smith PetscCall(PetscViewerASCIIPrintf(viewer, " Global method: %s\n", MPChacoGlobalTypes[chaco->global_method])); 1818be712e4SBarry Smith PetscCall(PetscViewerASCIIPrintf(viewer, " Local method: %s\n", MPChacoLocalTypes[chaco->local_method])); 1828be712e4SBarry Smith PetscCall(PetscViewerASCIIPrintf(viewer, " Number of vertices for the coarse graph: %" PetscInt_FMT "\n", chaco->nbvtxcoarsed)); 1838be712e4SBarry Smith PetscCall(PetscViewerASCIIPrintf(viewer, " Eigensolver: %s\n", MPChacoEigenTypes[chaco->eigen_method])); 1848be712e4SBarry Smith PetscCall(PetscViewerASCIIPrintf(viewer, " Tolerance for eigensolver: %g\n", chaco->eigtol)); 1858be712e4SBarry Smith PetscCall(PetscViewerASCIIPrintf(viewer, " Number of eigenvectors: %" PetscInt_FMT "\n", chaco->eignum)); 1868be712e4SBarry Smith } 1878be712e4SBarry Smith PetscFunctionReturn(PETSC_SUCCESS); 1888be712e4SBarry Smith } 1898be712e4SBarry Smith 1908be712e4SBarry Smith /*@ 1918be712e4SBarry Smith MatPartitioningChacoSetGlobal - Set the global method for Chaco partitioner. 1928be712e4SBarry Smith 1938be712e4SBarry Smith Collective 1948be712e4SBarry Smith 1958be712e4SBarry Smith Input Parameters: 1968be712e4SBarry Smith + part - the partitioning context 1978be712e4SBarry Smith - method - one of `MP_CHACO_MULTILEVEL`, `MP_CHACO_SPECTRAL`, `MP_CHACO_LINEAR`, 1988be712e4SBarry Smith `MP_CHACO_RANDOM` or `MP_CHACO_SCATTERED` 1998be712e4SBarry Smith 2008be712e4SBarry Smith Options Database Key: 2018be712e4SBarry Smith . -mat_partitioning_chaco_global <method> - the global method 2028be712e4SBarry Smith 2038be712e4SBarry Smith Level: advanced 2048be712e4SBarry Smith 2058be712e4SBarry Smith Note: 2068be712e4SBarry Smith The default is the multi-level method. See Chaco documentation for 2078be712e4SBarry Smith additional details. 2088be712e4SBarry Smith 2098be712e4SBarry Smith .seealso: `MatPartitioning`, `MatPartioningSetType()`, `MatPartitioningType`, `MATPARTITIONINGCHACO`, `MatPartitioningChacoSetLocal()`, `MatPartitioningChacoGetGlobal()` 2108be712e4SBarry Smith @*/ 2118be712e4SBarry Smith PetscErrorCode MatPartitioningChacoSetGlobal(MatPartitioning part, MPChacoGlobalType method) 2128be712e4SBarry Smith { 2138be712e4SBarry Smith PetscFunctionBegin; 2148be712e4SBarry Smith PetscValidHeaderSpecific(part, MAT_PARTITIONING_CLASSID, 1); 2158be712e4SBarry Smith PetscValidLogicalCollectiveEnum(part, method, 2); 2168be712e4SBarry Smith PetscTryMethod(part, "MatPartitioningChacoSetGlobal_C", (MatPartitioning, MPChacoGlobalType), (part, method)); 2178be712e4SBarry Smith PetscFunctionReturn(PETSC_SUCCESS); 2188be712e4SBarry Smith } 2198be712e4SBarry Smith 2208be712e4SBarry Smith static PetscErrorCode MatPartitioningChacoSetGlobal_Chaco(MatPartitioning part, MPChacoGlobalType method) 2218be712e4SBarry Smith { 2228be712e4SBarry Smith MatPartitioning_Chaco *chaco = (MatPartitioning_Chaco *)part->data; 2238be712e4SBarry Smith 2248be712e4SBarry Smith PetscFunctionBegin; 2258be712e4SBarry Smith switch (method) { 2268be712e4SBarry Smith case MP_CHACO_MULTILEVEL: 2278be712e4SBarry Smith case MP_CHACO_SPECTRAL: 2288be712e4SBarry Smith case MP_CHACO_LINEAR: 2298be712e4SBarry Smith case MP_CHACO_RANDOM: 2308be712e4SBarry Smith case MP_CHACO_SCATTERED: 2318be712e4SBarry Smith chaco->global_method = method; 2328be712e4SBarry Smith break; 2338be712e4SBarry Smith default: 2348be712e4SBarry Smith SETERRQ(PETSC_COMM_SELF, PETSC_ERR_ARG_WRONG, "Chaco: Unknown or unsupported option"); 2358be712e4SBarry Smith } 2368be712e4SBarry Smith PetscFunctionReturn(PETSC_SUCCESS); 2378be712e4SBarry Smith } 2388be712e4SBarry Smith 2398be712e4SBarry Smith /*@ 2408be712e4SBarry Smith MatPartitioningChacoGetGlobal - Get the global method used by the Chaco partitioner. 2418be712e4SBarry Smith 2428be712e4SBarry Smith Not Collective 2438be712e4SBarry Smith 2448be712e4SBarry Smith Input Parameter: 2458be712e4SBarry Smith . part - the partitioning context 2468be712e4SBarry Smith 2478be712e4SBarry Smith Output Parameter: 2488be712e4SBarry Smith . method - the method 2498be712e4SBarry Smith 2508be712e4SBarry Smith Level: advanced 2518be712e4SBarry Smith 2528be712e4SBarry Smith .seealso: `MatPartitioningType`, `MATPARTITIONINGCHACO`, `MatPartitioningChacoSetGlobal()` 2538be712e4SBarry Smith @*/ 2548be712e4SBarry Smith PetscErrorCode MatPartitioningChacoGetGlobal(MatPartitioning part, MPChacoGlobalType *method) 2558be712e4SBarry Smith { 2568be712e4SBarry Smith PetscFunctionBegin; 2578be712e4SBarry Smith PetscValidHeaderSpecific(part, MAT_PARTITIONING_CLASSID, 1); 2588be712e4SBarry Smith PetscAssertPointer(method, 2); 2598be712e4SBarry Smith PetscTryMethod(part, "MatPartitioningChacoGetGlobal_C", (MatPartitioning, MPChacoGlobalType *), (part, method)); 2608be712e4SBarry Smith PetscFunctionReturn(PETSC_SUCCESS); 2618be712e4SBarry Smith } 2628be712e4SBarry Smith 2638be712e4SBarry Smith static PetscErrorCode MatPartitioningChacoGetGlobal_Chaco(MatPartitioning part, MPChacoGlobalType *method) 2648be712e4SBarry Smith { 2658be712e4SBarry Smith MatPartitioning_Chaco *chaco = (MatPartitioning_Chaco *)part->data; 2668be712e4SBarry Smith 2678be712e4SBarry Smith PetscFunctionBegin; 2688be712e4SBarry Smith *method = chaco->global_method; 2698be712e4SBarry Smith PetscFunctionReturn(PETSC_SUCCESS); 2708be712e4SBarry Smith } 2718be712e4SBarry Smith 2728be712e4SBarry Smith /*@ 2738be712e4SBarry Smith MatPartitioningChacoSetLocal - Set the local method for the Chaco partitioner. 2748be712e4SBarry Smith 2758be712e4SBarry Smith Collective 2768be712e4SBarry Smith 2778be712e4SBarry Smith Input Parameters: 2788be712e4SBarry Smith + part - the partitioning context 2798be712e4SBarry Smith - method - one of `MP_CHACO_KERNIGHAN` or `MP_CHACO_NONE` 2808be712e4SBarry Smith 2818be712e4SBarry Smith Options Database Key: 2828be712e4SBarry Smith . -mat_partitioning_chaco_local <method> - the local method 2838be712e4SBarry Smith 2848be712e4SBarry Smith Level: advanced 2858be712e4SBarry Smith 2868be712e4SBarry Smith Note: 2878be712e4SBarry Smith The default is to apply the Kernighan-Lin heuristic. See Chaco documentation 2888be712e4SBarry Smith for additional details. 2898be712e4SBarry Smith 2908be712e4SBarry Smith .seealso: `MatPartitioningType`, `MATPARTITIONINGCHACO`, `MatPartitioningChacoSetGlobal()`, `MatPartitioningChacoGetLocal()` 2918be712e4SBarry Smith @*/ 2928be712e4SBarry Smith PetscErrorCode MatPartitioningChacoSetLocal(MatPartitioning part, MPChacoLocalType method) 2938be712e4SBarry Smith { 2948be712e4SBarry Smith PetscFunctionBegin; 2958be712e4SBarry Smith PetscValidHeaderSpecific(part, MAT_PARTITIONING_CLASSID, 1); 2968be712e4SBarry Smith PetscValidLogicalCollectiveEnum(part, method, 2); 2978be712e4SBarry Smith PetscTryMethod(part, "MatPartitioningChacoSetLocal_C", (MatPartitioning, MPChacoLocalType), (part, method)); 2988be712e4SBarry Smith PetscFunctionReturn(PETSC_SUCCESS); 2998be712e4SBarry Smith } 3008be712e4SBarry Smith 3018be712e4SBarry Smith static PetscErrorCode MatPartitioningChacoSetLocal_Chaco(MatPartitioning part, MPChacoLocalType method) 3028be712e4SBarry Smith { 3038be712e4SBarry Smith MatPartitioning_Chaco *chaco = (MatPartitioning_Chaco *)part->data; 3048be712e4SBarry Smith 3058be712e4SBarry Smith PetscFunctionBegin; 3068be712e4SBarry Smith switch (method) { 3078be712e4SBarry Smith case MP_CHACO_KERNIGHAN: 3088be712e4SBarry Smith case MP_CHACO_NONE: 3098be712e4SBarry Smith chaco->local_method = method; 3108be712e4SBarry Smith break; 3118be712e4SBarry Smith default: 3128be712e4SBarry Smith SETERRQ(PETSC_COMM_SELF, PETSC_ERR_ARG_WRONG, "Chaco: Unknown or unsupported option"); 3138be712e4SBarry Smith } 3148be712e4SBarry Smith PetscFunctionReturn(PETSC_SUCCESS); 3158be712e4SBarry Smith } 3168be712e4SBarry Smith 3178be712e4SBarry Smith /*@ 3188be712e4SBarry Smith MatPartitioningChacoGetLocal - Get local method used by the Chaco partitioner. 3198be712e4SBarry Smith 3208be712e4SBarry Smith Not Collective 3218be712e4SBarry Smith 3228be712e4SBarry Smith Input Parameter: 3238be712e4SBarry Smith . part - the partitioning context 3248be712e4SBarry Smith 3258be712e4SBarry Smith Output Parameter: 3268be712e4SBarry Smith . method - the method 3278be712e4SBarry Smith 3288be712e4SBarry Smith Level: advanced 3298be712e4SBarry Smith 3308be712e4SBarry Smith .seealso: `MatPartitioningType`, `MATPARTITIONINGCHACO`, `MatPartitioningChacoSetLocal()` 3318be712e4SBarry Smith @*/ 3328be712e4SBarry Smith PetscErrorCode MatPartitioningChacoGetLocal(MatPartitioning part, MPChacoLocalType *method) 3338be712e4SBarry Smith { 3348be712e4SBarry Smith PetscFunctionBegin; 3358be712e4SBarry Smith PetscValidHeaderSpecific(part, MAT_PARTITIONING_CLASSID, 1); 3368be712e4SBarry Smith PetscAssertPointer(method, 2); 3378be712e4SBarry Smith PetscUseMethod(part, "MatPartitioningChacoGetLocal_C", (MatPartitioning, MPChacoLocalType *), (part, method)); 3388be712e4SBarry Smith PetscFunctionReturn(PETSC_SUCCESS); 3398be712e4SBarry Smith } 3408be712e4SBarry Smith 3418be712e4SBarry Smith static PetscErrorCode MatPartitioningChacoGetLocal_Chaco(MatPartitioning part, MPChacoLocalType *method) 3428be712e4SBarry Smith { 3438be712e4SBarry Smith MatPartitioning_Chaco *chaco = (MatPartitioning_Chaco *)part->data; 3448be712e4SBarry Smith 3458be712e4SBarry Smith PetscFunctionBegin; 3468be712e4SBarry Smith *method = chaco->local_method; 3478be712e4SBarry Smith PetscFunctionReturn(PETSC_SUCCESS); 3488be712e4SBarry Smith } 3498be712e4SBarry Smith 3508be712e4SBarry Smith /*@ 3518be712e4SBarry Smith MatPartitioningChacoSetCoarseLevel - Set the coarse level parameter for the 3528be712e4SBarry Smith Chaco partitioner. 3538be712e4SBarry Smith 3548be712e4SBarry Smith Collective 3558be712e4SBarry Smith 3568be712e4SBarry Smith Input Parameters: 3578be712e4SBarry Smith + part - the partitioning context 3588be712e4SBarry Smith - level - the coarse level in range [0.0,1.0] 3598be712e4SBarry Smith 3608be712e4SBarry Smith Options Database Key: 3618be712e4SBarry Smith . -mat_partitioning_chaco_coarse <l> - Coarse level 3628be712e4SBarry Smith 3638be712e4SBarry Smith Level: advanced 3648be712e4SBarry Smith 3658be712e4SBarry Smith .seealso: `MatPartitioningType`, `MatPartitioning`, `MATPARTITIONINGCHACO` 3668be712e4SBarry Smith @*/ 3678be712e4SBarry Smith PetscErrorCode MatPartitioningChacoSetCoarseLevel(MatPartitioning part, PetscReal level) 3688be712e4SBarry Smith { 3698be712e4SBarry Smith PetscFunctionBegin; 3708be712e4SBarry Smith PetscValidHeaderSpecific(part, MAT_PARTITIONING_CLASSID, 1); 3718be712e4SBarry Smith PetscValidLogicalCollectiveReal(part, level, 2); 3728be712e4SBarry Smith PetscTryMethod(part, "MatPartitioningChacoSetCoarseLevel_C", (MatPartitioning, PetscReal), (part, level)); 3738be712e4SBarry Smith PetscFunctionReturn(PETSC_SUCCESS); 3748be712e4SBarry Smith } 3758be712e4SBarry Smith 3768be712e4SBarry Smith static PetscErrorCode MatPartitioningChacoSetCoarseLevel_Chaco(MatPartitioning part, PetscReal level) 3778be712e4SBarry Smith { 3788be712e4SBarry Smith MatPartitioning_Chaco *chaco = (MatPartitioning_Chaco *)part->data; 3798be712e4SBarry Smith 3808be712e4SBarry Smith PetscFunctionBegin; 3818be712e4SBarry Smith PetscCheck(level >= 0.0 && level < 1.0, PETSC_COMM_SELF, PETSC_ERR_ARG_OUTOFRANGE, "Chaco: level of coarsening out of range [0.0-1.0]"); 3828be712e4SBarry Smith chaco->nbvtxcoarsed = (PetscInt)(part->adj->cmap->N * level); 3838be712e4SBarry Smith if (chaco->nbvtxcoarsed < 20) chaco->nbvtxcoarsed = 20; 3848be712e4SBarry Smith PetscFunctionReturn(PETSC_SUCCESS); 3858be712e4SBarry Smith } 3868be712e4SBarry Smith 3878be712e4SBarry Smith /*@ 3888be712e4SBarry Smith MatPartitioningChacoSetEigenSolver - Set the eigensolver method for Chaco partitioner. 3898be712e4SBarry Smith 3908be712e4SBarry Smith Collective 3918be712e4SBarry Smith 3928be712e4SBarry Smith Input Parameters: 3938be712e4SBarry Smith + part - the partitioning context 3948be712e4SBarry Smith - method - one of `MP_CHACO_LANCZOS` or `MP_CHACO_RQI` 3958be712e4SBarry Smith 3968be712e4SBarry Smith Options Database Key: 3978be712e4SBarry Smith . -mat_partitioning_chaco_eigen_solver <method> - the eigensolver 3988be712e4SBarry Smith 3998be712e4SBarry Smith Level: advanced 4008be712e4SBarry Smith 4018be712e4SBarry Smith Note: 4028be712e4SBarry Smith The default is to use a Lanczos method. See Chaco documentation for details. 4038be712e4SBarry Smith 4048be712e4SBarry Smith .seealso: `MatPartitioningType`, `MatPartitioning`, `MATPARTITIONINGCHACO`, `MatPartitioningChacoSetEigenTol()`, `MatPartitioningChacoSetEigenNumber()`, 4058be712e4SBarry Smith `MatPartitioningChacoGetEigenSolver()` 4068be712e4SBarry Smith @*/ 4078be712e4SBarry Smith PetscErrorCode MatPartitioningChacoSetEigenSolver(MatPartitioning part, MPChacoEigenType method) 4088be712e4SBarry Smith { 4098be712e4SBarry Smith PetscFunctionBegin; 4108be712e4SBarry Smith PetscValidHeaderSpecific(part, MAT_PARTITIONING_CLASSID, 1); 4118be712e4SBarry Smith PetscValidLogicalCollectiveEnum(part, method, 2); 4128be712e4SBarry Smith PetscTryMethod(part, "MatPartitioningChacoSetEigenSolver_C", (MatPartitioning, MPChacoEigenType), (part, method)); 4138be712e4SBarry Smith PetscFunctionReturn(PETSC_SUCCESS); 4148be712e4SBarry Smith } 4158be712e4SBarry Smith 4168be712e4SBarry Smith static PetscErrorCode MatPartitioningChacoSetEigenSolver_Chaco(MatPartitioning part, MPChacoEigenType method) 4178be712e4SBarry Smith { 4188be712e4SBarry Smith MatPartitioning_Chaco *chaco = (MatPartitioning_Chaco *)part->data; 4198be712e4SBarry Smith 4208be712e4SBarry Smith PetscFunctionBegin; 4218be712e4SBarry Smith switch (method) { 4228be712e4SBarry Smith case MP_CHACO_LANCZOS: 4238be712e4SBarry Smith case MP_CHACO_RQI: 4248be712e4SBarry Smith chaco->eigen_method = method; 4258be712e4SBarry Smith break; 4268be712e4SBarry Smith default: 4278be712e4SBarry Smith SETERRQ(PETSC_COMM_SELF, PETSC_ERR_ARG_WRONG, "Chaco: Unknown or unsupported option"); 4288be712e4SBarry Smith } 4298be712e4SBarry Smith PetscFunctionReturn(PETSC_SUCCESS); 4308be712e4SBarry Smith } 4318be712e4SBarry Smith 4328be712e4SBarry Smith /*@ 4338be712e4SBarry Smith MatPartitioningChacoGetEigenSolver - Get the eigensolver used by the Chaco partitioner. 4348be712e4SBarry Smith 4358be712e4SBarry Smith Not Collective 4368be712e4SBarry Smith 4378be712e4SBarry Smith Input Parameter: 4388be712e4SBarry Smith . part - the partitioning context 4398be712e4SBarry Smith 4408be712e4SBarry Smith Output Parameter: 4418be712e4SBarry Smith . method - the method 4428be712e4SBarry Smith 4438be712e4SBarry Smith Level: advanced 4448be712e4SBarry Smith 4458be712e4SBarry Smith .seealso: `MatPartitioningType`, `MatPartitioning`, `MATPARTITIONINGCHACO`, `MatPartitioningChacoSetEigenSolver()` 4468be712e4SBarry Smith @*/ 4478be712e4SBarry Smith PetscErrorCode MatPartitioningChacoGetEigenSolver(MatPartitioning part, MPChacoEigenType *method) 4488be712e4SBarry Smith { 4498be712e4SBarry Smith PetscFunctionBegin; 4508be712e4SBarry Smith PetscValidHeaderSpecific(part, MAT_PARTITIONING_CLASSID, 1); 4518be712e4SBarry Smith PetscAssertPointer(method, 2); 4528be712e4SBarry Smith PetscUseMethod(part, "MatPartitioningChacoGetEigenSolver_C", (MatPartitioning, MPChacoEigenType *), (part, method)); 4538be712e4SBarry Smith PetscFunctionReturn(PETSC_SUCCESS); 4548be712e4SBarry Smith } 4558be712e4SBarry Smith 4568be712e4SBarry Smith static PetscErrorCode MatPartitioningChacoGetEigenSolver_Chaco(MatPartitioning part, MPChacoEigenType *method) 4578be712e4SBarry Smith { 4588be712e4SBarry Smith MatPartitioning_Chaco *chaco = (MatPartitioning_Chaco *)part->data; 4598be712e4SBarry Smith 4608be712e4SBarry Smith PetscFunctionBegin; 4618be712e4SBarry Smith *method = chaco->eigen_method; 4628be712e4SBarry Smith PetscFunctionReturn(PETSC_SUCCESS); 4638be712e4SBarry Smith } 4648be712e4SBarry Smith 4658be712e4SBarry Smith /*@ 4668be712e4SBarry Smith MatPartitioningChacoSetEigenTol - Sets the tolerance for the eigensolver used by Chaco 4678be712e4SBarry Smith 4688be712e4SBarry Smith Collective 4698be712e4SBarry Smith 4708be712e4SBarry Smith Input Parameters: 4718be712e4SBarry Smith + part - the partitioning context 4728be712e4SBarry Smith - tol - the tolerance 4738be712e4SBarry Smith 4748be712e4SBarry Smith Options Database Key: 4758be712e4SBarry Smith . -mat_partitioning_chaco_eigen_tol <tol> - Tolerance for eigensolver 4768be712e4SBarry Smith 4778be712e4SBarry Smith Note: 4788be712e4SBarry Smith Must be positive. The default value is 0.001. 4798be712e4SBarry Smith 4808be712e4SBarry Smith Level: advanced 4818be712e4SBarry Smith 4828be712e4SBarry Smith .seealso: `MatPartitioningType`, `MatPartitioning`, `MATPARTITIONINGCHACO`, `MatPartitioningChacoSetEigenSolver()`, `MatPartitioningChacoGetEigenTol()` 4838be712e4SBarry Smith @*/ 4848be712e4SBarry Smith PetscErrorCode MatPartitioningChacoSetEigenTol(MatPartitioning part, PetscReal tol) 4858be712e4SBarry Smith { 4868be712e4SBarry Smith PetscFunctionBegin; 4878be712e4SBarry Smith PetscValidHeaderSpecific(part, MAT_PARTITIONING_CLASSID, 1); 4888be712e4SBarry Smith PetscValidLogicalCollectiveReal(part, tol, 2); 4898be712e4SBarry Smith PetscTryMethod(part, "MatPartitioningChacoSetEigenTol_C", (MatPartitioning, PetscReal), (part, tol)); 4908be712e4SBarry Smith PetscFunctionReturn(PETSC_SUCCESS); 4918be712e4SBarry Smith } 4928be712e4SBarry Smith 4938be712e4SBarry Smith static PetscErrorCode MatPartitioningChacoSetEigenTol_Chaco(MatPartitioning part, PetscReal tol) 4948be712e4SBarry Smith { 4958be712e4SBarry Smith MatPartitioning_Chaco *chaco = (MatPartitioning_Chaco *)part->data; 4968be712e4SBarry Smith 4978be712e4SBarry Smith PetscFunctionBegin; 4988be712e4SBarry Smith if (tol == PETSC_DEFAULT) chaco->eigtol = 0.001; 4998be712e4SBarry Smith else { 5008be712e4SBarry Smith PetscCheck(tol > 0.0, PetscObjectComm((PetscObject)part), PETSC_ERR_ARG_OUTOFRANGE, "Tolerance must be positive"); 5018be712e4SBarry Smith chaco->eigtol = tol; 5028be712e4SBarry Smith } 5038be712e4SBarry Smith PetscFunctionReturn(PETSC_SUCCESS); 5048be712e4SBarry Smith } 5058be712e4SBarry Smith 5068be712e4SBarry Smith /*@ 5078be712e4SBarry Smith MatPartitioningChacoGetEigenTol - Gets the eigensolver tolerance used by Chaco 5088be712e4SBarry Smith 5098be712e4SBarry Smith Not Collective 5108be712e4SBarry Smith 5118be712e4SBarry Smith Input Parameter: 5128be712e4SBarry Smith . part - the partitioning context 5138be712e4SBarry Smith 5148be712e4SBarry Smith Output Parameter: 5158be712e4SBarry Smith . tol - the tolerance 5168be712e4SBarry Smith 5178be712e4SBarry Smith Level: advanced 5188be712e4SBarry Smith 5198be712e4SBarry Smith .seealso: `MatPartitioningType`, `MatPartitioning`, `MATPARTITIONINGCHACO`, `MatPartitioningChacoSetEigenTol()` 5208be712e4SBarry Smith @*/ 5218be712e4SBarry Smith PetscErrorCode MatPartitioningChacoGetEigenTol(MatPartitioning part, PetscReal *tol) 5228be712e4SBarry Smith { 5238be712e4SBarry Smith PetscFunctionBegin; 5248be712e4SBarry Smith PetscValidHeaderSpecific(part, MAT_PARTITIONING_CLASSID, 1); 5258be712e4SBarry Smith PetscAssertPointer(tol, 2); 5268be712e4SBarry Smith PetscUseMethod(part, "MatPartitioningChacoGetEigenTol_C", (MatPartitioning, PetscReal *), (part, tol)); 5278be712e4SBarry Smith PetscFunctionReturn(PETSC_SUCCESS); 5288be712e4SBarry Smith } 5298be712e4SBarry Smith 5308be712e4SBarry Smith static PetscErrorCode MatPartitioningChacoGetEigenTol_Chaco(MatPartitioning part, PetscReal *tol) 5318be712e4SBarry Smith { 5328be712e4SBarry Smith MatPartitioning_Chaco *chaco = (MatPartitioning_Chaco *)part->data; 5338be712e4SBarry Smith 5348be712e4SBarry Smith PetscFunctionBegin; 5358be712e4SBarry Smith *tol = chaco->eigtol; 5368be712e4SBarry Smith PetscFunctionReturn(PETSC_SUCCESS); 5378be712e4SBarry Smith } 5388be712e4SBarry Smith 5398be712e4SBarry Smith /*@ 5408be712e4SBarry Smith MatPartitioningChacoSetEigenNumber - Sets the number of eigenvectors to compute by Chaco during partitioning 5418be712e4SBarry Smith during partitioning. 5428be712e4SBarry Smith 5438be712e4SBarry Smith Collective 5448be712e4SBarry Smith 5458be712e4SBarry Smith Input Parameters: 5468be712e4SBarry Smith + part - the partitioning context 5478be712e4SBarry Smith - num - the number of eigenvectors 5488be712e4SBarry Smith 5498be712e4SBarry Smith Options Database Key: 5508be712e4SBarry Smith . -mat_partitioning_chaco_eigen_number <n> - Number of eigenvectors 5518be712e4SBarry Smith 5528be712e4SBarry Smith Note: 5538be712e4SBarry Smith Accepted values are 1, 2 or 3, indicating partitioning by bisection, 5548be712e4SBarry Smith quadrisection, or octosection. 5558be712e4SBarry Smith 5568be712e4SBarry Smith Level: advanced 5578be712e4SBarry Smith 5588be712e4SBarry Smith .seealso: `MatPartitioningType`, `MatPartitioning`, `MATPARTITIONINGCHACO`, `MatPartitioningChacoSetEigenSolver()`, `MatPartitioningChacoGetEigenTol()` 5598be712e4SBarry Smith @*/ 5608be712e4SBarry Smith PetscErrorCode MatPartitioningChacoSetEigenNumber(MatPartitioning part, PetscInt num) 5618be712e4SBarry Smith { 5628be712e4SBarry Smith PetscFunctionBegin; 5638be712e4SBarry Smith PetscValidHeaderSpecific(part, MAT_PARTITIONING_CLASSID, 1); 5648be712e4SBarry Smith PetscValidLogicalCollectiveInt(part, num, 2); 5658be712e4SBarry Smith PetscTryMethod(part, "MatPartitioningChacoSetEigenNumber_C", (MatPartitioning, PetscInt), (part, num)); 5668be712e4SBarry Smith PetscFunctionReturn(PETSC_SUCCESS); 5678be712e4SBarry Smith } 5688be712e4SBarry Smith 5698be712e4SBarry Smith static PetscErrorCode MatPartitioningChacoSetEigenNumber_Chaco(MatPartitioning part, PetscInt num) 5708be712e4SBarry Smith { 5718be712e4SBarry Smith MatPartitioning_Chaco *chaco = (MatPartitioning_Chaco *)part->data; 5728be712e4SBarry Smith 5738be712e4SBarry Smith PetscFunctionBegin; 5748be712e4SBarry Smith if (num == PETSC_DEFAULT) chaco->eignum = 1; 5758be712e4SBarry Smith else { 5768be712e4SBarry Smith PetscCheck(num >= 1 && num <= 3, PetscObjectComm((PetscObject)part), PETSC_ERR_ARG_OUTOFRANGE, "Can only specify 1, 2 or 3 eigenvectors"); 5778be712e4SBarry Smith chaco->eignum = num; 5788be712e4SBarry Smith } 5798be712e4SBarry Smith PetscFunctionReturn(PETSC_SUCCESS); 5808be712e4SBarry Smith } 5818be712e4SBarry Smith 5828be712e4SBarry Smith /*@ 5838be712e4SBarry Smith MatPartitioningChacoGetEigenNumber - Gets the number of eigenvectors used by Chaco. 5848be712e4SBarry Smith 5858be712e4SBarry Smith Not Collective 5868be712e4SBarry Smith 5878be712e4SBarry Smith Input Parameter: 5888be712e4SBarry Smith . part - the partitioning context 5898be712e4SBarry Smith 5908be712e4SBarry Smith Output Parameter: 5918be712e4SBarry Smith . num - number of eigenvectors 5928be712e4SBarry Smith 5938be712e4SBarry Smith Level: advanced 5948be712e4SBarry Smith 5958be712e4SBarry Smith .seealso: `MatPartitioningType`, `MatPartitioning`, `MATPARTITIONINGCHACO`, `MatPartitioningChacoSetEigenNumber()` 5968be712e4SBarry Smith @*/ 5978be712e4SBarry Smith PetscErrorCode MatPartitioningChacoGetEigenNumber(MatPartitioning part, PetscInt *num) 5988be712e4SBarry Smith { 5998be712e4SBarry Smith PetscFunctionBegin; 6008be712e4SBarry Smith PetscValidHeaderSpecific(part, MAT_PARTITIONING_CLASSID, 1); 6018be712e4SBarry Smith PetscAssertPointer(num, 2); 6028be712e4SBarry Smith PetscUseMethod(part, "MatPartitioningChacoGetEigenNumber_C", (MatPartitioning, PetscInt *), (part, num)); 6038be712e4SBarry Smith PetscFunctionReturn(PETSC_SUCCESS); 6048be712e4SBarry Smith } 6058be712e4SBarry Smith 6068be712e4SBarry Smith static PetscErrorCode MatPartitioningChacoGetEigenNumber_Chaco(MatPartitioning part, PetscInt *num) 6078be712e4SBarry Smith { 6088be712e4SBarry Smith MatPartitioning_Chaco *chaco = (MatPartitioning_Chaco *)part->data; 6098be712e4SBarry Smith 6108be712e4SBarry Smith PetscFunctionBegin; 6118be712e4SBarry Smith *num = chaco->eignum; 6128be712e4SBarry Smith PetscFunctionReturn(PETSC_SUCCESS); 6138be712e4SBarry Smith } 6148be712e4SBarry Smith 6158be712e4SBarry Smith static PetscErrorCode MatPartitioningSetFromOptions_Chaco(MatPartitioning part, PetscOptionItems *PetscOptionsObject) 6168be712e4SBarry Smith { 6178be712e4SBarry Smith PetscInt i; 6188be712e4SBarry Smith PetscReal r; 6198be712e4SBarry Smith PetscBool flag; 6208be712e4SBarry Smith MatPartitioning_Chaco *chaco = (MatPartitioning_Chaco *)part->data; 6218be712e4SBarry Smith MPChacoGlobalType global; 6228be712e4SBarry Smith MPChacoLocalType local; 6238be712e4SBarry Smith MPChacoEigenType eigen; 6248be712e4SBarry Smith 6258be712e4SBarry Smith PetscFunctionBegin; 6268be712e4SBarry Smith PetscOptionsHeadBegin(PetscOptionsObject, "Chaco partitioning options"); 6278be712e4SBarry Smith PetscCall(PetscOptionsEnum("-mat_partitioning_chaco_global", "Global method", "MatPartitioningChacoSetGlobal", MPChacoGlobalTypes, (PetscEnum)chaco->global_method, (PetscEnum *)&global, &flag)); 6288be712e4SBarry Smith if (flag) PetscCall(MatPartitioningChacoSetGlobal(part, global)); 6298be712e4SBarry Smith PetscCall(PetscOptionsEnum("-mat_partitioning_chaco_local", "Local method", "MatPartitioningChacoSetLocal", MPChacoLocalTypes, (PetscEnum)chaco->local_method, (PetscEnum *)&local, &flag)); 6308be712e4SBarry Smith if (flag) PetscCall(MatPartitioningChacoSetLocal(part, local)); 6318be712e4SBarry Smith PetscCall(PetscOptionsReal("-mat_partitioning_chaco_coarse", "Coarse level", "MatPartitioningChacoSetCoarseLevel", 0.0, &r, &flag)); 6328be712e4SBarry Smith if (flag) PetscCall(MatPartitioningChacoSetCoarseLevel(part, r)); 6338be712e4SBarry Smith PetscCall(PetscOptionsEnum("-mat_partitioning_chaco_eigen_solver", "Eigensolver method", "MatPartitioningChacoSetEigenSolver", MPChacoEigenTypes, (PetscEnum)chaco->eigen_method, (PetscEnum *)&eigen, &flag)); 6348be712e4SBarry Smith if (flag) PetscCall(MatPartitioningChacoSetEigenSolver(part, eigen)); 6358be712e4SBarry Smith PetscCall(PetscOptionsReal("-mat_partitioning_chaco_eigen_tol", "Eigensolver tolerance", "MatPartitioningChacoSetEigenTol", chaco->eigtol, &r, &flag)); 6368be712e4SBarry Smith if (flag) PetscCall(MatPartitioningChacoSetEigenTol(part, r)); 6378be712e4SBarry Smith PetscCall(PetscOptionsInt("-mat_partitioning_chaco_eigen_number", "Number of eigenvectors: 1, 2, or 3 (bi-, quadri-, or octosection)", "MatPartitioningChacoSetEigenNumber", chaco->eignum, &i, &flag)); 6388be712e4SBarry Smith if (flag) PetscCall(MatPartitioningChacoSetEigenNumber(part, i)); 6398be712e4SBarry Smith PetscCall(PetscOptionsBool("-mat_partitioning_chaco_verbose", "Show library output", "", chaco->verbose, &chaco->verbose, NULL)); 6408be712e4SBarry Smith PetscOptionsHeadEnd(); 6418be712e4SBarry Smith PetscFunctionReturn(PETSC_SUCCESS); 6428be712e4SBarry Smith } 6438be712e4SBarry Smith 6448be712e4SBarry Smith static PetscErrorCode MatPartitioningDestroy_Chaco(MatPartitioning part) 6458be712e4SBarry Smith { 6468be712e4SBarry Smith MatPartitioning_Chaco *chaco = (MatPartitioning_Chaco *)part->data; 6478be712e4SBarry Smith 6488be712e4SBarry Smith PetscFunctionBegin; 6498be712e4SBarry Smith PetscCall(PetscFree(chaco)); 6508be712e4SBarry Smith /* clear composed functions */ 6518be712e4SBarry Smith PetscCall(PetscObjectComposeFunction((PetscObject)part, "MatPartitioningChacoSetGlobal_C", NULL)); 6528be712e4SBarry Smith PetscCall(PetscObjectComposeFunction((PetscObject)part, "MatPartitioningChacoGetGlobal_C", NULL)); 6538be712e4SBarry Smith PetscCall(PetscObjectComposeFunction((PetscObject)part, "MatPartitioningChacoSetLocal_C", NULL)); 6548be712e4SBarry Smith PetscCall(PetscObjectComposeFunction((PetscObject)part, "MatPartitioningChacoGetLocal_C", NULL)); 6558be712e4SBarry Smith PetscCall(PetscObjectComposeFunction((PetscObject)part, "MatPartitioningChacoSetCoarseLevel_C", NULL)); 6568be712e4SBarry Smith PetscCall(PetscObjectComposeFunction((PetscObject)part, "MatPartitioningChacoSetEigenSolver_C", NULL)); 6578be712e4SBarry Smith PetscCall(PetscObjectComposeFunction((PetscObject)part, "MatPartitioningChacoGetEigenSolver_C", NULL)); 6588be712e4SBarry Smith PetscCall(PetscObjectComposeFunction((PetscObject)part, "MatPartitioningChacoSetEigenTol_C", NULL)); 6598be712e4SBarry Smith PetscCall(PetscObjectComposeFunction((PetscObject)part, "MatPartitioningChacoGetEigenTol_C", NULL)); 6608be712e4SBarry Smith PetscCall(PetscObjectComposeFunction((PetscObject)part, "MatPartitioningChacoSetEigenNumber_C", NULL)); 6618be712e4SBarry Smith PetscCall(PetscObjectComposeFunction((PetscObject)part, "MatPartitioningChacoGetEigenNumber_C", NULL)); 6628be712e4SBarry Smith PetscFunctionReturn(PETSC_SUCCESS); 6638be712e4SBarry Smith } 6648be712e4SBarry Smith 6658be712e4SBarry Smith /*MC 666*613ce9feSSatish Balay MATPARTITIONINGCHACO - Creates a partitioning context that uses the external package Chaco {cite}`chaco95` 6678be712e4SBarry Smith 6688be712e4SBarry Smith Level: beginner 6698be712e4SBarry Smith 6708be712e4SBarry Smith Note: 6718be712e4SBarry Smith Does not use the `MatPartitioningSetUseEdgeWeights()` option 6728be712e4SBarry Smith 673*613ce9feSSatish Balay .seealso: `MatPartitioning`, `MatPartitioningSetType()`, `MatPartitioningType` 6748be712e4SBarry Smith M*/ 6758be712e4SBarry Smith 6768be712e4SBarry Smith PETSC_EXTERN PetscErrorCode MatPartitioningCreate_Chaco(MatPartitioning part) 6778be712e4SBarry Smith { 6788be712e4SBarry Smith MatPartitioning_Chaco *chaco; 6798be712e4SBarry Smith 6808be712e4SBarry Smith PetscFunctionBegin; 6818be712e4SBarry Smith PetscCall(PetscNew(&chaco)); 6828be712e4SBarry Smith part->data = (void *)chaco; 6838be712e4SBarry Smith 6848be712e4SBarry Smith chaco->global_method = MP_CHACO_MULTILEVEL; 6858be712e4SBarry Smith chaco->local_method = MP_CHACO_KERNIGHAN; 6868be712e4SBarry Smith chaco->eigen_method = MP_CHACO_LANCZOS; 6878be712e4SBarry Smith chaco->nbvtxcoarsed = 200; 6888be712e4SBarry Smith chaco->eignum = 1; 6898be712e4SBarry Smith chaco->eigtol = 0.001; 6908be712e4SBarry Smith chaco->verbose = PETSC_FALSE; 6918be712e4SBarry Smith 6928be712e4SBarry Smith part->ops->apply = MatPartitioningApply_Chaco; 6938be712e4SBarry Smith part->ops->view = MatPartitioningView_Chaco; 6948be712e4SBarry Smith part->ops->destroy = MatPartitioningDestroy_Chaco; 6958be712e4SBarry Smith part->ops->setfromoptions = MatPartitioningSetFromOptions_Chaco; 6968be712e4SBarry Smith 6978be712e4SBarry Smith PetscCall(PetscObjectComposeFunction((PetscObject)part, "MatPartitioningChacoSetGlobal_C", MatPartitioningChacoSetGlobal_Chaco)); 6988be712e4SBarry Smith PetscCall(PetscObjectComposeFunction((PetscObject)part, "MatPartitioningChacoGetGlobal_C", MatPartitioningChacoGetGlobal_Chaco)); 6998be712e4SBarry Smith PetscCall(PetscObjectComposeFunction((PetscObject)part, "MatPartitioningChacoSetLocal_C", MatPartitioningChacoSetLocal_Chaco)); 7008be712e4SBarry Smith PetscCall(PetscObjectComposeFunction((PetscObject)part, "MatPartitioningChacoGetLocal_C", MatPartitioningChacoGetLocal_Chaco)); 7018be712e4SBarry Smith PetscCall(PetscObjectComposeFunction((PetscObject)part, "MatPartitioningChacoSetCoarseLevel_C", MatPartitioningChacoSetCoarseLevel_Chaco)); 7028be712e4SBarry Smith PetscCall(PetscObjectComposeFunction((PetscObject)part, "MatPartitioningChacoSetEigenSolver_C", MatPartitioningChacoSetEigenSolver_Chaco)); 7038be712e4SBarry Smith PetscCall(PetscObjectComposeFunction((PetscObject)part, "MatPartitioningChacoGetEigenSolver_C", MatPartitioningChacoGetEigenSolver_Chaco)); 7048be712e4SBarry Smith PetscCall(PetscObjectComposeFunction((PetscObject)part, "MatPartitioningChacoSetEigenTol_C", MatPartitioningChacoSetEigenTol_Chaco)); 7058be712e4SBarry Smith PetscCall(PetscObjectComposeFunction((PetscObject)part, "MatPartitioningChacoGetEigenTol_C", MatPartitioningChacoGetEigenTol_Chaco)); 7068be712e4SBarry Smith PetscCall(PetscObjectComposeFunction((PetscObject)part, "MatPartitioningChacoSetEigenNumber_C", MatPartitioningChacoSetEigenNumber_Chaco)); 7078be712e4SBarry Smith PetscCall(PetscObjectComposeFunction((PetscObject)part, "MatPartitioningChacoGetEigenNumber_C", MatPartitioningChacoGetEigenNumber_Chaco)); 7088be712e4SBarry Smith PetscFunctionReturn(PETSC_SUCCESS); 7098be712e4SBarry Smith } 710