11c2a3de1SBarry Smith 2397b6df1SKris Buschelman /* 3c2b5dc30SHong Zhang Provides an interface to the MUMPS sparse solver 4397b6df1SKris Buschelman */ 551d5961aSHong Zhang 6*c6db04a5SJed Brown #include <../src/mat/impls/aij/mpi/mpiaij.h> /*I "petscmat.h" I*/ 7*c6db04a5SJed Brown #include <../src/mat/impls/sbaij/mpi/mpisbaij.h> 8397b6df1SKris Buschelman 9397b6df1SKris Buschelman EXTERN_C_BEGIN 10397b6df1SKris Buschelman #if defined(PETSC_USE_COMPLEX) 11*c6db04a5SJed Brown #include <zmumps_c.h> 12397b6df1SKris Buschelman #else 13*c6db04a5SJed 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; 4567334b25SHong Zhang PetscErrorCode (*MatDestroy)(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; 10267877ebaSShri Abhyankar PetscInt nz,idx=0,rnz,i,j,k,m,ii; 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 ii = 0; 11767877ebaSShri Abhyankar ajj = aj + ai[i]; 11867877ebaSShri Abhyankar rnz = ai[i+1] - ai[i]; 11967877ebaSShri Abhyankar for(k=0; k<rnz; k++) { 12067877ebaSShri Abhyankar for(j=0; j<bs; j++) { 12167877ebaSShri Abhyankar for(m=0; m<bs; m++) { 12267877ebaSShri Abhyankar row[idx] = i*bs + m + shift; 123cf3759fdSShri Abhyankar col[idx++] = bs*(ajj[k]) + j + shift; 12467877ebaSShri Abhyankar } 12567877ebaSShri Abhyankar } 12667877ebaSShri Abhyankar } 12767877ebaSShri Abhyankar } 128cf3759fdSShri Abhyankar *r = row; *c = col; 12967877ebaSShri Abhyankar } 13067877ebaSShri Abhyankar PetscFunctionReturn(0); 13167877ebaSShri Abhyankar } 13267877ebaSShri Abhyankar 13367877ebaSShri Abhyankar #undef __FUNCT__ 13416ebf90aSShri Abhyankar #define __FUNCT__ "MatConvertToTriples_seqsbaij_seqsbaij" 135bccb9932SShri Abhyankar PetscErrorCode MatConvertToTriples_seqsbaij_seqsbaij(Mat A,int shift,MatReuse reuse,int *nnz,int **r, int **c, PetscScalar **v) 13616ebf90aSShri Abhyankar { 13767877ebaSShri Abhyankar const PetscInt *ai, *aj,*ajj,M=A->rmap->n; 13867877ebaSShri Abhyankar PetscInt nz,rnz,i,j; 13916ebf90aSShri Abhyankar PetscErrorCode ierr; 14016ebf90aSShri Abhyankar PetscInt *row,*col; 14116ebf90aSShri Abhyankar Mat_SeqSBAIJ *aa=(Mat_SeqSBAIJ*)A->data; 14216ebf90aSShri Abhyankar 14316ebf90aSShri Abhyankar PetscFunctionBegin; 144bccb9932SShri Abhyankar if (reuse == MAT_INITIAL_MATRIX){ 14516ebf90aSShri Abhyankar nz = aa->nz;ai=aa->i; aj=aa->j;*v=aa->a; 14616ebf90aSShri Abhyankar *nnz = nz; 147185f6596SHong Zhang ierr = PetscMalloc(2*nz*sizeof(PetscInt), &row);CHKERRQ(ierr); 148185f6596SHong Zhang col = row + nz; 149185f6596SHong Zhang 15016ebf90aSShri Abhyankar nz = 0; 15116ebf90aSShri Abhyankar for(i=0; i<M; i++) { 15216ebf90aSShri Abhyankar rnz = ai[i+1] - ai[i]; 15367877ebaSShri Abhyankar ajj = aj + ai[i]; 15467877ebaSShri Abhyankar for(j=0; j<rnz; j++) { 15567877ebaSShri Abhyankar row[nz] = i+shift; col[nz++] = ajj[j] + shift; 15616ebf90aSShri Abhyankar } 15716ebf90aSShri Abhyankar } 15816ebf90aSShri Abhyankar *r = row; *c = col; 15916ebf90aSShri Abhyankar } 16016ebf90aSShri Abhyankar PetscFunctionReturn(0); 16116ebf90aSShri Abhyankar } 16216ebf90aSShri Abhyankar 16316ebf90aSShri Abhyankar #undef __FUNCT__ 16416ebf90aSShri Abhyankar #define __FUNCT__ "MatConvertToTriples_seqaij_seqsbaij" 165bccb9932SShri Abhyankar PetscErrorCode MatConvertToTriples_seqaij_seqsbaij(Mat A,int shift,MatReuse reuse,int *nnz,int **r, int **c, PetscScalar **v) 16616ebf90aSShri Abhyankar { 16767877ebaSShri Abhyankar const PetscInt *ai,*aj,*ajj,*adiag,M=A->rmap->n; 16867877ebaSShri Abhyankar PetscInt nz,rnz,i,j; 16967877ebaSShri Abhyankar const PetscScalar *av,*v1; 17016ebf90aSShri Abhyankar PetscScalar *val; 17116ebf90aSShri Abhyankar PetscErrorCode ierr; 17216ebf90aSShri Abhyankar PetscInt *row,*col; 17316ebf90aSShri Abhyankar Mat_SeqSBAIJ *aa=(Mat_SeqSBAIJ*)A->data; 17416ebf90aSShri Abhyankar 17516ebf90aSShri Abhyankar PetscFunctionBegin; 17616ebf90aSShri Abhyankar ai=aa->i; aj=aa->j;av=aa->a; 17716ebf90aSShri Abhyankar adiag=aa->diag; 178bccb9932SShri Abhyankar if (reuse == MAT_INITIAL_MATRIX){ 17916ebf90aSShri Abhyankar nz = M + (aa->nz-M)/2; 18016ebf90aSShri Abhyankar *nnz = nz; 181185f6596SHong Zhang ierr = PetscMalloc((2*nz*sizeof(PetscInt)+nz*sizeof(PetscScalar)), &row);CHKERRQ(ierr); 182185f6596SHong Zhang col = row + nz; 183185f6596SHong Zhang val = (PetscScalar*)(col + nz); 184185f6596SHong Zhang 18516ebf90aSShri Abhyankar nz = 0; 18616ebf90aSShri Abhyankar for(i=0; i<M; i++) { 18716ebf90aSShri Abhyankar rnz = ai[i+1] - adiag[i]; 18867877ebaSShri Abhyankar ajj = aj + adiag[i]; 189cf3759fdSShri Abhyankar v1 = av + adiag[i]; 19067877ebaSShri Abhyankar for(j=0; j<rnz; j++) { 19167877ebaSShri Abhyankar row[nz] = i+shift; col[nz] = ajj[j] + shift; val[nz++] = v1[j]; 19216ebf90aSShri Abhyankar } 19316ebf90aSShri Abhyankar } 19416ebf90aSShri Abhyankar *r = row; *c = col; *v = val; 195397b6df1SKris Buschelman } else { 19616ebf90aSShri Abhyankar nz = 0; val = *v; 19716ebf90aSShri Abhyankar for(i=0; i <M; i++) { 19816ebf90aSShri Abhyankar rnz = ai[i+1] - adiag[i]; 19967877ebaSShri Abhyankar ajj = aj + adiag[i]; 20067877ebaSShri Abhyankar v1 = av + adiag[i]; 20167877ebaSShri Abhyankar for(j=0; j<rnz; j++) { 20267877ebaSShri Abhyankar val[nz++] = v1[j]; 20316ebf90aSShri Abhyankar } 20416ebf90aSShri Abhyankar } 20516ebf90aSShri Abhyankar } 20616ebf90aSShri Abhyankar PetscFunctionReturn(0); 20716ebf90aSShri Abhyankar } 20816ebf90aSShri Abhyankar 20916ebf90aSShri Abhyankar #undef __FUNCT__ 21016ebf90aSShri Abhyankar #define __FUNCT__ "MatConvertToTriples_mpisbaij_mpisbaij" 211bccb9932SShri Abhyankar PetscErrorCode MatConvertToTriples_mpisbaij_mpisbaij(Mat A,int shift,MatReuse reuse,int *nnz,int **r, int **c, PetscScalar **v) 21216ebf90aSShri Abhyankar { 21316ebf90aSShri Abhyankar const PetscInt *ai, *aj, *bi, *bj,*garray,m=A->rmap->n,*ajj,*bjj; 21416ebf90aSShri Abhyankar PetscErrorCode ierr; 21516ebf90aSShri Abhyankar PetscInt rstart,nz,i,j,jj,irow,countA,countB; 21616ebf90aSShri Abhyankar PetscInt *row,*col; 21716ebf90aSShri Abhyankar const PetscScalar *av, *bv,*v1,*v2; 21816ebf90aSShri Abhyankar PetscScalar *val; 219397b6df1SKris Buschelman Mat_MPISBAIJ *mat = (Mat_MPISBAIJ*)A->data; 220397b6df1SKris Buschelman Mat_SeqSBAIJ *aa=(Mat_SeqSBAIJ*)(mat->A)->data; 221397b6df1SKris Buschelman Mat_SeqBAIJ *bb=(Mat_SeqBAIJ*)(mat->B)->data; 22216ebf90aSShri Abhyankar 22316ebf90aSShri Abhyankar PetscFunctionBegin; 224d0f46423SBarry Smith ai=aa->i; aj=aa->j; bi=bb->i; bj=bb->j; rstart= A->rmap->rstart; 225397b6df1SKris Buschelman garray = mat->garray; 226397b6df1SKris Buschelman av=aa->a; bv=bb->a; 227397b6df1SKris Buschelman 228bccb9932SShri Abhyankar if (reuse == MAT_INITIAL_MATRIX){ 22916ebf90aSShri Abhyankar nz = aa->nz + bb->nz; 23016ebf90aSShri Abhyankar *nnz = nz; 231185f6596SHong Zhang ierr = PetscMalloc((2*nz*sizeof(PetscInt)+nz*sizeof(PetscScalar)), &row);CHKERRQ(ierr); 232185f6596SHong Zhang col = row + nz; 233185f6596SHong Zhang val = (PetscScalar*)(col + nz); 234185f6596SHong Zhang 235397b6df1SKris Buschelman *r = row; *c = col; *v = val; 236397b6df1SKris Buschelman } else { 237397b6df1SKris Buschelman row = *r; col = *c; val = *v; 238397b6df1SKris Buschelman } 239397b6df1SKris Buschelman 240028e57e8SHong Zhang jj = 0; irow = rstart; 241397b6df1SKris Buschelman for ( i=0; i<m; i++ ) { 242397b6df1SKris Buschelman ajj = aj + ai[i]; /* ptr to the beginning of this row */ 243397b6df1SKris Buschelman countA = ai[i+1] - ai[i]; 244397b6df1SKris Buschelman countB = bi[i+1] - bi[i]; 245397b6df1SKris Buschelman bjj = bj + bi[i]; 24616ebf90aSShri Abhyankar v1 = av + ai[i]; 24716ebf90aSShri Abhyankar v2 = bv + bi[i]; 248397b6df1SKris Buschelman 249397b6df1SKris Buschelman /* A-part */ 250397b6df1SKris Buschelman for (j=0; j<countA; j++){ 251bccb9932SShri Abhyankar if (reuse == MAT_INITIAL_MATRIX) { 252397b6df1SKris Buschelman row[jj] = irow + shift; col[jj] = rstart + ajj[j] + shift; 253397b6df1SKris Buschelman } 25416ebf90aSShri Abhyankar val[jj++] = v1[j]; 255397b6df1SKris Buschelman } 25616ebf90aSShri Abhyankar 25716ebf90aSShri Abhyankar /* B-part */ 25816ebf90aSShri Abhyankar for(j=0; j < countB; j++){ 259bccb9932SShri Abhyankar if (reuse == MAT_INITIAL_MATRIX) { 260397b6df1SKris Buschelman row[jj] = irow + shift; col[jj] = garray[bjj[j]] + shift; 261397b6df1SKris Buschelman } 26216ebf90aSShri Abhyankar val[jj++] = v2[j]; 26316ebf90aSShri Abhyankar } 26416ebf90aSShri Abhyankar irow++; 26516ebf90aSShri Abhyankar } 26616ebf90aSShri Abhyankar PetscFunctionReturn(0); 26716ebf90aSShri Abhyankar } 26816ebf90aSShri Abhyankar 26916ebf90aSShri Abhyankar #undef __FUNCT__ 27016ebf90aSShri Abhyankar #define __FUNCT__ "MatConvertToTriples_mpiaij_mpiaij" 271bccb9932SShri Abhyankar PetscErrorCode MatConvertToTriples_mpiaij_mpiaij(Mat A,int shift,MatReuse reuse,int *nnz,int **r, int **c, PetscScalar **v) 27216ebf90aSShri Abhyankar { 27316ebf90aSShri Abhyankar const PetscInt *ai, *aj, *bi, *bj,*garray,m=A->rmap->n,*ajj,*bjj; 27416ebf90aSShri Abhyankar PetscErrorCode ierr; 27516ebf90aSShri Abhyankar PetscInt rstart,nz,i,j,jj,irow,countA,countB; 27616ebf90aSShri Abhyankar PetscInt *row,*col; 27716ebf90aSShri Abhyankar const PetscScalar *av, *bv,*v1,*v2; 27816ebf90aSShri Abhyankar PetscScalar *val; 27916ebf90aSShri Abhyankar Mat_MPIAIJ *mat = (Mat_MPIAIJ*)A->data; 28016ebf90aSShri Abhyankar Mat_SeqAIJ *aa=(Mat_SeqAIJ*)(mat->A)->data; 28116ebf90aSShri Abhyankar Mat_SeqAIJ *bb=(Mat_SeqAIJ*)(mat->B)->data; 28216ebf90aSShri Abhyankar 28316ebf90aSShri Abhyankar PetscFunctionBegin; 28416ebf90aSShri Abhyankar ai=aa->i; aj=aa->j; bi=bb->i; bj=bb->j; rstart= A->rmap->rstart; 28516ebf90aSShri Abhyankar garray = mat->garray; 28616ebf90aSShri Abhyankar av=aa->a; bv=bb->a; 28716ebf90aSShri Abhyankar 288bccb9932SShri Abhyankar if (reuse == MAT_INITIAL_MATRIX){ 28916ebf90aSShri Abhyankar nz = aa->nz + bb->nz; 29016ebf90aSShri Abhyankar *nnz = nz; 291185f6596SHong Zhang ierr = PetscMalloc((2*nz*sizeof(PetscInt)+nz*sizeof(PetscScalar)), &row);CHKERRQ(ierr); 292185f6596SHong Zhang col = row + nz; 293185f6596SHong Zhang val = (PetscScalar*)(col + nz); 294185f6596SHong Zhang 29516ebf90aSShri Abhyankar *r = row; *c = col; *v = val; 29616ebf90aSShri Abhyankar } else { 29716ebf90aSShri Abhyankar row = *r; col = *c; val = *v; 29816ebf90aSShri Abhyankar } 29916ebf90aSShri Abhyankar 30016ebf90aSShri Abhyankar jj = 0; irow = rstart; 30116ebf90aSShri Abhyankar for ( i=0; i<m; i++ ) { 30216ebf90aSShri Abhyankar ajj = aj + ai[i]; /* ptr to the beginning of this row */ 30316ebf90aSShri Abhyankar countA = ai[i+1] - ai[i]; 30416ebf90aSShri Abhyankar countB = bi[i+1] - bi[i]; 30516ebf90aSShri Abhyankar bjj = bj + bi[i]; 30616ebf90aSShri Abhyankar v1 = av + ai[i]; 30716ebf90aSShri Abhyankar v2 = bv + bi[i]; 30816ebf90aSShri Abhyankar 30916ebf90aSShri Abhyankar /* A-part */ 31016ebf90aSShri Abhyankar for (j=0; j<countA; j++){ 311bccb9932SShri Abhyankar if (reuse == MAT_INITIAL_MATRIX){ 31216ebf90aSShri Abhyankar row[jj] = irow + shift; col[jj] = rstart + ajj[j] + shift; 31316ebf90aSShri Abhyankar } 31416ebf90aSShri Abhyankar val[jj++] = v1[j]; 31516ebf90aSShri Abhyankar } 31616ebf90aSShri Abhyankar 31716ebf90aSShri Abhyankar /* B-part */ 31816ebf90aSShri Abhyankar for(j=0; j < countB; j++){ 319bccb9932SShri Abhyankar if (reuse == MAT_INITIAL_MATRIX){ 32016ebf90aSShri Abhyankar row[jj] = irow + shift; col[jj] = garray[bjj[j]] + shift; 32116ebf90aSShri Abhyankar } 32216ebf90aSShri Abhyankar val[jj++] = v2[j]; 32316ebf90aSShri Abhyankar } 32416ebf90aSShri Abhyankar irow++; 32516ebf90aSShri Abhyankar } 32616ebf90aSShri Abhyankar PetscFunctionReturn(0); 32716ebf90aSShri Abhyankar } 32816ebf90aSShri Abhyankar 32916ebf90aSShri Abhyankar #undef __FUNCT__ 33067877ebaSShri Abhyankar #define __FUNCT__ "MatConvertToTriples_mpibaij_mpiaij" 331bccb9932SShri Abhyankar PetscErrorCode MatConvertToTriples_mpibaij_mpiaij(Mat A,int shift,MatReuse reuse,int *nnz,int **r, int **c, PetscScalar **v) 33267877ebaSShri Abhyankar { 33367877ebaSShri Abhyankar Mat_MPIBAIJ *mat = (Mat_MPIBAIJ*)A->data; 33467877ebaSShri Abhyankar Mat_SeqBAIJ *aa=(Mat_SeqBAIJ*)(mat->A)->data; 33567877ebaSShri Abhyankar Mat_SeqBAIJ *bb=(Mat_SeqBAIJ*)(mat->B)->data; 33667877ebaSShri Abhyankar const PetscInt *ai = aa->i, *bi = bb->i, *aj = aa->j, *bj = bb->j,*ajj, *bjj; 337d985c460SShri Abhyankar const PetscInt *garray = mat->garray,mbs=mat->mbs,rstart=A->rmap->rstart; 33867877ebaSShri Abhyankar const PetscInt bs = A->rmap->bs,bs2=mat->bs2; 33967877ebaSShri Abhyankar PetscErrorCode ierr; 34067877ebaSShri Abhyankar PetscInt nz,i,j,k,n,jj,irow,countA,countB,idx; 34167877ebaSShri Abhyankar PetscInt *row,*col; 34267877ebaSShri Abhyankar const PetscScalar *av=aa->a, *bv=bb->a,*v1,*v2; 34367877ebaSShri Abhyankar PetscScalar *val; 34467877ebaSShri Abhyankar 34567877ebaSShri Abhyankar PetscFunctionBegin; 34667877ebaSShri Abhyankar 347bccb9932SShri Abhyankar if (reuse == MAT_INITIAL_MATRIX) { 34867877ebaSShri Abhyankar nz = bs2*(aa->nz + bb->nz); 34967877ebaSShri Abhyankar *nnz = nz; 350185f6596SHong Zhang ierr = PetscMalloc((2*nz*sizeof(PetscInt)+nz*sizeof(PetscScalar)), &row);CHKERRQ(ierr); 351185f6596SHong Zhang col = row + nz; 352185f6596SHong Zhang val = (PetscScalar*)(col + nz); 353185f6596SHong Zhang 35467877ebaSShri Abhyankar *r = row; *c = col; *v = val; 35567877ebaSShri Abhyankar } else { 35667877ebaSShri Abhyankar row = *r; col = *c; val = *v; 35767877ebaSShri Abhyankar } 35867877ebaSShri Abhyankar 359d985c460SShri Abhyankar jj = 0; irow = rstart; 36067877ebaSShri Abhyankar for ( i=0; i<mbs; i++ ) { 36167877ebaSShri Abhyankar countA = ai[i+1] - ai[i]; 36267877ebaSShri Abhyankar countB = bi[i+1] - bi[i]; 36367877ebaSShri Abhyankar ajj = aj + ai[i]; 36467877ebaSShri Abhyankar bjj = bj + bi[i]; 36567877ebaSShri Abhyankar v1 = av + bs2*ai[i]; 36667877ebaSShri Abhyankar v2 = bv + bs2*bi[i]; 36767877ebaSShri Abhyankar 36867877ebaSShri Abhyankar idx = 0; 36967877ebaSShri Abhyankar /* A-part */ 37067877ebaSShri Abhyankar for (k=0; k<countA; k++){ 37167877ebaSShri Abhyankar for (j=0; j<bs; j++) { 37267877ebaSShri Abhyankar for (n=0; n<bs; n++) { 373bccb9932SShri Abhyankar if (reuse == MAT_INITIAL_MATRIX){ 374d985c460SShri Abhyankar row[jj] = irow + n + shift; 375d985c460SShri Abhyankar col[jj] = rstart + bs*ajj[k] + j + shift; 37667877ebaSShri Abhyankar } 37767877ebaSShri Abhyankar val[jj++] = v1[idx++]; 37867877ebaSShri Abhyankar } 37967877ebaSShri Abhyankar } 38067877ebaSShri Abhyankar } 38167877ebaSShri Abhyankar 38267877ebaSShri Abhyankar idx = 0; 38367877ebaSShri Abhyankar /* B-part */ 38467877ebaSShri Abhyankar for(k=0; k<countB; k++){ 38567877ebaSShri Abhyankar for (j=0; j<bs; j++) { 38667877ebaSShri Abhyankar for (n=0; n<bs; n++) { 387bccb9932SShri Abhyankar if (reuse == MAT_INITIAL_MATRIX){ 388d985c460SShri Abhyankar row[jj] = irow + n + shift; 389d985c460SShri Abhyankar col[jj] = bs*garray[bjj[k]] + j + shift; 39067877ebaSShri Abhyankar } 391d985c460SShri Abhyankar val[jj++] = v2[idx++]; 39267877ebaSShri Abhyankar } 39367877ebaSShri Abhyankar } 39467877ebaSShri Abhyankar } 395d985c460SShri Abhyankar irow += bs; 39667877ebaSShri Abhyankar } 39767877ebaSShri Abhyankar PetscFunctionReturn(0); 39867877ebaSShri Abhyankar } 39967877ebaSShri Abhyankar 40067877ebaSShri Abhyankar #undef __FUNCT__ 40116ebf90aSShri Abhyankar #define __FUNCT__ "MatConvertToTriples_mpiaij_mpisbaij" 402bccb9932SShri Abhyankar PetscErrorCode MatConvertToTriples_mpiaij_mpisbaij(Mat A,int shift,MatReuse reuse,int *nnz,int **r, int **c, PetscScalar **v) 40316ebf90aSShri Abhyankar { 40416ebf90aSShri Abhyankar const PetscInt *ai, *aj,*adiag, *bi, *bj,*garray,m=A->rmap->n,*ajj,*bjj; 40516ebf90aSShri Abhyankar PetscErrorCode ierr; 40616ebf90aSShri Abhyankar PetscInt rstart,nz,nza,nzb_low,i,j,jj,irow,countA,countB; 40716ebf90aSShri Abhyankar PetscInt *row,*col; 40816ebf90aSShri Abhyankar const PetscScalar *av, *bv,*v1,*v2; 40916ebf90aSShri Abhyankar PetscScalar *val; 41016ebf90aSShri Abhyankar Mat_MPIAIJ *mat = (Mat_MPIAIJ*)A->data; 41116ebf90aSShri Abhyankar Mat_SeqAIJ *aa=(Mat_SeqAIJ*)(mat->A)->data; 41216ebf90aSShri Abhyankar Mat_SeqAIJ *bb=(Mat_SeqAIJ*)(mat->B)->data; 41316ebf90aSShri Abhyankar 41416ebf90aSShri Abhyankar PetscFunctionBegin; 41516ebf90aSShri Abhyankar ai=aa->i; aj=aa->j; adiag=aa->diag; 41616ebf90aSShri Abhyankar bi=bb->i; bj=bb->j; garray = mat->garray; 41716ebf90aSShri Abhyankar av=aa->a; bv=bb->a; 41816ebf90aSShri Abhyankar rstart = A->rmap->rstart; 41916ebf90aSShri Abhyankar 420bccb9932SShri Abhyankar if (reuse == MAT_INITIAL_MATRIX) { 42116ebf90aSShri Abhyankar nza = 0;nzb_low = 0; 42216ebf90aSShri Abhyankar for(i=0; i<m; i++){ 42316ebf90aSShri Abhyankar nza = nza + (ai[i+1] - adiag[i]); 42416ebf90aSShri Abhyankar countB = bi[i+1] - bi[i]; 42516ebf90aSShri Abhyankar bjj = bj + bi[i]; 42616ebf90aSShri Abhyankar 42716ebf90aSShri Abhyankar j = 0; 42816ebf90aSShri Abhyankar while(garray[bjj[j]] < rstart) { 42916ebf90aSShri Abhyankar if(j == countB) break; 43016ebf90aSShri Abhyankar j++;nzb_low++; 43116ebf90aSShri Abhyankar } 43216ebf90aSShri Abhyankar } 43316ebf90aSShri Abhyankar /* Total nz = nz for the upper triangular A part + nz for the 2nd B part */ 43416ebf90aSShri Abhyankar nz = nza + (bb->nz - nzb_low); 43516ebf90aSShri Abhyankar *nnz = nz; 436185f6596SHong Zhang ierr = PetscMalloc((2*nz*sizeof(PetscInt)+nz*sizeof(PetscScalar)), &row);CHKERRQ(ierr); 437185f6596SHong Zhang col = row + nz; 438185f6596SHong Zhang val = (PetscScalar*)(col + nz); 439185f6596SHong Zhang 44016ebf90aSShri Abhyankar *r = row; *c = col; *v = val; 44116ebf90aSShri Abhyankar } else { 44216ebf90aSShri Abhyankar row = *r; col = *c; val = *v; 44316ebf90aSShri Abhyankar } 44416ebf90aSShri Abhyankar 44516ebf90aSShri Abhyankar jj = 0; irow = rstart; 44616ebf90aSShri Abhyankar for ( i=0; i<m; i++ ) { 44716ebf90aSShri Abhyankar ajj = aj + adiag[i]; /* ptr to the beginning of the diagonal of this row */ 44816ebf90aSShri Abhyankar v1 = av + adiag[i]; 44916ebf90aSShri Abhyankar countA = ai[i+1] - adiag[i]; 45016ebf90aSShri Abhyankar countB = bi[i+1] - bi[i]; 45116ebf90aSShri Abhyankar bjj = bj + bi[i]; 45216ebf90aSShri Abhyankar v2 = bv + bi[i]; 45316ebf90aSShri Abhyankar 45416ebf90aSShri Abhyankar /* A-part */ 45516ebf90aSShri Abhyankar for (j=0; j<countA; j++){ 456bccb9932SShri Abhyankar if (reuse == MAT_INITIAL_MATRIX) { 45716ebf90aSShri Abhyankar row[jj] = irow + shift; col[jj] = rstart + ajj[j] + shift; 45816ebf90aSShri Abhyankar } 45916ebf90aSShri Abhyankar val[jj++] = v1[j]; 46016ebf90aSShri Abhyankar } 46116ebf90aSShri Abhyankar 46216ebf90aSShri Abhyankar /* B-part */ 46316ebf90aSShri Abhyankar for(j=0; j < countB; j++){ 46416ebf90aSShri Abhyankar if (garray[bjj[j]] > rstart) { 465bccb9932SShri Abhyankar if (reuse == MAT_INITIAL_MATRIX) { 46616ebf90aSShri Abhyankar row[jj] = irow + shift; col[jj] = garray[bjj[j]] + shift; 46716ebf90aSShri Abhyankar } 46816ebf90aSShri Abhyankar val[jj++] = v2[j]; 46916ebf90aSShri Abhyankar } 470397b6df1SKris Buschelman } 471397b6df1SKris Buschelman irow++; 472397b6df1SKris Buschelman } 473397b6df1SKris Buschelman PetscFunctionReturn(0); 474397b6df1SKris Buschelman } 475397b6df1SKris Buschelman 476397b6df1SKris Buschelman #undef __FUNCT__ 4773924e44cSKris Buschelman #define __FUNCT__ "MatDestroy_MUMPS" 478dfbe8321SBarry Smith PetscErrorCode MatDestroy_MUMPS(Mat A) 479dfbe8321SBarry Smith { 480f0c56d0fSKris Buschelman Mat_MUMPS *lu=(Mat_MUMPS*)A->spptr; 481dfbe8321SBarry Smith PetscErrorCode ierr; 482b24902e0SBarry Smith 483397b6df1SKris Buschelman PetscFunctionBegin; 484397b6df1SKris Buschelman if (lu->CleanUpMUMPS) { 485397b6df1SKris Buschelman /* Terminate instance, deallocate memories */ 4868fa425b9SSatish Balay if (lu->id.sol_loc){ierr = PetscFree2(lu->id.sol_loc,lu->id.isol_loc);CHKERRQ(ierr);} 4878fa425b9SSatish Balay if (lu->scat_rhs){ierr = VecScatterDestroy(lu->scat_rhs);CHKERRQ(ierr);} 4888fa425b9SSatish Balay if (lu->b_seq) {ierr = VecDestroy(lu->b_seq);CHKERRQ(ierr);} 4892750af12SHong Zhang if (lu->nSolve && lu->scat_sol){ierr = VecScatterDestroy(lu->scat_sol);CHKERRQ(ierr);} 4902750af12SHong Zhang if (lu->nSolve && lu->x_seq){ierr = VecDestroy(lu->x_seq);CHKERRQ(ierr);} 4917c93a85dSSatish Balay 492185f6596SHong Zhang ierr = PetscFree(lu->irn);CHKERRQ(ierr); 493397b6df1SKris Buschelman lu->id.job=JOB_END; 494397b6df1SKris Buschelman #if defined(PETSC_USE_COMPLEX) 495397b6df1SKris Buschelman zmumps_c(&lu->id); 496397b6df1SKris Buschelman #else 497397b6df1SKris Buschelman dmumps_c(&lu->id); 498397b6df1SKris Buschelman #endif 499397b6df1SKris Buschelman ierr = MPI_Comm_free(&(lu->comm_mumps));CHKERRQ(ierr); 500397b6df1SKris Buschelman } 50197969023SHong Zhang /* clear composed functions */ 50297969023SHong Zhang ierr = PetscObjectComposeFunctionDynamic((PetscObject)A,"MatFactorGetSolverPackage_C","",PETSC_NULL);CHKERRQ(ierr); 503f250808bSBarry Smith ierr = PetscObjectComposeFunctionDynamic((PetscObject)A,"MatMumpsSetIcntl_C","",PETSC_NULL);CHKERRQ(ierr); 50467334b25SHong Zhang ierr = (lu->MatDestroy)(A);CHKERRQ(ierr); 505397b6df1SKris Buschelman PetscFunctionReturn(0); 506397b6df1SKris Buschelman } 507397b6df1SKris Buschelman 508397b6df1SKris Buschelman #undef __FUNCT__ 509f6c57405SHong Zhang #define __FUNCT__ "MatSolve_MUMPS" 510b24902e0SBarry Smith PetscErrorCode MatSolve_MUMPS(Mat A,Vec b,Vec x) 511b24902e0SBarry Smith { 512f0c56d0fSKris Buschelman Mat_MUMPS *lu=(Mat_MUMPS*)A->spptr; 513d54de34fSKris Buschelman PetscScalar *array; 51467877ebaSShri Abhyankar Vec b_seq; 515329ec9b3SHong Zhang IS is_iden,is_petsc; 516dfbe8321SBarry Smith PetscErrorCode ierr; 517329ec9b3SHong Zhang PetscInt i; 518397b6df1SKris Buschelman 519397b6df1SKris Buschelman PetscFunctionBegin; 520329ec9b3SHong Zhang lu->id.nrhs = 1; 52167877ebaSShri Abhyankar b_seq = lu->b_seq; 522397b6df1SKris Buschelman if (lu->size > 1){ 523329ec9b3SHong Zhang /* MUMPS only supports centralized rhs. Scatter b into a seqential rhs vector */ 52467877ebaSShri Abhyankar ierr = VecScatterBegin(lu->scat_rhs,b,b_seq,INSERT_VALUES,SCATTER_FORWARD);CHKERRQ(ierr); 52567877ebaSShri Abhyankar ierr = VecScatterEnd(lu->scat_rhs,b,b_seq,INSERT_VALUES,SCATTER_FORWARD);CHKERRQ(ierr); 52667877ebaSShri Abhyankar if (!lu->myid) {ierr = VecGetArray(b_seq,&array);CHKERRQ(ierr);} 527397b6df1SKris Buschelman } else { /* size == 1 */ 528397b6df1SKris Buschelman ierr = VecCopy(b,x);CHKERRQ(ierr); 529397b6df1SKris Buschelman ierr = VecGetArray(x,&array);CHKERRQ(ierr); 530397b6df1SKris Buschelman } 531397b6df1SKris Buschelman if (!lu->myid) { /* define rhs on the host */ 5328278f211SHong Zhang lu->id.nrhs = 1; 533397b6df1SKris Buschelman #if defined(PETSC_USE_COMPLEX) 534397b6df1SKris Buschelman lu->id.rhs = (mumps_double_complex*)array; 535397b6df1SKris Buschelman #else 536397b6df1SKris Buschelman lu->id.rhs = array; 537397b6df1SKris Buschelman #endif 538397b6df1SKris Buschelman } 539397b6df1SKris Buschelman 540397b6df1SKris Buschelman /* solve phase */ 541329ec9b3SHong Zhang /*-------------*/ 5423d472b54SHong Zhang lu->id.job = JOB_SOLVE; 543397b6df1SKris Buschelman #if defined(PETSC_USE_COMPLEX) 544397b6df1SKris Buschelman zmumps_c(&lu->id); 545397b6df1SKris Buschelman #else 546397b6df1SKris Buschelman dmumps_c(&lu->id); 547397b6df1SKris Buschelman #endif 54865e19b50SBarry 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)); 549397b6df1SKris Buschelman 550329ec9b3SHong Zhang if (lu->size > 1) { /* convert mumps distributed solution to petsc mpi x */ 551329ec9b3SHong Zhang if (!lu->nSolve){ /* create scatter scat_sol */ 552329ec9b3SHong Zhang ierr = ISCreateStride(PETSC_COMM_SELF,lu->id.lsol_loc,0,1,&is_iden);CHKERRQ(ierr); /* from */ 553329ec9b3SHong Zhang for (i=0; i<lu->id.lsol_loc; i++){ 554329ec9b3SHong Zhang lu->id.isol_loc[i] -= 1; /* change Fortran style to C style */ 555397b6df1SKris Buschelman } 55670b3c8c7SBarry Smith ierr = ISCreateGeneral(PETSC_COMM_SELF,lu->id.lsol_loc,lu->id.isol_loc,PETSC_COPY_VALUES,&is_petsc);CHKERRQ(ierr); /* to */ 557329ec9b3SHong Zhang ierr = VecScatterCreate(lu->x_seq,is_iden,x,is_petsc,&lu->scat_sol);CHKERRQ(ierr); 558329ec9b3SHong Zhang ierr = ISDestroy(is_iden);CHKERRQ(ierr); 559329ec9b3SHong Zhang ierr = ISDestroy(is_petsc);CHKERRQ(ierr); 560397b6df1SKris Buschelman } 561ca9f406cSSatish Balay ierr = VecScatterBegin(lu->scat_sol,lu->x_seq,x,INSERT_VALUES,SCATTER_FORWARD);CHKERRQ(ierr); 562ca9f406cSSatish Balay ierr = VecScatterEnd(lu->scat_sol,lu->x_seq,x,INSERT_VALUES,SCATTER_FORWARD);CHKERRQ(ierr); 563329ec9b3SHong Zhang } 564329ec9b3SHong Zhang lu->nSolve++; 565397b6df1SKris Buschelman PetscFunctionReturn(0); 566397b6df1SKris Buschelman } 567397b6df1SKris Buschelman 56851d5961aSHong Zhang #undef __FUNCT__ 56951d5961aSHong Zhang #define __FUNCT__ "MatSolveTranspose_MUMPS" 57051d5961aSHong Zhang PetscErrorCode MatSolveTranspose_MUMPS(Mat A,Vec b,Vec x) 57151d5961aSHong Zhang { 57251d5961aSHong Zhang Mat_MUMPS *lu=(Mat_MUMPS*)A->spptr; 57351d5961aSHong Zhang PetscErrorCode ierr; 57451d5961aSHong Zhang 57551d5961aSHong Zhang PetscFunctionBegin; 57651d5961aSHong Zhang lu->id.ICNTL(9) = 0; 57751d5961aSHong Zhang ierr = MatSolve_MUMPS(A,b,x); 57851d5961aSHong Zhang lu->id.ICNTL(9) = 1; 57951d5961aSHong Zhang PetscFunctionReturn(0); 58051d5961aSHong Zhang } 58151d5961aSHong Zhang 582ace3df97SHong Zhang #if !defined(PETSC_USE_COMPLEX) 583a58c3f20SHong Zhang /* 584a58c3f20SHong Zhang input: 585a58c3f20SHong Zhang F: numeric factor 586a58c3f20SHong Zhang output: 587a58c3f20SHong Zhang nneg: total number of negative pivots 588a58c3f20SHong Zhang nzero: 0 589a58c3f20SHong Zhang npos: (global dimension of F) - nneg 590a58c3f20SHong Zhang */ 591a58c3f20SHong Zhang 592a58c3f20SHong Zhang #undef __FUNCT__ 593a58c3f20SHong Zhang #define __FUNCT__ "MatGetInertia_SBAIJMUMPS" 594dfbe8321SBarry Smith PetscErrorCode MatGetInertia_SBAIJMUMPS(Mat F,int *nneg,int *nzero,int *npos) 595a58c3f20SHong Zhang { 596a58c3f20SHong Zhang Mat_MUMPS *lu =(Mat_MUMPS*)F->spptr; 597dfbe8321SBarry Smith PetscErrorCode ierr; 598c1490034SHong Zhang PetscMPIInt size; 599a58c3f20SHong Zhang 600a58c3f20SHong Zhang PetscFunctionBegin; 6017adad957SLisandro Dalcin ierr = MPI_Comm_size(((PetscObject)F)->comm,&size);CHKERRQ(ierr); 602bcb30aebSHong 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 */ 60365e19b50SBarry 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)); 604a58c3f20SHong Zhang if (nneg){ 605a58c3f20SHong Zhang if (!lu->myid){ 606a58c3f20SHong Zhang *nneg = lu->id.INFOG(12); 607a58c3f20SHong Zhang } 608bcb30aebSHong Zhang ierr = MPI_Bcast(nneg,1,MPI_INT,0,lu->comm_mumps);CHKERRQ(ierr); 609a58c3f20SHong Zhang } 610a58c3f20SHong Zhang if (nzero) *nzero = 0; 611d0f46423SBarry Smith if (npos) *npos = F->rmap->N - (*nneg); 612a58c3f20SHong Zhang PetscFunctionReturn(0); 613a58c3f20SHong Zhang } 614ace3df97SHong Zhang #endif /* !defined(PETSC_USE_COMPLEX) */ 615a58c3f20SHong Zhang 616397b6df1SKris Buschelman #undef __FUNCT__ 617f6c57405SHong Zhang #define __FUNCT__ "MatFactorNumeric_MUMPS" 6180481f469SBarry Smith PetscErrorCode MatFactorNumeric_MUMPS(Mat F,Mat A,const MatFactorInfo *info) 619af281ebdSHong Zhang { 620dcd589f8SShri Abhyankar Mat_MUMPS *lu =(Mat_MUMPS*)(F)->spptr; 6216849ba73SBarry Smith PetscErrorCode ierr; 622bccb9932SShri Abhyankar MatReuse reuse; 623e09efc27SHong Zhang Mat F_diag; 624ace3abfcSBarry Smith PetscBool isMPIAIJ; 625397b6df1SKris Buschelman 626397b6df1SKris Buschelman PetscFunctionBegin; 627bccb9932SShri Abhyankar reuse = MAT_REUSE_MATRIX; 628bccb9932SShri Abhyankar ierr = (*lu->ConvertToTriples)(A, 1, reuse, &lu->nz, &lu->irn, &lu->jcn, &lu->val);CHKERRQ(ierr); 629397b6df1SKris Buschelman 630397b6df1SKris Buschelman /* numerical factorization phase */ 631329ec9b3SHong Zhang /*-------------------------------*/ 6323d472b54SHong Zhang lu->id.job = JOB_FACTNUMERIC; 633958c9bccSBarry Smith if(!lu->id.ICNTL(18)) { 634a7aca84bSHong Zhang if (!lu->myid) { 635397b6df1SKris Buschelman #if defined(PETSC_USE_COMPLEX) 636397b6df1SKris Buschelman lu->id.a = (mumps_double_complex*)lu->val; 637397b6df1SKris Buschelman #else 638397b6df1SKris Buschelman lu->id.a = lu->val; 639397b6df1SKris Buschelman #endif 640397b6df1SKris Buschelman } 641397b6df1SKris Buschelman } else { 642397b6df1SKris Buschelman #if defined(PETSC_USE_COMPLEX) 643397b6df1SKris Buschelman lu->id.a_loc = (mumps_double_complex*)lu->val; 644397b6df1SKris Buschelman #else 645397b6df1SKris Buschelman lu->id.a_loc = lu->val; 646397b6df1SKris Buschelman #endif 647397b6df1SKris Buschelman } 648397b6df1SKris Buschelman #if defined(PETSC_USE_COMPLEX) 649397b6df1SKris Buschelman zmumps_c(&lu->id); 650397b6df1SKris Buschelman #else 651397b6df1SKris Buschelman dmumps_c(&lu->id); 652397b6df1SKris Buschelman #endif 653397b6df1SKris Buschelman if (lu->id.INFOG(1) < 0) { 65465e19b50SBarry 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)); 65565e19b50SBarry 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)); 656397b6df1SKris Buschelman } 65765e19b50SBarry 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)); 658397b6df1SKris Buschelman 6598ada1bb4SHong Zhang if (lu->size > 1){ 66016ebf90aSShri Abhyankar ierr = PetscTypeCompare((PetscObject)A,MATMPIAIJ,&isMPIAIJ);CHKERRQ(ierr); 661a214ac2aSShri Abhyankar if(isMPIAIJ) { 662dcd589f8SShri Abhyankar F_diag = ((Mat_MPIAIJ *)(F)->data)->A; 663e09efc27SHong Zhang } else { 664dcd589f8SShri Abhyankar F_diag = ((Mat_MPISBAIJ *)(F)->data)->A; 665e09efc27SHong Zhang } 666e09efc27SHong Zhang F_diag->assembled = PETSC_TRUE; 667329ec9b3SHong Zhang if (lu->nSolve){ 668329ec9b3SHong Zhang ierr = VecScatterDestroy(lu->scat_sol);CHKERRQ(ierr); 6690e83c824SBarry Smith ierr = PetscFree2(lu->id.sol_loc,lu->id.isol_loc);CHKERRQ(ierr); 670329ec9b3SHong Zhang ierr = VecDestroy(lu->x_seq);CHKERRQ(ierr); 671329ec9b3SHong Zhang } 6728ada1bb4SHong Zhang } 673dcd589f8SShri Abhyankar (F)->assembled = PETSC_TRUE; 674397b6df1SKris Buschelman lu->matstruc = SAME_NONZERO_PATTERN; 675ace87b0dSHong Zhang lu->CleanUpMUMPS = PETSC_TRUE; 676329ec9b3SHong Zhang lu->nSolve = 0; 67767877ebaSShri Abhyankar 67867877ebaSShri Abhyankar if (lu->size > 1){ 67967877ebaSShri Abhyankar /* distributed solution */ 68067877ebaSShri Abhyankar lu->id.ICNTL(21) = 1; 68167877ebaSShri Abhyankar if (!lu->nSolve){ 68267877ebaSShri Abhyankar /* Create x_seq=sol_loc for repeated use */ 68367877ebaSShri Abhyankar PetscInt lsol_loc; 68467877ebaSShri Abhyankar PetscScalar *sol_loc; 68567877ebaSShri Abhyankar lsol_loc = lu->id.INFO(23); /* length of sol_loc */ 68667877ebaSShri Abhyankar ierr = PetscMalloc2(lsol_loc,PetscScalar,&sol_loc,lsol_loc,PetscInt,&lu->id.isol_loc);CHKERRQ(ierr); 68767877ebaSShri Abhyankar lu->id.lsol_loc = lsol_loc; 68867877ebaSShri Abhyankar #if defined(PETSC_USE_COMPLEX) 68967877ebaSShri Abhyankar lu->id.sol_loc = (mumps_double_complex*)sol_loc; 69067877ebaSShri Abhyankar #else 69167877ebaSShri Abhyankar lu->id.sol_loc = sol_loc; 69267877ebaSShri Abhyankar #endif 69367877ebaSShri Abhyankar ierr = VecCreateSeqWithArray(PETSC_COMM_SELF,lsol_loc,sol_loc,&lu->x_seq);CHKERRQ(ierr); 69467877ebaSShri Abhyankar } 69567877ebaSShri Abhyankar } 696397b6df1SKris Buschelman PetscFunctionReturn(0); 697397b6df1SKris Buschelman } 698397b6df1SKris Buschelman 699dcd589f8SShri Abhyankar #undef __FUNCT__ 700dcd589f8SShri Abhyankar #define __FUNCT__ "PetscSetMUMPSOptions" 701dcd589f8SShri Abhyankar PetscErrorCode PetscSetMUMPSOptions(Mat F, Mat A) 702dcd589f8SShri Abhyankar { 703dcd589f8SShri Abhyankar Mat_MUMPS *lu = (Mat_MUMPS*)F->spptr; 704dcd589f8SShri Abhyankar PetscErrorCode ierr; 705dcd589f8SShri Abhyankar PetscInt icntl; 706ace3abfcSBarry Smith PetscBool flg; 707dcd589f8SShri Abhyankar 708dcd589f8SShri Abhyankar PetscFunctionBegin; 709dcd589f8SShri Abhyankar ierr = PetscOptionsBegin(((PetscObject)A)->comm,((PetscObject)A)->prefix,"MUMPS Options","Mat");CHKERRQ(ierr); 710dcd589f8SShri Abhyankar if (lu->size == 1){ 711dcd589f8SShri Abhyankar lu->id.ICNTL(18) = 0; /* centralized assembled matrix input */ 712dcd589f8SShri Abhyankar } else { 713dcd589f8SShri Abhyankar lu->id.ICNTL(18) = 3; /* distributed assembled matrix input */ 714dcd589f8SShri Abhyankar } 715dcd589f8SShri Abhyankar 716dcd589f8SShri Abhyankar icntl=-1; 717dcd589f8SShri Abhyankar lu->id.ICNTL(4) = 0; /* level of printing; overwrite mumps default ICNTL(4)=2 */ 718dcd589f8SShri Abhyankar ierr = PetscOptionsInt("-mat_mumps_icntl_4","ICNTL(4): level of printing (0 to 4)","None",lu->id.ICNTL(4),&icntl,&flg);CHKERRQ(ierr); 719dcd589f8SShri Abhyankar if ((flg && icntl > 0) || PetscLogPrintInfo) { 720dcd589f8SShri Abhyankar lu->id.ICNTL(4)=icntl; /* and use mumps default icntl(i), i=1,2,3 */ 721dcd589f8SShri Abhyankar } else { /* no output */ 722dcd589f8SShri Abhyankar lu->id.ICNTL(1) = 0; /* error message, default= 6 */ 723dcd589f8SShri Abhyankar lu->id.ICNTL(2) = 0; /* output stream for diagnostic printing, statistics, and warning. default=0 */ 724dcd589f8SShri Abhyankar lu->id.ICNTL(3) = 0; /* output stream for global information, default=6 */ 725dcd589f8SShri Abhyankar } 726dcd589f8SShri Abhyankar ierr = PetscOptionsInt("-mat_mumps_icntl_6","ICNTL(6): column permutation and/or scaling to get a zero-free diagonal (0 to 7)","None",lu->id.ICNTL(6),&lu->id.ICNTL(6),PETSC_NULL);CHKERRQ(ierr); 727dcd589f8SShri Abhyankar icntl=-1; 728292fb18eSBarry Smith ierr = PetscOptionsInt("-mat_mumps_icntl_7","ICNTL(7): sequential matrix ordering (0 to 7) 3 = Scotch, 5 = Metis","None",lu->id.ICNTL(7),&icntl,&flg);CHKERRQ(ierr); 729dcd589f8SShri Abhyankar if (flg) { 730dcd589f8SShri Abhyankar if (icntl== 1){ 731e32f2f54SBarry 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"); 732dcd589f8SShri Abhyankar } else { 733dcd589f8SShri Abhyankar lu->id.ICNTL(7) = icntl; 734dcd589f8SShri Abhyankar } 735dcd589f8SShri Abhyankar } 736dcd589f8SShri Abhyankar ierr = PetscOptionsInt("-mat_mumps_icntl_8","ICNTL(8): scaling strategy (-2 to 7 or 77)","None",lu->id.ICNTL(8),&lu->id.ICNTL(8),PETSC_NULL);CHKERRQ(ierr); 737dcd589f8SShri Abhyankar ierr = PetscOptionsInt("-mat_mumps_icntl_10","ICNTL(10): max num of refinements","None",lu->id.ICNTL(10),&lu->id.ICNTL(10),PETSC_NULL);CHKERRQ(ierr); 738dcd589f8SShri Abhyankar ierr = PetscOptionsInt("-mat_mumps_icntl_11","ICNTL(11): statistics related to the linear system solved (via -ksp_view)","None",lu->id.ICNTL(11),&lu->id.ICNTL(11),PETSC_NULL);CHKERRQ(ierr); 739dcd589f8SShri Abhyankar ierr = PetscOptionsInt("-mat_mumps_icntl_12","ICNTL(12): efficiency control: defines the ordering strategy with scaling constraints (0 to 3","None",lu->id.ICNTL(12),&lu->id.ICNTL(12),PETSC_NULL);CHKERRQ(ierr); 740dcd589f8SShri Abhyankar ierr = PetscOptionsInt("-mat_mumps_icntl_13","ICNTL(13): efficiency control: with or without ScaLAPACK","None",lu->id.ICNTL(13),&lu->id.ICNTL(13),PETSC_NULL);CHKERRQ(ierr); 741dcd589f8SShri Abhyankar ierr = PetscOptionsInt("-mat_mumps_icntl_14","ICNTL(14): percentage of estimated workspace increase","None",lu->id.ICNTL(14),&lu->id.ICNTL(14),PETSC_NULL);CHKERRQ(ierr); 742dcd589f8SShri Abhyankar ierr = PetscOptionsInt("-mat_mumps_icntl_19","ICNTL(19): Schur complement","None",lu->id.ICNTL(19),&lu->id.ICNTL(19),PETSC_NULL);CHKERRQ(ierr); 743dcd589f8SShri Abhyankar 744dcd589f8SShri Abhyankar ierr = PetscOptionsInt("-mat_mumps_icntl_22","ICNTL(22): in-core/out-of-core facility (0 or 1)","None",lu->id.ICNTL(22),&lu->id.ICNTL(22),PETSC_NULL);CHKERRQ(ierr); 745dcd589f8SShri Abhyankar ierr = PetscOptionsInt("-mat_mumps_icntl_23","ICNTL(23): max size of the working memory (MB) that can allocate per processor","None",lu->id.ICNTL(23),&lu->id.ICNTL(23),PETSC_NULL);CHKERRQ(ierr); 746dcd589f8SShri Abhyankar ierr = PetscOptionsInt("-mat_mumps_icntl_24","ICNTL(24): detection of null pivot rows (0 or 1)","None",lu->id.ICNTL(24),&lu->id.ICNTL(24),PETSC_NULL);CHKERRQ(ierr); 747d7ebd59bSHong Zhang if (lu->id.ICNTL(24)){ 748d7ebd59bSHong Zhang lu->id.ICNTL(13) = 1; /* turn-off ScaLAPACK to help with the correct detection of null pivots */ 749d7ebd59bSHong Zhang } 750d7ebd59bSHong Zhang 751dcd589f8SShri Abhyankar ierr = PetscOptionsInt("-mat_mumps_icntl_25","ICNTL(25): computation of a null space basis","None",lu->id.ICNTL(25),&lu->id.ICNTL(25),PETSC_NULL);CHKERRQ(ierr); 752dcd589f8SShri Abhyankar ierr = PetscOptionsInt("-mat_mumps_icntl_26","ICNTL(26): Schur options for right-hand side or solution vector","None",lu->id.ICNTL(26),&lu->id.ICNTL(26),PETSC_NULL);CHKERRQ(ierr); 753dcd589f8SShri Abhyankar ierr = PetscOptionsInt("-mat_mumps_icntl_27","ICNTL(27): experimental parameter","None",lu->id.ICNTL(27),&lu->id.ICNTL(27),PETSC_NULL);CHKERRQ(ierr); 754d7ebd59bSHong 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",lu->id.ICNTL(28),&lu->id.ICNTL(28),PETSC_NULL);CHKERRQ(ierr); 755292fb18eSBarry Smith ierr = PetscOptionsInt("-mat_mumps_icntl_29","ICNTL(29): parallel ordering 1 = ptscotch 2 = parmetis","None",lu->id.ICNTL(29),&lu->id.ICNTL(29),PETSC_NULL);CHKERRQ(ierr); 756dcd589f8SShri Abhyankar 757dcd589f8SShri Abhyankar ierr = PetscOptionsReal("-mat_mumps_cntl_1","CNTL(1): relative pivoting threshold","None",lu->id.CNTL(1),&lu->id.CNTL(1),PETSC_NULL);CHKERRQ(ierr); 758dcd589f8SShri Abhyankar ierr = PetscOptionsReal("-mat_mumps_cntl_2","CNTL(2): stopping criterion of refinement","None",lu->id.CNTL(2),&lu->id.CNTL(2),PETSC_NULL);CHKERRQ(ierr); 759dcd589f8SShri Abhyankar ierr = PetscOptionsReal("-mat_mumps_cntl_3","CNTL(3): absolute pivoting threshold","None",lu->id.CNTL(3),&lu->id.CNTL(3),PETSC_NULL);CHKERRQ(ierr); 760dcd589f8SShri Abhyankar ierr = PetscOptionsReal("-mat_mumps_cntl_4","CNTL(4): value for static pivoting","None",lu->id.CNTL(4),&lu->id.CNTL(4),PETSC_NULL);CHKERRQ(ierr); 761dcd589f8SShri Abhyankar ierr = PetscOptionsReal("-mat_mumps_cntl_5","CNTL(5): fixation for null pivots","None",lu->id.CNTL(5),&lu->id.CNTL(5),PETSC_NULL);CHKERRQ(ierr); 762dcd589f8SShri Abhyankar PetscOptionsEnd(); 763dcd589f8SShri Abhyankar PetscFunctionReturn(0); 764dcd589f8SShri Abhyankar } 765dcd589f8SShri Abhyankar 766dcd589f8SShri Abhyankar #undef __FUNCT__ 767dcd589f8SShri Abhyankar #define __FUNCT__ "PetscInitializeMUMPS" 768f697e70eSHong Zhang PetscErrorCode PetscInitializeMUMPS(Mat A,Mat_MUMPS* mumps) 769dcd589f8SShri Abhyankar { 770dcd589f8SShri Abhyankar PetscErrorCode ierr; 771dcd589f8SShri Abhyankar 772dcd589f8SShri Abhyankar PetscFunctionBegin; 773f697e70eSHong Zhang ierr = MPI_Comm_rank(((PetscObject)A)->comm, &mumps->myid); 774f697e70eSHong Zhang ierr = MPI_Comm_size(((PetscObject)A)->comm,&mumps->size);CHKERRQ(ierr); 775f697e70eSHong Zhang ierr = MPI_Comm_dup(((PetscObject)A)->comm,&(mumps->comm_mumps));CHKERRQ(ierr); 776f697e70eSHong Zhang mumps->id.comm_fortran = MPI_Comm_c2f(mumps->comm_mumps); 777f697e70eSHong Zhang 778f697e70eSHong Zhang mumps->id.job = JOB_INIT; 779f697e70eSHong Zhang mumps->id.par = 1; /* host participates factorizaton and solve */ 780f697e70eSHong Zhang mumps->id.sym = mumps->sym; 781dcd589f8SShri Abhyankar #if defined(PETSC_USE_COMPLEX) 782f697e70eSHong Zhang zmumps_c(&mumps->id); 783dcd589f8SShri Abhyankar #else 784f697e70eSHong Zhang dmumps_c(&mumps->id); 785dcd589f8SShri Abhyankar #endif 786f697e70eSHong Zhang 787f697e70eSHong Zhang mumps->CleanUpMUMPS = PETSC_FALSE; 788f697e70eSHong Zhang mumps->scat_rhs = PETSC_NULL; 789f697e70eSHong Zhang mumps->scat_sol = PETSC_NULL; 790f697e70eSHong Zhang mumps->nSolve = 0; 791dcd589f8SShri Abhyankar PetscFunctionReturn(0); 792dcd589f8SShri Abhyankar } 793dcd589f8SShri Abhyankar 794397b6df1SKris Buschelman /* Note the Petsc r and c permutations are ignored */ 795397b6df1SKris Buschelman #undef __FUNCT__ 796f0c56d0fSKris Buschelman #define __FUNCT__ "MatLUFactorSymbolic_AIJMUMPS" 7970481f469SBarry Smith PetscErrorCode MatLUFactorSymbolic_AIJMUMPS(Mat F,Mat A,IS r,IS c,const MatFactorInfo *info) 798b24902e0SBarry Smith { 799719d5645SBarry Smith Mat_MUMPS *lu = (Mat_MUMPS*)F->spptr; 800dcd589f8SShri Abhyankar PetscErrorCode ierr; 801bccb9932SShri Abhyankar MatReuse reuse; 80267877ebaSShri Abhyankar Vec b; 80367877ebaSShri Abhyankar IS is_iden; 80467877ebaSShri Abhyankar const PetscInt M = A->rmap->N; 805397b6df1SKris Buschelman 806397b6df1SKris Buschelman PetscFunctionBegin; 807b24902e0SBarry Smith lu->matstruc = DIFFERENT_NONZERO_PATTERN; 808dcd589f8SShri Abhyankar 809dcd589f8SShri Abhyankar /* Set MUMPS options */ 810dcd589f8SShri Abhyankar ierr = PetscSetMUMPSOptions(F,A);CHKERRQ(ierr); 811dcd589f8SShri Abhyankar 812bccb9932SShri Abhyankar reuse = MAT_INITIAL_MATRIX; 813bccb9932SShri Abhyankar ierr = (*lu->ConvertToTriples)(A, 1, reuse, &lu->nz, &lu->irn, &lu->jcn, &lu->val);CHKERRQ(ierr); 814dcd589f8SShri Abhyankar 81567877ebaSShri Abhyankar /* analysis phase */ 81667877ebaSShri Abhyankar /*----------------*/ 8173d472b54SHong Zhang lu->id.job = JOB_FACTSYMBOLIC; 81867877ebaSShri Abhyankar lu->id.n = M; 81967877ebaSShri Abhyankar switch (lu->id.ICNTL(18)){ 82067877ebaSShri Abhyankar case 0: /* centralized assembled matrix input */ 82167877ebaSShri Abhyankar if (!lu->myid) { 82267877ebaSShri Abhyankar lu->id.nz =lu->nz; lu->id.irn=lu->irn; lu->id.jcn=lu->jcn; 82367877ebaSShri Abhyankar if (lu->id.ICNTL(6)>1){ 82467877ebaSShri Abhyankar #if defined(PETSC_USE_COMPLEX) 82567877ebaSShri Abhyankar lu->id.a = (mumps_double_complex*)lu->val; 82667877ebaSShri Abhyankar #else 82767877ebaSShri Abhyankar lu->id.a = lu->val; 82867877ebaSShri Abhyankar #endif 82967877ebaSShri Abhyankar } 83067877ebaSShri Abhyankar } 83167877ebaSShri Abhyankar break; 83267877ebaSShri Abhyankar case 3: /* distributed assembled matrix input (size>1) */ 83367877ebaSShri Abhyankar lu->id.nz_loc = lu->nz; 83467877ebaSShri Abhyankar lu->id.irn_loc=lu->irn; lu->id.jcn_loc=lu->jcn; 83567877ebaSShri Abhyankar if (lu->id.ICNTL(6)>1) { 83667877ebaSShri Abhyankar #if defined(PETSC_USE_COMPLEX) 83767877ebaSShri Abhyankar lu->id.a_loc = (mumps_double_complex*)lu->val; 83867877ebaSShri Abhyankar #else 83967877ebaSShri Abhyankar lu->id.a_loc = lu->val; 84067877ebaSShri Abhyankar #endif 84167877ebaSShri Abhyankar } 84267877ebaSShri Abhyankar /* MUMPS only supports centralized rhs. Create scatter scat_rhs for repeated use in MatSolve() */ 84367877ebaSShri Abhyankar if (!lu->myid){ 84467877ebaSShri Abhyankar ierr = VecCreateSeq(PETSC_COMM_SELF,A->cmap->N,&lu->b_seq);CHKERRQ(ierr); 84567877ebaSShri Abhyankar ierr = ISCreateStride(PETSC_COMM_SELF,A->cmap->N,0,1,&is_iden);CHKERRQ(ierr); 84667877ebaSShri Abhyankar } else { 84767877ebaSShri Abhyankar ierr = VecCreateSeq(PETSC_COMM_SELF,0,&lu->b_seq);CHKERRQ(ierr); 84867877ebaSShri Abhyankar ierr = ISCreateStride(PETSC_COMM_SELF,0,0,1,&is_iden);CHKERRQ(ierr); 84967877ebaSShri Abhyankar } 85067877ebaSShri Abhyankar ierr = VecCreate(((PetscObject)A)->comm,&b);CHKERRQ(ierr); 85167877ebaSShri Abhyankar ierr = VecSetSizes(b,A->rmap->n,PETSC_DECIDE);CHKERRQ(ierr); 85267877ebaSShri Abhyankar ierr = VecSetFromOptions(b);CHKERRQ(ierr); 85367877ebaSShri Abhyankar 85467877ebaSShri Abhyankar ierr = VecScatterCreate(b,is_iden,lu->b_seq,is_iden,&lu->scat_rhs);CHKERRQ(ierr); 85567877ebaSShri Abhyankar ierr = ISDestroy(is_iden);CHKERRQ(ierr); 85667877ebaSShri Abhyankar ierr = VecDestroy(b);CHKERRQ(ierr); 85767877ebaSShri Abhyankar break; 85867877ebaSShri Abhyankar } 85967877ebaSShri Abhyankar #if defined(PETSC_USE_COMPLEX) 86067877ebaSShri Abhyankar zmumps_c(&lu->id); 86167877ebaSShri Abhyankar #else 86267877ebaSShri Abhyankar dmumps_c(&lu->id); 86367877ebaSShri Abhyankar #endif 86467877ebaSShri 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)); 86567877ebaSShri Abhyankar 866719d5645SBarry Smith F->ops->lufactornumeric = MatFactorNumeric_MUMPS; 867dcd589f8SShri Abhyankar F->ops->solve = MatSolve_MUMPS; 86851d5961aSHong Zhang F->ops->solvetranspose = MatSolveTranspose_MUMPS; 869b24902e0SBarry Smith PetscFunctionReturn(0); 870b24902e0SBarry Smith } 871b24902e0SBarry Smith 872450b117fSShri Abhyankar /* Note the Petsc r and c permutations are ignored */ 873450b117fSShri Abhyankar #undef __FUNCT__ 874450b117fSShri Abhyankar #define __FUNCT__ "MatLUFactorSymbolic_BAIJMUMPS" 875450b117fSShri Abhyankar PetscErrorCode MatLUFactorSymbolic_BAIJMUMPS(Mat F,Mat A,IS r,IS c,const MatFactorInfo *info) 876450b117fSShri Abhyankar { 877dcd589f8SShri Abhyankar 878450b117fSShri Abhyankar Mat_MUMPS *lu = (Mat_MUMPS*)F->spptr; 879dcd589f8SShri Abhyankar PetscErrorCode ierr; 880bccb9932SShri Abhyankar MatReuse reuse; 88167877ebaSShri Abhyankar Vec b; 88267877ebaSShri Abhyankar IS is_iden; 88367877ebaSShri Abhyankar const PetscInt M = A->rmap->N; 884450b117fSShri Abhyankar 885450b117fSShri Abhyankar PetscFunctionBegin; 886450b117fSShri Abhyankar lu->matstruc = DIFFERENT_NONZERO_PATTERN; 887dcd589f8SShri Abhyankar 888dcd589f8SShri Abhyankar /* Set MUMPS options */ 889dcd589f8SShri Abhyankar ierr = PetscSetMUMPSOptions(F,A);CHKERRQ(ierr); 890dcd589f8SShri Abhyankar 891bccb9932SShri Abhyankar reuse = MAT_INITIAL_MATRIX; 892bccb9932SShri Abhyankar ierr = (*lu->ConvertToTriples)(A, 1, reuse, &lu->nz, &lu->irn, &lu->jcn, &lu->val);CHKERRQ(ierr); 89367877ebaSShri Abhyankar 89467877ebaSShri Abhyankar /* analysis phase */ 89567877ebaSShri Abhyankar /*----------------*/ 8963d472b54SHong Zhang lu->id.job = JOB_FACTSYMBOLIC; 89767877ebaSShri Abhyankar lu->id.n = M; 89867877ebaSShri Abhyankar switch (lu->id.ICNTL(18)){ 89967877ebaSShri Abhyankar case 0: /* centralized assembled matrix input */ 90067877ebaSShri Abhyankar if (!lu->myid) { 90167877ebaSShri Abhyankar lu->id.nz =lu->nz; lu->id.irn=lu->irn; lu->id.jcn=lu->jcn; 90267877ebaSShri Abhyankar if (lu->id.ICNTL(6)>1){ 90367877ebaSShri Abhyankar #if defined(PETSC_USE_COMPLEX) 90467877ebaSShri Abhyankar lu->id.a = (mumps_double_complex*)lu->val; 90567877ebaSShri Abhyankar #else 90667877ebaSShri Abhyankar lu->id.a = lu->val; 90767877ebaSShri Abhyankar #endif 90867877ebaSShri Abhyankar } 90967877ebaSShri Abhyankar } 91067877ebaSShri Abhyankar break; 91167877ebaSShri Abhyankar case 3: /* distributed assembled matrix input (size>1) */ 91267877ebaSShri Abhyankar lu->id.nz_loc = lu->nz; 91367877ebaSShri Abhyankar lu->id.irn_loc=lu->irn; lu->id.jcn_loc=lu->jcn; 91467877ebaSShri Abhyankar if (lu->id.ICNTL(6)>1) { 91567877ebaSShri Abhyankar #if defined(PETSC_USE_COMPLEX) 91667877ebaSShri Abhyankar lu->id.a_loc = (mumps_double_complex*)lu->val; 91767877ebaSShri Abhyankar #else 91867877ebaSShri Abhyankar lu->id.a_loc = lu->val; 91967877ebaSShri Abhyankar #endif 92067877ebaSShri Abhyankar } 92167877ebaSShri Abhyankar /* MUMPS only supports centralized rhs. Create scatter scat_rhs for repeated use in MatSolve() */ 92267877ebaSShri Abhyankar if (!lu->myid){ 92367877ebaSShri Abhyankar ierr = VecCreateSeq(PETSC_COMM_SELF,A->cmap->N,&lu->b_seq);CHKERRQ(ierr); 92467877ebaSShri Abhyankar ierr = ISCreateStride(PETSC_COMM_SELF,A->cmap->N,0,1,&is_iden);CHKERRQ(ierr); 92567877ebaSShri Abhyankar } else { 92667877ebaSShri Abhyankar ierr = VecCreateSeq(PETSC_COMM_SELF,0,&lu->b_seq);CHKERRQ(ierr); 92767877ebaSShri Abhyankar ierr = ISCreateStride(PETSC_COMM_SELF,0,0,1,&is_iden);CHKERRQ(ierr); 92867877ebaSShri Abhyankar } 92967877ebaSShri Abhyankar ierr = VecCreate(((PetscObject)A)->comm,&b);CHKERRQ(ierr); 93067877ebaSShri Abhyankar ierr = VecSetSizes(b,A->rmap->n,PETSC_DECIDE);CHKERRQ(ierr); 93167877ebaSShri Abhyankar ierr = VecSetFromOptions(b);CHKERRQ(ierr); 93267877ebaSShri Abhyankar 93367877ebaSShri Abhyankar ierr = VecScatterCreate(b,is_iden,lu->b_seq,is_iden,&lu->scat_rhs);CHKERRQ(ierr); 93467877ebaSShri Abhyankar ierr = ISDestroy(is_iden);CHKERRQ(ierr); 93567877ebaSShri Abhyankar ierr = VecDestroy(b);CHKERRQ(ierr); 93667877ebaSShri Abhyankar break; 93767877ebaSShri Abhyankar } 93867877ebaSShri Abhyankar #if defined(PETSC_USE_COMPLEX) 93967877ebaSShri Abhyankar zmumps_c(&lu->id); 94067877ebaSShri Abhyankar #else 94167877ebaSShri Abhyankar dmumps_c(&lu->id); 94267877ebaSShri Abhyankar #endif 94367877ebaSShri 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)); 94467877ebaSShri Abhyankar 945450b117fSShri Abhyankar F->ops->lufactornumeric = MatFactorNumeric_MUMPS; 946dcd589f8SShri Abhyankar F->ops->solve = MatSolve_MUMPS; 94751d5961aSHong Zhang F->ops->solvetranspose = MatSolveTranspose_MUMPS; 948450b117fSShri Abhyankar PetscFunctionReturn(0); 949450b117fSShri Abhyankar } 950b24902e0SBarry Smith 951141f4205SHong Zhang /* Note the Petsc r permutation and factor info are ignored */ 952397b6df1SKris Buschelman #undef __FUNCT__ 95367877ebaSShri Abhyankar #define __FUNCT__ "MatCholeskyFactorSymbolic_MUMPS" 95467877ebaSShri Abhyankar PetscErrorCode MatCholeskyFactorSymbolic_MUMPS(Mat F,Mat A,IS r,const MatFactorInfo *info) 955b24902e0SBarry Smith { 9562792810eSHong Zhang Mat_MUMPS *lu = (Mat_MUMPS*)F->spptr; 957dcd589f8SShri Abhyankar PetscErrorCode ierr; 958bccb9932SShri Abhyankar MatReuse reuse; 95967877ebaSShri Abhyankar Vec b; 96067877ebaSShri Abhyankar IS is_iden; 96167877ebaSShri Abhyankar const PetscInt M = A->rmap->N; 962397b6df1SKris Buschelman 963397b6df1SKris Buschelman PetscFunctionBegin; 964b24902e0SBarry Smith lu->matstruc = DIFFERENT_NONZERO_PATTERN; 965dcd589f8SShri Abhyankar 966dcd589f8SShri Abhyankar /* Set MUMPS options */ 967dcd589f8SShri Abhyankar ierr = PetscSetMUMPSOptions(F,A);CHKERRQ(ierr); 968dcd589f8SShri Abhyankar 969bccb9932SShri Abhyankar reuse = MAT_INITIAL_MATRIX; 970bccb9932SShri Abhyankar ierr = (*lu->ConvertToTriples)(A, 1 , reuse, &lu->nz, &lu->irn, &lu->jcn, &lu->val);CHKERRQ(ierr); 971dcd589f8SShri Abhyankar 97267877ebaSShri Abhyankar /* analysis phase */ 97367877ebaSShri Abhyankar /*----------------*/ 9743d472b54SHong Zhang lu->id.job = JOB_FACTSYMBOLIC; 97567877ebaSShri Abhyankar lu->id.n = M; 97667877ebaSShri Abhyankar switch (lu->id.ICNTL(18)){ 97767877ebaSShri Abhyankar case 0: /* centralized assembled matrix input */ 97867877ebaSShri Abhyankar if (!lu->myid) { 97967877ebaSShri Abhyankar lu->id.nz =lu->nz; lu->id.irn=lu->irn; lu->id.jcn=lu->jcn; 98067877ebaSShri Abhyankar if (lu->id.ICNTL(6)>1){ 98167877ebaSShri Abhyankar #if defined(PETSC_USE_COMPLEX) 98267877ebaSShri Abhyankar lu->id.a = (mumps_double_complex*)lu->val; 98367877ebaSShri Abhyankar #else 98467877ebaSShri Abhyankar lu->id.a = lu->val; 98567877ebaSShri Abhyankar #endif 98667877ebaSShri Abhyankar } 98767877ebaSShri Abhyankar } 98867877ebaSShri Abhyankar break; 98967877ebaSShri Abhyankar case 3: /* distributed assembled matrix input (size>1) */ 99067877ebaSShri Abhyankar lu->id.nz_loc = lu->nz; 99167877ebaSShri Abhyankar lu->id.irn_loc=lu->irn; lu->id.jcn_loc=lu->jcn; 99267877ebaSShri Abhyankar if (lu->id.ICNTL(6)>1) { 99367877ebaSShri Abhyankar #if defined(PETSC_USE_COMPLEX) 99467877ebaSShri Abhyankar lu->id.a_loc = (mumps_double_complex*)lu->val; 99567877ebaSShri Abhyankar #else 99667877ebaSShri Abhyankar lu->id.a_loc = lu->val; 99767877ebaSShri Abhyankar #endif 99867877ebaSShri Abhyankar } 99967877ebaSShri Abhyankar /* MUMPS only supports centralized rhs. Create scatter scat_rhs for repeated use in MatSolve() */ 100067877ebaSShri Abhyankar if (!lu->myid){ 100167877ebaSShri Abhyankar ierr = VecCreateSeq(PETSC_COMM_SELF,A->cmap->N,&lu->b_seq);CHKERRQ(ierr); 100267877ebaSShri Abhyankar ierr = ISCreateStride(PETSC_COMM_SELF,A->cmap->N,0,1,&is_iden);CHKERRQ(ierr); 100367877ebaSShri Abhyankar } else { 100467877ebaSShri Abhyankar ierr = VecCreateSeq(PETSC_COMM_SELF,0,&lu->b_seq);CHKERRQ(ierr); 100567877ebaSShri Abhyankar ierr = ISCreateStride(PETSC_COMM_SELF,0,0,1,&is_iden);CHKERRQ(ierr); 100667877ebaSShri Abhyankar } 100767877ebaSShri Abhyankar ierr = VecCreate(((PetscObject)A)->comm,&b);CHKERRQ(ierr); 100867877ebaSShri Abhyankar ierr = VecSetSizes(b,A->rmap->n,PETSC_DECIDE);CHKERRQ(ierr); 100967877ebaSShri Abhyankar ierr = VecSetFromOptions(b);CHKERRQ(ierr); 101067877ebaSShri Abhyankar 101167877ebaSShri Abhyankar ierr = VecScatterCreate(b,is_iden,lu->b_seq,is_iden,&lu->scat_rhs);CHKERRQ(ierr); 101267877ebaSShri Abhyankar ierr = ISDestroy(is_iden);CHKERRQ(ierr); 101367877ebaSShri Abhyankar ierr = VecDestroy(b);CHKERRQ(ierr); 101467877ebaSShri Abhyankar break; 101567877ebaSShri Abhyankar } 101667877ebaSShri Abhyankar #if defined(PETSC_USE_COMPLEX) 101767877ebaSShri Abhyankar zmumps_c(&lu->id); 101867877ebaSShri Abhyankar #else 101967877ebaSShri Abhyankar dmumps_c(&lu->id); 102067877ebaSShri Abhyankar #endif 102167877ebaSShri 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)); 102267877ebaSShri Abhyankar 10232792810eSHong Zhang F->ops->choleskyfactornumeric = MatFactorNumeric_MUMPS; 1024dcd589f8SShri Abhyankar F->ops->solve = MatSolve_MUMPS; 102551d5961aSHong Zhang F->ops->solvetranspose = MatSolve_MUMPS; 1026db4efbfdSBarry Smith #if !defined(PETSC_USE_COMPLEX) 1027dcd589f8SShri Abhyankar (F)->ops->getinertia = MatGetInertia_SBAIJMUMPS; 1028db4efbfdSBarry Smith #endif 1029b24902e0SBarry Smith PetscFunctionReturn(0); 1030b24902e0SBarry Smith } 1031b24902e0SBarry Smith 1032397b6df1SKris Buschelman #undef __FUNCT__ 103364e6c443SBarry Smith #define __FUNCT__ "MatView_MUMPS" 103464e6c443SBarry Smith PetscErrorCode MatView_MUMPS(Mat A,PetscViewer viewer) 103574ed9c26SBarry Smith { 1036f6c57405SHong Zhang PetscErrorCode ierr; 103764e6c443SBarry Smith PetscBool iascii; 103864e6c443SBarry Smith PetscViewerFormat format; 103964e6c443SBarry Smith Mat_MUMPS *lu=(Mat_MUMPS*)A->spptr; 1040f6c57405SHong Zhang 1041f6c57405SHong Zhang PetscFunctionBegin; 104264e6c443SBarry Smith /* check if matrix is mumps type */ 104364e6c443SBarry Smith if (A->ops->solve != MatSolve_MUMPS) PetscFunctionReturn(0); 104464e6c443SBarry Smith 104564e6c443SBarry Smith ierr = PetscTypeCompare((PetscObject)viewer,PETSCVIEWERASCII,&iascii);CHKERRQ(ierr); 104664e6c443SBarry Smith if (iascii) { 104764e6c443SBarry Smith ierr = PetscViewerGetFormat(viewer,&format);CHKERRQ(ierr); 104864e6c443SBarry Smith if (format == PETSC_VIEWER_ASCII_INFO){ 104964e6c443SBarry Smith ierr = PetscViewerASCIIPrintf(viewer,"MUMPS run parameters:\n");CHKERRQ(ierr); 105064e6c443SBarry Smith ierr = PetscViewerASCIIPrintf(viewer," SYM (matrix type): %d \n",lu->id.sym);CHKERRQ(ierr); 105164e6c443SBarry Smith ierr = PetscViewerASCIIPrintf(viewer," PAR (host participation): %d \n",lu->id.par);CHKERRQ(ierr); 1052f6c57405SHong Zhang ierr = PetscViewerASCIIPrintf(viewer," ICNTL(1) (output for error): %d \n",lu->id.ICNTL(1));CHKERRQ(ierr); 1053f6c57405SHong Zhang ierr = PetscViewerASCIIPrintf(viewer," ICNTL(2) (output of diagnostic msg): %d \n",lu->id.ICNTL(2));CHKERRQ(ierr); 1054f6c57405SHong Zhang ierr = PetscViewerASCIIPrintf(viewer," ICNTL(3) (output for global info): %d \n",lu->id.ICNTL(3));CHKERRQ(ierr); 1055f6c57405SHong Zhang ierr = PetscViewerASCIIPrintf(viewer," ICNTL(4) (level of printing): %d \n",lu->id.ICNTL(4));CHKERRQ(ierr); 1056f6c57405SHong Zhang ierr = PetscViewerASCIIPrintf(viewer," ICNTL(5) (input mat struct): %d \n",lu->id.ICNTL(5));CHKERRQ(ierr); 1057f6c57405SHong Zhang ierr = PetscViewerASCIIPrintf(viewer," ICNTL(6) (matrix prescaling): %d \n",lu->id.ICNTL(6));CHKERRQ(ierr); 1058d06efebcSBarry Smith ierr = PetscViewerASCIIPrintf(viewer," ICNTL(7) (sequentia matrix ordering):%d \n",lu->id.ICNTL(7));CHKERRQ(ierr); 1059f6c57405SHong Zhang ierr = PetscViewerASCIIPrintf(viewer," ICNTL(8) (scalling strategy): %d \n",lu->id.ICNTL(8));CHKERRQ(ierr); 1060f6c57405SHong Zhang ierr = PetscViewerASCIIPrintf(viewer," ICNTL(10) (max num of refinements): %d \n",lu->id.ICNTL(10));CHKERRQ(ierr); 1061f6c57405SHong Zhang ierr = PetscViewerASCIIPrintf(viewer," ICNTL(11) (error analysis): %d \n",lu->id.ICNTL(11));CHKERRQ(ierr); 106234ed7027SBarry Smith if (lu->id.ICNTL(11)>0) { 106334ed7027SBarry Smith ierr = PetscViewerASCIIPrintf(viewer," RINFOG(4) (inf norm of input mat): %g\n",lu->id.RINFOG(4));CHKERRQ(ierr); 106434ed7027SBarry Smith ierr = PetscViewerASCIIPrintf(viewer," RINFOG(5) (inf norm of solution): %g\n",lu->id.RINFOG(5));CHKERRQ(ierr); 106534ed7027SBarry Smith ierr = PetscViewerASCIIPrintf(viewer," RINFOG(6) (inf norm of residual): %g\n",lu->id.RINFOG(6));CHKERRQ(ierr); 106634ed7027SBarry Smith ierr = PetscViewerASCIIPrintf(viewer," RINFOG(7),RINFOG(8) (backward error est): %g, %g\n",lu->id.RINFOG(7),lu->id.RINFOG(8));CHKERRQ(ierr); 106734ed7027SBarry Smith ierr = PetscViewerASCIIPrintf(viewer," RINFOG(9) (error estimate): %g \n",lu->id.RINFOG(9));CHKERRQ(ierr); 106834ed7027SBarry Smith ierr = PetscViewerASCIIPrintf(viewer," RINFOG(10),RINFOG(11)(condition numbers): %g, %g\n",lu->id.RINFOG(10),lu->id.RINFOG(11));CHKERRQ(ierr); 1069f6c57405SHong Zhang } 1070f6c57405SHong Zhang ierr = PetscViewerASCIIPrintf(viewer," ICNTL(12) (efficiency control): %d \n",lu->id.ICNTL(12));CHKERRQ(ierr); 1071f6c57405SHong Zhang ierr = PetscViewerASCIIPrintf(viewer," ICNTL(13) (efficiency control): %d \n",lu->id.ICNTL(13));CHKERRQ(ierr); 1072f6c57405SHong Zhang ierr = PetscViewerASCIIPrintf(viewer," ICNTL(14) (percentage of estimated workspace increase): %d \n",lu->id.ICNTL(14));CHKERRQ(ierr); 1073f6c57405SHong Zhang /* ICNTL(15-17) not used */ 1074f6c57405SHong Zhang ierr = PetscViewerASCIIPrintf(viewer," ICNTL(18) (input mat struct): %d \n",lu->id.ICNTL(18));CHKERRQ(ierr); 1075f6c57405SHong Zhang ierr = PetscViewerASCIIPrintf(viewer," ICNTL(19) (Shur complement info): %d \n",lu->id.ICNTL(19));CHKERRQ(ierr); 1076f6c57405SHong Zhang ierr = PetscViewerASCIIPrintf(viewer," ICNTL(20) (rhs sparse pattern): %d \n",lu->id.ICNTL(20));CHKERRQ(ierr); 1077f6c57405SHong Zhang ierr = PetscViewerASCIIPrintf(viewer," ICNTL(21) (solution struct): %d \n",lu->id.ICNTL(21));CHKERRQ(ierr); 1078c0165424SHong Zhang ierr = PetscViewerASCIIPrintf(viewer," ICNTL(22) (in-core/out-of-core facility): %d \n",lu->id.ICNTL(22));CHKERRQ(ierr); 1079c0165424SHong Zhang ierr = PetscViewerASCIIPrintf(viewer," ICNTL(23) (max size of memory can be allocated locally):%d \n",lu->id.ICNTL(23));CHKERRQ(ierr); 1080c0165424SHong Zhang 1081c0165424SHong Zhang ierr = PetscViewerASCIIPrintf(viewer," ICNTL(24) (detection of null pivot rows): %d \n",lu->id.ICNTL(24));CHKERRQ(ierr); 1082c0165424SHong Zhang ierr = PetscViewerASCIIPrintf(viewer," ICNTL(25) (computation of a null space basis): %d \n",lu->id.ICNTL(25));CHKERRQ(ierr); 1083c0165424SHong Zhang ierr = PetscViewerASCIIPrintf(viewer," ICNTL(26) (Schur options for rhs or solution): %d \n",lu->id.ICNTL(26));CHKERRQ(ierr); 1084c0165424SHong Zhang ierr = PetscViewerASCIIPrintf(viewer," ICNTL(27) (experimental parameter): %d \n",lu->id.ICNTL(27));CHKERRQ(ierr); 1085d06efebcSBarry Smith ierr = PetscViewerASCIIPrintf(viewer," ICNTL(28) (Use parallel or sequential ordering): %d \n",lu->id.ICNTL(28));CHKERRQ(ierr); 1086d06efebcSBarry Smith ierr = PetscViewerASCIIPrintf(viewer," ICNTL(29) (Parallel ordering): %d \n",lu->id.ICNTL(29));CHKERRQ(ierr); 1087f6c57405SHong Zhang 1088f6c57405SHong Zhang ierr = PetscViewerASCIIPrintf(viewer," CNTL(1) (relative pivoting threshold): %g \n",lu->id.CNTL(1));CHKERRQ(ierr); 1089f6c57405SHong Zhang ierr = PetscViewerASCIIPrintf(viewer," CNTL(2) (stopping criterion of refinement): %g \n",lu->id.CNTL(2));CHKERRQ(ierr); 1090f6c57405SHong Zhang ierr = PetscViewerASCIIPrintf(viewer," CNTL(3) (absolute pivoting threshold): %g \n",lu->id.CNTL(3));CHKERRQ(ierr); 1091f6c57405SHong Zhang ierr = PetscViewerASCIIPrintf(viewer," CNTL(4) (value of static pivoting): %g \n",lu->id.CNTL(4));CHKERRQ(ierr); 1092c0165424SHong Zhang ierr = PetscViewerASCIIPrintf(viewer," CNTL(5) (fixation for null pivots): %g \n",lu->id.CNTL(5));CHKERRQ(ierr); 1093f6c57405SHong Zhang 1094f6c57405SHong Zhang /* infomation local to each processor */ 109534ed7027SBarry Smith ierr = PetscViewerASCIIPrintf(viewer, " RINFO(1) (local estimated flops for the elimination after analysis): \n");CHKERRQ(ierr); 109634ed7027SBarry Smith ierr = PetscViewerASCIISynchronizedPrintf(viewer," [%d] %g \n",lu->myid,lu->id.RINFO(1));CHKERRQ(ierr); 109734ed7027SBarry Smith ierr = PetscViewerFlush(viewer); 109834ed7027SBarry Smith ierr = PetscViewerASCIIPrintf(viewer, " RINFO(2) (local estimated flops for the assembly after factorization): \n");CHKERRQ(ierr); 109934ed7027SBarry Smith ierr = PetscViewerASCIISynchronizedPrintf(viewer," [%d] %g \n",lu->myid,lu->id.RINFO(2));CHKERRQ(ierr); 110034ed7027SBarry Smith ierr = PetscViewerFlush(viewer); 110134ed7027SBarry Smith ierr = PetscViewerASCIIPrintf(viewer, " RINFO(3) (local estimated flops for the elimination after factorization): \n");CHKERRQ(ierr); 110234ed7027SBarry Smith ierr = PetscViewerASCIISynchronizedPrintf(viewer," [%d] %g \n",lu->myid,lu->id.RINFO(3));CHKERRQ(ierr); 110334ed7027SBarry Smith ierr = PetscViewerFlush(viewer); 1104f6c57405SHong Zhang 110534ed7027SBarry Smith ierr = PetscViewerASCIIPrintf(viewer, " INFO(15) (estimated size of (in MB) MUMPS internal data for running numerical factorization): \n");CHKERRQ(ierr); 110634ed7027SBarry Smith ierr = PetscViewerASCIISynchronizedPrintf(viewer," [%d] %d \n",lu->myid,lu->id.INFO(15));CHKERRQ(ierr); 110734ed7027SBarry Smith ierr = PetscViewerFlush(viewer); 1108f6c57405SHong Zhang 110934ed7027SBarry Smith ierr = PetscViewerASCIIPrintf(viewer, " INFO(16) (size of (in MB) MUMPS internal data used during numerical factorization): \n");CHKERRQ(ierr); 111034ed7027SBarry Smith ierr = PetscViewerASCIISynchronizedPrintf(viewer," [%d] %d \n",lu->myid,lu->id.INFO(16));CHKERRQ(ierr); 111134ed7027SBarry Smith ierr = PetscViewerFlush(viewer); 1112f6c57405SHong Zhang 111334ed7027SBarry Smith ierr = PetscViewerASCIIPrintf(viewer, " INFO(23) (num of pivots eliminated on this processor after factorization): \n");CHKERRQ(ierr); 111434ed7027SBarry Smith ierr = PetscViewerASCIISynchronizedPrintf(viewer," [%d] %d \n",lu->myid,lu->id.INFO(23));CHKERRQ(ierr); 111534ed7027SBarry Smith ierr = PetscViewerFlush(viewer); 1116f6c57405SHong Zhang 1117f6c57405SHong Zhang if (!lu->myid){ /* information from the host */ 1118f6c57405SHong Zhang ierr = PetscViewerASCIIPrintf(viewer," RINFOG(1) (global estimated flops for the elimination after analysis): %g \n",lu->id.RINFOG(1));CHKERRQ(ierr); 1119f6c57405SHong Zhang ierr = PetscViewerASCIIPrintf(viewer," RINFOG(2) (global estimated flops for the assembly after factorization): %g \n",lu->id.RINFOG(2));CHKERRQ(ierr); 1120f6c57405SHong Zhang ierr = PetscViewerASCIIPrintf(viewer," RINFOG(3) (global estimated flops for the elimination after factorization): %g \n",lu->id.RINFOG(3));CHKERRQ(ierr); 1121f6c57405SHong Zhang 1122f6c57405SHong Zhang ierr = PetscViewerASCIIPrintf(viewer," INFOG(3) (estimated real workspace for factors on all processors after analysis): %d \n",lu->id.INFOG(3));CHKERRQ(ierr); 1123f6c57405SHong Zhang ierr = PetscViewerASCIIPrintf(viewer," INFOG(4) (estimated integer workspace for factors on all processors after analysis): %d \n",lu->id.INFOG(4));CHKERRQ(ierr); 1124f6c57405SHong Zhang ierr = PetscViewerASCIIPrintf(viewer," INFOG(5) (estimated maximum front size in the complete tree): %d \n",lu->id.INFOG(5));CHKERRQ(ierr); 1125f6c57405SHong Zhang ierr = PetscViewerASCIIPrintf(viewer," INFOG(6) (number of nodes in the complete tree): %d \n",lu->id.INFOG(6));CHKERRQ(ierr); 1126f6c57405SHong Zhang ierr = PetscViewerASCIIPrintf(viewer," INFOG(7) (ordering option effectively uese after analysis): %d \n",lu->id.INFOG(7));CHKERRQ(ierr); 1127f6c57405SHong Zhang ierr = PetscViewerASCIIPrintf(viewer," INFOG(8) (structural symmetry in percent of the permuted matrix after analysis): %d \n",lu->id.INFOG(8));CHKERRQ(ierr); 1128f6c57405SHong 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); 1129f6c57405SHong Zhang ierr = PetscViewerASCIIPrintf(viewer," INFOG(10) (total integer space store the matrix factors after factorization): %d \n",lu->id.INFOG(10));CHKERRQ(ierr); 1130f6c57405SHong Zhang ierr = PetscViewerASCIIPrintf(viewer," INFOG(11) (order of largest frontal matrix after factorization): %d \n",lu->id.INFOG(11));CHKERRQ(ierr); 1131f6c57405SHong Zhang ierr = PetscViewerASCIIPrintf(viewer," INFOG(12) (number of off-diagonal pivots): %d \n",lu->id.INFOG(12));CHKERRQ(ierr); 1132f6c57405SHong Zhang ierr = PetscViewerASCIIPrintf(viewer," INFOG(13) (number of delayed pivots after factorization): %d \n",lu->id.INFOG(13));CHKERRQ(ierr); 1133f6c57405SHong Zhang ierr = PetscViewerASCIIPrintf(viewer," INFOG(14) (number of memory compress after factorization): %d \n",lu->id.INFOG(14));CHKERRQ(ierr); 1134f6c57405SHong Zhang ierr = PetscViewerASCIIPrintf(viewer," INFOG(15) (number of steps of iterative refinement after solution): %d \n",lu->id.INFOG(15));CHKERRQ(ierr); 1135f6c57405SHong 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); 1136f6c57405SHong 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); 1137f6c57405SHong 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); 1138f6c57405SHong 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); 1139f6c57405SHong Zhang ierr = PetscViewerASCIIPrintf(viewer," INFOG(20) (estimated number of entries in the factors): %d \n",lu->id.INFOG(20));CHKERRQ(ierr); 1140f6c57405SHong 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); 1141f6c57405SHong 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); 1142f6c57405SHong Zhang ierr = PetscViewerASCIIPrintf(viewer," INFOG(23) (after analysis: value of ICNTL(6) effectively used): %d \n",lu->id.INFOG(23));CHKERRQ(ierr); 1143f6c57405SHong Zhang ierr = PetscViewerASCIIPrintf(viewer," INFOG(24) (after analysis: value of ICNTL(12) effectively used): %d \n",lu->id.INFOG(24));CHKERRQ(ierr); 1144f6c57405SHong Zhang ierr = PetscViewerASCIIPrintf(viewer," INFOG(25) (after factorization: number of pivots modified by static pivoting): %d \n",lu->id.INFOG(25));CHKERRQ(ierr); 1145f6c57405SHong Zhang } 1146f6c57405SHong Zhang } 1147cb828f0fSHong Zhang } 1148f6c57405SHong Zhang PetscFunctionReturn(0); 1149f6c57405SHong Zhang } 1150f6c57405SHong Zhang 115135bd34faSBarry Smith #undef __FUNCT__ 115235bd34faSBarry Smith #define __FUNCT__ "MatGetInfo_MUMPS" 115335bd34faSBarry Smith PetscErrorCode MatGetInfo_MUMPS(Mat A,MatInfoType flag,MatInfo *info) 115435bd34faSBarry Smith { 1155cb828f0fSHong Zhang Mat_MUMPS *mumps =(Mat_MUMPS*)A->spptr; 115635bd34faSBarry Smith 115735bd34faSBarry Smith PetscFunctionBegin; 115835bd34faSBarry Smith info->block_size = 1.0; 1159cb828f0fSHong Zhang info->nz_allocated = mumps->id.INFOG(20); 1160cb828f0fSHong Zhang info->nz_used = mumps->id.INFOG(20); 116135bd34faSBarry Smith info->nz_unneeded = 0.0; 116235bd34faSBarry Smith info->assemblies = 0.0; 116335bd34faSBarry Smith info->mallocs = 0.0; 116435bd34faSBarry Smith info->memory = 0.0; 116535bd34faSBarry Smith info->fill_ratio_given = 0; 116635bd34faSBarry Smith info->fill_ratio_needed = 0; 116735bd34faSBarry Smith info->factor_mallocs = 0; 116835bd34faSBarry Smith PetscFunctionReturn(0); 116935bd34faSBarry Smith } 117035bd34faSBarry Smith 11715ccb76cbSHong Zhang /* -------------------------------------------------------------------------------------------*/ 11725ccb76cbSHong Zhang #undef __FUNCT__ 11735ccb76cbSHong Zhang #define __FUNCT__ "MatMumpsSetIcntl_MUMPS" 11745ccb76cbSHong Zhang PetscErrorCode MatMumpsSetIcntl_MUMPS(Mat F,PetscInt icntl,PetscInt ival) 11755ccb76cbSHong Zhang { 11765ccb76cbSHong Zhang Mat_MUMPS *lu =(Mat_MUMPS*)F->spptr; 11775ccb76cbSHong Zhang 11785ccb76cbSHong Zhang PetscFunctionBegin; 11795ccb76cbSHong Zhang lu->id.ICNTL(icntl) = ival; 11805ccb76cbSHong Zhang PetscFunctionReturn(0); 11815ccb76cbSHong Zhang } 11825ccb76cbSHong Zhang 11835ccb76cbSHong Zhang #undef __FUNCT__ 11845ccb76cbSHong Zhang #define __FUNCT__ "MatMumpsSetIcntl" 11855ccb76cbSHong Zhang /*@ 11865ccb76cbSHong Zhang MatMumpsSetIcntl - Set MUMPS parameter ICNTL() 11875ccb76cbSHong Zhang 11885ccb76cbSHong Zhang Logically Collective on Mat 11895ccb76cbSHong Zhang 11905ccb76cbSHong Zhang Input Parameters: 11915ccb76cbSHong Zhang + F - the factored matrix obtained by calling MatGetFactor() from PETSc-MUMPS interface 11925ccb76cbSHong Zhang . icntl - index of MUMPS parameter array ICNTL() 11935ccb76cbSHong Zhang - ival - value of MUMPS ICNTL(icntl) 11945ccb76cbSHong Zhang 11955ccb76cbSHong Zhang Options Database: 11965ccb76cbSHong Zhang . -mat_mumps_icntl_<icntl> <ival> 11975ccb76cbSHong Zhang 11985ccb76cbSHong Zhang Level: beginner 11995ccb76cbSHong Zhang 12005ccb76cbSHong Zhang References: MUMPS Users' Guide 12015ccb76cbSHong Zhang 12025ccb76cbSHong Zhang .seealso: MatGetFactor() 12035ccb76cbSHong Zhang @*/ 12045ccb76cbSHong Zhang PetscErrorCode MatMumpsSetIcntl(Mat F,PetscInt icntl,PetscInt ival) 12055ccb76cbSHong Zhang { 12065ccb76cbSHong Zhang PetscErrorCode ierr; 12075ccb76cbSHong Zhang 12085ccb76cbSHong Zhang PetscFunctionBegin; 12095ccb76cbSHong Zhang PetscValidLogicalCollectiveInt(F,icntl,2); 12105ccb76cbSHong Zhang PetscValidLogicalCollectiveInt(F,ival,3); 12115ccb76cbSHong Zhang ierr = PetscTryMethod(F,"MatMumpsSetIcntl_C",(Mat,PetscInt,PetscInt),(F,icntl,ival));CHKERRQ(ierr); 12125ccb76cbSHong Zhang PetscFunctionReturn(0); 12135ccb76cbSHong Zhang } 12145ccb76cbSHong Zhang 121524b6179bSKris Buschelman /*MC 12162692d6eeSBarry Smith MATSOLVERMUMPS - A matrix type providing direct solvers (LU and Cholesky) for 121724b6179bSKris Buschelman distributed and sequential matrices via the external package MUMPS. 121824b6179bSKris Buschelman 121941c8de11SBarry Smith Works with MATAIJ and MATSBAIJ matrices 122024b6179bSKris Buschelman 122124b6179bSKris Buschelman Options Database Keys: 1222fb8376fbSHong Zhang + -mat_mumps_icntl_4 <0,...,4> - print level 122324b6179bSKris Buschelman . -mat_mumps_icntl_6 <0,...,7> - matrix prescaling options (see MUMPS User's Guide) 122464e6c443SBarry Smith . -mat_mumps_icntl_7 <0,...,7> - matrix orderings (see MUMPS User's Guidec) 122524b6179bSKris Buschelman . -mat_mumps_icntl_9 <1,2> - A or A^T x=b to be solved: 1 denotes A, 2 denotes A^T 122624b6179bSKris Buschelman . -mat_mumps_icntl_10 <n> - maximum number of iterative refinements 122794b7f48cSBarry Smith . -mat_mumps_icntl_11 <n> - error analysis, a positive value returns statistics during -ksp_view 122824b6179bSKris Buschelman . -mat_mumps_icntl_12 <n> - efficiency control (see MUMPS User's Guide) 122924b6179bSKris Buschelman . -mat_mumps_icntl_13 <n> - efficiency control (see MUMPS User's Guide) 123024b6179bSKris Buschelman . -mat_mumps_icntl_14 <n> - efficiency control (see MUMPS User's Guide) 123124b6179bSKris Buschelman . -mat_mumps_icntl_15 <n> - efficiency control (see MUMPS User's Guide) 123224b6179bSKris Buschelman . -mat_mumps_cntl_1 <delta> - relative pivoting threshold 123324b6179bSKris Buschelman . -mat_mumps_cntl_2 <tol> - stopping criterion for refinement 123424b6179bSKris Buschelman - -mat_mumps_cntl_3 <adelta> - absolute pivoting threshold 123524b6179bSKris Buschelman 123624b6179bSKris Buschelman Level: beginner 123724b6179bSKris Buschelman 123841c8de11SBarry Smith .seealso: PCFactorSetMatSolverPackage(), MatSolverPackage 123941c8de11SBarry Smith 124024b6179bSKris Buschelman M*/ 124124b6179bSKris Buschelman 12422877fffaSHong Zhang EXTERN_C_BEGIN 124335bd34faSBarry Smith #undef __FUNCT__ 124435bd34faSBarry Smith #define __FUNCT__ "MatFactorGetSolverPackage_mumps" 124535bd34faSBarry Smith PetscErrorCode MatFactorGetSolverPackage_mumps(Mat A,const MatSolverPackage *type) 124635bd34faSBarry Smith { 124735bd34faSBarry Smith PetscFunctionBegin; 12482692d6eeSBarry Smith *type = MATSOLVERMUMPS; 124935bd34faSBarry Smith PetscFunctionReturn(0); 125035bd34faSBarry Smith } 125135bd34faSBarry Smith EXTERN_C_END 125235bd34faSBarry Smith 125335bd34faSBarry Smith EXTERN_C_BEGIN 1254bccb9932SShri Abhyankar /* MatGetFactor for Seq and MPI AIJ matrices */ 12552877fffaSHong Zhang #undef __FUNCT__ 1256bccb9932SShri Abhyankar #define __FUNCT__ "MatGetFactor_aij_mumps" 1257bccb9932SShri Abhyankar PetscErrorCode MatGetFactor_aij_mumps(Mat A,MatFactorType ftype,Mat *F) 12582877fffaSHong Zhang { 12592877fffaSHong Zhang Mat B; 12602877fffaSHong Zhang PetscErrorCode ierr; 12612877fffaSHong Zhang Mat_MUMPS *mumps; 1262ace3abfcSBarry Smith PetscBool isSeqAIJ; 12632877fffaSHong Zhang 12642877fffaSHong Zhang PetscFunctionBegin; 12652877fffaSHong Zhang /* Create the factorization matrix */ 1266bccb9932SShri Abhyankar ierr = PetscTypeCompare((PetscObject)A,MATSEQAIJ,&isSeqAIJ);CHKERRQ(ierr); 12672877fffaSHong Zhang ierr = MatCreate(((PetscObject)A)->comm,&B);CHKERRQ(ierr); 12682877fffaSHong Zhang ierr = MatSetSizes(B,A->rmap->n,A->cmap->n,A->rmap->N,A->cmap->N);CHKERRQ(ierr); 12692877fffaSHong Zhang ierr = MatSetType(B,((PetscObject)A)->type_name);CHKERRQ(ierr); 1270bccb9932SShri Abhyankar if (isSeqAIJ) { 12712877fffaSHong Zhang ierr = MatSeqAIJSetPreallocation(B,0,PETSC_NULL);CHKERRQ(ierr); 1272bccb9932SShri Abhyankar } else { 1273bccb9932SShri Abhyankar ierr = MatMPIAIJSetPreallocation(B,0,PETSC_NULL,0,PETSC_NULL);CHKERRQ(ierr); 1274bccb9932SShri Abhyankar } 12752877fffaSHong Zhang 127616ebf90aSShri Abhyankar ierr = PetscNewLog(B,Mat_MUMPS,&mumps);CHKERRQ(ierr); 12772877fffaSHong Zhang B->ops->view = MatView_MUMPS; 127835bd34faSBarry Smith B->ops->getinfo = MatGetInfo_MUMPS; 127935bd34faSBarry Smith ierr = PetscObjectComposeFunctionDynamic((PetscObject)B,"MatFactorGetSolverPackage_C","MatFactorGetSolverPackage_mumps",MatFactorGetSolverPackage_mumps);CHKERRQ(ierr); 12805ccb76cbSHong Zhang ierr = PetscObjectComposeFunctionDynamic((PetscObject)B,"MatMumpsSetIcntl_C","MatMumpsSetIcntl_MUMPS",MatMumpsSetIcntl_MUMPS);CHKERRQ(ierr); 1281450b117fSShri Abhyankar if (ftype == MAT_FACTOR_LU) { 1282450b117fSShri Abhyankar B->ops->lufactorsymbolic = MatLUFactorSymbolic_AIJMUMPS; 1283d5f3da31SBarry Smith B->factortype = MAT_FACTOR_LU; 1284bccb9932SShri Abhyankar if (isSeqAIJ) mumps->ConvertToTriples = MatConvertToTriples_seqaij_seqaij; 1285bccb9932SShri Abhyankar else mumps->ConvertToTriples = MatConvertToTriples_mpiaij_mpiaij; 1286746480a1SHong Zhang mumps->sym = 0; 1287dcd589f8SShri Abhyankar } else { 128867877ebaSShri Abhyankar B->ops->choleskyfactorsymbolic = MatCholeskyFactorSymbolic_MUMPS; 1289450b117fSShri Abhyankar B->factortype = MAT_FACTOR_CHOLESKY; 1290bccb9932SShri Abhyankar if (isSeqAIJ) mumps->ConvertToTriples = MatConvertToTriples_seqaij_seqsbaij; 1291bccb9932SShri Abhyankar else mumps->ConvertToTriples = MatConvertToTriples_mpiaij_mpisbaij; 12926fdc2a6dSBarry Smith if (A->spd_set && A->spd) mumps->sym = 1; 12936fdc2a6dSBarry Smith else mumps->sym = 2; 1294450b117fSShri Abhyankar } 12952877fffaSHong Zhang 12962877fffaSHong Zhang mumps->isAIJ = PETSC_TRUE; 12972877fffaSHong Zhang mumps->MatDestroy = B->ops->destroy; 12982877fffaSHong Zhang B->ops->destroy = MatDestroy_MUMPS; 12992877fffaSHong Zhang B->spptr = (void*)mumps; 1300f697e70eSHong Zhang ierr = PetscInitializeMUMPS(A,mumps);CHKERRQ(ierr); 1301746480a1SHong Zhang 13022877fffaSHong Zhang *F = B; 13032877fffaSHong Zhang PetscFunctionReturn(0); 13042877fffaSHong Zhang } 13052877fffaSHong Zhang EXTERN_C_END 13062877fffaSHong Zhang 1307bccb9932SShri Abhyankar 13082877fffaSHong Zhang EXTERN_C_BEGIN 1309bccb9932SShri Abhyankar /* MatGetFactor for Seq and MPI SBAIJ matrices */ 13102877fffaSHong Zhang #undef __FUNCT__ 1311bccb9932SShri Abhyankar #define __FUNCT__ "MatGetFactor_sbaij_mumps" 1312bccb9932SShri Abhyankar PetscErrorCode MatGetFactor_sbaij_mumps(Mat A,MatFactorType ftype,Mat *F) 13132877fffaSHong Zhang { 13142877fffaSHong Zhang Mat B; 13152877fffaSHong Zhang PetscErrorCode ierr; 13162877fffaSHong Zhang Mat_MUMPS *mumps; 1317ace3abfcSBarry Smith PetscBool isSeqSBAIJ; 13182877fffaSHong Zhang 13192877fffaSHong Zhang PetscFunctionBegin; 1320e7e72b3dSBarry Smith if (ftype != MAT_FACTOR_CHOLESKY) SETERRQ(((PetscObject)A)->comm,PETSC_ERR_SUP,"Cannot use PETSc SBAIJ matrices with MUMPS LU, use AIJ matrix"); 1321bccb9932SShri 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"); 1322bccb9932SShri Abhyankar ierr = PetscTypeCompare((PetscObject)A,MATSEQSBAIJ,&isSeqSBAIJ);CHKERRQ(ierr); 13232877fffaSHong Zhang /* Create the factorization matrix */ 13242877fffaSHong Zhang ierr = MatCreate(((PetscObject)A)->comm,&B);CHKERRQ(ierr); 13252877fffaSHong Zhang ierr = MatSetSizes(B,A->rmap->n,A->cmap->n,A->rmap->N,A->cmap->N);CHKERRQ(ierr); 13262877fffaSHong Zhang ierr = MatSetType(B,((PetscObject)A)->type_name);CHKERRQ(ierr); 132716ebf90aSShri Abhyankar ierr = PetscNewLog(B,Mat_MUMPS,&mumps);CHKERRQ(ierr); 1328bccb9932SShri Abhyankar if (isSeqSBAIJ) { 1329bccb9932SShri Abhyankar ierr = MatSeqSBAIJSetPreallocation(B,1,0,PETSC_NULL);CHKERRQ(ierr); 133016ebf90aSShri Abhyankar mumps->ConvertToTriples = MatConvertToTriples_seqsbaij_seqsbaij; 1331dcd589f8SShri Abhyankar } else { 1332bccb9932SShri Abhyankar ierr = MatMPISBAIJSetPreallocation(B,1,0,PETSC_NULL,0,PETSC_NULL);CHKERRQ(ierr); 1333bccb9932SShri Abhyankar mumps->ConvertToTriples = MatConvertToTriples_mpisbaij_mpisbaij; 1334bccb9932SShri Abhyankar } 1335bccb9932SShri Abhyankar 133667877ebaSShri Abhyankar B->ops->choleskyfactorsymbolic = MatCholeskyFactorSymbolic_MUMPS; 1337bccb9932SShri Abhyankar B->ops->view = MatView_MUMPS; 1338bccb9932SShri Abhyankar ierr = PetscObjectComposeFunctionDynamic((PetscObject)B,"MatFactorGetSolverPackage_C","MatFactorGetSolverPackage_mumps",MatFactorGetSolverPackage_mumps);CHKERRQ(ierr); 1339f250808bSBarry Smith ierr = PetscObjectComposeFunctionDynamic((PetscObject)B,"MatMumpsSetIcntl_C","MatMumpsSetIcntl",MatMumpsSetIcntl);CHKERRQ(ierr); 1340f4762488SHong Zhang B->factortype = MAT_FACTOR_CHOLESKY; 13416fdc2a6dSBarry Smith if (A->spd_set && A->spd) mumps->sym = 1; 13426fdc2a6dSBarry Smith else mumps->sym = 2; 1343a214ac2aSShri Abhyankar 1344bccb9932SShri Abhyankar mumps->isAIJ = PETSC_FALSE; 1345f3c0ef26SHong Zhang mumps->MatDestroy = B->ops->destroy; 1346f3c0ef26SHong Zhang B->ops->destroy = MatDestroy_MUMPS; 13472877fffaSHong Zhang B->spptr = (void*)mumps; 1348f697e70eSHong Zhang ierr = PetscInitializeMUMPS(A,mumps);CHKERRQ(ierr); 1349746480a1SHong Zhang 13502877fffaSHong Zhang *F = B; 13512877fffaSHong Zhang PetscFunctionReturn(0); 13522877fffaSHong Zhang } 13532877fffaSHong Zhang EXTERN_C_END 135497969023SHong Zhang 1355450b117fSShri Abhyankar EXTERN_C_BEGIN 1356450b117fSShri Abhyankar #undef __FUNCT__ 1357bccb9932SShri Abhyankar #define __FUNCT__ "MatGetFactor_baij_mumps" 1358bccb9932SShri Abhyankar PetscErrorCode MatGetFactor_baij_mumps(Mat A,MatFactorType ftype,Mat *F) 135967877ebaSShri Abhyankar { 136067877ebaSShri Abhyankar Mat B; 136167877ebaSShri Abhyankar PetscErrorCode ierr; 136267877ebaSShri Abhyankar Mat_MUMPS *mumps; 1363ace3abfcSBarry Smith PetscBool isSeqBAIJ; 136467877ebaSShri Abhyankar 136567877ebaSShri Abhyankar PetscFunctionBegin; 136667877ebaSShri Abhyankar /* Create the factorization matrix */ 1367bccb9932SShri Abhyankar ierr = PetscTypeCompare((PetscObject)A,MATSEQBAIJ,&isSeqBAIJ);CHKERRQ(ierr); 136867877ebaSShri Abhyankar ierr = MatCreate(((PetscObject)A)->comm,&B);CHKERRQ(ierr); 136967877ebaSShri Abhyankar ierr = MatSetSizes(B,A->rmap->n,A->cmap->n,A->rmap->N,A->cmap->N);CHKERRQ(ierr); 137067877ebaSShri Abhyankar ierr = MatSetType(B,((PetscObject)A)->type_name);CHKERRQ(ierr); 1371bccb9932SShri Abhyankar if (isSeqBAIJ) { 137267877ebaSShri Abhyankar ierr = MatSeqBAIJSetPreallocation(B,A->rmap->bs,0,PETSC_NULL);CHKERRQ(ierr); 1373bccb9932SShri Abhyankar } else { 137467877ebaSShri Abhyankar ierr = MatMPIBAIJSetPreallocation(B,A->rmap->bs,0,PETSC_NULL,0,PETSC_NULL);CHKERRQ(ierr); 1375bccb9932SShri Abhyankar } 1376450b117fSShri Abhyankar 137767877ebaSShri Abhyankar ierr = PetscNewLog(B,Mat_MUMPS,&mumps);CHKERRQ(ierr); 1378450b117fSShri Abhyankar if (ftype == MAT_FACTOR_LU) { 1379450b117fSShri Abhyankar B->ops->lufactorsymbolic = MatLUFactorSymbolic_BAIJMUMPS; 1380450b117fSShri Abhyankar B->factortype = MAT_FACTOR_LU; 1381bccb9932SShri Abhyankar if (isSeqBAIJ) mumps->ConvertToTriples = MatConvertToTriples_seqbaij_seqaij; 1382bccb9932SShri Abhyankar else mumps->ConvertToTriples = MatConvertToTriples_mpibaij_mpiaij; 1383746480a1SHong Zhang mumps->sym = 0; 1384746480a1SHong Zhang } else { 1385746480a1SHong Zhang SETERRQ(PETSC_COMM_SELF,PETSC_ERR_SUP,"Cannot use PETSc BAIJ matrices with MUMPS Cholesky, use SBAIJ or AIJ matrix instead\n"); 1386450b117fSShri Abhyankar } 1387bccb9932SShri Abhyankar 1388450b117fSShri Abhyankar B->ops->view = MatView_MUMPS; 1389450b117fSShri Abhyankar ierr = PetscObjectComposeFunctionDynamic((PetscObject)B,"MatFactorGetSolverPackage_C","MatFactorGetSolverPackage_mumps",MatFactorGetSolverPackage_mumps);CHKERRQ(ierr); 13905ccb76cbSHong Zhang ierr = PetscObjectComposeFunctionDynamic((PetscObject)B,"MatMumpsSetIcntl_C","MatMumpsSetIcntl_MUMPS",MatMumpsSetIcntl_MUMPS);CHKERRQ(ierr); 1391450b117fSShri Abhyankar 1392450b117fSShri Abhyankar mumps->isAIJ = PETSC_TRUE; 1393450b117fSShri Abhyankar mumps->MatDestroy = B->ops->destroy; 1394450b117fSShri Abhyankar B->ops->destroy = MatDestroy_MUMPS; 1395450b117fSShri Abhyankar B->spptr = (void*)mumps; 1396f697e70eSHong Zhang ierr = PetscInitializeMUMPS(A,mumps);CHKERRQ(ierr); 1397746480a1SHong Zhang 1398450b117fSShri Abhyankar *F = B; 1399450b117fSShri Abhyankar PetscFunctionReturn(0); 1400450b117fSShri Abhyankar } 1401450b117fSShri Abhyankar EXTERN_C_END 1402a214ac2aSShri Abhyankar 1403