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