xref: /petsc/src/mat/impls/aij/mpi/mumps/mumps.c (revision 2bd8dccdf1f80a23df498ad311e55a789b6d129c)
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;
40516ebf90aSShri Abhyankar   PetscInt           rstart,nz,nza,nzb_low,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) {
42016ebf90aSShri Abhyankar     nza = 0;nzb_low = 0;
42116ebf90aSShri Abhyankar     for(i=0; i<m; i++){
42216ebf90aSShri Abhyankar       nza     = nza + (ai[i+1] - adiag[i]);
42316ebf90aSShri Abhyankar       countB  = bi[i+1] - bi[i];
42416ebf90aSShri Abhyankar       bjj     = bj + bi[i];
42516ebf90aSShri Abhyankar 
42616ebf90aSShri Abhyankar       j = 0;
42716ebf90aSShri Abhyankar       while(garray[bjj[j]] < rstart) {
42816ebf90aSShri Abhyankar 	if(j == countB) break;
42916ebf90aSShri Abhyankar 	j++;nzb_low++;
43016ebf90aSShri Abhyankar       }
43116ebf90aSShri Abhyankar     }
43216ebf90aSShri Abhyankar     /* Total nz = nz for the upper triangular A part + nz for the 2nd B part */
43316ebf90aSShri Abhyankar     nz = nza + (bb->nz - nzb_low);
43416ebf90aSShri Abhyankar     *nnz = nz;
435185f6596SHong Zhang     ierr = PetscMalloc((2*nz*sizeof(PetscInt)+nz*sizeof(PetscScalar)), &row);CHKERRQ(ierr);
436185f6596SHong Zhang     col  = row + nz;
437185f6596SHong Zhang     val  = (PetscScalar*)(col + nz);
438185f6596SHong Zhang 
43916ebf90aSShri Abhyankar     *r = row; *c = col; *v = val;
44016ebf90aSShri Abhyankar   } else {
44116ebf90aSShri Abhyankar     row = *r; col = *c; val = *v;
44216ebf90aSShri Abhyankar   }
44316ebf90aSShri Abhyankar 
44416ebf90aSShri Abhyankar   jj = 0; irow = rstart;
44516ebf90aSShri Abhyankar   for ( i=0; i<m; i++ ) {
44616ebf90aSShri Abhyankar     ajj    = aj + adiag[i];                 /* ptr to the beginning of the diagonal of this row */
44716ebf90aSShri Abhyankar     v1     = av + adiag[i];
44816ebf90aSShri Abhyankar     countA = ai[i+1] - adiag[i];
44916ebf90aSShri Abhyankar     countB = bi[i+1] - bi[i];
45016ebf90aSShri Abhyankar     bjj    = bj + bi[i];
45116ebf90aSShri Abhyankar     v2     = bv + bi[i];
45216ebf90aSShri Abhyankar 
45316ebf90aSShri Abhyankar      /* A-part */
45416ebf90aSShri Abhyankar     for (j=0; j<countA; j++){
455bccb9932SShri Abhyankar       if (reuse == MAT_INITIAL_MATRIX) {
45616ebf90aSShri Abhyankar         row[jj] = irow + shift; col[jj] = rstart + ajj[j] + shift;
45716ebf90aSShri Abhyankar       }
45816ebf90aSShri Abhyankar       val[jj++] = v1[j];
45916ebf90aSShri Abhyankar     }
46016ebf90aSShri Abhyankar 
46116ebf90aSShri Abhyankar     /* B-part */
46216ebf90aSShri Abhyankar     for(j=0; j < countB; j++){
46316ebf90aSShri Abhyankar       if (garray[bjj[j]] > rstart) {
464bccb9932SShri Abhyankar 	if (reuse == MAT_INITIAL_MATRIX) {
46516ebf90aSShri Abhyankar 	  row[jj] = irow + shift; col[jj] = garray[bjj[j]] + shift;
46616ebf90aSShri Abhyankar 	}
46716ebf90aSShri Abhyankar 	val[jj++] = v2[j];
46816ebf90aSShri Abhyankar       }
469397b6df1SKris Buschelman     }
470397b6df1SKris Buschelman     irow++;
471397b6df1SKris Buschelman   }
472397b6df1SKris Buschelman   PetscFunctionReturn(0);
473397b6df1SKris Buschelman }
474397b6df1SKris Buschelman 
475397b6df1SKris Buschelman #undef __FUNCT__
4763924e44cSKris Buschelman #define __FUNCT__ "MatDestroy_MUMPS"
477dfbe8321SBarry Smith PetscErrorCode MatDestroy_MUMPS(Mat A)
478dfbe8321SBarry Smith {
479f0c56d0fSKris Buschelman   Mat_MUMPS      *lu=(Mat_MUMPS*)A->spptr;
480dfbe8321SBarry Smith   PetscErrorCode ierr;
481b24902e0SBarry Smith 
482397b6df1SKris Buschelman   PetscFunctionBegin;
483bf0cc555SLisandro Dalcin   if (lu && lu->CleanUpMUMPS) {
484397b6df1SKris Buschelman     /* Terminate instance, deallocate memories */
4856bf464f9SBarry Smith     ierr = PetscFree2(lu->id.sol_loc,lu->id.isol_loc);CHKERRQ(ierr);
4866bf464f9SBarry Smith     ierr = VecScatterDestroy(&lu->scat_rhs);CHKERRQ(ierr);
4876bf464f9SBarry Smith     ierr = VecDestroy(&lu->b_seq);CHKERRQ(ierr);
488bf0cc555SLisandro Dalcin     ierr = VecScatterDestroy(&lu->scat_sol);CHKERRQ(ierr);
489bf0cc555SLisandro Dalcin     ierr = VecDestroy(&lu->x_seq);CHKERRQ(ierr);
4906bf464f9SBarry Smith     ierr=PetscFree(lu->id.perm_in);CHKERRQ(ierr);
491185f6596SHong Zhang     ierr = PetscFree(lu->irn);CHKERRQ(ierr);
492397b6df1SKris Buschelman     lu->id.job=JOB_END;
493397b6df1SKris Buschelman #if defined(PETSC_USE_COMPLEX)
494397b6df1SKris Buschelman     zmumps_c(&lu->id);
495397b6df1SKris Buschelman #else
496397b6df1SKris Buschelman     dmumps_c(&lu->id);
497397b6df1SKris Buschelman #endif
498397b6df1SKris Buschelman     ierr = MPI_Comm_free(&(lu->comm_mumps));CHKERRQ(ierr);
499397b6df1SKris Buschelman   }
500bf0cc555SLisandro Dalcin   if (lu && lu->Destroy) {
501bf0cc555SLisandro Dalcin     ierr = (lu->Destroy)(A);CHKERRQ(ierr);
502bf0cc555SLisandro Dalcin   }
503bf0cc555SLisandro Dalcin   ierr = PetscFree(A->spptr);CHKERRQ(ierr);
504bf0cc555SLisandro Dalcin 
50597969023SHong Zhang   /* clear composed functions */
50697969023SHong Zhang   ierr = PetscObjectComposeFunctionDynamic((PetscObject)A,"MatFactorGetSolverPackage_C","",PETSC_NULL);CHKERRQ(ierr);
507f250808bSBarry Smith   ierr = PetscObjectComposeFunctionDynamic((PetscObject)A,"MatMumpsSetIcntl_C","",PETSC_NULL);CHKERRQ(ierr);
508397b6df1SKris Buschelman   PetscFunctionReturn(0);
509397b6df1SKris Buschelman }
510397b6df1SKris Buschelman 
511397b6df1SKris Buschelman #undef __FUNCT__
512f6c57405SHong Zhang #define __FUNCT__ "MatSolve_MUMPS"
513b24902e0SBarry Smith PetscErrorCode MatSolve_MUMPS(Mat A,Vec b,Vec x)
514b24902e0SBarry Smith {
515f0c56d0fSKris Buschelman   Mat_MUMPS      *lu=(Mat_MUMPS*)A->spptr;
516d54de34fSKris Buschelman   PetscScalar    *array;
51767877ebaSShri Abhyankar   Vec            b_seq;
518329ec9b3SHong Zhang   IS             is_iden,is_petsc;
519dfbe8321SBarry Smith   PetscErrorCode ierr;
520329ec9b3SHong Zhang   PetscInt       i;
521397b6df1SKris Buschelman 
522397b6df1SKris Buschelman   PetscFunctionBegin;
523329ec9b3SHong Zhang   lu->id.nrhs = 1;
52467877ebaSShri Abhyankar   b_seq = lu->b_seq;
525397b6df1SKris Buschelman   if (lu->size > 1){
526329ec9b3SHong Zhang     /* MUMPS only supports centralized rhs. Scatter b into a seqential rhs vector */
52767877ebaSShri Abhyankar     ierr = VecScatterBegin(lu->scat_rhs,b,b_seq,INSERT_VALUES,SCATTER_FORWARD);CHKERRQ(ierr);
52867877ebaSShri Abhyankar     ierr = VecScatterEnd(lu->scat_rhs,b,b_seq,INSERT_VALUES,SCATTER_FORWARD);CHKERRQ(ierr);
52967877ebaSShri Abhyankar     if (!lu->myid) {ierr = VecGetArray(b_seq,&array);CHKERRQ(ierr);}
530397b6df1SKris Buschelman   } else {  /* size == 1 */
531397b6df1SKris Buschelman     ierr = VecCopy(b,x);CHKERRQ(ierr);
532397b6df1SKris Buschelman     ierr = VecGetArray(x,&array);CHKERRQ(ierr);
533397b6df1SKris Buschelman   }
534397b6df1SKris Buschelman   if (!lu->myid) { /* define rhs on the host */
5358278f211SHong Zhang     lu->id.nrhs = 1;
536397b6df1SKris Buschelman #if defined(PETSC_USE_COMPLEX)
537397b6df1SKris Buschelman     lu->id.rhs = (mumps_double_complex*)array;
538397b6df1SKris Buschelman #else
539397b6df1SKris Buschelman     lu->id.rhs = array;
540397b6df1SKris Buschelman #endif
541397b6df1SKris Buschelman   }
542397b6df1SKris Buschelman 
543397b6df1SKris Buschelman   /* solve phase */
544329ec9b3SHong Zhang   /*-------------*/
5453d472b54SHong Zhang   lu->id.job = JOB_SOLVE;
546397b6df1SKris Buschelman #if defined(PETSC_USE_COMPLEX)
547397b6df1SKris Buschelman   zmumps_c(&lu->id);
548397b6df1SKris Buschelman #else
549397b6df1SKris Buschelman   dmumps_c(&lu->id);
550397b6df1SKris Buschelman #endif
55165e19b50SBarry 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));
552397b6df1SKris Buschelman 
553329ec9b3SHong Zhang   if (lu->size > 1) { /* convert mumps distributed solution to petsc mpi x */
554329ec9b3SHong Zhang     if (!lu->nSolve){ /* create scatter scat_sol */
555329ec9b3SHong Zhang       ierr = ISCreateStride(PETSC_COMM_SELF,lu->id.lsol_loc,0,1,&is_iden);CHKERRQ(ierr); /* from */
556329ec9b3SHong Zhang       for (i=0; i<lu->id.lsol_loc; i++){
557329ec9b3SHong Zhang         lu->id.isol_loc[i] -= 1; /* change Fortran style to C style */
558397b6df1SKris Buschelman       }
55970b3c8c7SBarry Smith       ierr = ISCreateGeneral(PETSC_COMM_SELF,lu->id.lsol_loc,lu->id.isol_loc,PETSC_COPY_VALUES,&is_petsc);CHKERRQ(ierr);  /* to */
560329ec9b3SHong Zhang       ierr = VecScatterCreate(lu->x_seq,is_iden,x,is_petsc,&lu->scat_sol);CHKERRQ(ierr);
5616bf464f9SBarry Smith       ierr = ISDestroy(&is_iden);CHKERRQ(ierr);
5626bf464f9SBarry Smith       ierr = ISDestroy(&is_petsc);CHKERRQ(ierr);
563397b6df1SKris Buschelman     }
564ca9f406cSSatish Balay     ierr = VecScatterBegin(lu->scat_sol,lu->x_seq,x,INSERT_VALUES,SCATTER_FORWARD);CHKERRQ(ierr);
565ca9f406cSSatish Balay     ierr = VecScatterEnd(lu->scat_sol,lu->x_seq,x,INSERT_VALUES,SCATTER_FORWARD);CHKERRQ(ierr);
566329ec9b3SHong Zhang   }
567329ec9b3SHong Zhang   lu->nSolve++;
568397b6df1SKris Buschelman   PetscFunctionReturn(0);
569397b6df1SKris Buschelman }
570397b6df1SKris Buschelman 
57151d5961aSHong Zhang #undef __FUNCT__
57251d5961aSHong Zhang #define __FUNCT__ "MatSolveTranspose_MUMPS"
57351d5961aSHong Zhang PetscErrorCode MatSolveTranspose_MUMPS(Mat A,Vec b,Vec x)
57451d5961aSHong Zhang {
57551d5961aSHong Zhang   Mat_MUMPS      *lu=(Mat_MUMPS*)A->spptr;
57651d5961aSHong Zhang   PetscErrorCode ierr;
57751d5961aSHong Zhang 
57851d5961aSHong Zhang   PetscFunctionBegin;
57951d5961aSHong Zhang   lu->id.ICNTL(9) = 0;
5800ad0caddSJed Brown   ierr = MatSolve_MUMPS(A,b,x);CHKERRQ(ierr);
58151d5961aSHong Zhang   lu->id.ICNTL(9) = 1;
58251d5961aSHong Zhang   PetscFunctionReturn(0);
58351d5961aSHong Zhang }
58451d5961aSHong Zhang 
585e0b74bf9SHong Zhang #undef __FUNCT__
586e0b74bf9SHong Zhang #define __FUNCT__ "MatMatSolve_MUMPS"
587e0b74bf9SHong Zhang PetscErrorCode MatMatSolve_MUMPS(Mat A,Mat B,Mat X)
588e0b74bf9SHong Zhang {
589e0b74bf9SHong Zhang   PetscFunctionBegin;
590e0b74bf9SHong Zhang   SETERRQ(PETSC_COMM_SELF,PETSC_ERR_SUP,"MatMatSolve_MUMPS() is not implemented yet");
591e0b74bf9SHong Zhang   PetscFunctionReturn(0);
592e0b74bf9SHong Zhang }
593e0b74bf9SHong Zhang 
594ace3df97SHong Zhang #if !defined(PETSC_USE_COMPLEX)
595a58c3f20SHong Zhang /*
596a58c3f20SHong Zhang   input:
597a58c3f20SHong Zhang    F:        numeric factor
598a58c3f20SHong Zhang   output:
599a58c3f20SHong Zhang    nneg:     total number of negative pivots
600a58c3f20SHong Zhang    nzero:    0
601a58c3f20SHong Zhang    npos:     (global dimension of F) - nneg
602a58c3f20SHong Zhang */
603a58c3f20SHong Zhang 
604a58c3f20SHong Zhang #undef __FUNCT__
605a58c3f20SHong Zhang #define __FUNCT__ "MatGetInertia_SBAIJMUMPS"
606dfbe8321SBarry Smith PetscErrorCode MatGetInertia_SBAIJMUMPS(Mat F,int *nneg,int *nzero,int *npos)
607a58c3f20SHong Zhang {
608a58c3f20SHong Zhang   Mat_MUMPS      *lu =(Mat_MUMPS*)F->spptr;
609dfbe8321SBarry Smith   PetscErrorCode ierr;
610c1490034SHong Zhang   PetscMPIInt    size;
611a58c3f20SHong Zhang 
612a58c3f20SHong Zhang   PetscFunctionBegin;
6137adad957SLisandro Dalcin   ierr = MPI_Comm_size(((PetscObject)F)->comm,&size);CHKERRQ(ierr);
614bcb30aebSHong 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 */
61565e19b50SBarry 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));
616a58c3f20SHong Zhang   if (nneg){
617a58c3f20SHong Zhang     if (!lu->myid){
618a58c3f20SHong Zhang       *nneg = lu->id.INFOG(12);
619a58c3f20SHong Zhang     }
620bcb30aebSHong Zhang     ierr = MPI_Bcast(nneg,1,MPI_INT,0,lu->comm_mumps);CHKERRQ(ierr);
621a58c3f20SHong Zhang   }
622a58c3f20SHong Zhang   if (nzero) *nzero = 0;
623d0f46423SBarry Smith   if (npos)  *npos  = F->rmap->N - (*nneg);
624a58c3f20SHong Zhang   PetscFunctionReturn(0);
625a58c3f20SHong Zhang }
626ace3df97SHong Zhang #endif /* !defined(PETSC_USE_COMPLEX) */
627a58c3f20SHong Zhang 
628397b6df1SKris Buschelman #undef __FUNCT__
629f6c57405SHong Zhang #define __FUNCT__ "MatFactorNumeric_MUMPS"
6300481f469SBarry Smith PetscErrorCode MatFactorNumeric_MUMPS(Mat F,Mat A,const MatFactorInfo *info)
631af281ebdSHong Zhang {
632dcd589f8SShri Abhyankar   Mat_MUMPS       *lu =(Mat_MUMPS*)(F)->spptr;
6336849ba73SBarry Smith   PetscErrorCode  ierr;
634bccb9932SShri Abhyankar   MatReuse        reuse;
635e09efc27SHong Zhang   Mat             F_diag;
636ace3abfcSBarry Smith   PetscBool       isMPIAIJ;
637397b6df1SKris Buschelman 
638397b6df1SKris Buschelman   PetscFunctionBegin;
639bccb9932SShri Abhyankar   reuse = MAT_REUSE_MATRIX;
640bccb9932SShri Abhyankar   ierr = (*lu->ConvertToTriples)(A, 1, reuse, &lu->nz, &lu->irn, &lu->jcn, &lu->val);CHKERRQ(ierr);
641397b6df1SKris Buschelman 
642397b6df1SKris Buschelman   /* numerical factorization phase */
643329ec9b3SHong Zhang   /*-------------------------------*/
6443d472b54SHong Zhang   lu->id.job = JOB_FACTNUMERIC;
645958c9bccSBarry Smith   if(!lu->id.ICNTL(18)) {
646a7aca84bSHong Zhang     if (!lu->myid) {
647397b6df1SKris Buschelman #if defined(PETSC_USE_COMPLEX)
648397b6df1SKris Buschelman       lu->id.a = (mumps_double_complex*)lu->val;
649397b6df1SKris Buschelman #else
650397b6df1SKris Buschelman       lu->id.a = lu->val;
651397b6df1SKris Buschelman #endif
652397b6df1SKris Buschelman     }
653397b6df1SKris Buschelman   } else {
654397b6df1SKris Buschelman #if defined(PETSC_USE_COMPLEX)
655397b6df1SKris Buschelman     lu->id.a_loc = (mumps_double_complex*)lu->val;
656397b6df1SKris Buschelman #else
657397b6df1SKris Buschelman     lu->id.a_loc = lu->val;
658397b6df1SKris Buschelman #endif
659397b6df1SKris Buschelman   }
660397b6df1SKris Buschelman #if defined(PETSC_USE_COMPLEX)
661397b6df1SKris Buschelman   zmumps_c(&lu->id);
662397b6df1SKris Buschelman #else
663397b6df1SKris Buschelman   dmumps_c(&lu->id);
664397b6df1SKris Buschelman #endif
665397b6df1SKris Buschelman   if (lu->id.INFOG(1) < 0) {
66665e19b50SBarry 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));
66765e19b50SBarry 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));
668397b6df1SKris Buschelman   }
66965e19b50SBarry 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));
670397b6df1SKris Buschelman 
6718ada1bb4SHong Zhang   if (lu->size > 1){
67216ebf90aSShri Abhyankar     ierr = PetscTypeCompare((PetscObject)A,MATMPIAIJ,&isMPIAIJ);CHKERRQ(ierr);
673a214ac2aSShri Abhyankar     if(isMPIAIJ) {
674dcd589f8SShri Abhyankar       F_diag = ((Mat_MPIAIJ *)(F)->data)->A;
675e09efc27SHong Zhang     } else {
676dcd589f8SShri Abhyankar       F_diag = ((Mat_MPISBAIJ *)(F)->data)->A;
677e09efc27SHong Zhang     }
678e09efc27SHong Zhang     F_diag->assembled = PETSC_TRUE;
679329ec9b3SHong Zhang     if (lu->nSolve){
6806bf464f9SBarry Smith       ierr = VecScatterDestroy(&lu->scat_sol);CHKERRQ(ierr);
6810e83c824SBarry Smith       ierr = PetscFree2(lu->id.sol_loc,lu->id.isol_loc);CHKERRQ(ierr);
6826bf464f9SBarry Smith       ierr = VecDestroy(&lu->x_seq);CHKERRQ(ierr);
683329ec9b3SHong Zhang     }
6848ada1bb4SHong Zhang   }
685dcd589f8SShri Abhyankar   (F)->assembled   = PETSC_TRUE;
686397b6df1SKris Buschelman   lu->matstruc     = SAME_NONZERO_PATTERN;
687ace87b0dSHong Zhang   lu->CleanUpMUMPS = PETSC_TRUE;
688329ec9b3SHong Zhang   lu->nSolve       = 0;
68967877ebaSShri Abhyankar 
69067877ebaSShri Abhyankar   if (lu->size > 1){
69167877ebaSShri Abhyankar     /* distributed solution */
69267877ebaSShri Abhyankar     lu->id.ICNTL(21) = 1;
69367877ebaSShri Abhyankar     if (!lu->nSolve){
69467877ebaSShri Abhyankar       /* Create x_seq=sol_loc for repeated use */
69567877ebaSShri Abhyankar       PetscInt    lsol_loc;
69667877ebaSShri Abhyankar       PetscScalar *sol_loc;
69767877ebaSShri Abhyankar       lsol_loc = lu->id.INFO(23); /* length of sol_loc */
69867877ebaSShri Abhyankar       ierr = PetscMalloc2(lsol_loc,PetscScalar,&sol_loc,lsol_loc,PetscInt,&lu->id.isol_loc);CHKERRQ(ierr);
69967877ebaSShri Abhyankar       lu->id.lsol_loc = lsol_loc;
70067877ebaSShri Abhyankar #if defined(PETSC_USE_COMPLEX)
70167877ebaSShri Abhyankar       lu->id.sol_loc  = (mumps_double_complex*)sol_loc;
70267877ebaSShri Abhyankar #else
70367877ebaSShri Abhyankar       lu->id.sol_loc  = sol_loc;
70467877ebaSShri Abhyankar #endif
70567877ebaSShri Abhyankar       ierr = VecCreateSeqWithArray(PETSC_COMM_SELF,lsol_loc,sol_loc,&lu->x_seq);CHKERRQ(ierr);
70667877ebaSShri Abhyankar     }
70767877ebaSShri Abhyankar   }
708397b6df1SKris Buschelman   PetscFunctionReturn(0);
709397b6df1SKris Buschelman }
710397b6df1SKris Buschelman 
711dcd589f8SShri Abhyankar #undef __FUNCT__
712dcd589f8SShri Abhyankar #define __FUNCT__ "PetscSetMUMPSOptions"
713dcd589f8SShri Abhyankar PetscErrorCode PetscSetMUMPSOptions(Mat F, Mat A)
714dcd589f8SShri Abhyankar {
715dcd589f8SShri Abhyankar   Mat_MUMPS        *lu = (Mat_MUMPS*)F->spptr;
716dcd589f8SShri Abhyankar   PetscErrorCode   ierr;
717dcd589f8SShri Abhyankar   PetscInt         icntl;
718ace3abfcSBarry Smith   PetscBool        flg;
719dcd589f8SShri Abhyankar 
720dcd589f8SShri Abhyankar   PetscFunctionBegin;
721dcd589f8SShri Abhyankar   ierr = PetscOptionsBegin(((PetscObject)A)->comm,((PetscObject)A)->prefix,"MUMPS Options","Mat");CHKERRQ(ierr);
722dcd589f8SShri Abhyankar   if (lu->size == 1){
723dcd589f8SShri Abhyankar     lu->id.ICNTL(18) = 0;   /* centralized assembled matrix input */
724dcd589f8SShri Abhyankar   } else {
725dcd589f8SShri Abhyankar     lu->id.ICNTL(18) = 3;   /* distributed assembled matrix input */
726dcd589f8SShri Abhyankar   }
727dcd589f8SShri Abhyankar 
728dcd589f8SShri Abhyankar   icntl=-1;
729dcd589f8SShri Abhyankar   lu->id.ICNTL(4) = 0;  /* level of printing; overwrite mumps default ICNTL(4)=2 */
730dcd589f8SShri Abhyankar   ierr = PetscOptionsInt("-mat_mumps_icntl_4","ICNTL(4): level of printing (0 to 4)","None",lu->id.ICNTL(4),&icntl,&flg);CHKERRQ(ierr);
731dcd589f8SShri Abhyankar   if ((flg && icntl > 0) || PetscLogPrintInfo) {
732dcd589f8SShri Abhyankar     lu->id.ICNTL(4)=icntl; /* and use mumps default icntl(i), i=1,2,3 */
733dcd589f8SShri Abhyankar   } else { /* no output */
734dcd589f8SShri Abhyankar     lu->id.ICNTL(1) = 0;  /* error message, default= 6 */
735dcd589f8SShri Abhyankar     lu->id.ICNTL(2) = 0;  /* output stream for diagnostic printing, statistics, and warning. default=0 */
736dcd589f8SShri Abhyankar     lu->id.ICNTL(3) = 0; /* output stream for global information, default=6 */
737dcd589f8SShri Abhyankar   }
738dcd589f8SShri Abhyankar   ierr = PetscOptionsInt("-mat_mumps_icntl_6","ICNTL(6): column permutation and/or scaling to get a zero-free diagonal (0 to 7)","None",lu->id.ICNTL(6),&lu->id.ICNTL(6),PETSC_NULL);CHKERRQ(ierr);
739dcd589f8SShri Abhyankar   icntl=-1;
740292fb18eSBarry Smith   ierr = PetscOptionsInt("-mat_mumps_icntl_7","ICNTL(7): sequential matrix ordering (0 to 7) 3 = Scotch, 5 = Metis","None",lu->id.ICNTL(7),&icntl,&flg);CHKERRQ(ierr);
741dcd589f8SShri Abhyankar   if (flg) {
742e0b74bf9SHong Zhang     if (icntl== 1 && lu->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 {
745dcd589f8SShri Abhyankar       lu->id.ICNTL(7) = icntl;
746dcd589f8SShri Abhyankar     }
747dcd589f8SShri Abhyankar   }
748e0b74bf9SHong Zhang 
749dcd589f8SShri Abhyankar   ierr = PetscOptionsInt("-mat_mumps_icntl_8","ICNTL(8): scaling strategy (-2 to 7 or 77)","None",lu->id.ICNTL(8),&lu->id.ICNTL(8),PETSC_NULL);CHKERRQ(ierr);
750dcd589f8SShri Abhyankar   ierr = PetscOptionsInt("-mat_mumps_icntl_10","ICNTL(10): max num of refinements","None",lu->id.ICNTL(10),&lu->id.ICNTL(10),PETSC_NULL);CHKERRQ(ierr);
751dcd589f8SShri Abhyankar   ierr = PetscOptionsInt("-mat_mumps_icntl_11","ICNTL(11): statistics related to the linear system solved (via -ksp_view)","None",lu->id.ICNTL(11),&lu->id.ICNTL(11),PETSC_NULL);CHKERRQ(ierr);
752dcd589f8SShri Abhyankar   ierr = PetscOptionsInt("-mat_mumps_icntl_12","ICNTL(12): efficiency control: defines the ordering strategy with scaling constraints (0 to 3","None",lu->id.ICNTL(12),&lu->id.ICNTL(12),PETSC_NULL);CHKERRQ(ierr);
753dcd589f8SShri Abhyankar   ierr = PetscOptionsInt("-mat_mumps_icntl_13","ICNTL(13): efficiency control: with or without ScaLAPACK","None",lu->id.ICNTL(13),&lu->id.ICNTL(13),PETSC_NULL);CHKERRQ(ierr);
754dcd589f8SShri Abhyankar   ierr = PetscOptionsInt("-mat_mumps_icntl_14","ICNTL(14): percentage of estimated workspace increase","None",lu->id.ICNTL(14),&lu->id.ICNTL(14),PETSC_NULL);CHKERRQ(ierr);
755dcd589f8SShri Abhyankar   ierr = PetscOptionsInt("-mat_mumps_icntl_19","ICNTL(19): Schur complement","None",lu->id.ICNTL(19),&lu->id.ICNTL(19),PETSC_NULL);CHKERRQ(ierr);
756dcd589f8SShri Abhyankar 
757dcd589f8SShri Abhyankar   ierr = PetscOptionsInt("-mat_mumps_icntl_22","ICNTL(22): in-core/out-of-core facility (0 or 1)","None",lu->id.ICNTL(22),&lu->id.ICNTL(22),PETSC_NULL);CHKERRQ(ierr);
758dcd589f8SShri Abhyankar   ierr = PetscOptionsInt("-mat_mumps_icntl_23","ICNTL(23): max size of the working memory (MB) that can allocate per processor","None",lu->id.ICNTL(23),&lu->id.ICNTL(23),PETSC_NULL);CHKERRQ(ierr);
759dcd589f8SShri Abhyankar   ierr = PetscOptionsInt("-mat_mumps_icntl_24","ICNTL(24): detection of null pivot rows (0 or 1)","None",lu->id.ICNTL(24),&lu->id.ICNTL(24),PETSC_NULL);CHKERRQ(ierr);
760d7ebd59bSHong Zhang   if (lu->id.ICNTL(24)){
761d7ebd59bSHong Zhang     lu->id.ICNTL(13) = 1; /* turn-off ScaLAPACK to help with the correct detection of null pivots */
762d7ebd59bSHong Zhang   }
763d7ebd59bSHong Zhang 
764dcd589f8SShri Abhyankar   ierr = PetscOptionsInt("-mat_mumps_icntl_25","ICNTL(25): computation of a null space basis","None",lu->id.ICNTL(25),&lu->id.ICNTL(25),PETSC_NULL);CHKERRQ(ierr);
765dcd589f8SShri Abhyankar   ierr = PetscOptionsInt("-mat_mumps_icntl_26","ICNTL(26): Schur options for right-hand side or solution vector","None",lu->id.ICNTL(26),&lu->id.ICNTL(26),PETSC_NULL);CHKERRQ(ierr);
766dcd589f8SShri Abhyankar   ierr = PetscOptionsInt("-mat_mumps_icntl_27","ICNTL(27): experimental parameter","None",lu->id.ICNTL(27),&lu->id.ICNTL(27),PETSC_NULL);CHKERRQ(ierr);
767d7ebd59bSHong Zhang   ierr = PetscOptionsInt("-mat_mumps_icntl_28","ICNTL(28): use 1 for sequential analysis and ictnl(7) ordering, or 2 for parallel analysis and ictnl(29) ordering","None",lu->id.ICNTL(28),&lu->id.ICNTL(28),PETSC_NULL);CHKERRQ(ierr);
768292fb18eSBarry Smith   ierr = PetscOptionsInt("-mat_mumps_icntl_29","ICNTL(29): parallel ordering 1 = ptscotch 2 = parmetis","None",lu->id.ICNTL(29),&lu->id.ICNTL(29),PETSC_NULL);CHKERRQ(ierr);
769dcd589f8SShri Abhyankar 
770dcd589f8SShri Abhyankar   ierr = PetscOptionsReal("-mat_mumps_cntl_1","CNTL(1): relative pivoting threshold","None",lu->id.CNTL(1),&lu->id.CNTL(1),PETSC_NULL);CHKERRQ(ierr);
771dcd589f8SShri Abhyankar   ierr = PetscOptionsReal("-mat_mumps_cntl_2","CNTL(2): stopping criterion of refinement","None",lu->id.CNTL(2),&lu->id.CNTL(2),PETSC_NULL);CHKERRQ(ierr);
772dcd589f8SShri Abhyankar   ierr = PetscOptionsReal("-mat_mumps_cntl_3","CNTL(3): absolute pivoting threshold","None",lu->id.CNTL(3),&lu->id.CNTL(3),PETSC_NULL);CHKERRQ(ierr);
773dcd589f8SShri Abhyankar   ierr = PetscOptionsReal("-mat_mumps_cntl_4","CNTL(4): value for static pivoting","None",lu->id.CNTL(4),&lu->id.CNTL(4),PETSC_NULL);CHKERRQ(ierr);
774dcd589f8SShri Abhyankar   ierr = PetscOptionsReal("-mat_mumps_cntl_5","CNTL(5): fixation for null pivots","None",lu->id.CNTL(5),&lu->id.CNTL(5),PETSC_NULL);CHKERRQ(ierr);
775dcd589f8SShri Abhyankar   PetscOptionsEnd();
776dcd589f8SShri Abhyankar   PetscFunctionReturn(0);
777dcd589f8SShri Abhyankar }
778dcd589f8SShri Abhyankar 
779dcd589f8SShri Abhyankar #undef __FUNCT__
780dcd589f8SShri Abhyankar #define __FUNCT__ "PetscInitializeMUMPS"
781f697e70eSHong Zhang PetscErrorCode PetscInitializeMUMPS(Mat A,Mat_MUMPS* mumps)
782dcd589f8SShri Abhyankar {
783dcd589f8SShri Abhyankar   PetscErrorCode  ierr;
784dcd589f8SShri Abhyankar 
785dcd589f8SShri Abhyankar   PetscFunctionBegin;
786f697e70eSHong Zhang   ierr = MPI_Comm_rank(((PetscObject)A)->comm, &mumps->myid);
787f697e70eSHong Zhang   ierr = MPI_Comm_size(((PetscObject)A)->comm,&mumps->size);CHKERRQ(ierr);
788f697e70eSHong Zhang   ierr = MPI_Comm_dup(((PetscObject)A)->comm,&(mumps->comm_mumps));CHKERRQ(ierr);
789f697e70eSHong Zhang   mumps->id.comm_fortran = MPI_Comm_c2f(mumps->comm_mumps);
790f697e70eSHong Zhang 
791f697e70eSHong Zhang   mumps->id.job = JOB_INIT;
792f697e70eSHong Zhang   mumps->id.par = 1;  /* host participates factorizaton and solve */
793f697e70eSHong Zhang   mumps->id.sym = mumps->sym;
794dcd589f8SShri Abhyankar #if defined(PETSC_USE_COMPLEX)
795f697e70eSHong Zhang   zmumps_c(&mumps->id);
796dcd589f8SShri Abhyankar #else
797f697e70eSHong Zhang   dmumps_c(&mumps->id);
798dcd589f8SShri Abhyankar #endif
799f697e70eSHong Zhang 
800f697e70eSHong Zhang   mumps->CleanUpMUMPS = PETSC_FALSE;
801f697e70eSHong Zhang   mumps->scat_rhs     = PETSC_NULL;
802f697e70eSHong Zhang   mumps->scat_sol     = PETSC_NULL;
803f697e70eSHong Zhang   mumps->nSolve       = 0;
804dcd589f8SShri Abhyankar   PetscFunctionReturn(0);
805dcd589f8SShri Abhyankar }
806dcd589f8SShri Abhyankar 
807397b6df1SKris Buschelman /* Note the Petsc r and c permutations are ignored */
808397b6df1SKris Buschelman #undef __FUNCT__
809f0c56d0fSKris Buschelman #define __FUNCT__ "MatLUFactorSymbolic_AIJMUMPS"
8100481f469SBarry Smith PetscErrorCode MatLUFactorSymbolic_AIJMUMPS(Mat F,Mat A,IS r,IS c,const MatFactorInfo *info)
811b24902e0SBarry Smith {
812719d5645SBarry Smith   Mat_MUMPS          *lu = (Mat_MUMPS*)F->spptr;
813dcd589f8SShri Abhyankar   PetscErrorCode     ierr;
814bccb9932SShri Abhyankar   MatReuse           reuse;
81567877ebaSShri Abhyankar   Vec                b;
81667877ebaSShri Abhyankar   IS                 is_iden;
81767877ebaSShri Abhyankar   const PetscInt     M = A->rmap->N;
818397b6df1SKris Buschelman 
819397b6df1SKris Buschelman   PetscFunctionBegin;
820b24902e0SBarry Smith   lu->matstruc = DIFFERENT_NONZERO_PATTERN;
821dcd589f8SShri Abhyankar 
822dcd589f8SShri Abhyankar   /* Set MUMPS options */
823dcd589f8SShri Abhyankar   ierr = PetscSetMUMPSOptions(F,A);CHKERRQ(ierr);
824dcd589f8SShri Abhyankar 
825bccb9932SShri Abhyankar   reuse = MAT_INITIAL_MATRIX;
826bccb9932SShri Abhyankar   ierr = (*lu->ConvertToTriples)(A, 1, reuse, &lu->nz, &lu->irn, &lu->jcn, &lu->val);CHKERRQ(ierr);
827dcd589f8SShri Abhyankar 
82867877ebaSShri Abhyankar   /* analysis phase */
82967877ebaSShri Abhyankar   /*----------------*/
8303d472b54SHong Zhang   lu->id.job = JOB_FACTSYMBOLIC;
83167877ebaSShri Abhyankar   lu->id.n = M;
83267877ebaSShri Abhyankar   switch (lu->id.ICNTL(18)){
83367877ebaSShri Abhyankar   case 0:  /* centralized assembled matrix input */
83467877ebaSShri Abhyankar     if (!lu->myid) {
83567877ebaSShri Abhyankar       lu->id.nz =lu->nz; lu->id.irn=lu->irn; lu->id.jcn=lu->jcn;
83667877ebaSShri Abhyankar       if (lu->id.ICNTL(6)>1){
83767877ebaSShri Abhyankar #if defined(PETSC_USE_COMPLEX)
83867877ebaSShri Abhyankar         lu->id.a = (mumps_double_complex*)lu->val;
83967877ebaSShri Abhyankar #else
84067877ebaSShri Abhyankar         lu->id.a = lu->val;
84167877ebaSShri Abhyankar #endif
84267877ebaSShri Abhyankar       }
843e0b74bf9SHong Zhang       if (lu->id.ICNTL(7) == 1){ /* use user-provide matrix ordering */
844e0b74bf9SHong Zhang         if (!lu->myid) {
845e0b74bf9SHong Zhang           const PetscInt *idx;
846e0b74bf9SHong Zhang           PetscInt i,*perm_in;
847e0b74bf9SHong Zhang           ierr = PetscMalloc(M*sizeof(PetscInt),&perm_in);CHKERRQ(ierr);
848e0b74bf9SHong Zhang           ierr = ISGetIndices(r,&idx);CHKERRQ(ierr);
849e0b74bf9SHong Zhang           lu->id.perm_in = perm_in;
850e0b74bf9SHong Zhang           for (i=0; i<M; i++) perm_in[i] = idx[i]+1; /* perm_in[]: start from 1, not 0! */
851e0b74bf9SHong Zhang           ierr = ISRestoreIndices(r,&idx);CHKERRQ(ierr);
852e0b74bf9SHong Zhang         }
853e0b74bf9SHong Zhang       }
85467877ebaSShri Abhyankar     }
85567877ebaSShri Abhyankar     break;
85667877ebaSShri Abhyankar   case 3:  /* distributed assembled matrix input (size>1) */
85767877ebaSShri Abhyankar     lu->id.nz_loc = lu->nz;
85867877ebaSShri Abhyankar     lu->id.irn_loc=lu->irn; lu->id.jcn_loc=lu->jcn;
85967877ebaSShri Abhyankar     if (lu->id.ICNTL(6)>1) {
86067877ebaSShri Abhyankar #if defined(PETSC_USE_COMPLEX)
86167877ebaSShri Abhyankar       lu->id.a_loc = (mumps_double_complex*)lu->val;
86267877ebaSShri Abhyankar #else
86367877ebaSShri Abhyankar       lu->id.a_loc = lu->val;
86467877ebaSShri Abhyankar #endif
86567877ebaSShri Abhyankar     }
86667877ebaSShri Abhyankar     /* MUMPS only supports centralized rhs. Create scatter scat_rhs for repeated use in MatSolve() */
86767877ebaSShri Abhyankar     if (!lu->myid){
86867877ebaSShri Abhyankar       ierr = VecCreateSeq(PETSC_COMM_SELF,A->cmap->N,&lu->b_seq);CHKERRQ(ierr);
86967877ebaSShri Abhyankar       ierr = ISCreateStride(PETSC_COMM_SELF,A->cmap->N,0,1,&is_iden);CHKERRQ(ierr);
87067877ebaSShri Abhyankar     } else {
87167877ebaSShri Abhyankar       ierr = VecCreateSeq(PETSC_COMM_SELF,0,&lu->b_seq);CHKERRQ(ierr);
87267877ebaSShri Abhyankar       ierr = ISCreateStride(PETSC_COMM_SELF,0,0,1,&is_iden);CHKERRQ(ierr);
87367877ebaSShri Abhyankar     }
87467877ebaSShri Abhyankar     ierr = VecCreate(((PetscObject)A)->comm,&b);CHKERRQ(ierr);
87567877ebaSShri Abhyankar     ierr = VecSetSizes(b,A->rmap->n,PETSC_DECIDE);CHKERRQ(ierr);
87667877ebaSShri Abhyankar     ierr = VecSetFromOptions(b);CHKERRQ(ierr);
87767877ebaSShri Abhyankar 
87867877ebaSShri Abhyankar     ierr = VecScatterCreate(b,is_iden,lu->b_seq,is_iden,&lu->scat_rhs);CHKERRQ(ierr);
8796bf464f9SBarry Smith     ierr = ISDestroy(&is_iden);CHKERRQ(ierr);
8806bf464f9SBarry Smith     ierr = VecDestroy(&b);CHKERRQ(ierr);
88167877ebaSShri Abhyankar     break;
88267877ebaSShri Abhyankar     }
88367877ebaSShri Abhyankar #if defined(PETSC_USE_COMPLEX)
88467877ebaSShri Abhyankar   zmumps_c(&lu->id);
88567877ebaSShri Abhyankar #else
88667877ebaSShri Abhyankar   dmumps_c(&lu->id);
88767877ebaSShri Abhyankar #endif
88867877ebaSShri 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));
88967877ebaSShri Abhyankar 
890719d5645SBarry Smith   F->ops->lufactornumeric  = MatFactorNumeric_MUMPS;
891dcd589f8SShri Abhyankar   F->ops->solve            = MatSolve_MUMPS;
89251d5961aSHong Zhang   F->ops->solvetranspose   = MatSolveTranspose_MUMPS;
893e0b74bf9SHong Zhang   F->ops->matsolve         = MatMatSolve_MUMPS;
894b24902e0SBarry Smith   PetscFunctionReturn(0);
895b24902e0SBarry Smith }
896b24902e0SBarry Smith 
897450b117fSShri Abhyankar /* Note the Petsc r and c permutations are ignored */
898450b117fSShri Abhyankar #undef __FUNCT__
899450b117fSShri Abhyankar #define __FUNCT__ "MatLUFactorSymbolic_BAIJMUMPS"
900450b117fSShri Abhyankar PetscErrorCode MatLUFactorSymbolic_BAIJMUMPS(Mat F,Mat A,IS r,IS c,const MatFactorInfo *info)
901450b117fSShri Abhyankar {
902dcd589f8SShri Abhyankar 
903450b117fSShri Abhyankar   Mat_MUMPS       *lu = (Mat_MUMPS*)F->spptr;
904dcd589f8SShri Abhyankar   PetscErrorCode  ierr;
905bccb9932SShri Abhyankar   MatReuse        reuse;
90667877ebaSShri Abhyankar   Vec             b;
90767877ebaSShri Abhyankar   IS              is_iden;
90867877ebaSShri Abhyankar   const PetscInt  M = A->rmap->N;
909450b117fSShri Abhyankar 
910450b117fSShri Abhyankar   PetscFunctionBegin;
911450b117fSShri Abhyankar   lu->matstruc = DIFFERENT_NONZERO_PATTERN;
912dcd589f8SShri Abhyankar 
913dcd589f8SShri Abhyankar   /* Set MUMPS options */
914dcd589f8SShri Abhyankar   ierr = PetscSetMUMPSOptions(F,A);CHKERRQ(ierr);
915dcd589f8SShri Abhyankar 
916bccb9932SShri Abhyankar   reuse = MAT_INITIAL_MATRIX;
917bccb9932SShri Abhyankar   ierr = (*lu->ConvertToTriples)(A, 1, reuse, &lu->nz, &lu->irn, &lu->jcn, &lu->val);CHKERRQ(ierr);
91867877ebaSShri Abhyankar 
91967877ebaSShri Abhyankar   /* analysis phase */
92067877ebaSShri Abhyankar   /*----------------*/
9213d472b54SHong Zhang   lu->id.job = JOB_FACTSYMBOLIC;
92267877ebaSShri Abhyankar   lu->id.n = M;
92367877ebaSShri Abhyankar   switch (lu->id.ICNTL(18)){
92467877ebaSShri Abhyankar   case 0:  /* centralized assembled matrix input */
92567877ebaSShri Abhyankar     if (!lu->myid) {
92667877ebaSShri Abhyankar       lu->id.nz =lu->nz; lu->id.irn=lu->irn; lu->id.jcn=lu->jcn;
92767877ebaSShri Abhyankar       if (lu->id.ICNTL(6)>1){
92867877ebaSShri Abhyankar #if defined(PETSC_USE_COMPLEX)
92967877ebaSShri Abhyankar         lu->id.a = (mumps_double_complex*)lu->val;
93067877ebaSShri Abhyankar #else
93167877ebaSShri Abhyankar         lu->id.a = lu->val;
93267877ebaSShri Abhyankar #endif
93367877ebaSShri Abhyankar       }
93467877ebaSShri Abhyankar     }
93567877ebaSShri Abhyankar     break;
93667877ebaSShri Abhyankar   case 3:  /* distributed assembled matrix input (size>1) */
93767877ebaSShri Abhyankar     lu->id.nz_loc = lu->nz;
93867877ebaSShri Abhyankar     lu->id.irn_loc=lu->irn; lu->id.jcn_loc=lu->jcn;
93967877ebaSShri Abhyankar     if (lu->id.ICNTL(6)>1) {
94067877ebaSShri Abhyankar #if defined(PETSC_USE_COMPLEX)
94167877ebaSShri Abhyankar       lu->id.a_loc = (mumps_double_complex*)lu->val;
94267877ebaSShri Abhyankar #else
94367877ebaSShri Abhyankar       lu->id.a_loc = lu->val;
94467877ebaSShri Abhyankar #endif
94567877ebaSShri Abhyankar     }
94667877ebaSShri Abhyankar     /* MUMPS only supports centralized rhs. Create scatter scat_rhs for repeated use in MatSolve() */
94767877ebaSShri Abhyankar     if (!lu->myid){
94867877ebaSShri Abhyankar       ierr = VecCreateSeq(PETSC_COMM_SELF,A->cmap->N,&lu->b_seq);CHKERRQ(ierr);
94967877ebaSShri Abhyankar       ierr = ISCreateStride(PETSC_COMM_SELF,A->cmap->N,0,1,&is_iden);CHKERRQ(ierr);
95067877ebaSShri Abhyankar     } else {
95167877ebaSShri Abhyankar       ierr = VecCreateSeq(PETSC_COMM_SELF,0,&lu->b_seq);CHKERRQ(ierr);
95267877ebaSShri Abhyankar       ierr = ISCreateStride(PETSC_COMM_SELF,0,0,1,&is_iden);CHKERRQ(ierr);
95367877ebaSShri Abhyankar     }
95467877ebaSShri Abhyankar     ierr = VecCreate(((PetscObject)A)->comm,&b);CHKERRQ(ierr);
95567877ebaSShri Abhyankar     ierr = VecSetSizes(b,A->rmap->n,PETSC_DECIDE);CHKERRQ(ierr);
95667877ebaSShri Abhyankar     ierr = VecSetFromOptions(b);CHKERRQ(ierr);
95767877ebaSShri Abhyankar 
95867877ebaSShri Abhyankar     ierr = VecScatterCreate(b,is_iden,lu->b_seq,is_iden,&lu->scat_rhs);CHKERRQ(ierr);
9596bf464f9SBarry Smith     ierr = ISDestroy(&is_iden);CHKERRQ(ierr);
9606bf464f9SBarry Smith     ierr = VecDestroy(&b);CHKERRQ(ierr);
96167877ebaSShri Abhyankar     break;
96267877ebaSShri Abhyankar     }
96367877ebaSShri Abhyankar #if defined(PETSC_USE_COMPLEX)
96467877ebaSShri Abhyankar   zmumps_c(&lu->id);
96567877ebaSShri Abhyankar #else
96667877ebaSShri Abhyankar   dmumps_c(&lu->id);
96767877ebaSShri Abhyankar #endif
96867877ebaSShri 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));
96967877ebaSShri Abhyankar 
970450b117fSShri Abhyankar   F->ops->lufactornumeric  = MatFactorNumeric_MUMPS;
971dcd589f8SShri Abhyankar   F->ops->solve            = MatSolve_MUMPS;
97251d5961aSHong Zhang   F->ops->solvetranspose   = MatSolveTranspose_MUMPS;
973450b117fSShri Abhyankar   PetscFunctionReturn(0);
974450b117fSShri Abhyankar }
975b24902e0SBarry Smith 
976141f4205SHong Zhang /* Note the Petsc r permutation and factor info are ignored */
977397b6df1SKris Buschelman #undef __FUNCT__
97867877ebaSShri Abhyankar #define __FUNCT__ "MatCholeskyFactorSymbolic_MUMPS"
97967877ebaSShri Abhyankar PetscErrorCode MatCholeskyFactorSymbolic_MUMPS(Mat F,Mat A,IS r,const MatFactorInfo *info)
980b24902e0SBarry Smith {
9812792810eSHong Zhang   Mat_MUMPS          *lu = (Mat_MUMPS*)F->spptr;
982dcd589f8SShri Abhyankar   PetscErrorCode     ierr;
983bccb9932SShri Abhyankar   MatReuse           reuse;
98467877ebaSShri Abhyankar   Vec                b;
98567877ebaSShri Abhyankar   IS                 is_iden;
98667877ebaSShri Abhyankar   const PetscInt     M = A->rmap->N;
987397b6df1SKris Buschelman 
988397b6df1SKris Buschelman   PetscFunctionBegin;
989b24902e0SBarry Smith   lu->matstruc = DIFFERENT_NONZERO_PATTERN;
990dcd589f8SShri Abhyankar 
991dcd589f8SShri Abhyankar   /* Set MUMPS options */
992dcd589f8SShri Abhyankar   ierr = PetscSetMUMPSOptions(F,A);CHKERRQ(ierr);
993dcd589f8SShri Abhyankar 
994bccb9932SShri Abhyankar   reuse = MAT_INITIAL_MATRIX;
995bccb9932SShri Abhyankar   ierr = (*lu->ConvertToTriples)(A, 1 , reuse, &lu->nz, &lu->irn, &lu->jcn, &lu->val);CHKERRQ(ierr);
996dcd589f8SShri Abhyankar 
99767877ebaSShri Abhyankar   /* analysis phase */
99867877ebaSShri Abhyankar   /*----------------*/
9993d472b54SHong Zhang   lu->id.job = JOB_FACTSYMBOLIC;
100067877ebaSShri Abhyankar   lu->id.n = M;
100167877ebaSShri Abhyankar   switch (lu->id.ICNTL(18)){
100267877ebaSShri Abhyankar   case 0:  /* centralized assembled matrix input */
100367877ebaSShri Abhyankar     if (!lu->myid) {
100467877ebaSShri Abhyankar       lu->id.nz =lu->nz; lu->id.irn=lu->irn; lu->id.jcn=lu->jcn;
100567877ebaSShri Abhyankar       if (lu->id.ICNTL(6)>1){
100667877ebaSShri Abhyankar #if defined(PETSC_USE_COMPLEX)
100767877ebaSShri Abhyankar         lu->id.a = (mumps_double_complex*)lu->val;
100867877ebaSShri Abhyankar #else
100967877ebaSShri Abhyankar         lu->id.a = lu->val;
101067877ebaSShri Abhyankar #endif
101167877ebaSShri Abhyankar       }
101267877ebaSShri Abhyankar     }
101367877ebaSShri Abhyankar     break;
101467877ebaSShri Abhyankar   case 3:  /* distributed assembled matrix input (size>1) */
101567877ebaSShri Abhyankar     lu->id.nz_loc = lu->nz;
101667877ebaSShri Abhyankar     lu->id.irn_loc=lu->irn; lu->id.jcn_loc=lu->jcn;
101767877ebaSShri Abhyankar     if (lu->id.ICNTL(6)>1) {
101867877ebaSShri Abhyankar #if defined(PETSC_USE_COMPLEX)
101967877ebaSShri Abhyankar       lu->id.a_loc = (mumps_double_complex*)lu->val;
102067877ebaSShri Abhyankar #else
102167877ebaSShri Abhyankar       lu->id.a_loc = lu->val;
102267877ebaSShri Abhyankar #endif
102367877ebaSShri Abhyankar     }
102467877ebaSShri Abhyankar     /* MUMPS only supports centralized rhs. Create scatter scat_rhs for repeated use in MatSolve() */
102567877ebaSShri Abhyankar     if (!lu->myid){
102667877ebaSShri Abhyankar       ierr = VecCreateSeq(PETSC_COMM_SELF,A->cmap->N,&lu->b_seq);CHKERRQ(ierr);
102767877ebaSShri Abhyankar       ierr = ISCreateStride(PETSC_COMM_SELF,A->cmap->N,0,1,&is_iden);CHKERRQ(ierr);
102867877ebaSShri Abhyankar     } else {
102967877ebaSShri Abhyankar       ierr = VecCreateSeq(PETSC_COMM_SELF,0,&lu->b_seq);CHKERRQ(ierr);
103067877ebaSShri Abhyankar       ierr = ISCreateStride(PETSC_COMM_SELF,0,0,1,&is_iden);CHKERRQ(ierr);
103167877ebaSShri Abhyankar     }
103267877ebaSShri Abhyankar     ierr = VecCreate(((PetscObject)A)->comm,&b);CHKERRQ(ierr);
103367877ebaSShri Abhyankar     ierr = VecSetSizes(b,A->rmap->n,PETSC_DECIDE);CHKERRQ(ierr);
103467877ebaSShri Abhyankar     ierr = VecSetFromOptions(b);CHKERRQ(ierr);
103567877ebaSShri Abhyankar 
103667877ebaSShri Abhyankar     ierr = VecScatterCreate(b,is_iden,lu->b_seq,is_iden,&lu->scat_rhs);CHKERRQ(ierr);
10376bf464f9SBarry Smith     ierr = ISDestroy(&is_iden);CHKERRQ(ierr);
10386bf464f9SBarry Smith     ierr = VecDestroy(&b);CHKERRQ(ierr);
103967877ebaSShri Abhyankar     break;
104067877ebaSShri Abhyankar     }
104167877ebaSShri Abhyankar #if defined(PETSC_USE_COMPLEX)
104267877ebaSShri Abhyankar   zmumps_c(&lu->id);
104367877ebaSShri Abhyankar #else
104467877ebaSShri Abhyankar   dmumps_c(&lu->id);
104567877ebaSShri Abhyankar #endif
104667877ebaSShri 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));
104767877ebaSShri Abhyankar 
10482792810eSHong Zhang   F->ops->choleskyfactornumeric = MatFactorNumeric_MUMPS;
1049dcd589f8SShri Abhyankar   F->ops->solve                 = MatSolve_MUMPS;
105051d5961aSHong Zhang   F->ops->solvetranspose        = MatSolve_MUMPS;
1051db4efbfdSBarry Smith #if !defined(PETSC_USE_COMPLEX)
1052dcd589f8SShri Abhyankar   (F)->ops->getinertia          = MatGetInertia_SBAIJMUMPS;
1053db4efbfdSBarry Smith #endif
1054b24902e0SBarry Smith   PetscFunctionReturn(0);
1055b24902e0SBarry Smith }
1056b24902e0SBarry Smith 
1057397b6df1SKris Buschelman #undef __FUNCT__
105864e6c443SBarry Smith #define __FUNCT__ "MatView_MUMPS"
105964e6c443SBarry Smith PetscErrorCode MatView_MUMPS(Mat A,PetscViewer viewer)
106074ed9c26SBarry Smith {
1061f6c57405SHong Zhang   PetscErrorCode    ierr;
106264e6c443SBarry Smith   PetscBool         iascii;
106364e6c443SBarry Smith   PetscViewerFormat format;
106464e6c443SBarry Smith   Mat_MUMPS         *lu=(Mat_MUMPS*)A->spptr;
1065f6c57405SHong Zhang 
1066f6c57405SHong Zhang   PetscFunctionBegin;
106764e6c443SBarry Smith   /* check if matrix is mumps type */
106864e6c443SBarry Smith   if (A->ops->solve != MatSolve_MUMPS) PetscFunctionReturn(0);
106964e6c443SBarry Smith 
107064e6c443SBarry Smith   ierr = PetscTypeCompare((PetscObject)viewer,PETSCVIEWERASCII,&iascii);CHKERRQ(ierr);
107164e6c443SBarry Smith   if (iascii) {
107264e6c443SBarry Smith     ierr = PetscViewerGetFormat(viewer,&format);CHKERRQ(ierr);
107364e6c443SBarry Smith     if (format == PETSC_VIEWER_ASCII_INFO){
107464e6c443SBarry Smith       ierr = PetscViewerASCIIPrintf(viewer,"MUMPS run parameters:\n");CHKERRQ(ierr);
107564e6c443SBarry Smith       ierr = PetscViewerASCIIPrintf(viewer,"  SYM (matrix type):                   %d \n",lu->id.sym);CHKERRQ(ierr);
107664e6c443SBarry Smith       ierr = PetscViewerASCIIPrintf(viewer,"  PAR (host participation):            %d \n",lu->id.par);CHKERRQ(ierr);
1077f6c57405SHong Zhang       ierr = PetscViewerASCIIPrintf(viewer,"  ICNTL(1) (output for error):         %d \n",lu->id.ICNTL(1));CHKERRQ(ierr);
1078f6c57405SHong Zhang       ierr = PetscViewerASCIIPrintf(viewer,"  ICNTL(2) (output of diagnostic msg): %d \n",lu->id.ICNTL(2));CHKERRQ(ierr);
1079f6c57405SHong Zhang       ierr = PetscViewerASCIIPrintf(viewer,"  ICNTL(3) (output for global info):   %d \n",lu->id.ICNTL(3));CHKERRQ(ierr);
1080f6c57405SHong Zhang       ierr = PetscViewerASCIIPrintf(viewer,"  ICNTL(4) (level of printing):        %d \n",lu->id.ICNTL(4));CHKERRQ(ierr);
1081f6c57405SHong Zhang       ierr = PetscViewerASCIIPrintf(viewer,"  ICNTL(5) (input mat struct):         %d \n",lu->id.ICNTL(5));CHKERRQ(ierr);
1082f6c57405SHong Zhang       ierr = PetscViewerASCIIPrintf(viewer,"  ICNTL(6) (matrix prescaling):        %d \n",lu->id.ICNTL(6));CHKERRQ(ierr);
1083d06efebcSBarry Smith       ierr = PetscViewerASCIIPrintf(viewer,"  ICNTL(7) (sequentia matrix ordering):%d \n",lu->id.ICNTL(7));CHKERRQ(ierr);
1084f6c57405SHong Zhang       ierr = PetscViewerASCIIPrintf(viewer,"  ICNTL(8) (scalling strategy):        %d \n",lu->id.ICNTL(8));CHKERRQ(ierr);
1085f6c57405SHong Zhang       ierr = PetscViewerASCIIPrintf(viewer,"  ICNTL(10) (max num of refinements):  %d \n",lu->id.ICNTL(10));CHKERRQ(ierr);
1086f6c57405SHong Zhang       ierr = PetscViewerASCIIPrintf(viewer,"  ICNTL(11) (error analysis):          %d \n",lu->id.ICNTL(11));CHKERRQ(ierr);
108734ed7027SBarry Smith       if (lu->id.ICNTL(11)>0) {
108834ed7027SBarry Smith         ierr = PetscViewerASCIIPrintf(viewer,"    RINFOG(4) (inf norm of input mat):        %g\n",lu->id.RINFOG(4));CHKERRQ(ierr);
108934ed7027SBarry Smith         ierr = PetscViewerASCIIPrintf(viewer,"    RINFOG(5) (inf norm of solution):         %g\n",lu->id.RINFOG(5));CHKERRQ(ierr);
109034ed7027SBarry Smith         ierr = PetscViewerASCIIPrintf(viewer,"    RINFOG(6) (inf norm of residual):         %g\n",lu->id.RINFOG(6));CHKERRQ(ierr);
109134ed7027SBarry Smith         ierr = PetscViewerASCIIPrintf(viewer,"    RINFOG(7),RINFOG(8) (backward error est): %g, %g\n",lu->id.RINFOG(7),lu->id.RINFOG(8));CHKERRQ(ierr);
109234ed7027SBarry Smith         ierr = PetscViewerASCIIPrintf(viewer,"    RINFOG(9) (error estimate):               %g \n",lu->id.RINFOG(9));CHKERRQ(ierr);
109334ed7027SBarry Smith         ierr = PetscViewerASCIIPrintf(viewer,"    RINFOG(10),RINFOG(11)(condition numbers): %g, %g\n",lu->id.RINFOG(10),lu->id.RINFOG(11));CHKERRQ(ierr);
1094f6c57405SHong Zhang       }
1095f6c57405SHong Zhang       ierr = PetscViewerASCIIPrintf(viewer,"  ICNTL(12) (efficiency control):                         %d \n",lu->id.ICNTL(12));CHKERRQ(ierr);
1096f6c57405SHong Zhang       ierr = PetscViewerASCIIPrintf(viewer,"  ICNTL(13) (efficiency control):                         %d \n",lu->id.ICNTL(13));CHKERRQ(ierr);
1097f6c57405SHong Zhang       ierr = PetscViewerASCIIPrintf(viewer,"  ICNTL(14) (percentage of estimated workspace increase): %d \n",lu->id.ICNTL(14));CHKERRQ(ierr);
1098f6c57405SHong Zhang       /* ICNTL(15-17) not used */
1099f6c57405SHong Zhang       ierr = PetscViewerASCIIPrintf(viewer,"  ICNTL(18) (input mat struct):                           %d \n",lu->id.ICNTL(18));CHKERRQ(ierr);
1100f6c57405SHong Zhang       ierr = PetscViewerASCIIPrintf(viewer,"  ICNTL(19) (Shur complement info):                       %d \n",lu->id.ICNTL(19));CHKERRQ(ierr);
1101f6c57405SHong Zhang       ierr = PetscViewerASCIIPrintf(viewer,"  ICNTL(20) (rhs sparse pattern):                         %d \n",lu->id.ICNTL(20));CHKERRQ(ierr);
1102f6c57405SHong Zhang       ierr = PetscViewerASCIIPrintf(viewer,"  ICNTL(21) (solution struct):                            %d \n",lu->id.ICNTL(21));CHKERRQ(ierr);
1103c0165424SHong Zhang       ierr = PetscViewerASCIIPrintf(viewer,"  ICNTL(22) (in-core/out-of-core facility):               %d \n",lu->id.ICNTL(22));CHKERRQ(ierr);
1104c0165424SHong Zhang       ierr = PetscViewerASCIIPrintf(viewer,"  ICNTL(23) (max size of memory can be allocated locally):%d \n",lu->id.ICNTL(23));CHKERRQ(ierr);
1105c0165424SHong Zhang 
1106c0165424SHong Zhang       ierr = PetscViewerASCIIPrintf(viewer,"  ICNTL(24) (detection of null pivot rows):               %d \n",lu->id.ICNTL(24));CHKERRQ(ierr);
1107c0165424SHong Zhang       ierr = PetscViewerASCIIPrintf(viewer,"  ICNTL(25) (computation of a null space basis):          %d \n",lu->id.ICNTL(25));CHKERRQ(ierr);
1108c0165424SHong Zhang       ierr = PetscViewerASCIIPrintf(viewer,"  ICNTL(26) (Schur options for rhs or solution):          %d \n",lu->id.ICNTL(26));CHKERRQ(ierr);
1109c0165424SHong Zhang       ierr = PetscViewerASCIIPrintf(viewer,"  ICNTL(27) (experimental parameter):                     %d \n",lu->id.ICNTL(27));CHKERRQ(ierr);
1110d06efebcSBarry Smith       ierr = PetscViewerASCIIPrintf(viewer,"  ICNTL(28) (Use parallel or sequential ordering):        %d \n",lu->id.ICNTL(28));CHKERRQ(ierr);
1111d06efebcSBarry Smith       ierr = PetscViewerASCIIPrintf(viewer,"  ICNTL(29) (Parallel ordering):                          %d \n",lu->id.ICNTL(29));CHKERRQ(ierr);
1112f6c57405SHong Zhang 
1113f6c57405SHong Zhang       ierr = PetscViewerASCIIPrintf(viewer,"  CNTL(1) (relative pivoting threshold):      %g \n",lu->id.CNTL(1));CHKERRQ(ierr);
1114f6c57405SHong Zhang       ierr = PetscViewerASCIIPrintf(viewer,"  CNTL(2) (stopping criterion of refinement): %g \n",lu->id.CNTL(2));CHKERRQ(ierr);
1115f6c57405SHong Zhang       ierr = PetscViewerASCIIPrintf(viewer,"  CNTL(3) (absolute pivoting threshold):      %g \n",lu->id.CNTL(3));CHKERRQ(ierr);
1116f6c57405SHong Zhang       ierr = PetscViewerASCIIPrintf(viewer,"  CNTL(4) (value of static pivoting):         %g \n",lu->id.CNTL(4));CHKERRQ(ierr);
1117c0165424SHong Zhang       ierr = PetscViewerASCIIPrintf(viewer,"  CNTL(5) (fixation for null pivots):         %g \n",lu->id.CNTL(5));CHKERRQ(ierr);
1118f6c57405SHong Zhang 
1119f6c57405SHong Zhang       /* infomation local to each processor */
112034ed7027SBarry Smith       ierr = PetscViewerASCIIPrintf(viewer, "  RINFO(1) (local estimated flops for the elimination after analysis): \n");CHKERRQ(ierr);
11217b23a99aSBarry Smith       ierr = PetscViewerASCIISynchronizedAllow(viewer,PETSC_TRUE);CHKERRQ(ierr);
112234ed7027SBarry Smith       ierr = PetscViewerASCIISynchronizedPrintf(viewer,"    [%d] %g \n",lu->myid,lu->id.RINFO(1));CHKERRQ(ierr);
112334ed7027SBarry Smith       ierr = PetscViewerFlush(viewer);
112434ed7027SBarry Smith       ierr = PetscViewerASCIIPrintf(viewer, "  RINFO(2) (local estimated flops for the assembly after factorization): \n");CHKERRQ(ierr);
112534ed7027SBarry Smith       ierr = PetscViewerASCIISynchronizedPrintf(viewer,"    [%d]  %g \n",lu->myid,lu->id.RINFO(2));CHKERRQ(ierr);
112634ed7027SBarry Smith       ierr = PetscViewerFlush(viewer);
112734ed7027SBarry Smith       ierr = PetscViewerASCIIPrintf(viewer, "  RINFO(3) (local estimated flops for the elimination after factorization): \n");CHKERRQ(ierr);
112834ed7027SBarry Smith       ierr = PetscViewerASCIISynchronizedPrintf(viewer,"    [%d]  %g \n",lu->myid,lu->id.RINFO(3));CHKERRQ(ierr);
112934ed7027SBarry Smith       ierr = PetscViewerFlush(viewer);
1130f6c57405SHong Zhang 
113134ed7027SBarry Smith       ierr = PetscViewerASCIIPrintf(viewer, "  INFO(15) (estimated size of (in MB) MUMPS internal data for running numerical factorization): \n");CHKERRQ(ierr);
113234ed7027SBarry Smith       ierr = PetscViewerASCIISynchronizedPrintf(viewer,"  [%d] %d \n",lu->myid,lu->id.INFO(15));CHKERRQ(ierr);
113334ed7027SBarry Smith       ierr = PetscViewerFlush(viewer);
1134f6c57405SHong Zhang 
113534ed7027SBarry Smith       ierr = PetscViewerASCIIPrintf(viewer, "  INFO(16) (size of (in MB) MUMPS internal data used during numerical factorization): \n");CHKERRQ(ierr);
113634ed7027SBarry Smith       ierr = PetscViewerASCIISynchronizedPrintf(viewer,"    [%d] %d \n",lu->myid,lu->id.INFO(16));CHKERRQ(ierr);
113734ed7027SBarry Smith       ierr = PetscViewerFlush(viewer);
1138f6c57405SHong Zhang 
113934ed7027SBarry Smith       ierr = PetscViewerASCIIPrintf(viewer, "  INFO(23) (num of pivots eliminated on this processor after factorization): \n");CHKERRQ(ierr);
114034ed7027SBarry Smith       ierr = PetscViewerASCIISynchronizedPrintf(viewer,"    [%d] %d \n",lu->myid,lu->id.INFO(23));CHKERRQ(ierr);
114134ed7027SBarry Smith       ierr = PetscViewerFlush(viewer);
11427b23a99aSBarry Smith       ierr = PetscViewerASCIISynchronizedAllow(viewer,PETSC_FALSE);CHKERRQ(ierr);
1143f6c57405SHong Zhang 
1144f6c57405SHong Zhang       if (!lu->myid){ /* information from the host */
1145f6c57405SHong Zhang         ierr = PetscViewerASCIIPrintf(viewer,"  RINFOG(1) (global estimated flops for the elimination after analysis): %g \n",lu->id.RINFOG(1));CHKERRQ(ierr);
1146f6c57405SHong Zhang         ierr = PetscViewerASCIIPrintf(viewer,"  RINFOG(2) (global estimated flops for the assembly after factorization): %g \n",lu->id.RINFOG(2));CHKERRQ(ierr);
1147f6c57405SHong Zhang         ierr = PetscViewerASCIIPrintf(viewer,"  RINFOG(3) (global estimated flops for the elimination after factorization): %g \n",lu->id.RINFOG(3));CHKERRQ(ierr);
1148f6c57405SHong Zhang 
1149f6c57405SHong Zhang         ierr = PetscViewerASCIIPrintf(viewer,"  INFOG(3) (estimated real workspace for factors on all processors after analysis): %d \n",lu->id.INFOG(3));CHKERRQ(ierr);
1150f6c57405SHong Zhang         ierr = PetscViewerASCIIPrintf(viewer,"  INFOG(4) (estimated integer workspace for factors on all processors after analysis): %d \n",lu->id.INFOG(4));CHKERRQ(ierr);
1151f6c57405SHong Zhang         ierr = PetscViewerASCIIPrintf(viewer,"  INFOG(5) (estimated maximum front size in the complete tree): %d \n",lu->id.INFOG(5));CHKERRQ(ierr);
1152f6c57405SHong Zhang         ierr = PetscViewerASCIIPrintf(viewer,"  INFOG(6) (number of nodes in the complete tree): %d \n",lu->id.INFOG(6));CHKERRQ(ierr);
1153*2bd8dccdSBarry Smith         ierr = PetscViewerASCIIPrintf(viewer,"  INFOG(7) (ordering option effectively use after analysis): %d \n",lu->id.INFOG(7));CHKERRQ(ierr);
1154f6c57405SHong Zhang         ierr = PetscViewerASCIIPrintf(viewer,"  INFOG(8) (structural symmetry in percent of the permuted matrix after analysis): %d \n",lu->id.INFOG(8));CHKERRQ(ierr);
1155f6c57405SHong 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);
1156f6c57405SHong Zhang         ierr = PetscViewerASCIIPrintf(viewer,"  INFOG(10) (total integer space store the matrix factors after factorization): %d \n",lu->id.INFOG(10));CHKERRQ(ierr);
1157f6c57405SHong Zhang         ierr = PetscViewerASCIIPrintf(viewer,"  INFOG(11) (order of largest frontal matrix after factorization): %d \n",lu->id.INFOG(11));CHKERRQ(ierr);
1158f6c57405SHong Zhang         ierr = PetscViewerASCIIPrintf(viewer,"  INFOG(12) (number of off-diagonal pivots): %d \n",lu->id.INFOG(12));CHKERRQ(ierr);
1159f6c57405SHong Zhang         ierr = PetscViewerASCIIPrintf(viewer,"  INFOG(13) (number of delayed pivots after factorization): %d \n",lu->id.INFOG(13));CHKERRQ(ierr);
1160f6c57405SHong Zhang         ierr = PetscViewerASCIIPrintf(viewer,"  INFOG(14) (number of memory compress after factorization): %d \n",lu->id.INFOG(14));CHKERRQ(ierr);
1161f6c57405SHong Zhang         ierr = PetscViewerASCIIPrintf(viewer,"  INFOG(15) (number of steps of iterative refinement after solution): %d \n",lu->id.INFOG(15));CHKERRQ(ierr);
1162f6c57405SHong 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);
1163f6c57405SHong 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);
1164f6c57405SHong 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);
1165f6c57405SHong 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);
1166f6c57405SHong Zhang         ierr = PetscViewerASCIIPrintf(viewer,"  INFOG(20) (estimated number of entries in the factors): %d \n",lu->id.INFOG(20));CHKERRQ(ierr);
1167f6c57405SHong 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);
1168f6c57405SHong 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);
1169f6c57405SHong Zhang         ierr = PetscViewerASCIIPrintf(viewer,"  INFOG(23) (after analysis: value of ICNTL(6) effectively used): %d \n",lu->id.INFOG(23));CHKERRQ(ierr);
1170f6c57405SHong Zhang         ierr = PetscViewerASCIIPrintf(viewer,"  INFOG(24) (after analysis: value of ICNTL(12) effectively used): %d \n",lu->id.INFOG(24));CHKERRQ(ierr);
1171f6c57405SHong Zhang         ierr = PetscViewerASCIIPrintf(viewer,"  INFOG(25) (after factorization: number of pivots modified by static pivoting): %d \n",lu->id.INFOG(25));CHKERRQ(ierr);
1172f6c57405SHong Zhang       }
1173f6c57405SHong Zhang     }
1174cb828f0fSHong Zhang   }
1175f6c57405SHong Zhang   PetscFunctionReturn(0);
1176f6c57405SHong Zhang }
1177f6c57405SHong Zhang 
117835bd34faSBarry Smith #undef __FUNCT__
117935bd34faSBarry Smith #define __FUNCT__ "MatGetInfo_MUMPS"
118035bd34faSBarry Smith PetscErrorCode MatGetInfo_MUMPS(Mat A,MatInfoType flag,MatInfo *info)
118135bd34faSBarry Smith {
1182cb828f0fSHong Zhang   Mat_MUMPS  *mumps =(Mat_MUMPS*)A->spptr;
118335bd34faSBarry Smith 
118435bd34faSBarry Smith   PetscFunctionBegin;
118535bd34faSBarry Smith   info->block_size        = 1.0;
1186cb828f0fSHong Zhang   info->nz_allocated      = mumps->id.INFOG(20);
1187cb828f0fSHong Zhang   info->nz_used           = mumps->id.INFOG(20);
118835bd34faSBarry Smith   info->nz_unneeded       = 0.0;
118935bd34faSBarry Smith   info->assemblies        = 0.0;
119035bd34faSBarry Smith   info->mallocs           = 0.0;
119135bd34faSBarry Smith   info->memory            = 0.0;
119235bd34faSBarry Smith   info->fill_ratio_given  = 0;
119335bd34faSBarry Smith   info->fill_ratio_needed = 0;
119435bd34faSBarry Smith   info->factor_mallocs    = 0;
119535bd34faSBarry Smith   PetscFunctionReturn(0);
119635bd34faSBarry Smith }
119735bd34faSBarry Smith 
11985ccb76cbSHong Zhang /* -------------------------------------------------------------------------------------------*/
11995ccb76cbSHong Zhang #undef __FUNCT__
12005ccb76cbSHong Zhang #define __FUNCT__ "MatMumpsSetIcntl_MUMPS"
12015ccb76cbSHong Zhang PetscErrorCode MatMumpsSetIcntl_MUMPS(Mat F,PetscInt icntl,PetscInt ival)
12025ccb76cbSHong Zhang {
12035ccb76cbSHong Zhang   Mat_MUMPS *lu =(Mat_MUMPS*)F->spptr;
12045ccb76cbSHong Zhang 
12055ccb76cbSHong Zhang   PetscFunctionBegin;
12065ccb76cbSHong Zhang   lu->id.ICNTL(icntl) = ival;
12075ccb76cbSHong Zhang   PetscFunctionReturn(0);
12085ccb76cbSHong Zhang }
12095ccb76cbSHong Zhang 
12105ccb76cbSHong Zhang #undef __FUNCT__
12115ccb76cbSHong Zhang #define __FUNCT__ "MatMumpsSetIcntl"
12125ccb76cbSHong Zhang /*@
12135ccb76cbSHong Zhang   MatMumpsSetIcntl - Set MUMPS parameter ICNTL()
12145ccb76cbSHong Zhang 
12155ccb76cbSHong Zhang    Logically Collective on Mat
12165ccb76cbSHong Zhang 
12175ccb76cbSHong Zhang    Input Parameters:
12185ccb76cbSHong Zhang +  F - the factored matrix obtained by calling MatGetFactor() from PETSc-MUMPS interface
12195ccb76cbSHong Zhang .  icntl - index of MUMPS parameter array ICNTL()
12205ccb76cbSHong Zhang -  ival - value of MUMPS ICNTL(icntl)
12215ccb76cbSHong Zhang 
12225ccb76cbSHong Zhang   Options Database:
12235ccb76cbSHong Zhang .   -mat_mumps_icntl_<icntl> <ival>
12245ccb76cbSHong Zhang 
12255ccb76cbSHong Zhang    Level: beginner
12265ccb76cbSHong Zhang 
12275ccb76cbSHong Zhang    References: MUMPS Users' Guide
12285ccb76cbSHong Zhang 
12295ccb76cbSHong Zhang .seealso: MatGetFactor()
12305ccb76cbSHong Zhang @*/
12315ccb76cbSHong Zhang PetscErrorCode MatMumpsSetIcntl(Mat F,PetscInt icntl,PetscInt ival)
12325ccb76cbSHong Zhang {
12335ccb76cbSHong Zhang   PetscErrorCode ierr;
12345ccb76cbSHong Zhang 
12355ccb76cbSHong Zhang   PetscFunctionBegin;
12365ccb76cbSHong Zhang   PetscValidLogicalCollectiveInt(F,icntl,2);
12375ccb76cbSHong Zhang   PetscValidLogicalCollectiveInt(F,ival,3);
12385ccb76cbSHong Zhang   ierr = PetscTryMethod(F,"MatMumpsSetIcntl_C",(Mat,PetscInt,PetscInt),(F,icntl,ival));CHKERRQ(ierr);
12395ccb76cbSHong Zhang   PetscFunctionReturn(0);
12405ccb76cbSHong Zhang }
12415ccb76cbSHong Zhang 
124224b6179bSKris Buschelman /*MC
12432692d6eeSBarry Smith   MATSOLVERMUMPS -  A matrix type providing direct solvers (LU and Cholesky) for
124424b6179bSKris Buschelman   distributed and sequential matrices via the external package MUMPS.
124524b6179bSKris Buschelman 
124641c8de11SBarry Smith   Works with MATAIJ and MATSBAIJ matrices
124724b6179bSKris Buschelman 
124824b6179bSKris Buschelman   Options Database Keys:
1249fb8376fbSHong Zhang + -mat_mumps_icntl_4 <0,...,4> - print level
125024b6179bSKris Buschelman . -mat_mumps_icntl_6 <0,...,7> - matrix prescaling options (see MUMPS User's Guide)
125164e6c443SBarry Smith . -mat_mumps_icntl_7 <0,...,7> - matrix orderings (see MUMPS User's Guidec)
125224b6179bSKris Buschelman . -mat_mumps_icntl_9 <1,2> - A or A^T x=b to be solved: 1 denotes A, 2 denotes A^T
125324b6179bSKris Buschelman . -mat_mumps_icntl_10 <n> - maximum number of iterative refinements
125494b7f48cSBarry Smith . -mat_mumps_icntl_11 <n> - error analysis, a positive value returns statistics during -ksp_view
125524b6179bSKris Buschelman . -mat_mumps_icntl_12 <n> - efficiency control (see MUMPS User's Guide)
125624b6179bSKris Buschelman . -mat_mumps_icntl_13 <n> - efficiency control (see MUMPS User's Guide)
125724b6179bSKris Buschelman . -mat_mumps_icntl_14 <n> - efficiency control (see MUMPS User's Guide)
125824b6179bSKris Buschelman . -mat_mumps_icntl_15 <n> - efficiency control (see MUMPS User's Guide)
125924b6179bSKris Buschelman . -mat_mumps_cntl_1 <delta> - relative pivoting threshold
126024b6179bSKris Buschelman . -mat_mumps_cntl_2 <tol> - stopping criterion for refinement
126124b6179bSKris Buschelman - -mat_mumps_cntl_3 <adelta> - absolute pivoting threshold
126224b6179bSKris Buschelman 
126324b6179bSKris Buschelman   Level: beginner
126424b6179bSKris Buschelman 
126541c8de11SBarry Smith .seealso: PCFactorSetMatSolverPackage(), MatSolverPackage
126641c8de11SBarry Smith 
126724b6179bSKris Buschelman M*/
126824b6179bSKris Buschelman 
12692877fffaSHong Zhang EXTERN_C_BEGIN
127035bd34faSBarry Smith #undef __FUNCT__
127135bd34faSBarry Smith #define __FUNCT__ "MatFactorGetSolverPackage_mumps"
127235bd34faSBarry Smith PetscErrorCode MatFactorGetSolverPackage_mumps(Mat A,const MatSolverPackage *type)
127335bd34faSBarry Smith {
127435bd34faSBarry Smith   PetscFunctionBegin;
12752692d6eeSBarry Smith   *type = MATSOLVERMUMPS;
127635bd34faSBarry Smith   PetscFunctionReturn(0);
127735bd34faSBarry Smith }
127835bd34faSBarry Smith EXTERN_C_END
127935bd34faSBarry Smith 
128035bd34faSBarry Smith EXTERN_C_BEGIN
1281bccb9932SShri Abhyankar /* MatGetFactor for Seq and MPI AIJ matrices */
12822877fffaSHong Zhang #undef __FUNCT__
1283bccb9932SShri Abhyankar #define __FUNCT__ "MatGetFactor_aij_mumps"
1284bccb9932SShri Abhyankar PetscErrorCode MatGetFactor_aij_mumps(Mat A,MatFactorType ftype,Mat *F)
12852877fffaSHong Zhang {
12862877fffaSHong Zhang   Mat            B;
12872877fffaSHong Zhang   PetscErrorCode ierr;
12882877fffaSHong Zhang   Mat_MUMPS      *mumps;
1289ace3abfcSBarry Smith   PetscBool      isSeqAIJ;
12902877fffaSHong Zhang 
12912877fffaSHong Zhang   PetscFunctionBegin;
12922877fffaSHong Zhang   /* Create the factorization matrix */
1293bccb9932SShri Abhyankar   ierr = PetscTypeCompare((PetscObject)A,MATSEQAIJ,&isSeqAIJ);CHKERRQ(ierr);
12942877fffaSHong Zhang   ierr = MatCreate(((PetscObject)A)->comm,&B);CHKERRQ(ierr);
12952877fffaSHong Zhang   ierr = MatSetSizes(B,A->rmap->n,A->cmap->n,A->rmap->N,A->cmap->N);CHKERRQ(ierr);
12962877fffaSHong Zhang   ierr = MatSetType(B,((PetscObject)A)->type_name);CHKERRQ(ierr);
1297bccb9932SShri Abhyankar   if (isSeqAIJ) {
12982877fffaSHong Zhang     ierr = MatSeqAIJSetPreallocation(B,0,PETSC_NULL);CHKERRQ(ierr);
1299bccb9932SShri Abhyankar   } else {
1300bccb9932SShri Abhyankar     ierr = MatMPIAIJSetPreallocation(B,0,PETSC_NULL,0,PETSC_NULL);CHKERRQ(ierr);
1301bccb9932SShri Abhyankar   }
13022877fffaSHong Zhang 
130316ebf90aSShri Abhyankar   ierr = PetscNewLog(B,Mat_MUMPS,&mumps);CHKERRQ(ierr);
13042877fffaSHong Zhang   B->ops->view             = MatView_MUMPS;
130535bd34faSBarry Smith   B->ops->getinfo          = MatGetInfo_MUMPS;
130635bd34faSBarry Smith   ierr = PetscObjectComposeFunctionDynamic((PetscObject)B,"MatFactorGetSolverPackage_C","MatFactorGetSolverPackage_mumps",MatFactorGetSolverPackage_mumps);CHKERRQ(ierr);
13075ccb76cbSHong Zhang   ierr = PetscObjectComposeFunctionDynamic((PetscObject)B,"MatMumpsSetIcntl_C","MatMumpsSetIcntl_MUMPS",MatMumpsSetIcntl_MUMPS);CHKERRQ(ierr);
1308450b117fSShri Abhyankar   if (ftype == MAT_FACTOR_LU) {
1309450b117fSShri Abhyankar     B->ops->lufactorsymbolic = MatLUFactorSymbolic_AIJMUMPS;
1310d5f3da31SBarry Smith     B->factortype = MAT_FACTOR_LU;
1311bccb9932SShri Abhyankar     if (isSeqAIJ) mumps->ConvertToTriples = MatConvertToTriples_seqaij_seqaij;
1312bccb9932SShri Abhyankar     else mumps->ConvertToTriples = MatConvertToTriples_mpiaij_mpiaij;
1313746480a1SHong Zhang     mumps->sym = 0;
1314dcd589f8SShri Abhyankar   } else {
131567877ebaSShri Abhyankar     B->ops->choleskyfactorsymbolic = MatCholeskyFactorSymbolic_MUMPS;
1316450b117fSShri Abhyankar     B->factortype = MAT_FACTOR_CHOLESKY;
1317bccb9932SShri Abhyankar     if (isSeqAIJ) mumps->ConvertToTriples = MatConvertToTriples_seqaij_seqsbaij;
1318bccb9932SShri Abhyankar     else mumps->ConvertToTriples = MatConvertToTriples_mpiaij_mpisbaij;
13196fdc2a6dSBarry Smith     if (A->spd_set && A->spd) mumps->sym = 1;
13206fdc2a6dSBarry Smith     else                      mumps->sym = 2;
1321450b117fSShri Abhyankar   }
13222877fffaSHong Zhang 
13232877fffaSHong Zhang   mumps->isAIJ        = PETSC_TRUE;
1324bf0cc555SLisandro Dalcin   mumps->Destroy      = B->ops->destroy;
13252877fffaSHong Zhang   B->ops->destroy     = MatDestroy_MUMPS;
13262877fffaSHong Zhang   B->spptr            = (void*)mumps;
1327f697e70eSHong Zhang   ierr = PetscInitializeMUMPS(A,mumps);CHKERRQ(ierr);
1328746480a1SHong Zhang 
13292877fffaSHong Zhang   *F = B;
13302877fffaSHong Zhang   PetscFunctionReturn(0);
13312877fffaSHong Zhang }
13322877fffaSHong Zhang EXTERN_C_END
13332877fffaSHong Zhang 
1334bccb9932SShri Abhyankar 
13352877fffaSHong Zhang EXTERN_C_BEGIN
1336bccb9932SShri Abhyankar /* MatGetFactor for Seq and MPI SBAIJ matrices */
13372877fffaSHong Zhang #undef __FUNCT__
1338bccb9932SShri Abhyankar #define __FUNCT__ "MatGetFactor_sbaij_mumps"
1339bccb9932SShri Abhyankar PetscErrorCode MatGetFactor_sbaij_mumps(Mat A,MatFactorType ftype,Mat *F)
13402877fffaSHong Zhang {
13412877fffaSHong Zhang   Mat            B;
13422877fffaSHong Zhang   PetscErrorCode ierr;
13432877fffaSHong Zhang   Mat_MUMPS      *mumps;
1344ace3abfcSBarry Smith   PetscBool      isSeqSBAIJ;
13452877fffaSHong Zhang 
13462877fffaSHong Zhang   PetscFunctionBegin;
1347e7e72b3dSBarry Smith   if (ftype != MAT_FACTOR_CHOLESKY) SETERRQ(((PetscObject)A)->comm,PETSC_ERR_SUP,"Cannot use PETSc SBAIJ matrices with MUMPS LU, use AIJ matrix");
1348bccb9932SShri 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");
1349bccb9932SShri Abhyankar   ierr = PetscTypeCompare((PetscObject)A,MATSEQSBAIJ,&isSeqSBAIJ);CHKERRQ(ierr);
13502877fffaSHong Zhang   /* Create the factorization matrix */
13512877fffaSHong Zhang   ierr = MatCreate(((PetscObject)A)->comm,&B);CHKERRQ(ierr);
13522877fffaSHong Zhang   ierr = MatSetSizes(B,A->rmap->n,A->cmap->n,A->rmap->N,A->cmap->N);CHKERRQ(ierr);
13532877fffaSHong Zhang   ierr = MatSetType(B,((PetscObject)A)->type_name);CHKERRQ(ierr);
135416ebf90aSShri Abhyankar   ierr = PetscNewLog(B,Mat_MUMPS,&mumps);CHKERRQ(ierr);
1355bccb9932SShri Abhyankar   if (isSeqSBAIJ) {
1356bccb9932SShri Abhyankar     ierr = MatSeqSBAIJSetPreallocation(B,1,0,PETSC_NULL);CHKERRQ(ierr);
135716ebf90aSShri Abhyankar     mumps->ConvertToTriples = MatConvertToTriples_seqsbaij_seqsbaij;
1358dcd589f8SShri Abhyankar   } else {
1359bccb9932SShri Abhyankar     ierr = MatMPISBAIJSetPreallocation(B,1,0,PETSC_NULL,0,PETSC_NULL);CHKERRQ(ierr);
1360bccb9932SShri Abhyankar     mumps->ConvertToTriples = MatConvertToTriples_mpisbaij_mpisbaij;
1361bccb9932SShri Abhyankar   }
1362bccb9932SShri Abhyankar 
136367877ebaSShri Abhyankar   B->ops->choleskyfactorsymbolic = MatCholeskyFactorSymbolic_MUMPS;
1364bccb9932SShri Abhyankar   B->ops->view                   = MatView_MUMPS;
1365bccb9932SShri Abhyankar   ierr = PetscObjectComposeFunctionDynamic((PetscObject)B,"MatFactorGetSolverPackage_C","MatFactorGetSolverPackage_mumps",MatFactorGetSolverPackage_mumps);CHKERRQ(ierr);
1366f250808bSBarry Smith   ierr = PetscObjectComposeFunctionDynamic((PetscObject)B,"MatMumpsSetIcntl_C","MatMumpsSetIcntl",MatMumpsSetIcntl);CHKERRQ(ierr);
1367f4762488SHong Zhang   B->factortype                  = MAT_FACTOR_CHOLESKY;
13686fdc2a6dSBarry Smith   if (A->spd_set && A->spd) mumps->sym = 1;
13696fdc2a6dSBarry Smith   else                      mumps->sym = 2;
1370a214ac2aSShri Abhyankar 
1371bccb9932SShri Abhyankar   mumps->isAIJ        = PETSC_FALSE;
1372bf0cc555SLisandro Dalcin   mumps->Destroy      = B->ops->destroy;
1373f3c0ef26SHong Zhang   B->ops->destroy     = MatDestroy_MUMPS;
13742877fffaSHong Zhang   B->spptr            = (void*)mumps;
1375f697e70eSHong Zhang   ierr = PetscInitializeMUMPS(A,mumps);CHKERRQ(ierr);
1376746480a1SHong Zhang 
13772877fffaSHong Zhang   *F = B;
13782877fffaSHong Zhang   PetscFunctionReturn(0);
13792877fffaSHong Zhang }
13802877fffaSHong Zhang EXTERN_C_END
138197969023SHong Zhang 
1382450b117fSShri Abhyankar EXTERN_C_BEGIN
1383450b117fSShri Abhyankar #undef __FUNCT__
1384bccb9932SShri Abhyankar #define __FUNCT__ "MatGetFactor_baij_mumps"
1385bccb9932SShri Abhyankar PetscErrorCode MatGetFactor_baij_mumps(Mat A,MatFactorType ftype,Mat *F)
138667877ebaSShri Abhyankar {
138767877ebaSShri Abhyankar   Mat            B;
138867877ebaSShri Abhyankar   PetscErrorCode ierr;
138967877ebaSShri Abhyankar   Mat_MUMPS      *mumps;
1390ace3abfcSBarry Smith   PetscBool      isSeqBAIJ;
139167877ebaSShri Abhyankar 
139267877ebaSShri Abhyankar   PetscFunctionBegin;
139367877ebaSShri Abhyankar   /* Create the factorization matrix */
1394bccb9932SShri Abhyankar   ierr = PetscTypeCompare((PetscObject)A,MATSEQBAIJ,&isSeqBAIJ);CHKERRQ(ierr);
139567877ebaSShri Abhyankar   ierr = MatCreate(((PetscObject)A)->comm,&B);CHKERRQ(ierr);
139667877ebaSShri Abhyankar   ierr = MatSetSizes(B,A->rmap->n,A->cmap->n,A->rmap->N,A->cmap->N);CHKERRQ(ierr);
139767877ebaSShri Abhyankar   ierr = MatSetType(B,((PetscObject)A)->type_name);CHKERRQ(ierr);
1398bccb9932SShri Abhyankar   if (isSeqBAIJ) {
139967877ebaSShri Abhyankar     ierr = MatSeqBAIJSetPreallocation(B,A->rmap->bs,0,PETSC_NULL);CHKERRQ(ierr);
1400bccb9932SShri Abhyankar   } else {
140167877ebaSShri Abhyankar     ierr = MatMPIBAIJSetPreallocation(B,A->rmap->bs,0,PETSC_NULL,0,PETSC_NULL);CHKERRQ(ierr);
1402bccb9932SShri Abhyankar   }
1403450b117fSShri Abhyankar 
140467877ebaSShri Abhyankar   ierr = PetscNewLog(B,Mat_MUMPS,&mumps);CHKERRQ(ierr);
1405450b117fSShri Abhyankar   if (ftype == MAT_FACTOR_LU) {
1406450b117fSShri Abhyankar     B->ops->lufactorsymbolic = MatLUFactorSymbolic_BAIJMUMPS;
1407450b117fSShri Abhyankar     B->factortype = MAT_FACTOR_LU;
1408bccb9932SShri Abhyankar     if (isSeqBAIJ) mumps->ConvertToTriples = MatConvertToTriples_seqbaij_seqaij;
1409bccb9932SShri Abhyankar     else mumps->ConvertToTriples = MatConvertToTriples_mpibaij_mpiaij;
1410746480a1SHong Zhang     mumps->sym = 0;
1411746480a1SHong Zhang   } else {
1412746480a1SHong Zhang     SETERRQ(PETSC_COMM_SELF,PETSC_ERR_SUP,"Cannot use PETSc BAIJ matrices with MUMPS Cholesky, use SBAIJ or AIJ matrix instead\n");
1413450b117fSShri Abhyankar   }
1414bccb9932SShri Abhyankar 
1415450b117fSShri Abhyankar   B->ops->view             = MatView_MUMPS;
1416450b117fSShri Abhyankar   ierr = PetscObjectComposeFunctionDynamic((PetscObject)B,"MatFactorGetSolverPackage_C","MatFactorGetSolverPackage_mumps",MatFactorGetSolverPackage_mumps);CHKERRQ(ierr);
14175ccb76cbSHong Zhang   ierr = PetscObjectComposeFunctionDynamic((PetscObject)B,"MatMumpsSetIcntl_C","MatMumpsSetIcntl_MUMPS",MatMumpsSetIcntl_MUMPS);CHKERRQ(ierr);
1418450b117fSShri Abhyankar 
1419450b117fSShri Abhyankar   mumps->isAIJ        = PETSC_TRUE;
1420bf0cc555SLisandro Dalcin   mumps->Destroy      = B->ops->destroy;
1421450b117fSShri Abhyankar   B->ops->destroy     = MatDestroy_MUMPS;
1422450b117fSShri Abhyankar   B->spptr            = (void*)mumps;
1423f697e70eSHong Zhang   ierr = PetscInitializeMUMPS(A,mumps);CHKERRQ(ierr);
1424746480a1SHong Zhang 
1425450b117fSShri Abhyankar   *F = B;
1426450b117fSShri Abhyankar   PetscFunctionReturn(0);
1427450b117fSShri Abhyankar }
1428450b117fSShri Abhyankar EXTERN_C_END
1429a214ac2aSShri Abhyankar 
1430