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