xref: /petsc/src/mat/impls/aij/mpi/mumps/mumps.c (revision 70544d5fc70dd5eb794b4cf093debe1e914834fe)
11c2a3de1SBarry Smith 
2397b6df1SKris Buschelman /*
3c2b5dc30SHong Zhang     Provides an interface to the MUMPS sparse solver
4397b6df1SKris Buschelman */
551d5961aSHong Zhang 
6c6db04a5SJed Brown #include <../src/mat/impls/aij/mpi/mpiaij.h> /*I  "petscmat.h"  I*/
7c6db04a5SJed Brown #include <../src/mat/impls/sbaij/mpi/mpisbaij.h>
8397b6df1SKris Buschelman 
9397b6df1SKris Buschelman EXTERN_C_BEGIN
10397b6df1SKris Buschelman #if defined(PETSC_USE_COMPLEX)
11c6db04a5SJed Brown #include <zmumps_c.h>
12397b6df1SKris Buschelman #else
13c6db04a5SJed Brown #include <dmumps_c.h>
14397b6df1SKris Buschelman #endif
15397b6df1SKris Buschelman EXTERN_C_END
16397b6df1SKris Buschelman #define JOB_INIT -1
173d472b54SHong Zhang #define JOB_FACTSYMBOLIC 1
183d472b54SHong Zhang #define JOB_FACTNUMERIC 2
193d472b54SHong Zhang #define JOB_SOLVE 3
20397b6df1SKris Buschelman #define JOB_END -2
213d472b54SHong Zhang 
223d472b54SHong Zhang 
23397b6df1SKris Buschelman /* macros s.t. indices match MUMPS documentation */
24397b6df1SKris Buschelman #define ICNTL(I) icntl[(I)-1]
25397b6df1SKris Buschelman #define CNTL(I) cntl[(I)-1]
26397b6df1SKris Buschelman #define INFOG(I) infog[(I)-1]
27a7aca84bSHong Zhang #define INFO(I) info[(I)-1]
28397b6df1SKris Buschelman #define RINFOG(I) rinfog[(I)-1]
29adc1d99fSHong Zhang #define RINFO(I) rinfo[(I)-1]
30397b6df1SKris Buschelman 
31397b6df1SKris Buschelman typedef struct {
32397b6df1SKris Buschelman #if defined(PETSC_USE_COMPLEX)
33397b6df1SKris Buschelman   ZMUMPS_STRUC_C id;
34397b6df1SKris Buschelman #else
35397b6df1SKris Buschelman   DMUMPS_STRUC_C id;
36397b6df1SKris Buschelman #endif
37397b6df1SKris Buschelman   MatStructure   matstruc;
38c1490034SHong Zhang   PetscMPIInt    myid,size;
3916ebf90aSShri Abhyankar   PetscInt       *irn,*jcn,nz,sym,nSolve;
40397b6df1SKris Buschelman   PetscScalar    *val;
41397b6df1SKris Buschelman   MPI_Comm       comm_mumps;
42329ec9b3SHong Zhang   VecScatter     scat_rhs, scat_sol;
4364e6c443SBarry Smith   PetscBool      isAIJ,CleanUpMUMPS;
44329ec9b3SHong Zhang   Vec            b_seq,x_seq;
45bf0cc555SLisandro Dalcin   PetscErrorCode (*Destroy)(Mat);
46bccb9932SShri Abhyankar   PetscErrorCode (*ConvertToTriples)(Mat, int, MatReuse, int*, int**, int**, PetscScalar**);
47f0c56d0fSKris Buschelman } Mat_MUMPS;
48f0c56d0fSKris Buschelman 
4909573ac7SBarry Smith extern PetscErrorCode MatDuplicate_MUMPS(Mat,MatDuplicateOption,Mat*);
50b24902e0SBarry Smith 
5167877ebaSShri Abhyankar 
5267877ebaSShri Abhyankar /* MatConvertToTriples_A_B */
5367877ebaSShri Abhyankar /*convert Petsc matrix to triples: row[nz], col[nz], val[nz] */
54397b6df1SKris Buschelman /*
55397b6df1SKris Buschelman   input:
5667877ebaSShri Abhyankar     A       - matrix in aij,baij or sbaij (bs=1) format
57397b6df1SKris Buschelman     shift   - 0: C style output triple; 1: Fortran style output triple.
58bccb9932SShri Abhyankar     reuse   - MAT_INITIAL_MATRIX: spaces are allocated and values are set for the triple
59bccb9932SShri Abhyankar               MAT_REUSE_MATRIX:   only the values in v array are updated
60397b6df1SKris Buschelman   output:
61397b6df1SKris Buschelman     nnz     - dim of r, c, and v (number of local nonzero entries of A)
62397b6df1SKris Buschelman     r, c, v - row and col index, matrix values (matrix triples)
63397b6df1SKris Buschelman  */
6416ebf90aSShri Abhyankar 
6516ebf90aSShri Abhyankar #undef __FUNCT__
6616ebf90aSShri Abhyankar #define __FUNCT__ "MatConvertToTriples_seqaij_seqaij"
67bccb9932SShri Abhyankar PetscErrorCode MatConvertToTriples_seqaij_seqaij(Mat A,int shift,MatReuse reuse,int *nnz,int **r, int **c, PetscScalar **v)
68b24902e0SBarry Smith {
69185f6596SHong Zhang   const PetscInt   *ai,*aj,*ajj,M=A->rmap->n;
7067877ebaSShri Abhyankar   PetscInt         nz,rnz,i,j;
71dfbe8321SBarry Smith   PetscErrorCode   ierr;
72c1490034SHong Zhang   PetscInt         *row,*col;
7316ebf90aSShri Abhyankar   Mat_SeqAIJ       *aa=(Mat_SeqAIJ*)A->data;
74397b6df1SKris Buschelman 
75397b6df1SKris Buschelman   PetscFunctionBegin;
7616ebf90aSShri Abhyankar   *v=aa->a;
77bccb9932SShri Abhyankar   if (reuse == MAT_INITIAL_MATRIX){
7816ebf90aSShri Abhyankar     nz = aa->nz; ai = aa->i; aj = aa->j;
7916ebf90aSShri Abhyankar     *nnz = nz;
80185f6596SHong Zhang     ierr = PetscMalloc(2*nz*sizeof(PetscInt), &row);CHKERRQ(ierr);
81185f6596SHong Zhang     col  = row + nz;
82185f6596SHong Zhang 
8316ebf90aSShri Abhyankar     nz = 0;
8416ebf90aSShri Abhyankar     for(i=0; i<M; i++) {
8516ebf90aSShri Abhyankar       rnz = ai[i+1] - ai[i];
8667877ebaSShri Abhyankar       ajj = aj + ai[i];
8767877ebaSShri Abhyankar       for(j=0; j<rnz; j++) {
8867877ebaSShri Abhyankar 	row[nz] = i+shift; col[nz++] = ajj[j] + shift;
8916ebf90aSShri Abhyankar       }
9016ebf90aSShri Abhyankar     }
9116ebf90aSShri Abhyankar     *r = row; *c = col;
9216ebf90aSShri Abhyankar   }
9316ebf90aSShri Abhyankar   PetscFunctionReturn(0);
9416ebf90aSShri Abhyankar }
95397b6df1SKris Buschelman 
9616ebf90aSShri Abhyankar #undef __FUNCT__
9767877ebaSShri Abhyankar #define __FUNCT__ "MatConvertToTriples_seqbaij_seqaij"
98bccb9932SShri Abhyankar PetscErrorCode MatConvertToTriples_seqbaij_seqaij(Mat A,int shift,MatReuse reuse,int *nnz,int **r, int **c, PetscScalar **v)
9967877ebaSShri Abhyankar {
10067877ebaSShri Abhyankar   Mat_SeqBAIJ        *aa=(Mat_SeqBAIJ*)A->data;
10167877ebaSShri Abhyankar   const PetscInt     *ai,*aj,*ajj,bs=A->rmap->bs,bs2=aa->bs2,M=A->rmap->N/bs;
1020ad0caddSJed Brown   PetscInt           nz,idx=0,rnz,i,j,k,m;
10367877ebaSShri Abhyankar   PetscErrorCode     ierr;
10467877ebaSShri Abhyankar   PetscInt           *row,*col;
10567877ebaSShri Abhyankar 
10667877ebaSShri Abhyankar   PetscFunctionBegin;
107cf3759fdSShri Abhyankar   *v = aa->a;
108bccb9932SShri Abhyankar   if (reuse == MAT_INITIAL_MATRIX){
109cf3759fdSShri Abhyankar     ai = aa->i; aj = aa->j;
11067877ebaSShri Abhyankar     nz = bs2*aa->nz;
11167877ebaSShri Abhyankar     *nnz = nz;
112185f6596SHong Zhang     ierr = PetscMalloc(2*nz*sizeof(PetscInt), &row);CHKERRQ(ierr);
113185f6596SHong Zhang     col  = row + nz;
114185f6596SHong Zhang 
11567877ebaSShri Abhyankar     for(i=0; i<M; i++) {
11667877ebaSShri Abhyankar       ajj = aj + ai[i];
11767877ebaSShri Abhyankar       rnz = ai[i+1] - ai[i];
11867877ebaSShri Abhyankar       for(k=0; k<rnz; k++) {
11967877ebaSShri Abhyankar 	for(j=0; j<bs; j++) {
12067877ebaSShri Abhyankar 	  for(m=0; m<bs; m++) {
12167877ebaSShri Abhyankar 	    row[idx]     = i*bs + m + shift;
122cf3759fdSShri Abhyankar 	    col[idx++]   = bs*(ajj[k]) + j + shift;
12367877ebaSShri Abhyankar 	  }
12467877ebaSShri Abhyankar 	}
12567877ebaSShri Abhyankar       }
12667877ebaSShri Abhyankar     }
127cf3759fdSShri Abhyankar     *r = row; *c = col;
12867877ebaSShri Abhyankar   }
12967877ebaSShri Abhyankar   PetscFunctionReturn(0);
13067877ebaSShri Abhyankar }
13167877ebaSShri Abhyankar 
13267877ebaSShri Abhyankar #undef __FUNCT__
13316ebf90aSShri Abhyankar #define __FUNCT__ "MatConvertToTriples_seqsbaij_seqsbaij"
134bccb9932SShri Abhyankar PetscErrorCode MatConvertToTriples_seqsbaij_seqsbaij(Mat A,int shift,MatReuse reuse,int *nnz,int **r, int **c, PetscScalar **v)
13516ebf90aSShri Abhyankar {
13667877ebaSShri Abhyankar   const PetscInt   *ai, *aj,*ajj,M=A->rmap->n;
13767877ebaSShri Abhyankar   PetscInt         nz,rnz,i,j;
13816ebf90aSShri Abhyankar   PetscErrorCode   ierr;
13916ebf90aSShri Abhyankar   PetscInt         *row,*col;
14016ebf90aSShri Abhyankar   Mat_SeqSBAIJ     *aa=(Mat_SeqSBAIJ*)A->data;
14116ebf90aSShri Abhyankar 
14216ebf90aSShri Abhyankar   PetscFunctionBegin;
143bccb9932SShri Abhyankar   if (reuse == MAT_INITIAL_MATRIX){
14416ebf90aSShri Abhyankar     nz = aa->nz;ai=aa->i; aj=aa->j;*v=aa->a;
14516ebf90aSShri Abhyankar     *nnz = nz;
146185f6596SHong Zhang     ierr = PetscMalloc(2*nz*sizeof(PetscInt), &row);CHKERRQ(ierr);
147185f6596SHong Zhang     col  = row + nz;
148185f6596SHong Zhang 
14916ebf90aSShri Abhyankar     nz = 0;
15016ebf90aSShri Abhyankar     for(i=0; i<M; i++) {
15116ebf90aSShri Abhyankar       rnz = ai[i+1] - ai[i];
15267877ebaSShri Abhyankar       ajj = aj + ai[i];
15367877ebaSShri Abhyankar       for(j=0; j<rnz; j++) {
15467877ebaSShri Abhyankar 	row[nz] = i+shift; col[nz++] = ajj[j] + shift;
15516ebf90aSShri Abhyankar       }
15616ebf90aSShri Abhyankar     }
15716ebf90aSShri Abhyankar     *r = row; *c = col;
15816ebf90aSShri Abhyankar   }
15916ebf90aSShri Abhyankar   PetscFunctionReturn(0);
16016ebf90aSShri Abhyankar }
16116ebf90aSShri Abhyankar 
16216ebf90aSShri Abhyankar #undef __FUNCT__
16316ebf90aSShri Abhyankar #define __FUNCT__ "MatConvertToTriples_seqaij_seqsbaij"
164bccb9932SShri Abhyankar PetscErrorCode MatConvertToTriples_seqaij_seqsbaij(Mat A,int shift,MatReuse reuse,int *nnz,int **r, int **c, PetscScalar **v)
16516ebf90aSShri Abhyankar {
16667877ebaSShri Abhyankar   const PetscInt     *ai,*aj,*ajj,*adiag,M=A->rmap->n;
16767877ebaSShri Abhyankar   PetscInt           nz,rnz,i,j;
16867877ebaSShri Abhyankar   const PetscScalar  *av,*v1;
16916ebf90aSShri Abhyankar   PetscScalar        *val;
17016ebf90aSShri Abhyankar   PetscErrorCode     ierr;
17116ebf90aSShri Abhyankar   PetscInt           *row,*col;
17216ebf90aSShri Abhyankar   Mat_SeqSBAIJ       *aa=(Mat_SeqSBAIJ*)A->data;
17316ebf90aSShri Abhyankar 
17416ebf90aSShri Abhyankar   PetscFunctionBegin;
17516ebf90aSShri Abhyankar   ai=aa->i; aj=aa->j;av=aa->a;
17616ebf90aSShri Abhyankar   adiag=aa->diag;
177bccb9932SShri Abhyankar   if (reuse == MAT_INITIAL_MATRIX){
17816ebf90aSShri Abhyankar     nz = M + (aa->nz-M)/2;
17916ebf90aSShri Abhyankar     *nnz = nz;
180185f6596SHong Zhang     ierr = PetscMalloc((2*nz*sizeof(PetscInt)+nz*sizeof(PetscScalar)), &row);CHKERRQ(ierr);
181185f6596SHong Zhang     col  = row + nz;
182185f6596SHong Zhang     val  = (PetscScalar*)(col + nz);
183185f6596SHong Zhang 
18416ebf90aSShri Abhyankar     nz = 0;
18516ebf90aSShri Abhyankar     for(i=0; i<M; i++) {
18616ebf90aSShri Abhyankar       rnz = ai[i+1] - adiag[i];
18767877ebaSShri Abhyankar       ajj  = aj + adiag[i];
188cf3759fdSShri Abhyankar       v1   = av + adiag[i];
18967877ebaSShri Abhyankar       for(j=0; j<rnz; j++) {
19067877ebaSShri Abhyankar 	row[nz] = i+shift; col[nz] = ajj[j] + shift; val[nz++] = v1[j];
19116ebf90aSShri Abhyankar       }
19216ebf90aSShri Abhyankar     }
19316ebf90aSShri Abhyankar     *r = row; *c = col; *v = val;
194397b6df1SKris Buschelman   } else {
19516ebf90aSShri Abhyankar     nz = 0; val = *v;
19616ebf90aSShri Abhyankar     for(i=0; i <M; i++) {
19716ebf90aSShri Abhyankar       rnz = ai[i+1] - adiag[i];
19867877ebaSShri Abhyankar       ajj = aj + adiag[i];
19967877ebaSShri Abhyankar       v1  = av + adiag[i];
20067877ebaSShri Abhyankar       for(j=0; j<rnz; j++) {
20167877ebaSShri Abhyankar 	val[nz++] = v1[j];
20216ebf90aSShri Abhyankar       }
20316ebf90aSShri Abhyankar     }
20416ebf90aSShri Abhyankar   }
20516ebf90aSShri Abhyankar   PetscFunctionReturn(0);
20616ebf90aSShri Abhyankar }
20716ebf90aSShri Abhyankar 
20816ebf90aSShri Abhyankar #undef __FUNCT__
20916ebf90aSShri Abhyankar #define __FUNCT__ "MatConvertToTriples_mpisbaij_mpisbaij"
210bccb9932SShri Abhyankar PetscErrorCode MatConvertToTriples_mpisbaij_mpisbaij(Mat A,int shift,MatReuse reuse,int *nnz,int **r, int **c, PetscScalar **v)
21116ebf90aSShri Abhyankar {
21216ebf90aSShri Abhyankar   const PetscInt     *ai, *aj, *bi, *bj,*garray,m=A->rmap->n,*ajj,*bjj;
21316ebf90aSShri Abhyankar   PetscErrorCode     ierr;
21416ebf90aSShri Abhyankar   PetscInt           rstart,nz,i,j,jj,irow,countA,countB;
21516ebf90aSShri Abhyankar   PetscInt           *row,*col;
21616ebf90aSShri Abhyankar   const PetscScalar  *av, *bv,*v1,*v2;
21716ebf90aSShri Abhyankar   PetscScalar        *val;
218397b6df1SKris Buschelman   Mat_MPISBAIJ       *mat =  (Mat_MPISBAIJ*)A->data;
219397b6df1SKris Buschelman   Mat_SeqSBAIJ       *aa=(Mat_SeqSBAIJ*)(mat->A)->data;
220397b6df1SKris Buschelman   Mat_SeqBAIJ        *bb=(Mat_SeqBAIJ*)(mat->B)->data;
22116ebf90aSShri Abhyankar 
22216ebf90aSShri Abhyankar   PetscFunctionBegin;
223d0f46423SBarry Smith   ai=aa->i; aj=aa->j; bi=bb->i; bj=bb->j; rstart= A->rmap->rstart;
224397b6df1SKris Buschelman   garray = mat->garray;
225397b6df1SKris Buschelman   av=aa->a; bv=bb->a;
226397b6df1SKris Buschelman 
227bccb9932SShri Abhyankar   if (reuse == MAT_INITIAL_MATRIX){
22816ebf90aSShri Abhyankar     nz = aa->nz + bb->nz;
22916ebf90aSShri Abhyankar     *nnz = nz;
230185f6596SHong Zhang     ierr = PetscMalloc((2*nz*sizeof(PetscInt)+nz*sizeof(PetscScalar)), &row);CHKERRQ(ierr);
231185f6596SHong Zhang     col  = row + nz;
232185f6596SHong Zhang     val  = (PetscScalar*)(col + nz);
233185f6596SHong Zhang 
234397b6df1SKris Buschelman     *r = row; *c = col; *v = val;
235397b6df1SKris Buschelman   } else {
236397b6df1SKris Buschelman     row = *r; col = *c; val = *v;
237397b6df1SKris Buschelman   }
238397b6df1SKris Buschelman 
239028e57e8SHong Zhang   jj = 0; irow = rstart;
240397b6df1SKris Buschelman   for ( i=0; i<m; i++ ) {
241397b6df1SKris Buschelman     ajj    = aj + ai[i];                 /* ptr to the beginning of this row */
242397b6df1SKris Buschelman     countA = ai[i+1] - ai[i];
243397b6df1SKris Buschelman     countB = bi[i+1] - bi[i];
244397b6df1SKris Buschelman     bjj    = bj + bi[i];
24516ebf90aSShri Abhyankar     v1     = av + ai[i];
24616ebf90aSShri Abhyankar     v2     = bv + bi[i];
247397b6df1SKris Buschelman 
248397b6df1SKris Buschelman     /* A-part */
249397b6df1SKris Buschelman     for (j=0; j<countA; j++){
250bccb9932SShri Abhyankar       if (reuse == MAT_INITIAL_MATRIX) {
251397b6df1SKris Buschelman         row[jj] = irow + shift; col[jj] = rstart + ajj[j] + shift;
252397b6df1SKris Buschelman       }
25316ebf90aSShri Abhyankar       val[jj++] = v1[j];
254397b6df1SKris Buschelman     }
25516ebf90aSShri Abhyankar 
25616ebf90aSShri Abhyankar     /* B-part */
25716ebf90aSShri Abhyankar     for(j=0; j < countB; j++){
258bccb9932SShri Abhyankar       if (reuse == MAT_INITIAL_MATRIX) {
259397b6df1SKris Buschelman 	row[jj] = irow + shift; col[jj] = garray[bjj[j]] + shift;
260397b6df1SKris Buschelman       }
26116ebf90aSShri Abhyankar       val[jj++] = v2[j];
26216ebf90aSShri Abhyankar     }
26316ebf90aSShri Abhyankar     irow++;
26416ebf90aSShri Abhyankar   }
26516ebf90aSShri Abhyankar   PetscFunctionReturn(0);
26616ebf90aSShri Abhyankar }
26716ebf90aSShri Abhyankar 
26816ebf90aSShri Abhyankar #undef __FUNCT__
26916ebf90aSShri Abhyankar #define __FUNCT__ "MatConvertToTriples_mpiaij_mpiaij"
270bccb9932SShri Abhyankar PetscErrorCode MatConvertToTriples_mpiaij_mpiaij(Mat A,int shift,MatReuse reuse,int *nnz,int **r, int **c, PetscScalar **v)
27116ebf90aSShri Abhyankar {
27216ebf90aSShri Abhyankar   const PetscInt     *ai, *aj, *bi, *bj,*garray,m=A->rmap->n,*ajj,*bjj;
27316ebf90aSShri Abhyankar   PetscErrorCode     ierr;
27416ebf90aSShri Abhyankar   PetscInt           rstart,nz,i,j,jj,irow,countA,countB;
27516ebf90aSShri Abhyankar   PetscInt           *row,*col;
27616ebf90aSShri Abhyankar   const PetscScalar  *av, *bv,*v1,*v2;
27716ebf90aSShri Abhyankar   PetscScalar        *val;
27816ebf90aSShri Abhyankar   Mat_MPIAIJ         *mat =  (Mat_MPIAIJ*)A->data;
27916ebf90aSShri Abhyankar   Mat_SeqAIJ         *aa=(Mat_SeqAIJ*)(mat->A)->data;
28016ebf90aSShri Abhyankar   Mat_SeqAIJ         *bb=(Mat_SeqAIJ*)(mat->B)->data;
28116ebf90aSShri Abhyankar 
28216ebf90aSShri Abhyankar   PetscFunctionBegin;
28316ebf90aSShri Abhyankar   ai=aa->i; aj=aa->j; bi=bb->i; bj=bb->j; rstart= A->rmap->rstart;
28416ebf90aSShri Abhyankar   garray = mat->garray;
28516ebf90aSShri Abhyankar   av=aa->a; bv=bb->a;
28616ebf90aSShri Abhyankar 
287bccb9932SShri Abhyankar   if (reuse == MAT_INITIAL_MATRIX){
28816ebf90aSShri Abhyankar     nz = aa->nz + bb->nz;
28916ebf90aSShri Abhyankar     *nnz = nz;
290185f6596SHong Zhang     ierr = PetscMalloc((2*nz*sizeof(PetscInt)+nz*sizeof(PetscScalar)), &row);CHKERRQ(ierr);
291185f6596SHong Zhang     col  = row + nz;
292185f6596SHong Zhang     val  = (PetscScalar*)(col + nz);
293185f6596SHong Zhang 
29416ebf90aSShri Abhyankar     *r = row; *c = col; *v = val;
29516ebf90aSShri Abhyankar   } else {
29616ebf90aSShri Abhyankar     row = *r; col = *c; val = *v;
29716ebf90aSShri Abhyankar   }
29816ebf90aSShri Abhyankar 
29916ebf90aSShri Abhyankar   jj = 0; irow = rstart;
30016ebf90aSShri Abhyankar   for ( i=0; i<m; i++ ) {
30116ebf90aSShri Abhyankar     ajj    = aj + ai[i];                 /* ptr to the beginning of this row */
30216ebf90aSShri Abhyankar     countA = ai[i+1] - ai[i];
30316ebf90aSShri Abhyankar     countB = bi[i+1] - bi[i];
30416ebf90aSShri Abhyankar     bjj    = bj + bi[i];
30516ebf90aSShri Abhyankar     v1     = av + ai[i];
30616ebf90aSShri Abhyankar     v2     = bv + bi[i];
30716ebf90aSShri Abhyankar 
30816ebf90aSShri Abhyankar     /* A-part */
30916ebf90aSShri Abhyankar     for (j=0; j<countA; j++){
310bccb9932SShri Abhyankar       if (reuse == MAT_INITIAL_MATRIX){
31116ebf90aSShri Abhyankar         row[jj] = irow + shift; col[jj] = rstart + ajj[j] + shift;
31216ebf90aSShri Abhyankar       }
31316ebf90aSShri Abhyankar       val[jj++] = v1[j];
31416ebf90aSShri Abhyankar     }
31516ebf90aSShri Abhyankar 
31616ebf90aSShri Abhyankar     /* B-part */
31716ebf90aSShri Abhyankar     for(j=0; j < countB; j++){
318bccb9932SShri Abhyankar       if (reuse == MAT_INITIAL_MATRIX){
31916ebf90aSShri Abhyankar 	row[jj] = irow + shift; col[jj] = garray[bjj[j]] + shift;
32016ebf90aSShri Abhyankar       }
32116ebf90aSShri Abhyankar       val[jj++] = v2[j];
32216ebf90aSShri Abhyankar     }
32316ebf90aSShri Abhyankar     irow++;
32416ebf90aSShri Abhyankar   }
32516ebf90aSShri Abhyankar   PetscFunctionReturn(0);
32616ebf90aSShri Abhyankar }
32716ebf90aSShri Abhyankar 
32816ebf90aSShri Abhyankar #undef __FUNCT__
32967877ebaSShri Abhyankar #define __FUNCT__ "MatConvertToTriples_mpibaij_mpiaij"
330bccb9932SShri Abhyankar PetscErrorCode MatConvertToTriples_mpibaij_mpiaij(Mat A,int shift,MatReuse reuse,int *nnz,int **r, int **c, PetscScalar **v)
33167877ebaSShri Abhyankar {
33267877ebaSShri Abhyankar   Mat_MPIBAIJ        *mat =  (Mat_MPIBAIJ*)A->data;
33367877ebaSShri Abhyankar   Mat_SeqBAIJ        *aa=(Mat_SeqBAIJ*)(mat->A)->data;
33467877ebaSShri Abhyankar   Mat_SeqBAIJ        *bb=(Mat_SeqBAIJ*)(mat->B)->data;
33567877ebaSShri Abhyankar   const PetscInt     *ai = aa->i, *bi = bb->i, *aj = aa->j, *bj = bb->j,*ajj, *bjj;
336d985c460SShri Abhyankar   const PetscInt     *garray = mat->garray,mbs=mat->mbs,rstart=A->rmap->rstart;
33767877ebaSShri Abhyankar   const PetscInt     bs = A->rmap->bs,bs2=mat->bs2;
33867877ebaSShri Abhyankar   PetscErrorCode     ierr;
33967877ebaSShri Abhyankar   PetscInt           nz,i,j,k,n,jj,irow,countA,countB,idx;
34067877ebaSShri Abhyankar   PetscInt           *row,*col;
34167877ebaSShri Abhyankar   const PetscScalar  *av=aa->a, *bv=bb->a,*v1,*v2;
34267877ebaSShri Abhyankar   PetscScalar        *val;
34367877ebaSShri Abhyankar 
34467877ebaSShri Abhyankar   PetscFunctionBegin;
34567877ebaSShri Abhyankar 
346bccb9932SShri Abhyankar   if (reuse == MAT_INITIAL_MATRIX) {
34767877ebaSShri Abhyankar     nz = bs2*(aa->nz + bb->nz);
34867877ebaSShri Abhyankar     *nnz = nz;
349185f6596SHong Zhang     ierr = PetscMalloc((2*nz*sizeof(PetscInt)+nz*sizeof(PetscScalar)), &row);CHKERRQ(ierr);
350185f6596SHong Zhang     col  = row + nz;
351185f6596SHong Zhang     val  = (PetscScalar*)(col + nz);
352185f6596SHong Zhang 
35367877ebaSShri Abhyankar     *r = row; *c = col; *v = val;
35467877ebaSShri Abhyankar   } else {
35567877ebaSShri Abhyankar     row = *r; col = *c; val = *v;
35667877ebaSShri Abhyankar   }
35767877ebaSShri Abhyankar 
358d985c460SShri Abhyankar   jj = 0; irow = rstart;
35967877ebaSShri Abhyankar   for ( i=0; i<mbs; i++ ) {
36067877ebaSShri Abhyankar     countA = ai[i+1] - ai[i];
36167877ebaSShri Abhyankar     countB = bi[i+1] - bi[i];
36267877ebaSShri Abhyankar     ajj    = aj + ai[i];
36367877ebaSShri Abhyankar     bjj    = bj + bi[i];
36467877ebaSShri Abhyankar     v1     = av + bs2*ai[i];
36567877ebaSShri Abhyankar     v2     = bv + bs2*bi[i];
36667877ebaSShri Abhyankar 
36767877ebaSShri Abhyankar     idx = 0;
36867877ebaSShri Abhyankar     /* A-part */
36967877ebaSShri Abhyankar     for (k=0; k<countA; k++){
37067877ebaSShri Abhyankar       for (j=0; j<bs; j++) {
37167877ebaSShri Abhyankar 	for (n=0; n<bs; n++) {
372bccb9932SShri Abhyankar 	  if (reuse == MAT_INITIAL_MATRIX){
373d985c460SShri Abhyankar 	    row[jj] = irow + n + shift;
374d985c460SShri Abhyankar 	    col[jj] = rstart + bs*ajj[k] + j + shift;
37567877ebaSShri Abhyankar 	  }
37667877ebaSShri Abhyankar 	  val[jj++] = v1[idx++];
37767877ebaSShri Abhyankar 	}
37867877ebaSShri Abhyankar       }
37967877ebaSShri Abhyankar     }
38067877ebaSShri Abhyankar 
38167877ebaSShri Abhyankar     idx = 0;
38267877ebaSShri Abhyankar     /* B-part */
38367877ebaSShri Abhyankar     for(k=0; k<countB; k++){
38467877ebaSShri Abhyankar       for (j=0; j<bs; j++) {
38567877ebaSShri Abhyankar 	for (n=0; n<bs; n++) {
386bccb9932SShri Abhyankar 	  if (reuse == MAT_INITIAL_MATRIX){
387d985c460SShri Abhyankar 	    row[jj] = irow + n + shift;
388d985c460SShri Abhyankar 	    col[jj] = bs*garray[bjj[k]] + j + shift;
38967877ebaSShri Abhyankar 	  }
390d985c460SShri Abhyankar 	  val[jj++] = v2[idx++];
39167877ebaSShri Abhyankar 	}
39267877ebaSShri Abhyankar       }
39367877ebaSShri Abhyankar     }
394d985c460SShri Abhyankar     irow += bs;
39567877ebaSShri Abhyankar   }
39667877ebaSShri Abhyankar   PetscFunctionReturn(0);
39767877ebaSShri Abhyankar }
39867877ebaSShri Abhyankar 
39967877ebaSShri Abhyankar #undef __FUNCT__
40016ebf90aSShri Abhyankar #define __FUNCT__ "MatConvertToTriples_mpiaij_mpisbaij"
401bccb9932SShri Abhyankar PetscErrorCode MatConvertToTriples_mpiaij_mpisbaij(Mat A,int shift,MatReuse reuse,int *nnz,int **r, int **c, PetscScalar **v)
40216ebf90aSShri Abhyankar {
40316ebf90aSShri Abhyankar   const PetscInt     *ai, *aj,*adiag, *bi, *bj,*garray,m=A->rmap->n,*ajj,*bjj;
40416ebf90aSShri Abhyankar   PetscErrorCode     ierr;
405e0bace9bSHong Zhang   PetscInt           rstart,nz,nza,nzb,i,j,jj,irow,countA,countB;
40616ebf90aSShri Abhyankar   PetscInt           *row,*col;
40716ebf90aSShri Abhyankar   const PetscScalar  *av, *bv,*v1,*v2;
40816ebf90aSShri Abhyankar   PetscScalar        *val;
40916ebf90aSShri Abhyankar   Mat_MPIAIJ         *mat =  (Mat_MPIAIJ*)A->data;
41016ebf90aSShri Abhyankar   Mat_SeqAIJ         *aa=(Mat_SeqAIJ*)(mat->A)->data;
41116ebf90aSShri Abhyankar   Mat_SeqAIJ         *bb=(Mat_SeqAIJ*)(mat->B)->data;
41216ebf90aSShri Abhyankar 
41316ebf90aSShri Abhyankar   PetscFunctionBegin;
41416ebf90aSShri Abhyankar   ai=aa->i; aj=aa->j; adiag=aa->diag;
41516ebf90aSShri Abhyankar   bi=bb->i; bj=bb->j; garray = mat->garray;
41616ebf90aSShri Abhyankar   av=aa->a; bv=bb->a;
41716ebf90aSShri Abhyankar   rstart = A->rmap->rstart;
41816ebf90aSShri Abhyankar 
419bccb9932SShri Abhyankar   if (reuse == MAT_INITIAL_MATRIX) {
420e0bace9bSHong Zhang     nza = 0;    /* num of upper triangular entries in mat->A, including diagonals */
421e0bace9bSHong Zhang     nzb = 0;    /* num of upper triangular entries in mat->B */
42216ebf90aSShri Abhyankar     for(i=0; i<m; i++){
423e0bace9bSHong Zhang       nza    += (ai[i+1] - adiag[i]);
42416ebf90aSShri Abhyankar       countB  = bi[i+1] - bi[i];
42516ebf90aSShri Abhyankar       bjj     = bj + bi[i];
426e0bace9bSHong Zhang       for (j=0; j<countB; j++){
427e0bace9bSHong Zhang         if (garray[bjj[j]] > rstart) nzb++;
428e0bace9bSHong Zhang       }
429e0bace9bSHong Zhang     }
43016ebf90aSShri Abhyankar 
431e0bace9bSHong Zhang     nz = nza + nzb; /* total nz of upper triangular part of mat */
43216ebf90aSShri Abhyankar     *nnz = nz;
433185f6596SHong Zhang     ierr = PetscMalloc((2*nz*sizeof(PetscInt)+nz*sizeof(PetscScalar)), &row);CHKERRQ(ierr);
434185f6596SHong Zhang     col  = row + nz;
435185f6596SHong Zhang     val  = (PetscScalar*)(col + nz);
436185f6596SHong Zhang 
43716ebf90aSShri Abhyankar     *r = row; *c = col; *v = val;
43816ebf90aSShri Abhyankar   } else {
43916ebf90aSShri Abhyankar     row = *r; col = *c; val = *v;
44016ebf90aSShri Abhyankar   }
44116ebf90aSShri Abhyankar 
44216ebf90aSShri Abhyankar   jj = 0; irow = rstart;
44316ebf90aSShri Abhyankar   for ( i=0; i<m; i++ ) {
44416ebf90aSShri Abhyankar     ajj    = aj + adiag[i];                 /* ptr to the beginning of the diagonal of this row */
44516ebf90aSShri Abhyankar     v1     = av + adiag[i];
44616ebf90aSShri Abhyankar     countA = ai[i+1] - adiag[i];
44716ebf90aSShri Abhyankar     countB = bi[i+1] - bi[i];
44816ebf90aSShri Abhyankar     bjj    = bj + bi[i];
44916ebf90aSShri Abhyankar     v2     = bv + bi[i];
45016ebf90aSShri Abhyankar 
45116ebf90aSShri Abhyankar      /* A-part */
45216ebf90aSShri Abhyankar     for (j=0; j<countA; j++){
453bccb9932SShri Abhyankar       if (reuse == MAT_INITIAL_MATRIX) {
45416ebf90aSShri Abhyankar         row[jj] = irow + shift; col[jj] = rstart + ajj[j] + shift;
45516ebf90aSShri Abhyankar       }
45616ebf90aSShri Abhyankar       val[jj++] = v1[j];
45716ebf90aSShri Abhyankar     }
45816ebf90aSShri Abhyankar 
45916ebf90aSShri Abhyankar     /* B-part */
46016ebf90aSShri Abhyankar     for(j=0; j < countB; j++){
46116ebf90aSShri Abhyankar       if (garray[bjj[j]] > rstart) {
462bccb9932SShri Abhyankar 	if (reuse == MAT_INITIAL_MATRIX) {
46316ebf90aSShri Abhyankar 	  row[jj] = irow + shift; col[jj] = garray[bjj[j]] + shift;
46416ebf90aSShri Abhyankar 	}
46516ebf90aSShri Abhyankar 	val[jj++] = v2[j];
46616ebf90aSShri Abhyankar       }
467397b6df1SKris Buschelman     }
468397b6df1SKris Buschelman     irow++;
469397b6df1SKris Buschelman   }
470397b6df1SKris Buschelman   PetscFunctionReturn(0);
471397b6df1SKris Buschelman }
472397b6df1SKris Buschelman 
473397b6df1SKris Buschelman #undef __FUNCT__
4743924e44cSKris Buschelman #define __FUNCT__ "MatDestroy_MUMPS"
475dfbe8321SBarry Smith PetscErrorCode MatDestroy_MUMPS(Mat A)
476dfbe8321SBarry Smith {
477f0c56d0fSKris Buschelman   Mat_MUMPS      *lu=(Mat_MUMPS*)A->spptr;
478dfbe8321SBarry Smith   PetscErrorCode ierr;
479b24902e0SBarry Smith 
480397b6df1SKris Buschelman   PetscFunctionBegin;
481bf0cc555SLisandro Dalcin   if (lu && lu->CleanUpMUMPS) {
482397b6df1SKris Buschelman     /* Terminate instance, deallocate memories */
4836bf464f9SBarry Smith     ierr = PetscFree2(lu->id.sol_loc,lu->id.isol_loc);CHKERRQ(ierr);
4846bf464f9SBarry Smith     ierr = VecScatterDestroy(&lu->scat_rhs);CHKERRQ(ierr);
4856bf464f9SBarry Smith     ierr = VecDestroy(&lu->b_seq);CHKERRQ(ierr);
486bf0cc555SLisandro Dalcin     ierr = VecScatterDestroy(&lu->scat_sol);CHKERRQ(ierr);
487bf0cc555SLisandro Dalcin     ierr = VecDestroy(&lu->x_seq);CHKERRQ(ierr);
4886bf464f9SBarry Smith     ierr=PetscFree(lu->id.perm_in);CHKERRQ(ierr);
489185f6596SHong Zhang     ierr = PetscFree(lu->irn);CHKERRQ(ierr);
490397b6df1SKris Buschelman     lu->id.job=JOB_END;
491397b6df1SKris Buschelman #if defined(PETSC_USE_COMPLEX)
492397b6df1SKris Buschelman     zmumps_c(&lu->id);
493397b6df1SKris Buschelman #else
494397b6df1SKris Buschelman     dmumps_c(&lu->id);
495397b6df1SKris Buschelman #endif
496397b6df1SKris Buschelman     ierr = MPI_Comm_free(&(lu->comm_mumps));CHKERRQ(ierr);
497397b6df1SKris Buschelman   }
498bf0cc555SLisandro Dalcin   if (lu && lu->Destroy) {
499bf0cc555SLisandro Dalcin     ierr = (lu->Destroy)(A);CHKERRQ(ierr);
500bf0cc555SLisandro Dalcin   }
501bf0cc555SLisandro Dalcin   ierr = PetscFree(A->spptr);CHKERRQ(ierr);
502bf0cc555SLisandro Dalcin 
50397969023SHong Zhang   /* clear composed functions */
50497969023SHong Zhang   ierr = PetscObjectComposeFunctionDynamic((PetscObject)A,"MatFactorGetSolverPackage_C","",PETSC_NULL);CHKERRQ(ierr);
505f250808bSBarry Smith   ierr = PetscObjectComposeFunctionDynamic((PetscObject)A,"MatMumpsSetIcntl_C","",PETSC_NULL);CHKERRQ(ierr);
506397b6df1SKris Buschelman   PetscFunctionReturn(0);
507397b6df1SKris Buschelman }
508397b6df1SKris Buschelman 
509397b6df1SKris Buschelman #undef __FUNCT__
510f6c57405SHong Zhang #define __FUNCT__ "MatSolve_MUMPS"
511b24902e0SBarry Smith PetscErrorCode MatSolve_MUMPS(Mat A,Vec b,Vec x)
512b24902e0SBarry Smith {
513f0c56d0fSKris Buschelman   Mat_MUMPS      *lu=(Mat_MUMPS*)A->spptr;
514d54de34fSKris Buschelman   PetscScalar    *array;
51567877ebaSShri Abhyankar   Vec            b_seq;
516329ec9b3SHong Zhang   IS             is_iden,is_petsc;
517dfbe8321SBarry Smith   PetscErrorCode ierr;
518329ec9b3SHong Zhang   PetscInt       i;
519397b6df1SKris Buschelman 
520397b6df1SKris Buschelman   PetscFunctionBegin;
521329ec9b3SHong Zhang   lu->id.nrhs = 1;
52267877ebaSShri Abhyankar   b_seq = lu->b_seq;
523397b6df1SKris Buschelman   if (lu->size > 1){
524329ec9b3SHong Zhang     /* MUMPS only supports centralized rhs. Scatter b into a seqential rhs vector */
52567877ebaSShri Abhyankar     ierr = VecScatterBegin(lu->scat_rhs,b,b_seq,INSERT_VALUES,SCATTER_FORWARD);CHKERRQ(ierr);
52667877ebaSShri Abhyankar     ierr = VecScatterEnd(lu->scat_rhs,b,b_seq,INSERT_VALUES,SCATTER_FORWARD);CHKERRQ(ierr);
52767877ebaSShri Abhyankar     if (!lu->myid) {ierr = VecGetArray(b_seq,&array);CHKERRQ(ierr);}
528397b6df1SKris Buschelman   } else {  /* size == 1 */
529397b6df1SKris Buschelman     ierr = VecCopy(b,x);CHKERRQ(ierr);
530397b6df1SKris Buschelman     ierr = VecGetArray(x,&array);CHKERRQ(ierr);
531397b6df1SKris Buschelman   }
532397b6df1SKris Buschelman   if (!lu->myid) { /* define rhs on the host */
5338278f211SHong Zhang     lu->id.nrhs = 1;
534397b6df1SKris Buschelman #if defined(PETSC_USE_COMPLEX)
535397b6df1SKris Buschelman     lu->id.rhs = (mumps_double_complex*)array;
536397b6df1SKris Buschelman #else
537397b6df1SKris Buschelman     lu->id.rhs = array;
538397b6df1SKris Buschelman #endif
539397b6df1SKris Buschelman   }
540397b6df1SKris Buschelman 
541397b6df1SKris Buschelman   /* solve phase */
542329ec9b3SHong Zhang   /*-------------*/
5433d472b54SHong Zhang   lu->id.job = JOB_SOLVE;
544397b6df1SKris Buschelman #if defined(PETSC_USE_COMPLEX)
545397b6df1SKris Buschelman   zmumps_c(&lu->id);
546397b6df1SKris Buschelman #else
547397b6df1SKris Buschelman   dmumps_c(&lu->id);
548397b6df1SKris Buschelman #endif
54965e19b50SBarry Smith   if (lu->id.INFOG(1) < 0) SETERRQ1(PETSC_COMM_SELF,PETSC_ERR_LIB,"Error reported by MUMPS in solve phase: INFOG(1)=%d\n",lu->id.INFOG(1));
550397b6df1SKris Buschelman 
551329ec9b3SHong Zhang   if (lu->size > 1) { /* convert mumps distributed solution to petsc mpi x */
552329ec9b3SHong Zhang     if (!lu->nSolve){ /* create scatter scat_sol */
553329ec9b3SHong Zhang       ierr = ISCreateStride(PETSC_COMM_SELF,lu->id.lsol_loc,0,1,&is_iden);CHKERRQ(ierr); /* from */
554329ec9b3SHong Zhang       for (i=0; i<lu->id.lsol_loc; i++){
555329ec9b3SHong Zhang         lu->id.isol_loc[i] -= 1; /* change Fortran style to C style */
556397b6df1SKris Buschelman       }
55770b3c8c7SBarry Smith       ierr = ISCreateGeneral(PETSC_COMM_SELF,lu->id.lsol_loc,lu->id.isol_loc,PETSC_COPY_VALUES,&is_petsc);CHKERRQ(ierr);  /* to */
558329ec9b3SHong Zhang       ierr = VecScatterCreate(lu->x_seq,is_iden,x,is_petsc,&lu->scat_sol);CHKERRQ(ierr);
5596bf464f9SBarry Smith       ierr = ISDestroy(&is_iden);CHKERRQ(ierr);
5606bf464f9SBarry Smith       ierr = ISDestroy(&is_petsc);CHKERRQ(ierr);
561397b6df1SKris Buschelman     }
562ca9f406cSSatish Balay     ierr = VecScatterBegin(lu->scat_sol,lu->x_seq,x,INSERT_VALUES,SCATTER_FORWARD);CHKERRQ(ierr);
563ca9f406cSSatish Balay     ierr = VecScatterEnd(lu->scat_sol,lu->x_seq,x,INSERT_VALUES,SCATTER_FORWARD);CHKERRQ(ierr);
564329ec9b3SHong Zhang   }
565329ec9b3SHong Zhang   lu->nSolve++;
566397b6df1SKris Buschelman   PetscFunctionReturn(0);
567397b6df1SKris Buschelman }
568397b6df1SKris Buschelman 
56951d5961aSHong Zhang #undef __FUNCT__
57051d5961aSHong Zhang #define __FUNCT__ "MatSolveTranspose_MUMPS"
57151d5961aSHong Zhang PetscErrorCode MatSolveTranspose_MUMPS(Mat A,Vec b,Vec x)
57251d5961aSHong Zhang {
57351d5961aSHong Zhang   Mat_MUMPS      *lu=(Mat_MUMPS*)A->spptr;
57451d5961aSHong Zhang   PetscErrorCode ierr;
57551d5961aSHong Zhang 
57651d5961aSHong Zhang   PetscFunctionBegin;
57751d5961aSHong Zhang   lu->id.ICNTL(9) = 0;
5780ad0caddSJed Brown   ierr = MatSolve_MUMPS(A,b,x);CHKERRQ(ierr);
57951d5961aSHong Zhang   lu->id.ICNTL(9) = 1;
58051d5961aSHong Zhang   PetscFunctionReturn(0);
58151d5961aSHong Zhang }
58251d5961aSHong Zhang 
583e0b74bf9SHong Zhang #undef __FUNCT__
584e0b74bf9SHong Zhang #define __FUNCT__ "MatMatSolve_MUMPS"
585e0b74bf9SHong Zhang PetscErrorCode MatMatSolve_MUMPS(Mat A,Mat B,Mat X)
586e0b74bf9SHong Zhang {
587bda8bf91SBarry Smith   PetscErrorCode ierr;
588bda8bf91SBarry Smith   PetscBool      flg;
589bda8bf91SBarry Smith 
590e0b74bf9SHong Zhang   PetscFunctionBegin;
591bda8bf91SBarry Smith   ierr = PetscTypeCompareAny((PetscObject)B,&flg,MATSEQDENSE,MATMPIDENSE,PETSC_NULL);CHKERRQ(ierr);
592bda8bf91SBarry Smith   if (!flg) SETERRQ(((PetscObject)A)->comm,PETSC_ERR_ARG_WRONG,"Matrix B must be MATDENSE matrix");
593bda8bf91SBarry Smith   ierr = PetscTypeCompareAny((PetscObject)X,&flg,MATSEQDENSE,MATMPIDENSE,PETSC_NULL);CHKERRQ(ierr);
594bda8bf91SBarry Smith   if (!flg) SETERRQ(((PetscObject)A)->comm,PETSC_ERR_ARG_WRONG,"Matrix X must be MATDENSE matrix");  SETERRQ(PETSC_COMM_SELF,PETSC_ERR_SUP,"MatMatSolve_MUMPS() is not implemented yet");
595e0b74bf9SHong Zhang   PetscFunctionReturn(0);
596e0b74bf9SHong Zhang }
597e0b74bf9SHong Zhang 
598ace3df97SHong Zhang #if !defined(PETSC_USE_COMPLEX)
599a58c3f20SHong Zhang /*
600a58c3f20SHong Zhang   input:
601a58c3f20SHong Zhang    F:        numeric factor
602a58c3f20SHong Zhang   output:
603a58c3f20SHong Zhang    nneg:     total number of negative pivots
604a58c3f20SHong Zhang    nzero:    0
605a58c3f20SHong Zhang    npos:     (global dimension of F) - nneg
606a58c3f20SHong Zhang */
607a58c3f20SHong Zhang 
608a58c3f20SHong Zhang #undef __FUNCT__
609a58c3f20SHong Zhang #define __FUNCT__ "MatGetInertia_SBAIJMUMPS"
610dfbe8321SBarry Smith PetscErrorCode MatGetInertia_SBAIJMUMPS(Mat F,int *nneg,int *nzero,int *npos)
611a58c3f20SHong Zhang {
612a58c3f20SHong Zhang   Mat_MUMPS      *lu =(Mat_MUMPS*)F->spptr;
613dfbe8321SBarry Smith   PetscErrorCode ierr;
614c1490034SHong Zhang   PetscMPIInt    size;
615a58c3f20SHong Zhang 
616a58c3f20SHong Zhang   PetscFunctionBegin;
6177adad957SLisandro Dalcin   ierr = MPI_Comm_size(((PetscObject)F)->comm,&size);CHKERRQ(ierr);
618bcb30aebSHong Zhang   /* MUMPS 4.3.1 calls ScaLAPACK when ICNTL(13)=0 (default), which does not offer the possibility to compute the inertia of a dense matrix. Set ICNTL(13)=1 to skip ScaLAPACK */
61965e19b50SBarry Smith   if (size > 1 && lu->id.ICNTL(13) != 1) SETERRQ1(PETSC_COMM_SELF,PETSC_ERR_ARG_WRONG,"ICNTL(13)=%d. -mat_mumps_icntl_13 must be set as 1 for correct global matrix inertia\n",lu->id.INFOG(13));
620a58c3f20SHong Zhang   if (nneg){
621a58c3f20SHong Zhang     if (!lu->myid){
622a58c3f20SHong Zhang       *nneg = lu->id.INFOG(12);
623a58c3f20SHong Zhang     }
624bcb30aebSHong Zhang     ierr = MPI_Bcast(nneg,1,MPI_INT,0,lu->comm_mumps);CHKERRQ(ierr);
625a58c3f20SHong Zhang   }
626a58c3f20SHong Zhang   if (nzero) *nzero = 0;
627d0f46423SBarry Smith   if (npos)  *npos  = F->rmap->N - (*nneg);
628a58c3f20SHong Zhang   PetscFunctionReturn(0);
629a58c3f20SHong Zhang }
630ace3df97SHong Zhang #endif /* !defined(PETSC_USE_COMPLEX) */
631a58c3f20SHong Zhang 
632397b6df1SKris Buschelman #undef __FUNCT__
633f6c57405SHong Zhang #define __FUNCT__ "MatFactorNumeric_MUMPS"
6340481f469SBarry Smith PetscErrorCode MatFactorNumeric_MUMPS(Mat F,Mat A,const MatFactorInfo *info)
635af281ebdSHong Zhang {
636dcd589f8SShri Abhyankar   Mat_MUMPS       *lu =(Mat_MUMPS*)(F)->spptr;
6376849ba73SBarry Smith   PetscErrorCode  ierr;
638bccb9932SShri Abhyankar   MatReuse        reuse;
639e09efc27SHong Zhang   Mat             F_diag;
640ace3abfcSBarry Smith   PetscBool       isMPIAIJ;
641397b6df1SKris Buschelman 
642397b6df1SKris Buschelman   PetscFunctionBegin;
643bccb9932SShri Abhyankar   reuse = MAT_REUSE_MATRIX;
644bccb9932SShri Abhyankar   ierr = (*lu->ConvertToTriples)(A, 1, reuse, &lu->nz, &lu->irn, &lu->jcn, &lu->val);CHKERRQ(ierr);
645397b6df1SKris Buschelman 
646397b6df1SKris Buschelman   /* numerical factorization phase */
647329ec9b3SHong Zhang   /*-------------------------------*/
6483d472b54SHong Zhang   lu->id.job = JOB_FACTNUMERIC;
649958c9bccSBarry Smith   if(!lu->id.ICNTL(18)) {
650a7aca84bSHong Zhang     if (!lu->myid) {
651397b6df1SKris Buschelman #if defined(PETSC_USE_COMPLEX)
652397b6df1SKris Buschelman       lu->id.a = (mumps_double_complex*)lu->val;
653397b6df1SKris Buschelman #else
654397b6df1SKris Buschelman       lu->id.a = lu->val;
655397b6df1SKris Buschelman #endif
656397b6df1SKris Buschelman     }
657397b6df1SKris Buschelman   } else {
658397b6df1SKris Buschelman #if defined(PETSC_USE_COMPLEX)
659397b6df1SKris Buschelman     lu->id.a_loc = (mumps_double_complex*)lu->val;
660397b6df1SKris Buschelman #else
661397b6df1SKris Buschelman     lu->id.a_loc = lu->val;
662397b6df1SKris Buschelman #endif
663397b6df1SKris Buschelman   }
664397b6df1SKris Buschelman #if defined(PETSC_USE_COMPLEX)
665397b6df1SKris Buschelman   zmumps_c(&lu->id);
666397b6df1SKris Buschelman #else
667397b6df1SKris Buschelman   dmumps_c(&lu->id);
668397b6df1SKris Buschelman #endif
669397b6df1SKris Buschelman   if (lu->id.INFOG(1) < 0) {
67065e19b50SBarry Smith     if (lu->id.INFO(1) == -13) SETERRQ1(PETSC_COMM_SELF,PETSC_ERR_LIB,"Error reported by MUMPS in numerical factorization phase: Cannot allocate required memory %d megabytes\n",lu->id.INFO(2));
67165e19b50SBarry Smith     else SETERRQ2(PETSC_COMM_SELF,PETSC_ERR_LIB,"Error reported by MUMPS in numerical factorization phase: INFO(1)=%d, INFO(2)=%d\n",lu->id.INFO(1),lu->id.INFO(2));
672397b6df1SKris Buschelman   }
67365e19b50SBarry Smith   if (!lu->myid && lu->id.ICNTL(16) > 0) SETERRQ1(PETSC_COMM_SELF,PETSC_ERR_LIB,"  lu->id.ICNTL(16):=%d\n",lu->id.INFOG(16));
674397b6df1SKris Buschelman 
6758ada1bb4SHong Zhang   if (lu->size > 1){
67616ebf90aSShri Abhyankar     ierr = PetscTypeCompare((PetscObject)A,MATMPIAIJ,&isMPIAIJ);CHKERRQ(ierr);
677a214ac2aSShri Abhyankar     if(isMPIAIJ) {
678dcd589f8SShri Abhyankar       F_diag = ((Mat_MPIAIJ *)(F)->data)->A;
679e09efc27SHong Zhang     } else {
680dcd589f8SShri Abhyankar       F_diag = ((Mat_MPISBAIJ *)(F)->data)->A;
681e09efc27SHong Zhang     }
682e09efc27SHong Zhang     F_diag->assembled = PETSC_TRUE;
683329ec9b3SHong Zhang     if (lu->nSolve){
6846bf464f9SBarry Smith       ierr = VecScatterDestroy(&lu->scat_sol);CHKERRQ(ierr);
6850e83c824SBarry Smith       ierr = PetscFree2(lu->id.sol_loc,lu->id.isol_loc);CHKERRQ(ierr);
6866bf464f9SBarry Smith       ierr = VecDestroy(&lu->x_seq);CHKERRQ(ierr);
687329ec9b3SHong Zhang     }
6888ada1bb4SHong Zhang   }
689dcd589f8SShri Abhyankar   (F)->assembled   = PETSC_TRUE;
690397b6df1SKris Buschelman   lu->matstruc     = SAME_NONZERO_PATTERN;
691ace87b0dSHong Zhang   lu->CleanUpMUMPS = PETSC_TRUE;
692329ec9b3SHong Zhang   lu->nSolve       = 0;
69367877ebaSShri Abhyankar 
69467877ebaSShri Abhyankar   if (lu->size > 1){
69567877ebaSShri Abhyankar     /* distributed solution */
69667877ebaSShri Abhyankar     if (!lu->nSolve){
69767877ebaSShri Abhyankar       /* Create x_seq=sol_loc for repeated use */
69867877ebaSShri Abhyankar       PetscInt    lsol_loc;
69967877ebaSShri Abhyankar       PetscScalar *sol_loc;
70067877ebaSShri Abhyankar       lsol_loc = lu->id.INFO(23); /* length of sol_loc */
70167877ebaSShri Abhyankar       ierr = PetscMalloc2(lsol_loc,PetscScalar,&sol_loc,lsol_loc,PetscInt,&lu->id.isol_loc);CHKERRQ(ierr);
70267877ebaSShri Abhyankar       lu->id.lsol_loc = lsol_loc;
70367877ebaSShri Abhyankar #if defined(PETSC_USE_COMPLEX)
70467877ebaSShri Abhyankar       lu->id.sol_loc  = (mumps_double_complex*)sol_loc;
70567877ebaSShri Abhyankar #else
70667877ebaSShri Abhyankar       lu->id.sol_loc  = sol_loc;
70767877ebaSShri Abhyankar #endif
70867877ebaSShri Abhyankar       ierr = VecCreateSeqWithArray(PETSC_COMM_SELF,lsol_loc,sol_loc,&lu->x_seq);CHKERRQ(ierr);
70967877ebaSShri Abhyankar     }
71067877ebaSShri Abhyankar   }
711397b6df1SKris Buschelman   PetscFunctionReturn(0);
712397b6df1SKris Buschelman }
713397b6df1SKris Buschelman 
7149a2535b5SHong Zhang /* Sets MUMPS options from the options database */
715dcd589f8SShri Abhyankar #undef __FUNCT__
7169a2535b5SHong Zhang #define __FUNCT__ "PetscSetMUMPSFromOptions"
7179a2535b5SHong Zhang PetscErrorCode PetscSetMUMPSFromOptions(Mat F, Mat A)
718dcd589f8SShri Abhyankar {
7199a2535b5SHong Zhang   Mat_MUMPS        *mumps = (Mat_MUMPS*)F->spptr;
720dcd589f8SShri Abhyankar   PetscErrorCode   ierr;
721dcd589f8SShri Abhyankar   PetscInt         icntl;
722ace3abfcSBarry Smith   PetscBool        flg;
723dcd589f8SShri Abhyankar 
724dcd589f8SShri Abhyankar   PetscFunctionBegin;
725dcd589f8SShri Abhyankar   ierr = PetscOptionsBegin(((PetscObject)A)->comm,((PetscObject)A)->prefix,"MUMPS Options","Mat");CHKERRQ(ierr);
7269a2535b5SHong Zhang   ierr = PetscOptionsInt("-mat_mumps_icntl_1","ICNTL(1): output stream for error messages","None",mumps->id.ICNTL(1),&icntl,&flg);CHKERRQ(ierr);
7279a2535b5SHong Zhang   if (flg) mumps->id.ICNTL(1) = icntl;
7289a2535b5SHong Zhang   ierr = PetscOptionsInt("-mat_mumps_icntl_2","ICNTL(2): output stream for diagnostic printing, statistics, and warning","None",mumps->id.ICNTL(2),&icntl,&flg);CHKERRQ(ierr);
7299a2535b5SHong Zhang   if (flg) mumps->id.ICNTL(2) = icntl;
7309a2535b5SHong Zhang   ierr = PetscOptionsInt("-mat_mumps_icntl_3","ICNTL(3): output stream for global information, collected on the host","None",mumps->id.ICNTL(3),&icntl,&flg);CHKERRQ(ierr);
7319a2535b5SHong Zhang   if (flg) mumps->id.ICNTL(3) = icntl;
732dcd589f8SShri Abhyankar 
7339a2535b5SHong Zhang   ierr = PetscOptionsInt("-mat_mumps_icntl_4","ICNTL(4): level of printing (0 to 4)","None",mumps->id.ICNTL(4),&icntl,&flg);CHKERRQ(ierr);
7349a2535b5SHong Zhang   if (flg) mumps->id.ICNTL(4) = icntl;
7359a2535b5SHong Zhang   if (mumps->id.ICNTL(4) || PetscLogPrintInfo ) mumps->id.ICNTL(3) = 6; /* resume MUMPS default id.ICNTL(3) = 6 */
7369a2535b5SHong Zhang 
7379a2535b5SHong Zhang   ierr = PetscOptionsInt("-mat_mumps_icntl_6","ICNTL(6): permuting and/or scaling the matrix (0 to 7)","None",mumps->id.ICNTL(6),&icntl,&flg);CHKERRQ(ierr);
7389a2535b5SHong Zhang   if (flg) mumps->id.ICNTL(6) = icntl;
7399a2535b5SHong Zhang 
7409a2535b5SHong Zhang   ierr = PetscOptionsInt("-mat_mumps_icntl_7","ICNTL(7): matrix ordering (0 to 7). 3=Scotch, 4=PORD, 5=Metis","None",mumps->id.ICNTL(7),&icntl,&flg);CHKERRQ(ierr);
741dcd589f8SShri Abhyankar   if (flg) {
7429a2535b5SHong Zhang     if (icntl== 1 && mumps->size > 1){
743e32f2f54SBarry 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");
744dcd589f8SShri Abhyankar     } else {
7459a2535b5SHong Zhang       mumps->id.ICNTL(7) = icntl;
746dcd589f8SShri Abhyankar     }
747dcd589f8SShri Abhyankar   }
748e0b74bf9SHong Zhang 
74970544d5fSHong Zhang   ierr = PetscOptionsInt("-mat_mumps_icntl_8","ICNTL(8): scaling strategy (-2 to 8 or 77)","None",mumps->id.ICNTL(8),&mumps->id.ICNTL(8),PETSC_NULL);CHKERRQ(ierr);
7509a2535b5SHong Zhang   ierr = PetscOptionsInt("-mat_mumps_icntl_10","ICNTL(10): max num of refinements","None",mumps->id.ICNTL(10),&mumps->id.ICNTL(10),PETSC_NULL);CHKERRQ(ierr);
7519a2535b5SHong Zhang   ierr = PetscOptionsInt("-mat_mumps_icntl_11","ICNTL(11): statistics related to the linear system solved (via -ksp_view)","None",mumps->id.ICNTL(11),&mumps->id.ICNTL(11),PETSC_NULL);CHKERRQ(ierr);
75270544d5fSHong Zhang   ierr = PetscOptionsInt("-mat_mumps_icntl_12","ICNTL(12): efficiency control: defines the ordering strategy with scaling constraints (0 to 3)","None",mumps->id.ICNTL(12),&mumps->id.ICNTL(12),PETSC_NULL);CHKERRQ(ierr);
7539a2535b5SHong Zhang   ierr = PetscOptionsInt("-mat_mumps_icntl_13","ICNTL(13): efficiency control: with or without ScaLAPACK","None",mumps->id.ICNTL(13),&mumps->id.ICNTL(13),PETSC_NULL);CHKERRQ(ierr);
7549a2535b5SHong Zhang   ierr = PetscOptionsInt("-mat_mumps_icntl_14","ICNTL(14): percentage of estimated workspace increase","None",mumps->id.ICNTL(14),&mumps->id.ICNTL(14),PETSC_NULL);CHKERRQ(ierr);
7559a2535b5SHong Zhang   ierr = PetscOptionsInt("-mat_mumps_icntl_19","ICNTL(19): Schur complement","None",mumps->id.ICNTL(19),&mumps->id.ICNTL(19),PETSC_NULL);CHKERRQ(ierr);
7569a2535b5SHong Zhang 
7579a2535b5SHong Zhang   ierr = PetscOptionsInt("-mat_mumps_icntl_22","ICNTL(22): in-core/out-of-core facility (0 or 1)","None",mumps->id.ICNTL(22),&mumps->id.ICNTL(22),PETSC_NULL);CHKERRQ(ierr);
7589a2535b5SHong Zhang   ierr = PetscOptionsInt("-mat_mumps_icntl_23","ICNTL(23): max size of the working memory (MB) that can allocate per processor","None",mumps->id.ICNTL(23),&mumps->id.ICNTL(23),PETSC_NULL);CHKERRQ(ierr);
7599a2535b5SHong Zhang   ierr = PetscOptionsInt("-mat_mumps_icntl_24","ICNTL(24): detection of null pivot rows (0 or 1)","None",mumps->id.ICNTL(24),&mumps->id.ICNTL(24),PETSC_NULL);CHKERRQ(ierr);
7609a2535b5SHong Zhang   if (mumps->id.ICNTL(24)){
7619a2535b5SHong Zhang     mumps->id.ICNTL(13) = 1; /* turn-off ScaLAPACK to help with the correct detection of null pivots */
762d7ebd59bSHong Zhang   }
763d7ebd59bSHong Zhang 
7649a2535b5SHong Zhang   ierr = PetscOptionsInt("-mat_mumps_icntl_25","ICNTL(25): computation of a null space basis","None",mumps->id.ICNTL(25),&mumps->id.ICNTL(25),PETSC_NULL);CHKERRQ(ierr);
7659a2535b5SHong Zhang   ierr = PetscOptionsInt("-mat_mumps_icntl_26","ICNTL(26): Schur options for right-hand side or solution vector","None",mumps->id.ICNTL(26),&mumps->id.ICNTL(26),PETSC_NULL);CHKERRQ(ierr);
7669a2535b5SHong Zhang   ierr = PetscOptionsInt("-mat_mumps_icntl_27","ICNTL(27): experimental parameter","None",mumps->id.ICNTL(27),&mumps->id.ICNTL(27),PETSC_NULL);CHKERRQ(ierr);
7679a2535b5SHong Zhang   ierr = PetscOptionsInt("-mat_mumps_icntl_28","ICNTL(28): use 1 for sequential analysis and ictnl(7) ordering, or 2 for parallel analysis and ictnl(29) ordering","None",mumps->id.ICNTL(28),&mumps->id.ICNTL(28),PETSC_NULL);CHKERRQ(ierr);
7689a2535b5SHong Zhang   ierr = PetscOptionsInt("-mat_mumps_icntl_29","ICNTL(29): parallel ordering 1 = ptscotch 2 = parmetis","None",mumps->id.ICNTL(29),&mumps->id.ICNTL(29),PETSC_NULL);CHKERRQ(ierr);
7699a2535b5SHong Zhang   ierr = PetscOptionsInt("-mat_mumps_icntl_30","ICNTL(30): compute user-specified set of entries in inv(A)","None",mumps->id.ICNTL(30),&mumps->id.ICNTL(30),PETSC_NULL);CHKERRQ(ierr);
7709a2535b5SHong Zhang   ierr = PetscOptionsInt("-mat_mumps_icntl_31","ICNTL(31): factors can be discarded in the solve phase","None",mumps->id.ICNTL(31),&mumps->id.ICNTL(31),PETSC_NULL);CHKERRQ(ierr);
7719a2535b5SHong Zhang   ierr = PetscOptionsInt("-mat_mumps_icntl_33","ICNTL(33): compute determinant","None",mumps->id.ICNTL(33),&mumps->id.ICNTL(33),PETSC_NULL);CHKERRQ(ierr);
772dcd589f8SShri Abhyankar 
7739a2535b5SHong Zhang   ierr = PetscOptionsReal("-mat_mumps_cntl_1","CNTL(1): relative pivoting threshold","None",mumps->id.CNTL(1),&mumps->id.CNTL(1),PETSC_NULL);CHKERRQ(ierr);
7749a2535b5SHong Zhang   ierr = PetscOptionsReal("-mat_mumps_cntl_2","CNTL(2): stopping criterion of refinement","None",mumps->id.CNTL(2),&mumps->id.CNTL(2),PETSC_NULL);CHKERRQ(ierr);
7759a2535b5SHong Zhang   ierr = PetscOptionsReal("-mat_mumps_cntl_3","CNTL(3): absolute pivoting threshold","None",mumps->id.CNTL(3),&mumps->id.CNTL(3),PETSC_NULL);CHKERRQ(ierr);
7769a2535b5SHong Zhang   ierr = PetscOptionsReal("-mat_mumps_cntl_4","CNTL(4): value for static pivoting","None",mumps->id.CNTL(4),&mumps->id.CNTL(4),PETSC_NULL);CHKERRQ(ierr);
7779a2535b5SHong Zhang   ierr = PetscOptionsReal("-mat_mumps_cntl_5","CNTL(5): fixation for null pivots","None",mumps->id.CNTL(5),&mumps->id.CNTL(5),PETSC_NULL);CHKERRQ(ierr);
778dcd589f8SShri Abhyankar   PetscOptionsEnd();
779dcd589f8SShri Abhyankar   PetscFunctionReturn(0);
780dcd589f8SShri Abhyankar }
781dcd589f8SShri Abhyankar 
782dcd589f8SShri Abhyankar #undef __FUNCT__
783dcd589f8SShri Abhyankar #define __FUNCT__ "PetscInitializeMUMPS"
784f697e70eSHong Zhang PetscErrorCode PetscInitializeMUMPS(Mat A,Mat_MUMPS* mumps)
785dcd589f8SShri Abhyankar {
786dcd589f8SShri Abhyankar   PetscErrorCode  ierr;
787dcd589f8SShri Abhyankar 
788dcd589f8SShri Abhyankar   PetscFunctionBegin;
789f697e70eSHong Zhang   ierr = MPI_Comm_rank(((PetscObject)A)->comm, &mumps->myid);
790f697e70eSHong Zhang   ierr = MPI_Comm_size(((PetscObject)A)->comm,&mumps->size);CHKERRQ(ierr);
791f697e70eSHong Zhang   ierr = MPI_Comm_dup(((PetscObject)A)->comm,&(mumps->comm_mumps));CHKERRQ(ierr);
792f697e70eSHong Zhang   mumps->id.comm_fortran = MPI_Comm_c2f(mumps->comm_mumps);
793f697e70eSHong Zhang 
794f697e70eSHong Zhang   mumps->id.job = JOB_INIT;
795f697e70eSHong Zhang   mumps->id.par = 1;  /* host participates factorizaton and solve */
796f697e70eSHong Zhang   mumps->id.sym = mumps->sym;
797dcd589f8SShri Abhyankar #if defined(PETSC_USE_COMPLEX)
798f697e70eSHong Zhang   zmumps_c(&mumps->id);
799dcd589f8SShri Abhyankar #else
800f697e70eSHong Zhang   dmumps_c(&mumps->id);
801dcd589f8SShri Abhyankar #endif
802f697e70eSHong Zhang 
803f697e70eSHong Zhang   mumps->CleanUpMUMPS = PETSC_FALSE;
804f697e70eSHong Zhang   mumps->scat_rhs     = PETSC_NULL;
805f697e70eSHong Zhang   mumps->scat_sol     = PETSC_NULL;
806f697e70eSHong Zhang   mumps->nSolve       = 0;
8079a2535b5SHong Zhang 
80870544d5fSHong Zhang   /* set PETSc-MUMPS default options - override MUMPS default */
8099a2535b5SHong Zhang   mumps->id.ICNTL(3) = 0;
8109a2535b5SHong Zhang   mumps->id.ICNTL(4) = 0;
8119a2535b5SHong Zhang   if (mumps->size == 1){
8129a2535b5SHong Zhang     mumps->id.ICNTL(18) = 0;   /* centralized assembled matrix input */
8139a2535b5SHong Zhang   } else {
8149a2535b5SHong Zhang     mumps->id.ICNTL(18) = 3;   /* distributed assembled matrix input */
81570544d5fSHong Zhang     mumps->id.ICNTL(21) = 1;   /* distributed solution */
8169a2535b5SHong Zhang   }
817dcd589f8SShri Abhyankar   PetscFunctionReturn(0);
818dcd589f8SShri Abhyankar }
819dcd589f8SShri Abhyankar 
820397b6df1SKris Buschelman /* Note the Petsc r and c permutations are ignored */
821397b6df1SKris Buschelman #undef __FUNCT__
822f0c56d0fSKris Buschelman #define __FUNCT__ "MatLUFactorSymbolic_AIJMUMPS"
8230481f469SBarry Smith PetscErrorCode MatLUFactorSymbolic_AIJMUMPS(Mat F,Mat A,IS r,IS c,const MatFactorInfo *info)
824b24902e0SBarry Smith {
825719d5645SBarry Smith   Mat_MUMPS          *lu = (Mat_MUMPS*)F->spptr;
826dcd589f8SShri Abhyankar   PetscErrorCode     ierr;
827bccb9932SShri Abhyankar   MatReuse           reuse;
82867877ebaSShri Abhyankar   Vec                b;
82967877ebaSShri Abhyankar   IS                 is_iden;
83067877ebaSShri Abhyankar   const PetscInt     M = A->rmap->N;
831397b6df1SKris Buschelman 
832397b6df1SKris Buschelman   PetscFunctionBegin;
833b24902e0SBarry Smith   lu->matstruc = DIFFERENT_NONZERO_PATTERN;
834dcd589f8SShri Abhyankar 
8359a2535b5SHong Zhang   /* Set MUMPS options from the options database */
8369a2535b5SHong Zhang   ierr = PetscSetMUMPSFromOptions(F,A);CHKERRQ(ierr);
837dcd589f8SShri Abhyankar 
838bccb9932SShri Abhyankar   reuse = MAT_INITIAL_MATRIX;
839bccb9932SShri Abhyankar   ierr = (*lu->ConvertToTriples)(A, 1, reuse, &lu->nz, &lu->irn, &lu->jcn, &lu->val);CHKERRQ(ierr);
840dcd589f8SShri Abhyankar 
84167877ebaSShri Abhyankar   /* analysis phase */
84267877ebaSShri Abhyankar   /*----------------*/
8433d472b54SHong Zhang   lu->id.job = JOB_FACTSYMBOLIC;
84467877ebaSShri Abhyankar   lu->id.n = M;
84567877ebaSShri Abhyankar   switch (lu->id.ICNTL(18)){
84667877ebaSShri Abhyankar   case 0:  /* centralized assembled matrix input */
84767877ebaSShri Abhyankar     if (!lu->myid) {
84867877ebaSShri Abhyankar       lu->id.nz =lu->nz; lu->id.irn=lu->irn; lu->id.jcn=lu->jcn;
84967877ebaSShri Abhyankar       if (lu->id.ICNTL(6)>1){
85067877ebaSShri Abhyankar #if defined(PETSC_USE_COMPLEX)
85167877ebaSShri Abhyankar         lu->id.a = (mumps_double_complex*)lu->val;
85267877ebaSShri Abhyankar #else
85367877ebaSShri Abhyankar         lu->id.a = lu->val;
85467877ebaSShri Abhyankar #endif
85567877ebaSShri Abhyankar       }
856e0b74bf9SHong Zhang       if (lu->id.ICNTL(7) == 1){ /* use user-provide matrix ordering */
857e0b74bf9SHong Zhang         if (!lu->myid) {
858e0b74bf9SHong Zhang           const PetscInt *idx;
859e0b74bf9SHong Zhang           PetscInt i,*perm_in;
860e0b74bf9SHong Zhang           ierr = PetscMalloc(M*sizeof(PetscInt),&perm_in);CHKERRQ(ierr);
861e0b74bf9SHong Zhang           ierr = ISGetIndices(r,&idx);CHKERRQ(ierr);
862e0b74bf9SHong Zhang           lu->id.perm_in = perm_in;
863e0b74bf9SHong Zhang           for (i=0; i<M; i++) perm_in[i] = idx[i]+1; /* perm_in[]: start from 1, not 0! */
864e0b74bf9SHong Zhang           ierr = ISRestoreIndices(r,&idx);CHKERRQ(ierr);
865e0b74bf9SHong Zhang         }
866e0b74bf9SHong Zhang       }
86767877ebaSShri Abhyankar     }
86867877ebaSShri Abhyankar     break;
86967877ebaSShri Abhyankar   case 3:  /* distributed assembled matrix input (size>1) */
87067877ebaSShri Abhyankar     lu->id.nz_loc = lu->nz;
87167877ebaSShri Abhyankar     lu->id.irn_loc=lu->irn; lu->id.jcn_loc=lu->jcn;
87267877ebaSShri Abhyankar     if (lu->id.ICNTL(6)>1) {
87367877ebaSShri Abhyankar #if defined(PETSC_USE_COMPLEX)
87467877ebaSShri Abhyankar       lu->id.a_loc = (mumps_double_complex*)lu->val;
87567877ebaSShri Abhyankar #else
87667877ebaSShri Abhyankar       lu->id.a_loc = lu->val;
87767877ebaSShri Abhyankar #endif
87867877ebaSShri Abhyankar     }
87967877ebaSShri Abhyankar     /* MUMPS only supports centralized rhs. Create scatter scat_rhs for repeated use in MatSolve() */
88067877ebaSShri Abhyankar     if (!lu->myid){
88167877ebaSShri Abhyankar       ierr = VecCreateSeq(PETSC_COMM_SELF,A->cmap->N,&lu->b_seq);CHKERRQ(ierr);
88267877ebaSShri Abhyankar       ierr = ISCreateStride(PETSC_COMM_SELF,A->cmap->N,0,1,&is_iden);CHKERRQ(ierr);
88367877ebaSShri Abhyankar     } else {
88467877ebaSShri Abhyankar       ierr = VecCreateSeq(PETSC_COMM_SELF,0,&lu->b_seq);CHKERRQ(ierr);
88567877ebaSShri Abhyankar       ierr = ISCreateStride(PETSC_COMM_SELF,0,0,1,&is_iden);CHKERRQ(ierr);
88667877ebaSShri Abhyankar     }
88767877ebaSShri Abhyankar     ierr = VecCreate(((PetscObject)A)->comm,&b);CHKERRQ(ierr);
88867877ebaSShri Abhyankar     ierr = VecSetSizes(b,A->rmap->n,PETSC_DECIDE);CHKERRQ(ierr);
88967877ebaSShri Abhyankar     ierr = VecSetFromOptions(b);CHKERRQ(ierr);
89067877ebaSShri Abhyankar 
89167877ebaSShri Abhyankar     ierr = VecScatterCreate(b,is_iden,lu->b_seq,is_iden,&lu->scat_rhs);CHKERRQ(ierr);
8926bf464f9SBarry Smith     ierr = ISDestroy(&is_iden);CHKERRQ(ierr);
8936bf464f9SBarry Smith     ierr = VecDestroy(&b);CHKERRQ(ierr);
89467877ebaSShri Abhyankar     break;
89567877ebaSShri Abhyankar     }
89667877ebaSShri Abhyankar #if defined(PETSC_USE_COMPLEX)
89767877ebaSShri Abhyankar   zmumps_c(&lu->id);
89867877ebaSShri Abhyankar #else
89967877ebaSShri Abhyankar   dmumps_c(&lu->id);
90067877ebaSShri Abhyankar #endif
90167877ebaSShri 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));
90267877ebaSShri Abhyankar 
903719d5645SBarry Smith   F->ops->lufactornumeric  = MatFactorNumeric_MUMPS;
904dcd589f8SShri Abhyankar   F->ops->solve            = MatSolve_MUMPS;
90551d5961aSHong Zhang   F->ops->solvetranspose   = MatSolveTranspose_MUMPS;
906e0b74bf9SHong Zhang   F->ops->matsolve         = MatMatSolve_MUMPS;
907b24902e0SBarry Smith   PetscFunctionReturn(0);
908b24902e0SBarry Smith }
909b24902e0SBarry Smith 
910450b117fSShri Abhyankar /* Note the Petsc r and c permutations are ignored */
911450b117fSShri Abhyankar #undef __FUNCT__
912450b117fSShri Abhyankar #define __FUNCT__ "MatLUFactorSymbolic_BAIJMUMPS"
913450b117fSShri Abhyankar PetscErrorCode MatLUFactorSymbolic_BAIJMUMPS(Mat F,Mat A,IS r,IS c,const MatFactorInfo *info)
914450b117fSShri Abhyankar {
915dcd589f8SShri Abhyankar 
916450b117fSShri Abhyankar   Mat_MUMPS       *lu = (Mat_MUMPS*)F->spptr;
917dcd589f8SShri Abhyankar   PetscErrorCode  ierr;
918bccb9932SShri Abhyankar   MatReuse        reuse;
91967877ebaSShri Abhyankar   Vec             b;
92067877ebaSShri Abhyankar   IS              is_iden;
92167877ebaSShri Abhyankar   const PetscInt  M = A->rmap->N;
922450b117fSShri Abhyankar 
923450b117fSShri Abhyankar   PetscFunctionBegin;
924450b117fSShri Abhyankar   lu->matstruc = DIFFERENT_NONZERO_PATTERN;
925dcd589f8SShri Abhyankar 
9269a2535b5SHong Zhang   /* Set MUMPS options from the options database */
9279a2535b5SHong Zhang   ierr = PetscSetMUMPSFromOptions(F,A);CHKERRQ(ierr);
928dcd589f8SShri Abhyankar 
929bccb9932SShri Abhyankar   reuse = MAT_INITIAL_MATRIX;
930bccb9932SShri Abhyankar   ierr = (*lu->ConvertToTriples)(A, 1, reuse, &lu->nz, &lu->irn, &lu->jcn, &lu->val);CHKERRQ(ierr);
93167877ebaSShri Abhyankar 
93267877ebaSShri Abhyankar   /* analysis phase */
93367877ebaSShri Abhyankar   /*----------------*/
9343d472b54SHong Zhang   lu->id.job = JOB_FACTSYMBOLIC;
93567877ebaSShri Abhyankar   lu->id.n = M;
93667877ebaSShri Abhyankar   switch (lu->id.ICNTL(18)){
93767877ebaSShri Abhyankar   case 0:  /* centralized assembled matrix input */
93867877ebaSShri Abhyankar     if (!lu->myid) {
93967877ebaSShri Abhyankar       lu->id.nz =lu->nz; lu->id.irn=lu->irn; lu->id.jcn=lu->jcn;
94067877ebaSShri Abhyankar       if (lu->id.ICNTL(6)>1){
94167877ebaSShri Abhyankar #if defined(PETSC_USE_COMPLEX)
94267877ebaSShri Abhyankar         lu->id.a = (mumps_double_complex*)lu->val;
94367877ebaSShri Abhyankar #else
94467877ebaSShri Abhyankar         lu->id.a = lu->val;
94567877ebaSShri Abhyankar #endif
94667877ebaSShri Abhyankar       }
94767877ebaSShri Abhyankar     }
94867877ebaSShri Abhyankar     break;
94967877ebaSShri Abhyankar   case 3:  /* distributed assembled matrix input (size>1) */
95067877ebaSShri Abhyankar     lu->id.nz_loc = lu->nz;
95167877ebaSShri Abhyankar     lu->id.irn_loc=lu->irn; lu->id.jcn_loc=lu->jcn;
95267877ebaSShri Abhyankar     if (lu->id.ICNTL(6)>1) {
95367877ebaSShri Abhyankar #if defined(PETSC_USE_COMPLEX)
95467877ebaSShri Abhyankar       lu->id.a_loc = (mumps_double_complex*)lu->val;
95567877ebaSShri Abhyankar #else
95667877ebaSShri Abhyankar       lu->id.a_loc = lu->val;
95767877ebaSShri Abhyankar #endif
95867877ebaSShri Abhyankar     }
95967877ebaSShri Abhyankar     /* MUMPS only supports centralized rhs. Create scatter scat_rhs for repeated use in MatSolve() */
96067877ebaSShri Abhyankar     if (!lu->myid){
96167877ebaSShri Abhyankar       ierr = VecCreateSeq(PETSC_COMM_SELF,A->cmap->N,&lu->b_seq);CHKERRQ(ierr);
96267877ebaSShri Abhyankar       ierr = ISCreateStride(PETSC_COMM_SELF,A->cmap->N,0,1,&is_iden);CHKERRQ(ierr);
96367877ebaSShri Abhyankar     } else {
96467877ebaSShri Abhyankar       ierr = VecCreateSeq(PETSC_COMM_SELF,0,&lu->b_seq);CHKERRQ(ierr);
96567877ebaSShri Abhyankar       ierr = ISCreateStride(PETSC_COMM_SELF,0,0,1,&is_iden);CHKERRQ(ierr);
96667877ebaSShri Abhyankar     }
96767877ebaSShri Abhyankar     ierr = VecCreate(((PetscObject)A)->comm,&b);CHKERRQ(ierr);
96867877ebaSShri Abhyankar     ierr = VecSetSizes(b,A->rmap->n,PETSC_DECIDE);CHKERRQ(ierr);
96967877ebaSShri Abhyankar     ierr = VecSetFromOptions(b);CHKERRQ(ierr);
97067877ebaSShri Abhyankar 
97167877ebaSShri Abhyankar     ierr = VecScatterCreate(b,is_iden,lu->b_seq,is_iden,&lu->scat_rhs);CHKERRQ(ierr);
9726bf464f9SBarry Smith     ierr = ISDestroy(&is_iden);CHKERRQ(ierr);
9736bf464f9SBarry Smith     ierr = VecDestroy(&b);CHKERRQ(ierr);
97467877ebaSShri Abhyankar     break;
97567877ebaSShri Abhyankar     }
97667877ebaSShri Abhyankar #if defined(PETSC_USE_COMPLEX)
97767877ebaSShri Abhyankar   zmumps_c(&lu->id);
97867877ebaSShri Abhyankar #else
97967877ebaSShri Abhyankar   dmumps_c(&lu->id);
98067877ebaSShri Abhyankar #endif
98167877ebaSShri 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));
98267877ebaSShri Abhyankar 
983450b117fSShri Abhyankar   F->ops->lufactornumeric  = MatFactorNumeric_MUMPS;
984dcd589f8SShri Abhyankar   F->ops->solve            = MatSolve_MUMPS;
98551d5961aSHong Zhang   F->ops->solvetranspose   = MatSolveTranspose_MUMPS;
986450b117fSShri Abhyankar   PetscFunctionReturn(0);
987450b117fSShri Abhyankar }
988b24902e0SBarry Smith 
989141f4205SHong Zhang /* Note the Petsc r permutation and factor info are ignored */
990397b6df1SKris Buschelman #undef __FUNCT__
99167877ebaSShri Abhyankar #define __FUNCT__ "MatCholeskyFactorSymbolic_MUMPS"
99267877ebaSShri Abhyankar PetscErrorCode MatCholeskyFactorSymbolic_MUMPS(Mat F,Mat A,IS r,const MatFactorInfo *info)
993b24902e0SBarry Smith {
9942792810eSHong Zhang   Mat_MUMPS          *lu = (Mat_MUMPS*)F->spptr;
995dcd589f8SShri Abhyankar   PetscErrorCode     ierr;
996bccb9932SShri Abhyankar   MatReuse           reuse;
99767877ebaSShri Abhyankar   Vec                b;
99867877ebaSShri Abhyankar   IS                 is_iden;
99967877ebaSShri Abhyankar   const PetscInt     M = A->rmap->N;
1000397b6df1SKris Buschelman 
1001397b6df1SKris Buschelman   PetscFunctionBegin;
1002b24902e0SBarry Smith   lu->matstruc = DIFFERENT_NONZERO_PATTERN;
1003dcd589f8SShri Abhyankar 
10049a2535b5SHong Zhang   /* Set MUMPS options from the options database */
10059a2535b5SHong Zhang   ierr = PetscSetMUMPSFromOptions(F,A);CHKERRQ(ierr);
1006dcd589f8SShri Abhyankar 
1007bccb9932SShri Abhyankar   reuse = MAT_INITIAL_MATRIX;
1008bccb9932SShri Abhyankar   ierr = (*lu->ConvertToTriples)(A, 1 , reuse, &lu->nz, &lu->irn, &lu->jcn, &lu->val);CHKERRQ(ierr);
1009dcd589f8SShri Abhyankar 
101067877ebaSShri Abhyankar   /* analysis phase */
101167877ebaSShri Abhyankar   /*----------------*/
10123d472b54SHong Zhang   lu->id.job = JOB_FACTSYMBOLIC;
101367877ebaSShri Abhyankar   lu->id.n = M;
101467877ebaSShri Abhyankar   switch (lu->id.ICNTL(18)){
101567877ebaSShri Abhyankar   case 0:  /* centralized assembled matrix input */
101667877ebaSShri Abhyankar     if (!lu->myid) {
101767877ebaSShri Abhyankar       lu->id.nz =lu->nz; lu->id.irn=lu->irn; lu->id.jcn=lu->jcn;
101867877ebaSShri Abhyankar       if (lu->id.ICNTL(6)>1){
101967877ebaSShri Abhyankar #if defined(PETSC_USE_COMPLEX)
102067877ebaSShri Abhyankar         lu->id.a = (mumps_double_complex*)lu->val;
102167877ebaSShri Abhyankar #else
102267877ebaSShri Abhyankar         lu->id.a = lu->val;
102367877ebaSShri Abhyankar #endif
102467877ebaSShri Abhyankar       }
102567877ebaSShri Abhyankar     }
102667877ebaSShri Abhyankar     break;
102767877ebaSShri Abhyankar   case 3:  /* distributed assembled matrix input (size>1) */
102867877ebaSShri Abhyankar     lu->id.nz_loc = lu->nz;
102967877ebaSShri Abhyankar     lu->id.irn_loc=lu->irn; lu->id.jcn_loc=lu->jcn;
103067877ebaSShri Abhyankar     if (lu->id.ICNTL(6)>1) {
103167877ebaSShri Abhyankar #if defined(PETSC_USE_COMPLEX)
103267877ebaSShri Abhyankar       lu->id.a_loc = (mumps_double_complex*)lu->val;
103367877ebaSShri Abhyankar #else
103467877ebaSShri Abhyankar       lu->id.a_loc = lu->val;
103567877ebaSShri Abhyankar #endif
103667877ebaSShri Abhyankar     }
103767877ebaSShri Abhyankar     /* MUMPS only supports centralized rhs. Create scatter scat_rhs for repeated use in MatSolve() */
103867877ebaSShri Abhyankar     if (!lu->myid){
103967877ebaSShri Abhyankar       ierr = VecCreateSeq(PETSC_COMM_SELF,A->cmap->N,&lu->b_seq);CHKERRQ(ierr);
104067877ebaSShri Abhyankar       ierr = ISCreateStride(PETSC_COMM_SELF,A->cmap->N,0,1,&is_iden);CHKERRQ(ierr);
104167877ebaSShri Abhyankar     } else {
104267877ebaSShri Abhyankar       ierr = VecCreateSeq(PETSC_COMM_SELF,0,&lu->b_seq);CHKERRQ(ierr);
104367877ebaSShri Abhyankar       ierr = ISCreateStride(PETSC_COMM_SELF,0,0,1,&is_iden);CHKERRQ(ierr);
104467877ebaSShri Abhyankar     }
104567877ebaSShri Abhyankar     ierr = VecCreate(((PetscObject)A)->comm,&b);CHKERRQ(ierr);
104667877ebaSShri Abhyankar     ierr = VecSetSizes(b,A->rmap->n,PETSC_DECIDE);CHKERRQ(ierr);
104767877ebaSShri Abhyankar     ierr = VecSetFromOptions(b);CHKERRQ(ierr);
104867877ebaSShri Abhyankar 
104967877ebaSShri Abhyankar     ierr = VecScatterCreate(b,is_iden,lu->b_seq,is_iden,&lu->scat_rhs);CHKERRQ(ierr);
10506bf464f9SBarry Smith     ierr = ISDestroy(&is_iden);CHKERRQ(ierr);
10516bf464f9SBarry Smith     ierr = VecDestroy(&b);CHKERRQ(ierr);
105267877ebaSShri Abhyankar     break;
105367877ebaSShri Abhyankar     }
105467877ebaSShri Abhyankar #if defined(PETSC_USE_COMPLEX)
105567877ebaSShri Abhyankar   zmumps_c(&lu->id);
105667877ebaSShri Abhyankar #else
105767877ebaSShri Abhyankar   dmumps_c(&lu->id);
105867877ebaSShri Abhyankar #endif
105967877ebaSShri 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));
106067877ebaSShri Abhyankar 
10612792810eSHong Zhang   F->ops->choleskyfactornumeric = MatFactorNumeric_MUMPS;
1062dcd589f8SShri Abhyankar   F->ops->solve                 = MatSolve_MUMPS;
106351d5961aSHong Zhang   F->ops->solvetranspose        = MatSolve_MUMPS;
1064db4efbfdSBarry Smith #if !defined(PETSC_USE_COMPLEX)
106505aa0992SJose Roman   F->ops->getinertia            = MatGetInertia_SBAIJMUMPS;
106605aa0992SJose Roman #else
106705aa0992SJose Roman   F->ops->getinertia            = PETSC_NULL;
1068db4efbfdSBarry Smith #endif
1069b24902e0SBarry Smith   PetscFunctionReturn(0);
1070b24902e0SBarry Smith }
1071b24902e0SBarry Smith 
1072397b6df1SKris Buschelman #undef __FUNCT__
107364e6c443SBarry Smith #define __FUNCT__ "MatView_MUMPS"
107464e6c443SBarry Smith PetscErrorCode MatView_MUMPS(Mat A,PetscViewer viewer)
107574ed9c26SBarry Smith {
1076f6c57405SHong Zhang   PetscErrorCode    ierr;
107764e6c443SBarry Smith   PetscBool         iascii;
107864e6c443SBarry Smith   PetscViewerFormat format;
107964e6c443SBarry Smith   Mat_MUMPS         *lu=(Mat_MUMPS*)A->spptr;
1080f6c57405SHong Zhang 
1081f6c57405SHong Zhang   PetscFunctionBegin;
108264e6c443SBarry Smith   /* check if matrix is mumps type */
108364e6c443SBarry Smith   if (A->ops->solve != MatSolve_MUMPS) PetscFunctionReturn(0);
108464e6c443SBarry Smith 
108564e6c443SBarry Smith   ierr = PetscTypeCompare((PetscObject)viewer,PETSCVIEWERASCII,&iascii);CHKERRQ(ierr);
108664e6c443SBarry Smith   if (iascii) {
108764e6c443SBarry Smith     ierr = PetscViewerGetFormat(viewer,&format);CHKERRQ(ierr);
108864e6c443SBarry Smith     if (format == PETSC_VIEWER_ASCII_INFO){
108964e6c443SBarry Smith       ierr = PetscViewerASCIIPrintf(viewer,"MUMPS run parameters:\n");CHKERRQ(ierr);
109064e6c443SBarry Smith       ierr = PetscViewerASCIIPrintf(viewer,"  SYM (matrix type):                   %d \n",lu->id.sym);CHKERRQ(ierr);
109164e6c443SBarry Smith       ierr = PetscViewerASCIIPrintf(viewer,"  PAR (host participation):            %d \n",lu->id.par);CHKERRQ(ierr);
1092f6c57405SHong Zhang       ierr = PetscViewerASCIIPrintf(viewer,"  ICNTL(1) (output for error):         %d \n",lu->id.ICNTL(1));CHKERRQ(ierr);
1093f6c57405SHong Zhang       ierr = PetscViewerASCIIPrintf(viewer,"  ICNTL(2) (output of diagnostic msg): %d \n",lu->id.ICNTL(2));CHKERRQ(ierr);
1094f6c57405SHong Zhang       ierr = PetscViewerASCIIPrintf(viewer,"  ICNTL(3) (output for global info):   %d \n",lu->id.ICNTL(3));CHKERRQ(ierr);
1095f6c57405SHong Zhang       ierr = PetscViewerASCIIPrintf(viewer,"  ICNTL(4) (level of printing):        %d \n",lu->id.ICNTL(4));CHKERRQ(ierr);
1096f6c57405SHong Zhang       ierr = PetscViewerASCIIPrintf(viewer,"  ICNTL(5) (input mat struct):         %d \n",lu->id.ICNTL(5));CHKERRQ(ierr);
1097f6c57405SHong Zhang       ierr = PetscViewerASCIIPrintf(viewer,"  ICNTL(6) (matrix prescaling):        %d \n",lu->id.ICNTL(6));CHKERRQ(ierr);
1098d06efebcSBarry Smith       ierr = PetscViewerASCIIPrintf(viewer,"  ICNTL(7) (sequentia matrix ordering):%d \n",lu->id.ICNTL(7));CHKERRQ(ierr);
1099f6c57405SHong Zhang       ierr = PetscViewerASCIIPrintf(viewer,"  ICNTL(8) (scalling strategy):        %d \n",lu->id.ICNTL(8));CHKERRQ(ierr);
1100f6c57405SHong Zhang       ierr = PetscViewerASCIIPrintf(viewer,"  ICNTL(10) (max num of refinements):  %d \n",lu->id.ICNTL(10));CHKERRQ(ierr);
1101f6c57405SHong Zhang       ierr = PetscViewerASCIIPrintf(viewer,"  ICNTL(11) (error analysis):          %d \n",lu->id.ICNTL(11));CHKERRQ(ierr);
110234ed7027SBarry Smith       if (lu->id.ICNTL(11)>0) {
110334ed7027SBarry Smith         ierr = PetscViewerASCIIPrintf(viewer,"    RINFOG(4) (inf norm of input mat):        %g\n",lu->id.RINFOG(4));CHKERRQ(ierr);
110434ed7027SBarry Smith         ierr = PetscViewerASCIIPrintf(viewer,"    RINFOG(5) (inf norm of solution):         %g\n",lu->id.RINFOG(5));CHKERRQ(ierr);
110534ed7027SBarry Smith         ierr = PetscViewerASCIIPrintf(viewer,"    RINFOG(6) (inf norm of residual):         %g\n",lu->id.RINFOG(6));CHKERRQ(ierr);
110634ed7027SBarry Smith         ierr = PetscViewerASCIIPrintf(viewer,"    RINFOG(7),RINFOG(8) (backward error est): %g, %g\n",lu->id.RINFOG(7),lu->id.RINFOG(8));CHKERRQ(ierr);
110734ed7027SBarry Smith         ierr = PetscViewerASCIIPrintf(viewer,"    RINFOG(9) (error estimate):               %g \n",lu->id.RINFOG(9));CHKERRQ(ierr);
110834ed7027SBarry Smith         ierr = PetscViewerASCIIPrintf(viewer,"    RINFOG(10),RINFOG(11)(condition numbers): %g, %g\n",lu->id.RINFOG(10),lu->id.RINFOG(11));CHKERRQ(ierr);
1109f6c57405SHong Zhang       }
1110f6c57405SHong Zhang       ierr = PetscViewerASCIIPrintf(viewer,"  ICNTL(12) (efficiency control):                         %d \n",lu->id.ICNTL(12));CHKERRQ(ierr);
1111f6c57405SHong Zhang       ierr = PetscViewerASCIIPrintf(viewer,"  ICNTL(13) (efficiency control):                         %d \n",lu->id.ICNTL(13));CHKERRQ(ierr);
1112f6c57405SHong Zhang       ierr = PetscViewerASCIIPrintf(viewer,"  ICNTL(14) (percentage of estimated workspace increase): %d \n",lu->id.ICNTL(14));CHKERRQ(ierr);
1113f6c57405SHong Zhang       /* ICNTL(15-17) not used */
1114f6c57405SHong Zhang       ierr = PetscViewerASCIIPrintf(viewer,"  ICNTL(18) (input mat struct):                           %d \n",lu->id.ICNTL(18));CHKERRQ(ierr);
1115f6c57405SHong Zhang       ierr = PetscViewerASCIIPrintf(viewer,"  ICNTL(19) (Shur complement info):                       %d \n",lu->id.ICNTL(19));CHKERRQ(ierr);
1116f6c57405SHong Zhang       ierr = PetscViewerASCIIPrintf(viewer,"  ICNTL(20) (rhs sparse pattern):                         %d \n",lu->id.ICNTL(20));CHKERRQ(ierr);
1117f6c57405SHong Zhang       ierr = PetscViewerASCIIPrintf(viewer,"  ICNTL(21) (solution struct):                            %d \n",lu->id.ICNTL(21));CHKERRQ(ierr);
1118c0165424SHong Zhang       ierr = PetscViewerASCIIPrintf(viewer,"  ICNTL(22) (in-core/out-of-core facility):               %d \n",lu->id.ICNTL(22));CHKERRQ(ierr);
1119c0165424SHong Zhang       ierr = PetscViewerASCIIPrintf(viewer,"  ICNTL(23) (max size of memory can be allocated locally):%d \n",lu->id.ICNTL(23));CHKERRQ(ierr);
1120c0165424SHong Zhang 
1121c0165424SHong Zhang       ierr = PetscViewerASCIIPrintf(viewer,"  ICNTL(24) (detection of null pivot rows):               %d \n",lu->id.ICNTL(24));CHKERRQ(ierr);
1122c0165424SHong Zhang       ierr = PetscViewerASCIIPrintf(viewer,"  ICNTL(25) (computation of a null space basis):          %d \n",lu->id.ICNTL(25));CHKERRQ(ierr);
1123c0165424SHong Zhang       ierr = PetscViewerASCIIPrintf(viewer,"  ICNTL(26) (Schur options for rhs or solution):          %d \n",lu->id.ICNTL(26));CHKERRQ(ierr);
1124c0165424SHong Zhang       ierr = PetscViewerASCIIPrintf(viewer,"  ICNTL(27) (experimental parameter):                     %d \n",lu->id.ICNTL(27));CHKERRQ(ierr);
1125*42179a6aSHong Zhang       ierr = PetscViewerASCIIPrintf(viewer,"  ICNTL(28) (use parallel or sequential ordering):        %d \n",lu->id.ICNTL(28));CHKERRQ(ierr);
1126*42179a6aSHong Zhang       ierr = PetscViewerASCIIPrintf(viewer,"  ICNTL(29) (parallel ordering):                          %d \n",lu->id.ICNTL(29));CHKERRQ(ierr);
1127*42179a6aSHong Zhang 
1128*42179a6aSHong Zhang       ierr = PetscViewerASCIIPrintf(viewer,"  ICNTL(30) (user-specified set of entries in inv(A)):    %d \n",lu->id.ICNTL(30));CHKERRQ(ierr);
1129*42179a6aSHong Zhang       ierr = PetscViewerASCIIPrintf(viewer,"  ICNTL(31) (factors is discarded in the solve phase):    %d \n",lu->id.ICNTL(31));CHKERRQ(ierr);
1130*42179a6aSHong Zhang       ierr = PetscViewerASCIIPrintf(viewer,"  ICNTL(33) (compute determinant):                        %d \n",lu->id.ICNTL(33));CHKERRQ(ierr);
1131f6c57405SHong Zhang 
1132f6c57405SHong Zhang       ierr = PetscViewerASCIIPrintf(viewer,"  CNTL(1) (relative pivoting threshold):      %g \n",lu->id.CNTL(1));CHKERRQ(ierr);
1133f6c57405SHong Zhang       ierr = PetscViewerASCIIPrintf(viewer,"  CNTL(2) (stopping criterion of refinement): %g \n",lu->id.CNTL(2));CHKERRQ(ierr);
1134f6c57405SHong Zhang       ierr = PetscViewerASCIIPrintf(viewer,"  CNTL(3) (absolute pivoting threshold):      %g \n",lu->id.CNTL(3));CHKERRQ(ierr);
1135f6c57405SHong Zhang       ierr = PetscViewerASCIIPrintf(viewer,"  CNTL(4) (value of static pivoting):         %g \n",lu->id.CNTL(4));CHKERRQ(ierr);
1136c0165424SHong Zhang       ierr = PetscViewerASCIIPrintf(viewer,"  CNTL(5) (fixation for null pivots):         %g \n",lu->id.CNTL(5));CHKERRQ(ierr);
1137f6c57405SHong Zhang 
1138f6c57405SHong Zhang       /* infomation local to each processor */
113934ed7027SBarry Smith       ierr = PetscViewerASCIIPrintf(viewer, "  RINFO(1) (local estimated flops for the elimination after analysis): \n");CHKERRQ(ierr);
11407b23a99aSBarry Smith       ierr = PetscViewerASCIISynchronizedAllow(viewer,PETSC_TRUE);CHKERRQ(ierr);
114134ed7027SBarry Smith       ierr = PetscViewerASCIISynchronizedPrintf(viewer,"    [%d] %g \n",lu->myid,lu->id.RINFO(1));CHKERRQ(ierr);
114234ed7027SBarry Smith       ierr = PetscViewerFlush(viewer);
114334ed7027SBarry Smith       ierr = PetscViewerASCIIPrintf(viewer, "  RINFO(2) (local estimated flops for the assembly after factorization): \n");CHKERRQ(ierr);
114434ed7027SBarry Smith       ierr = PetscViewerASCIISynchronizedPrintf(viewer,"    [%d]  %g \n",lu->myid,lu->id.RINFO(2));CHKERRQ(ierr);
114534ed7027SBarry Smith       ierr = PetscViewerFlush(viewer);
114634ed7027SBarry Smith       ierr = PetscViewerASCIIPrintf(viewer, "  RINFO(3) (local estimated flops for the elimination after factorization): \n");CHKERRQ(ierr);
114734ed7027SBarry Smith       ierr = PetscViewerASCIISynchronizedPrintf(viewer,"    [%d]  %g \n",lu->myid,lu->id.RINFO(3));CHKERRQ(ierr);
114834ed7027SBarry Smith       ierr = PetscViewerFlush(viewer);
1149f6c57405SHong Zhang 
115034ed7027SBarry Smith       ierr = PetscViewerASCIIPrintf(viewer, "  INFO(15) (estimated size of (in MB) MUMPS internal data for running numerical factorization): \n");CHKERRQ(ierr);
115134ed7027SBarry Smith       ierr = PetscViewerASCIISynchronizedPrintf(viewer,"  [%d] %d \n",lu->myid,lu->id.INFO(15));CHKERRQ(ierr);
115234ed7027SBarry Smith       ierr = PetscViewerFlush(viewer);
1153f6c57405SHong Zhang 
115434ed7027SBarry Smith       ierr = PetscViewerASCIIPrintf(viewer, "  INFO(16) (size of (in MB) MUMPS internal data used during numerical factorization): \n");CHKERRQ(ierr);
115534ed7027SBarry Smith       ierr = PetscViewerASCIISynchronizedPrintf(viewer,"    [%d] %d \n",lu->myid,lu->id.INFO(16));CHKERRQ(ierr);
115634ed7027SBarry Smith       ierr = PetscViewerFlush(viewer);
1157f6c57405SHong Zhang 
115834ed7027SBarry Smith       ierr = PetscViewerASCIIPrintf(viewer, "  INFO(23) (num of pivots eliminated on this processor after factorization): \n");CHKERRQ(ierr);
115934ed7027SBarry Smith       ierr = PetscViewerASCIISynchronizedPrintf(viewer,"    [%d] %d \n",lu->myid,lu->id.INFO(23));CHKERRQ(ierr);
116034ed7027SBarry Smith       ierr = PetscViewerFlush(viewer);
11617b23a99aSBarry Smith       ierr = PetscViewerASCIISynchronizedAllow(viewer,PETSC_FALSE);CHKERRQ(ierr);
1162f6c57405SHong Zhang 
1163f6c57405SHong Zhang       if (!lu->myid){ /* information from the host */
1164f6c57405SHong Zhang         ierr = PetscViewerASCIIPrintf(viewer,"  RINFOG(1) (global estimated flops for the elimination after analysis): %g \n",lu->id.RINFOG(1));CHKERRQ(ierr);
1165f6c57405SHong Zhang         ierr = PetscViewerASCIIPrintf(viewer,"  RINFOG(2) (global estimated flops for the assembly after factorization): %g \n",lu->id.RINFOG(2));CHKERRQ(ierr);
1166f6c57405SHong Zhang         ierr = PetscViewerASCIIPrintf(viewer,"  RINFOG(3) (global estimated flops for the elimination after factorization): %g \n",lu->id.RINFOG(3));CHKERRQ(ierr);
1167*42179a6aSHong Zhang         ierr = PetscViewerASCIIPrintf(viewer,"  (RINFOG(12) RINFOG(13))*2^INFOG(34) (determinant): (%g,%g)*(2^%d)\n",lu->id.RINFOG(12),lu->id.RINFOG(13),lu->id.INFOG(34));CHKERRQ(ierr);
1168f6c57405SHong Zhang 
1169f6c57405SHong Zhang         ierr = PetscViewerASCIIPrintf(viewer,"  INFOG(3) (estimated real workspace for factors on all processors after analysis): %d \n",lu->id.INFOG(3));CHKERRQ(ierr);
1170f6c57405SHong Zhang         ierr = PetscViewerASCIIPrintf(viewer,"  INFOG(4) (estimated integer workspace for factors on all processors after analysis): %d \n",lu->id.INFOG(4));CHKERRQ(ierr);
1171f6c57405SHong Zhang         ierr = PetscViewerASCIIPrintf(viewer,"  INFOG(5) (estimated maximum front size in the complete tree): %d \n",lu->id.INFOG(5));CHKERRQ(ierr);
1172f6c57405SHong Zhang         ierr = PetscViewerASCIIPrintf(viewer,"  INFOG(6) (number of nodes in the complete tree): %d \n",lu->id.INFOG(6));CHKERRQ(ierr);
11732bd8dccdSBarry Smith         ierr = PetscViewerASCIIPrintf(viewer,"  INFOG(7) (ordering option effectively use after analysis): %d \n",lu->id.INFOG(7));CHKERRQ(ierr);
1174f6c57405SHong Zhang         ierr = PetscViewerASCIIPrintf(viewer,"  INFOG(8) (structural symmetry in percent of the permuted matrix after analysis): %d \n",lu->id.INFOG(8));CHKERRQ(ierr);
1175f6c57405SHong 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);
1176f6c57405SHong Zhang         ierr = PetscViewerASCIIPrintf(viewer,"  INFOG(10) (total integer space store the matrix factors after factorization): %d \n",lu->id.INFOG(10));CHKERRQ(ierr);
1177f6c57405SHong Zhang         ierr = PetscViewerASCIIPrintf(viewer,"  INFOG(11) (order of largest frontal matrix after factorization): %d \n",lu->id.INFOG(11));CHKERRQ(ierr);
1178f6c57405SHong Zhang         ierr = PetscViewerASCIIPrintf(viewer,"  INFOG(12) (number of off-diagonal pivots): %d \n",lu->id.INFOG(12));CHKERRQ(ierr);
1179f6c57405SHong Zhang         ierr = PetscViewerASCIIPrintf(viewer,"  INFOG(13) (number of delayed pivots after factorization): %d \n",lu->id.INFOG(13));CHKERRQ(ierr);
1180f6c57405SHong Zhang         ierr = PetscViewerASCIIPrintf(viewer,"  INFOG(14) (number of memory compress after factorization): %d \n",lu->id.INFOG(14));CHKERRQ(ierr);
1181f6c57405SHong Zhang         ierr = PetscViewerASCIIPrintf(viewer,"  INFOG(15) (number of steps of iterative refinement after solution): %d \n",lu->id.INFOG(15));CHKERRQ(ierr);
1182f6c57405SHong 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);
1183f6c57405SHong 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);
1184f6c57405SHong 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);
1185f6c57405SHong 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);
1186f6c57405SHong Zhang         ierr = PetscViewerASCIIPrintf(viewer,"  INFOG(20) (estimated number of entries in the factors): %d \n",lu->id.INFOG(20));CHKERRQ(ierr);
1187f6c57405SHong 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);
1188f6c57405SHong 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);
1189f6c57405SHong Zhang         ierr = PetscViewerASCIIPrintf(viewer,"  INFOG(23) (after analysis: value of ICNTL(6) effectively used): %d \n",lu->id.INFOG(23));CHKERRQ(ierr);
1190f6c57405SHong Zhang         ierr = PetscViewerASCIIPrintf(viewer,"  INFOG(24) (after analysis: value of ICNTL(12) effectively used): %d \n",lu->id.INFOG(24));CHKERRQ(ierr);
1191f6c57405SHong Zhang         ierr = PetscViewerASCIIPrintf(viewer,"  INFOG(25) (after factorization: number of pivots modified by static pivoting): %d \n",lu->id.INFOG(25));CHKERRQ(ierr);
1192f6c57405SHong Zhang       }
1193f6c57405SHong Zhang     }
1194cb828f0fSHong Zhang   }
1195f6c57405SHong Zhang   PetscFunctionReturn(0);
1196f6c57405SHong Zhang }
1197f6c57405SHong Zhang 
119835bd34faSBarry Smith #undef __FUNCT__
119935bd34faSBarry Smith #define __FUNCT__ "MatGetInfo_MUMPS"
120035bd34faSBarry Smith PetscErrorCode MatGetInfo_MUMPS(Mat A,MatInfoType flag,MatInfo *info)
120135bd34faSBarry Smith {
1202cb828f0fSHong Zhang   Mat_MUMPS  *mumps =(Mat_MUMPS*)A->spptr;
120335bd34faSBarry Smith 
120435bd34faSBarry Smith   PetscFunctionBegin;
120535bd34faSBarry Smith   info->block_size        = 1.0;
1206cb828f0fSHong Zhang   info->nz_allocated      = mumps->id.INFOG(20);
1207cb828f0fSHong Zhang   info->nz_used           = mumps->id.INFOG(20);
120835bd34faSBarry Smith   info->nz_unneeded       = 0.0;
120935bd34faSBarry Smith   info->assemblies        = 0.0;
121035bd34faSBarry Smith   info->mallocs           = 0.0;
121135bd34faSBarry Smith   info->memory            = 0.0;
121235bd34faSBarry Smith   info->fill_ratio_given  = 0;
121335bd34faSBarry Smith   info->fill_ratio_needed = 0;
121435bd34faSBarry Smith   info->factor_mallocs    = 0;
121535bd34faSBarry Smith   PetscFunctionReturn(0);
121635bd34faSBarry Smith }
121735bd34faSBarry Smith 
12185ccb76cbSHong Zhang /* -------------------------------------------------------------------------------------------*/
12195ccb76cbSHong Zhang #undef __FUNCT__
12205ccb76cbSHong Zhang #define __FUNCT__ "MatMumpsSetIcntl_MUMPS"
12215ccb76cbSHong Zhang PetscErrorCode MatMumpsSetIcntl_MUMPS(Mat F,PetscInt icntl,PetscInt ival)
12225ccb76cbSHong Zhang {
12235ccb76cbSHong Zhang   Mat_MUMPS *lu =(Mat_MUMPS*)F->spptr;
12245ccb76cbSHong Zhang 
12255ccb76cbSHong Zhang   PetscFunctionBegin;
12265ccb76cbSHong Zhang   lu->id.ICNTL(icntl) = ival;
12275ccb76cbSHong Zhang   PetscFunctionReturn(0);
12285ccb76cbSHong Zhang }
12295ccb76cbSHong Zhang 
12305ccb76cbSHong Zhang #undef __FUNCT__
12315ccb76cbSHong Zhang #define __FUNCT__ "MatMumpsSetIcntl"
12325ccb76cbSHong Zhang /*@
12335ccb76cbSHong Zhang   MatMumpsSetIcntl - Set MUMPS parameter ICNTL()
12345ccb76cbSHong Zhang 
12355ccb76cbSHong Zhang    Logically Collective on Mat
12365ccb76cbSHong Zhang 
12375ccb76cbSHong Zhang    Input Parameters:
12385ccb76cbSHong Zhang +  F - the factored matrix obtained by calling MatGetFactor() from PETSc-MUMPS interface
12395ccb76cbSHong Zhang .  icntl - index of MUMPS parameter array ICNTL()
12405ccb76cbSHong Zhang -  ival - value of MUMPS ICNTL(icntl)
12415ccb76cbSHong Zhang 
12425ccb76cbSHong Zhang   Options Database:
12435ccb76cbSHong Zhang .   -mat_mumps_icntl_<icntl> <ival>
12445ccb76cbSHong Zhang 
12455ccb76cbSHong Zhang    Level: beginner
12465ccb76cbSHong Zhang 
12475ccb76cbSHong Zhang    References: MUMPS Users' Guide
12485ccb76cbSHong Zhang 
12495ccb76cbSHong Zhang .seealso: MatGetFactor()
12505ccb76cbSHong Zhang @*/
12515ccb76cbSHong Zhang PetscErrorCode MatMumpsSetIcntl(Mat F,PetscInt icntl,PetscInt ival)
12525ccb76cbSHong Zhang {
12535ccb76cbSHong Zhang   PetscErrorCode ierr;
12545ccb76cbSHong Zhang 
12555ccb76cbSHong Zhang   PetscFunctionBegin;
12565ccb76cbSHong Zhang   PetscValidLogicalCollectiveInt(F,icntl,2);
12575ccb76cbSHong Zhang   PetscValidLogicalCollectiveInt(F,ival,3);
12585ccb76cbSHong Zhang   ierr = PetscTryMethod(F,"MatMumpsSetIcntl_C",(Mat,PetscInt,PetscInt),(F,icntl,ival));CHKERRQ(ierr);
12595ccb76cbSHong Zhang   PetscFunctionReturn(0);
12605ccb76cbSHong Zhang }
12615ccb76cbSHong Zhang 
126224b6179bSKris Buschelman /*MC
12632692d6eeSBarry Smith   MATSOLVERMUMPS -  A matrix type providing direct solvers (LU and Cholesky) for
126424b6179bSKris Buschelman   distributed and sequential matrices via the external package MUMPS.
126524b6179bSKris Buschelman 
126641c8de11SBarry Smith   Works with MATAIJ and MATSBAIJ matrices
126724b6179bSKris Buschelman 
126824b6179bSKris Buschelman   Options Database Keys:
1269fb8376fbSHong Zhang + -mat_mumps_icntl_4 <0,...,4> - print level
127024b6179bSKris Buschelman . -mat_mumps_icntl_6 <0,...,7> - matrix prescaling options (see MUMPS User's Guide)
127164e6c443SBarry Smith . -mat_mumps_icntl_7 <0,...,7> - matrix orderings (see MUMPS User's Guidec)
127224b6179bSKris Buschelman . -mat_mumps_icntl_9 <1,2> - A or A^T x=b to be solved: 1 denotes A, 2 denotes A^T
127324b6179bSKris Buschelman . -mat_mumps_icntl_10 <n> - maximum number of iterative refinements
127494b7f48cSBarry Smith . -mat_mumps_icntl_11 <n> - error analysis, a positive value returns statistics during -ksp_view
127524b6179bSKris Buschelman . -mat_mumps_icntl_12 <n> - efficiency control (see MUMPS User's Guide)
127624b6179bSKris Buschelman . -mat_mumps_icntl_13 <n> - efficiency control (see MUMPS User's Guide)
127724b6179bSKris Buschelman . -mat_mumps_icntl_14 <n> - efficiency control (see MUMPS User's Guide)
127824b6179bSKris Buschelman . -mat_mumps_icntl_15 <n> - efficiency control (see MUMPS User's Guide)
127924b6179bSKris Buschelman . -mat_mumps_cntl_1 <delta> - relative pivoting threshold
128024b6179bSKris Buschelman . -mat_mumps_cntl_2 <tol> - stopping criterion for refinement
128124b6179bSKris Buschelman - -mat_mumps_cntl_3 <adelta> - absolute pivoting threshold
128224b6179bSKris Buschelman 
128324b6179bSKris Buschelman   Level: beginner
128424b6179bSKris Buschelman 
128541c8de11SBarry Smith .seealso: PCFactorSetMatSolverPackage(), MatSolverPackage
128641c8de11SBarry Smith 
128724b6179bSKris Buschelman M*/
128824b6179bSKris Buschelman 
12892877fffaSHong Zhang EXTERN_C_BEGIN
129035bd34faSBarry Smith #undef __FUNCT__
129135bd34faSBarry Smith #define __FUNCT__ "MatFactorGetSolverPackage_mumps"
129235bd34faSBarry Smith PetscErrorCode MatFactorGetSolverPackage_mumps(Mat A,const MatSolverPackage *type)
129335bd34faSBarry Smith {
129435bd34faSBarry Smith   PetscFunctionBegin;
12952692d6eeSBarry Smith   *type = MATSOLVERMUMPS;
129635bd34faSBarry Smith   PetscFunctionReturn(0);
129735bd34faSBarry Smith }
129835bd34faSBarry Smith EXTERN_C_END
129935bd34faSBarry Smith 
130035bd34faSBarry Smith EXTERN_C_BEGIN
1301bccb9932SShri Abhyankar /* MatGetFactor for Seq and MPI AIJ matrices */
13022877fffaSHong Zhang #undef __FUNCT__
1303bccb9932SShri Abhyankar #define __FUNCT__ "MatGetFactor_aij_mumps"
1304bccb9932SShri Abhyankar PetscErrorCode MatGetFactor_aij_mumps(Mat A,MatFactorType ftype,Mat *F)
13052877fffaSHong Zhang {
13062877fffaSHong Zhang   Mat            B;
13072877fffaSHong Zhang   PetscErrorCode ierr;
13082877fffaSHong Zhang   Mat_MUMPS      *mumps;
1309ace3abfcSBarry Smith   PetscBool      isSeqAIJ;
13102877fffaSHong Zhang 
13112877fffaSHong Zhang   PetscFunctionBegin;
13122877fffaSHong Zhang   /* Create the factorization matrix */
1313bccb9932SShri Abhyankar   ierr = PetscTypeCompare((PetscObject)A,MATSEQAIJ,&isSeqAIJ);CHKERRQ(ierr);
13142877fffaSHong Zhang   ierr = MatCreate(((PetscObject)A)->comm,&B);CHKERRQ(ierr);
13152877fffaSHong Zhang   ierr = MatSetSizes(B,A->rmap->n,A->cmap->n,A->rmap->N,A->cmap->N);CHKERRQ(ierr);
13162877fffaSHong Zhang   ierr = MatSetType(B,((PetscObject)A)->type_name);CHKERRQ(ierr);
1317bccb9932SShri Abhyankar   if (isSeqAIJ) {
13182877fffaSHong Zhang     ierr = MatSeqAIJSetPreallocation(B,0,PETSC_NULL);CHKERRQ(ierr);
1319bccb9932SShri Abhyankar   } else {
1320bccb9932SShri Abhyankar     ierr = MatMPIAIJSetPreallocation(B,0,PETSC_NULL,0,PETSC_NULL);CHKERRQ(ierr);
1321bccb9932SShri Abhyankar   }
13222877fffaSHong Zhang 
132316ebf90aSShri Abhyankar   ierr = PetscNewLog(B,Mat_MUMPS,&mumps);CHKERRQ(ierr);
13242877fffaSHong Zhang   B->ops->view             = MatView_MUMPS;
132535bd34faSBarry Smith   B->ops->getinfo          = MatGetInfo_MUMPS;
132635bd34faSBarry Smith   ierr = PetscObjectComposeFunctionDynamic((PetscObject)B,"MatFactorGetSolverPackage_C","MatFactorGetSolverPackage_mumps",MatFactorGetSolverPackage_mumps);CHKERRQ(ierr);
13275ccb76cbSHong Zhang   ierr = PetscObjectComposeFunctionDynamic((PetscObject)B,"MatMumpsSetIcntl_C","MatMumpsSetIcntl_MUMPS",MatMumpsSetIcntl_MUMPS);CHKERRQ(ierr);
1328450b117fSShri Abhyankar   if (ftype == MAT_FACTOR_LU) {
1329450b117fSShri Abhyankar     B->ops->lufactorsymbolic = MatLUFactorSymbolic_AIJMUMPS;
1330d5f3da31SBarry Smith     B->factortype = MAT_FACTOR_LU;
1331bccb9932SShri Abhyankar     if (isSeqAIJ) mumps->ConvertToTriples = MatConvertToTriples_seqaij_seqaij;
1332bccb9932SShri Abhyankar     else mumps->ConvertToTriples = MatConvertToTriples_mpiaij_mpiaij;
1333746480a1SHong Zhang     mumps->sym = 0;
1334dcd589f8SShri Abhyankar   } else {
133567877ebaSShri Abhyankar     B->ops->choleskyfactorsymbolic = MatCholeskyFactorSymbolic_MUMPS;
1336450b117fSShri Abhyankar     B->factortype = MAT_FACTOR_CHOLESKY;
1337bccb9932SShri Abhyankar     if (isSeqAIJ) mumps->ConvertToTriples = MatConvertToTriples_seqaij_seqsbaij;
1338bccb9932SShri Abhyankar     else mumps->ConvertToTriples = MatConvertToTriples_mpiaij_mpisbaij;
13396fdc2a6dSBarry Smith     if (A->spd_set && A->spd) mumps->sym = 1;
13406fdc2a6dSBarry Smith     else                      mumps->sym = 2;
1341450b117fSShri Abhyankar   }
13422877fffaSHong Zhang 
13432877fffaSHong Zhang   mumps->isAIJ        = PETSC_TRUE;
1344bf0cc555SLisandro Dalcin   mumps->Destroy      = B->ops->destroy;
13452877fffaSHong Zhang   B->ops->destroy     = MatDestroy_MUMPS;
13462877fffaSHong Zhang   B->spptr            = (void*)mumps;
1347f697e70eSHong Zhang   ierr = PetscInitializeMUMPS(A,mumps);CHKERRQ(ierr);
1348746480a1SHong Zhang 
13492877fffaSHong Zhang   *F = B;
13502877fffaSHong Zhang   PetscFunctionReturn(0);
13512877fffaSHong Zhang }
13522877fffaSHong Zhang EXTERN_C_END
13532877fffaSHong Zhang 
1354bccb9932SShri Abhyankar 
13552877fffaSHong Zhang EXTERN_C_BEGIN
1356bccb9932SShri Abhyankar /* MatGetFactor for Seq and MPI SBAIJ matrices */
13572877fffaSHong Zhang #undef __FUNCT__
1358bccb9932SShri Abhyankar #define __FUNCT__ "MatGetFactor_sbaij_mumps"
1359bccb9932SShri Abhyankar PetscErrorCode MatGetFactor_sbaij_mumps(Mat A,MatFactorType ftype,Mat *F)
13602877fffaSHong Zhang {
13612877fffaSHong Zhang   Mat            B;
13622877fffaSHong Zhang   PetscErrorCode ierr;
13632877fffaSHong Zhang   Mat_MUMPS      *mumps;
1364ace3abfcSBarry Smith   PetscBool      isSeqSBAIJ;
13652877fffaSHong Zhang 
13662877fffaSHong Zhang   PetscFunctionBegin;
1367e7e72b3dSBarry Smith   if (ftype != MAT_FACTOR_CHOLESKY) SETERRQ(((PetscObject)A)->comm,PETSC_ERR_SUP,"Cannot use PETSc SBAIJ matrices with MUMPS LU, use AIJ matrix");
1368bccb9932SShri Abhyankar   if(A->rmap->bs > 1) SETERRQ(((PetscObject)A)->comm,PETSC_ERR_SUP,"Cannot use PETSc SBAIJ matrices with block size > 1 with MUMPS Cholesky, use AIJ matrix instead");
1369bccb9932SShri Abhyankar   ierr = PetscTypeCompare((PetscObject)A,MATSEQSBAIJ,&isSeqSBAIJ);CHKERRQ(ierr);
13702877fffaSHong Zhang   /* Create the factorization matrix */
13712877fffaSHong Zhang   ierr = MatCreate(((PetscObject)A)->comm,&B);CHKERRQ(ierr);
13722877fffaSHong Zhang   ierr = MatSetSizes(B,A->rmap->n,A->cmap->n,A->rmap->N,A->cmap->N);CHKERRQ(ierr);
13732877fffaSHong Zhang   ierr = MatSetType(B,((PetscObject)A)->type_name);CHKERRQ(ierr);
137416ebf90aSShri Abhyankar   ierr = PetscNewLog(B,Mat_MUMPS,&mumps);CHKERRQ(ierr);
1375bccb9932SShri Abhyankar   if (isSeqSBAIJ) {
1376bccb9932SShri Abhyankar     ierr = MatSeqSBAIJSetPreallocation(B,1,0,PETSC_NULL);CHKERRQ(ierr);
137716ebf90aSShri Abhyankar     mumps->ConvertToTriples = MatConvertToTriples_seqsbaij_seqsbaij;
1378dcd589f8SShri Abhyankar   } else {
1379bccb9932SShri Abhyankar     ierr = MatMPISBAIJSetPreallocation(B,1,0,PETSC_NULL,0,PETSC_NULL);CHKERRQ(ierr);
1380bccb9932SShri Abhyankar     mumps->ConvertToTriples = MatConvertToTriples_mpisbaij_mpisbaij;
1381bccb9932SShri Abhyankar   }
1382bccb9932SShri Abhyankar 
138367877ebaSShri Abhyankar   B->ops->choleskyfactorsymbolic = MatCholeskyFactorSymbolic_MUMPS;
1384bccb9932SShri Abhyankar   B->ops->view                   = MatView_MUMPS;
1385bccb9932SShri Abhyankar   ierr = PetscObjectComposeFunctionDynamic((PetscObject)B,"MatFactorGetSolverPackage_C","MatFactorGetSolverPackage_mumps",MatFactorGetSolverPackage_mumps);CHKERRQ(ierr);
1386f250808bSBarry Smith   ierr = PetscObjectComposeFunctionDynamic((PetscObject)B,"MatMumpsSetIcntl_C","MatMumpsSetIcntl",MatMumpsSetIcntl);CHKERRQ(ierr);
1387f4762488SHong Zhang   B->factortype                  = MAT_FACTOR_CHOLESKY;
13886fdc2a6dSBarry Smith   if (A->spd_set && A->spd) mumps->sym = 1;
13896fdc2a6dSBarry Smith   else                      mumps->sym = 2;
1390a214ac2aSShri Abhyankar 
1391bccb9932SShri Abhyankar   mumps->isAIJ        = PETSC_FALSE;
1392bf0cc555SLisandro Dalcin   mumps->Destroy      = B->ops->destroy;
1393f3c0ef26SHong Zhang   B->ops->destroy     = MatDestroy_MUMPS;
13942877fffaSHong Zhang   B->spptr            = (void*)mumps;
1395f697e70eSHong Zhang   ierr = PetscInitializeMUMPS(A,mumps);CHKERRQ(ierr);
1396746480a1SHong Zhang 
13972877fffaSHong Zhang   *F = B;
13982877fffaSHong Zhang   PetscFunctionReturn(0);
13992877fffaSHong Zhang }
14002877fffaSHong Zhang EXTERN_C_END
140197969023SHong Zhang 
1402450b117fSShri Abhyankar EXTERN_C_BEGIN
1403450b117fSShri Abhyankar #undef __FUNCT__
1404bccb9932SShri Abhyankar #define __FUNCT__ "MatGetFactor_baij_mumps"
1405bccb9932SShri Abhyankar PetscErrorCode MatGetFactor_baij_mumps(Mat A,MatFactorType ftype,Mat *F)
140667877ebaSShri Abhyankar {
140767877ebaSShri Abhyankar   Mat            B;
140867877ebaSShri Abhyankar   PetscErrorCode ierr;
140967877ebaSShri Abhyankar   Mat_MUMPS      *mumps;
1410ace3abfcSBarry Smith   PetscBool      isSeqBAIJ;
141167877ebaSShri Abhyankar 
141267877ebaSShri Abhyankar   PetscFunctionBegin;
141367877ebaSShri Abhyankar   /* Create the factorization matrix */
1414bccb9932SShri Abhyankar   ierr = PetscTypeCompare((PetscObject)A,MATSEQBAIJ,&isSeqBAIJ);CHKERRQ(ierr);
141567877ebaSShri Abhyankar   ierr = MatCreate(((PetscObject)A)->comm,&B);CHKERRQ(ierr);
141667877ebaSShri Abhyankar   ierr = MatSetSizes(B,A->rmap->n,A->cmap->n,A->rmap->N,A->cmap->N);CHKERRQ(ierr);
141767877ebaSShri Abhyankar   ierr = MatSetType(B,((PetscObject)A)->type_name);CHKERRQ(ierr);
1418bccb9932SShri Abhyankar   if (isSeqBAIJ) {
141967877ebaSShri Abhyankar     ierr = MatSeqBAIJSetPreallocation(B,A->rmap->bs,0,PETSC_NULL);CHKERRQ(ierr);
1420bccb9932SShri Abhyankar   } else {
142167877ebaSShri Abhyankar     ierr = MatMPIBAIJSetPreallocation(B,A->rmap->bs,0,PETSC_NULL,0,PETSC_NULL);CHKERRQ(ierr);
1422bccb9932SShri Abhyankar   }
1423450b117fSShri Abhyankar 
142467877ebaSShri Abhyankar   ierr = PetscNewLog(B,Mat_MUMPS,&mumps);CHKERRQ(ierr);
1425450b117fSShri Abhyankar   if (ftype == MAT_FACTOR_LU) {
1426450b117fSShri Abhyankar     B->ops->lufactorsymbolic = MatLUFactorSymbolic_BAIJMUMPS;
1427450b117fSShri Abhyankar     B->factortype = MAT_FACTOR_LU;
1428bccb9932SShri Abhyankar     if (isSeqBAIJ) mumps->ConvertToTriples = MatConvertToTriples_seqbaij_seqaij;
1429bccb9932SShri Abhyankar     else mumps->ConvertToTriples = MatConvertToTriples_mpibaij_mpiaij;
1430746480a1SHong Zhang     mumps->sym = 0;
1431746480a1SHong Zhang   } else {
1432746480a1SHong Zhang     SETERRQ(PETSC_COMM_SELF,PETSC_ERR_SUP,"Cannot use PETSc BAIJ matrices with MUMPS Cholesky, use SBAIJ or AIJ matrix instead\n");
1433450b117fSShri Abhyankar   }
1434bccb9932SShri Abhyankar 
1435450b117fSShri Abhyankar   B->ops->view             = MatView_MUMPS;
1436450b117fSShri Abhyankar   ierr = PetscObjectComposeFunctionDynamic((PetscObject)B,"MatFactorGetSolverPackage_C","MatFactorGetSolverPackage_mumps",MatFactorGetSolverPackage_mumps);CHKERRQ(ierr);
14375ccb76cbSHong Zhang   ierr = PetscObjectComposeFunctionDynamic((PetscObject)B,"MatMumpsSetIcntl_C","MatMumpsSetIcntl_MUMPS",MatMumpsSetIcntl_MUMPS);CHKERRQ(ierr);
1438450b117fSShri Abhyankar 
1439450b117fSShri Abhyankar   mumps->isAIJ        = PETSC_TRUE;
1440bf0cc555SLisandro Dalcin   mumps->Destroy      = B->ops->destroy;
1441450b117fSShri Abhyankar   B->ops->destroy     = MatDestroy_MUMPS;
1442450b117fSShri Abhyankar   B->spptr            = (void*)mumps;
1443f697e70eSHong Zhang   ierr = PetscInitializeMUMPS(A,mumps);CHKERRQ(ierr);
1444746480a1SHong Zhang 
1445450b117fSShri Abhyankar   *F = B;
1446450b117fSShri Abhyankar   PetscFunctionReturn(0);
1447450b117fSShri Abhyankar }
1448450b117fSShri Abhyankar EXTERN_C_END
1449a214ac2aSShri Abhyankar 
1450