xref: /petsc/src/mat/impls/dense/mpi/mpidense.h (revision a496304597bacff3545e802853d69e8765312868)
1*a4963045SJacob Faibussowitsch #pragma once
28965ea79SLois Curfman McInnes 
3c6db04a5SJed Brown #include <../src/mat/impls/dense/seq/dense.h>
4637a0070SStefano Zampini #include <petscsf.h>
58965ea79SLois Curfman McInnes 
6da81f932SPierre Jolivet /*  Data structures for basic parallel dense matrix  */
7052cd425SLois Curfman McInnes 
84222ddf1SHong Zhang typedef struct {  /* used by MatMatMultxxx_MPIDense_MPIDense() */
9320f2790SHong Zhang   Mat Ae, Be, Ce; /* matrix in Elemental format */
10320f2790SHong Zhang } Mat_MatMultDense;
11320f2790SHong Zhang 
124222ddf1SHong Zhang typedef struct { /* used by MatTransposeMatMultXXX_MPIDense_MPIDense() */
13637a0070SStefano Zampini   PetscScalar *sendbuf;
14637a0070SStefano Zampini   Mat          atb;
15d5017740SHong Zhang   PetscMPIInt *recvcounts;
16cc48ffa7SToby Isaac   PetscMPIInt  tag;
17baa3c1c6SHong Zhang } Mat_TransMatMultDense;
18baa3c1c6SHong Zhang 
194222ddf1SHong Zhang typedef struct { /* used by MatMatTransposeMultxxx_MPIDense_MPIDense() */
20cc48ffa7SToby Isaac   PetscScalar *buf[2];
21cc48ffa7SToby Isaac   PetscMPIInt  tag;
22faa55883SToby Isaac   PetscMPIInt *recvcounts;
23faa55883SToby Isaac   PetscMPIInt *recvdispls;
24faa55883SToby Isaac   PetscInt     alg; /* algorithm used */
25cc48ffa7SToby Isaac } Mat_MatTransMultDense;
26cc48ffa7SToby Isaac 
278965ea79SLois Curfman McInnes typedef struct {
28bad5519cSBarry Smith   Mat A; /* local submatrix */
29320f2790SHong Zhang 
308965ea79SLois Curfman McInnes   /* The following variables are used for matrix assembly */
31aaa8cc7dSPierre Jolivet   PetscBool    donotstash;        /* Flag indicating if values should be stashed */
328965ea79SLois Curfman McInnes   MPI_Request *send_waits;        /* array of send requests */
338965ea79SLois Curfman McInnes   MPI_Request *recv_waits;        /* array of receive requests */
3413f74950SBarry Smith   PetscInt     nsends, nrecvs;    /* numbers of sends and receives */
35ea709b57SSatish Balay   PetscScalar *svalues, *rvalues; /* sending and receiving data */
3613f74950SBarry Smith   PetscInt     rmax;              /* maximum message length */
378965ea79SLois Curfman McInnes 
388965ea79SLois Curfman McInnes   /* The following variables are used for matrix-vector products */
398965ea79SLois Curfman McInnes   Vec       lvec;        /* local vector */
40637a0070SStefano Zampini   PetscSF   Mvctx;       /* for mat-mult communications */
41ace3abfcSBarry Smith   PetscBool roworiented; /* if true, row oriented input (default) */
428949adfdSHong Zhang 
435ea7661aSPierre Jolivet   /* Support for MatDenseGetColumnVec and MatDenseGetSubMatrix */
445ea7661aSPierre Jolivet   Mat                cmat;     /* matrix representation of a given subset of columns */
456947451fSStefano Zampini   Vec                cvec;     /* vector representation of a given column */
466947451fSStefano Zampini   const PetscScalar *ptrinuse; /* holds array to be restored (just a placeholder) */
476947451fSStefano Zampini   PetscInt           vecinuse; /* if cvec is in use (col = vecinuse-1) */
485ea7661aSPierre Jolivet   PetscInt           matinuse; /* if cmat is in use (cbegin = matinuse-1) */
498965ea79SLois Curfman McInnes } Mat_MPIDense;
5097304618SKris Buschelman 
515a576424SJed Brown PETSC_INTERN PetscErrorCode MatSetUpMultiply_MPIDense(Mat);
527dae84e0SHong Zhang PETSC_INTERN PetscErrorCode MatCreateSubMatrices_MPIDense(Mat, PetscInt, const IS[], const IS[], MatReuse, Mat *[]);
534222ddf1SHong Zhang PETSC_INTERN PetscErrorCode MatProductSetFromOptions_MPIAIJ_MPIDense(Mat);
54320f2790SHong Zhang 
554222ddf1SHong Zhang PETSC_INTERN PetscErrorCode MatProductSetFromOptions_MPIDense_MPIAIJ(Mat);
564222ddf1SHong Zhang PETSC_INTERN PetscErrorCode MatProductSetFromOptions_MPIDense(Mat);
574222ddf1SHong Zhang 
585242a7b1SHong Zhang #if defined(PETSC_HAVE_ELEMENTAL)
594222ddf1SHong Zhang PETSC_INTERN PetscErrorCode MatMatMultSymbolic_Elemental(Mat, Mat, PetscReal, Mat);
604222ddf1SHong Zhang PETSC_INTERN PetscErrorCode MatMatMultNumeric_Elemental(Mat, Mat, Mat);
615242a7b1SHong Zhang #endif
624e29119aSPierre Jolivet PETSC_INTERN PetscErrorCode MatConvert_SeqDense_SeqAIJ(Mat A, MatType newtype, MatReuse reuse, Mat *newmat);
634742e46bSJacob Faibussowitsch 
644742e46bSJacob Faibussowitsch PETSC_INTERN PetscErrorCode MatShift_MPIDense(Mat, PetscScalar);
654742e46bSJacob Faibussowitsch PETSC_INTERN PetscErrorCode MatDenseGetColumnVecWrite_MPIDense(Mat, PetscInt, Vec *);
664742e46bSJacob Faibussowitsch PETSC_INTERN PetscErrorCode MatDenseGetColumnVecRead_MPIDense(Mat, PetscInt, Vec *);
674742e46bSJacob Faibussowitsch PETSC_INTERN PetscErrorCode MatDenseGetColumnVec_MPIDense(Mat, PetscInt, Vec *);
684742e46bSJacob Faibussowitsch PETSC_INTERN PetscErrorCode MatDenseRestoreColumnVecWrite_MPIDense(Mat, PetscInt, Vec *);
694742e46bSJacob Faibussowitsch PETSC_INTERN PetscErrorCode MatDenseRestoreColumnVecRead_MPIDense(Mat, PetscInt, Vec *);
704742e46bSJacob Faibussowitsch PETSC_INTERN PetscErrorCode MatDenseRestoreColumnVec_MPIDense(Mat, PetscInt, Vec *);
714742e46bSJacob Faibussowitsch 
724742e46bSJacob Faibussowitsch PETSC_INTERN PetscErrorCode MatCreate_MPIDense(Mat);
7314277c92SJacob Faibussowitsch PETSC_INTERN PetscErrorCode MatGetDiagonal_MPIDense(Mat, Vec);
744742e46bSJacob Faibussowitsch 
754742e46bSJacob Faibussowitsch #if PetscDefined(HAVE_CUDA)
764742e46bSJacob Faibussowitsch PETSC_INTERN PetscErrorCode MatConvert_MPIDense_MPIDenseCUDA(Mat, MatType, MatReuse, Mat *);
774742e46bSJacob Faibussowitsch #endif
784742e46bSJacob Faibussowitsch 
794742e46bSJacob Faibussowitsch #if PetscDefined(HAVE_HIP)
804742e46bSJacob Faibussowitsch PETSC_INTERN PetscErrorCode MatConvert_MPIDense_MPIDenseHIP(Mat, MatType, MatReuse, Mat *);
814742e46bSJacob Faibussowitsch #endif
82