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