xref: /petsc/include/petscmatcoarsen.h (revision 1cc06b555e92f8ec64db10330b8bbd830e5bc876)
126bd1501SBarry Smith #ifndef PETSCMATCOARSEN_H
226bd1501SBarry Smith #define PETSCMATCOARSEN_H
3ac09b921SBarry Smith 
4484f0a72SBarry Smith #include <petscmat.h>
5484f0a72SBarry Smith 
6ac09b921SBarry Smith /* SUBMANSEC = Mat */
7ac09b921SBarry Smith 
8484f0a72SBarry Smith PETSC_EXTERN PetscFunctionList MatCoarsenList;
9484f0a72SBarry Smith 
10484f0a72SBarry Smith /*S
11484f0a72SBarry Smith      MatCoarsen - Object for managing the coarsening of a graph (symmetric matrix)
12484f0a72SBarry Smith 
13484f0a72SBarry Smith    Level: advanced
14484f0a72SBarry Smith 
152ef1f0ffSBarry Smith   Note:
1687497f52SBarry Smith     This is used by the `PCGAMG` to generate coarser representations of an algebraic problem
17484f0a72SBarry Smith 
18*1cc06b55SBarry Smith .seealso: [](ch_matrices), [](sec_graph), `Mat`, `MatCoarsenCreate()`, `MatCoarsenType`, `MatColoringType`, `MatPartitioningType`, `MatOrderingType`
192ef1f0ffSBarry Smith           `MatColoring`, `MatPartitioning`
20484f0a72SBarry Smith S*/
21484f0a72SBarry Smith typedef struct _p_MatCoarsen *MatCoarsen;
22484f0a72SBarry Smith 
23484f0a72SBarry Smith /*J
242ef1f0ffSBarry Smith     MatCoarsenType - String with the name of a PETSc matrix coarsening algorithm
25484f0a72SBarry Smith 
26484f0a72SBarry Smith    Level: beginner
27484f0a72SBarry Smith 
28*1cc06b55SBarry Smith .seealso: [](ch_matrices), [](sec_graph), `Mat`, `MatCoarsenCreate()`, `MatCoarsen`, `MatColoringType`, `MatPartitioningType`, `MatOrderingType`
29484f0a72SBarry Smith J*/
30484f0a72SBarry Smith typedef const char *MatCoarsenType;
31484f0a72SBarry Smith #define MATCOARSENMIS  "mis"
32484f0a72SBarry Smith #define MATCOARSENHEM  "hem"
33bae903cbSmarkadams4 #define MATCOARSENMISK "misk"
34484f0a72SBarry Smith 
35484f0a72SBarry Smith /* linked list for aggregates */
36484f0a72SBarry Smith typedef struct _PetscCDIntNd {
37484f0a72SBarry Smith   struct _PetscCDIntNd *next;
38484f0a72SBarry Smith   PetscInt              gid;
39484f0a72SBarry Smith } PetscCDIntNd;
40484f0a72SBarry Smith 
41484f0a72SBarry Smith /* only used by node pool */
42484f0a72SBarry Smith typedef struct _PetscCDArrNd {
43484f0a72SBarry Smith   struct _PetscCDArrNd *next;
44484f0a72SBarry Smith   struct _PetscCDIntNd *array;
45484f0a72SBarry Smith } PetscCDArrNd;
46484f0a72SBarry Smith 
47bae903cbSmarkadams4 /* linked list data structure that encodes aggragates and C-F points with array[idx] == NULL for F point and array of indices in an aggrate or C point (first index is always global index my0 + idx */
48484f0a72SBarry Smith typedef struct _PetscCoarsenData {
49484f0a72SBarry Smith   PetscCDArrNd   pool_list; /* node pool */
50484f0a72SBarry Smith   PetscCDIntNd  *new_node;
51484f0a72SBarry Smith   PetscInt       new_left;
52d5b43468SJose E. Roman   PetscInt       chk_sz; /* chunk size */
53484f0a72SBarry Smith   PetscCDIntNd  *extra_nodes;
54484f0a72SBarry Smith   PetscCDIntNd **array; /* Array of lists */
55bae903cbSmarkadams4   PetscInt       size;  /* size of 'array' */
56484f0a72SBarry Smith   Mat            mat;   /* cache a Mat for communication data */
57484f0a72SBarry Smith } PetscCoarsenData;
58484f0a72SBarry Smith 
59484f0a72SBarry Smith PETSC_EXTERN PetscErrorCode MatCoarsenCreate(MPI_Comm, MatCoarsen *);
60484f0a72SBarry Smith PETSC_EXTERN PetscErrorCode MatCoarsenSetType(MatCoarsen, MatCoarsenType);
61484f0a72SBarry Smith PETSC_EXTERN PetscErrorCode MatCoarsenSetAdjacency(MatCoarsen, Mat);
62484f0a72SBarry Smith PETSC_EXTERN PetscErrorCode MatCoarsenSetGreedyOrdering(MatCoarsen, const IS);
63484f0a72SBarry Smith PETSC_EXTERN PetscErrorCode MatCoarsenSetStrictAggs(MatCoarsen, PetscBool);
64484f0a72SBarry Smith PETSC_EXTERN PetscErrorCode MatCoarsenGetData(MatCoarsen, PetscCoarsenData **);
65484f0a72SBarry Smith PETSC_EXTERN PetscErrorCode MatCoarsenApply(MatCoarsen);
66484f0a72SBarry Smith PETSC_EXTERN PetscErrorCode MatCoarsenDestroy(MatCoarsen *);
67484f0a72SBarry Smith PETSC_EXTERN PetscErrorCode MatCoarsenRegister(const char[], PetscErrorCode (*)(MatCoarsen));
68484f0a72SBarry Smith PETSC_EXTERN PetscErrorCode MatCoarsenView(MatCoarsen, PetscViewer);
69484f0a72SBarry Smith PETSC_EXTERN PetscErrorCode MatCoarsenSetFromOptions(MatCoarsen);
70484f0a72SBarry Smith PETSC_EXTERN PetscErrorCode MatCoarsenGetType(MatCoarsen, MatCoarsenType *);
71fe2efc57SMark PETSC_EXTERN PetscErrorCode MatCoarsenViewFromOptions(MatCoarsen, PetscObject, const char[]);
72484f0a72SBarry Smith 
73484f0a72SBarry Smith PETSC_EXTERN PetscErrorCode PetscCDCreate(PetscInt, PetscCoarsenData **);
74484f0a72SBarry Smith PETSC_EXTERN PetscErrorCode PetscCDDestroy(PetscCoarsenData *);
75484f0a72SBarry Smith PETSC_EXTERN PetscErrorCode PetscCDIntNdSetID(PetscCDIntNd *, PetscInt);
76484f0a72SBarry Smith PETSC_EXTERN PetscErrorCode PetscCDIntNdGetID(const PetscCDIntNd *, PetscInt *);
77484f0a72SBarry Smith PETSC_EXTERN PetscErrorCode PetscCDAppendID(PetscCoarsenData *, PetscInt, PetscInt);
78484f0a72SBarry Smith PETSC_EXTERN PetscErrorCode PetscCDAppendRemove(PetscCoarsenData *, PetscInt, PetscInt);
79484f0a72SBarry Smith PETSC_EXTERN PetscErrorCode PetscCDAppendNode(PetscCoarsenData *, PetscInt, PetscCDIntNd *);
80484f0a72SBarry Smith PETSC_EXTERN PetscErrorCode PetscCDRemoveNextNode(PetscCoarsenData *, PetscInt, PetscCDIntNd *);
81484f0a72SBarry Smith PETSC_EXTERN PetscErrorCode PetscCDSizeAt(const PetscCoarsenData *, PetscInt, PetscInt *);
82484f0a72SBarry Smith PETSC_EXTERN PetscErrorCode PetscCDEmptyAt(const PetscCoarsenData *, PetscInt, PetscBool *);
83484f0a72SBarry Smith PETSC_EXTERN PetscErrorCode PetscCDSetChuckSize(PetscCoarsenData *, PetscInt);
84484f0a72SBarry Smith PETSC_EXTERN PetscErrorCode PetscCDPrint(const PetscCoarsenData *, MPI_Comm);
85484f0a72SBarry Smith PETSC_EXTERN PetscErrorCode PetscCDGetMIS(PetscCoarsenData *, IS *);
86bae903cbSmarkadams4 PETSC_EXTERN PetscErrorCode PetscCDGetMat(PetscCoarsenData *, Mat *);
87484f0a72SBarry Smith PETSC_EXTERN PetscErrorCode PetscCDSetMat(PetscCoarsenData *, Mat);
88bae903cbSmarkadams4 PETSC_EXTERN PetscErrorCode PetscCDRemoveAll(PetscCoarsenData *, PetscInt);
89484f0a72SBarry Smith 
90539c167fSBarry Smith PETSC_EXTERN PetscErrorCode PetscCDGetHeadPos(const PetscCoarsenData *, PetscInt, PetscCDIntNd **);
91539c167fSBarry Smith PETSC_EXTERN PetscErrorCode PetscCDGetNextPos(const PetscCoarsenData *, PetscInt, PetscCDIntNd **);
920a3c815dSMark Adams PETSC_EXTERN PetscErrorCode PetscCDGetASMBlocks(const PetscCoarsenData *, const PetscInt, Mat, PetscInt *, IS **);
93484f0a72SBarry Smith 
94013e2dc7SBarry Smith PETSC_EXTERN PetscErrorCode MatCoarsenMISKSetDistance(MatCoarsen, PetscInt);
95013e2dc7SBarry Smith PETSC_EXTERN PetscErrorCode MatCoarsenMISKGetDistance(MatCoarsen, PetscInt *);
96484f0a72SBarry Smith #endif
97