Actual source code: power.c
1: #include <petsc/private/matimpl.h>
3: static PetscErrorCode MatColoringApply_Power(MatColoring mc, ISColoring *iscoloring)
4: {
5: Mat m = mc->mat, mp, ms;
6: MatColoring imc;
7: PetscInt i;
8: const char *optionsprefix;
10: PetscFunctionBegin;
11: /* square the matrix repeatedly if necessary */
12: if (mc->dist == 1) {
13: mp = m;
14: } else {
15: PetscCall(MatMatMult(m, m, MAT_INITIAL_MATRIX, 2.0, &mp));
16: for (i = 2; i < mc->dist; i++) {
17: ms = mp;
18: PetscCall(MatMatMult(m, ms, MAT_INITIAL_MATRIX, 2.0, &mp));
19: PetscCall(MatDestroy(&ms));
20: }
21: }
22: PetscCall(MatColoringCreate(mp, &imc));
23: PetscCall(PetscObjectGetOptionsPrefix((PetscObject)mc, &optionsprefix));
24: PetscCall(PetscObjectSetOptionsPrefix((PetscObject)imc, optionsprefix));
25: PetscCall(PetscObjectAppendOptionsPrefix((PetscObject)imc, "power_"));
26: PetscCall(MatColoringSetType(imc, MATCOLORINGGREEDY));
27: PetscCall(MatColoringSetDistance(imc, 1));
28: PetscCall(MatColoringSetWeightType(imc, mc->weight_type));
29: PetscCall(MatColoringSetFromOptions(imc));
30: PetscCall(MatColoringApply(imc, iscoloring));
31: PetscCall(MatColoringDestroy(&imc));
32: if (mp != m) PetscCall(MatDestroy(&mp));
33: PetscFunctionReturn(PETSC_SUCCESS);
34: }
36: /*MC
37: MATCOLORINGPOWER - Take the matrix's nth power, then do one-coloring on it.
39: Level: beginner
41: Notes:
42: This is merely a trivial test algorithm.
44: Supports any distance coloring.
46: .seealso: `MatColoring`, `MatColoringType`, `MatColoringCreate()`, `MatColoring`, `MatColoringSetType()`
47: M*/
48: PETSC_EXTERN PetscErrorCode MatColoringCreate_Power(MatColoring mc)
49: {
50: PetscFunctionBegin;
51: mc->ops->apply = MatColoringApply_Power;
52: mc->ops->view = NULL;
53: mc->ops->destroy = NULL;
54: mc->ops->setfromoptions = NULL;
55: PetscFunctionReturn(PETSC_SUCCESS);
56: }