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