11c2a3de1SBarry Smith 2397b6df1SKris Buschelman /* 3c2b5dc30SHong Zhang Provides an interface to the MUMPS sparse solver 4397b6df1SKris Buschelman */ 551d5961aSHong Zhang 6c6db04a5SJed Brown #include <../src/mat/impls/aij/mpi/mpiaij.h> /*I "petscmat.h" I*/ 7c6db04a5SJed Brown #include <../src/mat/impls/sbaij/mpi/mpisbaij.h> 8397b6df1SKris Buschelman 9397b6df1SKris Buschelman EXTERN_C_BEGIN 10397b6df1SKris Buschelman #if defined(PETSC_USE_COMPLEX) 11c6db04a5SJed Brown #include <zmumps_c.h> 12397b6df1SKris Buschelman #else 13c6db04a5SJed Brown #include <dmumps_c.h> 14397b6df1SKris Buschelman #endif 15397b6df1SKris Buschelman EXTERN_C_END 16397b6df1SKris Buschelman #define JOB_INIT -1 173d472b54SHong Zhang #define JOB_FACTSYMBOLIC 1 183d472b54SHong Zhang #define JOB_FACTNUMERIC 2 193d472b54SHong Zhang #define JOB_SOLVE 3 20397b6df1SKris Buschelman #define JOB_END -2 213d472b54SHong Zhang 223d472b54SHong Zhang 23397b6df1SKris Buschelman /* macros s.t. indices match MUMPS documentation */ 24397b6df1SKris Buschelman #define ICNTL(I) icntl[(I)-1] 25397b6df1SKris Buschelman #define CNTL(I) cntl[(I)-1] 26397b6df1SKris Buschelman #define INFOG(I) infog[(I)-1] 27a7aca84bSHong Zhang #define INFO(I) info[(I)-1] 28397b6df1SKris Buschelman #define RINFOG(I) rinfog[(I)-1] 29adc1d99fSHong Zhang #define RINFO(I) rinfo[(I)-1] 30397b6df1SKris Buschelman 31397b6df1SKris Buschelman typedef struct { 32397b6df1SKris Buschelman #if defined(PETSC_USE_COMPLEX) 33397b6df1SKris Buschelman ZMUMPS_STRUC_C id; 34397b6df1SKris Buschelman #else 35397b6df1SKris Buschelman DMUMPS_STRUC_C id; 36397b6df1SKris Buschelman #endif 37397b6df1SKris Buschelman MatStructure matstruc; 38c1490034SHong Zhang PetscMPIInt myid,size; 3916ebf90aSShri Abhyankar PetscInt *irn,*jcn,nz,sym,nSolve; 40397b6df1SKris Buschelman PetscScalar *val; 41397b6df1SKris Buschelman MPI_Comm comm_mumps; 42329ec9b3SHong Zhang VecScatter scat_rhs, scat_sol; 4364e6c443SBarry Smith PetscBool isAIJ,CleanUpMUMPS; 44329ec9b3SHong Zhang Vec b_seq,x_seq; 45bf0cc555SLisandro Dalcin PetscErrorCode (*Destroy)(Mat); 46bccb9932SShri Abhyankar PetscErrorCode (*ConvertToTriples)(Mat, int, MatReuse, int*, int**, int**, PetscScalar**); 47f0c56d0fSKris Buschelman } Mat_MUMPS; 48f0c56d0fSKris Buschelman 4909573ac7SBarry Smith extern PetscErrorCode MatDuplicate_MUMPS(Mat,MatDuplicateOption,Mat*); 50b24902e0SBarry Smith 5167877ebaSShri Abhyankar 5267877ebaSShri Abhyankar /* MatConvertToTriples_A_B */ 5367877ebaSShri Abhyankar /*convert Petsc matrix to triples: row[nz], col[nz], val[nz] */ 54397b6df1SKris Buschelman /* 55397b6df1SKris Buschelman input: 5667877ebaSShri Abhyankar A - matrix in aij,baij or sbaij (bs=1) format 57397b6df1SKris Buschelman shift - 0: C style output triple; 1: Fortran style output triple. 58bccb9932SShri Abhyankar reuse - MAT_INITIAL_MATRIX: spaces are allocated and values are set for the triple 59bccb9932SShri Abhyankar MAT_REUSE_MATRIX: only the values in v array are updated 60397b6df1SKris Buschelman output: 61397b6df1SKris Buschelman nnz - dim of r, c, and v (number of local nonzero entries of A) 62397b6df1SKris Buschelman r, c, v - row and col index, matrix values (matrix triples) 63397b6df1SKris Buschelman */ 6416ebf90aSShri Abhyankar 6516ebf90aSShri Abhyankar #undef __FUNCT__ 6616ebf90aSShri Abhyankar #define __FUNCT__ "MatConvertToTriples_seqaij_seqaij" 67bccb9932SShri Abhyankar PetscErrorCode MatConvertToTriples_seqaij_seqaij(Mat A,int shift,MatReuse reuse,int *nnz,int **r, int **c, PetscScalar **v) 68b24902e0SBarry Smith { 69185f6596SHong Zhang const PetscInt *ai,*aj,*ajj,M=A->rmap->n; 7067877ebaSShri Abhyankar PetscInt nz,rnz,i,j; 71dfbe8321SBarry Smith PetscErrorCode ierr; 72c1490034SHong Zhang PetscInt *row,*col; 7316ebf90aSShri Abhyankar Mat_SeqAIJ *aa=(Mat_SeqAIJ*)A->data; 74397b6df1SKris Buschelman 75397b6df1SKris Buschelman PetscFunctionBegin; 7616ebf90aSShri Abhyankar *v=aa->a; 77bccb9932SShri Abhyankar if (reuse == MAT_INITIAL_MATRIX){ 7816ebf90aSShri Abhyankar nz = aa->nz; ai = aa->i; aj = aa->j; 7916ebf90aSShri Abhyankar *nnz = nz; 80185f6596SHong Zhang ierr = PetscMalloc(2*nz*sizeof(PetscInt), &row);CHKERRQ(ierr); 81185f6596SHong Zhang col = row + nz; 82185f6596SHong Zhang 8316ebf90aSShri Abhyankar nz = 0; 8416ebf90aSShri Abhyankar for(i=0; i<M; i++) { 8516ebf90aSShri Abhyankar rnz = ai[i+1] - ai[i]; 8667877ebaSShri Abhyankar ajj = aj + ai[i]; 8767877ebaSShri Abhyankar for(j=0; j<rnz; j++) { 8867877ebaSShri Abhyankar row[nz] = i+shift; col[nz++] = ajj[j] + shift; 8916ebf90aSShri Abhyankar } 9016ebf90aSShri Abhyankar } 9116ebf90aSShri Abhyankar *r = row; *c = col; 9216ebf90aSShri Abhyankar } 9316ebf90aSShri Abhyankar PetscFunctionReturn(0); 9416ebf90aSShri Abhyankar } 95397b6df1SKris Buschelman 9616ebf90aSShri Abhyankar #undef __FUNCT__ 9767877ebaSShri Abhyankar #define __FUNCT__ "MatConvertToTriples_seqbaij_seqaij" 98bccb9932SShri Abhyankar PetscErrorCode MatConvertToTriples_seqbaij_seqaij(Mat A,int shift,MatReuse reuse,int *nnz,int **r, int **c, PetscScalar **v) 9967877ebaSShri Abhyankar { 10067877ebaSShri Abhyankar Mat_SeqBAIJ *aa=(Mat_SeqBAIJ*)A->data; 10167877ebaSShri Abhyankar const PetscInt *ai,*aj,*ajj,bs=A->rmap->bs,bs2=aa->bs2,M=A->rmap->N/bs; 1020ad0caddSJed Brown PetscInt nz,idx=0,rnz,i,j,k,m; 10367877ebaSShri Abhyankar PetscErrorCode ierr; 10467877ebaSShri Abhyankar PetscInt *row,*col; 10567877ebaSShri Abhyankar 10667877ebaSShri Abhyankar PetscFunctionBegin; 107cf3759fdSShri Abhyankar *v = aa->a; 108bccb9932SShri Abhyankar if (reuse == MAT_INITIAL_MATRIX){ 109cf3759fdSShri Abhyankar ai = aa->i; aj = aa->j; 11067877ebaSShri Abhyankar nz = bs2*aa->nz; 11167877ebaSShri Abhyankar *nnz = nz; 112185f6596SHong Zhang ierr = PetscMalloc(2*nz*sizeof(PetscInt), &row);CHKERRQ(ierr); 113185f6596SHong Zhang col = row + nz; 114185f6596SHong Zhang 11567877ebaSShri Abhyankar for(i=0; i<M; i++) { 11667877ebaSShri Abhyankar ajj = aj + ai[i]; 11767877ebaSShri Abhyankar rnz = ai[i+1] - ai[i]; 11867877ebaSShri Abhyankar for(k=0; k<rnz; k++) { 11967877ebaSShri Abhyankar for(j=0; j<bs; j++) { 12067877ebaSShri Abhyankar for(m=0; m<bs; m++) { 12167877ebaSShri Abhyankar row[idx] = i*bs + m + shift; 122cf3759fdSShri Abhyankar col[idx++] = bs*(ajj[k]) + j + shift; 12367877ebaSShri Abhyankar } 12467877ebaSShri Abhyankar } 12567877ebaSShri Abhyankar } 12667877ebaSShri Abhyankar } 127cf3759fdSShri Abhyankar *r = row; *c = col; 12867877ebaSShri Abhyankar } 12967877ebaSShri Abhyankar PetscFunctionReturn(0); 13067877ebaSShri Abhyankar } 13167877ebaSShri Abhyankar 13267877ebaSShri Abhyankar #undef __FUNCT__ 13316ebf90aSShri Abhyankar #define __FUNCT__ "MatConvertToTriples_seqsbaij_seqsbaij" 134bccb9932SShri Abhyankar PetscErrorCode MatConvertToTriples_seqsbaij_seqsbaij(Mat A,int shift,MatReuse reuse,int *nnz,int **r, int **c, PetscScalar **v) 13516ebf90aSShri Abhyankar { 13667877ebaSShri Abhyankar const PetscInt *ai, *aj,*ajj,M=A->rmap->n; 13767877ebaSShri Abhyankar PetscInt nz,rnz,i,j; 13816ebf90aSShri Abhyankar PetscErrorCode ierr; 13916ebf90aSShri Abhyankar PetscInt *row,*col; 14016ebf90aSShri Abhyankar Mat_SeqSBAIJ *aa=(Mat_SeqSBAIJ*)A->data; 14116ebf90aSShri Abhyankar 14216ebf90aSShri Abhyankar PetscFunctionBegin; 143bccb9932SShri Abhyankar if (reuse == MAT_INITIAL_MATRIX){ 14416ebf90aSShri Abhyankar nz = aa->nz;ai=aa->i; aj=aa->j;*v=aa->a; 14516ebf90aSShri Abhyankar *nnz = nz; 146185f6596SHong Zhang ierr = PetscMalloc(2*nz*sizeof(PetscInt), &row);CHKERRQ(ierr); 147185f6596SHong Zhang col = row + nz; 148185f6596SHong Zhang 14916ebf90aSShri Abhyankar nz = 0; 15016ebf90aSShri Abhyankar for(i=0; i<M; i++) { 15116ebf90aSShri Abhyankar rnz = ai[i+1] - ai[i]; 15267877ebaSShri Abhyankar ajj = aj + ai[i]; 15367877ebaSShri Abhyankar for(j=0; j<rnz; j++) { 15467877ebaSShri Abhyankar row[nz] = i+shift; col[nz++] = ajj[j] + shift; 15516ebf90aSShri Abhyankar } 15616ebf90aSShri Abhyankar } 15716ebf90aSShri Abhyankar *r = row; *c = col; 15816ebf90aSShri Abhyankar } 15916ebf90aSShri Abhyankar PetscFunctionReturn(0); 16016ebf90aSShri Abhyankar } 16116ebf90aSShri Abhyankar 16216ebf90aSShri Abhyankar #undef __FUNCT__ 16316ebf90aSShri Abhyankar #define __FUNCT__ "MatConvertToTriples_seqaij_seqsbaij" 164bccb9932SShri Abhyankar PetscErrorCode MatConvertToTriples_seqaij_seqsbaij(Mat A,int shift,MatReuse reuse,int *nnz,int **r, int **c, PetscScalar **v) 16516ebf90aSShri Abhyankar { 16667877ebaSShri Abhyankar const PetscInt *ai,*aj,*ajj,*adiag,M=A->rmap->n; 16767877ebaSShri Abhyankar PetscInt nz,rnz,i,j; 16867877ebaSShri Abhyankar const PetscScalar *av,*v1; 16916ebf90aSShri Abhyankar PetscScalar *val; 17016ebf90aSShri Abhyankar PetscErrorCode ierr; 17116ebf90aSShri Abhyankar PetscInt *row,*col; 17216ebf90aSShri Abhyankar Mat_SeqSBAIJ *aa=(Mat_SeqSBAIJ*)A->data; 17316ebf90aSShri Abhyankar 17416ebf90aSShri Abhyankar PetscFunctionBegin; 17516ebf90aSShri Abhyankar ai=aa->i; aj=aa->j;av=aa->a; 17616ebf90aSShri Abhyankar adiag=aa->diag; 177bccb9932SShri Abhyankar if (reuse == MAT_INITIAL_MATRIX){ 17816ebf90aSShri Abhyankar nz = M + (aa->nz-M)/2; 17916ebf90aSShri Abhyankar *nnz = nz; 180185f6596SHong Zhang ierr = PetscMalloc((2*nz*sizeof(PetscInt)+nz*sizeof(PetscScalar)), &row);CHKERRQ(ierr); 181185f6596SHong Zhang col = row + nz; 182185f6596SHong Zhang val = (PetscScalar*)(col + nz); 183185f6596SHong Zhang 18416ebf90aSShri Abhyankar nz = 0; 18516ebf90aSShri Abhyankar for(i=0; i<M; i++) { 18616ebf90aSShri Abhyankar rnz = ai[i+1] - adiag[i]; 18767877ebaSShri Abhyankar ajj = aj + adiag[i]; 188cf3759fdSShri Abhyankar v1 = av + adiag[i]; 18967877ebaSShri Abhyankar for(j=0; j<rnz; j++) { 19067877ebaSShri Abhyankar row[nz] = i+shift; col[nz] = ajj[j] + shift; val[nz++] = v1[j]; 19116ebf90aSShri Abhyankar } 19216ebf90aSShri Abhyankar } 19316ebf90aSShri Abhyankar *r = row; *c = col; *v = val; 194397b6df1SKris Buschelman } else { 19516ebf90aSShri Abhyankar nz = 0; val = *v; 19616ebf90aSShri Abhyankar for(i=0; i <M; i++) { 19716ebf90aSShri Abhyankar rnz = ai[i+1] - adiag[i]; 19867877ebaSShri Abhyankar ajj = aj + adiag[i]; 19967877ebaSShri Abhyankar v1 = av + adiag[i]; 20067877ebaSShri Abhyankar for(j=0; j<rnz; j++) { 20167877ebaSShri Abhyankar val[nz++] = v1[j]; 20216ebf90aSShri Abhyankar } 20316ebf90aSShri Abhyankar } 20416ebf90aSShri Abhyankar } 20516ebf90aSShri Abhyankar PetscFunctionReturn(0); 20616ebf90aSShri Abhyankar } 20716ebf90aSShri Abhyankar 20816ebf90aSShri Abhyankar #undef __FUNCT__ 20916ebf90aSShri Abhyankar #define __FUNCT__ "MatConvertToTriples_mpisbaij_mpisbaij" 210bccb9932SShri Abhyankar PetscErrorCode MatConvertToTriples_mpisbaij_mpisbaij(Mat A,int shift,MatReuse reuse,int *nnz,int **r, int **c, PetscScalar **v) 21116ebf90aSShri Abhyankar { 21216ebf90aSShri Abhyankar const PetscInt *ai, *aj, *bi, *bj,*garray,m=A->rmap->n,*ajj,*bjj; 21316ebf90aSShri Abhyankar PetscErrorCode ierr; 21416ebf90aSShri Abhyankar PetscInt rstart,nz,i,j,jj,irow,countA,countB; 21516ebf90aSShri Abhyankar PetscInt *row,*col; 21616ebf90aSShri Abhyankar const PetscScalar *av, *bv,*v1,*v2; 21716ebf90aSShri Abhyankar PetscScalar *val; 218397b6df1SKris Buschelman Mat_MPISBAIJ *mat = (Mat_MPISBAIJ*)A->data; 219397b6df1SKris Buschelman Mat_SeqSBAIJ *aa=(Mat_SeqSBAIJ*)(mat->A)->data; 220397b6df1SKris Buschelman Mat_SeqBAIJ *bb=(Mat_SeqBAIJ*)(mat->B)->data; 22116ebf90aSShri Abhyankar 22216ebf90aSShri Abhyankar PetscFunctionBegin; 223d0f46423SBarry Smith ai=aa->i; aj=aa->j; bi=bb->i; bj=bb->j; rstart= A->rmap->rstart; 224397b6df1SKris Buschelman garray = mat->garray; 225397b6df1SKris Buschelman av=aa->a; bv=bb->a; 226397b6df1SKris Buschelman 227bccb9932SShri Abhyankar if (reuse == MAT_INITIAL_MATRIX){ 22816ebf90aSShri Abhyankar nz = aa->nz + bb->nz; 22916ebf90aSShri Abhyankar *nnz = nz; 230185f6596SHong Zhang ierr = PetscMalloc((2*nz*sizeof(PetscInt)+nz*sizeof(PetscScalar)), &row);CHKERRQ(ierr); 231185f6596SHong Zhang col = row + nz; 232185f6596SHong Zhang val = (PetscScalar*)(col + nz); 233185f6596SHong Zhang 234397b6df1SKris Buschelman *r = row; *c = col; *v = val; 235397b6df1SKris Buschelman } else { 236397b6df1SKris Buschelman row = *r; col = *c; val = *v; 237397b6df1SKris Buschelman } 238397b6df1SKris Buschelman 239028e57e8SHong Zhang jj = 0; irow = rstart; 240397b6df1SKris Buschelman for ( i=0; i<m; i++ ) { 241397b6df1SKris Buschelman ajj = aj + ai[i]; /* ptr to the beginning of this row */ 242397b6df1SKris Buschelman countA = ai[i+1] - ai[i]; 243397b6df1SKris Buschelman countB = bi[i+1] - bi[i]; 244397b6df1SKris Buschelman bjj = bj + bi[i]; 24516ebf90aSShri Abhyankar v1 = av + ai[i]; 24616ebf90aSShri Abhyankar v2 = bv + bi[i]; 247397b6df1SKris Buschelman 248397b6df1SKris Buschelman /* A-part */ 249397b6df1SKris Buschelman for (j=0; j<countA; j++){ 250bccb9932SShri Abhyankar if (reuse == MAT_INITIAL_MATRIX) { 251397b6df1SKris Buschelman row[jj] = irow + shift; col[jj] = rstart + ajj[j] + shift; 252397b6df1SKris Buschelman } 25316ebf90aSShri Abhyankar val[jj++] = v1[j]; 254397b6df1SKris Buschelman } 25516ebf90aSShri Abhyankar 25616ebf90aSShri Abhyankar /* B-part */ 25716ebf90aSShri Abhyankar for(j=0; j < countB; j++){ 258bccb9932SShri Abhyankar if (reuse == MAT_INITIAL_MATRIX) { 259397b6df1SKris Buschelman row[jj] = irow + shift; col[jj] = garray[bjj[j]] + shift; 260397b6df1SKris Buschelman } 26116ebf90aSShri Abhyankar val[jj++] = v2[j]; 26216ebf90aSShri Abhyankar } 26316ebf90aSShri Abhyankar irow++; 26416ebf90aSShri Abhyankar } 26516ebf90aSShri Abhyankar PetscFunctionReturn(0); 26616ebf90aSShri Abhyankar } 26716ebf90aSShri Abhyankar 26816ebf90aSShri Abhyankar #undef __FUNCT__ 26916ebf90aSShri Abhyankar #define __FUNCT__ "MatConvertToTriples_mpiaij_mpiaij" 270bccb9932SShri Abhyankar PetscErrorCode MatConvertToTriples_mpiaij_mpiaij(Mat A,int shift,MatReuse reuse,int *nnz,int **r, int **c, PetscScalar **v) 27116ebf90aSShri Abhyankar { 27216ebf90aSShri Abhyankar const PetscInt *ai, *aj, *bi, *bj,*garray,m=A->rmap->n,*ajj,*bjj; 27316ebf90aSShri Abhyankar PetscErrorCode ierr; 27416ebf90aSShri Abhyankar PetscInt rstart,nz,i,j,jj,irow,countA,countB; 27516ebf90aSShri Abhyankar PetscInt *row,*col; 27616ebf90aSShri Abhyankar const PetscScalar *av, *bv,*v1,*v2; 27716ebf90aSShri Abhyankar PetscScalar *val; 27816ebf90aSShri Abhyankar Mat_MPIAIJ *mat = (Mat_MPIAIJ*)A->data; 27916ebf90aSShri Abhyankar Mat_SeqAIJ *aa=(Mat_SeqAIJ*)(mat->A)->data; 28016ebf90aSShri Abhyankar Mat_SeqAIJ *bb=(Mat_SeqAIJ*)(mat->B)->data; 28116ebf90aSShri Abhyankar 28216ebf90aSShri Abhyankar PetscFunctionBegin; 28316ebf90aSShri Abhyankar ai=aa->i; aj=aa->j; bi=bb->i; bj=bb->j; rstart= A->rmap->rstart; 28416ebf90aSShri Abhyankar garray = mat->garray; 28516ebf90aSShri Abhyankar av=aa->a; bv=bb->a; 28616ebf90aSShri Abhyankar 287bccb9932SShri Abhyankar if (reuse == MAT_INITIAL_MATRIX){ 28816ebf90aSShri Abhyankar nz = aa->nz + bb->nz; 28916ebf90aSShri Abhyankar *nnz = nz; 290185f6596SHong Zhang ierr = PetscMalloc((2*nz*sizeof(PetscInt)+nz*sizeof(PetscScalar)), &row);CHKERRQ(ierr); 291185f6596SHong Zhang col = row + nz; 292185f6596SHong Zhang val = (PetscScalar*)(col + nz); 293185f6596SHong Zhang 29416ebf90aSShri Abhyankar *r = row; *c = col; *v = val; 29516ebf90aSShri Abhyankar } else { 29616ebf90aSShri Abhyankar row = *r; col = *c; val = *v; 29716ebf90aSShri Abhyankar } 29816ebf90aSShri Abhyankar 29916ebf90aSShri Abhyankar jj = 0; irow = rstart; 30016ebf90aSShri Abhyankar for ( i=0; i<m; i++ ) { 30116ebf90aSShri Abhyankar ajj = aj + ai[i]; /* ptr to the beginning of this row */ 30216ebf90aSShri Abhyankar countA = ai[i+1] - ai[i]; 30316ebf90aSShri Abhyankar countB = bi[i+1] - bi[i]; 30416ebf90aSShri Abhyankar bjj = bj + bi[i]; 30516ebf90aSShri Abhyankar v1 = av + ai[i]; 30616ebf90aSShri Abhyankar v2 = bv + bi[i]; 30716ebf90aSShri Abhyankar 30816ebf90aSShri Abhyankar /* A-part */ 30916ebf90aSShri Abhyankar for (j=0; j<countA; j++){ 310bccb9932SShri Abhyankar if (reuse == MAT_INITIAL_MATRIX){ 31116ebf90aSShri Abhyankar row[jj] = irow + shift; col[jj] = rstart + ajj[j] + shift; 31216ebf90aSShri Abhyankar } 31316ebf90aSShri Abhyankar val[jj++] = v1[j]; 31416ebf90aSShri Abhyankar } 31516ebf90aSShri Abhyankar 31616ebf90aSShri Abhyankar /* B-part */ 31716ebf90aSShri Abhyankar for(j=0; j < countB; j++){ 318bccb9932SShri Abhyankar if (reuse == MAT_INITIAL_MATRIX){ 31916ebf90aSShri Abhyankar row[jj] = irow + shift; col[jj] = garray[bjj[j]] + shift; 32016ebf90aSShri Abhyankar } 32116ebf90aSShri Abhyankar val[jj++] = v2[j]; 32216ebf90aSShri Abhyankar } 32316ebf90aSShri Abhyankar irow++; 32416ebf90aSShri Abhyankar } 32516ebf90aSShri Abhyankar PetscFunctionReturn(0); 32616ebf90aSShri Abhyankar } 32716ebf90aSShri Abhyankar 32816ebf90aSShri Abhyankar #undef __FUNCT__ 32967877ebaSShri Abhyankar #define __FUNCT__ "MatConvertToTriples_mpibaij_mpiaij" 330bccb9932SShri Abhyankar PetscErrorCode MatConvertToTriples_mpibaij_mpiaij(Mat A,int shift,MatReuse reuse,int *nnz,int **r, int **c, PetscScalar **v) 33167877ebaSShri Abhyankar { 33267877ebaSShri Abhyankar Mat_MPIBAIJ *mat = (Mat_MPIBAIJ*)A->data; 33367877ebaSShri Abhyankar Mat_SeqBAIJ *aa=(Mat_SeqBAIJ*)(mat->A)->data; 33467877ebaSShri Abhyankar Mat_SeqBAIJ *bb=(Mat_SeqBAIJ*)(mat->B)->data; 33567877ebaSShri Abhyankar const PetscInt *ai = aa->i, *bi = bb->i, *aj = aa->j, *bj = bb->j,*ajj, *bjj; 336d985c460SShri Abhyankar const PetscInt *garray = mat->garray,mbs=mat->mbs,rstart=A->rmap->rstart; 33767877ebaSShri Abhyankar const PetscInt bs = A->rmap->bs,bs2=mat->bs2; 33867877ebaSShri Abhyankar PetscErrorCode ierr; 33967877ebaSShri Abhyankar PetscInt nz,i,j,k,n,jj,irow,countA,countB,idx; 34067877ebaSShri Abhyankar PetscInt *row,*col; 34167877ebaSShri Abhyankar const PetscScalar *av=aa->a, *bv=bb->a,*v1,*v2; 34267877ebaSShri Abhyankar PetscScalar *val; 34367877ebaSShri Abhyankar 34467877ebaSShri Abhyankar PetscFunctionBegin; 34567877ebaSShri Abhyankar 346bccb9932SShri Abhyankar if (reuse == MAT_INITIAL_MATRIX) { 34767877ebaSShri Abhyankar nz = bs2*(aa->nz + bb->nz); 34867877ebaSShri Abhyankar *nnz = nz; 349185f6596SHong Zhang ierr = PetscMalloc((2*nz*sizeof(PetscInt)+nz*sizeof(PetscScalar)), &row);CHKERRQ(ierr); 350185f6596SHong Zhang col = row + nz; 351185f6596SHong Zhang val = (PetscScalar*)(col + nz); 352185f6596SHong Zhang 35367877ebaSShri Abhyankar *r = row; *c = col; *v = val; 35467877ebaSShri Abhyankar } else { 35567877ebaSShri Abhyankar row = *r; col = *c; val = *v; 35667877ebaSShri Abhyankar } 35767877ebaSShri Abhyankar 358d985c460SShri Abhyankar jj = 0; irow = rstart; 35967877ebaSShri Abhyankar for ( i=0; i<mbs; i++ ) { 36067877ebaSShri Abhyankar countA = ai[i+1] - ai[i]; 36167877ebaSShri Abhyankar countB = bi[i+1] - bi[i]; 36267877ebaSShri Abhyankar ajj = aj + ai[i]; 36367877ebaSShri Abhyankar bjj = bj + bi[i]; 36467877ebaSShri Abhyankar v1 = av + bs2*ai[i]; 36567877ebaSShri Abhyankar v2 = bv + bs2*bi[i]; 36667877ebaSShri Abhyankar 36767877ebaSShri Abhyankar idx = 0; 36867877ebaSShri Abhyankar /* A-part */ 36967877ebaSShri Abhyankar for (k=0; k<countA; k++){ 37067877ebaSShri Abhyankar for (j=0; j<bs; j++) { 37167877ebaSShri Abhyankar for (n=0; n<bs; n++) { 372bccb9932SShri Abhyankar if (reuse == MAT_INITIAL_MATRIX){ 373d985c460SShri Abhyankar row[jj] = irow + n + shift; 374d985c460SShri Abhyankar col[jj] = rstart + bs*ajj[k] + j + shift; 37567877ebaSShri Abhyankar } 37667877ebaSShri Abhyankar val[jj++] = v1[idx++]; 37767877ebaSShri Abhyankar } 37867877ebaSShri Abhyankar } 37967877ebaSShri Abhyankar } 38067877ebaSShri Abhyankar 38167877ebaSShri Abhyankar idx = 0; 38267877ebaSShri Abhyankar /* B-part */ 38367877ebaSShri Abhyankar for(k=0; k<countB; k++){ 38467877ebaSShri Abhyankar for (j=0; j<bs; j++) { 38567877ebaSShri Abhyankar for (n=0; n<bs; n++) { 386bccb9932SShri Abhyankar if (reuse == MAT_INITIAL_MATRIX){ 387d985c460SShri Abhyankar row[jj] = irow + n + shift; 388d985c460SShri Abhyankar col[jj] = bs*garray[bjj[k]] + j + shift; 38967877ebaSShri Abhyankar } 390d985c460SShri Abhyankar val[jj++] = v2[idx++]; 39167877ebaSShri Abhyankar } 39267877ebaSShri Abhyankar } 39367877ebaSShri Abhyankar } 394d985c460SShri Abhyankar irow += bs; 39567877ebaSShri Abhyankar } 39667877ebaSShri Abhyankar PetscFunctionReturn(0); 39767877ebaSShri Abhyankar } 39867877ebaSShri Abhyankar 39967877ebaSShri Abhyankar #undef __FUNCT__ 40016ebf90aSShri Abhyankar #define __FUNCT__ "MatConvertToTriples_mpiaij_mpisbaij" 401bccb9932SShri Abhyankar PetscErrorCode MatConvertToTriples_mpiaij_mpisbaij(Mat A,int shift,MatReuse reuse,int *nnz,int **r, int **c, PetscScalar **v) 40216ebf90aSShri Abhyankar { 40316ebf90aSShri Abhyankar const PetscInt *ai, *aj,*adiag, *bi, *bj,*garray,m=A->rmap->n,*ajj,*bjj; 40416ebf90aSShri Abhyankar PetscErrorCode ierr; 405e0bace9bSHong Zhang PetscInt rstart,nz,nza,nzb,i,j,jj,irow,countA,countB; 40616ebf90aSShri Abhyankar PetscInt *row,*col; 40716ebf90aSShri Abhyankar const PetscScalar *av, *bv,*v1,*v2; 40816ebf90aSShri Abhyankar PetscScalar *val; 40916ebf90aSShri Abhyankar Mat_MPIAIJ *mat = (Mat_MPIAIJ*)A->data; 41016ebf90aSShri Abhyankar Mat_SeqAIJ *aa=(Mat_SeqAIJ*)(mat->A)->data; 41116ebf90aSShri Abhyankar Mat_SeqAIJ *bb=(Mat_SeqAIJ*)(mat->B)->data; 41216ebf90aSShri Abhyankar 41316ebf90aSShri Abhyankar PetscFunctionBegin; 41416ebf90aSShri Abhyankar ai=aa->i; aj=aa->j; adiag=aa->diag; 41516ebf90aSShri Abhyankar bi=bb->i; bj=bb->j; garray = mat->garray; 41616ebf90aSShri Abhyankar av=aa->a; bv=bb->a; 41716ebf90aSShri Abhyankar rstart = A->rmap->rstart; 41816ebf90aSShri Abhyankar 419bccb9932SShri Abhyankar if (reuse == MAT_INITIAL_MATRIX) { 420e0bace9bSHong Zhang nza = 0; /* num of upper triangular entries in mat->A, including diagonals */ 421e0bace9bSHong Zhang nzb = 0; /* num of upper triangular entries in mat->B */ 42216ebf90aSShri Abhyankar for(i=0; i<m; i++){ 423e0bace9bSHong Zhang nza += (ai[i+1] - adiag[i]); 42416ebf90aSShri Abhyankar countB = bi[i+1] - bi[i]; 42516ebf90aSShri Abhyankar bjj = bj + bi[i]; 426e0bace9bSHong Zhang for (j=0; j<countB; j++){ 427e0bace9bSHong Zhang if (garray[bjj[j]] > rstart) nzb++; 428e0bace9bSHong Zhang } 429e0bace9bSHong Zhang } 43016ebf90aSShri Abhyankar 431e0bace9bSHong Zhang nz = nza + nzb; /* total nz of upper triangular part of mat */ 43216ebf90aSShri Abhyankar *nnz = nz; 433185f6596SHong Zhang ierr = PetscMalloc((2*nz*sizeof(PetscInt)+nz*sizeof(PetscScalar)), &row);CHKERRQ(ierr); 434185f6596SHong Zhang col = row + nz; 435185f6596SHong Zhang val = (PetscScalar*)(col + nz); 436185f6596SHong Zhang 43716ebf90aSShri Abhyankar *r = row; *c = col; *v = val; 43816ebf90aSShri Abhyankar } else { 43916ebf90aSShri Abhyankar row = *r; col = *c; val = *v; 44016ebf90aSShri Abhyankar } 44116ebf90aSShri Abhyankar 44216ebf90aSShri Abhyankar jj = 0; irow = rstart; 44316ebf90aSShri Abhyankar for ( i=0; i<m; i++ ) { 44416ebf90aSShri Abhyankar ajj = aj + adiag[i]; /* ptr to the beginning of the diagonal of this row */ 44516ebf90aSShri Abhyankar v1 = av + adiag[i]; 44616ebf90aSShri Abhyankar countA = ai[i+1] - adiag[i]; 44716ebf90aSShri Abhyankar countB = bi[i+1] - bi[i]; 44816ebf90aSShri Abhyankar bjj = bj + bi[i]; 44916ebf90aSShri Abhyankar v2 = bv + bi[i]; 45016ebf90aSShri Abhyankar 45116ebf90aSShri Abhyankar /* A-part */ 45216ebf90aSShri Abhyankar for (j=0; j<countA; j++){ 453bccb9932SShri Abhyankar if (reuse == MAT_INITIAL_MATRIX) { 45416ebf90aSShri Abhyankar row[jj] = irow + shift; col[jj] = rstart + ajj[j] + shift; 45516ebf90aSShri Abhyankar } 45616ebf90aSShri Abhyankar val[jj++] = v1[j]; 45716ebf90aSShri Abhyankar } 45816ebf90aSShri Abhyankar 45916ebf90aSShri Abhyankar /* B-part */ 46016ebf90aSShri Abhyankar for(j=0; j < countB; j++){ 46116ebf90aSShri Abhyankar if (garray[bjj[j]] > rstart) { 462bccb9932SShri Abhyankar if (reuse == MAT_INITIAL_MATRIX) { 46316ebf90aSShri Abhyankar row[jj] = irow + shift; col[jj] = garray[bjj[j]] + shift; 46416ebf90aSShri Abhyankar } 46516ebf90aSShri Abhyankar val[jj++] = v2[j]; 46616ebf90aSShri Abhyankar } 467397b6df1SKris Buschelman } 468397b6df1SKris Buschelman irow++; 469397b6df1SKris Buschelman } 470397b6df1SKris Buschelman PetscFunctionReturn(0); 471397b6df1SKris Buschelman } 472397b6df1SKris Buschelman 473397b6df1SKris Buschelman #undef __FUNCT__ 4743924e44cSKris Buschelman #define __FUNCT__ "MatDestroy_MUMPS" 475dfbe8321SBarry Smith PetscErrorCode MatDestroy_MUMPS(Mat A) 476dfbe8321SBarry Smith { 477f0c56d0fSKris Buschelman Mat_MUMPS *lu=(Mat_MUMPS*)A->spptr; 478dfbe8321SBarry Smith PetscErrorCode ierr; 479b24902e0SBarry Smith 480397b6df1SKris Buschelman PetscFunctionBegin; 481bf0cc555SLisandro Dalcin if (lu && lu->CleanUpMUMPS) { 482397b6df1SKris Buschelman /* Terminate instance, deallocate memories */ 4836bf464f9SBarry Smith ierr = PetscFree2(lu->id.sol_loc,lu->id.isol_loc);CHKERRQ(ierr); 4846bf464f9SBarry Smith ierr = VecScatterDestroy(&lu->scat_rhs);CHKERRQ(ierr); 4856bf464f9SBarry Smith ierr = VecDestroy(&lu->b_seq);CHKERRQ(ierr); 486bf0cc555SLisandro Dalcin ierr = VecScatterDestroy(&lu->scat_sol);CHKERRQ(ierr); 487bf0cc555SLisandro Dalcin ierr = VecDestroy(&lu->x_seq);CHKERRQ(ierr); 4886bf464f9SBarry Smith ierr=PetscFree(lu->id.perm_in);CHKERRQ(ierr); 489185f6596SHong Zhang ierr = PetscFree(lu->irn);CHKERRQ(ierr); 490397b6df1SKris Buschelman lu->id.job=JOB_END; 491397b6df1SKris Buschelman #if defined(PETSC_USE_COMPLEX) 492397b6df1SKris Buschelman zmumps_c(&lu->id); 493397b6df1SKris Buschelman #else 494397b6df1SKris Buschelman dmumps_c(&lu->id); 495397b6df1SKris Buschelman #endif 496397b6df1SKris Buschelman ierr = MPI_Comm_free(&(lu->comm_mumps));CHKERRQ(ierr); 497397b6df1SKris Buschelman } 498bf0cc555SLisandro Dalcin if (lu && lu->Destroy) { 499bf0cc555SLisandro Dalcin ierr = (lu->Destroy)(A);CHKERRQ(ierr); 500bf0cc555SLisandro Dalcin } 501bf0cc555SLisandro Dalcin ierr = PetscFree(A->spptr);CHKERRQ(ierr); 502bf0cc555SLisandro Dalcin 50397969023SHong Zhang /* clear composed functions */ 50497969023SHong Zhang ierr = PetscObjectComposeFunctionDynamic((PetscObject)A,"MatFactorGetSolverPackage_C","",PETSC_NULL);CHKERRQ(ierr); 505f250808bSBarry Smith ierr = PetscObjectComposeFunctionDynamic((PetscObject)A,"MatMumpsSetIcntl_C","",PETSC_NULL);CHKERRQ(ierr); 506397b6df1SKris Buschelman PetscFunctionReturn(0); 507397b6df1SKris Buschelman } 508397b6df1SKris Buschelman 509397b6df1SKris Buschelman #undef __FUNCT__ 510f6c57405SHong Zhang #define __FUNCT__ "MatSolve_MUMPS" 511b24902e0SBarry Smith PetscErrorCode MatSolve_MUMPS(Mat A,Vec b,Vec x) 512b24902e0SBarry Smith { 513f0c56d0fSKris Buschelman Mat_MUMPS *lu=(Mat_MUMPS*)A->spptr; 514d54de34fSKris Buschelman PetscScalar *array; 51567877ebaSShri Abhyankar Vec b_seq; 516329ec9b3SHong Zhang IS is_iden,is_petsc; 517dfbe8321SBarry Smith PetscErrorCode ierr; 518329ec9b3SHong Zhang PetscInt i; 519397b6df1SKris Buschelman 520397b6df1SKris Buschelman PetscFunctionBegin; 521329ec9b3SHong Zhang lu->id.nrhs = 1; 52267877ebaSShri Abhyankar b_seq = lu->b_seq; 523397b6df1SKris Buschelman if (lu->size > 1){ 524329ec9b3SHong Zhang /* MUMPS only supports centralized rhs. Scatter b into a seqential rhs vector */ 52567877ebaSShri Abhyankar ierr = VecScatterBegin(lu->scat_rhs,b,b_seq,INSERT_VALUES,SCATTER_FORWARD);CHKERRQ(ierr); 52667877ebaSShri Abhyankar ierr = VecScatterEnd(lu->scat_rhs,b,b_seq,INSERT_VALUES,SCATTER_FORWARD);CHKERRQ(ierr); 52767877ebaSShri Abhyankar if (!lu->myid) {ierr = VecGetArray(b_seq,&array);CHKERRQ(ierr);} 528397b6df1SKris Buschelman } else { /* size == 1 */ 529397b6df1SKris Buschelman ierr = VecCopy(b,x);CHKERRQ(ierr); 530397b6df1SKris Buschelman ierr = VecGetArray(x,&array);CHKERRQ(ierr); 531397b6df1SKris Buschelman } 532397b6df1SKris Buschelman if (!lu->myid) { /* define rhs on the host */ 5338278f211SHong Zhang lu->id.nrhs = 1; 534397b6df1SKris Buschelman #if defined(PETSC_USE_COMPLEX) 535397b6df1SKris Buschelman lu->id.rhs = (mumps_double_complex*)array; 536397b6df1SKris Buschelman #else 537397b6df1SKris Buschelman lu->id.rhs = array; 538397b6df1SKris Buschelman #endif 539397b6df1SKris Buschelman } 540397b6df1SKris Buschelman 541397b6df1SKris Buschelman /* solve phase */ 542329ec9b3SHong Zhang /*-------------*/ 5433d472b54SHong Zhang lu->id.job = JOB_SOLVE; 544397b6df1SKris Buschelman #if defined(PETSC_USE_COMPLEX) 545397b6df1SKris Buschelman zmumps_c(&lu->id); 546397b6df1SKris Buschelman #else 547397b6df1SKris Buschelman dmumps_c(&lu->id); 548397b6df1SKris Buschelman #endif 54965e19b50SBarry Smith if (lu->id.INFOG(1) < 0) SETERRQ1(PETSC_COMM_SELF,PETSC_ERR_LIB,"Error reported by MUMPS in solve phase: INFOG(1)=%d\n",lu->id.INFOG(1)); 550397b6df1SKris Buschelman 551329ec9b3SHong Zhang if (lu->size > 1) { /* convert mumps distributed solution to petsc mpi x */ 552329ec9b3SHong Zhang if (!lu->nSolve){ /* create scatter scat_sol */ 553329ec9b3SHong Zhang ierr = ISCreateStride(PETSC_COMM_SELF,lu->id.lsol_loc,0,1,&is_iden);CHKERRQ(ierr); /* from */ 554329ec9b3SHong Zhang for (i=0; i<lu->id.lsol_loc; i++){ 555329ec9b3SHong Zhang lu->id.isol_loc[i] -= 1; /* change Fortran style to C style */ 556397b6df1SKris Buschelman } 55770b3c8c7SBarry Smith ierr = ISCreateGeneral(PETSC_COMM_SELF,lu->id.lsol_loc,lu->id.isol_loc,PETSC_COPY_VALUES,&is_petsc);CHKERRQ(ierr); /* to */ 558329ec9b3SHong Zhang ierr = VecScatterCreate(lu->x_seq,is_iden,x,is_petsc,&lu->scat_sol);CHKERRQ(ierr); 5596bf464f9SBarry Smith ierr = ISDestroy(&is_iden);CHKERRQ(ierr); 5606bf464f9SBarry Smith ierr = ISDestroy(&is_petsc);CHKERRQ(ierr); 561397b6df1SKris Buschelman } 562ca9f406cSSatish Balay ierr = VecScatterBegin(lu->scat_sol,lu->x_seq,x,INSERT_VALUES,SCATTER_FORWARD);CHKERRQ(ierr); 563ca9f406cSSatish Balay ierr = VecScatterEnd(lu->scat_sol,lu->x_seq,x,INSERT_VALUES,SCATTER_FORWARD);CHKERRQ(ierr); 564329ec9b3SHong Zhang } 565329ec9b3SHong Zhang lu->nSolve++; 566397b6df1SKris Buschelman PetscFunctionReturn(0); 567397b6df1SKris Buschelman } 568397b6df1SKris Buschelman 56951d5961aSHong Zhang #undef __FUNCT__ 57051d5961aSHong Zhang #define __FUNCT__ "MatSolveTranspose_MUMPS" 57151d5961aSHong Zhang PetscErrorCode MatSolveTranspose_MUMPS(Mat A,Vec b,Vec x) 57251d5961aSHong Zhang { 57351d5961aSHong Zhang Mat_MUMPS *lu=(Mat_MUMPS*)A->spptr; 57451d5961aSHong Zhang PetscErrorCode ierr; 57551d5961aSHong Zhang 57651d5961aSHong Zhang PetscFunctionBegin; 57751d5961aSHong Zhang lu->id.ICNTL(9) = 0; 5780ad0caddSJed Brown ierr = MatSolve_MUMPS(A,b,x);CHKERRQ(ierr); 57951d5961aSHong Zhang lu->id.ICNTL(9) = 1; 58051d5961aSHong Zhang PetscFunctionReturn(0); 58151d5961aSHong Zhang } 58251d5961aSHong Zhang 583e0b74bf9SHong Zhang #undef __FUNCT__ 584e0b74bf9SHong Zhang #define __FUNCT__ "MatMatSolve_MUMPS" 585e0b74bf9SHong Zhang PetscErrorCode MatMatSolve_MUMPS(Mat A,Mat B,Mat X) 586e0b74bf9SHong Zhang { 587bda8bf91SBarry Smith PetscErrorCode ierr; 588bda8bf91SBarry Smith PetscBool flg; 589bda8bf91SBarry Smith 590e0b74bf9SHong Zhang PetscFunctionBegin; 591bda8bf91SBarry Smith ierr = PetscTypeCompareAny((PetscObject)B,&flg,MATSEQDENSE,MATMPIDENSE,PETSC_NULL);CHKERRQ(ierr); 592bda8bf91SBarry Smith if (!flg) SETERRQ(((PetscObject)A)->comm,PETSC_ERR_ARG_WRONG,"Matrix B must be MATDENSE matrix"); 593bda8bf91SBarry Smith ierr = PetscTypeCompareAny((PetscObject)X,&flg,MATSEQDENSE,MATMPIDENSE,PETSC_NULL);CHKERRQ(ierr); 594bda8bf91SBarry Smith if (!flg) SETERRQ(((PetscObject)A)->comm,PETSC_ERR_ARG_WRONG,"Matrix X must be MATDENSE matrix"); SETERRQ(PETSC_COMM_SELF,PETSC_ERR_SUP,"MatMatSolve_MUMPS() is not implemented yet"); 595e0b74bf9SHong Zhang PetscFunctionReturn(0); 596e0b74bf9SHong Zhang } 597e0b74bf9SHong Zhang 598ace3df97SHong Zhang #if !defined(PETSC_USE_COMPLEX) 599a58c3f20SHong Zhang /* 600a58c3f20SHong Zhang input: 601a58c3f20SHong Zhang F: numeric factor 602a58c3f20SHong Zhang output: 603a58c3f20SHong Zhang nneg: total number of negative pivots 604a58c3f20SHong Zhang nzero: 0 605a58c3f20SHong Zhang npos: (global dimension of F) - nneg 606a58c3f20SHong Zhang */ 607a58c3f20SHong Zhang 608a58c3f20SHong Zhang #undef __FUNCT__ 609a58c3f20SHong Zhang #define __FUNCT__ "MatGetInertia_SBAIJMUMPS" 610dfbe8321SBarry Smith PetscErrorCode MatGetInertia_SBAIJMUMPS(Mat F,int *nneg,int *nzero,int *npos) 611a58c3f20SHong Zhang { 612a58c3f20SHong Zhang Mat_MUMPS *lu =(Mat_MUMPS*)F->spptr; 613dfbe8321SBarry Smith PetscErrorCode ierr; 614c1490034SHong Zhang PetscMPIInt size; 615a58c3f20SHong Zhang 616a58c3f20SHong Zhang PetscFunctionBegin; 6177adad957SLisandro Dalcin ierr = MPI_Comm_size(((PetscObject)F)->comm,&size);CHKERRQ(ierr); 618bcb30aebSHong Zhang /* MUMPS 4.3.1 calls ScaLAPACK when ICNTL(13)=0 (default), which does not offer the possibility to compute the inertia of a dense matrix. Set ICNTL(13)=1 to skip ScaLAPACK */ 61965e19b50SBarry Smith if (size > 1 && lu->id.ICNTL(13) != 1) SETERRQ1(PETSC_COMM_SELF,PETSC_ERR_ARG_WRONG,"ICNTL(13)=%d. -mat_mumps_icntl_13 must be set as 1 for correct global matrix inertia\n",lu->id.INFOG(13)); 620a58c3f20SHong Zhang if (nneg){ 621a58c3f20SHong Zhang if (!lu->myid){ 622a58c3f20SHong Zhang *nneg = lu->id.INFOG(12); 623a58c3f20SHong Zhang } 624bcb30aebSHong Zhang ierr = MPI_Bcast(nneg,1,MPI_INT,0,lu->comm_mumps);CHKERRQ(ierr); 625a58c3f20SHong Zhang } 626a58c3f20SHong Zhang if (nzero) *nzero = 0; 627d0f46423SBarry Smith if (npos) *npos = F->rmap->N - (*nneg); 628a58c3f20SHong Zhang PetscFunctionReturn(0); 629a58c3f20SHong Zhang } 630ace3df97SHong Zhang #endif /* !defined(PETSC_USE_COMPLEX) */ 631a58c3f20SHong Zhang 632397b6df1SKris Buschelman #undef __FUNCT__ 633f6c57405SHong Zhang #define __FUNCT__ "MatFactorNumeric_MUMPS" 6340481f469SBarry Smith PetscErrorCode MatFactorNumeric_MUMPS(Mat F,Mat A,const MatFactorInfo *info) 635af281ebdSHong Zhang { 636dcd589f8SShri Abhyankar Mat_MUMPS *lu =(Mat_MUMPS*)(F)->spptr; 6376849ba73SBarry Smith PetscErrorCode ierr; 638bccb9932SShri Abhyankar MatReuse reuse; 639e09efc27SHong Zhang Mat F_diag; 640ace3abfcSBarry Smith PetscBool isMPIAIJ; 641397b6df1SKris Buschelman 642397b6df1SKris Buschelman PetscFunctionBegin; 643bccb9932SShri Abhyankar reuse = MAT_REUSE_MATRIX; 644bccb9932SShri Abhyankar ierr = (*lu->ConvertToTriples)(A, 1, reuse, &lu->nz, &lu->irn, &lu->jcn, &lu->val);CHKERRQ(ierr); 645397b6df1SKris Buschelman 646397b6df1SKris Buschelman /* numerical factorization phase */ 647329ec9b3SHong Zhang /*-------------------------------*/ 6483d472b54SHong Zhang lu->id.job = JOB_FACTNUMERIC; 649958c9bccSBarry Smith if(!lu->id.ICNTL(18)) { 650a7aca84bSHong Zhang if (!lu->myid) { 651397b6df1SKris Buschelman #if defined(PETSC_USE_COMPLEX) 652397b6df1SKris Buschelman lu->id.a = (mumps_double_complex*)lu->val; 653397b6df1SKris Buschelman #else 654397b6df1SKris Buschelman lu->id.a = lu->val; 655397b6df1SKris Buschelman #endif 656397b6df1SKris Buschelman } 657397b6df1SKris Buschelman } else { 658397b6df1SKris Buschelman #if defined(PETSC_USE_COMPLEX) 659397b6df1SKris Buschelman lu->id.a_loc = (mumps_double_complex*)lu->val; 660397b6df1SKris Buschelman #else 661397b6df1SKris Buschelman lu->id.a_loc = lu->val; 662397b6df1SKris Buschelman #endif 663397b6df1SKris Buschelman } 664397b6df1SKris Buschelman #if defined(PETSC_USE_COMPLEX) 665397b6df1SKris Buschelman zmumps_c(&lu->id); 666397b6df1SKris Buschelman #else 667397b6df1SKris Buschelman dmumps_c(&lu->id); 668397b6df1SKris Buschelman #endif 669397b6df1SKris Buschelman if (lu->id.INFOG(1) < 0) { 67065e19b50SBarry Smith if (lu->id.INFO(1) == -13) SETERRQ1(PETSC_COMM_SELF,PETSC_ERR_LIB,"Error reported by MUMPS in numerical factorization phase: Cannot allocate required memory %d megabytes\n",lu->id.INFO(2)); 67165e19b50SBarry Smith else SETERRQ2(PETSC_COMM_SELF,PETSC_ERR_LIB,"Error reported by MUMPS in numerical factorization phase: INFO(1)=%d, INFO(2)=%d\n",lu->id.INFO(1),lu->id.INFO(2)); 672397b6df1SKris Buschelman } 67365e19b50SBarry Smith if (!lu->myid && lu->id.ICNTL(16) > 0) SETERRQ1(PETSC_COMM_SELF,PETSC_ERR_LIB," lu->id.ICNTL(16):=%d\n",lu->id.INFOG(16)); 674397b6df1SKris Buschelman 6758ada1bb4SHong Zhang if (lu->size > 1){ 67616ebf90aSShri Abhyankar ierr = PetscTypeCompare((PetscObject)A,MATMPIAIJ,&isMPIAIJ);CHKERRQ(ierr); 677a214ac2aSShri Abhyankar if(isMPIAIJ) { 678dcd589f8SShri Abhyankar F_diag = ((Mat_MPIAIJ *)(F)->data)->A; 679e09efc27SHong Zhang } else { 680dcd589f8SShri Abhyankar F_diag = ((Mat_MPISBAIJ *)(F)->data)->A; 681e09efc27SHong Zhang } 682e09efc27SHong Zhang F_diag->assembled = PETSC_TRUE; 683329ec9b3SHong Zhang if (lu->nSolve){ 6846bf464f9SBarry Smith ierr = VecScatterDestroy(&lu->scat_sol);CHKERRQ(ierr); 6850e83c824SBarry Smith ierr = PetscFree2(lu->id.sol_loc,lu->id.isol_loc);CHKERRQ(ierr); 6866bf464f9SBarry Smith ierr = VecDestroy(&lu->x_seq);CHKERRQ(ierr); 687329ec9b3SHong Zhang } 6888ada1bb4SHong Zhang } 689dcd589f8SShri Abhyankar (F)->assembled = PETSC_TRUE; 690397b6df1SKris Buschelman lu->matstruc = SAME_NONZERO_PATTERN; 691ace87b0dSHong Zhang lu->CleanUpMUMPS = PETSC_TRUE; 692329ec9b3SHong Zhang lu->nSolve = 0; 69367877ebaSShri Abhyankar 69467877ebaSShri Abhyankar if (lu->size > 1){ 69567877ebaSShri Abhyankar /* distributed solution */ 69667877ebaSShri Abhyankar lu->id.ICNTL(21) = 1; 69767877ebaSShri Abhyankar if (!lu->nSolve){ 69867877ebaSShri Abhyankar /* Create x_seq=sol_loc for repeated use */ 69967877ebaSShri Abhyankar PetscInt lsol_loc; 70067877ebaSShri Abhyankar PetscScalar *sol_loc; 70167877ebaSShri Abhyankar lsol_loc = lu->id.INFO(23); /* length of sol_loc */ 70267877ebaSShri Abhyankar ierr = PetscMalloc2(lsol_loc,PetscScalar,&sol_loc,lsol_loc,PetscInt,&lu->id.isol_loc);CHKERRQ(ierr); 70367877ebaSShri Abhyankar lu->id.lsol_loc = lsol_loc; 70467877ebaSShri Abhyankar #if defined(PETSC_USE_COMPLEX) 70567877ebaSShri Abhyankar lu->id.sol_loc = (mumps_double_complex*)sol_loc; 70667877ebaSShri Abhyankar #else 70767877ebaSShri Abhyankar lu->id.sol_loc = sol_loc; 70867877ebaSShri Abhyankar #endif 70967877ebaSShri Abhyankar ierr = VecCreateSeqWithArray(PETSC_COMM_SELF,lsol_loc,sol_loc,&lu->x_seq);CHKERRQ(ierr); 71067877ebaSShri Abhyankar } 71167877ebaSShri Abhyankar } 712397b6df1SKris Buschelman PetscFunctionReturn(0); 713397b6df1SKris Buschelman } 714397b6df1SKris Buschelman 7159a2535b5SHong Zhang /* Sets MUMPS options from the options database */ 716dcd589f8SShri Abhyankar #undef __FUNCT__ 7179a2535b5SHong Zhang #define __FUNCT__ "PetscSetMUMPSFromOptions" 7189a2535b5SHong Zhang PetscErrorCode PetscSetMUMPSFromOptions(Mat F, Mat A) 719dcd589f8SShri Abhyankar { 7209a2535b5SHong Zhang Mat_MUMPS *mumps = (Mat_MUMPS*)F->spptr; 721dcd589f8SShri Abhyankar PetscErrorCode ierr; 722dcd589f8SShri Abhyankar PetscInt icntl; 723ace3abfcSBarry Smith PetscBool flg; 724dcd589f8SShri Abhyankar 725dcd589f8SShri Abhyankar PetscFunctionBegin; 726dcd589f8SShri Abhyankar ierr = PetscOptionsBegin(((PetscObject)A)->comm,((PetscObject)A)->prefix,"MUMPS Options","Mat");CHKERRQ(ierr); 7279a2535b5SHong Zhang ierr = PetscOptionsInt("-mat_mumps_icntl_1","ICNTL(1): output stream for error messages","None",mumps->id.ICNTL(1),&icntl,&flg);CHKERRQ(ierr); 7289a2535b5SHong Zhang if (flg) mumps->id.ICNTL(1) = icntl; 7299a2535b5SHong Zhang ierr = PetscOptionsInt("-mat_mumps_icntl_2","ICNTL(2): output stream for diagnostic printing, statistics, and warning","None",mumps->id.ICNTL(2),&icntl,&flg);CHKERRQ(ierr); 7309a2535b5SHong Zhang if (flg) mumps->id.ICNTL(2) = icntl; 7319a2535b5SHong Zhang ierr = PetscOptionsInt("-mat_mumps_icntl_3","ICNTL(3): output stream for global information, collected on the host","None",mumps->id.ICNTL(3),&icntl,&flg);CHKERRQ(ierr); 7329a2535b5SHong Zhang if (flg) mumps->id.ICNTL(3) = icntl; 733dcd589f8SShri Abhyankar 7349a2535b5SHong Zhang ierr = PetscOptionsInt("-mat_mumps_icntl_4","ICNTL(4): level of printing (0 to 4)","None",mumps->id.ICNTL(4),&icntl,&flg);CHKERRQ(ierr); 7359a2535b5SHong Zhang if (flg) mumps->id.ICNTL(4) = icntl; 7369a2535b5SHong Zhang if (mumps->id.ICNTL(4) || PetscLogPrintInfo ) mumps->id.ICNTL(3) = 6; /* resume MUMPS default id.ICNTL(3) = 6 */ 7379a2535b5SHong Zhang 7389a2535b5SHong Zhang ierr = PetscOptionsInt("-mat_mumps_icntl_6","ICNTL(6): permuting and/or scaling the matrix (0 to 7)","None",mumps->id.ICNTL(6),&icntl,&flg);CHKERRQ(ierr); 7399a2535b5SHong Zhang if (flg) mumps->id.ICNTL(6) = icntl; 7409a2535b5SHong Zhang 7419a2535b5SHong Zhang ierr = PetscOptionsInt("-mat_mumps_icntl_7","ICNTL(7): matrix ordering (0 to 7). 3=Scotch, 4=PORD, 5=Metis","None",mumps->id.ICNTL(7),&icntl,&flg);CHKERRQ(ierr); 742dcd589f8SShri Abhyankar if (flg) { 7439a2535b5SHong Zhang if (icntl== 1 && mumps->size > 1){ 744e32f2f54SBarry Smith SETERRQ(PETSC_COMM_SELF,PETSC_ERR_SUP,"pivot order be set by the user in PERM_IN -- not supported by the PETSc/MUMPS interface\n"); 745dcd589f8SShri Abhyankar } else { 7469a2535b5SHong Zhang mumps->id.ICNTL(7) = icntl; 747dcd589f8SShri Abhyankar } 748dcd589f8SShri Abhyankar } 749e0b74bf9SHong Zhang 7509a2535b5SHong Zhang ierr = PetscOptionsInt("-mat_mumps_icntl_8","ICNTL(8): scaling strategy (-2 to 8 or 77)","None",mumps->id.ICNTL(8),&icntl,&flg);CHKERRQ(ierr); 7519a2535b5SHong Zhang if (flg) mumps->id.ICNTL(8) = icntl; 752dcd589f8SShri Abhyankar 7539a2535b5SHong Zhang ierr = PetscOptionsInt("-mat_mumps_icntl_10","ICNTL(10): max num of refinements","None",mumps->id.ICNTL(10),&mumps->id.ICNTL(10),PETSC_NULL);CHKERRQ(ierr); 7549a2535b5SHong Zhang ierr = PetscOptionsInt("-mat_mumps_icntl_11","ICNTL(11): statistics related to the linear system solved (via -ksp_view)","None",mumps->id.ICNTL(11),&mumps->id.ICNTL(11),PETSC_NULL);CHKERRQ(ierr); 7559a2535b5SHong Zhang ierr = PetscOptionsInt("-mat_mumps_icntl_12","ICNTL(12): efficiency control: defines the ordering strategy with scaling constraints (0 to 3","None",mumps->id.ICNTL(12),&mumps->id.ICNTL(12),PETSC_NULL);CHKERRQ(ierr); 7569a2535b5SHong Zhang ierr = PetscOptionsInt("-mat_mumps_icntl_13","ICNTL(13): efficiency control: with or without ScaLAPACK","None",mumps->id.ICNTL(13),&mumps->id.ICNTL(13),PETSC_NULL);CHKERRQ(ierr); 7579a2535b5SHong Zhang ierr = PetscOptionsInt("-mat_mumps_icntl_14","ICNTL(14): percentage of estimated workspace increase","None",mumps->id.ICNTL(14),&mumps->id.ICNTL(14),PETSC_NULL);CHKERRQ(ierr); 7589a2535b5SHong Zhang ierr = PetscOptionsInt("-mat_mumps_icntl_19","ICNTL(19): Schur complement","None",mumps->id.ICNTL(19),&mumps->id.ICNTL(19),PETSC_NULL);CHKERRQ(ierr); 7599a2535b5SHong Zhang 7609a2535b5SHong Zhang ierr = PetscOptionsInt("-mat_mumps_icntl_22","ICNTL(22): in-core/out-of-core facility (0 or 1)","None",mumps->id.ICNTL(22),&mumps->id.ICNTL(22),PETSC_NULL);CHKERRQ(ierr); 7619a2535b5SHong Zhang ierr = PetscOptionsInt("-mat_mumps_icntl_23","ICNTL(23): max size of the working memory (MB) that can allocate per processor","None",mumps->id.ICNTL(23),&mumps->id.ICNTL(23),PETSC_NULL);CHKERRQ(ierr); 7629a2535b5SHong Zhang ierr = PetscOptionsInt("-mat_mumps_icntl_24","ICNTL(24): detection of null pivot rows (0 or 1)","None",mumps->id.ICNTL(24),&mumps->id.ICNTL(24),PETSC_NULL);CHKERRQ(ierr); 7639a2535b5SHong Zhang if (mumps->id.ICNTL(24)){ 7649a2535b5SHong Zhang mumps->id.ICNTL(13) = 1; /* turn-off ScaLAPACK to help with the correct detection of null pivots */ 765d7ebd59bSHong Zhang } 766d7ebd59bSHong Zhang 7679a2535b5SHong Zhang ierr = PetscOptionsInt("-mat_mumps_icntl_25","ICNTL(25): computation of a null space basis","None",mumps->id.ICNTL(25),&mumps->id.ICNTL(25),PETSC_NULL);CHKERRQ(ierr); 7689a2535b5SHong Zhang ierr = PetscOptionsInt("-mat_mumps_icntl_26","ICNTL(26): Schur options for right-hand side or solution vector","None",mumps->id.ICNTL(26),&mumps->id.ICNTL(26),PETSC_NULL);CHKERRQ(ierr); 7699a2535b5SHong Zhang ierr = PetscOptionsInt("-mat_mumps_icntl_27","ICNTL(27): experimental parameter","None",mumps->id.ICNTL(27),&mumps->id.ICNTL(27),PETSC_NULL);CHKERRQ(ierr); 7709a2535b5SHong Zhang ierr = PetscOptionsInt("-mat_mumps_icntl_28","ICNTL(28): use 1 for sequential analysis and ictnl(7) ordering, or 2 for parallel analysis and ictnl(29) ordering","None",mumps->id.ICNTL(28),&mumps->id.ICNTL(28),PETSC_NULL);CHKERRQ(ierr); 7719a2535b5SHong Zhang ierr = PetscOptionsInt("-mat_mumps_icntl_29","ICNTL(29): parallel ordering 1 = ptscotch 2 = parmetis","None",mumps->id.ICNTL(29),&mumps->id.ICNTL(29),PETSC_NULL);CHKERRQ(ierr); 7729a2535b5SHong Zhang ierr = PetscOptionsInt("-mat_mumps_icntl_30","ICNTL(30): compute user-specified set of entries in inv(A)","None",mumps->id.ICNTL(30),&mumps->id.ICNTL(30),PETSC_NULL);CHKERRQ(ierr); 7739a2535b5SHong Zhang ierr = PetscOptionsInt("-mat_mumps_icntl_31","ICNTL(31): factors can be discarded in the solve phase","None",mumps->id.ICNTL(31),&mumps->id.ICNTL(31),PETSC_NULL);CHKERRQ(ierr); 7749a2535b5SHong Zhang ierr = PetscOptionsInt("-mat_mumps_icntl_33","ICNTL(33): compute determinant","None",mumps->id.ICNTL(33),&mumps->id.ICNTL(33),PETSC_NULL);CHKERRQ(ierr); 775dcd589f8SShri Abhyankar 7769a2535b5SHong Zhang ierr = PetscOptionsReal("-mat_mumps_cntl_1","CNTL(1): relative pivoting threshold","None",mumps->id.CNTL(1),&mumps->id.CNTL(1),PETSC_NULL);CHKERRQ(ierr); 7779a2535b5SHong Zhang ierr = PetscOptionsReal("-mat_mumps_cntl_2","CNTL(2): stopping criterion of refinement","None",mumps->id.CNTL(2),&mumps->id.CNTL(2),PETSC_NULL);CHKERRQ(ierr); 7789a2535b5SHong Zhang ierr = PetscOptionsReal("-mat_mumps_cntl_3","CNTL(3): absolute pivoting threshold","None",mumps->id.CNTL(3),&mumps->id.CNTL(3),PETSC_NULL);CHKERRQ(ierr); 7799a2535b5SHong Zhang ierr = PetscOptionsReal("-mat_mumps_cntl_4","CNTL(4): value for static pivoting","None",mumps->id.CNTL(4),&mumps->id.CNTL(4),PETSC_NULL);CHKERRQ(ierr); 7809a2535b5SHong Zhang ierr = PetscOptionsReal("-mat_mumps_cntl_5","CNTL(5): fixation for null pivots","None",mumps->id.CNTL(5),&mumps->id.CNTL(5),PETSC_NULL);CHKERRQ(ierr); 781dcd589f8SShri Abhyankar PetscOptionsEnd(); 782dcd589f8SShri Abhyankar PetscFunctionReturn(0); 783dcd589f8SShri Abhyankar } 784dcd589f8SShri Abhyankar 785dcd589f8SShri Abhyankar #undef __FUNCT__ 786dcd589f8SShri Abhyankar #define __FUNCT__ "PetscInitializeMUMPS" 787f697e70eSHong Zhang PetscErrorCode PetscInitializeMUMPS(Mat A,Mat_MUMPS* mumps) 788dcd589f8SShri Abhyankar { 789dcd589f8SShri Abhyankar PetscErrorCode ierr; 790dcd589f8SShri Abhyankar 791dcd589f8SShri Abhyankar PetscFunctionBegin; 792f697e70eSHong Zhang ierr = MPI_Comm_rank(((PetscObject)A)->comm, &mumps->myid); 793f697e70eSHong Zhang ierr = MPI_Comm_size(((PetscObject)A)->comm,&mumps->size);CHKERRQ(ierr); 794f697e70eSHong Zhang ierr = MPI_Comm_dup(((PetscObject)A)->comm,&(mumps->comm_mumps));CHKERRQ(ierr); 795f697e70eSHong Zhang mumps->id.comm_fortran = MPI_Comm_c2f(mumps->comm_mumps); 796f697e70eSHong Zhang 797f697e70eSHong Zhang mumps->id.job = JOB_INIT; 798f697e70eSHong Zhang mumps->id.par = 1; /* host participates factorizaton and solve */ 799f697e70eSHong Zhang mumps->id.sym = mumps->sym; 800dcd589f8SShri Abhyankar #if defined(PETSC_USE_COMPLEX) 801f697e70eSHong Zhang zmumps_c(&mumps->id); 802dcd589f8SShri Abhyankar #else 803f697e70eSHong Zhang dmumps_c(&mumps->id); 804dcd589f8SShri Abhyankar #endif 805f697e70eSHong Zhang 806f697e70eSHong Zhang mumps->CleanUpMUMPS = PETSC_FALSE; 807f697e70eSHong Zhang mumps->scat_rhs = PETSC_NULL; 808f697e70eSHong Zhang mumps->scat_sol = PETSC_NULL; 809f697e70eSHong Zhang mumps->nSolve = 0; 8109a2535b5SHong Zhang 8119a2535b5SHong Zhang /* set PETSc-MUMPS default options */ 8129a2535b5SHong Zhang mumps->id.ICNTL(3) = 0; 8139a2535b5SHong Zhang mumps->id.ICNTL(4) = 0; 8149a2535b5SHong Zhang 8159a2535b5SHong Zhang if (mumps->size == 1){ 8169a2535b5SHong Zhang mumps->id.ICNTL(18) = 0; /* centralized assembled matrix input */ 8179a2535b5SHong Zhang } else { 8189a2535b5SHong Zhang mumps->id.ICNTL(18) = 3; /* distributed assembled matrix input */ 8199a2535b5SHong Zhang } 820dcd589f8SShri Abhyankar PetscFunctionReturn(0); 821dcd589f8SShri Abhyankar } 822dcd589f8SShri Abhyankar 823397b6df1SKris Buschelman /* Note the Petsc r and c permutations are ignored */ 824397b6df1SKris Buschelman #undef __FUNCT__ 825f0c56d0fSKris Buschelman #define __FUNCT__ "MatLUFactorSymbolic_AIJMUMPS" 8260481f469SBarry Smith PetscErrorCode MatLUFactorSymbolic_AIJMUMPS(Mat F,Mat A,IS r,IS c,const MatFactorInfo *info) 827b24902e0SBarry Smith { 828719d5645SBarry Smith Mat_MUMPS *lu = (Mat_MUMPS*)F->spptr; 829dcd589f8SShri Abhyankar PetscErrorCode ierr; 830bccb9932SShri Abhyankar MatReuse reuse; 83167877ebaSShri Abhyankar Vec b; 83267877ebaSShri Abhyankar IS is_iden; 83367877ebaSShri Abhyankar const PetscInt M = A->rmap->N; 834397b6df1SKris Buschelman 835397b6df1SKris Buschelman PetscFunctionBegin; 836b24902e0SBarry Smith lu->matstruc = DIFFERENT_NONZERO_PATTERN; 837dcd589f8SShri Abhyankar 8389a2535b5SHong Zhang /* Set MUMPS options from the options database */ 8399a2535b5SHong Zhang ierr = PetscSetMUMPSFromOptions(F,A);CHKERRQ(ierr); 840dcd589f8SShri Abhyankar 841bccb9932SShri Abhyankar reuse = MAT_INITIAL_MATRIX; 842bccb9932SShri Abhyankar ierr = (*lu->ConvertToTriples)(A, 1, reuse, &lu->nz, &lu->irn, &lu->jcn, &lu->val);CHKERRQ(ierr); 843dcd589f8SShri Abhyankar 84467877ebaSShri Abhyankar /* analysis phase */ 84567877ebaSShri Abhyankar /*----------------*/ 8463d472b54SHong Zhang lu->id.job = JOB_FACTSYMBOLIC; 84767877ebaSShri Abhyankar lu->id.n = M; 84867877ebaSShri Abhyankar switch (lu->id.ICNTL(18)){ 84967877ebaSShri Abhyankar case 0: /* centralized assembled matrix input */ 85067877ebaSShri Abhyankar if (!lu->myid) { 85167877ebaSShri Abhyankar lu->id.nz =lu->nz; lu->id.irn=lu->irn; lu->id.jcn=lu->jcn; 85267877ebaSShri Abhyankar if (lu->id.ICNTL(6)>1){ 85367877ebaSShri Abhyankar #if defined(PETSC_USE_COMPLEX) 85467877ebaSShri Abhyankar lu->id.a = (mumps_double_complex*)lu->val; 85567877ebaSShri Abhyankar #else 85667877ebaSShri Abhyankar lu->id.a = lu->val; 85767877ebaSShri Abhyankar #endif 85867877ebaSShri Abhyankar } 859e0b74bf9SHong Zhang if (lu->id.ICNTL(7) == 1){ /* use user-provide matrix ordering */ 860e0b74bf9SHong Zhang if (!lu->myid) { 861e0b74bf9SHong Zhang const PetscInt *idx; 862e0b74bf9SHong Zhang PetscInt i,*perm_in; 863e0b74bf9SHong Zhang ierr = PetscMalloc(M*sizeof(PetscInt),&perm_in);CHKERRQ(ierr); 864e0b74bf9SHong Zhang ierr = ISGetIndices(r,&idx);CHKERRQ(ierr); 865e0b74bf9SHong Zhang lu->id.perm_in = perm_in; 866e0b74bf9SHong Zhang for (i=0; i<M; i++) perm_in[i] = idx[i]+1; /* perm_in[]: start from 1, not 0! */ 867e0b74bf9SHong Zhang ierr = ISRestoreIndices(r,&idx);CHKERRQ(ierr); 868e0b74bf9SHong Zhang } 869e0b74bf9SHong Zhang } 87067877ebaSShri Abhyankar } 87167877ebaSShri Abhyankar break; 87267877ebaSShri Abhyankar case 3: /* distributed assembled matrix input (size>1) */ 87367877ebaSShri Abhyankar lu->id.nz_loc = lu->nz; 87467877ebaSShri Abhyankar lu->id.irn_loc=lu->irn; lu->id.jcn_loc=lu->jcn; 87567877ebaSShri Abhyankar if (lu->id.ICNTL(6)>1) { 87667877ebaSShri Abhyankar #if defined(PETSC_USE_COMPLEX) 87767877ebaSShri Abhyankar lu->id.a_loc = (mumps_double_complex*)lu->val; 87867877ebaSShri Abhyankar #else 87967877ebaSShri Abhyankar lu->id.a_loc = lu->val; 88067877ebaSShri Abhyankar #endif 88167877ebaSShri Abhyankar } 88267877ebaSShri Abhyankar /* MUMPS only supports centralized rhs. Create scatter scat_rhs for repeated use in MatSolve() */ 88367877ebaSShri Abhyankar if (!lu->myid){ 88467877ebaSShri Abhyankar ierr = VecCreateSeq(PETSC_COMM_SELF,A->cmap->N,&lu->b_seq);CHKERRQ(ierr); 88567877ebaSShri Abhyankar ierr = ISCreateStride(PETSC_COMM_SELF,A->cmap->N,0,1,&is_iden);CHKERRQ(ierr); 88667877ebaSShri Abhyankar } else { 88767877ebaSShri Abhyankar ierr = VecCreateSeq(PETSC_COMM_SELF,0,&lu->b_seq);CHKERRQ(ierr); 88867877ebaSShri Abhyankar ierr = ISCreateStride(PETSC_COMM_SELF,0,0,1,&is_iden);CHKERRQ(ierr); 88967877ebaSShri Abhyankar } 89067877ebaSShri Abhyankar ierr = VecCreate(((PetscObject)A)->comm,&b);CHKERRQ(ierr); 89167877ebaSShri Abhyankar ierr = VecSetSizes(b,A->rmap->n,PETSC_DECIDE);CHKERRQ(ierr); 89267877ebaSShri Abhyankar ierr = VecSetFromOptions(b);CHKERRQ(ierr); 89367877ebaSShri Abhyankar 89467877ebaSShri Abhyankar ierr = VecScatterCreate(b,is_iden,lu->b_seq,is_iden,&lu->scat_rhs);CHKERRQ(ierr); 8956bf464f9SBarry Smith ierr = ISDestroy(&is_iden);CHKERRQ(ierr); 8966bf464f9SBarry Smith ierr = VecDestroy(&b);CHKERRQ(ierr); 89767877ebaSShri Abhyankar break; 89867877ebaSShri Abhyankar } 89967877ebaSShri Abhyankar #if defined(PETSC_USE_COMPLEX) 90067877ebaSShri Abhyankar zmumps_c(&lu->id); 90167877ebaSShri Abhyankar #else 90267877ebaSShri Abhyankar dmumps_c(&lu->id); 90367877ebaSShri Abhyankar #endif 90467877ebaSShri Abhyankar if (lu->id.INFOG(1) < 0) SETERRQ1(PETSC_COMM_SELF,PETSC_ERR_LIB,"Error reported by MUMPS in analysis phase: INFOG(1)=%d\n",lu->id.INFOG(1)); 90567877ebaSShri Abhyankar 906719d5645SBarry Smith F->ops->lufactornumeric = MatFactorNumeric_MUMPS; 907dcd589f8SShri Abhyankar F->ops->solve = MatSolve_MUMPS; 90851d5961aSHong Zhang F->ops->solvetranspose = MatSolveTranspose_MUMPS; 909e0b74bf9SHong Zhang F->ops->matsolve = MatMatSolve_MUMPS; 910b24902e0SBarry Smith PetscFunctionReturn(0); 911b24902e0SBarry Smith } 912b24902e0SBarry Smith 913450b117fSShri Abhyankar /* Note the Petsc r and c permutations are ignored */ 914450b117fSShri Abhyankar #undef __FUNCT__ 915450b117fSShri Abhyankar #define __FUNCT__ "MatLUFactorSymbolic_BAIJMUMPS" 916450b117fSShri Abhyankar PetscErrorCode MatLUFactorSymbolic_BAIJMUMPS(Mat F,Mat A,IS r,IS c,const MatFactorInfo *info) 917450b117fSShri Abhyankar { 918dcd589f8SShri Abhyankar 919450b117fSShri Abhyankar Mat_MUMPS *lu = (Mat_MUMPS*)F->spptr; 920dcd589f8SShri Abhyankar PetscErrorCode ierr; 921bccb9932SShri Abhyankar MatReuse reuse; 92267877ebaSShri Abhyankar Vec b; 92367877ebaSShri Abhyankar IS is_iden; 92467877ebaSShri Abhyankar const PetscInt M = A->rmap->N; 925450b117fSShri Abhyankar 926450b117fSShri Abhyankar PetscFunctionBegin; 927450b117fSShri Abhyankar lu->matstruc = DIFFERENT_NONZERO_PATTERN; 928dcd589f8SShri Abhyankar 9299a2535b5SHong Zhang /* Set MUMPS options from the options database */ 9309a2535b5SHong Zhang ierr = PetscSetMUMPSFromOptions(F,A);CHKERRQ(ierr); 931dcd589f8SShri Abhyankar 932bccb9932SShri Abhyankar reuse = MAT_INITIAL_MATRIX; 933bccb9932SShri Abhyankar ierr = (*lu->ConvertToTriples)(A, 1, reuse, &lu->nz, &lu->irn, &lu->jcn, &lu->val);CHKERRQ(ierr); 93467877ebaSShri Abhyankar 93567877ebaSShri Abhyankar /* analysis phase */ 93667877ebaSShri Abhyankar /*----------------*/ 9373d472b54SHong Zhang lu->id.job = JOB_FACTSYMBOLIC; 93867877ebaSShri Abhyankar lu->id.n = M; 93967877ebaSShri Abhyankar switch (lu->id.ICNTL(18)){ 94067877ebaSShri Abhyankar case 0: /* centralized assembled matrix input */ 94167877ebaSShri Abhyankar if (!lu->myid) { 94267877ebaSShri Abhyankar lu->id.nz =lu->nz; lu->id.irn=lu->irn; lu->id.jcn=lu->jcn; 94367877ebaSShri Abhyankar if (lu->id.ICNTL(6)>1){ 94467877ebaSShri Abhyankar #if defined(PETSC_USE_COMPLEX) 94567877ebaSShri Abhyankar lu->id.a = (mumps_double_complex*)lu->val; 94667877ebaSShri Abhyankar #else 94767877ebaSShri Abhyankar lu->id.a = lu->val; 94867877ebaSShri Abhyankar #endif 94967877ebaSShri Abhyankar } 95067877ebaSShri Abhyankar } 95167877ebaSShri Abhyankar break; 95267877ebaSShri Abhyankar case 3: /* distributed assembled matrix input (size>1) */ 95367877ebaSShri Abhyankar lu->id.nz_loc = lu->nz; 95467877ebaSShri Abhyankar lu->id.irn_loc=lu->irn; lu->id.jcn_loc=lu->jcn; 95567877ebaSShri Abhyankar if (lu->id.ICNTL(6)>1) { 95667877ebaSShri Abhyankar #if defined(PETSC_USE_COMPLEX) 95767877ebaSShri Abhyankar lu->id.a_loc = (mumps_double_complex*)lu->val; 95867877ebaSShri Abhyankar #else 95967877ebaSShri Abhyankar lu->id.a_loc = lu->val; 96067877ebaSShri Abhyankar #endif 96167877ebaSShri Abhyankar } 96267877ebaSShri Abhyankar /* MUMPS only supports centralized rhs. Create scatter scat_rhs for repeated use in MatSolve() */ 96367877ebaSShri Abhyankar if (!lu->myid){ 96467877ebaSShri Abhyankar ierr = VecCreateSeq(PETSC_COMM_SELF,A->cmap->N,&lu->b_seq);CHKERRQ(ierr); 96567877ebaSShri Abhyankar ierr = ISCreateStride(PETSC_COMM_SELF,A->cmap->N,0,1,&is_iden);CHKERRQ(ierr); 96667877ebaSShri Abhyankar } else { 96767877ebaSShri Abhyankar ierr = VecCreateSeq(PETSC_COMM_SELF,0,&lu->b_seq);CHKERRQ(ierr); 96867877ebaSShri Abhyankar ierr = ISCreateStride(PETSC_COMM_SELF,0,0,1,&is_iden);CHKERRQ(ierr); 96967877ebaSShri Abhyankar } 97067877ebaSShri Abhyankar ierr = VecCreate(((PetscObject)A)->comm,&b);CHKERRQ(ierr); 97167877ebaSShri Abhyankar ierr = VecSetSizes(b,A->rmap->n,PETSC_DECIDE);CHKERRQ(ierr); 97267877ebaSShri Abhyankar ierr = VecSetFromOptions(b);CHKERRQ(ierr); 97367877ebaSShri Abhyankar 97467877ebaSShri Abhyankar ierr = VecScatterCreate(b,is_iden,lu->b_seq,is_iden,&lu->scat_rhs);CHKERRQ(ierr); 9756bf464f9SBarry Smith ierr = ISDestroy(&is_iden);CHKERRQ(ierr); 9766bf464f9SBarry Smith ierr = VecDestroy(&b);CHKERRQ(ierr); 97767877ebaSShri Abhyankar break; 97867877ebaSShri Abhyankar } 97967877ebaSShri Abhyankar #if defined(PETSC_USE_COMPLEX) 98067877ebaSShri Abhyankar zmumps_c(&lu->id); 98167877ebaSShri Abhyankar #else 98267877ebaSShri Abhyankar dmumps_c(&lu->id); 98367877ebaSShri Abhyankar #endif 98467877ebaSShri Abhyankar if (lu->id.INFOG(1) < 0) SETERRQ1(PETSC_COMM_SELF,PETSC_ERR_LIB,"Error reported by MUMPS in analysis phase: INFOG(1)=%d\n",lu->id.INFOG(1)); 98567877ebaSShri Abhyankar 986450b117fSShri Abhyankar F->ops->lufactornumeric = MatFactorNumeric_MUMPS; 987dcd589f8SShri Abhyankar F->ops->solve = MatSolve_MUMPS; 98851d5961aSHong Zhang F->ops->solvetranspose = MatSolveTranspose_MUMPS; 989450b117fSShri Abhyankar PetscFunctionReturn(0); 990450b117fSShri Abhyankar } 991b24902e0SBarry Smith 992141f4205SHong Zhang /* Note the Petsc r permutation and factor info are ignored */ 993397b6df1SKris Buschelman #undef __FUNCT__ 99467877ebaSShri Abhyankar #define __FUNCT__ "MatCholeskyFactorSymbolic_MUMPS" 99567877ebaSShri Abhyankar PetscErrorCode MatCholeskyFactorSymbolic_MUMPS(Mat F,Mat A,IS r,const MatFactorInfo *info) 996b24902e0SBarry Smith { 9972792810eSHong Zhang Mat_MUMPS *lu = (Mat_MUMPS*)F->spptr; 998dcd589f8SShri Abhyankar PetscErrorCode ierr; 999bccb9932SShri Abhyankar MatReuse reuse; 100067877ebaSShri Abhyankar Vec b; 100167877ebaSShri Abhyankar IS is_iden; 100267877ebaSShri Abhyankar const PetscInt M = A->rmap->N; 1003397b6df1SKris Buschelman 1004397b6df1SKris Buschelman PetscFunctionBegin; 1005b24902e0SBarry Smith lu->matstruc = DIFFERENT_NONZERO_PATTERN; 1006dcd589f8SShri Abhyankar 10079a2535b5SHong Zhang /* Set MUMPS options from the options database */ 10089a2535b5SHong Zhang ierr = PetscSetMUMPSFromOptions(F,A);CHKERRQ(ierr); 1009dcd589f8SShri Abhyankar 1010bccb9932SShri Abhyankar reuse = MAT_INITIAL_MATRIX; 1011bccb9932SShri Abhyankar ierr = (*lu->ConvertToTriples)(A, 1 , reuse, &lu->nz, &lu->irn, &lu->jcn, &lu->val);CHKERRQ(ierr); 1012dcd589f8SShri Abhyankar 101367877ebaSShri Abhyankar /* analysis phase */ 101467877ebaSShri Abhyankar /*----------------*/ 10153d472b54SHong Zhang lu->id.job = JOB_FACTSYMBOLIC; 101667877ebaSShri Abhyankar lu->id.n = M; 101767877ebaSShri Abhyankar switch (lu->id.ICNTL(18)){ 101867877ebaSShri Abhyankar case 0: /* centralized assembled matrix input */ 101967877ebaSShri Abhyankar if (!lu->myid) { 102067877ebaSShri Abhyankar lu->id.nz =lu->nz; lu->id.irn=lu->irn; lu->id.jcn=lu->jcn; 102167877ebaSShri Abhyankar if (lu->id.ICNTL(6)>1){ 102267877ebaSShri Abhyankar #if defined(PETSC_USE_COMPLEX) 102367877ebaSShri Abhyankar lu->id.a = (mumps_double_complex*)lu->val; 102467877ebaSShri Abhyankar #else 102567877ebaSShri Abhyankar lu->id.a = lu->val; 102667877ebaSShri Abhyankar #endif 102767877ebaSShri Abhyankar } 102867877ebaSShri Abhyankar } 102967877ebaSShri Abhyankar break; 103067877ebaSShri Abhyankar case 3: /* distributed assembled matrix input (size>1) */ 103167877ebaSShri Abhyankar lu->id.nz_loc = lu->nz; 103267877ebaSShri Abhyankar lu->id.irn_loc=lu->irn; lu->id.jcn_loc=lu->jcn; 103367877ebaSShri Abhyankar if (lu->id.ICNTL(6)>1) { 103467877ebaSShri Abhyankar #if defined(PETSC_USE_COMPLEX) 103567877ebaSShri Abhyankar lu->id.a_loc = (mumps_double_complex*)lu->val; 103667877ebaSShri Abhyankar #else 103767877ebaSShri Abhyankar lu->id.a_loc = lu->val; 103867877ebaSShri Abhyankar #endif 103967877ebaSShri Abhyankar } 104067877ebaSShri Abhyankar /* MUMPS only supports centralized rhs. Create scatter scat_rhs for repeated use in MatSolve() */ 104167877ebaSShri Abhyankar if (!lu->myid){ 104267877ebaSShri Abhyankar ierr = VecCreateSeq(PETSC_COMM_SELF,A->cmap->N,&lu->b_seq);CHKERRQ(ierr); 104367877ebaSShri Abhyankar ierr = ISCreateStride(PETSC_COMM_SELF,A->cmap->N,0,1,&is_iden);CHKERRQ(ierr); 104467877ebaSShri Abhyankar } else { 104567877ebaSShri Abhyankar ierr = VecCreateSeq(PETSC_COMM_SELF,0,&lu->b_seq);CHKERRQ(ierr); 104667877ebaSShri Abhyankar ierr = ISCreateStride(PETSC_COMM_SELF,0,0,1,&is_iden);CHKERRQ(ierr); 104767877ebaSShri Abhyankar } 104867877ebaSShri Abhyankar ierr = VecCreate(((PetscObject)A)->comm,&b);CHKERRQ(ierr); 104967877ebaSShri Abhyankar ierr = VecSetSizes(b,A->rmap->n,PETSC_DECIDE);CHKERRQ(ierr); 105067877ebaSShri Abhyankar ierr = VecSetFromOptions(b);CHKERRQ(ierr); 105167877ebaSShri Abhyankar 105267877ebaSShri Abhyankar ierr = VecScatterCreate(b,is_iden,lu->b_seq,is_iden,&lu->scat_rhs);CHKERRQ(ierr); 10536bf464f9SBarry Smith ierr = ISDestroy(&is_iden);CHKERRQ(ierr); 10546bf464f9SBarry Smith ierr = VecDestroy(&b);CHKERRQ(ierr); 105567877ebaSShri Abhyankar break; 105667877ebaSShri Abhyankar } 105767877ebaSShri Abhyankar #if defined(PETSC_USE_COMPLEX) 105867877ebaSShri Abhyankar zmumps_c(&lu->id); 105967877ebaSShri Abhyankar #else 106067877ebaSShri Abhyankar dmumps_c(&lu->id); 106167877ebaSShri Abhyankar #endif 106267877ebaSShri Abhyankar if (lu->id.INFOG(1) < 0) SETERRQ1(PETSC_COMM_SELF,PETSC_ERR_LIB,"Error reported by MUMPS in analysis phase: INFOG(1)=%d\n",lu->id.INFOG(1)); 106367877ebaSShri Abhyankar 10642792810eSHong Zhang F->ops->choleskyfactornumeric = MatFactorNumeric_MUMPS; 1065dcd589f8SShri Abhyankar F->ops->solve = MatSolve_MUMPS; 106651d5961aSHong Zhang F->ops->solvetranspose = MatSolve_MUMPS; 1067db4efbfdSBarry Smith #if !defined(PETSC_USE_COMPLEX) 106805aa0992SJose Roman F->ops->getinertia = MatGetInertia_SBAIJMUMPS; 106905aa0992SJose Roman #else 107005aa0992SJose Roman F->ops->getinertia = PETSC_NULL; 1071db4efbfdSBarry Smith #endif 1072b24902e0SBarry Smith PetscFunctionReturn(0); 1073b24902e0SBarry Smith } 1074b24902e0SBarry Smith 1075397b6df1SKris Buschelman #undef __FUNCT__ 107664e6c443SBarry Smith #define __FUNCT__ "MatView_MUMPS" 107764e6c443SBarry Smith PetscErrorCode MatView_MUMPS(Mat A,PetscViewer viewer) 107874ed9c26SBarry Smith { 1079f6c57405SHong Zhang PetscErrorCode ierr; 108064e6c443SBarry Smith PetscBool iascii; 108164e6c443SBarry Smith PetscViewerFormat format; 108264e6c443SBarry Smith Mat_MUMPS *lu=(Mat_MUMPS*)A->spptr; 1083f6c57405SHong Zhang 1084f6c57405SHong Zhang PetscFunctionBegin; 108564e6c443SBarry Smith /* check if matrix is mumps type */ 108664e6c443SBarry Smith if (A->ops->solve != MatSolve_MUMPS) PetscFunctionReturn(0); 108764e6c443SBarry Smith 108864e6c443SBarry Smith ierr = PetscTypeCompare((PetscObject)viewer,PETSCVIEWERASCII,&iascii);CHKERRQ(ierr); 108964e6c443SBarry Smith if (iascii) { 109064e6c443SBarry Smith ierr = PetscViewerGetFormat(viewer,&format);CHKERRQ(ierr); 109164e6c443SBarry Smith if (format == PETSC_VIEWER_ASCII_INFO){ 109264e6c443SBarry Smith ierr = PetscViewerASCIIPrintf(viewer,"MUMPS run parameters:\n");CHKERRQ(ierr); 109364e6c443SBarry Smith ierr = PetscViewerASCIIPrintf(viewer," SYM (matrix type): %d \n",lu->id.sym);CHKERRQ(ierr); 109464e6c443SBarry Smith ierr = PetscViewerASCIIPrintf(viewer," PAR (host participation): %d \n",lu->id.par);CHKERRQ(ierr); 1095f6c57405SHong Zhang ierr = PetscViewerASCIIPrintf(viewer," ICNTL(1) (output for error): %d \n",lu->id.ICNTL(1));CHKERRQ(ierr); 1096f6c57405SHong Zhang ierr = PetscViewerASCIIPrintf(viewer," ICNTL(2) (output of diagnostic msg): %d \n",lu->id.ICNTL(2));CHKERRQ(ierr); 1097f6c57405SHong Zhang ierr = PetscViewerASCIIPrintf(viewer," ICNTL(3) (output for global info): %d \n",lu->id.ICNTL(3));CHKERRQ(ierr); 1098f6c57405SHong Zhang ierr = PetscViewerASCIIPrintf(viewer," ICNTL(4) (level of printing): %d \n",lu->id.ICNTL(4));CHKERRQ(ierr); 1099f6c57405SHong Zhang ierr = PetscViewerASCIIPrintf(viewer," ICNTL(5) (input mat struct): %d \n",lu->id.ICNTL(5));CHKERRQ(ierr); 1100f6c57405SHong Zhang ierr = PetscViewerASCIIPrintf(viewer," ICNTL(6) (matrix prescaling): %d \n",lu->id.ICNTL(6));CHKERRQ(ierr); 1101d06efebcSBarry Smith ierr = PetscViewerASCIIPrintf(viewer," ICNTL(7) (sequentia matrix ordering):%d \n",lu->id.ICNTL(7));CHKERRQ(ierr); 1102f6c57405SHong Zhang ierr = PetscViewerASCIIPrintf(viewer," ICNTL(8) (scalling strategy): %d \n",lu->id.ICNTL(8));CHKERRQ(ierr); 1103f6c57405SHong Zhang ierr = PetscViewerASCIIPrintf(viewer," ICNTL(10) (max num of refinements): %d \n",lu->id.ICNTL(10));CHKERRQ(ierr); 1104f6c57405SHong Zhang ierr = PetscViewerASCIIPrintf(viewer," ICNTL(11) (error analysis): %d \n",lu->id.ICNTL(11));CHKERRQ(ierr); 110534ed7027SBarry Smith if (lu->id.ICNTL(11)>0) { 110634ed7027SBarry Smith ierr = PetscViewerASCIIPrintf(viewer," RINFOG(4) (inf norm of input mat): %g\n",lu->id.RINFOG(4));CHKERRQ(ierr); 110734ed7027SBarry Smith ierr = PetscViewerASCIIPrintf(viewer," RINFOG(5) (inf norm of solution): %g\n",lu->id.RINFOG(5));CHKERRQ(ierr); 110834ed7027SBarry Smith ierr = PetscViewerASCIIPrintf(viewer," RINFOG(6) (inf norm of residual): %g\n",lu->id.RINFOG(6));CHKERRQ(ierr); 110934ed7027SBarry Smith ierr = PetscViewerASCIIPrintf(viewer," RINFOG(7),RINFOG(8) (backward error est): %g, %g\n",lu->id.RINFOG(7),lu->id.RINFOG(8));CHKERRQ(ierr); 111034ed7027SBarry Smith ierr = PetscViewerASCIIPrintf(viewer," RINFOG(9) (error estimate): %g \n",lu->id.RINFOG(9));CHKERRQ(ierr); 111134ed7027SBarry Smith ierr = PetscViewerASCIIPrintf(viewer," RINFOG(10),RINFOG(11)(condition numbers): %g, %g\n",lu->id.RINFOG(10),lu->id.RINFOG(11));CHKERRQ(ierr); 1112f6c57405SHong Zhang } 1113f6c57405SHong Zhang ierr = PetscViewerASCIIPrintf(viewer," ICNTL(12) (efficiency control): %d \n",lu->id.ICNTL(12));CHKERRQ(ierr); 1114f6c57405SHong Zhang ierr = PetscViewerASCIIPrintf(viewer," ICNTL(13) (efficiency control): %d \n",lu->id.ICNTL(13));CHKERRQ(ierr); 1115f6c57405SHong Zhang ierr = PetscViewerASCIIPrintf(viewer," ICNTL(14) (percentage of estimated workspace increase): %d \n",lu->id.ICNTL(14));CHKERRQ(ierr); 1116f6c57405SHong Zhang /* ICNTL(15-17) not used */ 1117f6c57405SHong Zhang ierr = PetscViewerASCIIPrintf(viewer," ICNTL(18) (input mat struct): %d \n",lu->id.ICNTL(18));CHKERRQ(ierr); 1118f6c57405SHong Zhang ierr = PetscViewerASCIIPrintf(viewer," ICNTL(19) (Shur complement info): %d \n",lu->id.ICNTL(19));CHKERRQ(ierr); 1119f6c57405SHong Zhang ierr = PetscViewerASCIIPrintf(viewer," ICNTL(20) (rhs sparse pattern): %d \n",lu->id.ICNTL(20));CHKERRQ(ierr); 1120f6c57405SHong Zhang ierr = PetscViewerASCIIPrintf(viewer," ICNTL(21) (solution struct): %d \n",lu->id.ICNTL(21));CHKERRQ(ierr); 1121c0165424SHong Zhang ierr = PetscViewerASCIIPrintf(viewer," ICNTL(22) (in-core/out-of-core facility): %d \n",lu->id.ICNTL(22));CHKERRQ(ierr); 1122c0165424SHong Zhang ierr = PetscViewerASCIIPrintf(viewer," ICNTL(23) (max size of memory can be allocated locally):%d \n",lu->id.ICNTL(23));CHKERRQ(ierr); 1123c0165424SHong Zhang 1124c0165424SHong Zhang ierr = PetscViewerASCIIPrintf(viewer," ICNTL(24) (detection of null pivot rows): %d \n",lu->id.ICNTL(24));CHKERRQ(ierr); 1125c0165424SHong Zhang ierr = PetscViewerASCIIPrintf(viewer," ICNTL(25) (computation of a null space basis): %d \n",lu->id.ICNTL(25));CHKERRQ(ierr); 1126c0165424SHong Zhang ierr = PetscViewerASCIIPrintf(viewer," ICNTL(26) (Schur options for rhs or solution): %d \n",lu->id.ICNTL(26));CHKERRQ(ierr); 1127c0165424SHong Zhang ierr = PetscViewerASCIIPrintf(viewer," ICNTL(27) (experimental parameter): %d \n",lu->id.ICNTL(27));CHKERRQ(ierr); 1128*42179a6aSHong Zhang ierr = PetscViewerASCIIPrintf(viewer," ICNTL(28) (use parallel or sequential ordering): %d \n",lu->id.ICNTL(28));CHKERRQ(ierr); 1129*42179a6aSHong Zhang ierr = PetscViewerASCIIPrintf(viewer," ICNTL(29) (parallel ordering): %d \n",lu->id.ICNTL(29));CHKERRQ(ierr); 1130*42179a6aSHong Zhang 1131*42179a6aSHong Zhang ierr = PetscViewerASCIIPrintf(viewer," ICNTL(30) (user-specified set of entries in inv(A)): %d \n",lu->id.ICNTL(30));CHKERRQ(ierr); 1132*42179a6aSHong Zhang ierr = PetscViewerASCIIPrintf(viewer," ICNTL(31) (factors is discarded in the solve phase): %d \n",lu->id.ICNTL(31));CHKERRQ(ierr); 1133*42179a6aSHong Zhang ierr = PetscViewerASCIIPrintf(viewer," ICNTL(33) (compute determinant): %d \n",lu->id.ICNTL(33));CHKERRQ(ierr); 1134f6c57405SHong Zhang 1135f6c57405SHong Zhang ierr = PetscViewerASCIIPrintf(viewer," CNTL(1) (relative pivoting threshold): %g \n",lu->id.CNTL(1));CHKERRQ(ierr); 1136f6c57405SHong Zhang ierr = PetscViewerASCIIPrintf(viewer," CNTL(2) (stopping criterion of refinement): %g \n",lu->id.CNTL(2));CHKERRQ(ierr); 1137f6c57405SHong Zhang ierr = PetscViewerASCIIPrintf(viewer," CNTL(3) (absolute pivoting threshold): %g \n",lu->id.CNTL(3));CHKERRQ(ierr); 1138f6c57405SHong Zhang ierr = PetscViewerASCIIPrintf(viewer," CNTL(4) (value of static pivoting): %g \n",lu->id.CNTL(4));CHKERRQ(ierr); 1139c0165424SHong Zhang ierr = PetscViewerASCIIPrintf(viewer," CNTL(5) (fixation for null pivots): %g \n",lu->id.CNTL(5));CHKERRQ(ierr); 1140f6c57405SHong Zhang 1141f6c57405SHong Zhang /* infomation local to each processor */ 114234ed7027SBarry Smith ierr = PetscViewerASCIIPrintf(viewer, " RINFO(1) (local estimated flops for the elimination after analysis): \n");CHKERRQ(ierr); 11437b23a99aSBarry Smith ierr = PetscViewerASCIISynchronizedAllow(viewer,PETSC_TRUE);CHKERRQ(ierr); 114434ed7027SBarry Smith ierr = PetscViewerASCIISynchronizedPrintf(viewer," [%d] %g \n",lu->myid,lu->id.RINFO(1));CHKERRQ(ierr); 114534ed7027SBarry Smith ierr = PetscViewerFlush(viewer); 114634ed7027SBarry Smith ierr = PetscViewerASCIIPrintf(viewer, " RINFO(2) (local estimated flops for the assembly after factorization): \n");CHKERRQ(ierr); 114734ed7027SBarry Smith ierr = PetscViewerASCIISynchronizedPrintf(viewer," [%d] %g \n",lu->myid,lu->id.RINFO(2));CHKERRQ(ierr); 114834ed7027SBarry Smith ierr = PetscViewerFlush(viewer); 114934ed7027SBarry Smith ierr = PetscViewerASCIIPrintf(viewer, " RINFO(3) (local estimated flops for the elimination after factorization): \n");CHKERRQ(ierr); 115034ed7027SBarry Smith ierr = PetscViewerASCIISynchronizedPrintf(viewer," [%d] %g \n",lu->myid,lu->id.RINFO(3));CHKERRQ(ierr); 115134ed7027SBarry Smith ierr = PetscViewerFlush(viewer); 1152f6c57405SHong Zhang 115334ed7027SBarry Smith ierr = PetscViewerASCIIPrintf(viewer, " INFO(15) (estimated size of (in MB) MUMPS internal data for running numerical factorization): \n");CHKERRQ(ierr); 115434ed7027SBarry Smith ierr = PetscViewerASCIISynchronizedPrintf(viewer," [%d] %d \n",lu->myid,lu->id.INFO(15));CHKERRQ(ierr); 115534ed7027SBarry Smith ierr = PetscViewerFlush(viewer); 1156f6c57405SHong Zhang 115734ed7027SBarry Smith ierr = PetscViewerASCIIPrintf(viewer, " INFO(16) (size of (in MB) MUMPS internal data used during numerical factorization): \n");CHKERRQ(ierr); 115834ed7027SBarry Smith ierr = PetscViewerASCIISynchronizedPrintf(viewer," [%d] %d \n",lu->myid,lu->id.INFO(16));CHKERRQ(ierr); 115934ed7027SBarry Smith ierr = PetscViewerFlush(viewer); 1160f6c57405SHong Zhang 116134ed7027SBarry Smith ierr = PetscViewerASCIIPrintf(viewer, " INFO(23) (num of pivots eliminated on this processor after factorization): \n");CHKERRQ(ierr); 116234ed7027SBarry Smith ierr = PetscViewerASCIISynchronizedPrintf(viewer," [%d] %d \n",lu->myid,lu->id.INFO(23));CHKERRQ(ierr); 116334ed7027SBarry Smith ierr = PetscViewerFlush(viewer); 11647b23a99aSBarry Smith ierr = PetscViewerASCIISynchronizedAllow(viewer,PETSC_FALSE);CHKERRQ(ierr); 1165f6c57405SHong Zhang 1166f6c57405SHong Zhang if (!lu->myid){ /* information from the host */ 1167f6c57405SHong Zhang ierr = PetscViewerASCIIPrintf(viewer," RINFOG(1) (global estimated flops for the elimination after analysis): %g \n",lu->id.RINFOG(1));CHKERRQ(ierr); 1168f6c57405SHong Zhang ierr = PetscViewerASCIIPrintf(viewer," RINFOG(2) (global estimated flops for the assembly after factorization): %g \n",lu->id.RINFOG(2));CHKERRQ(ierr); 1169f6c57405SHong Zhang ierr = PetscViewerASCIIPrintf(viewer," RINFOG(3) (global estimated flops for the elimination after factorization): %g \n",lu->id.RINFOG(3));CHKERRQ(ierr); 1170*42179a6aSHong Zhang ierr = PetscViewerASCIIPrintf(viewer," (RINFOG(12) RINFOG(13))*2^INFOG(34) (determinant): (%g,%g)*(2^%d)\n",lu->id.RINFOG(12),lu->id.RINFOG(13),lu->id.INFOG(34));CHKERRQ(ierr); 1171f6c57405SHong Zhang 1172f6c57405SHong Zhang ierr = PetscViewerASCIIPrintf(viewer," INFOG(3) (estimated real workspace for factors on all processors after analysis): %d \n",lu->id.INFOG(3));CHKERRQ(ierr); 1173f6c57405SHong Zhang ierr = PetscViewerASCIIPrintf(viewer," INFOG(4) (estimated integer workspace for factors on all processors after analysis): %d \n",lu->id.INFOG(4));CHKERRQ(ierr); 1174f6c57405SHong Zhang ierr = PetscViewerASCIIPrintf(viewer," INFOG(5) (estimated maximum front size in the complete tree): %d \n",lu->id.INFOG(5));CHKERRQ(ierr); 1175f6c57405SHong Zhang ierr = PetscViewerASCIIPrintf(viewer," INFOG(6) (number of nodes in the complete tree): %d \n",lu->id.INFOG(6));CHKERRQ(ierr); 11762bd8dccdSBarry Smith ierr = PetscViewerASCIIPrintf(viewer," INFOG(7) (ordering option effectively use after analysis): %d \n",lu->id.INFOG(7));CHKERRQ(ierr); 1177f6c57405SHong Zhang ierr = PetscViewerASCIIPrintf(viewer," INFOG(8) (structural symmetry in percent of the permuted matrix after analysis): %d \n",lu->id.INFOG(8));CHKERRQ(ierr); 1178f6c57405SHong Zhang ierr = PetscViewerASCIIPrintf(viewer," INFOG(9) (total real/complex workspace to store the matrix factors after factorization): %d \n",lu->id.INFOG(9));CHKERRQ(ierr); 1179f6c57405SHong Zhang ierr = PetscViewerASCIIPrintf(viewer," INFOG(10) (total integer space store the matrix factors after factorization): %d \n",lu->id.INFOG(10));CHKERRQ(ierr); 1180f6c57405SHong Zhang ierr = PetscViewerASCIIPrintf(viewer," INFOG(11) (order of largest frontal matrix after factorization): %d \n",lu->id.INFOG(11));CHKERRQ(ierr); 1181f6c57405SHong Zhang ierr = PetscViewerASCIIPrintf(viewer," INFOG(12) (number of off-diagonal pivots): %d \n",lu->id.INFOG(12));CHKERRQ(ierr); 1182f6c57405SHong Zhang ierr = PetscViewerASCIIPrintf(viewer," INFOG(13) (number of delayed pivots after factorization): %d \n",lu->id.INFOG(13));CHKERRQ(ierr); 1183f6c57405SHong Zhang ierr = PetscViewerASCIIPrintf(viewer," INFOG(14) (number of memory compress after factorization): %d \n",lu->id.INFOG(14));CHKERRQ(ierr); 1184f6c57405SHong Zhang ierr = PetscViewerASCIIPrintf(viewer," INFOG(15) (number of steps of iterative refinement after solution): %d \n",lu->id.INFOG(15));CHKERRQ(ierr); 1185f6c57405SHong Zhang ierr = PetscViewerASCIIPrintf(viewer," INFOG(16) (estimated size (in MB) of all MUMPS internal data for factorization after analysis: value on the most memory consuming processor): %d \n",lu->id.INFOG(16));CHKERRQ(ierr); 1186f6c57405SHong Zhang ierr = PetscViewerASCIIPrintf(viewer," INFOG(17) (estimated size of all MUMPS internal data for factorization after analysis: sum over all processors): %d \n",lu->id.INFOG(17));CHKERRQ(ierr); 1187f6c57405SHong Zhang ierr = PetscViewerASCIIPrintf(viewer," INFOG(18) (size of all MUMPS internal data allocated during factorization: value on the most memory consuming processor): %d \n",lu->id.INFOG(18));CHKERRQ(ierr); 1188f6c57405SHong Zhang ierr = PetscViewerASCIIPrintf(viewer," INFOG(19) (size of all MUMPS internal data allocated during factorization: sum over all processors): %d \n",lu->id.INFOG(19));CHKERRQ(ierr); 1189f6c57405SHong Zhang ierr = PetscViewerASCIIPrintf(viewer," INFOG(20) (estimated number of entries in the factors): %d \n",lu->id.INFOG(20));CHKERRQ(ierr); 1190f6c57405SHong Zhang ierr = PetscViewerASCIIPrintf(viewer," INFOG(21) (size in MB of memory effectively used during factorization - value on the most memory consuming processor): %d \n",lu->id.INFOG(21));CHKERRQ(ierr); 1191f6c57405SHong Zhang ierr = PetscViewerASCIIPrintf(viewer," INFOG(22) (size in MB of memory effectively used during factorization - sum over all processors): %d \n",lu->id.INFOG(22));CHKERRQ(ierr); 1192f6c57405SHong Zhang ierr = PetscViewerASCIIPrintf(viewer," INFOG(23) (after analysis: value of ICNTL(6) effectively used): %d \n",lu->id.INFOG(23));CHKERRQ(ierr); 1193f6c57405SHong Zhang ierr = PetscViewerASCIIPrintf(viewer," INFOG(24) (after analysis: value of ICNTL(12) effectively used): %d \n",lu->id.INFOG(24));CHKERRQ(ierr); 1194f6c57405SHong Zhang ierr = PetscViewerASCIIPrintf(viewer," INFOG(25) (after factorization: number of pivots modified by static pivoting): %d \n",lu->id.INFOG(25));CHKERRQ(ierr); 1195f6c57405SHong Zhang } 1196f6c57405SHong Zhang } 1197cb828f0fSHong Zhang } 1198f6c57405SHong Zhang PetscFunctionReturn(0); 1199f6c57405SHong Zhang } 1200f6c57405SHong Zhang 120135bd34faSBarry Smith #undef __FUNCT__ 120235bd34faSBarry Smith #define __FUNCT__ "MatGetInfo_MUMPS" 120335bd34faSBarry Smith PetscErrorCode MatGetInfo_MUMPS(Mat A,MatInfoType flag,MatInfo *info) 120435bd34faSBarry Smith { 1205cb828f0fSHong Zhang Mat_MUMPS *mumps =(Mat_MUMPS*)A->spptr; 120635bd34faSBarry Smith 120735bd34faSBarry Smith PetscFunctionBegin; 120835bd34faSBarry Smith info->block_size = 1.0; 1209cb828f0fSHong Zhang info->nz_allocated = mumps->id.INFOG(20); 1210cb828f0fSHong Zhang info->nz_used = mumps->id.INFOG(20); 121135bd34faSBarry Smith info->nz_unneeded = 0.0; 121235bd34faSBarry Smith info->assemblies = 0.0; 121335bd34faSBarry Smith info->mallocs = 0.0; 121435bd34faSBarry Smith info->memory = 0.0; 121535bd34faSBarry Smith info->fill_ratio_given = 0; 121635bd34faSBarry Smith info->fill_ratio_needed = 0; 121735bd34faSBarry Smith info->factor_mallocs = 0; 121835bd34faSBarry Smith PetscFunctionReturn(0); 121935bd34faSBarry Smith } 122035bd34faSBarry Smith 12215ccb76cbSHong Zhang /* -------------------------------------------------------------------------------------------*/ 12225ccb76cbSHong Zhang #undef __FUNCT__ 12235ccb76cbSHong Zhang #define __FUNCT__ "MatMumpsSetIcntl_MUMPS" 12245ccb76cbSHong Zhang PetscErrorCode MatMumpsSetIcntl_MUMPS(Mat F,PetscInt icntl,PetscInt ival) 12255ccb76cbSHong Zhang { 12265ccb76cbSHong Zhang Mat_MUMPS *lu =(Mat_MUMPS*)F->spptr; 12275ccb76cbSHong Zhang 12285ccb76cbSHong Zhang PetscFunctionBegin; 12295ccb76cbSHong Zhang lu->id.ICNTL(icntl) = ival; 12305ccb76cbSHong Zhang PetscFunctionReturn(0); 12315ccb76cbSHong Zhang } 12325ccb76cbSHong Zhang 12335ccb76cbSHong Zhang #undef __FUNCT__ 12345ccb76cbSHong Zhang #define __FUNCT__ "MatMumpsSetIcntl" 12355ccb76cbSHong Zhang /*@ 12365ccb76cbSHong Zhang MatMumpsSetIcntl - Set MUMPS parameter ICNTL() 12375ccb76cbSHong Zhang 12385ccb76cbSHong Zhang Logically Collective on Mat 12395ccb76cbSHong Zhang 12405ccb76cbSHong Zhang Input Parameters: 12415ccb76cbSHong Zhang + F - the factored matrix obtained by calling MatGetFactor() from PETSc-MUMPS interface 12425ccb76cbSHong Zhang . icntl - index of MUMPS parameter array ICNTL() 12435ccb76cbSHong Zhang - ival - value of MUMPS ICNTL(icntl) 12445ccb76cbSHong Zhang 12455ccb76cbSHong Zhang Options Database: 12465ccb76cbSHong Zhang . -mat_mumps_icntl_<icntl> <ival> 12475ccb76cbSHong Zhang 12485ccb76cbSHong Zhang Level: beginner 12495ccb76cbSHong Zhang 12505ccb76cbSHong Zhang References: MUMPS Users' Guide 12515ccb76cbSHong Zhang 12525ccb76cbSHong Zhang .seealso: MatGetFactor() 12535ccb76cbSHong Zhang @*/ 12545ccb76cbSHong Zhang PetscErrorCode MatMumpsSetIcntl(Mat F,PetscInt icntl,PetscInt ival) 12555ccb76cbSHong Zhang { 12565ccb76cbSHong Zhang PetscErrorCode ierr; 12575ccb76cbSHong Zhang 12585ccb76cbSHong Zhang PetscFunctionBegin; 12595ccb76cbSHong Zhang PetscValidLogicalCollectiveInt(F,icntl,2); 12605ccb76cbSHong Zhang PetscValidLogicalCollectiveInt(F,ival,3); 12615ccb76cbSHong Zhang ierr = PetscTryMethod(F,"MatMumpsSetIcntl_C",(Mat,PetscInt,PetscInt),(F,icntl,ival));CHKERRQ(ierr); 12625ccb76cbSHong Zhang PetscFunctionReturn(0); 12635ccb76cbSHong Zhang } 12645ccb76cbSHong Zhang 126524b6179bSKris Buschelman /*MC 12662692d6eeSBarry Smith MATSOLVERMUMPS - A matrix type providing direct solvers (LU and Cholesky) for 126724b6179bSKris Buschelman distributed and sequential matrices via the external package MUMPS. 126824b6179bSKris Buschelman 126941c8de11SBarry Smith Works with MATAIJ and MATSBAIJ matrices 127024b6179bSKris Buschelman 127124b6179bSKris Buschelman Options Database Keys: 1272fb8376fbSHong Zhang + -mat_mumps_icntl_4 <0,...,4> - print level 127324b6179bSKris Buschelman . -mat_mumps_icntl_6 <0,...,7> - matrix prescaling options (see MUMPS User's Guide) 127464e6c443SBarry Smith . -mat_mumps_icntl_7 <0,...,7> - matrix orderings (see MUMPS User's Guidec) 127524b6179bSKris Buschelman . -mat_mumps_icntl_9 <1,2> - A or A^T x=b to be solved: 1 denotes A, 2 denotes A^T 127624b6179bSKris Buschelman . -mat_mumps_icntl_10 <n> - maximum number of iterative refinements 127794b7f48cSBarry Smith . -mat_mumps_icntl_11 <n> - error analysis, a positive value returns statistics during -ksp_view 127824b6179bSKris Buschelman . -mat_mumps_icntl_12 <n> - efficiency control (see MUMPS User's Guide) 127924b6179bSKris Buschelman . -mat_mumps_icntl_13 <n> - efficiency control (see MUMPS User's Guide) 128024b6179bSKris Buschelman . -mat_mumps_icntl_14 <n> - efficiency control (see MUMPS User's Guide) 128124b6179bSKris Buschelman . -mat_mumps_icntl_15 <n> - efficiency control (see MUMPS User's Guide) 128224b6179bSKris Buschelman . -mat_mumps_cntl_1 <delta> - relative pivoting threshold 128324b6179bSKris Buschelman . -mat_mumps_cntl_2 <tol> - stopping criterion for refinement 128424b6179bSKris Buschelman - -mat_mumps_cntl_3 <adelta> - absolute pivoting threshold 128524b6179bSKris Buschelman 128624b6179bSKris Buschelman Level: beginner 128724b6179bSKris Buschelman 128841c8de11SBarry Smith .seealso: PCFactorSetMatSolverPackage(), MatSolverPackage 128941c8de11SBarry Smith 129024b6179bSKris Buschelman M*/ 129124b6179bSKris Buschelman 12922877fffaSHong Zhang EXTERN_C_BEGIN 129335bd34faSBarry Smith #undef __FUNCT__ 129435bd34faSBarry Smith #define __FUNCT__ "MatFactorGetSolverPackage_mumps" 129535bd34faSBarry Smith PetscErrorCode MatFactorGetSolverPackage_mumps(Mat A,const MatSolverPackage *type) 129635bd34faSBarry Smith { 129735bd34faSBarry Smith PetscFunctionBegin; 12982692d6eeSBarry Smith *type = MATSOLVERMUMPS; 129935bd34faSBarry Smith PetscFunctionReturn(0); 130035bd34faSBarry Smith } 130135bd34faSBarry Smith EXTERN_C_END 130235bd34faSBarry Smith 130335bd34faSBarry Smith EXTERN_C_BEGIN 1304bccb9932SShri Abhyankar /* MatGetFactor for Seq and MPI AIJ matrices */ 13052877fffaSHong Zhang #undef __FUNCT__ 1306bccb9932SShri Abhyankar #define __FUNCT__ "MatGetFactor_aij_mumps" 1307bccb9932SShri Abhyankar PetscErrorCode MatGetFactor_aij_mumps(Mat A,MatFactorType ftype,Mat *F) 13082877fffaSHong Zhang { 13092877fffaSHong Zhang Mat B; 13102877fffaSHong Zhang PetscErrorCode ierr; 13112877fffaSHong Zhang Mat_MUMPS *mumps; 1312ace3abfcSBarry Smith PetscBool isSeqAIJ; 13132877fffaSHong Zhang 13142877fffaSHong Zhang PetscFunctionBegin; 13152877fffaSHong Zhang /* Create the factorization matrix */ 1316bccb9932SShri Abhyankar ierr = PetscTypeCompare((PetscObject)A,MATSEQAIJ,&isSeqAIJ);CHKERRQ(ierr); 13172877fffaSHong Zhang ierr = MatCreate(((PetscObject)A)->comm,&B);CHKERRQ(ierr); 13182877fffaSHong Zhang ierr = MatSetSizes(B,A->rmap->n,A->cmap->n,A->rmap->N,A->cmap->N);CHKERRQ(ierr); 13192877fffaSHong Zhang ierr = MatSetType(B,((PetscObject)A)->type_name);CHKERRQ(ierr); 1320bccb9932SShri Abhyankar if (isSeqAIJ) { 13212877fffaSHong Zhang ierr = MatSeqAIJSetPreallocation(B,0,PETSC_NULL);CHKERRQ(ierr); 1322bccb9932SShri Abhyankar } else { 1323bccb9932SShri Abhyankar ierr = MatMPIAIJSetPreallocation(B,0,PETSC_NULL,0,PETSC_NULL);CHKERRQ(ierr); 1324bccb9932SShri Abhyankar } 13252877fffaSHong Zhang 132616ebf90aSShri Abhyankar ierr = PetscNewLog(B,Mat_MUMPS,&mumps);CHKERRQ(ierr); 13272877fffaSHong Zhang B->ops->view = MatView_MUMPS; 132835bd34faSBarry Smith B->ops->getinfo = MatGetInfo_MUMPS; 132935bd34faSBarry Smith ierr = PetscObjectComposeFunctionDynamic((PetscObject)B,"MatFactorGetSolverPackage_C","MatFactorGetSolverPackage_mumps",MatFactorGetSolverPackage_mumps);CHKERRQ(ierr); 13305ccb76cbSHong Zhang ierr = PetscObjectComposeFunctionDynamic((PetscObject)B,"MatMumpsSetIcntl_C","MatMumpsSetIcntl_MUMPS",MatMumpsSetIcntl_MUMPS);CHKERRQ(ierr); 1331450b117fSShri Abhyankar if (ftype == MAT_FACTOR_LU) { 1332450b117fSShri Abhyankar B->ops->lufactorsymbolic = MatLUFactorSymbolic_AIJMUMPS; 1333d5f3da31SBarry Smith B->factortype = MAT_FACTOR_LU; 1334bccb9932SShri Abhyankar if (isSeqAIJ) mumps->ConvertToTriples = MatConvertToTriples_seqaij_seqaij; 1335bccb9932SShri Abhyankar else mumps->ConvertToTriples = MatConvertToTriples_mpiaij_mpiaij; 1336746480a1SHong Zhang mumps->sym = 0; 1337dcd589f8SShri Abhyankar } else { 133867877ebaSShri Abhyankar B->ops->choleskyfactorsymbolic = MatCholeskyFactorSymbolic_MUMPS; 1339450b117fSShri Abhyankar B->factortype = MAT_FACTOR_CHOLESKY; 1340bccb9932SShri Abhyankar if (isSeqAIJ) mumps->ConvertToTriples = MatConvertToTriples_seqaij_seqsbaij; 1341bccb9932SShri Abhyankar else mumps->ConvertToTriples = MatConvertToTriples_mpiaij_mpisbaij; 13426fdc2a6dSBarry Smith if (A->spd_set && A->spd) mumps->sym = 1; 13436fdc2a6dSBarry Smith else mumps->sym = 2; 1344450b117fSShri Abhyankar } 13452877fffaSHong Zhang 13462877fffaSHong Zhang mumps->isAIJ = PETSC_TRUE; 1347bf0cc555SLisandro Dalcin mumps->Destroy = B->ops->destroy; 13482877fffaSHong Zhang B->ops->destroy = MatDestroy_MUMPS; 13492877fffaSHong Zhang B->spptr = (void*)mumps; 1350f697e70eSHong Zhang ierr = PetscInitializeMUMPS(A,mumps);CHKERRQ(ierr); 1351746480a1SHong Zhang 13522877fffaSHong Zhang *F = B; 13532877fffaSHong Zhang PetscFunctionReturn(0); 13542877fffaSHong Zhang } 13552877fffaSHong Zhang EXTERN_C_END 13562877fffaSHong Zhang 1357bccb9932SShri Abhyankar 13582877fffaSHong Zhang EXTERN_C_BEGIN 1359bccb9932SShri Abhyankar /* MatGetFactor for Seq and MPI SBAIJ matrices */ 13602877fffaSHong Zhang #undef __FUNCT__ 1361bccb9932SShri Abhyankar #define __FUNCT__ "MatGetFactor_sbaij_mumps" 1362bccb9932SShri Abhyankar PetscErrorCode MatGetFactor_sbaij_mumps(Mat A,MatFactorType ftype,Mat *F) 13632877fffaSHong Zhang { 13642877fffaSHong Zhang Mat B; 13652877fffaSHong Zhang PetscErrorCode ierr; 13662877fffaSHong Zhang Mat_MUMPS *mumps; 1367ace3abfcSBarry Smith PetscBool isSeqSBAIJ; 13682877fffaSHong Zhang 13692877fffaSHong Zhang PetscFunctionBegin; 1370e7e72b3dSBarry Smith if (ftype != MAT_FACTOR_CHOLESKY) SETERRQ(((PetscObject)A)->comm,PETSC_ERR_SUP,"Cannot use PETSc SBAIJ matrices with MUMPS LU, use AIJ matrix"); 1371bccb9932SShri Abhyankar if(A->rmap->bs > 1) SETERRQ(((PetscObject)A)->comm,PETSC_ERR_SUP,"Cannot use PETSc SBAIJ matrices with block size > 1 with MUMPS Cholesky, use AIJ matrix instead"); 1372bccb9932SShri Abhyankar ierr = PetscTypeCompare((PetscObject)A,MATSEQSBAIJ,&isSeqSBAIJ);CHKERRQ(ierr); 13732877fffaSHong Zhang /* Create the factorization matrix */ 13742877fffaSHong Zhang ierr = MatCreate(((PetscObject)A)->comm,&B);CHKERRQ(ierr); 13752877fffaSHong Zhang ierr = MatSetSizes(B,A->rmap->n,A->cmap->n,A->rmap->N,A->cmap->N);CHKERRQ(ierr); 13762877fffaSHong Zhang ierr = MatSetType(B,((PetscObject)A)->type_name);CHKERRQ(ierr); 137716ebf90aSShri Abhyankar ierr = PetscNewLog(B,Mat_MUMPS,&mumps);CHKERRQ(ierr); 1378bccb9932SShri Abhyankar if (isSeqSBAIJ) { 1379bccb9932SShri Abhyankar ierr = MatSeqSBAIJSetPreallocation(B,1,0,PETSC_NULL);CHKERRQ(ierr); 138016ebf90aSShri Abhyankar mumps->ConvertToTriples = MatConvertToTriples_seqsbaij_seqsbaij; 1381dcd589f8SShri Abhyankar } else { 1382bccb9932SShri Abhyankar ierr = MatMPISBAIJSetPreallocation(B,1,0,PETSC_NULL,0,PETSC_NULL);CHKERRQ(ierr); 1383bccb9932SShri Abhyankar mumps->ConvertToTriples = MatConvertToTriples_mpisbaij_mpisbaij; 1384bccb9932SShri Abhyankar } 1385bccb9932SShri Abhyankar 138667877ebaSShri Abhyankar B->ops->choleskyfactorsymbolic = MatCholeskyFactorSymbolic_MUMPS; 1387bccb9932SShri Abhyankar B->ops->view = MatView_MUMPS; 1388bccb9932SShri Abhyankar ierr = PetscObjectComposeFunctionDynamic((PetscObject)B,"MatFactorGetSolverPackage_C","MatFactorGetSolverPackage_mumps",MatFactorGetSolverPackage_mumps);CHKERRQ(ierr); 1389f250808bSBarry Smith ierr = PetscObjectComposeFunctionDynamic((PetscObject)B,"MatMumpsSetIcntl_C","MatMumpsSetIcntl",MatMumpsSetIcntl);CHKERRQ(ierr); 1390f4762488SHong Zhang B->factortype = MAT_FACTOR_CHOLESKY; 13916fdc2a6dSBarry Smith if (A->spd_set && A->spd) mumps->sym = 1; 13926fdc2a6dSBarry Smith else mumps->sym = 2; 1393a214ac2aSShri Abhyankar 1394bccb9932SShri Abhyankar mumps->isAIJ = PETSC_FALSE; 1395bf0cc555SLisandro Dalcin mumps->Destroy = B->ops->destroy; 1396f3c0ef26SHong Zhang B->ops->destroy = MatDestroy_MUMPS; 13972877fffaSHong Zhang B->spptr = (void*)mumps; 1398f697e70eSHong Zhang ierr = PetscInitializeMUMPS(A,mumps);CHKERRQ(ierr); 1399746480a1SHong Zhang 14002877fffaSHong Zhang *F = B; 14012877fffaSHong Zhang PetscFunctionReturn(0); 14022877fffaSHong Zhang } 14032877fffaSHong Zhang EXTERN_C_END 140497969023SHong Zhang 1405450b117fSShri Abhyankar EXTERN_C_BEGIN 1406450b117fSShri Abhyankar #undef __FUNCT__ 1407bccb9932SShri Abhyankar #define __FUNCT__ "MatGetFactor_baij_mumps" 1408bccb9932SShri Abhyankar PetscErrorCode MatGetFactor_baij_mumps(Mat A,MatFactorType ftype,Mat *F) 140967877ebaSShri Abhyankar { 141067877ebaSShri Abhyankar Mat B; 141167877ebaSShri Abhyankar PetscErrorCode ierr; 141267877ebaSShri Abhyankar Mat_MUMPS *mumps; 1413ace3abfcSBarry Smith PetscBool isSeqBAIJ; 141467877ebaSShri Abhyankar 141567877ebaSShri Abhyankar PetscFunctionBegin; 141667877ebaSShri Abhyankar /* Create the factorization matrix */ 1417bccb9932SShri Abhyankar ierr = PetscTypeCompare((PetscObject)A,MATSEQBAIJ,&isSeqBAIJ);CHKERRQ(ierr); 141867877ebaSShri Abhyankar ierr = MatCreate(((PetscObject)A)->comm,&B);CHKERRQ(ierr); 141967877ebaSShri Abhyankar ierr = MatSetSizes(B,A->rmap->n,A->cmap->n,A->rmap->N,A->cmap->N);CHKERRQ(ierr); 142067877ebaSShri Abhyankar ierr = MatSetType(B,((PetscObject)A)->type_name);CHKERRQ(ierr); 1421bccb9932SShri Abhyankar if (isSeqBAIJ) { 142267877ebaSShri Abhyankar ierr = MatSeqBAIJSetPreallocation(B,A->rmap->bs,0,PETSC_NULL);CHKERRQ(ierr); 1423bccb9932SShri Abhyankar } else { 142467877ebaSShri Abhyankar ierr = MatMPIBAIJSetPreallocation(B,A->rmap->bs,0,PETSC_NULL,0,PETSC_NULL);CHKERRQ(ierr); 1425bccb9932SShri Abhyankar } 1426450b117fSShri Abhyankar 142767877ebaSShri Abhyankar ierr = PetscNewLog(B,Mat_MUMPS,&mumps);CHKERRQ(ierr); 1428450b117fSShri Abhyankar if (ftype == MAT_FACTOR_LU) { 1429450b117fSShri Abhyankar B->ops->lufactorsymbolic = MatLUFactorSymbolic_BAIJMUMPS; 1430450b117fSShri Abhyankar B->factortype = MAT_FACTOR_LU; 1431bccb9932SShri Abhyankar if (isSeqBAIJ) mumps->ConvertToTriples = MatConvertToTriples_seqbaij_seqaij; 1432bccb9932SShri Abhyankar else mumps->ConvertToTriples = MatConvertToTriples_mpibaij_mpiaij; 1433746480a1SHong Zhang mumps->sym = 0; 1434746480a1SHong Zhang } else { 1435746480a1SHong Zhang SETERRQ(PETSC_COMM_SELF,PETSC_ERR_SUP,"Cannot use PETSc BAIJ matrices with MUMPS Cholesky, use SBAIJ or AIJ matrix instead\n"); 1436450b117fSShri Abhyankar } 1437bccb9932SShri Abhyankar 1438450b117fSShri Abhyankar B->ops->view = MatView_MUMPS; 1439450b117fSShri Abhyankar ierr = PetscObjectComposeFunctionDynamic((PetscObject)B,"MatFactorGetSolverPackage_C","MatFactorGetSolverPackage_mumps",MatFactorGetSolverPackage_mumps);CHKERRQ(ierr); 14405ccb76cbSHong Zhang ierr = PetscObjectComposeFunctionDynamic((PetscObject)B,"MatMumpsSetIcntl_C","MatMumpsSetIcntl_MUMPS",MatMumpsSetIcntl_MUMPS);CHKERRQ(ierr); 1441450b117fSShri Abhyankar 1442450b117fSShri Abhyankar mumps->isAIJ = PETSC_TRUE; 1443bf0cc555SLisandro Dalcin mumps->Destroy = B->ops->destroy; 1444450b117fSShri Abhyankar B->ops->destroy = MatDestroy_MUMPS; 1445450b117fSShri Abhyankar B->spptr = (void*)mumps; 1446f697e70eSHong Zhang ierr = PetscInitializeMUMPS(A,mumps);CHKERRQ(ierr); 1447746480a1SHong Zhang 1448450b117fSShri Abhyankar *F = B; 1449450b117fSShri Abhyankar PetscFunctionReturn(0); 1450450b117fSShri Abhyankar } 1451450b117fSShri Abhyankar EXTERN_C_END 1452a214ac2aSShri Abhyankar 1453