xref: /petsc/include/petscmatcoarsen.h (revision 95452b02e12c0ee11232c7ff2b24b568a8e07e43)
1484f0a72SBarry Smith 
2484f0a72SBarry Smith #ifndef __PETSCMATCOARSEN_H
3484f0a72SBarry Smith #define __PETSCMATCOARSEN_H
4484f0a72SBarry Smith #include <petscmat.h>
5484f0a72SBarry Smith 
6484f0a72SBarry Smith PETSC_EXTERN PetscFunctionList MatCoarsenList;
7484f0a72SBarry Smith 
8484f0a72SBarry Smith /*S
9484f0a72SBarry Smith      MatCoarsen - Object for managing the coarsening of a graph (symmetric matrix)
10484f0a72SBarry Smith 
11484f0a72SBarry Smith    Level: advanced
12484f0a72SBarry Smith 
13*95452b02SPatrick Sanan   Notes:
14*95452b02SPatrick Sanan     This is used by the PCGAMG to generate coarser representations of an algebraic problem
15484f0a72SBarry Smith 
16484f0a72SBarry Smith   Concepts: coarsen
17484f0a72SBarry Smith 
18484f0a72SBarry Smith .seealso:  MatCoarsenCreate(), MatCoarsenType
19484f0a72SBarry Smith S*/
20484f0a72SBarry Smith typedef struct _p_MatCoarsen* MatCoarsen;
21484f0a72SBarry Smith 
22484f0a72SBarry Smith /*J
23484f0a72SBarry Smith     MatCoarsenType - String with the name of a PETSc matrix coarsen algorithm
24484f0a72SBarry Smith 
25484f0a72SBarry Smith    Level: beginner
26484f0a72SBarry Smith 
27484f0a72SBarry Smith .seealso: MatCoarsenCreate(), MatCoarsen
28484f0a72SBarry Smith J*/
29484f0a72SBarry Smith typedef const char* MatCoarsenType;
30484f0a72SBarry Smith #define MATCOARSENMIS  "mis"
31484f0a72SBarry Smith #define MATCOARSENHEM  "hem"
32484f0a72SBarry Smith 
33484f0a72SBarry Smith /* linked list for aggregates */
34484f0a72SBarry Smith typedef struct _PetscCDIntNd{
35484f0a72SBarry Smith   struct _PetscCDIntNd *next;
36484f0a72SBarry Smith   PetscInt             gid;
37484f0a72SBarry Smith }PetscCDIntNd;
38484f0a72SBarry Smith 
39484f0a72SBarry Smith /* only used by node pool */
40484f0a72SBarry Smith typedef struct _PetscCDArrNd{
41484f0a72SBarry Smith   struct _PetscCDArrNd *next;
42484f0a72SBarry Smith   struct _PetscCDIntNd *array;
43484f0a72SBarry Smith }PetscCDArrNd;
44484f0a72SBarry Smith 
45484f0a72SBarry Smith typedef struct _PetscCoarsenData{
46484f0a72SBarry Smith   PetscCDArrNd pool_list;  /* node pool */
47484f0a72SBarry Smith   PetscCDIntNd *new_node;
48484f0a72SBarry Smith   PetscInt     new_left;
49484f0a72SBarry Smith   PetscInt     chk_sz;
50484f0a72SBarry Smith   PetscCDIntNd *extra_nodes;
51484f0a72SBarry Smith   PetscCDIntNd **array;  /* Array of lists */
52484f0a72SBarry Smith   PetscInt     size;
53484f0a72SBarry Smith   Mat          mat;  /* cache a Mat for communication data */
54484f0a72SBarry Smith }PetscCoarsenData;
55484f0a72SBarry Smith 
56484f0a72SBarry Smith PETSC_EXTERN PetscErrorCode MatCoarsenCreate(MPI_Comm,MatCoarsen*);
57484f0a72SBarry Smith PETSC_EXTERN PetscErrorCode MatCoarsenSetType(MatCoarsen,MatCoarsenType);
58484f0a72SBarry Smith PETSC_EXTERN PetscErrorCode MatCoarsenSetAdjacency(MatCoarsen,Mat);
59484f0a72SBarry Smith PETSC_EXTERN PetscErrorCode MatCoarsenSetGreedyOrdering(MatCoarsen,const IS);
60484f0a72SBarry Smith PETSC_EXTERN PetscErrorCode MatCoarsenSetStrictAggs(MatCoarsen,PetscBool);
61484f0a72SBarry Smith PETSC_EXTERN PetscErrorCode MatCoarsenGetData( MatCoarsen, PetscCoarsenData ** );
62484f0a72SBarry Smith PETSC_EXTERN PetscErrorCode MatCoarsenApply(MatCoarsen);
63484f0a72SBarry Smith PETSC_EXTERN PetscErrorCode MatCoarsenDestroy(MatCoarsen*);
64484f0a72SBarry Smith PETSC_EXTERN PetscErrorCode MatCoarsenRegister(const char[],PetscErrorCode (*)(MatCoarsen));
65484f0a72SBarry Smith PETSC_EXTERN PetscErrorCode MatCoarsenView(MatCoarsen,PetscViewer);
66484f0a72SBarry Smith PETSC_EXTERN PetscErrorCode MatCoarsenSetFromOptions(MatCoarsen);
67484f0a72SBarry Smith PETSC_EXTERN PetscErrorCode MatCoarsenGetType(MatCoarsen,MatCoarsenType*);
68484f0a72SBarry Smith PETSC_STATIC_INLINE PetscErrorCode MatCoarsenViewFromOptions(MatCoarsen A,PetscObject obj,const char name[]) {return PetscObjectViewFromOptions((PetscObject)A,obj,name);}
69484f0a72SBarry Smith 
70484f0a72SBarry Smith PETSC_EXTERN PetscErrorCode PetscCDCreate(PetscInt,PetscCoarsenData**);
71484f0a72SBarry Smith PETSC_EXTERN PetscErrorCode PetscCDDestroy(PetscCoarsenData*);
72484f0a72SBarry Smith PETSC_EXTERN PetscErrorCode PetscCDIntNdSetID(PetscCDIntNd*,PetscInt);
73484f0a72SBarry Smith PETSC_EXTERN PetscErrorCode PetscCDIntNdGetID(const PetscCDIntNd*,PetscInt*);
74484f0a72SBarry Smith PETSC_EXTERN PetscErrorCode PetscCDAppendID(PetscCoarsenData*,PetscInt,PetscInt);
75484f0a72SBarry Smith PETSC_EXTERN PetscErrorCode PetscCDAppendRemove(PetscCoarsenData*,PetscInt,PetscInt);
76484f0a72SBarry Smith PETSC_EXTERN PetscErrorCode PetscCDAppendNode(PetscCoarsenData*,PetscInt,PetscCDIntNd*);
77484f0a72SBarry Smith PETSC_EXTERN PetscErrorCode PetscCDRemoveNextNode(PetscCoarsenData*,PetscInt,PetscCDIntNd*);
78484f0a72SBarry Smith PETSC_EXTERN PetscErrorCode PetscCDRemoveAllAt(PetscCoarsenData*,PetscInt);
79484f0a72SBarry Smith PETSC_EXTERN PetscErrorCode PetscCDSizeAt(const PetscCoarsenData*,PetscInt,PetscInt*);
80484f0a72SBarry Smith PETSC_EXTERN PetscErrorCode PetscCDEmptyAt(const PetscCoarsenData*,PetscInt,PetscBool*);
81484f0a72SBarry Smith PETSC_EXTERN PetscErrorCode PetscCDSetChuckSize(PetscCoarsenData*,PetscInt);
82484f0a72SBarry Smith PETSC_EXTERN PetscErrorCode PetscCDPrint(const PetscCoarsenData*,MPI_Comm);
83484f0a72SBarry Smith PETSC_EXTERN PetscErrorCode PetscCDGetMIS(PetscCoarsenData*,IS*);
84484f0a72SBarry Smith PETSC_EXTERN PetscErrorCode PetscCDGetMat(const PetscCoarsenData*,Mat*);
85484f0a72SBarry Smith PETSC_EXTERN PetscErrorCode PetscCDSetMat(PetscCoarsenData*,Mat);
86484f0a72SBarry Smith 
87539c167fSBarry Smith PETSC_EXTERN PetscErrorCode PetscCDGetHeadPos(const PetscCoarsenData*,PetscInt,PetscCDIntNd**);
88539c167fSBarry Smith PETSC_EXTERN PetscErrorCode PetscCDGetNextPos(const PetscCoarsenData*,PetscInt,PetscCDIntNd**);
890a3c815dSMark Adams PETSC_EXTERN PetscErrorCode PetscCDGetASMBlocks(const PetscCoarsenData*,const PetscInt,Mat,PetscInt*,IS**);
90484f0a72SBarry Smith 
91484f0a72SBarry Smith 
92484f0a72SBarry Smith #endif
93