1be1d678aSKris Buschelman #define PETSCMAT_DLL 21c2a3de1SBarry Smith 3397b6df1SKris Buschelman /* 4c2b5dc30SHong Zhang Provides an interface to the MUMPS sparse solver 5397b6df1SKris Buschelman */ 64e1dd20eSHong Zhang #include "../src/mat/impls/aij/seq/aij.h" /*I "petscmat.h" I*/ 77c4f633dSBarry Smith #include "../src/mat/impls/aij/mpi/mpiaij.h" 87c4f633dSBarry Smith #include "../src/mat/impls/sbaij/seq/sbaij.h" 97c4f633dSBarry Smith #include "../src/mat/impls/sbaij/mpi/mpisbaij.h" 10450b117fSShri Abhyankar #include "../src/mat/impls/baij/seq/baij.h" 11450b117fSShri Abhyankar #include "../src/mat/impls/baij/mpi/mpibaij.h" 12397b6df1SKris Buschelman 13397b6df1SKris Buschelman EXTERN_C_BEGIN 14397b6df1SKris Buschelman #if defined(PETSC_USE_COMPLEX) 15397b6df1SKris Buschelman #include "zmumps_c.h" 16397b6df1SKris Buschelman #else 17397b6df1SKris Buschelman #include "dmumps_c.h" 18397b6df1SKris Buschelman #endif 19397b6df1SKris Buschelman EXTERN_C_END 20397b6df1SKris Buschelman #define JOB_INIT -1 21397b6df1SKris Buschelman #define JOB_END -2 22397b6df1SKris Buschelman /* macros s.t. indices match MUMPS documentation */ 23397b6df1SKris Buschelman #define ICNTL(I) icntl[(I)-1] 24397b6df1SKris Buschelman #define CNTL(I) cntl[(I)-1] 25397b6df1SKris Buschelman #define INFOG(I) infog[(I)-1] 26a7aca84bSHong Zhang #define INFO(I) info[(I)-1] 27397b6df1SKris Buschelman #define RINFOG(I) rinfog[(I)-1] 28adc1d99fSHong Zhang #define RINFO(I) rinfo[(I)-1] 29397b6df1SKris Buschelman 30397b6df1SKris Buschelman typedef struct { 31397b6df1SKris Buschelman #if defined(PETSC_USE_COMPLEX) 32397b6df1SKris Buschelman ZMUMPS_STRUC_C id; 33397b6df1SKris Buschelman #else 34397b6df1SKris Buschelman DMUMPS_STRUC_C id; 35397b6df1SKris Buschelman #endif 36397b6df1SKris Buschelman MatStructure matstruc; 37c1490034SHong Zhang PetscMPIInt myid,size; 3816ebf90aSShri Abhyankar PetscInt *irn,*jcn,nz,sym,nSolve; 39397b6df1SKris Buschelman PetscScalar *val; 40397b6df1SKris Buschelman MPI_Comm comm_mumps; 41329ec9b3SHong Zhang VecScatter scat_rhs, scat_sol; 42cb828f0fSHong Zhang PetscTruth isAIJ,CleanUpMUMPS,mumpsview; 43329ec9b3SHong Zhang Vec b_seq,x_seq; 4467334b25SHong Zhang PetscErrorCode (*MatDestroy)(Mat); 4516ebf90aSShri Abhyankar PetscErrorCode (*ConvertToTriples)(Mat, int, PetscTruth, int*, int**, int**, PetscScalar**); 46f0c56d0fSKris Buschelman } Mat_MUMPS; 47f0c56d0fSKris Buschelman 48dfbe8321SBarry Smith EXTERN PetscErrorCode MatDuplicate_MUMPS(Mat,MatDuplicateOption,Mat*); 49b24902e0SBarry Smith 50*67877ebaSShri Abhyankar 51*67877ebaSShri Abhyankar /* MatConvertToTriples_A_B */ 52*67877ebaSShri Abhyankar /*convert Petsc matrix to triples: row[nz], col[nz], val[nz] */ 53397b6df1SKris Buschelman /* 54397b6df1SKris Buschelman input: 55*67877ebaSShri Abhyankar A - matrix in aij,baij or sbaij (bs=1) format 56397b6df1SKris Buschelman shift - 0: C style output triple; 1: Fortran style output triple. 57397b6df1SKris Buschelman valOnly - FALSE: spaces are allocated and values are set for the triple 58397b6df1SKris Buschelman TRUE: only the values in v array are updated 59397b6df1SKris Buschelman output: 60397b6df1SKris Buschelman nnz - dim of r, c, and v (number of local nonzero entries of A) 61397b6df1SKris Buschelman r, c, v - row and col index, matrix values (matrix triples) 62397b6df1SKris Buschelman */ 6316ebf90aSShri Abhyankar 6416ebf90aSShri Abhyankar #undef __FUNCT__ 6516ebf90aSShri Abhyankar #define __FUNCT__ "MatConvertToTriples_seqaij_seqaij" 6616ebf90aSShri Abhyankar PetscErrorCode MatConvertToTriples_seqaij_seqaij(Mat A,int shift,PetscTruth valOnly,int *nnz,int **r, int **c, PetscScalar **v) 67b24902e0SBarry Smith { 68*67877ebaSShri Abhyankar const PetscInt *ai,*aj,*ajj,M=A->rmap->n;; 69*67877ebaSShri Abhyankar PetscInt nz,rnz,i,j; 70dfbe8321SBarry Smith PetscErrorCode ierr; 71c1490034SHong Zhang PetscInt *row,*col; 7216ebf90aSShri Abhyankar Mat_SeqAIJ *aa=(Mat_SeqAIJ*)A->data; 73397b6df1SKris Buschelman 74397b6df1SKris Buschelman PetscFunctionBegin; 7516ebf90aSShri Abhyankar *v=aa->a; 7616ebf90aSShri Abhyankar if (!valOnly){ 7716ebf90aSShri Abhyankar nz = aa->nz; ai = aa->i; aj = aa->j; 7816ebf90aSShri Abhyankar *nnz = nz; 7916ebf90aSShri Abhyankar ierr = PetscMalloc(nz*sizeof(PetscInt), &row);CHKERRQ(ierr); 8016ebf90aSShri Abhyankar ierr = PetscMalloc(nz*sizeof(PetscInt), &col);CHKERRQ(ierr); 8116ebf90aSShri Abhyankar nz = 0; 8216ebf90aSShri Abhyankar for(i=0; i<M; i++) { 8316ebf90aSShri Abhyankar rnz = ai[i+1] - ai[i]; 84*67877ebaSShri Abhyankar ajj = aj + ai[i]; 85*67877ebaSShri Abhyankar for(j=0; j<rnz; j++) { 86*67877ebaSShri Abhyankar row[nz] = i+shift; col[nz++] = ajj[j] + shift; 8716ebf90aSShri Abhyankar } 8816ebf90aSShri Abhyankar } 8916ebf90aSShri Abhyankar *r = row; *c = col; 9016ebf90aSShri Abhyankar } 9116ebf90aSShri Abhyankar PetscFunctionReturn(0); 9216ebf90aSShri Abhyankar } 93397b6df1SKris Buschelman 9416ebf90aSShri Abhyankar #undef __FUNCT__ 95*67877ebaSShri Abhyankar #define __FUNCT__ "MatConvertToTriples_seqbaij_seqaij" 96*67877ebaSShri Abhyankar PetscErrorCode MatConvertToTriples_seqbaij_seqaij(Mat A,int shift,PetscTruth valOnly,int *nnz,int **r, int **c, PetscScalar **v) 97*67877ebaSShri Abhyankar { 98*67877ebaSShri Abhyankar Mat_SeqBAIJ *aa=(Mat_SeqBAIJ*)A->data; 99*67877ebaSShri Abhyankar const PetscInt *ai,*aj,*ajj,bs=A->rmap->bs,bs2=aa->bs2,M=A->rmap->N/bs; 100*67877ebaSShri Abhyankar const PetscScalar *av,*v1; 101*67877ebaSShri Abhyankar PetscScalar *val; 102*67877ebaSShri Abhyankar PetscInt nz,idx=0,rnz,i,j,k,m,ii; 103*67877ebaSShri Abhyankar PetscErrorCode ierr; 104*67877ebaSShri Abhyankar PetscInt *row,*col; 105*67877ebaSShri Abhyankar 106*67877ebaSShri Abhyankar PetscFunctionBegin; 107*67877ebaSShri Abhyankar ai = aa->i; aj = aa->j; av = aa->a; 108*67877ebaSShri Abhyankar if (!valOnly){ 109*67877ebaSShri Abhyankar nz = bs2*aa->nz; 110*67877ebaSShri Abhyankar *nnz = nz; 111*67877ebaSShri Abhyankar ierr = PetscMalloc(nz*sizeof(PetscInt), &row);CHKERRQ(ierr); 112*67877ebaSShri Abhyankar ierr = PetscMalloc(nz*sizeof(PetscInt), &col);CHKERRQ(ierr); 113*67877ebaSShri Abhyankar ierr = PetscMalloc(nz*sizeof(PetscScalar),&val);CHKERRQ(ierr); 114*67877ebaSShri Abhyankar for(i=0; i<M; i++) { 115*67877ebaSShri Abhyankar ii = 0; 116*67877ebaSShri Abhyankar ajj = aj + ai[i]; 117*67877ebaSShri Abhyankar v1 = av + bs2*ai[i]; 118*67877ebaSShri Abhyankar rnz = ai[i+1] - ai[i]; 119*67877ebaSShri Abhyankar for(k=0; k<rnz; k++) { 120*67877ebaSShri Abhyankar for(j=0; j<bs; j++) { 121*67877ebaSShri Abhyankar for(m=0; m<bs; m++) { 122*67877ebaSShri Abhyankar row[idx] = i*bs + m + shift; 123*67877ebaSShri Abhyankar col[idx] = bs*(ajj[k]) + j + shift; 124*67877ebaSShri Abhyankar val[idx++] = v1[ii++]; 125*67877ebaSShri Abhyankar } 126*67877ebaSShri Abhyankar } 127*67877ebaSShri Abhyankar } 128*67877ebaSShri Abhyankar } 129*67877ebaSShri Abhyankar *r = row; *c = col; *v = val; 130*67877ebaSShri Abhyankar } else { 131*67877ebaSShri Abhyankar row = *r; col = *c; val = *v; 132*67877ebaSShri Abhyankar for(i=0; i<M; i++) { 133*67877ebaSShri Abhyankar ii = 0; 134*67877ebaSShri Abhyankar v1 = av + bs2*ai[i]; 135*67877ebaSShri Abhyankar rnz = ai[i+1] - ai[i]; 136*67877ebaSShri Abhyankar for(k=0; k<rnz; k++){ 137*67877ebaSShri Abhyankar for(j=0; j<bs; j++) { 138*67877ebaSShri Abhyankar for(m=0; m<bs; m++) { 139*67877ebaSShri Abhyankar val[idx++] = v1[ii++]; 140*67877ebaSShri Abhyankar } 141*67877ebaSShri Abhyankar } 142*67877ebaSShri Abhyankar } 143*67877ebaSShri Abhyankar } 144*67877ebaSShri Abhyankar } 145*67877ebaSShri Abhyankar PetscFunctionReturn(0); 146*67877ebaSShri Abhyankar } 147*67877ebaSShri Abhyankar 148*67877ebaSShri Abhyankar #undef __FUNCT__ 14916ebf90aSShri Abhyankar #define __FUNCT__ "MatConvertToTriples_seqsbaij_seqsbaij" 15016ebf90aSShri Abhyankar PetscErrorCode MatConvertToTriples_seqsbaij_seqsbaij(Mat A,int shift,PetscTruth valOnly,int *nnz,int **r, int **c, PetscScalar **v) 15116ebf90aSShri Abhyankar { 152*67877ebaSShri Abhyankar const PetscInt *ai, *aj,*ajj,M=A->rmap->n; 153*67877ebaSShri Abhyankar PetscInt nz,rnz,i,j; 15416ebf90aSShri Abhyankar PetscErrorCode ierr; 15516ebf90aSShri Abhyankar PetscInt *row,*col; 15616ebf90aSShri Abhyankar Mat_SeqSBAIJ *aa=(Mat_SeqSBAIJ*)A->data; 15716ebf90aSShri Abhyankar 15816ebf90aSShri Abhyankar PetscFunctionBegin; 15916ebf90aSShri Abhyankar if (!valOnly){ 16016ebf90aSShri Abhyankar nz = aa->nz;ai=aa->i; aj=aa->j;*v=aa->a; 16116ebf90aSShri Abhyankar *nnz = nz; 16216ebf90aSShri Abhyankar ierr = PetscMalloc(nz*sizeof(PetscInt), &row);CHKERRQ(ierr); 16316ebf90aSShri Abhyankar ierr = PetscMalloc(nz*sizeof(PetscInt), &col);CHKERRQ(ierr); 16416ebf90aSShri Abhyankar nz = 0; 16516ebf90aSShri Abhyankar for(i=0; i<M; i++) { 16616ebf90aSShri Abhyankar rnz = ai[i+1] - ai[i]; 167*67877ebaSShri Abhyankar ajj = aj + ai[i]; 168*67877ebaSShri Abhyankar for(j=0; j<rnz; j++) { 169*67877ebaSShri Abhyankar row[nz] = i+shift; col[nz++] = ajj[j] + shift; 17016ebf90aSShri Abhyankar } 17116ebf90aSShri Abhyankar } 17216ebf90aSShri Abhyankar *r = row; *c = col; 17316ebf90aSShri Abhyankar } 17416ebf90aSShri Abhyankar PetscFunctionReturn(0); 17516ebf90aSShri Abhyankar } 17616ebf90aSShri Abhyankar 17716ebf90aSShri Abhyankar #undef __FUNCT__ 17816ebf90aSShri Abhyankar #define __FUNCT__ "MatConvertToTriples_seqaij_seqsbaij" 17916ebf90aSShri Abhyankar PetscErrorCode MatConvertToTriples_seqaij_seqsbaij(Mat A,int shift,PetscTruth valOnly,int *nnz,int **r, int **c, PetscScalar **v) 18016ebf90aSShri Abhyankar { 181*67877ebaSShri Abhyankar const PetscInt *ai,*aj,*ajj,*adiag,M=A->rmap->n; 182*67877ebaSShri Abhyankar PetscInt nz,rnz,i,j; 183*67877ebaSShri Abhyankar const PetscScalar *av,*v1; 18416ebf90aSShri Abhyankar PetscScalar *val; 18516ebf90aSShri Abhyankar PetscErrorCode ierr; 18616ebf90aSShri Abhyankar PetscInt *row,*col; 18716ebf90aSShri Abhyankar Mat_SeqSBAIJ *aa=(Mat_SeqSBAIJ*)A->data; 18816ebf90aSShri Abhyankar 18916ebf90aSShri Abhyankar PetscFunctionBegin; 19016ebf90aSShri Abhyankar ai=aa->i; aj=aa->j;av=aa->a; 19116ebf90aSShri Abhyankar adiag=aa->diag; 19216ebf90aSShri Abhyankar if (!valOnly){ 19316ebf90aSShri Abhyankar nz = M + (aa->nz-M)/2; 19416ebf90aSShri Abhyankar *nnz = nz; 19516ebf90aSShri Abhyankar ierr = PetscMalloc(nz*sizeof(PetscInt), &row);CHKERRQ(ierr); 19616ebf90aSShri Abhyankar ierr = PetscMalloc(nz*sizeof(PetscInt), &col);CHKERRQ(ierr); 19716ebf90aSShri Abhyankar ierr = PetscMalloc(nz*sizeof(PetscScalar), &val);CHKERRQ(ierr); 19816ebf90aSShri Abhyankar nz = 0; 19916ebf90aSShri Abhyankar for(i=0; i<M; i++) { 20016ebf90aSShri Abhyankar rnz = ai[i+1] - adiag[i]; 201*67877ebaSShri Abhyankar ajj = aj + adiag[i]; 202*67877ebaSShri Abhyankar for(j=0; j<rnz; j++) { 203*67877ebaSShri Abhyankar row[nz] = i+shift; col[nz] = ajj[j] + shift; val[nz++] = v1[j]; 20416ebf90aSShri Abhyankar } 20516ebf90aSShri Abhyankar } 20616ebf90aSShri Abhyankar *r = row; *c = col; *v = val; 207397b6df1SKris Buschelman } else { 20816ebf90aSShri Abhyankar nz = 0; val = *v; 20916ebf90aSShri Abhyankar for(i=0; i <M; i++) { 21016ebf90aSShri Abhyankar rnz = ai[i+1] - adiag[i]; 211*67877ebaSShri Abhyankar ajj = aj + adiag[i]; 212*67877ebaSShri Abhyankar v1 = av + adiag[i]; 213*67877ebaSShri Abhyankar for(j=0; j<rnz; j++) { 214*67877ebaSShri Abhyankar val[nz++] = v1[j]; 21516ebf90aSShri Abhyankar } 21616ebf90aSShri Abhyankar } 21716ebf90aSShri Abhyankar } 21816ebf90aSShri Abhyankar PetscFunctionReturn(0); 21916ebf90aSShri Abhyankar } 22016ebf90aSShri Abhyankar 22116ebf90aSShri Abhyankar #undef __FUNCT__ 22216ebf90aSShri Abhyankar #define __FUNCT__ "MatConvertToTriples_mpisbaij_mpisbaij" 22316ebf90aSShri Abhyankar PetscErrorCode MatConvertToTriples_mpisbaij_mpisbaij(Mat A,int shift,PetscTruth valOnly,int *nnz,int **r, int **c, PetscScalar **v) 22416ebf90aSShri Abhyankar { 22516ebf90aSShri Abhyankar const PetscInt *ai, *aj, *bi, *bj,*garray,m=A->rmap->n,*ajj,*bjj; 22616ebf90aSShri Abhyankar PetscErrorCode ierr; 22716ebf90aSShri Abhyankar PetscInt rstart,nz,i,j,jj,irow,countA,countB; 22816ebf90aSShri Abhyankar PetscInt *row,*col; 22916ebf90aSShri Abhyankar const PetscScalar *av, *bv,*v1,*v2; 23016ebf90aSShri Abhyankar PetscScalar *val; 231397b6df1SKris Buschelman Mat_MPISBAIJ *mat = (Mat_MPISBAIJ*)A->data; 232397b6df1SKris Buschelman Mat_SeqSBAIJ *aa=(Mat_SeqSBAIJ*)(mat->A)->data; 233397b6df1SKris Buschelman Mat_SeqBAIJ *bb=(Mat_SeqBAIJ*)(mat->B)->data; 23416ebf90aSShri Abhyankar 23516ebf90aSShri Abhyankar PetscFunctionBegin; 236d0f46423SBarry Smith ai=aa->i; aj=aa->j; bi=bb->i; bj=bb->j; rstart= A->rmap->rstart; 237397b6df1SKris Buschelman garray = mat->garray; 238397b6df1SKris Buschelman av=aa->a; bv=bb->a; 239397b6df1SKris Buschelman 240397b6df1SKris Buschelman if (!valOnly){ 24116ebf90aSShri Abhyankar nz = aa->nz + bb->nz; 24216ebf90aSShri Abhyankar *nnz = nz; 2437c307921SBarry Smith ierr = PetscMalloc(nz*sizeof(PetscInt) ,&row);CHKERRQ(ierr); 2447c307921SBarry Smith ierr = PetscMalloc(nz*sizeof(PetscInt),&col);CHKERRQ(ierr); 245397b6df1SKris Buschelman ierr = PetscMalloc(nz*sizeof(PetscScalar),&val);CHKERRQ(ierr); 246397b6df1SKris Buschelman *r = row; *c = col; *v = val; 247397b6df1SKris Buschelman } else { 248397b6df1SKris Buschelman row = *r; col = *c; val = *v; 249397b6df1SKris Buschelman } 250397b6df1SKris Buschelman 251028e57e8SHong Zhang jj = 0; irow = rstart; 252397b6df1SKris Buschelman for ( i=0; i<m; i++ ) { 253397b6df1SKris Buschelman ajj = aj + ai[i]; /* ptr to the beginning of this row */ 254397b6df1SKris Buschelman countA = ai[i+1] - ai[i]; 255397b6df1SKris Buschelman countB = bi[i+1] - bi[i]; 256397b6df1SKris Buschelman bjj = bj + bi[i]; 25716ebf90aSShri Abhyankar v1 = av + ai[i]; 25816ebf90aSShri Abhyankar v2 = bv + bi[i]; 259397b6df1SKris Buschelman 260397b6df1SKris Buschelman /* A-part */ 261397b6df1SKris Buschelman for (j=0; j<countA; j++){ 262397b6df1SKris Buschelman if (!valOnly){ 263397b6df1SKris Buschelman row[jj] = irow + shift; col[jj] = rstart + ajj[j] + shift; 264397b6df1SKris Buschelman } 26516ebf90aSShri Abhyankar val[jj++] = v1[j]; 266397b6df1SKris Buschelman } 26716ebf90aSShri Abhyankar 26816ebf90aSShri Abhyankar /* B-part */ 26916ebf90aSShri Abhyankar for(j=0; j < countB; j++){ 270397b6df1SKris Buschelman if (!valOnly){ 271397b6df1SKris Buschelman row[jj] = irow + shift; col[jj] = garray[bjj[j]] + shift; 272397b6df1SKris Buschelman } 27316ebf90aSShri Abhyankar val[jj++] = v2[j]; 27416ebf90aSShri Abhyankar } 27516ebf90aSShri Abhyankar irow++; 27616ebf90aSShri Abhyankar } 27716ebf90aSShri Abhyankar PetscFunctionReturn(0); 27816ebf90aSShri Abhyankar } 27916ebf90aSShri Abhyankar 28016ebf90aSShri Abhyankar #undef __FUNCT__ 28116ebf90aSShri Abhyankar #define __FUNCT__ "MatConvertToTriples_mpiaij_mpiaij" 28216ebf90aSShri Abhyankar PetscErrorCode MatConvertToTriples_mpiaij_mpiaij(Mat A,int shift,PetscTruth valOnly,int *nnz,int **r, int **c, PetscScalar **v) 28316ebf90aSShri Abhyankar { 28416ebf90aSShri Abhyankar const PetscInt *ai, *aj, *bi, *bj,*garray,m=A->rmap->n,*ajj,*bjj; 28516ebf90aSShri Abhyankar PetscErrorCode ierr; 28616ebf90aSShri Abhyankar PetscInt rstart,nz,i,j,jj,irow,countA,countB; 28716ebf90aSShri Abhyankar PetscInt *row,*col; 28816ebf90aSShri Abhyankar const PetscScalar *av, *bv,*v1,*v2; 28916ebf90aSShri Abhyankar PetscScalar *val; 29016ebf90aSShri Abhyankar Mat_MPIAIJ *mat = (Mat_MPIAIJ*)A->data; 29116ebf90aSShri Abhyankar Mat_SeqAIJ *aa=(Mat_SeqAIJ*)(mat->A)->data; 29216ebf90aSShri Abhyankar Mat_SeqAIJ *bb=(Mat_SeqAIJ*)(mat->B)->data; 29316ebf90aSShri Abhyankar 29416ebf90aSShri Abhyankar PetscFunctionBegin; 29516ebf90aSShri Abhyankar ai=aa->i; aj=aa->j; bi=bb->i; bj=bb->j; rstart= A->rmap->rstart; 29616ebf90aSShri Abhyankar garray = mat->garray; 29716ebf90aSShri Abhyankar av=aa->a; bv=bb->a; 29816ebf90aSShri Abhyankar 29916ebf90aSShri Abhyankar if (!valOnly){ 30016ebf90aSShri Abhyankar nz = aa->nz + bb->nz; 30116ebf90aSShri Abhyankar *nnz = nz; 30216ebf90aSShri Abhyankar ierr = PetscMalloc(nz*sizeof(PetscInt) ,&row);CHKERRQ(ierr); 30316ebf90aSShri Abhyankar ierr = PetscMalloc(nz*sizeof(PetscInt),&col);CHKERRQ(ierr); 30416ebf90aSShri Abhyankar ierr = PetscMalloc(nz*sizeof(PetscScalar),&val);CHKERRQ(ierr); 30516ebf90aSShri Abhyankar *r = row; *c = col; *v = val; 30616ebf90aSShri Abhyankar } else { 30716ebf90aSShri Abhyankar row = *r; col = *c; val = *v; 30816ebf90aSShri Abhyankar } 30916ebf90aSShri Abhyankar 31016ebf90aSShri Abhyankar jj = 0; irow = rstart; 31116ebf90aSShri Abhyankar for ( i=0; i<m; i++ ) { 31216ebf90aSShri Abhyankar ajj = aj + ai[i]; /* ptr to the beginning of this row */ 31316ebf90aSShri Abhyankar countA = ai[i+1] - ai[i]; 31416ebf90aSShri Abhyankar countB = bi[i+1] - bi[i]; 31516ebf90aSShri Abhyankar bjj = bj + bi[i]; 31616ebf90aSShri Abhyankar v1 = av + ai[i]; 31716ebf90aSShri Abhyankar v2 = bv + bi[i]; 31816ebf90aSShri Abhyankar 31916ebf90aSShri Abhyankar /* A-part */ 32016ebf90aSShri Abhyankar for (j=0; j<countA; j++){ 32116ebf90aSShri Abhyankar if (!valOnly){ 32216ebf90aSShri Abhyankar row[jj] = irow + shift; col[jj] = rstart + ajj[j] + shift; 32316ebf90aSShri Abhyankar } 32416ebf90aSShri Abhyankar val[jj++] = v1[j]; 32516ebf90aSShri Abhyankar } 32616ebf90aSShri Abhyankar 32716ebf90aSShri Abhyankar /* B-part */ 32816ebf90aSShri Abhyankar for(j=0; j < countB; j++){ 32916ebf90aSShri Abhyankar if (!valOnly){ 33016ebf90aSShri Abhyankar row[jj] = irow + shift; col[jj] = garray[bjj[j]] + shift; 33116ebf90aSShri Abhyankar } 33216ebf90aSShri Abhyankar val[jj++] = v2[j]; 33316ebf90aSShri Abhyankar } 33416ebf90aSShri Abhyankar irow++; 33516ebf90aSShri Abhyankar } 33616ebf90aSShri Abhyankar PetscFunctionReturn(0); 33716ebf90aSShri Abhyankar } 33816ebf90aSShri Abhyankar 33916ebf90aSShri Abhyankar #undef __FUNCT__ 340*67877ebaSShri Abhyankar #define __FUNCT__ "MatConvertToTriples_mpibaij_mpiaij" 341*67877ebaSShri Abhyankar PetscErrorCode MatConvertToTriples_mpibaij_mpiaij(Mat A,int shift,PetscTruth valOnly,int *nnz,int **r, int **c, PetscScalar **v) 342*67877ebaSShri Abhyankar { 343*67877ebaSShri Abhyankar Mat_MPIBAIJ *mat = (Mat_MPIBAIJ*)A->data; 344*67877ebaSShri Abhyankar Mat_SeqBAIJ *aa=(Mat_SeqBAIJ*)(mat->A)->data; 345*67877ebaSShri Abhyankar Mat_SeqBAIJ *bb=(Mat_SeqBAIJ*)(mat->B)->data; 346*67877ebaSShri Abhyankar const PetscInt *ai = aa->i, *bi = bb->i, *aj = aa->j, *bj = bb->j,*ajj, *bjj; 347*67877ebaSShri Abhyankar const PetscInt *garray = mat->garray,mbs=mat->mbs,rstartbs=mat->rstartbs; 348*67877ebaSShri Abhyankar const PetscInt bs = A->rmap->bs,bs2=mat->bs2; 349*67877ebaSShri Abhyankar PetscErrorCode ierr; 350*67877ebaSShri Abhyankar PetscInt nz,i,j,k,n,jj,irow,countA,countB,idx; 351*67877ebaSShri Abhyankar PetscInt *row,*col; 352*67877ebaSShri Abhyankar const PetscScalar *av=aa->a, *bv=bb->a,*v1,*v2; 353*67877ebaSShri Abhyankar PetscScalar *val; 354*67877ebaSShri Abhyankar 355*67877ebaSShri Abhyankar PetscFunctionBegin; 356*67877ebaSShri Abhyankar 357*67877ebaSShri Abhyankar if (!valOnly){ 358*67877ebaSShri Abhyankar nz = bs2*(aa->nz + bb->nz); 359*67877ebaSShri Abhyankar *nnz = nz; 360*67877ebaSShri Abhyankar ierr = PetscMalloc(nz*sizeof(PetscInt) ,&row);CHKERRQ(ierr); 361*67877ebaSShri Abhyankar ierr = PetscMalloc(nz*sizeof(PetscInt),&col);CHKERRQ(ierr); 362*67877ebaSShri Abhyankar ierr = PetscMalloc(nz*sizeof(PetscScalar),&val);CHKERRQ(ierr); 363*67877ebaSShri Abhyankar *r = row; *c = col; *v = val; 364*67877ebaSShri Abhyankar } else { 365*67877ebaSShri Abhyankar row = *r; col = *c; val = *v; 366*67877ebaSShri Abhyankar } 367*67877ebaSShri Abhyankar 368*67877ebaSShri Abhyankar jj = 0; irow = rstartbs; 369*67877ebaSShri Abhyankar for ( i=0; i<mbs; i++ ) { 370*67877ebaSShri Abhyankar countA = ai[i+1] - ai[i]; 371*67877ebaSShri Abhyankar countB = bi[i+1] - bi[i]; 372*67877ebaSShri Abhyankar ajj = aj + ai[i]; 373*67877ebaSShri Abhyankar bjj = bj + bi[i]; 374*67877ebaSShri Abhyankar v1 = av + bs2*ai[i]; 375*67877ebaSShri Abhyankar v2 = bv + bs2*bi[i]; 376*67877ebaSShri Abhyankar 377*67877ebaSShri Abhyankar idx = 0; 378*67877ebaSShri Abhyankar /* A-part */ 379*67877ebaSShri Abhyankar for (k=0; k<countA; k++){ 380*67877ebaSShri Abhyankar for (j=0; j<bs; j++) { 381*67877ebaSShri Abhyankar for (n=0; n<bs; n++) { 382*67877ebaSShri Abhyankar if (!valOnly){ 383*67877ebaSShri Abhyankar row[jj] = bs*irow + n + shift; 384*67877ebaSShri Abhyankar col[jj] = bs*(rstartbs + ajj[k]) + j + shift; 385*67877ebaSShri Abhyankar } 386*67877ebaSShri Abhyankar val[jj++] = v1[idx++]; 387*67877ebaSShri Abhyankar } 388*67877ebaSShri Abhyankar } 389*67877ebaSShri Abhyankar } 390*67877ebaSShri Abhyankar 391*67877ebaSShri Abhyankar idx = 0; 392*67877ebaSShri Abhyankar /* B-part */ 393*67877ebaSShri Abhyankar for(k=0; k<countB; k++){ 394*67877ebaSShri Abhyankar for (j=0; j<bs; j++) { 395*67877ebaSShri Abhyankar for (n=0; n<bs; n++) { 396*67877ebaSShri Abhyankar if (!valOnly){ 397*67877ebaSShri Abhyankar row[jj] = bs*irow + n + shift; 398*67877ebaSShri Abhyankar col[jj] = bs*(garray[bjj[k]]) + j + shift; 399*67877ebaSShri Abhyankar } 400*67877ebaSShri Abhyankar val[jj++] = bv[idx++]; 401*67877ebaSShri Abhyankar } 402*67877ebaSShri Abhyankar } 403*67877ebaSShri Abhyankar } 404*67877ebaSShri Abhyankar irow++; 405*67877ebaSShri Abhyankar } 406*67877ebaSShri Abhyankar PetscFunctionReturn(0); 407*67877ebaSShri Abhyankar } 408*67877ebaSShri Abhyankar 409*67877ebaSShri Abhyankar #undef __FUNCT__ 41016ebf90aSShri Abhyankar #define __FUNCT__ "MatConvertToTriples_mpiaij_mpisbaij" 41116ebf90aSShri Abhyankar PetscErrorCode MatConvertToTriples_mpiaij_mpisbaij(Mat A,int shift,PetscTruth valOnly,int *nnz,int **r, int **c, PetscScalar **v) 41216ebf90aSShri Abhyankar { 41316ebf90aSShri Abhyankar const PetscInt *ai, *aj,*adiag, *bi, *bj,*garray,m=A->rmap->n,*ajj,*bjj; 41416ebf90aSShri Abhyankar PetscErrorCode ierr; 41516ebf90aSShri Abhyankar PetscInt rstart,nz,nza,nzb_low,i,j,jj,irow,countA,countB; 41616ebf90aSShri Abhyankar PetscInt *row,*col; 41716ebf90aSShri Abhyankar const PetscScalar *av, *bv,*v1,*v2; 41816ebf90aSShri Abhyankar PetscScalar *val; 41916ebf90aSShri Abhyankar Mat_MPIAIJ *mat = (Mat_MPIAIJ*)A->data; 42016ebf90aSShri Abhyankar Mat_SeqAIJ *aa=(Mat_SeqAIJ*)(mat->A)->data; 42116ebf90aSShri Abhyankar Mat_SeqAIJ *bb=(Mat_SeqAIJ*)(mat->B)->data; 42216ebf90aSShri Abhyankar 42316ebf90aSShri Abhyankar PetscFunctionBegin; 42416ebf90aSShri Abhyankar ai=aa->i; aj=aa->j; adiag=aa->diag; 42516ebf90aSShri Abhyankar bi=bb->i; bj=bb->j; garray = mat->garray; 42616ebf90aSShri Abhyankar av=aa->a; bv=bb->a; 42716ebf90aSShri Abhyankar rstart = A->rmap->rstart; 42816ebf90aSShri Abhyankar 42916ebf90aSShri Abhyankar if (!valOnly){ 43016ebf90aSShri Abhyankar nza = 0;nzb_low = 0; 43116ebf90aSShri Abhyankar for(i=0; i<m; i++){ 43216ebf90aSShri Abhyankar nza = nza + (ai[i+1] - adiag[i]); 43316ebf90aSShri Abhyankar countB = bi[i+1] - bi[i]; 43416ebf90aSShri Abhyankar bjj = bj + bi[i]; 43516ebf90aSShri Abhyankar 43616ebf90aSShri Abhyankar j = 0; 43716ebf90aSShri Abhyankar while(garray[bjj[j]] < rstart) { 43816ebf90aSShri Abhyankar if(j == countB) break; 43916ebf90aSShri Abhyankar j++;nzb_low++; 44016ebf90aSShri Abhyankar } 44116ebf90aSShri Abhyankar } 44216ebf90aSShri Abhyankar /* Total nz = nz for the upper triangular A part + nz for the 2nd B part */ 44316ebf90aSShri Abhyankar nz = nza + (bb->nz - nzb_low); 44416ebf90aSShri Abhyankar *nnz = nz; 44516ebf90aSShri Abhyankar ierr = PetscMalloc(nz*sizeof(PetscInt) ,&row);CHKERRQ(ierr); 44616ebf90aSShri Abhyankar ierr = PetscMalloc(nz*sizeof(PetscInt),&col);CHKERRQ(ierr); 44716ebf90aSShri Abhyankar ierr = PetscMalloc(nz*sizeof(PetscScalar),&val);CHKERRQ(ierr); 44816ebf90aSShri Abhyankar *r = row; *c = col; *v = val; 44916ebf90aSShri Abhyankar } else { 45016ebf90aSShri Abhyankar row = *r; col = *c; val = *v; 45116ebf90aSShri Abhyankar } 45216ebf90aSShri Abhyankar 45316ebf90aSShri Abhyankar jj = 0; irow = rstart; 45416ebf90aSShri Abhyankar for ( i=0; i<m; i++ ) { 45516ebf90aSShri Abhyankar ajj = aj + adiag[i]; /* ptr to the beginning of the diagonal of this row */ 45616ebf90aSShri Abhyankar v1 = av + adiag[i]; 45716ebf90aSShri Abhyankar countA = ai[i+1] - adiag[i]; 45816ebf90aSShri Abhyankar countB = bi[i+1] - bi[i]; 45916ebf90aSShri Abhyankar bjj = bj + bi[i]; 46016ebf90aSShri Abhyankar v2 = bv + bi[i]; 46116ebf90aSShri Abhyankar 46216ebf90aSShri Abhyankar /* A-part */ 46316ebf90aSShri Abhyankar for (j=0; j<countA; j++){ 46416ebf90aSShri Abhyankar if (!valOnly){ 46516ebf90aSShri Abhyankar row[jj] = irow + shift; col[jj] = rstart + ajj[j] + shift; 46616ebf90aSShri Abhyankar } 46716ebf90aSShri Abhyankar val[jj++] = v1[j]; 46816ebf90aSShri Abhyankar } 46916ebf90aSShri Abhyankar 47016ebf90aSShri Abhyankar /* B-part */ 47116ebf90aSShri Abhyankar for(j=0; j < countB; j++){ 47216ebf90aSShri Abhyankar if (garray[bjj[j]] > rstart) { 47316ebf90aSShri Abhyankar if (!valOnly){ 47416ebf90aSShri Abhyankar row[jj] = irow + shift; col[jj] = garray[bjj[j]] + shift; 47516ebf90aSShri Abhyankar } 47616ebf90aSShri Abhyankar val[jj++] = v2[j]; 47716ebf90aSShri Abhyankar } 478397b6df1SKris Buschelman } 479397b6df1SKris Buschelman irow++; 480397b6df1SKris Buschelman } 481397b6df1SKris Buschelman PetscFunctionReturn(0); 482397b6df1SKris Buschelman } 483397b6df1SKris Buschelman 484397b6df1SKris Buschelman #undef __FUNCT__ 4853924e44cSKris Buschelman #define __FUNCT__ "MatDestroy_MUMPS" 486dfbe8321SBarry Smith PetscErrorCode MatDestroy_MUMPS(Mat A) 487dfbe8321SBarry Smith { 488f0c56d0fSKris Buschelman Mat_MUMPS *lu=(Mat_MUMPS*)A->spptr; 489dfbe8321SBarry Smith PetscErrorCode ierr; 490c1490034SHong Zhang PetscMPIInt size=lu->size; 491*67877ebaSShri Abhyankar PetscTruth isSeqBAIJ,isMPIBAIJ; 492b24902e0SBarry Smith 493397b6df1SKris Buschelman PetscFunctionBegin; 494*67877ebaSShri Abhyankar ierr = PetscTypeCompare((PetscObject)A,MATSEQBAIJ,&isSeqBAIJ);CHKERRQ(ierr); 495*67877ebaSShri Abhyankar ierr = PetscTypeCompare((PetscObject)A,MATMPIBAIJ,&isMPIBAIJ);CHKERRQ(ierr); 496397b6df1SKris Buschelman if (lu->CleanUpMUMPS) { 497397b6df1SKris Buschelman /* Terminate instance, deallocate memories */ 498329ec9b3SHong Zhang if (size > 1){ 49968653410SBarry Smith ierr = PetscFree2(lu->id.sol_loc,lu->id.isol_loc);CHKERRQ(ierr); 500329ec9b3SHong Zhang ierr = VecScatterDestroy(lu->scat_rhs);CHKERRQ(ierr); 501329ec9b3SHong Zhang ierr = VecDestroy(lu->b_seq);CHKERRQ(ierr); 5022750af12SHong Zhang if (lu->nSolve && lu->scat_sol){ierr = VecScatterDestroy(lu->scat_sol);CHKERRQ(ierr);} 5032750af12SHong Zhang if (lu->nSolve && lu->x_seq){ierr = VecDestroy(lu->x_seq);CHKERRQ(ierr);} 504329ec9b3SHong Zhang ierr = PetscFree(lu->val);CHKERRQ(ierr); 505329ec9b3SHong Zhang } 50616ebf90aSShri Abhyankar if( size == 1 && A->factortype == MAT_FACTOR_CHOLESKY && lu->isAIJ) { 507450b117fSShri Abhyankar ierr = PetscFree(lu->val);CHKERRQ(ierr); 508450b117fSShri Abhyankar } 509*67877ebaSShri Abhyankar if(isSeqBAIJ || isMPIBAIJ) { 510*67877ebaSShri Abhyankar ierr = PetscFree(lu->val);CHKERRQ(ierr); 511*67877ebaSShri Abhyankar } 512397b6df1SKris Buschelman lu->id.job=JOB_END; 513397b6df1SKris Buschelman #if defined(PETSC_USE_COMPLEX) 514397b6df1SKris Buschelman zmumps_c(&lu->id); 515397b6df1SKris Buschelman #else 516397b6df1SKris Buschelman dmumps_c(&lu->id); 517397b6df1SKris Buschelman #endif 518c338a77dSKris Buschelman ierr = PetscFree(lu->irn);CHKERRQ(ierr); 519c338a77dSKris Buschelman ierr = PetscFree(lu->jcn);CHKERRQ(ierr); 520397b6df1SKris Buschelman ierr = MPI_Comm_free(&(lu->comm_mumps));CHKERRQ(ierr); 521397b6df1SKris Buschelman } 52297969023SHong Zhang /* clear composed functions */ 52397969023SHong Zhang ierr = PetscObjectComposeFunctionDynamic((PetscObject)A,"MatFactorGetSolverPackage_C","",PETSC_NULL);CHKERRQ(ierr); 52497969023SHong Zhang ierr = PetscObjectComposeFunctionDynamic((PetscObject)A,"MatMumpsSetIcntl_C","",PETSC_NULL);CHKERRQ(ierr); 52567334b25SHong Zhang ierr = (lu->MatDestroy)(A);CHKERRQ(ierr); 526397b6df1SKris Buschelman PetscFunctionReturn(0); 527397b6df1SKris Buschelman } 528397b6df1SKris Buschelman 529397b6df1SKris Buschelman #undef __FUNCT__ 530f6c57405SHong Zhang #define __FUNCT__ "MatSolve_MUMPS" 531b24902e0SBarry Smith PetscErrorCode MatSolve_MUMPS(Mat A,Vec b,Vec x) 532b24902e0SBarry Smith { 533f0c56d0fSKris Buschelman Mat_MUMPS *lu=(Mat_MUMPS*)A->spptr; 534d54de34fSKris Buschelman PetscScalar *array; 535*67877ebaSShri Abhyankar Vec b_seq; 536329ec9b3SHong Zhang IS is_iden,is_petsc; 537dfbe8321SBarry Smith PetscErrorCode ierr; 538329ec9b3SHong Zhang PetscInt i; 539397b6df1SKris Buschelman 540397b6df1SKris Buschelman PetscFunctionBegin; 541329ec9b3SHong Zhang lu->id.nrhs = 1; 542*67877ebaSShri Abhyankar b_seq = lu->b_seq; 543397b6df1SKris Buschelman if (lu->size > 1){ 544329ec9b3SHong Zhang /* MUMPS only supports centralized rhs. Scatter b into a seqential rhs vector */ 545*67877ebaSShri Abhyankar ierr = VecScatterBegin(lu->scat_rhs,b,b_seq,INSERT_VALUES,SCATTER_FORWARD);CHKERRQ(ierr); 546*67877ebaSShri Abhyankar ierr = VecScatterEnd(lu->scat_rhs,b,b_seq,INSERT_VALUES,SCATTER_FORWARD);CHKERRQ(ierr); 547*67877ebaSShri Abhyankar if (!lu->myid) {ierr = VecGetArray(b_seq,&array);CHKERRQ(ierr);} 548397b6df1SKris Buschelman } else { /* size == 1 */ 549397b6df1SKris Buschelman ierr = VecCopy(b,x);CHKERRQ(ierr); 550397b6df1SKris Buschelman ierr = VecGetArray(x,&array);CHKERRQ(ierr); 551397b6df1SKris Buschelman } 552397b6df1SKris Buschelman if (!lu->myid) { /* define rhs on the host */ 5538278f211SHong Zhang lu->id.nrhs = 1; 554397b6df1SKris Buschelman #if defined(PETSC_USE_COMPLEX) 555397b6df1SKris Buschelman lu->id.rhs = (mumps_double_complex*)array; 556397b6df1SKris Buschelman #else 557397b6df1SKris Buschelman lu->id.rhs = array; 558397b6df1SKris Buschelman #endif 559397b6df1SKris Buschelman } 560397b6df1SKris Buschelman 561397b6df1SKris Buschelman /* solve phase */ 562329ec9b3SHong Zhang /*-------------*/ 563397b6df1SKris Buschelman lu->id.job = 3; 564397b6df1SKris Buschelman #if defined(PETSC_USE_COMPLEX) 565397b6df1SKris Buschelman zmumps_c(&lu->id); 566397b6df1SKris Buschelman #else 567397b6df1SKris Buschelman dmumps_c(&lu->id); 568397b6df1SKris Buschelman #endif 56965e19b50SBarry 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)); 570397b6df1SKris Buschelman 571329ec9b3SHong Zhang if (lu->size > 1) { /* convert mumps distributed solution to petsc mpi x */ 572329ec9b3SHong Zhang if (!lu->nSolve){ /* create scatter scat_sol */ 573329ec9b3SHong Zhang ierr = ISCreateStride(PETSC_COMM_SELF,lu->id.lsol_loc,0,1,&is_iden);CHKERRQ(ierr); /* from */ 574329ec9b3SHong Zhang for (i=0; i<lu->id.lsol_loc; i++){ 575329ec9b3SHong Zhang lu->id.isol_loc[i] -= 1; /* change Fortran style to C style */ 576397b6df1SKris Buschelman } 577329ec9b3SHong Zhang ierr = ISCreateGeneral(PETSC_COMM_SELF,lu->id.lsol_loc,lu->id.isol_loc,&is_petsc);CHKERRQ(ierr); /* to */ 578329ec9b3SHong Zhang ierr = VecScatterCreate(lu->x_seq,is_iden,x,is_petsc,&lu->scat_sol);CHKERRQ(ierr); 579329ec9b3SHong Zhang ierr = ISDestroy(is_iden);CHKERRQ(ierr); 580329ec9b3SHong Zhang ierr = ISDestroy(is_petsc);CHKERRQ(ierr); 581397b6df1SKris Buschelman } 582ca9f406cSSatish Balay ierr = VecScatterBegin(lu->scat_sol,lu->x_seq,x,INSERT_VALUES,SCATTER_FORWARD);CHKERRQ(ierr); 583ca9f406cSSatish Balay ierr = VecScatterEnd(lu->scat_sol,lu->x_seq,x,INSERT_VALUES,SCATTER_FORWARD);CHKERRQ(ierr); 584329ec9b3SHong Zhang } 585329ec9b3SHong Zhang lu->nSolve++; 586397b6df1SKris Buschelman PetscFunctionReturn(0); 587397b6df1SKris Buschelman } 588397b6df1SKris Buschelman 589ace3df97SHong Zhang #if !defined(PETSC_USE_COMPLEX) 590a58c3f20SHong Zhang /* 591a58c3f20SHong Zhang input: 592a58c3f20SHong Zhang F: numeric factor 593a58c3f20SHong Zhang output: 594a58c3f20SHong Zhang nneg: total number of negative pivots 595a58c3f20SHong Zhang nzero: 0 596a58c3f20SHong Zhang npos: (global dimension of F) - nneg 597a58c3f20SHong Zhang */ 598a58c3f20SHong Zhang 599a58c3f20SHong Zhang #undef __FUNCT__ 600a58c3f20SHong Zhang #define __FUNCT__ "MatGetInertia_SBAIJMUMPS" 601dfbe8321SBarry Smith PetscErrorCode MatGetInertia_SBAIJMUMPS(Mat F,int *nneg,int *nzero,int *npos) 602a58c3f20SHong Zhang { 603a58c3f20SHong Zhang Mat_MUMPS *lu =(Mat_MUMPS*)F->spptr; 604dfbe8321SBarry Smith PetscErrorCode ierr; 605c1490034SHong Zhang PetscMPIInt size; 606a58c3f20SHong Zhang 607a58c3f20SHong Zhang PetscFunctionBegin; 6087adad957SLisandro Dalcin ierr = MPI_Comm_size(((PetscObject)F)->comm,&size);CHKERRQ(ierr); 609bcb30aebSHong 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 */ 61065e19b50SBarry 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)); 611a58c3f20SHong Zhang if (nneg){ 612a58c3f20SHong Zhang if (!lu->myid){ 613a58c3f20SHong Zhang *nneg = lu->id.INFOG(12); 614a58c3f20SHong Zhang } 615bcb30aebSHong Zhang ierr = MPI_Bcast(nneg,1,MPI_INT,0,lu->comm_mumps);CHKERRQ(ierr); 616a58c3f20SHong Zhang } 617a58c3f20SHong Zhang if (nzero) *nzero = 0; 618d0f46423SBarry Smith if (npos) *npos = F->rmap->N - (*nneg); 619a58c3f20SHong Zhang PetscFunctionReturn(0); 620a58c3f20SHong Zhang } 621ace3df97SHong Zhang #endif /* !defined(PETSC_USE_COMPLEX) */ 622a58c3f20SHong Zhang 623397b6df1SKris Buschelman #undef __FUNCT__ 624f6c57405SHong Zhang #define __FUNCT__ "MatFactorNumeric_MUMPS" 6250481f469SBarry Smith PetscErrorCode MatFactorNumeric_MUMPS(Mat F,Mat A,const MatFactorInfo *info) 626af281ebdSHong Zhang { 627dcd589f8SShri Abhyankar Mat_MUMPS *lu =(Mat_MUMPS*)(F)->spptr; 6286849ba73SBarry Smith PetscErrorCode ierr; 629dcd589f8SShri Abhyankar PetscTruth valOnly; 630e09efc27SHong Zhang Mat F_diag; 63116ebf90aSShri Abhyankar PetscTruth isMPIAIJ; 632397b6df1SKris Buschelman 633397b6df1SKris Buschelman PetscFunctionBegin; 63416ebf90aSShri Abhyankar valOnly = PETSC_TRUE; 63516ebf90aSShri Abhyankar ierr = (*lu->ConvertToTriples)(A, 1, valOnly, &lu->nz, &lu->irn, &lu->jcn, &lu->val);CHKERRQ(ierr); 636397b6df1SKris Buschelman 637397b6df1SKris Buschelman /* numerical factorization phase */ 638329ec9b3SHong Zhang /*-------------------------------*/ 639329ec9b3SHong Zhang lu->id.job = 2; 640958c9bccSBarry Smith if(!lu->id.ICNTL(18)) { 641a7aca84bSHong Zhang if (!lu->myid) { 642397b6df1SKris Buschelman #if defined(PETSC_USE_COMPLEX) 643397b6df1SKris Buschelman lu->id.a = (mumps_double_complex*)lu->val; 644397b6df1SKris Buschelman #else 645397b6df1SKris Buschelman lu->id.a = lu->val; 646397b6df1SKris Buschelman #endif 647397b6df1SKris Buschelman } 648397b6df1SKris Buschelman } else { 649397b6df1SKris Buschelman #if defined(PETSC_USE_COMPLEX) 650397b6df1SKris Buschelman lu->id.a_loc = (mumps_double_complex*)lu->val; 651397b6df1SKris Buschelman #else 652397b6df1SKris Buschelman lu->id.a_loc = lu->val; 653397b6df1SKris Buschelman #endif 654397b6df1SKris Buschelman } 655397b6df1SKris Buschelman #if defined(PETSC_USE_COMPLEX) 656397b6df1SKris Buschelman zmumps_c(&lu->id); 657397b6df1SKris Buschelman #else 658397b6df1SKris Buschelman dmumps_c(&lu->id); 659397b6df1SKris Buschelman #endif 660397b6df1SKris Buschelman if (lu->id.INFOG(1) < 0) { 66165e19b50SBarry 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)); 66265e19b50SBarry 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)); 663397b6df1SKris Buschelman } 66465e19b50SBarry 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)); 665397b6df1SKris Buschelman 6668ada1bb4SHong Zhang if (lu->size > 1){ 66716ebf90aSShri Abhyankar ierr = PetscTypeCompare((PetscObject)A,MATMPIAIJ,&isMPIAIJ);CHKERRQ(ierr); 668a214ac2aSShri Abhyankar if(isMPIAIJ) { 669dcd589f8SShri Abhyankar F_diag = ((Mat_MPIAIJ *)(F)->data)->A; 670e09efc27SHong Zhang } else { 671dcd589f8SShri Abhyankar F_diag = ((Mat_MPISBAIJ *)(F)->data)->A; 672e09efc27SHong Zhang } 673e09efc27SHong Zhang F_diag->assembled = PETSC_TRUE; 674329ec9b3SHong Zhang if (lu->nSolve){ 675329ec9b3SHong Zhang ierr = VecScatterDestroy(lu->scat_sol);CHKERRQ(ierr); 6760e83c824SBarry Smith ierr = PetscFree2(lu->id.sol_loc,lu->id.isol_loc);CHKERRQ(ierr); 677329ec9b3SHong Zhang ierr = VecDestroy(lu->x_seq);CHKERRQ(ierr); 678329ec9b3SHong Zhang } 6798ada1bb4SHong Zhang } 680dcd589f8SShri Abhyankar (F)->assembled = PETSC_TRUE; 681397b6df1SKris Buschelman lu->matstruc = SAME_NONZERO_PATTERN; 682ace87b0dSHong Zhang lu->CleanUpMUMPS = PETSC_TRUE; 683329ec9b3SHong Zhang lu->nSolve = 0; 684*67877ebaSShri Abhyankar 685*67877ebaSShri Abhyankar if (lu->size > 1){ 686*67877ebaSShri Abhyankar /* distributed solution */ 687*67877ebaSShri Abhyankar lu->id.ICNTL(21) = 1; 688*67877ebaSShri Abhyankar if (!lu->nSolve){ 689*67877ebaSShri Abhyankar /* Create x_seq=sol_loc for repeated use */ 690*67877ebaSShri Abhyankar PetscInt lsol_loc; 691*67877ebaSShri Abhyankar PetscScalar *sol_loc; 692*67877ebaSShri Abhyankar lsol_loc = lu->id.INFO(23); /* length of sol_loc */ 693*67877ebaSShri Abhyankar ierr = PetscMalloc2(lsol_loc,PetscScalar,&sol_loc,lsol_loc,PetscInt,&lu->id.isol_loc);CHKERRQ(ierr); 694*67877ebaSShri Abhyankar lu->id.lsol_loc = lsol_loc; 695*67877ebaSShri Abhyankar #if defined(PETSC_USE_COMPLEX) 696*67877ebaSShri Abhyankar lu->id.sol_loc = (mumps_double_complex*)sol_loc; 697*67877ebaSShri Abhyankar #else 698*67877ebaSShri Abhyankar lu->id.sol_loc = sol_loc; 699*67877ebaSShri Abhyankar #endif 700*67877ebaSShri Abhyankar ierr = VecCreateSeqWithArray(PETSC_COMM_SELF,lsol_loc,sol_loc,&lu->x_seq);CHKERRQ(ierr); 701*67877ebaSShri Abhyankar } 702*67877ebaSShri Abhyankar } 703397b6df1SKris Buschelman PetscFunctionReturn(0); 704397b6df1SKris Buschelman } 705397b6df1SKris Buschelman 706dcd589f8SShri Abhyankar #undef __FUNCT__ 707dcd589f8SShri Abhyankar #define __FUNCT__ "PetscSetMUMPSOptions" 708dcd589f8SShri Abhyankar PetscErrorCode PetscSetMUMPSOptions(Mat F, Mat A) 709dcd589f8SShri Abhyankar { 710dcd589f8SShri Abhyankar Mat_MUMPS *lu = (Mat_MUMPS*)F->spptr; 711dcd589f8SShri Abhyankar PetscErrorCode ierr; 712dcd589f8SShri Abhyankar PetscInt icntl; 713dcd589f8SShri Abhyankar PetscTruth flg; 714dcd589f8SShri Abhyankar 715dcd589f8SShri Abhyankar PetscFunctionBegin; 716dcd589f8SShri Abhyankar ierr = PetscOptionsBegin(((PetscObject)A)->comm,((PetscObject)A)->prefix,"MUMPS Options","Mat");CHKERRQ(ierr); 717cb828f0fSHong Zhang ierr = PetscOptionsTruth("-mat_mumps_view","View MUMPS parameters","None",lu->mumpsview,&lu->mumpsview,PETSC_NULL);CHKERRQ(ierr); 718dcd589f8SShri Abhyankar if (lu->size == 1){ 719dcd589f8SShri Abhyankar lu->id.ICNTL(18) = 0; /* centralized assembled matrix input */ 720dcd589f8SShri Abhyankar } else { 721dcd589f8SShri Abhyankar lu->id.ICNTL(18) = 3; /* distributed assembled matrix input */ 722dcd589f8SShri Abhyankar } 723dcd589f8SShri Abhyankar 724dcd589f8SShri Abhyankar icntl=-1; 725dcd589f8SShri Abhyankar lu->id.ICNTL(4) = 0; /* level of printing; overwrite mumps default ICNTL(4)=2 */ 726dcd589f8SShri Abhyankar ierr = PetscOptionsInt("-mat_mumps_icntl_4","ICNTL(4): level of printing (0 to 4)","None",lu->id.ICNTL(4),&icntl,&flg);CHKERRQ(ierr); 727dcd589f8SShri Abhyankar if ((flg && icntl > 0) || PetscLogPrintInfo) { 728dcd589f8SShri Abhyankar lu->id.ICNTL(4)=icntl; /* and use mumps default icntl(i), i=1,2,3 */ 729dcd589f8SShri Abhyankar } else { /* no output */ 730dcd589f8SShri Abhyankar lu->id.ICNTL(1) = 0; /* error message, default= 6 */ 731dcd589f8SShri Abhyankar lu->id.ICNTL(2) = 0; /* output stream for diagnostic printing, statistics, and warning. default=0 */ 732dcd589f8SShri Abhyankar lu->id.ICNTL(3) = 0; /* output stream for global information, default=6 */ 733dcd589f8SShri Abhyankar } 734dcd589f8SShri 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); 735dcd589f8SShri Abhyankar icntl=-1; 736dcd589f8SShri Abhyankar ierr = PetscOptionsInt("-mat_mumps_icntl_7","ICNTL(7): matrix ordering (0 to 7)","None",lu->id.ICNTL(7),&icntl,&flg);CHKERRQ(ierr); 737dcd589f8SShri Abhyankar if (flg) { 738dcd589f8SShri Abhyankar if (icntl== 1){ 739e32f2f54SBarry 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"); 740dcd589f8SShri Abhyankar } else { 741dcd589f8SShri Abhyankar lu->id.ICNTL(7) = icntl; 742dcd589f8SShri Abhyankar } 743dcd589f8SShri Abhyankar } 744dcd589f8SShri 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); 745dcd589f8SShri Abhyankar ierr = PetscOptionsInt("-mat_mumps_icntl_9","ICNTL(9): A or A^T x=b to be solved. 1: A; otherwise: A^T","None",lu->id.ICNTL(9),&lu->id.ICNTL(9),PETSC_NULL);CHKERRQ(ierr); 746dcd589f8SShri 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); 747dcd589f8SShri 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); 748dcd589f8SShri 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); 749dcd589f8SShri 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); 750dcd589f8SShri 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); 751dcd589f8SShri Abhyankar ierr = PetscOptionsInt("-mat_mumps_icntl_19","ICNTL(19): Schur complement","None",lu->id.ICNTL(19),&lu->id.ICNTL(19),PETSC_NULL);CHKERRQ(ierr); 752dcd589f8SShri Abhyankar 753dcd589f8SShri 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); 754dcd589f8SShri 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); 755dcd589f8SShri 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); 756dcd589f8SShri 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); 757dcd589f8SShri 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); 758dcd589f8SShri Abhyankar ierr = PetscOptionsInt("-mat_mumps_icntl_27","ICNTL(27): experimental parameter","None",lu->id.ICNTL(27),&lu->id.ICNTL(27),PETSC_NULL);CHKERRQ(ierr); 759dcd589f8SShri Abhyankar 760dcd589f8SShri 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); 761dcd589f8SShri 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); 762dcd589f8SShri 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); 763dcd589f8SShri 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); 764dcd589f8SShri 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); 765dcd589f8SShri Abhyankar PetscOptionsEnd(); 766dcd589f8SShri Abhyankar PetscFunctionReturn(0); 767dcd589f8SShri Abhyankar } 768dcd589f8SShri Abhyankar 769dcd589f8SShri Abhyankar #undef __FUNCT__ 770dcd589f8SShri Abhyankar #define __FUNCT__ "PetscInitializeMUMPS" 771dcd589f8SShri Abhyankar PetscErrorCode PetscInitializeMUMPS(Mat F) 772dcd589f8SShri Abhyankar { 773dcd589f8SShri Abhyankar Mat_MUMPS *lu = (Mat_MUMPS*)F->spptr; 774dcd589f8SShri Abhyankar PetscErrorCode ierr; 775dcd589f8SShri Abhyankar PetscInt icntl; 776dcd589f8SShri Abhyankar PetscTruth flg; 777dcd589f8SShri Abhyankar 778dcd589f8SShri Abhyankar PetscFunctionBegin; 779dcd589f8SShri Abhyankar lu->id.job = JOB_INIT; 780dcd589f8SShri Abhyankar lu->id.par=1; /* host participates factorizaton and solve */ 781dcd589f8SShri Abhyankar lu->id.sym=lu->sym; 782dcd589f8SShri Abhyankar if (lu->sym == 2){ 783dcd589f8SShri Abhyankar ierr = PetscOptionsInt("-mat_mumps_sym","SYM: (1,2)","None",lu->id.sym,&icntl,&flg);CHKERRQ(ierr); 784dcd589f8SShri Abhyankar if (flg && icntl == 1) lu->id.sym=icntl; /* matrix is spd */ 785dcd589f8SShri Abhyankar } 786dcd589f8SShri Abhyankar #if defined(PETSC_USE_COMPLEX) 787dcd589f8SShri Abhyankar zmumps_c(&lu->id); 788dcd589f8SShri Abhyankar #else 789dcd589f8SShri Abhyankar dmumps_c(&lu->id); 790dcd589f8SShri Abhyankar #endif 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; 801dcd589f8SShri Abhyankar PetscTruth valOnly; 802*67877ebaSShri Abhyankar Vec b; 803*67877ebaSShri Abhyankar IS is_iden; 804*67877ebaSShri Abhyankar const PetscInt M = A->rmap->N; 805397b6df1SKris Buschelman 806397b6df1SKris Buschelman PetscFunctionBegin; 807b24902e0SBarry Smith lu->sym = 0; 808b24902e0SBarry Smith lu->matstruc = DIFFERENT_NONZERO_PATTERN; 809dcd589f8SShri Abhyankar 810dcd589f8SShri Abhyankar ierr = MPI_Comm_rank(((PetscObject)A)->comm, &lu->myid); 811dcd589f8SShri Abhyankar ierr = MPI_Comm_size(((PetscObject)A)->comm,&lu->size);CHKERRQ(ierr); 812dcd589f8SShri Abhyankar ierr = MPI_Comm_dup(((PetscObject)A)->comm,&(lu->comm_mumps));CHKERRQ(ierr); 813dcd589f8SShri Abhyankar lu->id.comm_fortran = MPI_Comm_c2f(lu->comm_mumps); 814dcd589f8SShri Abhyankar 815dcd589f8SShri Abhyankar /* Initialize a MUMPS instance */ 816dcd589f8SShri Abhyankar ierr = PetscInitializeMUMPS(F);CHKERRQ(ierr); 817dcd589f8SShri Abhyankar /* Set MUMPS options */ 818dcd589f8SShri Abhyankar ierr = PetscSetMUMPSOptions(F,A);CHKERRQ(ierr); 819dcd589f8SShri Abhyankar 820dcd589f8SShri Abhyankar valOnly = PETSC_FALSE; 82116ebf90aSShri Abhyankar ierr = (*lu->ConvertToTriples)(A, 1, valOnly, &lu->nz, &lu->irn, &lu->jcn, &lu->val);CHKERRQ(ierr); 822dcd589f8SShri Abhyankar 823*67877ebaSShri Abhyankar /* analysis phase */ 824*67877ebaSShri Abhyankar /*----------------*/ 825*67877ebaSShri Abhyankar lu->id.job = 1; 826*67877ebaSShri Abhyankar lu->id.n = M; 827*67877ebaSShri Abhyankar switch (lu->id.ICNTL(18)){ 828*67877ebaSShri Abhyankar case 0: /* centralized assembled matrix input */ 829*67877ebaSShri Abhyankar if (!lu->myid) { 830*67877ebaSShri Abhyankar lu->id.nz =lu->nz; lu->id.irn=lu->irn; lu->id.jcn=lu->jcn; 831*67877ebaSShri Abhyankar if (lu->id.ICNTL(6)>1){ 832*67877ebaSShri Abhyankar #if defined(PETSC_USE_COMPLEX) 833*67877ebaSShri Abhyankar lu->id.a = (mumps_double_complex*)lu->val; 834*67877ebaSShri Abhyankar #else 835*67877ebaSShri Abhyankar lu->id.a = lu->val; 836*67877ebaSShri Abhyankar #endif 837*67877ebaSShri Abhyankar } 838*67877ebaSShri Abhyankar } 839*67877ebaSShri Abhyankar break; 840*67877ebaSShri Abhyankar case 3: /* distributed assembled matrix input (size>1) */ 841*67877ebaSShri Abhyankar lu->id.nz_loc = lu->nz; 842*67877ebaSShri Abhyankar lu->id.irn_loc=lu->irn; lu->id.jcn_loc=lu->jcn; 843*67877ebaSShri Abhyankar if (lu->id.ICNTL(6)>1) { 844*67877ebaSShri Abhyankar #if defined(PETSC_USE_COMPLEX) 845*67877ebaSShri Abhyankar lu->id.a_loc = (mumps_double_complex*)lu->val; 846*67877ebaSShri Abhyankar #else 847*67877ebaSShri Abhyankar lu->id.a_loc = lu->val; 848*67877ebaSShri Abhyankar #endif 849*67877ebaSShri Abhyankar } 850*67877ebaSShri Abhyankar /* MUMPS only supports centralized rhs. Create scatter scat_rhs for repeated use in MatSolve() */ 851*67877ebaSShri Abhyankar if (!lu->myid){ 852*67877ebaSShri Abhyankar ierr = VecCreateSeq(PETSC_COMM_SELF,A->cmap->N,&lu->b_seq);CHKERRQ(ierr); 853*67877ebaSShri Abhyankar ierr = ISCreateStride(PETSC_COMM_SELF,A->cmap->N,0,1,&is_iden);CHKERRQ(ierr); 854*67877ebaSShri Abhyankar } else { 855*67877ebaSShri Abhyankar ierr = VecCreateSeq(PETSC_COMM_SELF,0,&lu->b_seq);CHKERRQ(ierr); 856*67877ebaSShri Abhyankar ierr = ISCreateStride(PETSC_COMM_SELF,0,0,1,&is_iden);CHKERRQ(ierr); 857*67877ebaSShri Abhyankar } 858*67877ebaSShri Abhyankar ierr = VecCreate(((PetscObject)A)->comm,&b);CHKERRQ(ierr); 859*67877ebaSShri Abhyankar ierr = VecSetSizes(b,A->rmap->n,PETSC_DECIDE);CHKERRQ(ierr); 860*67877ebaSShri Abhyankar ierr = VecSetFromOptions(b);CHKERRQ(ierr); 861*67877ebaSShri Abhyankar 862*67877ebaSShri Abhyankar ierr = VecScatterCreate(b,is_iden,lu->b_seq,is_iden,&lu->scat_rhs);CHKERRQ(ierr); 863*67877ebaSShri Abhyankar ierr = ISDestroy(is_iden);CHKERRQ(ierr); 864*67877ebaSShri Abhyankar ierr = VecDestroy(b);CHKERRQ(ierr); 865*67877ebaSShri Abhyankar break; 866*67877ebaSShri Abhyankar } 867*67877ebaSShri Abhyankar #if defined(PETSC_USE_COMPLEX) 868*67877ebaSShri Abhyankar zmumps_c(&lu->id); 869*67877ebaSShri Abhyankar #else 870*67877ebaSShri Abhyankar dmumps_c(&lu->id); 871*67877ebaSShri Abhyankar #endif 872*67877ebaSShri 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)); 873*67877ebaSShri Abhyankar 874719d5645SBarry Smith F->ops->lufactornumeric = MatFactorNumeric_MUMPS; 875dcd589f8SShri Abhyankar F->ops->solve = MatSolve_MUMPS; 876b24902e0SBarry Smith PetscFunctionReturn(0); 877b24902e0SBarry Smith } 878b24902e0SBarry Smith 879450b117fSShri Abhyankar /* Note the Petsc r and c permutations are ignored */ 880450b117fSShri Abhyankar #undef __FUNCT__ 881450b117fSShri Abhyankar #define __FUNCT__ "MatLUFactorSymbolic_BAIJMUMPS" 882450b117fSShri Abhyankar PetscErrorCode MatLUFactorSymbolic_BAIJMUMPS(Mat F,Mat A,IS r,IS c,const MatFactorInfo *info) 883450b117fSShri Abhyankar { 884dcd589f8SShri Abhyankar 885450b117fSShri Abhyankar Mat_MUMPS *lu = (Mat_MUMPS*)F->spptr; 886dcd589f8SShri Abhyankar PetscErrorCode ierr; 887*67877ebaSShri Abhyankar PetscTruth valOnly; 888*67877ebaSShri Abhyankar Vec b; 889*67877ebaSShri Abhyankar IS is_iden; 890*67877ebaSShri Abhyankar const PetscInt M = A->rmap->N; 891450b117fSShri Abhyankar 892450b117fSShri Abhyankar PetscFunctionBegin; 893450b117fSShri Abhyankar lu->sym = 0; 894450b117fSShri Abhyankar lu->matstruc = DIFFERENT_NONZERO_PATTERN; 895dcd589f8SShri Abhyankar ierr = MPI_Comm_rank(((PetscObject)A)->comm, &lu->myid); 896dcd589f8SShri Abhyankar ierr = MPI_Comm_size(((PetscObject)A)->comm,&lu->size);CHKERRQ(ierr); 897dcd589f8SShri Abhyankar ierr = MPI_Comm_dup(((PetscObject)A)->comm,&(lu->comm_mumps));CHKERRQ(ierr); 898dcd589f8SShri Abhyankar lu->id.comm_fortran = MPI_Comm_c2f(lu->comm_mumps); 899dcd589f8SShri Abhyankar 900dcd589f8SShri Abhyankar /* Initialize a MUMPS instance */ 901dcd589f8SShri Abhyankar ierr = PetscInitializeMUMPS(F);CHKERRQ(ierr); 902dcd589f8SShri Abhyankar /* Set MUMPS options */ 903dcd589f8SShri Abhyankar ierr = PetscSetMUMPSOptions(F,A);CHKERRQ(ierr); 904dcd589f8SShri Abhyankar 905*67877ebaSShri Abhyankar valOnly = PETSC_FALSE; 906*67877ebaSShri Abhyankar ierr = (*lu->ConvertToTriples)(A, 1, valOnly, &lu->nz, &lu->irn, &lu->jcn, &lu->val);CHKERRQ(ierr); 907*67877ebaSShri Abhyankar 908*67877ebaSShri Abhyankar /* analysis phase */ 909*67877ebaSShri Abhyankar /*----------------*/ 910*67877ebaSShri Abhyankar lu->id.job = 1; 911*67877ebaSShri Abhyankar lu->id.n = M; 912*67877ebaSShri Abhyankar switch (lu->id.ICNTL(18)){ 913*67877ebaSShri Abhyankar case 0: /* centralized assembled matrix input */ 914*67877ebaSShri Abhyankar if (!lu->myid) { 915*67877ebaSShri Abhyankar lu->id.nz =lu->nz; lu->id.irn=lu->irn; lu->id.jcn=lu->jcn; 916*67877ebaSShri Abhyankar if (lu->id.ICNTL(6)>1){ 917*67877ebaSShri Abhyankar #if defined(PETSC_USE_COMPLEX) 918*67877ebaSShri Abhyankar lu->id.a = (mumps_double_complex*)lu->val; 919*67877ebaSShri Abhyankar #else 920*67877ebaSShri Abhyankar lu->id.a = lu->val; 921*67877ebaSShri Abhyankar #endif 922*67877ebaSShri Abhyankar } 923*67877ebaSShri Abhyankar } 924*67877ebaSShri Abhyankar break; 925*67877ebaSShri Abhyankar case 3: /* distributed assembled matrix input (size>1) */ 926*67877ebaSShri Abhyankar lu->id.nz_loc = lu->nz; 927*67877ebaSShri Abhyankar lu->id.irn_loc=lu->irn; lu->id.jcn_loc=lu->jcn; 928*67877ebaSShri Abhyankar if (lu->id.ICNTL(6)>1) { 929*67877ebaSShri Abhyankar #if defined(PETSC_USE_COMPLEX) 930*67877ebaSShri Abhyankar lu->id.a_loc = (mumps_double_complex*)lu->val; 931*67877ebaSShri Abhyankar #else 932*67877ebaSShri Abhyankar lu->id.a_loc = lu->val; 933*67877ebaSShri Abhyankar #endif 934*67877ebaSShri Abhyankar } 935*67877ebaSShri Abhyankar /* MUMPS only supports centralized rhs. Create scatter scat_rhs for repeated use in MatSolve() */ 936*67877ebaSShri Abhyankar if (!lu->myid){ 937*67877ebaSShri Abhyankar ierr = VecCreateSeq(PETSC_COMM_SELF,A->cmap->N,&lu->b_seq);CHKERRQ(ierr); 938*67877ebaSShri Abhyankar ierr = ISCreateStride(PETSC_COMM_SELF,A->cmap->N,0,1,&is_iden);CHKERRQ(ierr); 939*67877ebaSShri Abhyankar } else { 940*67877ebaSShri Abhyankar ierr = VecCreateSeq(PETSC_COMM_SELF,0,&lu->b_seq);CHKERRQ(ierr); 941*67877ebaSShri Abhyankar ierr = ISCreateStride(PETSC_COMM_SELF,0,0,1,&is_iden);CHKERRQ(ierr); 942*67877ebaSShri Abhyankar } 943*67877ebaSShri Abhyankar ierr = VecCreate(((PetscObject)A)->comm,&b);CHKERRQ(ierr); 944*67877ebaSShri Abhyankar ierr = VecSetSizes(b,A->rmap->n,PETSC_DECIDE);CHKERRQ(ierr); 945*67877ebaSShri Abhyankar ierr = VecSetFromOptions(b);CHKERRQ(ierr); 946*67877ebaSShri Abhyankar 947*67877ebaSShri Abhyankar ierr = VecScatterCreate(b,is_iden,lu->b_seq,is_iden,&lu->scat_rhs);CHKERRQ(ierr); 948*67877ebaSShri Abhyankar ierr = ISDestroy(is_iden);CHKERRQ(ierr); 949*67877ebaSShri Abhyankar ierr = VecDestroy(b);CHKERRQ(ierr); 950*67877ebaSShri Abhyankar break; 951*67877ebaSShri Abhyankar } 952*67877ebaSShri Abhyankar #if defined(PETSC_USE_COMPLEX) 953*67877ebaSShri Abhyankar zmumps_c(&lu->id); 954*67877ebaSShri Abhyankar #else 955*67877ebaSShri Abhyankar dmumps_c(&lu->id); 956*67877ebaSShri Abhyankar #endif 957*67877ebaSShri 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)); 958*67877ebaSShri Abhyankar 959450b117fSShri Abhyankar F->ops->lufactornumeric = MatFactorNumeric_MUMPS; 960dcd589f8SShri Abhyankar F->ops->solve = MatSolve_MUMPS; 961450b117fSShri Abhyankar PetscFunctionReturn(0); 962450b117fSShri Abhyankar } 963b24902e0SBarry Smith 964397b6df1SKris Buschelman /* Note the Petsc r permutation is ignored */ 965397b6df1SKris Buschelman #undef __FUNCT__ 966*67877ebaSShri Abhyankar #define __FUNCT__ "MatCholeskyFactorSymbolic_MUMPS" 967*67877ebaSShri Abhyankar PetscErrorCode MatCholeskyFactorSymbolic_MUMPS(Mat F,Mat A,IS r,const MatFactorInfo *info) 968b24902e0SBarry Smith { 9692792810eSHong Zhang Mat_MUMPS *lu = (Mat_MUMPS*)F->spptr; 970dcd589f8SShri Abhyankar PetscErrorCode ierr; 97116ebf90aSShri Abhyankar PetscTruth valOnly; 972*67877ebaSShri Abhyankar Vec b; 973*67877ebaSShri Abhyankar IS is_iden; 974*67877ebaSShri Abhyankar const PetscInt M = A->rmap->N; 975397b6df1SKris Buschelman 976397b6df1SKris Buschelman PetscFunctionBegin; 977b24902e0SBarry Smith lu->sym = 2; 978b24902e0SBarry Smith lu->matstruc = DIFFERENT_NONZERO_PATTERN; 979dcd589f8SShri Abhyankar ierr = MPI_Comm_rank(((PetscObject)A)->comm, &lu->myid); 980dcd589f8SShri Abhyankar ierr = MPI_Comm_size(((PetscObject)A)->comm,&lu->size);CHKERRQ(ierr); 981dcd589f8SShri Abhyankar ierr = MPI_Comm_dup(((PetscObject)A)->comm,&(lu->comm_mumps));CHKERRQ(ierr); 982dcd589f8SShri Abhyankar lu->id.comm_fortran = MPI_Comm_c2f(lu->comm_mumps); 983dcd589f8SShri Abhyankar 984dcd589f8SShri Abhyankar /* Initialize a MUMPS instance */ 985dcd589f8SShri Abhyankar ierr = PetscInitializeMUMPS(F);CHKERRQ(ierr); 986dcd589f8SShri Abhyankar /* Set MUMPS options */ 987dcd589f8SShri Abhyankar ierr = PetscSetMUMPSOptions(F,A);CHKERRQ(ierr); 988dcd589f8SShri Abhyankar 989dcd589f8SShri Abhyankar valOnly = PETSC_FALSE; 99016ebf90aSShri Abhyankar ierr = (*lu->ConvertToTriples)(A, 1 , valOnly, &lu->nz, &lu->irn, &lu->jcn, &lu->val);CHKERRQ(ierr); 991dcd589f8SShri Abhyankar 992*67877ebaSShri Abhyankar /* analysis phase */ 993*67877ebaSShri Abhyankar /*----------------*/ 994*67877ebaSShri Abhyankar lu->id.job = 1; 995*67877ebaSShri Abhyankar lu->id.n = M; 996*67877ebaSShri Abhyankar switch (lu->id.ICNTL(18)){ 997*67877ebaSShri Abhyankar case 0: /* centralized assembled matrix input */ 998*67877ebaSShri Abhyankar if (!lu->myid) { 999*67877ebaSShri Abhyankar lu->id.nz =lu->nz; lu->id.irn=lu->irn; lu->id.jcn=lu->jcn; 1000*67877ebaSShri Abhyankar if (lu->id.ICNTL(6)>1){ 1001*67877ebaSShri Abhyankar #if defined(PETSC_USE_COMPLEX) 1002*67877ebaSShri Abhyankar lu->id.a = (mumps_double_complex*)lu->val; 1003*67877ebaSShri Abhyankar #else 1004*67877ebaSShri Abhyankar lu->id.a = lu->val; 1005*67877ebaSShri Abhyankar #endif 1006*67877ebaSShri Abhyankar } 1007*67877ebaSShri Abhyankar } 1008*67877ebaSShri Abhyankar break; 1009*67877ebaSShri Abhyankar case 3: /* distributed assembled matrix input (size>1) */ 1010*67877ebaSShri Abhyankar lu->id.nz_loc = lu->nz; 1011*67877ebaSShri Abhyankar lu->id.irn_loc=lu->irn; lu->id.jcn_loc=lu->jcn; 1012*67877ebaSShri Abhyankar if (lu->id.ICNTL(6)>1) { 1013*67877ebaSShri Abhyankar #if defined(PETSC_USE_COMPLEX) 1014*67877ebaSShri Abhyankar lu->id.a_loc = (mumps_double_complex*)lu->val; 1015*67877ebaSShri Abhyankar #else 1016*67877ebaSShri Abhyankar lu->id.a_loc = lu->val; 1017*67877ebaSShri Abhyankar #endif 1018*67877ebaSShri Abhyankar } 1019*67877ebaSShri Abhyankar /* MUMPS only supports centralized rhs. Create scatter scat_rhs for repeated use in MatSolve() */ 1020*67877ebaSShri Abhyankar if (!lu->myid){ 1021*67877ebaSShri Abhyankar ierr = VecCreateSeq(PETSC_COMM_SELF,A->cmap->N,&lu->b_seq);CHKERRQ(ierr); 1022*67877ebaSShri Abhyankar ierr = ISCreateStride(PETSC_COMM_SELF,A->cmap->N,0,1,&is_iden);CHKERRQ(ierr); 1023*67877ebaSShri Abhyankar } else { 1024*67877ebaSShri Abhyankar ierr = VecCreateSeq(PETSC_COMM_SELF,0,&lu->b_seq);CHKERRQ(ierr); 1025*67877ebaSShri Abhyankar ierr = ISCreateStride(PETSC_COMM_SELF,0,0,1,&is_iden);CHKERRQ(ierr); 1026*67877ebaSShri Abhyankar } 1027*67877ebaSShri Abhyankar ierr = VecCreate(((PetscObject)A)->comm,&b);CHKERRQ(ierr); 1028*67877ebaSShri Abhyankar ierr = VecSetSizes(b,A->rmap->n,PETSC_DECIDE);CHKERRQ(ierr); 1029*67877ebaSShri Abhyankar ierr = VecSetFromOptions(b);CHKERRQ(ierr); 1030*67877ebaSShri Abhyankar 1031*67877ebaSShri Abhyankar ierr = VecScatterCreate(b,is_iden,lu->b_seq,is_iden,&lu->scat_rhs);CHKERRQ(ierr); 1032*67877ebaSShri Abhyankar ierr = ISDestroy(is_iden);CHKERRQ(ierr); 1033*67877ebaSShri Abhyankar ierr = VecDestroy(b);CHKERRQ(ierr); 1034*67877ebaSShri Abhyankar break; 1035*67877ebaSShri Abhyankar } 1036*67877ebaSShri Abhyankar #if defined(PETSC_USE_COMPLEX) 1037*67877ebaSShri Abhyankar zmumps_c(&lu->id); 1038*67877ebaSShri Abhyankar #else 1039*67877ebaSShri Abhyankar dmumps_c(&lu->id); 1040*67877ebaSShri Abhyankar #endif 1041*67877ebaSShri 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)); 1042*67877ebaSShri Abhyankar 10432792810eSHong Zhang F->ops->choleskyfactornumeric = MatFactorNumeric_MUMPS; 1044dcd589f8SShri Abhyankar F->ops->solve = MatSolve_MUMPS; 1045db4efbfdSBarry Smith #if !defined(PETSC_USE_COMPLEX) 1046dcd589f8SShri Abhyankar (F)->ops->getinertia = MatGetInertia_SBAIJMUMPS; 1047db4efbfdSBarry Smith #endif 1048b24902e0SBarry Smith PetscFunctionReturn(0); 1049b24902e0SBarry Smith } 1050b24902e0SBarry Smith 1051397b6df1SKris Buschelman #undef __FUNCT__ 1052f6c57405SHong Zhang #define __FUNCT__ "MatFactorInfo_MUMPS" 105374ed9c26SBarry Smith PetscErrorCode MatFactorInfo_MUMPS(Mat A,PetscViewer viewer) 105474ed9c26SBarry Smith { 1055f6c57405SHong Zhang Mat_MUMPS *lu=(Mat_MUMPS*)A->spptr; 1056f6c57405SHong Zhang PetscErrorCode ierr; 1057f6c57405SHong Zhang 1058f6c57405SHong Zhang PetscFunctionBegin; 1059f6c57405SHong Zhang ierr = PetscViewerASCIIPrintf(viewer," ICNTL(1) (output for error): %d \n",lu->id.ICNTL(1));CHKERRQ(ierr); 1060f6c57405SHong Zhang ierr = PetscViewerASCIIPrintf(viewer," ICNTL(2) (output of diagnostic msg):%d \n",lu->id.ICNTL(2));CHKERRQ(ierr); 1061f6c57405SHong Zhang ierr = PetscViewerASCIIPrintf(viewer," ICNTL(3) (output for global info): %d \n",lu->id.ICNTL(3));CHKERRQ(ierr); 1062f6c57405SHong Zhang ierr = PetscViewerASCIIPrintf(viewer," ICNTL(4) (level of printing): %d \n",lu->id.ICNTL(4));CHKERRQ(ierr); 1063f6c57405SHong Zhang ierr = PetscViewerASCIIPrintf(viewer," ICNTL(5) (input mat struct): %d \n",lu->id.ICNTL(5));CHKERRQ(ierr); 1064f6c57405SHong Zhang ierr = PetscViewerASCIIPrintf(viewer," ICNTL(6) (matrix prescaling): %d \n",lu->id.ICNTL(6));CHKERRQ(ierr); 1065f6c57405SHong Zhang ierr = PetscViewerASCIIPrintf(viewer," ICNTL(7) (matrix ordering): %d \n",lu->id.ICNTL(7));CHKERRQ(ierr); 1066f6c57405SHong Zhang ierr = PetscViewerASCIIPrintf(viewer," ICNTL(8) (scalling strategy): %d \n",lu->id.ICNTL(8));CHKERRQ(ierr); 1067f6c57405SHong Zhang ierr = PetscViewerASCIIPrintf(viewer," ICNTL(9) (A/A^T x=b is solved): %d \n",lu->id.ICNTL(9));CHKERRQ(ierr); 1068f6c57405SHong Zhang ierr = PetscViewerASCIIPrintf(viewer," ICNTL(10) (max num of refinements): %d \n",lu->id.ICNTL(10));CHKERRQ(ierr); 1069f6c57405SHong Zhang ierr = PetscViewerASCIIPrintf(viewer," ICNTL(11) (error analysis): %d \n",lu->id.ICNTL(11));CHKERRQ(ierr); 1070f6c57405SHong Zhang if (!lu->myid && lu->id.ICNTL(11)>0) { 1071f6c57405SHong Zhang ierr = PetscPrintf(PETSC_COMM_SELF," RINFOG(4) (inf norm of input mat): %g\n",lu->id.RINFOG(4));CHKERRQ(ierr); 1072f6c57405SHong Zhang ierr = PetscPrintf(PETSC_COMM_SELF," RINFOG(5) (inf norm of solution): %g\n",lu->id.RINFOG(5));CHKERRQ(ierr); 1073f6c57405SHong Zhang ierr = PetscPrintf(PETSC_COMM_SELF," RINFOG(6) (inf norm of residual): %g\n",lu->id.RINFOG(6));CHKERRQ(ierr); 1074f6c57405SHong Zhang ierr = PetscPrintf(PETSC_COMM_SELF," RINFOG(7),RINFOG(8) (backward error est): %g, %g\n",lu->id.RINFOG(7),lu->id.RINFOG(8));CHKERRQ(ierr); 1075f6c57405SHong Zhang ierr = PetscPrintf(PETSC_COMM_SELF," RINFOG(9) (error estimate): %g \n",lu->id.RINFOG(9));CHKERRQ(ierr); 1076f6c57405SHong Zhang ierr = PetscPrintf(PETSC_COMM_SELF," RINFOG(10),RINFOG(11)(condition numbers): %g, %g\n",lu->id.RINFOG(10),lu->id.RINFOG(11));CHKERRQ(ierr); 1077f6c57405SHong Zhang 1078f6c57405SHong Zhang } 1079f6c57405SHong Zhang ierr = PetscViewerASCIIPrintf(viewer," ICNTL(12) (efficiency control): %d \n",lu->id.ICNTL(12));CHKERRQ(ierr); 1080f6c57405SHong Zhang ierr = PetscViewerASCIIPrintf(viewer," ICNTL(13) (efficiency control): %d \n",lu->id.ICNTL(13));CHKERRQ(ierr); 1081f6c57405SHong Zhang ierr = PetscViewerASCIIPrintf(viewer," ICNTL(14) (percentage of estimated workspace increase): %d \n",lu->id.ICNTL(14));CHKERRQ(ierr); 1082f6c57405SHong Zhang /* ICNTL(15-17) not used */ 1083f6c57405SHong Zhang ierr = PetscViewerASCIIPrintf(viewer," ICNTL(18) (input mat struct): %d \n",lu->id.ICNTL(18));CHKERRQ(ierr); 1084f6c57405SHong Zhang ierr = PetscViewerASCIIPrintf(viewer," ICNTL(19) (Shur complement info): %d \n",lu->id.ICNTL(19));CHKERRQ(ierr); 1085f6c57405SHong Zhang ierr = PetscViewerASCIIPrintf(viewer," ICNTL(20) (rhs sparse pattern): %d \n",lu->id.ICNTL(20));CHKERRQ(ierr); 1086f6c57405SHong Zhang ierr = PetscViewerASCIIPrintf(viewer," ICNTL(21) (solution struct): %d \n",lu->id.ICNTL(21));CHKERRQ(ierr); 1087c0165424SHong Zhang ierr = PetscViewerASCIIPrintf(viewer," ICNTL(22) (in-core/out-of-core facility): %d \n",lu->id.ICNTL(22));CHKERRQ(ierr); 1088c0165424SHong Zhang ierr = PetscViewerASCIIPrintf(viewer," ICNTL(23) (max size of memory can be allocated locally):%d \n",lu->id.ICNTL(23));CHKERRQ(ierr); 1089c0165424SHong Zhang 1090c0165424SHong Zhang ierr = PetscViewerASCIIPrintf(viewer," ICNTL(24) (detection of null pivot rows): %d \n",lu->id.ICNTL(24));CHKERRQ(ierr); 1091c0165424SHong Zhang ierr = PetscViewerASCIIPrintf(viewer," ICNTL(25) (computation of a null space basis): %d \n",lu->id.ICNTL(25));CHKERRQ(ierr); 1092c0165424SHong Zhang ierr = PetscViewerASCIIPrintf(viewer," ICNTL(26) (Schur options for rhs or solution): %d \n",lu->id.ICNTL(26));CHKERRQ(ierr); 1093c0165424SHong Zhang ierr = PetscViewerASCIIPrintf(viewer," ICNTL(27) (experimental parameter): %d \n",lu->id.ICNTL(27));CHKERRQ(ierr); 1094f6c57405SHong Zhang 1095f6c57405SHong Zhang ierr = PetscViewerASCIIPrintf(viewer," CNTL(1) (relative pivoting threshold): %g \n",lu->id.CNTL(1));CHKERRQ(ierr); 1096f6c57405SHong Zhang ierr = PetscViewerASCIIPrintf(viewer," CNTL(2) (stopping criterion of refinement): %g \n",lu->id.CNTL(2));CHKERRQ(ierr); 1097f6c57405SHong Zhang ierr = PetscViewerASCIIPrintf(viewer," CNTL(3) (absolute pivoting threshold): %g \n",lu->id.CNTL(3));CHKERRQ(ierr); 1098f6c57405SHong Zhang ierr = PetscViewerASCIIPrintf(viewer," CNTL(4) (value of static pivoting): %g \n",lu->id.CNTL(4));CHKERRQ(ierr); 1099c0165424SHong Zhang ierr = PetscViewerASCIIPrintf(viewer," CNTL(5) (fixation for null pivots): %g \n",lu->id.CNTL(5));CHKERRQ(ierr); 1100f6c57405SHong Zhang 1101f6c57405SHong Zhang /* infomation local to each processor */ 1102f6c57405SHong Zhang if (!lu->myid) {ierr = PetscPrintf(PETSC_COMM_SELF, " RINFO(1) (local estimated flops for the elimination after analysis): \n");CHKERRQ(ierr);} 11037adad957SLisandro Dalcin ierr = PetscSynchronizedPrintf(((PetscObject)A)->comm," [%d] %g \n",lu->myid,lu->id.RINFO(1));CHKERRQ(ierr); 11047adad957SLisandro Dalcin ierr = PetscSynchronizedFlush(((PetscObject)A)->comm); 1105f6c57405SHong Zhang if (!lu->myid) {ierr = PetscPrintf(PETSC_COMM_SELF, " RINFO(2) (local estimated flops for the assembly after factorization): \n");CHKERRQ(ierr);} 11067adad957SLisandro Dalcin ierr = PetscSynchronizedPrintf(((PetscObject)A)->comm," [%d] %g \n",lu->myid,lu->id.RINFO(2));CHKERRQ(ierr); 11077adad957SLisandro Dalcin ierr = PetscSynchronizedFlush(((PetscObject)A)->comm); 1108f6c57405SHong Zhang if (!lu->myid) {ierr = PetscPrintf(PETSC_COMM_SELF, " RINFO(3) (local estimated flops for the elimination after factorization): \n");CHKERRQ(ierr);} 11097adad957SLisandro Dalcin ierr = PetscSynchronizedPrintf(((PetscObject)A)->comm," [%d] %g \n",lu->myid,lu->id.RINFO(3));CHKERRQ(ierr); 11107adad957SLisandro Dalcin ierr = PetscSynchronizedFlush(((PetscObject)A)->comm); 1111f6c57405SHong Zhang 1112f6c57405SHong Zhang if (!lu->myid) {ierr = PetscPrintf(PETSC_COMM_SELF, " INFO(15) (estimated size of (in MB) MUMPS internal data for running numerical factorization): \n");CHKERRQ(ierr);} 11137adad957SLisandro Dalcin ierr = PetscSynchronizedPrintf(((PetscObject)A)->comm," [%d] %d \n",lu->myid,lu->id.INFO(15));CHKERRQ(ierr); 11147adad957SLisandro Dalcin ierr = PetscSynchronizedFlush(((PetscObject)A)->comm); 1115f6c57405SHong Zhang 1116f6c57405SHong Zhang if (!lu->myid) {ierr = PetscPrintf(PETSC_COMM_SELF, " INFO(16) (size of (in MB) MUMPS internal data used during numerical factorization): \n");CHKERRQ(ierr);} 11177adad957SLisandro Dalcin ierr = PetscSynchronizedPrintf(((PetscObject)A)->comm," [%d] %d \n",lu->myid,lu->id.INFO(16));CHKERRQ(ierr); 11187adad957SLisandro Dalcin ierr = PetscSynchronizedFlush(((PetscObject)A)->comm); 1119f6c57405SHong Zhang 1120f6c57405SHong Zhang if (!lu->myid) {ierr = PetscPrintf(PETSC_COMM_SELF, " INFO(23) (num of pivots eliminated on this processor after factorization): \n");CHKERRQ(ierr);} 11217adad957SLisandro Dalcin ierr = PetscSynchronizedPrintf(((PetscObject)A)->comm," [%d] %d \n",lu->myid,lu->id.INFO(23));CHKERRQ(ierr); 11227adad957SLisandro Dalcin ierr = PetscSynchronizedFlush(((PetscObject)A)->comm); 1123f6c57405SHong Zhang 1124f6c57405SHong Zhang if (!lu->myid){ /* information from the host */ 1125f6c57405SHong Zhang ierr = PetscViewerASCIIPrintf(viewer," RINFOG(1) (global estimated flops for the elimination after analysis): %g \n",lu->id.RINFOG(1));CHKERRQ(ierr); 1126f6c57405SHong Zhang ierr = PetscViewerASCIIPrintf(viewer," RINFOG(2) (global estimated flops for the assembly after factorization): %g \n",lu->id.RINFOG(2));CHKERRQ(ierr); 1127f6c57405SHong Zhang ierr = PetscViewerASCIIPrintf(viewer," RINFOG(3) (global estimated flops for the elimination after factorization): %g \n",lu->id.RINFOG(3));CHKERRQ(ierr); 1128f6c57405SHong Zhang 1129f6c57405SHong Zhang ierr = PetscViewerASCIIPrintf(viewer," INFOG(3) (estimated real workspace for factors on all processors after analysis): %d \n",lu->id.INFOG(3));CHKERRQ(ierr); 1130f6c57405SHong Zhang ierr = PetscViewerASCIIPrintf(viewer," INFOG(4) (estimated integer workspace for factors on all processors after analysis): %d \n",lu->id.INFOG(4));CHKERRQ(ierr); 1131f6c57405SHong Zhang ierr = PetscViewerASCIIPrintf(viewer," INFOG(5) (estimated maximum front size in the complete tree): %d \n",lu->id.INFOG(5));CHKERRQ(ierr); 1132f6c57405SHong Zhang ierr = PetscViewerASCIIPrintf(viewer," INFOG(6) (number of nodes in the complete tree): %d \n",lu->id.INFOG(6));CHKERRQ(ierr); 1133f6c57405SHong Zhang ierr = PetscViewerASCIIPrintf(viewer," INFOG(7) (ordering option effectively uese after analysis): %d \n",lu->id.INFOG(7));CHKERRQ(ierr); 1134f6c57405SHong Zhang ierr = PetscViewerASCIIPrintf(viewer," INFOG(8) (structural symmetry in percent of the permuted matrix after analysis): %d \n",lu->id.INFOG(8));CHKERRQ(ierr); 1135f6c57405SHong 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); 1136f6c57405SHong Zhang ierr = PetscViewerASCIIPrintf(viewer," INFOG(10) (total integer space store the matrix factors after factorization): %d \n",lu->id.INFOG(10));CHKERRQ(ierr); 1137f6c57405SHong Zhang ierr = PetscViewerASCIIPrintf(viewer," INFOG(11) (order of largest frontal matrix after factorization): %d \n",lu->id.INFOG(11));CHKERRQ(ierr); 1138f6c57405SHong Zhang ierr = PetscViewerASCIIPrintf(viewer," INFOG(12) (number of off-diagonal pivots): %d \n",lu->id.INFOG(12));CHKERRQ(ierr); 1139f6c57405SHong Zhang ierr = PetscViewerASCIIPrintf(viewer," INFOG(13) (number of delayed pivots after factorization): %d \n",lu->id.INFOG(13));CHKERRQ(ierr); 1140f6c57405SHong Zhang ierr = PetscViewerASCIIPrintf(viewer," INFOG(14) (number of memory compress after factorization): %d \n",lu->id.INFOG(14));CHKERRQ(ierr); 1141f6c57405SHong Zhang ierr = PetscViewerASCIIPrintf(viewer," INFOG(15) (number of steps of iterative refinement after solution): %d \n",lu->id.INFOG(15));CHKERRQ(ierr); 1142f6c57405SHong 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); 1143f6c57405SHong 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); 1144f6c57405SHong 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); 1145f6c57405SHong 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); 1146f6c57405SHong Zhang ierr = PetscViewerASCIIPrintf(viewer," INFOG(20) (estimated number of entries in the factors): %d \n",lu->id.INFOG(20));CHKERRQ(ierr); 1147f6c57405SHong 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); 1148f6c57405SHong 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); 1149f6c57405SHong Zhang ierr = PetscViewerASCIIPrintf(viewer," INFOG(23) (after analysis: value of ICNTL(6) effectively used): %d \n",lu->id.INFOG(23));CHKERRQ(ierr); 1150f6c57405SHong Zhang ierr = PetscViewerASCIIPrintf(viewer," INFOG(24) (after analysis: value of ICNTL(12) effectively used): %d \n",lu->id.INFOG(24));CHKERRQ(ierr); 1151f6c57405SHong Zhang ierr = PetscViewerASCIIPrintf(viewer," INFOG(25) (after factorization: number of pivots modified by static pivoting): %d \n",lu->id.INFOG(25));CHKERRQ(ierr); 1152f6c57405SHong Zhang } 1153f6c57405SHong Zhang PetscFunctionReturn(0); 1154f6c57405SHong Zhang } 1155f6c57405SHong Zhang 1156f6c57405SHong Zhang #undef __FUNCT__ 1157f6c57405SHong Zhang #define __FUNCT__ "MatView_MUMPS" 1158b24902e0SBarry Smith PetscErrorCode MatView_MUMPS(Mat A,PetscViewer viewer) 1159b24902e0SBarry Smith { 1160f6c57405SHong Zhang PetscErrorCode ierr; 1161f6c57405SHong Zhang PetscTruth iascii; 1162f6c57405SHong Zhang PetscViewerFormat format; 1163cb828f0fSHong Zhang Mat_MUMPS *mumps=(Mat_MUMPS*)A->spptr; 1164f6c57405SHong Zhang 1165f6c57405SHong Zhang PetscFunctionBegin; 1166cb828f0fSHong Zhang /* check if matrix is mumps type */ 1167cb828f0fSHong Zhang if (A->ops->solve != MatSolve_MUMPS) PetscFunctionReturn(0); 1168cb828f0fSHong Zhang 1169f6c57405SHong Zhang ierr = PetscTypeCompare((PetscObject)viewer,PETSC_VIEWER_ASCII,&iascii);CHKERRQ(ierr); 1170f6c57405SHong Zhang if (iascii) { 1171f6c57405SHong Zhang ierr = PetscViewerGetFormat(viewer,&format);CHKERRQ(ierr); 1172cb828f0fSHong Zhang if (format == PETSC_VIEWER_ASCII_INFO || mumps->mumpsview){ 1173cb828f0fSHong Zhang ierr = PetscViewerASCIIPrintf(viewer,"MUMPS run parameters:\n");CHKERRQ(ierr); 1174cb828f0fSHong Zhang ierr = PetscViewerASCIIPrintf(viewer," SYM (matrix type): %d \n",mumps->id.sym);CHKERRQ(ierr); 1175cb828f0fSHong Zhang ierr = PetscViewerASCIIPrintf(viewer," PAR (host participation): %d \n",mumps->id.par);CHKERRQ(ierr); 1176cb828f0fSHong Zhang if (mumps->mumpsview){ /* View all MUMPS parameters */ 1177f6c57405SHong Zhang ierr = MatFactorInfo_MUMPS(A,viewer);CHKERRQ(ierr); 1178f6c57405SHong Zhang } 1179f6c57405SHong Zhang } 1180cb828f0fSHong Zhang } 1181f6c57405SHong Zhang PetscFunctionReturn(0); 1182f6c57405SHong Zhang } 1183f6c57405SHong Zhang 118435bd34faSBarry Smith #undef __FUNCT__ 118535bd34faSBarry Smith #define __FUNCT__ "MatGetInfo_MUMPS" 118635bd34faSBarry Smith PetscErrorCode MatGetInfo_MUMPS(Mat A,MatInfoType flag,MatInfo *info) 118735bd34faSBarry Smith { 1188cb828f0fSHong Zhang Mat_MUMPS *mumps =(Mat_MUMPS*)A->spptr; 118935bd34faSBarry Smith 119035bd34faSBarry Smith PetscFunctionBegin; 119135bd34faSBarry Smith info->block_size = 1.0; 1192cb828f0fSHong Zhang info->nz_allocated = mumps->id.INFOG(20); 1193cb828f0fSHong Zhang info->nz_used = mumps->id.INFOG(20); 119435bd34faSBarry Smith info->nz_unneeded = 0.0; 119535bd34faSBarry Smith info->assemblies = 0.0; 119635bd34faSBarry Smith info->mallocs = 0.0; 119735bd34faSBarry Smith info->memory = 0.0; 119835bd34faSBarry Smith info->fill_ratio_given = 0; 119935bd34faSBarry Smith info->fill_ratio_needed = 0; 120035bd34faSBarry Smith info->factor_mallocs = 0; 120135bd34faSBarry Smith PetscFunctionReturn(0); 120235bd34faSBarry Smith } 120335bd34faSBarry Smith 120424b6179bSKris Buschelman /*MC 120541c8de11SBarry Smith MAT_SOLVER_MUMPS - A matrix type providing direct solvers (LU and Cholesky) for 120624b6179bSKris Buschelman distributed and sequential matrices via the external package MUMPS. 120724b6179bSKris Buschelman 120841c8de11SBarry Smith Works with MATAIJ and MATSBAIJ matrices 120924b6179bSKris Buschelman 121024b6179bSKris Buschelman Options Database Keys: 121141c8de11SBarry Smith + -mat_mumps_sym <0,1,2> - 0 the matrix is unsymmetric, 1 symmetric positive definite, 2 symmetric 121224b6179bSKris Buschelman . -mat_mumps_icntl_4 <0,...,4> - print level 121324b6179bSKris Buschelman . -mat_mumps_icntl_6 <0,...,7> - matrix prescaling options (see MUMPS User's Guide) 121424b6179bSKris Buschelman . -mat_mumps_icntl_7 <0,...,7> - matrix orderings (see MUMPS User's Guide) 121524b6179bSKris Buschelman . -mat_mumps_icntl_9 <1,2> - A or A^T x=b to be solved: 1 denotes A, 2 denotes A^T 121624b6179bSKris Buschelman . -mat_mumps_icntl_10 <n> - maximum number of iterative refinements 121794b7f48cSBarry Smith . -mat_mumps_icntl_11 <n> - error analysis, a positive value returns statistics during -ksp_view 121824b6179bSKris Buschelman . -mat_mumps_icntl_12 <n> - efficiency control (see MUMPS User's Guide) 121924b6179bSKris Buschelman . -mat_mumps_icntl_13 <n> - efficiency control (see MUMPS User's Guide) 122024b6179bSKris Buschelman . -mat_mumps_icntl_14 <n> - efficiency control (see MUMPS User's Guide) 122124b6179bSKris Buschelman . -mat_mumps_icntl_15 <n> - efficiency control (see MUMPS User's Guide) 122224b6179bSKris Buschelman . -mat_mumps_cntl_1 <delta> - relative pivoting threshold 122324b6179bSKris Buschelman . -mat_mumps_cntl_2 <tol> - stopping criterion for refinement 122424b6179bSKris Buschelman - -mat_mumps_cntl_3 <adelta> - absolute pivoting threshold 122524b6179bSKris Buschelman 122624b6179bSKris Buschelman Level: beginner 122724b6179bSKris Buschelman 122841c8de11SBarry Smith .seealso: PCFactorSetMatSolverPackage(), MatSolverPackage 122941c8de11SBarry Smith 123024b6179bSKris Buschelman M*/ 123124b6179bSKris Buschelman 12322877fffaSHong Zhang EXTERN_C_BEGIN 123335bd34faSBarry Smith #undef __FUNCT__ 123435bd34faSBarry Smith #define __FUNCT__ "MatFactorGetSolverPackage_mumps" 123535bd34faSBarry Smith PetscErrorCode MatFactorGetSolverPackage_mumps(Mat A,const MatSolverPackage *type) 123635bd34faSBarry Smith { 123735bd34faSBarry Smith PetscFunctionBegin; 123835bd34faSBarry Smith *type = MAT_SOLVER_MUMPS; 123935bd34faSBarry Smith PetscFunctionReturn(0); 124035bd34faSBarry Smith } 124135bd34faSBarry Smith EXTERN_C_END 124235bd34faSBarry Smith 124335bd34faSBarry Smith EXTERN_C_BEGIN 12442877fffaSHong Zhang /* 12452877fffaSHong Zhang The seq and mpi versions of this function are the same 12462877fffaSHong Zhang */ 12472877fffaSHong Zhang #undef __FUNCT__ 12482877fffaSHong Zhang #define __FUNCT__ "MatGetFactor_seqaij_mumps" 12492877fffaSHong Zhang PetscErrorCode MatGetFactor_seqaij_mumps(Mat A,MatFactorType ftype,Mat *F) 12502877fffaSHong Zhang { 12512877fffaSHong Zhang Mat B; 12522877fffaSHong Zhang PetscErrorCode ierr; 12532877fffaSHong Zhang Mat_MUMPS *mumps; 12542877fffaSHong Zhang 12552877fffaSHong Zhang PetscFunctionBegin; 12562877fffaSHong Zhang /* Create the factorization matrix */ 12572877fffaSHong Zhang ierr = MatCreate(((PetscObject)A)->comm,&B);CHKERRQ(ierr); 12582877fffaSHong Zhang ierr = MatSetSizes(B,A->rmap->n,A->cmap->n,A->rmap->N,A->cmap->N);CHKERRQ(ierr); 12592877fffaSHong Zhang ierr = MatSetType(B,((PetscObject)A)->type_name);CHKERRQ(ierr); 12602877fffaSHong Zhang ierr = MatSeqAIJSetPreallocation(B,0,PETSC_NULL);CHKERRQ(ierr); 12612877fffaSHong Zhang 126216ebf90aSShri Abhyankar ierr = PetscNewLog(B,Mat_MUMPS,&mumps);CHKERRQ(ierr); 12632877fffaSHong Zhang B->ops->view = MatView_MUMPS; 126435bd34faSBarry Smith B->ops->getinfo = MatGetInfo_MUMPS; 126535bd34faSBarry Smith ierr = PetscObjectComposeFunctionDynamic((PetscObject)B,"MatFactorGetSolverPackage_C","MatFactorGetSolverPackage_mumps",MatFactorGetSolverPackage_mumps);CHKERRQ(ierr); 126697969023SHong Zhang ierr = PetscObjectComposeFunctionDynamic((PetscObject)B,"MatMumpsSetIcntl_C","MatMumpsSetIcntl",MatMumpsSetIcntl);CHKERRQ(ierr); 1267450b117fSShri Abhyankar if (ftype == MAT_FACTOR_LU) { 1268450b117fSShri Abhyankar B->ops->lufactorsymbolic = MatLUFactorSymbolic_AIJMUMPS; 1269d5f3da31SBarry Smith B->factortype = MAT_FACTOR_LU; 127016ebf90aSShri Abhyankar mumps->ConvertToTriples = MatConvertToTriples_seqaij_seqaij; 1271dcd589f8SShri Abhyankar } else { 1272*67877ebaSShri Abhyankar B->ops->choleskyfactorsymbolic = MatCholeskyFactorSymbolic_MUMPS; 1273450b117fSShri Abhyankar B->factortype = MAT_FACTOR_CHOLESKY; 127416ebf90aSShri Abhyankar mumps->ConvertToTriples = MatConvertToTriples_seqaij_seqsbaij; 1275450b117fSShri Abhyankar } 12762877fffaSHong Zhang 12772877fffaSHong Zhang mumps->CleanUpMUMPS = PETSC_FALSE; 12782877fffaSHong Zhang mumps->isAIJ = PETSC_TRUE; 12792877fffaSHong Zhang mumps->scat_rhs = PETSC_NULL; 12802877fffaSHong Zhang mumps->scat_sol = PETSC_NULL; 12812877fffaSHong Zhang mumps->nSolve = 0; 12822877fffaSHong Zhang mumps->MatDestroy = B->ops->destroy; 12832877fffaSHong Zhang B->ops->destroy = MatDestroy_MUMPS; 12842877fffaSHong Zhang B->spptr = (void*)mumps; 12852877fffaSHong Zhang 12862877fffaSHong Zhang *F = B; 12872877fffaSHong Zhang PetscFunctionReturn(0); 12882877fffaSHong Zhang } 12892877fffaSHong Zhang EXTERN_C_END 12902877fffaSHong Zhang 12912877fffaSHong Zhang EXTERN_C_BEGIN 12922877fffaSHong Zhang #undef __FUNCT__ 12932877fffaSHong Zhang #define __FUNCT__ "MatGetFactor_seqsbaij_mumps" 12942877fffaSHong Zhang PetscErrorCode MatGetFactor_seqsbaij_mumps(Mat A,MatFactorType ftype,Mat *F) 12952877fffaSHong Zhang { 12962877fffaSHong Zhang Mat B; 12972877fffaSHong Zhang PetscErrorCode ierr; 12982877fffaSHong Zhang Mat_MUMPS *mumps; 12992877fffaSHong Zhang 13002877fffaSHong Zhang PetscFunctionBegin; 1301e7e72b3dSBarry Smith if (ftype != MAT_FACTOR_CHOLESKY) SETERRQ(((PetscObject)A)->comm,PETSC_ERR_SUP,"Cannot use PETSc SBAIJ matrices with MUMPS LU, use AIJ matrix"); 13022877fffaSHong Zhang /* Create the factorization matrix */ 13032877fffaSHong Zhang ierr = MatCreate(((PetscObject)A)->comm,&B);CHKERRQ(ierr); 13042877fffaSHong Zhang ierr = MatSetSizes(B,A->rmap->n,A->cmap->n,A->rmap->N,A->cmap->N);CHKERRQ(ierr); 13052877fffaSHong Zhang ierr = MatSetType(B,((PetscObject)A)->type_name);CHKERRQ(ierr); 13062877fffaSHong Zhang ierr = MatSeqSBAIJSetPreallocation(B,1,0,PETSC_NULL);CHKERRQ(ierr); 13072877fffaSHong Zhang ierr = MatMPISBAIJSetPreallocation(B,1,0,PETSC_NULL,0,PETSC_NULL);CHKERRQ(ierr); 13082877fffaSHong Zhang 130916ebf90aSShri Abhyankar ierr = PetscNewLog(B,Mat_MUMPS,&mumps);CHKERRQ(ierr); 1310*67877ebaSShri Abhyankar B->ops->choleskyfactorsymbolic = MatCholeskyFactorSymbolic_MUMPS; 13112877fffaSHong Zhang B->ops->view = MatView_MUMPS; 131235bd34faSBarry Smith ierr = PetscObjectComposeFunctionDynamic((PetscObject)B,"MatFactorGetSolverPackage_C","MatFactorGetSolverPackage_mumps",MatFactorGetSolverPackage_mumps);CHKERRQ(ierr); 131397969023SHong Zhang ierr = PetscObjectComposeFunctionDynamic((PetscObject)B,"MatMumpsSetIcntl_C","MatMumpsSetIcntl",MatMumpsSetIcntl);CHKERRQ(ierr); 1314d5f3da31SBarry Smith B->factortype = MAT_FACTOR_CHOLESKY; 13152877fffaSHong Zhang 131616ebf90aSShri Abhyankar mumps->ConvertToTriples = MatConvertToTriples_seqsbaij_seqsbaij; 13172877fffaSHong Zhang mumps->CleanUpMUMPS = PETSC_FALSE; 1318450b117fSShri Abhyankar mumps->isAIJ = PETSC_FALSE; 13192877fffaSHong Zhang mumps->scat_rhs = PETSC_NULL; 13202877fffaSHong Zhang mumps->scat_sol = PETSC_NULL; 13212877fffaSHong Zhang mumps->nSolve = 0; 13222877fffaSHong Zhang mumps->MatDestroy = B->ops->destroy; 13232877fffaSHong Zhang B->ops->destroy = MatDestroy_MUMPS; 13242877fffaSHong Zhang B->spptr = (void*)mumps; 1325f3c0ef26SHong Zhang 13262877fffaSHong Zhang *F = B; 13272877fffaSHong Zhang PetscFunctionReturn(0); 13282877fffaSHong Zhang } 13292877fffaSHong Zhang EXTERN_C_END 13302877fffaSHong Zhang 13312877fffaSHong Zhang EXTERN_C_BEGIN 13322877fffaSHong Zhang #undef __FUNCT__ 13332877fffaSHong Zhang #define __FUNCT__ "MatGetFactor_mpisbaij_mumps" 13342877fffaSHong Zhang PetscErrorCode MatGetFactor_mpisbaij_mumps(Mat A,MatFactorType ftype,Mat *F) 13352877fffaSHong Zhang { 13362877fffaSHong Zhang Mat B; 13372877fffaSHong Zhang PetscErrorCode ierr; 13382877fffaSHong Zhang Mat_MUMPS *mumps; 13392877fffaSHong Zhang 13402877fffaSHong Zhang PetscFunctionBegin; 1341e7e72b3dSBarry Smith if (ftype != MAT_FACTOR_CHOLESKY) SETERRQ(((PetscObject)A)->comm,PETSC_ERR_SUP,"Cannot use PETSc SBAIJ matrices with MUMPS LU, use AIJ matrix"); 13422877fffaSHong Zhang /* Create the factorization matrix */ 13432877fffaSHong Zhang ierr = MatCreate(((PetscObject)A)->comm,&B);CHKERRQ(ierr); 13442877fffaSHong Zhang ierr = MatSetSizes(B,A->rmap->n,A->cmap->n,A->rmap->N,A->cmap->N);CHKERRQ(ierr); 13452877fffaSHong Zhang ierr = MatSetType(B,((PetscObject)A)->type_name);CHKERRQ(ierr); 13462877fffaSHong Zhang ierr = MatSeqSBAIJSetPreallocation(B,1,0,PETSC_NULL);CHKERRQ(ierr); 13472877fffaSHong Zhang ierr = MatMPISBAIJSetPreallocation(B,1,0,PETSC_NULL,0,PETSC_NULL);CHKERRQ(ierr); 13482877fffaSHong Zhang 1349*67877ebaSShri Abhyankar B->ops->choleskyfactorsymbolic = MatCholeskyFactorSymbolic_MUMPS; 13502877fffaSHong Zhang B->ops->view = MatView_MUMPS; 135135bd34faSBarry Smith ierr = PetscObjectComposeFunctionDynamic((PetscObject)B,"MatFactorGetSolverPackage_C","MatFactorGetSolverPackage_mumps",MatFactorGetSolverPackage_mumps);CHKERRQ(ierr); 135297969023SHong Zhang ierr = PetscObjectComposeFunctionDynamic((PetscObject)B,"MatMumpsSetIcntl_C","MatMumpsSetIcntl",MatMumpsSetIcntl);CHKERRQ(ierr); 1353d5f3da31SBarry Smith B->factortype = MAT_FACTOR_CHOLESKY; 13542877fffaSHong Zhang 13552877fffaSHong Zhang ierr = PetscNewLog(B,Mat_MUMPS,&mumps);CHKERRQ(ierr); 135616ebf90aSShri Abhyankar mumps->ConvertToTriples = MatConvertToTriples_mpisbaij_mpisbaij; 13572877fffaSHong Zhang mumps->CleanUpMUMPS = PETSC_FALSE; 1358a214ac2aSShri Abhyankar mumps->isAIJ = PETSC_FALSE; 1359a214ac2aSShri Abhyankar mumps->scat_rhs = PETSC_NULL; 1360a214ac2aSShri Abhyankar mumps->scat_sol = PETSC_NULL; 1361a214ac2aSShri Abhyankar mumps->nSolve = 0; 1362a214ac2aSShri Abhyankar mumps->MatDestroy = B->ops->destroy; 1363a214ac2aSShri Abhyankar B->ops->destroy = MatDestroy_MUMPS; 1364a214ac2aSShri Abhyankar B->spptr = (void*)mumps; 1365a214ac2aSShri Abhyankar 1366a214ac2aSShri Abhyankar *F = B; 1367a214ac2aSShri Abhyankar PetscFunctionReturn(0); 1368a214ac2aSShri Abhyankar } 1369a214ac2aSShri Abhyankar EXTERN_C_END 1370a214ac2aSShri Abhyankar 1371a214ac2aSShri Abhyankar EXTERN_C_BEGIN 1372a214ac2aSShri Abhyankar #undef __FUNCT__ 1373a214ac2aSShri Abhyankar #define __FUNCT__ "MatGetFactor_mpiaij_mumps" 1374a214ac2aSShri Abhyankar PetscErrorCode MatGetFactor_mpiaij_mumps(Mat A,MatFactorType ftype,Mat *F) 1375a214ac2aSShri Abhyankar { 1376a214ac2aSShri Abhyankar Mat B; 1377a214ac2aSShri Abhyankar PetscErrorCode ierr; 1378a214ac2aSShri Abhyankar Mat_MUMPS *mumps; 1379a214ac2aSShri Abhyankar 1380a214ac2aSShri Abhyankar PetscFunctionBegin; 1381a214ac2aSShri Abhyankar /* Create the factorization matrix */ 1382a214ac2aSShri Abhyankar ierr = MatCreate(((PetscObject)A)->comm,&B);CHKERRQ(ierr); 1383a214ac2aSShri Abhyankar ierr = MatSetSizes(B,A->rmap->n,A->cmap->n,A->rmap->N,A->cmap->N);CHKERRQ(ierr); 1384a214ac2aSShri Abhyankar ierr = MatSetType(B,((PetscObject)A)->type_name);CHKERRQ(ierr); 1385a214ac2aSShri Abhyankar ierr = MatSeqAIJSetPreallocation(B,0,PETSC_NULL);CHKERRQ(ierr); 1386a214ac2aSShri Abhyankar ierr = MatMPIAIJSetPreallocation(B,0,PETSC_NULL,0,PETSC_NULL);CHKERRQ(ierr); 1387a214ac2aSShri Abhyankar 138816ebf90aSShri Abhyankar ierr = PetscNewLog(B,Mat_MUMPS,&mumps);CHKERRQ(ierr); 138916ebf90aSShri Abhyankar 1390a214ac2aSShri Abhyankar if (ftype == MAT_FACTOR_LU) { 1391a214ac2aSShri Abhyankar B->ops->lufactorsymbolic = MatLUFactorSymbolic_AIJMUMPS; 1392f4762488SHong Zhang B->factortype = MAT_FACTOR_LU; 139316ebf90aSShri Abhyankar mumps->ConvertToTriples = MatConvertToTriples_mpiaij_mpiaij; 1394dcd589f8SShri Abhyankar } else { 1395*67877ebaSShri Abhyankar B->ops->choleskyfactorsymbolic = MatCholeskyFactorSymbolic_MUMPS; 1396f4762488SHong Zhang B->factortype = MAT_FACTOR_CHOLESKY; 139716ebf90aSShri Abhyankar mumps->ConvertToTriples = MatConvertToTriples_mpiaij_mpisbaij; 1398450b117fSShri Abhyankar } 1399a214ac2aSShri Abhyankar 1400a214ac2aSShri Abhyankar B->ops->view = MatView_MUMPS; 1401a214ac2aSShri Abhyankar ierr = PetscObjectComposeFunctionDynamic((PetscObject)B,"MatFactorGetSolverPackage_C","MatFactorGetSolverPackage_mumps",MatFactorGetSolverPackage_mumps);CHKERRQ(ierr); 1402a214ac2aSShri Abhyankar ierr = PetscObjectComposeFunctionDynamic((PetscObject)B,"MatMumpsSetIcntl_C","MatMumpsSetIcntl",MatMumpsSetIcntl);CHKERRQ(ierr); 1403a214ac2aSShri Abhyankar 1404a214ac2aSShri Abhyankar mumps->CleanUpMUMPS = PETSC_FALSE; 14052877fffaSHong Zhang mumps->isAIJ = PETSC_TRUE; 14062877fffaSHong Zhang mumps->scat_rhs = PETSC_NULL; 14072877fffaSHong Zhang mumps->scat_sol = PETSC_NULL; 14082877fffaSHong Zhang mumps->nSolve = 0; 1409f3c0ef26SHong Zhang mumps->MatDestroy = B->ops->destroy; 1410f3c0ef26SHong Zhang B->ops->destroy = MatDestroy_MUMPS; 14112877fffaSHong Zhang B->spptr = (void*)mumps; 1412f3c0ef26SHong Zhang 14132877fffaSHong Zhang *F = B; 14142877fffaSHong Zhang PetscFunctionReturn(0); 14152877fffaSHong Zhang } 14162877fffaSHong Zhang EXTERN_C_END 141797969023SHong Zhang 1418450b117fSShri Abhyankar EXTERN_C_BEGIN 1419450b117fSShri Abhyankar #undef __FUNCT__ 1420*67877ebaSShri Abhyankar #define __FUNCT__ "MatGetFactor_seqbaij_mumps" 1421*67877ebaSShri Abhyankar PetscErrorCode MatGetFactor_seqbaij_mumps(Mat A,MatFactorType ftype,Mat *F) 1422*67877ebaSShri Abhyankar { 1423*67877ebaSShri Abhyankar Mat B; 1424*67877ebaSShri Abhyankar PetscErrorCode ierr; 1425*67877ebaSShri Abhyankar Mat_MUMPS *mumps; 1426*67877ebaSShri Abhyankar 1427*67877ebaSShri Abhyankar PetscFunctionBegin; 1428*67877ebaSShri Abhyankar /* Create the factorization matrix */ 1429*67877ebaSShri Abhyankar ierr = MatCreate(((PetscObject)A)->comm,&B);CHKERRQ(ierr); 1430*67877ebaSShri Abhyankar ierr = MatSetSizes(B,A->rmap->n,A->cmap->n,A->rmap->N,A->cmap->N);CHKERRQ(ierr); 1431*67877ebaSShri Abhyankar ierr = MatSetType(B,((PetscObject)A)->type_name);CHKERRQ(ierr); 1432*67877ebaSShri Abhyankar ierr = MatSeqBAIJSetPreallocation(B,A->rmap->bs,0,PETSC_NULL);CHKERRQ(ierr); 1433*67877ebaSShri Abhyankar 1434*67877ebaSShri Abhyankar ierr = PetscNewLog(B,Mat_MUMPS,&mumps);CHKERRQ(ierr); 1435*67877ebaSShri Abhyankar if (ftype == MAT_FACTOR_LU) { 1436*67877ebaSShri Abhyankar B->ops->lufactorsymbolic = MatLUFactorSymbolic_BAIJMUMPS; 1437*67877ebaSShri Abhyankar B->factortype = MAT_FACTOR_LU; 1438*67877ebaSShri Abhyankar mumps->ConvertToTriples = MatConvertToTriples_seqbaij_seqaij; 1439*67877ebaSShri Abhyankar } 1440*67877ebaSShri Abhyankar else SETERRQ(PETSC_COMM_SELF,PETSC_ERR_SUP,"Cholesky factorization for BAIJ matrices not supported, use AIJ matrix instead\n"); 1441*67877ebaSShri Abhyankar 1442*67877ebaSShri Abhyankar B->ops->view = MatView_MUMPS; 1443*67877ebaSShri Abhyankar ierr = PetscObjectComposeFunctionDynamic((PetscObject)B,"MatFactorGetSolverPackage_C","MatFactorGetSolverPackage_mumps",MatFactorGetSolverPackage_mumps);CHKERRQ(ierr); 1444*67877ebaSShri Abhyankar ierr = PetscObjectComposeFunctionDynamic((PetscObject)B,"MatMumpsSetIcntl_C","MatMumpsSetIcntl",MatMumpsSetIcntl);CHKERRQ(ierr); 1445*67877ebaSShri Abhyankar 1446*67877ebaSShri Abhyankar mumps->CleanUpMUMPS = PETSC_FALSE; 1447*67877ebaSShri Abhyankar mumps->isAIJ = PETSC_TRUE; 1448*67877ebaSShri Abhyankar mumps->scat_rhs = PETSC_NULL; 1449*67877ebaSShri Abhyankar mumps->scat_sol = PETSC_NULL; 1450*67877ebaSShri Abhyankar mumps->nSolve = 0; 1451*67877ebaSShri Abhyankar mumps->MatDestroy = B->ops->destroy; 1452*67877ebaSShri Abhyankar B->ops->destroy = MatDestroy_MUMPS; 1453*67877ebaSShri Abhyankar B->spptr = (void*)mumps; 1454*67877ebaSShri Abhyankar 1455*67877ebaSShri Abhyankar *F = B; 1456*67877ebaSShri Abhyankar PetscFunctionReturn(0); 1457*67877ebaSShri Abhyankar } 1458*67877ebaSShri Abhyankar EXTERN_C_END 1459*67877ebaSShri Abhyankar 1460*67877ebaSShri Abhyankar EXTERN_C_BEGIN 1461*67877ebaSShri Abhyankar #undef __FUNCT__ 1462450b117fSShri Abhyankar #define __FUNCT__ "MatGetFactor_mpibaij_mumps" 1463450b117fSShri Abhyankar PetscErrorCode MatGetFactor_mpibaij_mumps(Mat A,MatFactorType ftype,Mat *F) 1464450b117fSShri Abhyankar { 1465450b117fSShri Abhyankar Mat B; 1466450b117fSShri Abhyankar PetscErrorCode ierr; 1467450b117fSShri Abhyankar Mat_MUMPS *mumps; 1468450b117fSShri Abhyankar 1469450b117fSShri Abhyankar PetscFunctionBegin; 1470450b117fSShri Abhyankar /* Create the factorization matrix */ 1471450b117fSShri Abhyankar ierr = MatCreate(((PetscObject)A)->comm,&B);CHKERRQ(ierr); 1472450b117fSShri Abhyankar ierr = MatSetSizes(B,A->rmap->n,A->cmap->n,A->rmap->N,A->cmap->N);CHKERRQ(ierr); 1473450b117fSShri Abhyankar ierr = MatSetType(B,((PetscObject)A)->type_name);CHKERRQ(ierr); 1474*67877ebaSShri Abhyankar ierr = MatMPIBAIJSetPreallocation(B,A->rmap->bs,0,PETSC_NULL,0,PETSC_NULL);CHKERRQ(ierr); 1475450b117fSShri Abhyankar 1476*67877ebaSShri Abhyankar ierr = PetscNewLog(B,Mat_MUMPS,&mumps);CHKERRQ(ierr); 1477450b117fSShri Abhyankar if (ftype == MAT_FACTOR_LU) { 1478450b117fSShri Abhyankar B->ops->lufactorsymbolic = MatLUFactorSymbolic_BAIJMUMPS; 1479450b117fSShri Abhyankar B->factortype = MAT_FACTOR_LU; 1480*67877ebaSShri Abhyankar mumps->ConvertToTriples = MatConvertToTriples_mpibaij_mpiaij; 1481450b117fSShri Abhyankar } 1482*67877ebaSShri Abhyankar else SETERRQ(PETSC_COMM_SELF,PETSC_ERR_SUP,"Cholesky factorization for BAIJ matrices not supported, use AIJ matrix instead\n"); 1483450b117fSShri Abhyankar B->ops->view = MatView_MUMPS; 1484450b117fSShri Abhyankar ierr = PetscObjectComposeFunctionDynamic((PetscObject)B,"MatFactorGetSolverPackage_C","MatFactorGetSolverPackage_mumps",MatFactorGetSolverPackage_mumps);CHKERRQ(ierr); 1485450b117fSShri Abhyankar ierr = PetscObjectComposeFunctionDynamic((PetscObject)B,"MatMumpsSetIcntl_C","MatMumpsSetIcntl",MatMumpsSetIcntl);CHKERRQ(ierr); 1486450b117fSShri Abhyankar 1487450b117fSShri Abhyankar mumps->CleanUpMUMPS = PETSC_FALSE; 1488450b117fSShri Abhyankar mumps->isAIJ = PETSC_TRUE; 1489450b117fSShri Abhyankar mumps->scat_rhs = PETSC_NULL; 1490450b117fSShri Abhyankar mumps->scat_sol = PETSC_NULL; 1491450b117fSShri Abhyankar mumps->nSolve = 0; 1492450b117fSShri Abhyankar mumps->MatDestroy = B->ops->destroy; 1493450b117fSShri Abhyankar B->ops->destroy = MatDestroy_MUMPS; 1494450b117fSShri Abhyankar B->spptr = (void*)mumps; 1495450b117fSShri Abhyankar 1496450b117fSShri Abhyankar *F = B; 1497450b117fSShri Abhyankar PetscFunctionReturn(0); 1498450b117fSShri Abhyankar } 1499450b117fSShri Abhyankar EXTERN_C_END 1500a214ac2aSShri Abhyankar 150161288eaaSHong Zhang /* -------------------------------------------------------------------------------------------*/ 150261288eaaSHong Zhang /*@ 150361288eaaSHong Zhang MatMumpsSetIcntl - Set MUMPS parameter ICNTL() 150461288eaaSHong Zhang 150561288eaaSHong Zhang Collective on Mat 150661288eaaSHong Zhang 150761288eaaSHong Zhang Input Parameters: 150861288eaaSHong Zhang + F - the factored matrix obtained by calling MatGetFactor() from PETSc-MUMPS interface 150961288eaaSHong Zhang . idx - index of MUMPS parameter array ICNTL() 151061288eaaSHong Zhang - icntl - value of MUMPS ICNTL(imumps) 151161288eaaSHong Zhang 151261288eaaSHong Zhang Options Database: 151361288eaaSHong Zhang . -mat_mumps_icntl_<idx> <icntl> 151461288eaaSHong Zhang 151561288eaaSHong Zhang Level: beginner 151661288eaaSHong Zhang 151761288eaaSHong Zhang References: MUMPS Users' Guide 151861288eaaSHong Zhang 151961288eaaSHong Zhang .seealso: MatGetFactor() 152061288eaaSHong Zhang @*/ 152197969023SHong Zhang #undef __FUNCT__ 152297969023SHong Zhang #define __FUNCT__ "MatMumpsSetIcntl" 152386e5884dSMatthew Knepley PetscErrorCode MatMumpsSetIcntl(Mat F,PetscInt idx,PetscInt icntl) 152497969023SHong Zhang { 1525dcd589f8SShri Abhyankar Mat_MUMPS *lu =(Mat_MUMPS*)(F)->spptr; 152697969023SHong Zhang 152797969023SHong Zhang PetscFunctionBegin; 152861288eaaSHong Zhang lu->id.ICNTL(idx) = icntl; 152997969023SHong Zhang PetscFunctionReturn(0); 153097969023SHong Zhang } 153197969023SHong Zhang 1532