xref: /petsc/include/petscmatcoarsen.h (revision 4ffacfe27a72f4cdf51b68a3bbb6aed96040fb2f)
1 #ifndef PETSCMATCOARSEN_H
2 #define PETSCMATCOARSEN_H
3 
4 #include <petscmat.h>
5 
6 /* SUBMANSEC = Mat */
7 
8 PETSC_EXTERN PetscFunctionList MatCoarsenList;
9 
10 /*S
11      MatCoarsen - Object for managing the coarsening of a graph (symmetric matrix)
12 
13    Level: advanced
14 
15   Notes:
16     This is used by the PCGAMG to generate coarser representations of an algebraic problem
17 
18 .seealso: `MatCoarsenCreate()`, `MatCoarsenType`
19 S*/
20 typedef struct _p_MatCoarsen* MatCoarsen;
21 
22 /*J
23     MatCoarsenType - String with the name of a PETSc matrix coarsen algorithm
24 
25    Level: beginner
26 
27 .seealso: `MatCoarsenCreate()`, `MatCoarsen`
28 J*/
29 typedef const char* MatCoarsenType;
30 #define MATCOARSENMIS  "mis"
31 #define MATCOARSENHEM  "hem"
32 #define MATCOARSENMISK "misk"
33 
34 /* linked list for aggregates */
35 typedef struct _PetscCDIntNd{
36   struct _PetscCDIntNd *next;
37   PetscInt             gid;
38 }PetscCDIntNd;
39 
40 /* only used by node pool */
41 typedef struct _PetscCDArrNd{
42   struct _PetscCDArrNd *next;
43   struct _PetscCDIntNd *array;
44 }PetscCDArrNd;
45 
46 /* 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 */
47 typedef struct _PetscCoarsenData{
48   PetscCDArrNd pool_list;  /* node pool */
49   PetscCDIntNd *new_node;
50   PetscInt     new_left;
51   PetscInt     chk_sz; /* chunck size */
52   PetscCDIntNd *extra_nodes;
53   PetscCDIntNd **array;  /* Array of lists */
54   PetscInt     size; /* size of 'array' */
55   Mat          mat;  /* cache a Mat for communication data */
56 }PetscCoarsenData;
57 
58 PETSC_EXTERN PetscErrorCode MatCoarsenCreate(MPI_Comm,MatCoarsen*);
59 PETSC_EXTERN PetscErrorCode MatCoarsenSetType(MatCoarsen,MatCoarsenType);
60 PETSC_EXTERN PetscErrorCode MatCoarsenSetAdjacency(MatCoarsen,Mat);
61 PETSC_EXTERN PetscErrorCode MatCoarsenSetGreedyOrdering(MatCoarsen,const IS);
62 PETSC_EXTERN PetscErrorCode MatCoarsenSetStrictAggs(MatCoarsen,PetscBool);
63 PETSC_EXTERN PetscErrorCode MatCoarsenGetData(MatCoarsen, PetscCoarsenData **);
64 PETSC_EXTERN PetscErrorCode MatCoarsenApply(MatCoarsen);
65 PETSC_EXTERN PetscErrorCode MatCoarsenDestroy(MatCoarsen*);
66 PETSC_EXTERN PetscErrorCode MatCoarsenRegister(const char[],PetscErrorCode (*)(MatCoarsen));
67 PETSC_EXTERN PetscErrorCode MatCoarsenView(MatCoarsen,PetscViewer);
68 PETSC_EXTERN PetscErrorCode MatCoarsenSetFromOptions(MatCoarsen);
69 PETSC_EXTERN PetscErrorCode MatCoarsenGetType(MatCoarsen,MatCoarsenType*);
70 PETSC_EXTERN PetscErrorCode MatCoarsenViewFromOptions(MatCoarsen,PetscObject,const char[]);
71 
72 PETSC_EXTERN PetscErrorCode PetscCDCreate(PetscInt,PetscCoarsenData**);
73 PETSC_EXTERN PetscErrorCode PetscCDDestroy(PetscCoarsenData*);
74 PETSC_EXTERN PetscErrorCode PetscCDIntNdSetID(PetscCDIntNd*,PetscInt);
75 PETSC_EXTERN PetscErrorCode PetscCDIntNdGetID(const PetscCDIntNd*,PetscInt*);
76 PETSC_EXTERN PetscErrorCode PetscCDAppendID(PetscCoarsenData*,PetscInt,PetscInt);
77 PETSC_EXTERN PetscErrorCode PetscCDAppendRemove(PetscCoarsenData*,PetscInt,PetscInt);
78 PETSC_EXTERN PetscErrorCode PetscCDAppendNode(PetscCoarsenData*,PetscInt,PetscCDIntNd*);
79 PETSC_EXTERN PetscErrorCode PetscCDRemoveNextNode(PetscCoarsenData*,PetscInt,PetscCDIntNd*);
80 PETSC_EXTERN PetscErrorCode PetscCDSizeAt(const PetscCoarsenData*,PetscInt,PetscInt*);
81 PETSC_EXTERN PetscErrorCode PetscCDEmptyAt(const PetscCoarsenData*,PetscInt,PetscBool*);
82 PETSC_EXTERN PetscErrorCode PetscCDSetChuckSize(PetscCoarsenData*,PetscInt);
83 PETSC_EXTERN PetscErrorCode PetscCDPrint(const PetscCoarsenData*,MPI_Comm);
84 PETSC_EXTERN PetscErrorCode PetscCDGetMIS(PetscCoarsenData*,IS*);
85 PETSC_EXTERN PetscErrorCode PetscCDGetMat(PetscCoarsenData*,Mat*);
86 PETSC_EXTERN PetscErrorCode PetscCDSetMat(PetscCoarsenData*,Mat);
87 PETSC_EXTERN PetscErrorCode PetscCDRemoveAll(PetscCoarsenData*, PetscInt);
88 
89 PETSC_EXTERN PetscErrorCode PetscCDGetHeadPos(const PetscCoarsenData*,PetscInt,PetscCDIntNd**);
90 PETSC_EXTERN PetscErrorCode PetscCDGetNextPos(const PetscCoarsenData*,PetscInt,PetscCDIntNd**);
91 PETSC_EXTERN PetscErrorCode PetscCDGetASMBlocks(const PetscCoarsenData*,const PetscInt,Mat,PetscInt*,IS**);
92 
93 #endif
94