xref: /petsc/src/mat/graphops/partition/impls/party/party.c (revision 8838bf166a5dcd11a3e89db66de7a74944683c57)
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 EXTERN_C_BEGIN
88be712e4SBarry Smith #include <party_lib.h>
98be712e4SBarry Smith EXTERN_C_END
108be712e4SBarry Smith 
118be712e4SBarry Smith typedef struct {
128be712e4SBarry Smith   PetscBool redm;
138be712e4SBarry Smith   PetscBool redo;
148be712e4SBarry Smith   PetscBool recursive;
158be712e4SBarry Smith   PetscBool verbose;
168be712e4SBarry Smith   char      global[15];   /* global method */
178be712e4SBarry Smith   char      local[15];    /* local method */
188be712e4SBarry Smith   PetscInt  nbvtxcoarsed; /* number of vertices for the coarse graph */
198be712e4SBarry Smith } MatPartitioning_Party;
208be712e4SBarry Smith 
218be712e4SBarry Smith #define SIZE_LOG 10000 /* size of buffer for mesg_log */
228be712e4SBarry Smith 
MatPartitioningApply_Party(MatPartitioning part,IS * partitioning)238be712e4SBarry Smith static PetscErrorCode MatPartitioningApply_Party(MatPartitioning part, IS *partitioning)
248be712e4SBarry Smith {
258be712e4SBarry Smith   int                    perr;
268be712e4SBarry Smith   PetscInt               i, *parttab, *locals, nb_locals, M, N;
278be712e4SBarry Smith   PetscMPIInt            size, rank;
288be712e4SBarry Smith   Mat                    mat = part->adj, matAdj, matSeq, *A;
298be712e4SBarry Smith   Mat_MPIAdj            *adj;
308be712e4SBarry Smith   MatPartitioning_Party *party = (MatPartitioning_Party *)part->data;
318be712e4SBarry Smith   PetscBool              flg;
328be712e4SBarry Smith   IS                     isrow, iscol;
338be712e4SBarry Smith   int                    n, *edge_p, *edge, *vertex_w, p, *part_party, cutsize, redl, rec;
348be712e4SBarry Smith   const char            *redm, *redo;
358be712e4SBarry Smith   char                  *mesg_log;
368be712e4SBarry Smith #if defined(PETSC_HAVE_UNISTD_H)
378be712e4SBarry Smith   int fd_stdout, fd_pipe[2], count;
388be712e4SBarry Smith #endif
398be712e4SBarry Smith 
408be712e4SBarry Smith   PetscFunctionBegin;
418be712e4SBarry Smith   PetscCheck(!part->use_edge_weights, PetscObjectComm((PetscObject)part), PETSC_ERR_SUP, "Party does not support edge weights");
428be712e4SBarry Smith   PetscCallMPI(MPI_Comm_size(PetscObjectComm((PetscObject)mat), &size));
438be712e4SBarry Smith   PetscCallMPI(MPI_Comm_rank(PetscObjectComm((PetscObject)mat), &rank));
448be712e4SBarry Smith   PetscCall(PetscObjectTypeCompare((PetscObject)mat, MATMPIADJ, &flg));
458be712e4SBarry Smith   if (size > 1) {
468be712e4SBarry Smith     if (flg) {
478be712e4SBarry Smith       PetscCall(MatMPIAdjToSeq(mat, &matSeq));
488be712e4SBarry Smith     } else {
498be712e4SBarry Smith       PetscCall(PetscInfo(part, "Converting distributed matrix to sequential: this could be a performance loss\n"));
508be712e4SBarry Smith       PetscCall(MatGetSize(mat, &M, &N));
518be712e4SBarry Smith       PetscCall(ISCreateStride(PETSC_COMM_SELF, M, 0, 1, &isrow));
528be712e4SBarry Smith       PetscCall(ISCreateStride(PETSC_COMM_SELF, N, 0, 1, &iscol));
538be712e4SBarry Smith       PetscCall(MatCreateSubMatrices(mat, 1, &isrow, &iscol, MAT_INITIAL_MATRIX, &A));
548be712e4SBarry Smith       PetscCall(ISDestroy(&isrow));
558be712e4SBarry Smith       PetscCall(ISDestroy(&iscol));
568be712e4SBarry Smith       matSeq = *A;
578be712e4SBarry Smith       PetscCall(PetscFree(A));
588be712e4SBarry Smith     }
598be712e4SBarry Smith   } else {
608be712e4SBarry Smith     PetscCall(PetscObjectReference((PetscObject)mat));
618be712e4SBarry Smith     matSeq = mat;
628be712e4SBarry Smith   }
638be712e4SBarry Smith 
648be712e4SBarry Smith   if (!flg) { /* convert regular matrix to MPIADJ */
658be712e4SBarry Smith     PetscCall(MatConvert(matSeq, MATMPIADJ, MAT_INITIAL_MATRIX, &matAdj));
668be712e4SBarry Smith   } else {
678be712e4SBarry Smith     PetscCall(PetscObjectReference((PetscObject)matSeq));
688be712e4SBarry Smith     matAdj = matSeq;
698be712e4SBarry Smith   }
708be712e4SBarry Smith 
718be712e4SBarry Smith   adj = (Mat_MPIAdj *)matAdj->data; /* finally adj contains adjacency graph */
728be712e4SBarry Smith 
738be712e4SBarry Smith   /* arguments for Party library */
748be712e4SBarry Smith   n        = mat->rmap->N;             /* number of vertices in full graph */
758be712e4SBarry Smith   edge_p   = adj->i;                   /* start of edge list for each vertex */
768be712e4SBarry Smith   edge     = adj->j;                   /* edge list data */
778be712e4SBarry Smith   vertex_w = part->vertex_weights;     /* weights for all vertices */
788be712e4SBarry Smith   p        = part->n;                  /* number of parts to create */
798be712e4SBarry Smith   redl     = party->nbvtxcoarsed;      /* how many vertices to coarsen down to? */
808be712e4SBarry Smith   rec      = party->recursive ? 1 : 0; /* recursive bisection */
818be712e4SBarry Smith   redm     = party->redm ? "lam" : ""; /* matching method */
828be712e4SBarry Smith   redo     = party->redo ? "w3" : "";  /* matching optimization method */
838be712e4SBarry Smith 
848be712e4SBarry Smith   PetscCall(PetscMalloc1(mat->rmap->N, &part_party));
858be712e4SBarry Smith 
868be712e4SBarry Smith   /* redirect output to buffer */
878be712e4SBarry Smith #if defined(PETSC_HAVE_UNISTD_H)
888be712e4SBarry Smith   fd_stdout = dup(1);
898be712e4SBarry Smith   PetscCheck(!pipe(fd_pipe), PETSC_COMM_SELF, PETSC_ERR_SYS, "Could not open pipe");
908be712e4SBarry Smith   close(1);
918be712e4SBarry Smith   dup2(fd_pipe[1], 1);
928be712e4SBarry Smith   PetscCall(PetscMalloc1(SIZE_LOG, &mesg_log));
938be712e4SBarry Smith #endif
948be712e4SBarry Smith 
958be712e4SBarry Smith   /* library call */
968be712e4SBarry Smith   party_lib_times_start();
978be712e4SBarry Smith   perr = party_lib(n, vertex_w, NULL, NULL, NULL, edge_p, edge, NULL, p, part_party, &cutsize, redl, (char *)redm, (char *)redo, party->global, party->local, rec, 1);
988be712e4SBarry Smith 
998be712e4SBarry Smith   party_lib_times_output(1);
1008be712e4SBarry Smith   part_info(n, vertex_w, edge_p, edge, NULL, p, part_party, 1);
1018be712e4SBarry Smith 
1028be712e4SBarry Smith #if defined(PETSC_HAVE_UNISTD_H)
1038be712e4SBarry Smith   PetscCall(PetscFFlush(stdout));
1048be712e4SBarry Smith   count = read(fd_pipe[0], mesg_log, (SIZE_LOG - 1) * sizeof(char));
1058be712e4SBarry Smith   if (count < 0) count = 0;
1068be712e4SBarry Smith   mesg_log[count] = 0;
1078be712e4SBarry Smith   close(1);
1088be712e4SBarry Smith   dup2(fd_stdout, 1);
1098be712e4SBarry Smith   close(fd_stdout);
1108be712e4SBarry Smith   close(fd_pipe[0]);
1118be712e4SBarry Smith   close(fd_pipe[1]);
1128be712e4SBarry Smith   if (party->verbose) PetscCall(PetscPrintf(PetscObjectComm((PetscObject)mat), "%s", mesg_log));
1138be712e4SBarry Smith   PetscCall(PetscFree(mesg_log));
1148be712e4SBarry Smith #endif
1158be712e4SBarry Smith   PetscCheck(!perr, PETSC_COMM_SELF, PETSC_ERR_LIB, "Party failed");
1168be712e4SBarry Smith 
1178be712e4SBarry Smith   PetscCall(PetscMalloc1(mat->rmap->N, &parttab));
1188be712e4SBarry Smith   for (i = 0; i < mat->rmap->N; i++) parttab[i] = part_party[i];
1198be712e4SBarry Smith 
1208be712e4SBarry Smith   /* creation of the index set */
1218be712e4SBarry Smith   nb_locals = mat->rmap->n;
1228be712e4SBarry Smith   locals    = parttab + mat->rmap->rstart;
1238be712e4SBarry Smith 
1248be712e4SBarry Smith   PetscCall(ISCreateGeneral(PetscObjectComm((PetscObject)part), nb_locals, locals, PETSC_COPY_VALUES, partitioning));
1258be712e4SBarry Smith 
1268be712e4SBarry Smith   /* clean up */
1278be712e4SBarry Smith   PetscCall(PetscFree(parttab));
1288be712e4SBarry Smith   PetscCall(PetscFree(part_party));
1298be712e4SBarry Smith   PetscCall(MatDestroy(&matSeq));
1308be712e4SBarry Smith   PetscCall(MatDestroy(&matAdj));
1318be712e4SBarry Smith   PetscFunctionReturn(PETSC_SUCCESS);
1328be712e4SBarry Smith }
1338be712e4SBarry Smith 
MatPartitioningView_Party(MatPartitioning part,PetscViewer viewer)1348be712e4SBarry Smith static PetscErrorCode MatPartitioningView_Party(MatPartitioning part, PetscViewer viewer)
1358be712e4SBarry Smith {
1368be712e4SBarry Smith   MatPartitioning_Party *party = (MatPartitioning_Party *)part->data;
1378be712e4SBarry Smith   PetscBool              isascii;
1388be712e4SBarry Smith 
1398be712e4SBarry Smith   PetscFunctionBegin;
1408be712e4SBarry Smith   PetscCall(PetscObjectTypeCompare((PetscObject)viewer, PETSCVIEWERASCII, &isascii));
1418be712e4SBarry Smith   if (isascii) {
1428be712e4SBarry Smith     PetscCall(PetscViewerASCIIPrintf(viewer, "  Global method: %s\n", party->global));
1438be712e4SBarry Smith     PetscCall(PetscViewerASCIIPrintf(viewer, "  Local method: %s\n", party->local));
1448be712e4SBarry Smith     PetscCall(PetscViewerASCIIPrintf(viewer, "  Number of vertices for the coarse graph: %d\n", party->nbvtxcoarsed));
1458be712e4SBarry Smith     if (party->redm) PetscCall(PetscViewerASCIIPrintf(viewer, "  Using matching method for graph reduction\n"));
1468be712e4SBarry Smith     if (party->redo) PetscCall(PetscViewerASCIIPrintf(viewer, "  Using matching optimization\n"));
1478be712e4SBarry Smith     if (party->recursive) PetscCall(PetscViewerASCIIPrintf(viewer, "  Using recursive bipartitioning\n"));
1488be712e4SBarry Smith   }
1498be712e4SBarry Smith   PetscFunctionReturn(PETSC_SUCCESS);
1508be712e4SBarry Smith }
1518be712e4SBarry Smith 
152cc4c1da9SBarry Smith /*@
1538be712e4SBarry Smith   MatPartitioningPartySetGlobal - Set global method for Party partitioner.
1548be712e4SBarry Smith 
1558be712e4SBarry Smith   Collective
1568be712e4SBarry Smith 
1578be712e4SBarry Smith   Input Parameters:
1588be712e4SBarry Smith + part   - the partitioning context
1598be712e4SBarry Smith - global - a string representing the method
1608be712e4SBarry Smith 
1618be712e4SBarry Smith   Options Database Key:
1628be712e4SBarry Smith . -mat_partitioning_party_global <method> - the global method
1638be712e4SBarry Smith 
1648be712e4SBarry Smith   Level: advanced
1658be712e4SBarry Smith 
1668be712e4SBarry Smith   Note:
1678be712e4SBarry Smith   The method may be one of `MP_PARTY_OPT`, `MP_PARTY_LIN`, `MP_PARTY_SCA`,
1688be712e4SBarry Smith   `MP_PARTY_RAN`, `MP_PARTY_GBF`, `MP_PARTY_GCF`, `MP_PARTY_BUB` or `MP_PARTY_DEF`, or
1698be712e4SBarry Smith   alternatively a string describing the method. Two or more methods can be
1708be712e4SBarry Smith   combined like "gbf,gcf". Check the Party Library Users Manual for details.
1718be712e4SBarry Smith 
172a3b724e8SBarry Smith   Developer Note:
173a3b724e8SBarry Smith   Should be `MatPartitioningPartySetGlobalType()` and all uses of method should be changed to type
174a3b724e8SBarry Smith 
1758be712e4SBarry Smith .seealso: `MATPARTITIONINGPARTY`, `MatPartitioningPartySetLocal()`
1768be712e4SBarry Smith @*/
MatPartitioningPartySetGlobal(MatPartitioning part,const char * global)1778be712e4SBarry Smith PetscErrorCode MatPartitioningPartySetGlobal(MatPartitioning part, const char *global)
1788be712e4SBarry Smith {
1798be712e4SBarry Smith   PetscFunctionBegin;
1808be712e4SBarry Smith   PetscValidHeaderSpecific(part, MAT_PARTITIONING_CLASSID, 1);
1818be712e4SBarry Smith   PetscTryMethod(part, "MatPartitioningPartySetGlobal_C", (MatPartitioning, const char *), (part, global));
1828be712e4SBarry Smith   PetscFunctionReturn(PETSC_SUCCESS);
1838be712e4SBarry Smith }
1848be712e4SBarry Smith 
MatPartitioningPartySetGlobal_Party(MatPartitioning part,const char * global)1858be712e4SBarry Smith static PetscErrorCode MatPartitioningPartySetGlobal_Party(MatPartitioning part, const char *global)
1868be712e4SBarry Smith {
1878be712e4SBarry Smith   MatPartitioning_Party *party = (MatPartitioning_Party *)part->data;
1888be712e4SBarry Smith 
1898be712e4SBarry Smith   PetscFunctionBegin;
1908be712e4SBarry Smith   PetscCall(PetscStrncpy(party->global, global, 15));
1918be712e4SBarry Smith   PetscFunctionReturn(PETSC_SUCCESS);
1928be712e4SBarry Smith }
1938be712e4SBarry Smith 
194cc4c1da9SBarry Smith /*@
1958be712e4SBarry Smith   MatPartitioningPartySetLocal - Set local method used by the Party partitioner.
1968be712e4SBarry Smith 
1978be712e4SBarry Smith   Collective
1988be712e4SBarry Smith 
1998be712e4SBarry Smith   Input Parameters:
2008be712e4SBarry Smith + part  - the partitioning context
2018be712e4SBarry Smith - local - a string representing the method
2028be712e4SBarry Smith 
2038be712e4SBarry Smith   Options Database Key:
2048be712e4SBarry Smith . -mat_partitioning_party_local <method> - the local method
2058be712e4SBarry Smith 
2068be712e4SBarry Smith   Level: advanced
2078be712e4SBarry Smith 
2088be712e4SBarry Smith   Note:
2098be712e4SBarry Smith   The method may be one of `MP_PARTY_HELPFUL_SETS`, `MP_PARTY_KERNIGHAN_LIN`, or
2108be712e4SBarry Smith   `MP_PARTY_NONE`. Check the Party Library Users Manual for details.
2118be712e4SBarry Smith 
212a3b724e8SBarry Smith   Developer Note:
213a3b724e8SBarry Smith   Should be `MatPartitioningPartySetLocalType()` and all uses of method should be changed to type
214a3b724e8SBarry Smith 
2158be712e4SBarry Smith .seealso: `MATPARTITIONINGPARTY`, `MatPartitioningPartySetGlobal()`
2168be712e4SBarry Smith @*/
MatPartitioningPartySetLocal(MatPartitioning part,const char * local)2178be712e4SBarry Smith PetscErrorCode MatPartitioningPartySetLocal(MatPartitioning part, const char *local)
2188be712e4SBarry Smith {
2198be712e4SBarry Smith   PetscFunctionBegin;
2208be712e4SBarry Smith   PetscValidHeaderSpecific(part, MAT_PARTITIONING_CLASSID, 1);
2218be712e4SBarry Smith   PetscTryMethod(part, "MatPartitioningPartySetLocal_C", (MatPartitioning, const char *), (part, local));
2228be712e4SBarry Smith   PetscFunctionReturn(PETSC_SUCCESS);
2238be712e4SBarry Smith }
2248be712e4SBarry Smith 
MatPartitioningPartySetLocal_Party(MatPartitioning part,const char * local)2258be712e4SBarry Smith static PetscErrorCode MatPartitioningPartySetLocal_Party(MatPartitioning part, const char *local)
2268be712e4SBarry Smith {
2278be712e4SBarry Smith   MatPartitioning_Party *party = (MatPartitioning_Party *)part->data;
2288be712e4SBarry Smith 
2298be712e4SBarry Smith   PetscFunctionBegin;
2308be712e4SBarry Smith   PetscCall(PetscStrncpy(party->local, local, 15));
2318be712e4SBarry Smith   PetscFunctionReturn(PETSC_SUCCESS);
2328be712e4SBarry Smith }
2338be712e4SBarry Smith 
2348be712e4SBarry Smith /*@
2358be712e4SBarry Smith   MatPartitioningPartySetCoarseLevel - Set the coarse level parameter for the
2368be712e4SBarry Smith   Party partitioner.
2378be712e4SBarry Smith 
2388be712e4SBarry Smith   Collective
2398be712e4SBarry Smith 
2408be712e4SBarry Smith   Input Parameters:
2418be712e4SBarry Smith + part  - the partitioning context
2428be712e4SBarry Smith - level - the coarse level in range [0.0,1.0]
2438be712e4SBarry Smith 
2448be712e4SBarry Smith   Options Database Key:
2458be712e4SBarry Smith . -mat_partitioning_party_coarse <l> - Coarse level
2468be712e4SBarry Smith 
2478be712e4SBarry Smith   Level: advanced
2488be712e4SBarry Smith 
2498be712e4SBarry Smith .seealso: `MATPARTITIONINGPARTY`
2508be712e4SBarry Smith @*/
MatPartitioningPartySetCoarseLevel(MatPartitioning part,PetscReal level)2518be712e4SBarry Smith PetscErrorCode MatPartitioningPartySetCoarseLevel(MatPartitioning part, PetscReal level)
2528be712e4SBarry Smith {
2538be712e4SBarry Smith   PetscFunctionBegin;
2548be712e4SBarry Smith   PetscValidHeaderSpecific(part, MAT_PARTITIONING_CLASSID, 1);
2558be712e4SBarry Smith   PetscValidLogicalCollectiveReal(part, level, 2);
2568be712e4SBarry Smith   PetscTryMethod(part, "MatPartitioningPartySetCoarseLevel_C", (MatPartitioning, PetscReal), (part, level));
2578be712e4SBarry Smith   PetscFunctionReturn(PETSC_SUCCESS);
2588be712e4SBarry Smith }
2598be712e4SBarry Smith 
MatPartitioningPartySetCoarseLevel_Party(MatPartitioning part,PetscReal level)2608be712e4SBarry Smith static PetscErrorCode MatPartitioningPartySetCoarseLevel_Party(MatPartitioning part, PetscReal level)
2618be712e4SBarry Smith {
2628be712e4SBarry Smith   MatPartitioning_Party *party = (MatPartitioning_Party *)part->data;
2638be712e4SBarry Smith 
2648be712e4SBarry Smith   PetscFunctionBegin;
2658be712e4SBarry Smith   PetscCheck(level >= 0.0 && level <= 1.0, PETSC_COMM_SELF, PETSC_ERR_ARG_OUTOFRANGE, "Party: level of coarsening out of range [0.0-1.0]");
2668be712e4SBarry Smith   party->nbvtxcoarsed = (PetscInt)(part->adj->cmap->N * level);
2678be712e4SBarry Smith   if (party->nbvtxcoarsed < 20) party->nbvtxcoarsed = 20;
2688be712e4SBarry Smith   PetscFunctionReturn(PETSC_SUCCESS);
2698be712e4SBarry Smith }
2708be712e4SBarry Smith 
2718be712e4SBarry Smith /*@
2728be712e4SBarry Smith   MatPartitioningPartySetMatchOptimization - Activate matching optimization for
2738be712e4SBarry Smith   graph reduction.
2748be712e4SBarry Smith 
2758be712e4SBarry Smith   Collective
2768be712e4SBarry Smith 
2778be712e4SBarry Smith   Input Parameters:
2788be712e4SBarry Smith + part - the partitioning context
2798be712e4SBarry Smith - opt  - boolean flag
2808be712e4SBarry Smith 
2818be712e4SBarry Smith   Options Database Key:
2828be712e4SBarry Smith . -mat_partitioning_party_match_optimization - Matching optimization on/off
2838be712e4SBarry Smith 
2848be712e4SBarry Smith   Level: advanced
2858be712e4SBarry Smith 
2868be712e4SBarry Smith .seealso: `MATPARTITIONINGPARTY`
2878be712e4SBarry Smith @*/
MatPartitioningPartySetMatchOptimization(MatPartitioning part,PetscBool opt)2888be712e4SBarry Smith PetscErrorCode MatPartitioningPartySetMatchOptimization(MatPartitioning part, PetscBool opt)
2898be712e4SBarry Smith {
2908be712e4SBarry Smith   PetscFunctionBegin;
2918be712e4SBarry Smith   PetscValidHeaderSpecific(part, MAT_PARTITIONING_CLASSID, 1);
2928be712e4SBarry Smith   PetscValidLogicalCollectiveBool(part, opt, 2);
2938be712e4SBarry Smith   PetscTryMethod(part, "MatPartitioningPartySetMatchOptimization_C", (MatPartitioning, PetscBool), (part, opt));
2948be712e4SBarry Smith   PetscFunctionReturn(PETSC_SUCCESS);
2958be712e4SBarry Smith }
2968be712e4SBarry Smith 
MatPartitioningPartySetMatchOptimization_Party(MatPartitioning part,PetscBool opt)2978be712e4SBarry Smith static PetscErrorCode MatPartitioningPartySetMatchOptimization_Party(MatPartitioning part, PetscBool opt)
2988be712e4SBarry Smith {
2998be712e4SBarry Smith   MatPartitioning_Party *party = (MatPartitioning_Party *)part->data;
3008be712e4SBarry Smith 
3018be712e4SBarry Smith   PetscFunctionBegin;
3028be712e4SBarry Smith   party->redo = opt;
3038be712e4SBarry Smith   PetscFunctionReturn(PETSC_SUCCESS);
3048be712e4SBarry Smith }
3058be712e4SBarry Smith 
3068be712e4SBarry Smith /*@
3078be712e4SBarry Smith   MatPartitioningPartySetBipart - Activate or deactivate recursive bisection in the Party partitioner
3088be712e4SBarry Smith 
3098be712e4SBarry Smith   Collective
3108be712e4SBarry Smith 
3118be712e4SBarry Smith   Input Parameters:
3128be712e4SBarry Smith + part - the partitioning context
3138be712e4SBarry Smith - bp   - boolean flag
3148be712e4SBarry Smith 
3158be712e4SBarry Smith   Options Database Key:
3168be712e4SBarry Smith . -mat_partitioning_party_bipart - Bipartitioning option on/off
3178be712e4SBarry Smith 
3188be712e4SBarry Smith   Level: advanced
3198be712e4SBarry Smith 
3208be712e4SBarry Smith .seealso: `MATPARTITIONINGPARTY`
3218be712e4SBarry Smith @*/
MatPartitioningPartySetBipart(MatPartitioning part,PetscBool bp)3228be712e4SBarry Smith PetscErrorCode MatPartitioningPartySetBipart(MatPartitioning part, PetscBool bp)
3238be712e4SBarry Smith {
3248be712e4SBarry Smith   PetscFunctionBegin;
3258be712e4SBarry Smith   PetscValidHeaderSpecific(part, MAT_PARTITIONING_CLASSID, 1);
3268be712e4SBarry Smith   PetscValidLogicalCollectiveBool(part, bp, 2);
3278be712e4SBarry Smith   PetscTryMethod(part, "MatPartitioningPartySetBipart_C", (MatPartitioning, PetscBool), (part, bp));
3288be712e4SBarry Smith   PetscFunctionReturn(PETSC_SUCCESS);
3298be712e4SBarry Smith }
3308be712e4SBarry Smith 
MatPartitioningPartySetBipart_Party(MatPartitioning part,PetscBool bp)3318be712e4SBarry Smith static PetscErrorCode MatPartitioningPartySetBipart_Party(MatPartitioning part, PetscBool bp)
3328be712e4SBarry Smith {
3338be712e4SBarry Smith   MatPartitioning_Party *party = (MatPartitioning_Party *)part->data;
3348be712e4SBarry Smith 
3358be712e4SBarry Smith   PetscFunctionBegin;
3368be712e4SBarry Smith   party->recursive = bp;
3378be712e4SBarry Smith   PetscFunctionReturn(PETSC_SUCCESS);
3388be712e4SBarry Smith }
3398be712e4SBarry Smith 
MatPartitioningSetFromOptions_Party(MatPartitioning part,PetscOptionItems PetscOptionsObject)340*ce78bad3SBarry Smith static PetscErrorCode MatPartitioningSetFromOptions_Party(MatPartitioning part, PetscOptionItems PetscOptionsObject)
3418be712e4SBarry Smith {
3428be712e4SBarry Smith   PetscBool              flag;
3438be712e4SBarry Smith   char                   value[256];
3448be712e4SBarry Smith   PetscReal              r;
3458be712e4SBarry Smith   MatPartitioning_Party *party = (MatPartitioning_Party *)part->data;
3468be712e4SBarry Smith 
3478be712e4SBarry Smith   PetscFunctionBegin;
3488be712e4SBarry Smith   PetscOptionsHeadBegin(PetscOptionsObject, "Set Party partitioning options");
3498be712e4SBarry Smith   PetscCall(PetscOptionsString("-mat_partitioning_party_global", "Global method", "MatPartitioningPartySetGlobal", party->global, value, sizeof(value), &flag));
3508be712e4SBarry Smith   if (flag) PetscCall(MatPartitioningPartySetGlobal(part, value));
3518be712e4SBarry Smith   PetscCall(PetscOptionsString("-mat_partitioning_party_local", "Local method", "MatPartitioningPartySetLocal", party->local, value, sizeof(value), &flag));
3528be712e4SBarry Smith   if (flag) PetscCall(MatPartitioningPartySetLocal(part, value));
3538be712e4SBarry Smith   PetscCall(PetscOptionsReal("-mat_partitioning_party_coarse", "Coarse level", "MatPartitioningPartySetCoarseLevel", 0.0, &r, &flag));
3548be712e4SBarry Smith   if (flag) PetscCall(MatPartitioningPartySetCoarseLevel(part, r));
3558be712e4SBarry Smith   PetscCall(PetscOptionsBool("-mat_partitioning_party_match_optimization", "Matching optimization on/off", "MatPartitioningPartySetMatchOptimization", party->redo, &party->redo, NULL));
3568be712e4SBarry Smith   PetscCall(PetscOptionsBool("-mat_partitioning_party_bipart", "Bipartitioning on/off", "MatPartitioningPartySetBipart", party->recursive, &party->recursive, NULL));
3578be712e4SBarry Smith   PetscCall(PetscOptionsBool("-mat_partitioning_party_verbose", "Show library output", "", party->verbose, &party->verbose, NULL));
3588be712e4SBarry Smith   PetscOptionsHeadEnd();
3598be712e4SBarry Smith   PetscFunctionReturn(PETSC_SUCCESS);
3608be712e4SBarry Smith }
3618be712e4SBarry Smith 
MatPartitioningDestroy_Party(MatPartitioning part)3628be712e4SBarry Smith static PetscErrorCode MatPartitioningDestroy_Party(MatPartitioning part)
3638be712e4SBarry Smith {
3648be712e4SBarry Smith   MatPartitioning_Party *party = (MatPartitioning_Party *)part->data;
3658be712e4SBarry Smith 
3668be712e4SBarry Smith   PetscFunctionBegin;
3678be712e4SBarry Smith   PetscCall(PetscFree(party));
3688be712e4SBarry Smith   /* clear composed functions */
3698be712e4SBarry Smith   PetscCall(PetscObjectComposeFunction((PetscObject)part, "MatPartitioningPartySetGlobal_C", NULL));
3708be712e4SBarry Smith   PetscCall(PetscObjectComposeFunction((PetscObject)part, "MatPartitioningPartySetLocal_C", NULL));
3718be712e4SBarry Smith   PetscCall(PetscObjectComposeFunction((PetscObject)part, "MatPartitioningPartySetCoarseLevel_C", NULL));
3728be712e4SBarry Smith   PetscCall(PetscObjectComposeFunction((PetscObject)part, "MatPartitioningPartySetMatchOptimization_C", NULL));
3738be712e4SBarry Smith   PetscCall(PetscObjectComposeFunction((PetscObject)part, "MatPartitioningPartySetBipart_C", NULL));
3748be712e4SBarry Smith   PetscFunctionReturn(PETSC_SUCCESS);
3758be712e4SBarry Smith }
3768be712e4SBarry Smith 
3778be712e4SBarry Smith /*MC
378613ce9feSSatish Balay    MATPARTITIONINGPARTY - Creates a partitioning context via the external package Party <
379613ce9feSSatish Balay    http://wwwcs.upb.de/fachbereich/AG/monien/RESEARCH/PART/party.htm>.
3808be712e4SBarry Smith 
3818be712e4SBarry Smith    Level: beginner
3828be712e4SBarry Smith 
383613ce9feSSatish Balay    Note:
3848be712e4SBarry Smith    Does not support the `MatPartitioningSetUseEdgeWeights()` option
3858be712e4SBarry Smith 
3868be712e4SBarry Smith .seealso: `MatPartitioningSetType()`, `MatPartitioningType`, `MatPartitioningPartySetGlobal()`, `MatPartitioningPartySetLocal()`,
3878be712e4SBarry Smith           `MatPartitioningPartySetCoarseLevel()`, `MatPartitioningPartySetMatchOptimization()`, `MatPartitioningPartySetBipart()`
3888be712e4SBarry Smith M*/
3898be712e4SBarry Smith 
MatPartitioningCreate_Party(MatPartitioning part)3908be712e4SBarry Smith PETSC_EXTERN PetscErrorCode MatPartitioningCreate_Party(MatPartitioning part)
3918be712e4SBarry Smith {
3928be712e4SBarry Smith   MatPartitioning_Party *party;
3938be712e4SBarry Smith 
3948be712e4SBarry Smith   PetscFunctionBegin;
3958be712e4SBarry Smith   PetscCall(PetscNew(&party));
3968be712e4SBarry Smith   part->data = (void *)party;
3978be712e4SBarry Smith 
3988be712e4SBarry Smith   PetscCall(PetscStrncpy(party->global, "gcf,gbf", sizeof(party->global)));
3998be712e4SBarry Smith   PetscCall(PetscStrncpy(party->local, "kl", sizeof(party->local)));
4008be712e4SBarry Smith 
4018be712e4SBarry Smith   party->redm         = PETSC_TRUE;
4028be712e4SBarry Smith   party->redo         = PETSC_TRUE;
4038be712e4SBarry Smith   party->recursive    = PETSC_TRUE;
4048be712e4SBarry Smith   party->verbose      = PETSC_FALSE;
4058be712e4SBarry Smith   party->nbvtxcoarsed = 200;
4068be712e4SBarry Smith 
4078be712e4SBarry Smith   part->ops->apply          = MatPartitioningApply_Party;
4088be712e4SBarry Smith   part->ops->view           = MatPartitioningView_Party;
4098be712e4SBarry Smith   part->ops->destroy        = MatPartitioningDestroy_Party;
4108be712e4SBarry Smith   part->ops->setfromoptions = MatPartitioningSetFromOptions_Party;
4118be712e4SBarry Smith 
4128be712e4SBarry Smith   PetscCall(PetscObjectComposeFunction((PetscObject)part, "MatPartitioningPartySetGlobal_C", MatPartitioningPartySetGlobal_Party));
4138be712e4SBarry Smith   PetscCall(PetscObjectComposeFunction((PetscObject)part, "MatPartitioningPartySetLocal_C", MatPartitioningPartySetLocal_Party));
4148be712e4SBarry Smith   PetscCall(PetscObjectComposeFunction((PetscObject)part, "MatPartitioningPartySetCoarseLevel_C", MatPartitioningPartySetCoarseLevel_Party));
4158be712e4SBarry Smith   PetscCall(PetscObjectComposeFunction((PetscObject)part, "MatPartitioningPartySetMatchOptimization_C", MatPartitioningPartySetMatchOptimization_Party));
4168be712e4SBarry Smith   PetscCall(PetscObjectComposeFunction((PetscObject)part, "MatPartitioningPartySetBipart_C", MatPartitioningPartySetBipart_Party));
4178be712e4SBarry Smith   PetscFunctionReturn(PETSC_SUCCESS);
4188be712e4SBarry Smith }
419