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