xref: /petsc/src/mat/impls/aij/mpi/mumps/mumps.c (revision 16ebf90a967e02298fd691105a20c00c1ccaa11a)
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;
38*16ebf90aSShri 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);
45*16ebf90aSShri 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 
50397b6df1SKris Buschelman /* convert Petsc mpiaij matrix to triples: row[nz], col[nz], val[nz] */
51397b6df1SKris Buschelman /*
52397b6df1SKris Buschelman   input:
5375747be1SHong Zhang     A       - matrix in mpiaij or mpisbaij (bs=1) format
54397b6df1SKris Buschelman     shift   - 0: C style output triple; 1: Fortran style output triple.
55397b6df1SKris Buschelman     valOnly - FALSE: spaces are allocated and values are set for the triple
56397b6df1SKris Buschelman               TRUE:  only the values in v array are updated
57397b6df1SKris Buschelman   output:
58397b6df1SKris Buschelman     nnz     - dim of r, c, and v (number of local nonzero entries of A)
59397b6df1SKris Buschelman     r, c, v - row and col index, matrix values (matrix triples)
60397b6df1SKris Buschelman  */
61*16ebf90aSShri Abhyankar 
62*16ebf90aSShri Abhyankar #undef __FUNCT__
63*16ebf90aSShri Abhyankar #define __FUNCT__ "MatConvertToTriples_seqaij_seqaij"
64*16ebf90aSShri Abhyankar PetscErrorCode MatConvertToTriples_seqaij_seqaij(Mat A,int shift,PetscTruth valOnly,int *nnz,int **r, int **c, PetscScalar **v)
65b24902e0SBarry Smith {
66*16ebf90aSShri Abhyankar   const PetscInt   *ai,*aj,M=A->rmap->n;;
67*16ebf90aSShri Abhyankar   PetscInt         nz,rnz,i;
68dfbe8321SBarry Smith   PetscErrorCode   ierr;
69c1490034SHong Zhang   PetscInt         *row,*col;
70*16ebf90aSShri Abhyankar   Mat_SeqAIJ       *aa=(Mat_SeqAIJ*)A->data;
71397b6df1SKris Buschelman 
72397b6df1SKris Buschelman   PetscFunctionBegin;
73*16ebf90aSShri Abhyankar   *v=aa->a;
74*16ebf90aSShri Abhyankar   if (!valOnly){
75*16ebf90aSShri Abhyankar     nz = aa->nz; ai = aa->i; aj = aa->j;
76*16ebf90aSShri Abhyankar     *nnz = nz;
77*16ebf90aSShri Abhyankar     ierr = PetscMalloc(nz*sizeof(PetscInt), &row);CHKERRQ(ierr);
78*16ebf90aSShri Abhyankar     ierr = PetscMalloc(nz*sizeof(PetscInt), &col);CHKERRQ(ierr);
79*16ebf90aSShri Abhyankar     nz = 0;
80*16ebf90aSShri Abhyankar     for(i=0; i<M; i++) {
81*16ebf90aSShri Abhyankar       rnz = ai[i+1] - ai[i];
82*16ebf90aSShri Abhyankar       while(rnz--){
83*16ebf90aSShri Abhyankar 	row[nz] = i+shift; col[nz] = (*aj)+shift; aj++;nz++;
84*16ebf90aSShri Abhyankar       }
85*16ebf90aSShri Abhyankar     }
86*16ebf90aSShri Abhyankar     *r = row; *c = col;
87*16ebf90aSShri Abhyankar   }
88*16ebf90aSShri Abhyankar   PetscFunctionReturn(0);
89*16ebf90aSShri Abhyankar }
90397b6df1SKris Buschelman 
91*16ebf90aSShri Abhyankar #undef __FUNCT__
92*16ebf90aSShri Abhyankar #define __FUNCT__ "MatConvertToTriples_seqsbaij_seqsbaij"
93*16ebf90aSShri Abhyankar PetscErrorCode MatConvertToTriples_seqsbaij_seqsbaij(Mat A,int shift,PetscTruth valOnly,int *nnz,int **r, int **c, PetscScalar **v)
94*16ebf90aSShri Abhyankar {
95*16ebf90aSShri Abhyankar   const PetscInt   *ai, *aj,M=A->rmap->n;
96*16ebf90aSShri Abhyankar   PetscInt         nz,rnz,i;
97*16ebf90aSShri Abhyankar   PetscErrorCode   ierr;
98*16ebf90aSShri Abhyankar   PetscInt         *row,*col;
99*16ebf90aSShri Abhyankar   Mat_SeqSBAIJ     *aa=(Mat_SeqSBAIJ*)A->data;
100*16ebf90aSShri Abhyankar 
101*16ebf90aSShri Abhyankar   PetscFunctionBegin;
102*16ebf90aSShri Abhyankar   if (!valOnly){
103*16ebf90aSShri Abhyankar     nz = aa->nz;ai=aa->i; aj=aa->j;*v=aa->a;
104*16ebf90aSShri Abhyankar     *nnz = nz;
105*16ebf90aSShri Abhyankar     ierr = PetscMalloc(nz*sizeof(PetscInt), &row);CHKERRQ(ierr);
106*16ebf90aSShri Abhyankar     ierr = PetscMalloc(nz*sizeof(PetscInt), &col);CHKERRQ(ierr);
107*16ebf90aSShri Abhyankar     nz = 0;
108*16ebf90aSShri Abhyankar     for(i=0; i<M; i++) {
109*16ebf90aSShri Abhyankar       rnz = ai[i+1] - ai[i];
110*16ebf90aSShri Abhyankar       while(rnz--){
111*16ebf90aSShri Abhyankar 	row[nz] = i+shift; col[nz] = (*aj)+shift; aj++;nz++;
112*16ebf90aSShri Abhyankar       }
113*16ebf90aSShri Abhyankar     }
114*16ebf90aSShri Abhyankar     *r = row; *c = col;
115*16ebf90aSShri Abhyankar   }
116*16ebf90aSShri Abhyankar   PetscFunctionReturn(0);
117*16ebf90aSShri Abhyankar }
118*16ebf90aSShri Abhyankar 
119*16ebf90aSShri Abhyankar #undef __FUNCT__
120*16ebf90aSShri Abhyankar #define __FUNCT__ "MatConvertToTriples_seqaij_seqsbaij"
121*16ebf90aSShri Abhyankar PetscErrorCode MatConvertToTriples_seqaij_seqsbaij(Mat A,int shift,PetscTruth valOnly,int *nnz,int **r, int **c, PetscScalar **v)
122*16ebf90aSShri Abhyankar {
123*16ebf90aSShri Abhyankar   const PetscInt     *ai, *aj,*adiag,M=A->rmap->n;
124*16ebf90aSShri Abhyankar   PetscInt           nz,rnz,jidx,i;
125*16ebf90aSShri Abhyankar   const PetscScalar  *av;
126*16ebf90aSShri Abhyankar   PetscScalar        *val;
127*16ebf90aSShri Abhyankar   PetscErrorCode     ierr;
128*16ebf90aSShri Abhyankar   PetscInt           *row,*col;
129*16ebf90aSShri Abhyankar   Mat_SeqSBAIJ       *aa=(Mat_SeqSBAIJ*)A->data;
130*16ebf90aSShri Abhyankar 
131*16ebf90aSShri Abhyankar   PetscFunctionBegin;
132*16ebf90aSShri Abhyankar   ai=aa->i; aj=aa->j;av=aa->a;
133*16ebf90aSShri Abhyankar   adiag=aa->diag;
134*16ebf90aSShri Abhyankar   if (!valOnly){
135*16ebf90aSShri Abhyankar     nz = M + (aa->nz-M)/2;
136*16ebf90aSShri Abhyankar     *nnz = nz;
137*16ebf90aSShri Abhyankar     ierr = PetscMalloc(nz*sizeof(PetscInt), &row);CHKERRQ(ierr);
138*16ebf90aSShri Abhyankar     ierr = PetscMalloc(nz*sizeof(PetscInt), &col);CHKERRQ(ierr);
139*16ebf90aSShri Abhyankar     ierr = PetscMalloc(nz*sizeof(PetscScalar), &val);CHKERRQ(ierr);
140*16ebf90aSShri Abhyankar     nz = 0;
141*16ebf90aSShri Abhyankar     for(i=0; i<M; i++) {
142*16ebf90aSShri Abhyankar       rnz = ai[i+1] - adiag[i];
143*16ebf90aSShri Abhyankar       jidx = adiag[i];
144*16ebf90aSShri Abhyankar       while(rnz--){
145*16ebf90aSShri Abhyankar 	row[nz] = i+shift; col[nz] = aj[jidx]+shift; val[nz] = av[jidx];
146*16ebf90aSShri Abhyankar         jidx++;nz++;
147*16ebf90aSShri Abhyankar       }
148*16ebf90aSShri Abhyankar     }
149*16ebf90aSShri Abhyankar     *r = row; *c = col; *v = val;
150397b6df1SKris Buschelman   } else {
151*16ebf90aSShri Abhyankar     nz = 0; val = *v;
152*16ebf90aSShri Abhyankar     for(i=0; i <M; i++) {
153*16ebf90aSShri Abhyankar       rnz = ai[i+1] - adiag[i];
154*16ebf90aSShri Abhyankar       jidx = adiag[i];
155*16ebf90aSShri Abhyankar       while(rnz--) {
156*16ebf90aSShri Abhyankar 	val[nz] = av[jidx]; nz++; jidx++;
157*16ebf90aSShri Abhyankar       }
158*16ebf90aSShri Abhyankar     }
159*16ebf90aSShri Abhyankar   }
160*16ebf90aSShri Abhyankar   PetscFunctionReturn(0);
161*16ebf90aSShri Abhyankar }
162*16ebf90aSShri Abhyankar 
163*16ebf90aSShri Abhyankar #undef __FUNCT__
164*16ebf90aSShri Abhyankar #define __FUNCT__ "MatConvertToTriples_mpisbaij_mpisbaij"
165*16ebf90aSShri Abhyankar PetscErrorCode MatConvertToTriples_mpisbaij_mpisbaij(Mat A,int shift,PetscTruth valOnly,int *nnz,int **r, int **c, PetscScalar **v)
166*16ebf90aSShri Abhyankar {
167*16ebf90aSShri Abhyankar   const PetscInt     *ai, *aj, *bi, *bj,*garray,m=A->rmap->n,*ajj,*bjj;
168*16ebf90aSShri Abhyankar   PetscErrorCode     ierr;
169*16ebf90aSShri Abhyankar   PetscInt           rstart,nz,i,j,jj,irow,countA,countB;
170*16ebf90aSShri Abhyankar   PetscInt           *row,*col;
171*16ebf90aSShri Abhyankar   const PetscScalar  *av, *bv,*v1,*v2;
172*16ebf90aSShri Abhyankar   PetscScalar        *val;
173397b6df1SKris Buschelman   Mat_MPISBAIJ       *mat =  (Mat_MPISBAIJ*)A->data;
174397b6df1SKris Buschelman   Mat_SeqSBAIJ       *aa=(Mat_SeqSBAIJ*)(mat->A)->data;
175397b6df1SKris Buschelman   Mat_SeqBAIJ        *bb=(Mat_SeqBAIJ*)(mat->B)->data;
176*16ebf90aSShri Abhyankar 
177*16ebf90aSShri Abhyankar   PetscFunctionBegin;
178d0f46423SBarry Smith   ai=aa->i; aj=aa->j; bi=bb->i; bj=bb->j; rstart= A->rmap->rstart;
179397b6df1SKris Buschelman   garray = mat->garray;
180397b6df1SKris Buschelman   av=aa->a; bv=bb->a;
181397b6df1SKris Buschelman 
182397b6df1SKris Buschelman   if (!valOnly){
183*16ebf90aSShri Abhyankar     nz = aa->nz + bb->nz;
184*16ebf90aSShri Abhyankar     *nnz = nz;
1857c307921SBarry Smith     ierr = PetscMalloc(nz*sizeof(PetscInt) ,&row);CHKERRQ(ierr);
1867c307921SBarry Smith     ierr = PetscMalloc(nz*sizeof(PetscInt),&col);CHKERRQ(ierr);
187397b6df1SKris Buschelman     ierr = PetscMalloc(nz*sizeof(PetscScalar),&val);CHKERRQ(ierr);
188397b6df1SKris Buschelman     *r = row; *c = col; *v = val;
189397b6df1SKris Buschelman   } else {
190397b6df1SKris Buschelman     row = *r; col = *c; val = *v;
191397b6df1SKris Buschelman   }
192397b6df1SKris Buschelman 
193028e57e8SHong Zhang   jj = 0; irow = rstart;
194397b6df1SKris Buschelman   for ( i=0; i<m; i++ ) {
195397b6df1SKris Buschelman     ajj    = aj + ai[i];                 /* ptr to the beginning of this row */
196397b6df1SKris Buschelman     countA = ai[i+1] - ai[i];
197397b6df1SKris Buschelman     countB = bi[i+1] - bi[i];
198397b6df1SKris Buschelman     bjj    = bj + bi[i];
199*16ebf90aSShri Abhyankar     v1     = av + ai[i];
200*16ebf90aSShri Abhyankar     v2     = bv + bi[i];
201397b6df1SKris Buschelman 
202397b6df1SKris Buschelman     /* A-part */
203397b6df1SKris Buschelman     for (j=0; j<countA; j++){
204397b6df1SKris Buschelman       if (!valOnly){
205397b6df1SKris Buschelman         row[jj] = irow + shift; col[jj] = rstart + ajj[j] + shift;
206397b6df1SKris Buschelman       }
207*16ebf90aSShri Abhyankar       val[jj++] = v1[j];
208397b6df1SKris Buschelman     }
209*16ebf90aSShri Abhyankar 
210*16ebf90aSShri Abhyankar     /* B-part */
211*16ebf90aSShri Abhyankar     for(j=0; j < countB; j++){
212*16ebf90aSShri Abhyankar       if (j == countB) break;
213397b6df1SKris Buschelman       if (!valOnly){
214397b6df1SKris Buschelman 	row[jj] = irow + shift; col[jj] = garray[bjj[j]] + shift;
215397b6df1SKris Buschelman       }
216*16ebf90aSShri Abhyankar       val[jj++] = v2[j];
217*16ebf90aSShri Abhyankar     }
218*16ebf90aSShri Abhyankar     irow++;
219*16ebf90aSShri Abhyankar   }
220*16ebf90aSShri Abhyankar   PetscFunctionReturn(0);
221*16ebf90aSShri Abhyankar }
222*16ebf90aSShri Abhyankar 
223*16ebf90aSShri Abhyankar #undef __FUNCT__
224*16ebf90aSShri Abhyankar #define __FUNCT__ "MatConvertToTriples_mpiaij_mpiaij"
225*16ebf90aSShri Abhyankar PetscErrorCode MatConvertToTriples_mpiaij_mpiaij(Mat A,int shift,PetscTruth valOnly,int *nnz,int **r, int **c, PetscScalar **v)
226*16ebf90aSShri Abhyankar {
227*16ebf90aSShri Abhyankar   const PetscInt     *ai, *aj, *bi, *bj,*garray,m=A->rmap->n,*ajj,*bjj;
228*16ebf90aSShri Abhyankar   PetscErrorCode     ierr;
229*16ebf90aSShri Abhyankar   PetscInt           rstart,nz,i,j,jj,irow,countA,countB;
230*16ebf90aSShri Abhyankar   PetscInt           *row,*col;
231*16ebf90aSShri Abhyankar   const PetscScalar  *av, *bv,*v1,*v2;
232*16ebf90aSShri Abhyankar   PetscScalar        *val;
233*16ebf90aSShri Abhyankar   Mat_MPIAIJ         *mat =  (Mat_MPIAIJ*)A->data;
234*16ebf90aSShri Abhyankar   Mat_SeqAIJ         *aa=(Mat_SeqAIJ*)(mat->A)->data;
235*16ebf90aSShri Abhyankar   Mat_SeqAIJ         *bb=(Mat_SeqAIJ*)(mat->B)->data;
236*16ebf90aSShri Abhyankar 
237*16ebf90aSShri Abhyankar   PetscFunctionBegin;
238*16ebf90aSShri Abhyankar   ai=aa->i; aj=aa->j; bi=bb->i; bj=bb->j; rstart= A->rmap->rstart;
239*16ebf90aSShri Abhyankar   garray = mat->garray;
240*16ebf90aSShri Abhyankar   av=aa->a; bv=bb->a;
241*16ebf90aSShri Abhyankar 
242*16ebf90aSShri Abhyankar   if (!valOnly){
243*16ebf90aSShri Abhyankar     nz = aa->nz + bb->nz;
244*16ebf90aSShri Abhyankar     *nnz = nz;
245*16ebf90aSShri Abhyankar     ierr = PetscMalloc(nz*sizeof(PetscInt) ,&row);CHKERRQ(ierr);
246*16ebf90aSShri Abhyankar     ierr = PetscMalloc(nz*sizeof(PetscInt),&col);CHKERRQ(ierr);
247*16ebf90aSShri Abhyankar     ierr = PetscMalloc(nz*sizeof(PetscScalar),&val);CHKERRQ(ierr);
248*16ebf90aSShri Abhyankar     *r = row; *c = col; *v = val;
249*16ebf90aSShri Abhyankar   } else {
250*16ebf90aSShri Abhyankar     row = *r; col = *c; val = *v;
251*16ebf90aSShri Abhyankar   }
252*16ebf90aSShri Abhyankar 
253*16ebf90aSShri Abhyankar   jj = 0; irow = rstart;
254*16ebf90aSShri Abhyankar   for ( i=0; i<m; i++ ) {
255*16ebf90aSShri Abhyankar     ajj    = aj + ai[i];                 /* ptr to the beginning of this row */
256*16ebf90aSShri Abhyankar     countA = ai[i+1] - ai[i];
257*16ebf90aSShri Abhyankar     countB = bi[i+1] - bi[i];
258*16ebf90aSShri Abhyankar     bjj    = bj + bi[i];
259*16ebf90aSShri Abhyankar     v1     = av + ai[i];
260*16ebf90aSShri Abhyankar     v2     = bv + bi[i];
261*16ebf90aSShri Abhyankar 
262*16ebf90aSShri Abhyankar     /* A-part */
263*16ebf90aSShri Abhyankar     for (j=0; j<countA; j++){
264*16ebf90aSShri Abhyankar       if (!valOnly){
265*16ebf90aSShri Abhyankar         row[jj] = irow + shift; col[jj] = rstart + ajj[j] + shift;
266*16ebf90aSShri Abhyankar       }
267*16ebf90aSShri Abhyankar       val[jj++] = v1[j];
268*16ebf90aSShri Abhyankar     }
269*16ebf90aSShri Abhyankar 
270*16ebf90aSShri Abhyankar     /* B-part */
271*16ebf90aSShri Abhyankar     for(j=0; j < countB; j++){
272*16ebf90aSShri Abhyankar       if (j == countB) break;
273*16ebf90aSShri Abhyankar       if (!valOnly){
274*16ebf90aSShri Abhyankar 	row[jj] = irow + shift; col[jj] = garray[bjj[j]] + shift;
275*16ebf90aSShri Abhyankar       }
276*16ebf90aSShri Abhyankar       val[jj++] = v2[j];
277*16ebf90aSShri Abhyankar     }
278*16ebf90aSShri Abhyankar     irow++;
279*16ebf90aSShri Abhyankar   }
280*16ebf90aSShri Abhyankar   PetscFunctionReturn(0);
281*16ebf90aSShri Abhyankar }
282*16ebf90aSShri Abhyankar 
283*16ebf90aSShri Abhyankar #undef __FUNCT__
284*16ebf90aSShri Abhyankar #define __FUNCT__ "MatConvertToTriples_mpiaij_mpisbaij"
285*16ebf90aSShri Abhyankar PetscErrorCode MatConvertToTriples_mpiaij_mpisbaij(Mat A,int shift,PetscTruth valOnly,int *nnz,int **r, int **c, PetscScalar **v)
286*16ebf90aSShri Abhyankar {
287*16ebf90aSShri Abhyankar   const PetscInt     *ai, *aj,*adiag, *bi, *bj,*garray,m=A->rmap->n,*ajj,*bjj;
288*16ebf90aSShri Abhyankar   PetscErrorCode     ierr;
289*16ebf90aSShri Abhyankar   PetscInt           rstart,nz,nza,nzb_low,i,j,jj,irow,countA,countB;
290*16ebf90aSShri Abhyankar   PetscInt           *row,*col;
291*16ebf90aSShri Abhyankar   const PetscScalar  *av, *bv,*v1,*v2;
292*16ebf90aSShri Abhyankar   PetscScalar        *val;
293*16ebf90aSShri Abhyankar   Mat_MPIAIJ         *mat =  (Mat_MPIAIJ*)A->data;
294*16ebf90aSShri Abhyankar   Mat_SeqAIJ         *aa=(Mat_SeqAIJ*)(mat->A)->data;
295*16ebf90aSShri Abhyankar   Mat_SeqAIJ         *bb=(Mat_SeqAIJ*)(mat->B)->data;
296*16ebf90aSShri Abhyankar 
297*16ebf90aSShri Abhyankar   PetscFunctionBegin;
298*16ebf90aSShri Abhyankar   ai=aa->i; aj=aa->j; adiag=aa->diag;
299*16ebf90aSShri Abhyankar   bi=bb->i; bj=bb->j; garray = mat->garray;
300*16ebf90aSShri Abhyankar   av=aa->a; bv=bb->a;
301*16ebf90aSShri Abhyankar   rstart = A->rmap->rstart;
302*16ebf90aSShri Abhyankar 
303*16ebf90aSShri Abhyankar   if (!valOnly){
304*16ebf90aSShri Abhyankar     nza = 0;nzb_low = 0;
305*16ebf90aSShri Abhyankar     for(i=0; i<m; i++){
306*16ebf90aSShri Abhyankar       nza     = nza + (ai[i+1] - adiag[i]);
307*16ebf90aSShri Abhyankar       countB  = bi[i+1] - bi[i];
308*16ebf90aSShri Abhyankar       bjj     = bj + bi[i];
309*16ebf90aSShri Abhyankar 
310*16ebf90aSShri Abhyankar       j = 0;
311*16ebf90aSShri Abhyankar       while(garray[bjj[j]] < rstart) {
312*16ebf90aSShri Abhyankar 	if(j == countB) break;
313*16ebf90aSShri Abhyankar 	j++;nzb_low++;
314*16ebf90aSShri Abhyankar       }
315*16ebf90aSShri Abhyankar     }
316*16ebf90aSShri Abhyankar     /* Total nz = nz for the upper triangular A part + nz for the 2nd B part */
317*16ebf90aSShri Abhyankar     nz = nza + (bb->nz - nzb_low);
318*16ebf90aSShri Abhyankar     *nnz = nz;
319*16ebf90aSShri Abhyankar     ierr = PetscMalloc(nz*sizeof(PetscInt) ,&row);CHKERRQ(ierr);
320*16ebf90aSShri Abhyankar     ierr = PetscMalloc(nz*sizeof(PetscInt),&col);CHKERRQ(ierr);
321*16ebf90aSShri Abhyankar     ierr = PetscMalloc(nz*sizeof(PetscScalar),&val);CHKERRQ(ierr);
322*16ebf90aSShri Abhyankar     *r = row; *c = col; *v = val;
323*16ebf90aSShri Abhyankar   } else {
324*16ebf90aSShri Abhyankar     row = *r; col = *c; val = *v;
325*16ebf90aSShri Abhyankar   }
326*16ebf90aSShri Abhyankar 
327*16ebf90aSShri Abhyankar   jj = 0; irow = rstart;
328*16ebf90aSShri Abhyankar   for ( i=0; i<m; i++ ) {
329*16ebf90aSShri Abhyankar     ajj    = aj + adiag[i];                 /* ptr to the beginning of the diagonal of this row */
330*16ebf90aSShri Abhyankar     v1     = av + adiag[i];
331*16ebf90aSShri Abhyankar     countA = ai[i+1] - adiag[i];
332*16ebf90aSShri Abhyankar     countB = bi[i+1] - bi[i];
333*16ebf90aSShri Abhyankar     bjj    = bj + bi[i];
334*16ebf90aSShri Abhyankar     v2     = bv + bi[i];
335*16ebf90aSShri Abhyankar 
336*16ebf90aSShri Abhyankar      /* A-part */
337*16ebf90aSShri Abhyankar     for (j=0; j<countA; j++){
338*16ebf90aSShri Abhyankar       if (!valOnly){
339*16ebf90aSShri Abhyankar         row[jj] = irow + shift; col[jj] = rstart + ajj[j] + shift;
340*16ebf90aSShri Abhyankar       }
341*16ebf90aSShri Abhyankar       val[jj++] = v1[j];
342*16ebf90aSShri Abhyankar     }
343*16ebf90aSShri Abhyankar 
344*16ebf90aSShri Abhyankar     /* B-part */
345*16ebf90aSShri Abhyankar     for(j=0; j < countB; j++){
346*16ebf90aSShri Abhyankar       if (j == countB) break;
347*16ebf90aSShri Abhyankar       if (garray[bjj[j]] > rstart) {
348*16ebf90aSShri Abhyankar 	if (!valOnly){
349*16ebf90aSShri Abhyankar 	  row[jj] = irow + shift; col[jj] = garray[bjj[j]] + shift;
350*16ebf90aSShri Abhyankar 	}
351*16ebf90aSShri Abhyankar 	val[jj++] = v2[j];
352*16ebf90aSShri Abhyankar       }
353397b6df1SKris Buschelman     }
354397b6df1SKris Buschelman     irow++;
355397b6df1SKris Buschelman   }
356397b6df1SKris Buschelman   PetscFunctionReturn(0);
357397b6df1SKris Buschelman }
358397b6df1SKris Buschelman 
359397b6df1SKris Buschelman #undef __FUNCT__
3603924e44cSKris Buschelman #define __FUNCT__ "MatDestroy_MUMPS"
361dfbe8321SBarry Smith PetscErrorCode MatDestroy_MUMPS(Mat A)
362dfbe8321SBarry Smith {
363f0c56d0fSKris Buschelman   Mat_MUMPS      *lu=(Mat_MUMPS*)A->spptr;
364dfbe8321SBarry Smith   PetscErrorCode ierr;
365c1490034SHong Zhang   PetscMPIInt    size=lu->size;
366b24902e0SBarry Smith 
367397b6df1SKris Buschelman   PetscFunctionBegin;
368397b6df1SKris Buschelman   if (lu->CleanUpMUMPS) {
369397b6df1SKris Buschelman     /* Terminate instance, deallocate memories */
370329ec9b3SHong Zhang     if (size > 1){
37168653410SBarry Smith       ierr = PetscFree2(lu->id.sol_loc,lu->id.isol_loc);CHKERRQ(ierr);
372329ec9b3SHong Zhang       ierr = VecScatterDestroy(lu->scat_rhs);CHKERRQ(ierr);
373329ec9b3SHong Zhang       ierr = VecDestroy(lu->b_seq);CHKERRQ(ierr);
3742750af12SHong Zhang       if (lu->nSolve && lu->scat_sol){ierr = VecScatterDestroy(lu->scat_sol);CHKERRQ(ierr);}
3752750af12SHong Zhang       if (lu->nSolve && lu->x_seq){ierr = VecDestroy(lu->x_seq);CHKERRQ(ierr);}
376329ec9b3SHong Zhang       ierr = PetscFree(lu->val);CHKERRQ(ierr);
377329ec9b3SHong Zhang     }
378*16ebf90aSShri Abhyankar     if( size == 1 && A->factortype == MAT_FACTOR_CHOLESKY && lu->isAIJ) {
379450b117fSShri Abhyankar       ierr = PetscFree(lu->val);CHKERRQ(ierr);
380450b117fSShri Abhyankar     }
381397b6df1SKris Buschelman     lu->id.job=JOB_END;
382397b6df1SKris Buschelman #if defined(PETSC_USE_COMPLEX)
383397b6df1SKris Buschelman     zmumps_c(&lu->id);
384397b6df1SKris Buschelman #else
385397b6df1SKris Buschelman     dmumps_c(&lu->id);
386397b6df1SKris Buschelman #endif
387c338a77dSKris Buschelman     ierr = PetscFree(lu->irn);CHKERRQ(ierr);
388c338a77dSKris Buschelman     ierr = PetscFree(lu->jcn);CHKERRQ(ierr);
389397b6df1SKris Buschelman     ierr = MPI_Comm_free(&(lu->comm_mumps));CHKERRQ(ierr);
390397b6df1SKris Buschelman   }
39197969023SHong Zhang   /* clear composed functions */
39297969023SHong Zhang   ierr = PetscObjectComposeFunctionDynamic((PetscObject)A,"MatFactorGetSolverPackage_C","",PETSC_NULL);CHKERRQ(ierr);
39397969023SHong Zhang   ierr = PetscObjectComposeFunctionDynamic((PetscObject)A,"MatMumpsSetIcntl_C","",PETSC_NULL);CHKERRQ(ierr);
39467334b25SHong Zhang   ierr = (lu->MatDestroy)(A);CHKERRQ(ierr);
395397b6df1SKris Buschelman   PetscFunctionReturn(0);
396397b6df1SKris Buschelman }
397397b6df1SKris Buschelman 
398397b6df1SKris Buschelman #undef __FUNCT__
399f6c57405SHong Zhang #define __FUNCT__ "MatSolve_MUMPS"
400b24902e0SBarry Smith PetscErrorCode MatSolve_MUMPS(Mat A,Vec b,Vec x)
401b24902e0SBarry Smith {
402f0c56d0fSKris Buschelman   Mat_MUMPS      *lu=(Mat_MUMPS*)A->spptr;
403d54de34fSKris Buschelman   PetscScalar    *array;
404397b6df1SKris Buschelman   Vec            x_seq;
405329ec9b3SHong Zhang   IS             is_iden,is_petsc;
406dfbe8321SBarry Smith   PetscErrorCode ierr;
407329ec9b3SHong Zhang   PetscInt       i;
408397b6df1SKris Buschelman 
409397b6df1SKris Buschelman   PetscFunctionBegin;
410329ec9b3SHong Zhang   lu->id.nrhs = 1;
411329ec9b3SHong Zhang   x_seq = lu->b_seq;
412397b6df1SKris Buschelman   if (lu->size > 1){
413329ec9b3SHong Zhang     /* MUMPS only supports centralized rhs. Scatter b into a seqential rhs vector */
414f6cfb2d1SLisandro Dalcin     ierr = VecScatterBegin(lu->scat_rhs,b,x_seq,INSERT_VALUES,SCATTER_FORWARD);CHKERRQ(ierr);
415f6cfb2d1SLisandro Dalcin     ierr = VecScatterEnd(lu->scat_rhs,b,x_seq,INSERT_VALUES,SCATTER_FORWARD);CHKERRQ(ierr);
416397b6df1SKris Buschelman     if (!lu->myid) {ierr = VecGetArray(x_seq,&array);CHKERRQ(ierr);}
417397b6df1SKris Buschelman   } else {  /* size == 1 */
418397b6df1SKris Buschelman     ierr = VecCopy(b,x);CHKERRQ(ierr);
419397b6df1SKris Buschelman     ierr = VecGetArray(x,&array);CHKERRQ(ierr);
420397b6df1SKris Buschelman   }
421397b6df1SKris Buschelman   if (!lu->myid) { /* define rhs on the host */
4228278f211SHong Zhang     lu->id.nrhs = 1;
423397b6df1SKris Buschelman #if defined(PETSC_USE_COMPLEX)
424397b6df1SKris Buschelman     lu->id.rhs = (mumps_double_complex*)array;
425397b6df1SKris Buschelman #else
426397b6df1SKris Buschelman     lu->id.rhs = array;
427397b6df1SKris Buschelman #endif
428397b6df1SKris Buschelman   }
429329ec9b3SHong Zhang   if (lu->size == 1){
430329ec9b3SHong Zhang     ierr = VecRestoreArray(x,&array);CHKERRQ(ierr);
431329ec9b3SHong Zhang   } else if (!lu->myid){
432329ec9b3SHong Zhang     ierr = VecRestoreArray(x_seq,&array);CHKERRQ(ierr);
433329ec9b3SHong Zhang   }
434329ec9b3SHong Zhang 
435329ec9b3SHong Zhang   if (lu->size > 1){
436329ec9b3SHong Zhang     /* distributed solution */
437329ec9b3SHong Zhang     lu->id.ICNTL(21) = 1;
438329ec9b3SHong Zhang     if (!lu->nSolve){
439329ec9b3SHong Zhang       /* Create x_seq=sol_loc for repeated use */
440329ec9b3SHong Zhang       PetscInt    lsol_loc;
441329ec9b3SHong Zhang       PetscScalar *sol_loc;
442329ec9b3SHong Zhang       lsol_loc = lu->id.INFO(23); /* length of sol_loc */
4430e83c824SBarry Smith       ierr = PetscMalloc2(lsol_loc,PetscScalar,&sol_loc,lsol_loc,PetscInt,&lu->id.isol_loc);CHKERRQ(ierr);
444329ec9b3SHong Zhang       lu->id.lsol_loc = lsol_loc;
44544ea04b1SSatish Balay #if defined(PETSC_USE_COMPLEX)
44644ea04b1SSatish Balay       lu->id.sol_loc  = (mumps_double_complex*)sol_loc;
44744ea04b1SSatish Balay #else
44844ea04b1SSatish Balay       lu->id.sol_loc  = sol_loc;
44944ea04b1SSatish Balay #endif
450329ec9b3SHong Zhang       ierr = VecCreateSeqWithArray(PETSC_COMM_SELF,lsol_loc,sol_loc,&lu->x_seq);CHKERRQ(ierr);
451329ec9b3SHong Zhang     }
452329ec9b3SHong Zhang   }
453397b6df1SKris Buschelman 
454397b6df1SKris Buschelman   /* solve phase */
455329ec9b3SHong Zhang   /*-------------*/
456397b6df1SKris Buschelman   lu->id.job = 3;
457397b6df1SKris Buschelman #if defined(PETSC_USE_COMPLEX)
458397b6df1SKris Buschelman   zmumps_c(&lu->id);
459397b6df1SKris Buschelman #else
460397b6df1SKris Buschelman   dmumps_c(&lu->id);
461397b6df1SKris Buschelman #endif
46265e19b50SBarry 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));
463397b6df1SKris Buschelman 
464329ec9b3SHong Zhang   if (lu->size > 1) { /* convert mumps distributed solution to petsc mpi x */
465329ec9b3SHong Zhang     if (!lu->nSolve){ /* create scatter scat_sol */
466329ec9b3SHong Zhang       ierr = ISCreateStride(PETSC_COMM_SELF,lu->id.lsol_loc,0,1,&is_iden);CHKERRQ(ierr); /* from */
467329ec9b3SHong Zhang       for (i=0; i<lu->id.lsol_loc; i++){
468329ec9b3SHong Zhang         lu->id.isol_loc[i] -= 1; /* change Fortran style to C style */
469397b6df1SKris Buschelman       }
470329ec9b3SHong Zhang       ierr = ISCreateGeneral(PETSC_COMM_SELF,lu->id.lsol_loc,lu->id.isol_loc,&is_petsc);CHKERRQ(ierr);  /* to */
471329ec9b3SHong Zhang       ierr = VecScatterCreate(lu->x_seq,is_iden,x,is_petsc,&lu->scat_sol);CHKERRQ(ierr);
472329ec9b3SHong Zhang       ierr = ISDestroy(is_iden);CHKERRQ(ierr);
473329ec9b3SHong Zhang       ierr = ISDestroy(is_petsc);CHKERRQ(ierr);
474397b6df1SKris Buschelman     }
475ca9f406cSSatish Balay     ierr = VecScatterBegin(lu->scat_sol,lu->x_seq,x,INSERT_VALUES,SCATTER_FORWARD);CHKERRQ(ierr);
476ca9f406cSSatish Balay     ierr = VecScatterEnd(lu->scat_sol,lu->x_seq,x,INSERT_VALUES,SCATTER_FORWARD);CHKERRQ(ierr);
477329ec9b3SHong Zhang   }
478329ec9b3SHong Zhang   lu->nSolve++;
479397b6df1SKris Buschelman   PetscFunctionReturn(0);
480397b6df1SKris Buschelman }
481397b6df1SKris Buschelman 
482ace3df97SHong Zhang #if !defined(PETSC_USE_COMPLEX)
483a58c3f20SHong Zhang /*
484a58c3f20SHong Zhang   input:
485a58c3f20SHong Zhang    F:        numeric factor
486a58c3f20SHong Zhang   output:
487a58c3f20SHong Zhang    nneg:     total number of negative pivots
488a58c3f20SHong Zhang    nzero:    0
489a58c3f20SHong Zhang    npos:     (global dimension of F) - nneg
490a58c3f20SHong Zhang */
491a58c3f20SHong Zhang 
492a58c3f20SHong Zhang #undef __FUNCT__
493a58c3f20SHong Zhang #define __FUNCT__ "MatGetInertia_SBAIJMUMPS"
494dfbe8321SBarry Smith PetscErrorCode MatGetInertia_SBAIJMUMPS(Mat F,int *nneg,int *nzero,int *npos)
495a58c3f20SHong Zhang {
496a58c3f20SHong Zhang   Mat_MUMPS      *lu =(Mat_MUMPS*)F->spptr;
497dfbe8321SBarry Smith   PetscErrorCode ierr;
498c1490034SHong Zhang   PetscMPIInt    size;
499a58c3f20SHong Zhang 
500a58c3f20SHong Zhang   PetscFunctionBegin;
5017adad957SLisandro Dalcin   ierr = MPI_Comm_size(((PetscObject)F)->comm,&size);CHKERRQ(ierr);
502bcb30aebSHong 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 */
50365e19b50SBarry 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));
504a58c3f20SHong Zhang   if (nneg){
505a58c3f20SHong Zhang     if (!lu->myid){
506a58c3f20SHong Zhang       *nneg = lu->id.INFOG(12);
507a58c3f20SHong Zhang     }
508bcb30aebSHong Zhang     ierr = MPI_Bcast(nneg,1,MPI_INT,0,lu->comm_mumps);CHKERRQ(ierr);
509a58c3f20SHong Zhang   }
510a58c3f20SHong Zhang   if (nzero) *nzero = 0;
511d0f46423SBarry Smith   if (npos)  *npos  = F->rmap->N - (*nneg);
512a58c3f20SHong Zhang   PetscFunctionReturn(0);
513a58c3f20SHong Zhang }
514ace3df97SHong Zhang #endif /* !defined(PETSC_USE_COMPLEX) */
515a58c3f20SHong Zhang 
516397b6df1SKris Buschelman #undef __FUNCT__
517f6c57405SHong Zhang #define __FUNCT__ "MatFactorNumeric_MUMPS"
5180481f469SBarry Smith PetscErrorCode MatFactorNumeric_MUMPS(Mat F,Mat A,const MatFactorInfo *info)
519af281ebdSHong Zhang {
520dcd589f8SShri Abhyankar   Mat_MUMPS       *lu =(Mat_MUMPS*)(F)->spptr;
5216849ba73SBarry Smith   PetscErrorCode  ierr;
522*16ebf90aSShri Abhyankar   const PetscInt  M=A->rmap->N;
523dcd589f8SShri Abhyankar   PetscTruth      valOnly;
524e09efc27SHong Zhang   Mat             F_diag;
525c349612cSHong Zhang   IS              is_iden;
526c349612cSHong Zhang   Vec             b;
527*16ebf90aSShri Abhyankar   PetscTruth      isMPIAIJ;
528397b6df1SKris Buschelman 
529397b6df1SKris Buschelman   PetscFunctionBegin;
530*16ebf90aSShri Abhyankar   valOnly = PETSC_TRUE;
531*16ebf90aSShri Abhyankar   ierr = (*lu->ConvertToTriples)(A, 1, valOnly, &lu->nz, &lu->irn, &lu->jcn, &lu->val);CHKERRQ(ierr);
532397b6df1SKris Buschelman   /* analysis phase */
533329ec9b3SHong Zhang   /*----------------*/
534397b6df1SKris Buschelman   if (lu->matstruc == DIFFERENT_NONZERO_PATTERN){
535329ec9b3SHong Zhang     lu->id.job = 1;
536329ec9b3SHong Zhang 
537397b6df1SKris Buschelman     lu->id.n = M;
538397b6df1SKris Buschelman     switch (lu->id.ICNTL(18)){
539397b6df1SKris Buschelman     case 0:  /* centralized assembled matrix input */
540397b6df1SKris Buschelman       if (!lu->myid) {
541*16ebf90aSShri Abhyankar         lu->id.nz =lu->nz; lu->id.irn=lu->irn; lu->id.jcn=lu->jcn;
542397b6df1SKris Buschelman         if (lu->id.ICNTL(6)>1){
543397b6df1SKris Buschelman #if defined(PETSC_USE_COMPLEX)
544397b6df1SKris Buschelman           lu->id.a = (mumps_double_complex*)lu->val;
545397b6df1SKris Buschelman #else
546397b6df1SKris Buschelman           lu->id.a = lu->val;
547397b6df1SKris Buschelman #endif
548397b6df1SKris Buschelman         }
549397b6df1SKris Buschelman       }
550397b6df1SKris Buschelman       break;
551397b6df1SKris Buschelman     case 3:  /* distributed assembled matrix input (size>1) */
552*16ebf90aSShri Abhyankar       lu->id.nz_loc = lu->nz;
553397b6df1SKris Buschelman       lu->id.irn_loc=lu->irn; lu->id.jcn_loc=lu->jcn;
554397b6df1SKris Buschelman       if (lu->id.ICNTL(6)>1) {
555397b6df1SKris Buschelman #if defined(PETSC_USE_COMPLEX)
556397b6df1SKris Buschelman         lu->id.a_loc = (mumps_double_complex*)lu->val;
557397b6df1SKris Buschelman #else
558397b6df1SKris Buschelman         lu->id.a_loc = lu->val;
559397b6df1SKris Buschelman #endif
560397b6df1SKris Buschelman       }
561329ec9b3SHong Zhang       /* MUMPS only supports centralized rhs. Create scatter scat_rhs for repeated use in MatSolve() */
562329ec9b3SHong Zhang       if (!lu->myid){
563d0f46423SBarry Smith         ierr = VecCreateSeq(PETSC_COMM_SELF,A->cmap->N,&lu->b_seq);CHKERRQ(ierr);
564d0f46423SBarry Smith         ierr = ISCreateStride(PETSC_COMM_SELF,A->cmap->N,0,1,&is_iden);CHKERRQ(ierr);
565329ec9b3SHong Zhang       } else {
566329ec9b3SHong Zhang         ierr = VecCreateSeq(PETSC_COMM_SELF,0,&lu->b_seq);CHKERRQ(ierr);
567329ec9b3SHong Zhang         ierr = ISCreateStride(PETSC_COMM_SELF,0,0,1,&is_iden);CHKERRQ(ierr);
568329ec9b3SHong Zhang       }
5697adad957SLisandro Dalcin       ierr = VecCreate(((PetscObject)A)->comm,&b);CHKERRQ(ierr);
570d0f46423SBarry Smith       ierr = VecSetSizes(b,A->rmap->n,PETSC_DECIDE);CHKERRQ(ierr);
571329ec9b3SHong Zhang       ierr = VecSetFromOptions(b);CHKERRQ(ierr);
572329ec9b3SHong Zhang 
573329ec9b3SHong Zhang       ierr = VecScatterCreate(b,is_iden,lu->b_seq,is_iden,&lu->scat_rhs);CHKERRQ(ierr);
574329ec9b3SHong Zhang       ierr = ISDestroy(is_iden);CHKERRQ(ierr);
575329ec9b3SHong Zhang       ierr = VecDestroy(b);CHKERRQ(ierr);
576397b6df1SKris Buschelman       break;
577397b6df1SKris Buschelman     }
578397b6df1SKris Buschelman #if defined(PETSC_USE_COMPLEX)
579397b6df1SKris Buschelman     zmumps_c(&lu->id);
580397b6df1SKris Buschelman #else
581397b6df1SKris Buschelman     dmumps_c(&lu->id);
582397b6df1SKris Buschelman #endif
58365e19b50SBarry Smith     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));
584397b6df1SKris Buschelman   }
585397b6df1SKris Buschelman 
586397b6df1SKris Buschelman   /* numerical factorization phase */
587329ec9b3SHong Zhang   /*-------------------------------*/
588329ec9b3SHong Zhang   lu->id.job = 2;
589958c9bccSBarry Smith   if(!lu->id.ICNTL(18)) {
590a7aca84bSHong Zhang     if (!lu->myid) {
591397b6df1SKris Buschelman #if defined(PETSC_USE_COMPLEX)
592397b6df1SKris Buschelman       lu->id.a = (mumps_double_complex*)lu->val;
593397b6df1SKris Buschelman #else
594397b6df1SKris Buschelman       lu->id.a = lu->val;
595397b6df1SKris Buschelman #endif
596397b6df1SKris Buschelman     }
597397b6df1SKris Buschelman   } else {
598397b6df1SKris Buschelman #if defined(PETSC_USE_COMPLEX)
599397b6df1SKris Buschelman     lu->id.a_loc = (mumps_double_complex*)lu->val;
600397b6df1SKris Buschelman #else
601397b6df1SKris Buschelman     lu->id.a_loc = lu->val;
602397b6df1SKris Buschelman #endif
603397b6df1SKris Buschelman   }
604397b6df1SKris Buschelman #if defined(PETSC_USE_COMPLEX)
605397b6df1SKris Buschelman   zmumps_c(&lu->id);
606397b6df1SKris Buschelman #else
607397b6df1SKris Buschelman   dmumps_c(&lu->id);
608397b6df1SKris Buschelman #endif
609397b6df1SKris Buschelman   if (lu->id.INFOG(1) < 0) {
61065e19b50SBarry 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));
61165e19b50SBarry 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));
612397b6df1SKris Buschelman   }
61365e19b50SBarry 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));
614397b6df1SKris Buschelman 
6158ada1bb4SHong Zhang   if (lu->size > 1){
616*16ebf90aSShri Abhyankar     ierr = PetscTypeCompare((PetscObject)A,MATMPIAIJ,&isMPIAIJ);CHKERRQ(ierr);
617a214ac2aSShri Abhyankar     if(isMPIAIJ) {
618dcd589f8SShri Abhyankar       F_diag = ((Mat_MPIAIJ *)(F)->data)->A;
619e09efc27SHong Zhang     } else {
620dcd589f8SShri Abhyankar       F_diag = ((Mat_MPISBAIJ *)(F)->data)->A;
621e09efc27SHong Zhang     }
622e09efc27SHong Zhang     F_diag->assembled = PETSC_TRUE;
623329ec9b3SHong Zhang     if (lu->nSolve){
624329ec9b3SHong Zhang       ierr = VecScatterDestroy(lu->scat_sol);CHKERRQ(ierr);
6250e83c824SBarry Smith       ierr = PetscFree2(lu->id.sol_loc,lu->id.isol_loc);CHKERRQ(ierr);
626329ec9b3SHong Zhang       ierr = VecDestroy(lu->x_seq);CHKERRQ(ierr);
627329ec9b3SHong Zhang     }
6288ada1bb4SHong Zhang   }
629dcd589f8SShri Abhyankar   (F)->assembled   = PETSC_TRUE;
630397b6df1SKris Buschelman   lu->matstruc     = SAME_NONZERO_PATTERN;
631ace87b0dSHong Zhang   lu->CleanUpMUMPS = PETSC_TRUE;
632329ec9b3SHong Zhang   lu->nSolve       = 0;
633397b6df1SKris Buschelman   PetscFunctionReturn(0);
634397b6df1SKris Buschelman }
635397b6df1SKris Buschelman 
636dcd589f8SShri Abhyankar #undef __FUNCT__
637dcd589f8SShri Abhyankar #define __FUNCT__ "PetscSetMUMPSOptions"
638dcd589f8SShri Abhyankar PetscErrorCode PetscSetMUMPSOptions(Mat F, Mat A)
639dcd589f8SShri Abhyankar {
640dcd589f8SShri Abhyankar   Mat_MUMPS        *lu = (Mat_MUMPS*)F->spptr;
641dcd589f8SShri Abhyankar   PetscErrorCode   ierr;
642dcd589f8SShri Abhyankar   PetscInt         icntl;
643dcd589f8SShri Abhyankar   PetscTruth       flg;
644dcd589f8SShri Abhyankar 
645dcd589f8SShri Abhyankar   PetscFunctionBegin;
646dcd589f8SShri Abhyankar   ierr = PetscOptionsBegin(((PetscObject)A)->comm,((PetscObject)A)->prefix,"MUMPS Options","Mat");CHKERRQ(ierr);
647cb828f0fSHong Zhang   ierr = PetscOptionsTruth("-mat_mumps_view","View MUMPS parameters","None",lu->mumpsview,&lu->mumpsview,PETSC_NULL);CHKERRQ(ierr);
648dcd589f8SShri Abhyankar   if (lu->size == 1){
649dcd589f8SShri Abhyankar     lu->id.ICNTL(18) = 0;   /* centralized assembled matrix input */
650dcd589f8SShri Abhyankar   } else {
651dcd589f8SShri Abhyankar     lu->id.ICNTL(18) = 3;   /* distributed assembled matrix input */
652dcd589f8SShri Abhyankar   }
653dcd589f8SShri Abhyankar 
654dcd589f8SShri Abhyankar   icntl=-1;
655dcd589f8SShri Abhyankar   lu->id.ICNTL(4) = 0;  /* level of printing; overwrite mumps default ICNTL(4)=2 */
656dcd589f8SShri Abhyankar   ierr = PetscOptionsInt("-mat_mumps_icntl_4","ICNTL(4): level of printing (0 to 4)","None",lu->id.ICNTL(4),&icntl,&flg);CHKERRQ(ierr);
657dcd589f8SShri Abhyankar   if ((flg && icntl > 0) || PetscLogPrintInfo) {
658dcd589f8SShri Abhyankar     lu->id.ICNTL(4)=icntl; /* and use mumps default icntl(i), i=1,2,3 */
659dcd589f8SShri Abhyankar   } else { /* no output */
660dcd589f8SShri Abhyankar     lu->id.ICNTL(1) = 0;  /* error message, default= 6 */
661dcd589f8SShri Abhyankar     lu->id.ICNTL(2) = 0;  /* output stream for diagnostic printing, statistics, and warning. default=0 */
662dcd589f8SShri Abhyankar     lu->id.ICNTL(3) = 0; /* output stream for global information, default=6 */
663dcd589f8SShri Abhyankar   }
664dcd589f8SShri 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);
665dcd589f8SShri Abhyankar   icntl=-1;
666dcd589f8SShri Abhyankar   ierr = PetscOptionsInt("-mat_mumps_icntl_7","ICNTL(7): matrix ordering (0 to 7)","None",lu->id.ICNTL(7),&icntl,&flg);CHKERRQ(ierr);
667dcd589f8SShri Abhyankar   if (flg) {
668dcd589f8SShri Abhyankar     if (icntl== 1){
669e32f2f54SBarry 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");
670dcd589f8SShri Abhyankar     } else {
671dcd589f8SShri Abhyankar       lu->id.ICNTL(7) = icntl;
672dcd589f8SShri Abhyankar     }
673dcd589f8SShri Abhyankar   }
674dcd589f8SShri 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);
675dcd589f8SShri 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);
676dcd589f8SShri 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);
677dcd589f8SShri 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);
678dcd589f8SShri 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);
679dcd589f8SShri 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);
680dcd589f8SShri 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);
681dcd589f8SShri Abhyankar   ierr = PetscOptionsInt("-mat_mumps_icntl_19","ICNTL(19): Schur complement","None",lu->id.ICNTL(19),&lu->id.ICNTL(19),PETSC_NULL);CHKERRQ(ierr);
682dcd589f8SShri Abhyankar 
683dcd589f8SShri 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);
684dcd589f8SShri 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);
685dcd589f8SShri 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);
686dcd589f8SShri 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);
687dcd589f8SShri 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);
688dcd589f8SShri Abhyankar   ierr = PetscOptionsInt("-mat_mumps_icntl_27","ICNTL(27): experimental parameter","None",lu->id.ICNTL(27),&lu->id.ICNTL(27),PETSC_NULL);CHKERRQ(ierr);
689dcd589f8SShri Abhyankar 
690dcd589f8SShri 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);
691dcd589f8SShri 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);
692dcd589f8SShri 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);
693dcd589f8SShri 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);
694dcd589f8SShri 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);
695dcd589f8SShri Abhyankar   PetscOptionsEnd();
696dcd589f8SShri Abhyankar   PetscFunctionReturn(0);
697dcd589f8SShri Abhyankar }
698dcd589f8SShri Abhyankar 
699dcd589f8SShri Abhyankar #undef __FUNCT__
700dcd589f8SShri Abhyankar #define __FUNCT__ "PetscInitializeMUMPS"
701dcd589f8SShri Abhyankar PetscErrorCode PetscInitializeMUMPS(Mat F)
702dcd589f8SShri Abhyankar {
703dcd589f8SShri Abhyankar   Mat_MUMPS       *lu = (Mat_MUMPS*)F->spptr;
704dcd589f8SShri Abhyankar   PetscErrorCode  ierr;
705dcd589f8SShri Abhyankar   PetscInt        icntl;
706dcd589f8SShri Abhyankar   PetscTruth      flg;
707dcd589f8SShri Abhyankar 
708dcd589f8SShri Abhyankar   PetscFunctionBegin;
709dcd589f8SShri Abhyankar   lu->id.job = JOB_INIT;
710dcd589f8SShri Abhyankar   lu->id.par=1;  /* host participates factorizaton and solve */
711dcd589f8SShri Abhyankar   lu->id.sym=lu->sym;
712dcd589f8SShri Abhyankar   if (lu->sym == 2){
713dcd589f8SShri Abhyankar     ierr = PetscOptionsInt("-mat_mumps_sym","SYM: (1,2)","None",lu->id.sym,&icntl,&flg);CHKERRQ(ierr);
714dcd589f8SShri Abhyankar     if (flg && icntl == 1) lu->id.sym=icntl;  /* matrix is spd */
715dcd589f8SShri Abhyankar   }
716dcd589f8SShri Abhyankar #if defined(PETSC_USE_COMPLEX)
717dcd589f8SShri Abhyankar   zmumps_c(&lu->id);
718dcd589f8SShri Abhyankar #else
719dcd589f8SShri Abhyankar   dmumps_c(&lu->id);
720dcd589f8SShri Abhyankar #endif
721dcd589f8SShri Abhyankar   PetscFunctionReturn(0);
722dcd589f8SShri Abhyankar }
723dcd589f8SShri Abhyankar 
724397b6df1SKris Buschelman /* Note the Petsc r and c permutations are ignored */
725397b6df1SKris Buschelman #undef __FUNCT__
726f0c56d0fSKris Buschelman #define __FUNCT__ "MatLUFactorSymbolic_AIJMUMPS"
7270481f469SBarry Smith PetscErrorCode MatLUFactorSymbolic_AIJMUMPS(Mat F,Mat A,IS r,IS c,const MatFactorInfo *info)
728b24902e0SBarry Smith {
729719d5645SBarry Smith   Mat_MUMPS          *lu = (Mat_MUMPS*)F->spptr;
730dcd589f8SShri Abhyankar   PetscErrorCode     ierr;
731dcd589f8SShri Abhyankar   PetscTruth         valOnly;
732397b6df1SKris Buschelman 
733397b6df1SKris Buschelman   PetscFunctionBegin;
734b24902e0SBarry Smith   lu->sym                  = 0;
735b24902e0SBarry Smith   lu->matstruc             = DIFFERENT_NONZERO_PATTERN;
736dcd589f8SShri Abhyankar 
737dcd589f8SShri Abhyankar   ierr = MPI_Comm_rank(((PetscObject)A)->comm, &lu->myid);
738dcd589f8SShri Abhyankar   ierr = MPI_Comm_size(((PetscObject)A)->comm,&lu->size);CHKERRQ(ierr);
739dcd589f8SShri Abhyankar   ierr = MPI_Comm_dup(((PetscObject)A)->comm,&(lu->comm_mumps));CHKERRQ(ierr);
740dcd589f8SShri Abhyankar   lu->id.comm_fortran = MPI_Comm_c2f(lu->comm_mumps);
741dcd589f8SShri Abhyankar 
742dcd589f8SShri Abhyankar   /* Initialize a MUMPS instance */
743dcd589f8SShri Abhyankar   ierr = PetscInitializeMUMPS(F);CHKERRQ(ierr);
744dcd589f8SShri Abhyankar   /* Set MUMPS options */
745dcd589f8SShri Abhyankar   ierr = PetscSetMUMPSOptions(F,A);CHKERRQ(ierr);
746dcd589f8SShri Abhyankar 
747dcd589f8SShri Abhyankar   valOnly = PETSC_FALSE;
748*16ebf90aSShri Abhyankar   ierr = (*lu->ConvertToTriples)(A, 1, valOnly, &lu->nz, &lu->irn, &lu->jcn, &lu->val);CHKERRQ(ierr);
749dcd589f8SShri Abhyankar 
750719d5645SBarry Smith   F->ops->lufactornumeric  = MatFactorNumeric_MUMPS;
751dcd589f8SShri Abhyankar   F->ops->solve            = MatSolve_MUMPS;
752b24902e0SBarry Smith   PetscFunctionReturn(0);
753b24902e0SBarry Smith }
754b24902e0SBarry Smith 
755450b117fSShri Abhyankar /* Note the Petsc r and c permutations are ignored */
756450b117fSShri Abhyankar #undef __FUNCT__
757450b117fSShri Abhyankar #define __FUNCT__ "MatLUFactorSymbolic_BAIJMUMPS"
758450b117fSShri Abhyankar PetscErrorCode MatLUFactorSymbolic_BAIJMUMPS(Mat F,Mat A,IS r,IS c,const MatFactorInfo *info)
759450b117fSShri Abhyankar {
760dcd589f8SShri Abhyankar 
761450b117fSShri Abhyankar   Mat_MUMPS       *lu = (Mat_MUMPS*)F->spptr;
762dcd589f8SShri Abhyankar   PetscErrorCode  ierr;
763450b117fSShri Abhyankar 
764450b117fSShri Abhyankar   PetscFunctionBegin;
765450b117fSShri Abhyankar   lu->sym                  = 0;
766450b117fSShri Abhyankar   lu->matstruc             = DIFFERENT_NONZERO_PATTERN;
767dcd589f8SShri Abhyankar   ierr = MPI_Comm_rank(((PetscObject)A)->comm, &lu->myid);
768dcd589f8SShri Abhyankar   ierr = MPI_Comm_size(((PetscObject)A)->comm,&lu->size);CHKERRQ(ierr);
769dcd589f8SShri Abhyankar   ierr = MPI_Comm_dup(((PetscObject)A)->comm,&(lu->comm_mumps));CHKERRQ(ierr);
770dcd589f8SShri Abhyankar   lu->id.comm_fortran = MPI_Comm_c2f(lu->comm_mumps);
771dcd589f8SShri Abhyankar 
772dcd589f8SShri Abhyankar   /* Initialize a MUMPS instance */
773dcd589f8SShri Abhyankar   ierr = PetscInitializeMUMPS(F);CHKERRQ(ierr);
774dcd589f8SShri Abhyankar   /* Set MUMPS options */
775dcd589f8SShri Abhyankar   ierr = PetscSetMUMPSOptions(F,A);CHKERRQ(ierr);
776dcd589f8SShri Abhyankar 
777450b117fSShri Abhyankar   F->ops->lufactornumeric  = MatFactorNumeric_MUMPS;
778dcd589f8SShri Abhyankar   F->ops->solve            = MatSolve_MUMPS;
779450b117fSShri Abhyankar   PetscFunctionReturn(0);
780450b117fSShri Abhyankar }
781b24902e0SBarry Smith 
782397b6df1SKris Buschelman /* Note the Petsc r permutation is ignored */
783397b6df1SKris Buschelman #undef __FUNCT__
784f0c56d0fSKris Buschelman #define __FUNCT__ "MatCholeskyFactorSymbolic_SBAIJMUMPS"
7850481f469SBarry Smith PetscErrorCode MatCholeskyFactorSymbolic_SBAIJMUMPS(Mat F,Mat A,IS r,const MatFactorInfo *info)
786b24902e0SBarry Smith {
7872792810eSHong Zhang   Mat_MUMPS          *lu = (Mat_MUMPS*)F->spptr;
788dcd589f8SShri Abhyankar   PetscErrorCode     ierr;
789*16ebf90aSShri Abhyankar   PetscTruth         valOnly;
790397b6df1SKris Buschelman 
791397b6df1SKris Buschelman   PetscFunctionBegin;
792b24902e0SBarry Smith   lu->sym                          = 2;
793b24902e0SBarry Smith   lu->matstruc                     = DIFFERENT_NONZERO_PATTERN;
794dcd589f8SShri Abhyankar   ierr = MPI_Comm_rank(((PetscObject)A)->comm, &lu->myid);
795dcd589f8SShri Abhyankar   ierr = MPI_Comm_size(((PetscObject)A)->comm,&lu->size);CHKERRQ(ierr);
796dcd589f8SShri Abhyankar   ierr = MPI_Comm_dup(((PetscObject)A)->comm,&(lu->comm_mumps));CHKERRQ(ierr);
797dcd589f8SShri Abhyankar   lu->id.comm_fortran = MPI_Comm_c2f(lu->comm_mumps);
798dcd589f8SShri Abhyankar 
799dcd589f8SShri Abhyankar   /* Initialize a MUMPS instance */
800dcd589f8SShri Abhyankar   ierr = PetscInitializeMUMPS(F);CHKERRQ(ierr);
801dcd589f8SShri Abhyankar   /* Set MUMPS options */
802dcd589f8SShri Abhyankar   ierr = PetscSetMUMPSOptions(F,A);CHKERRQ(ierr);
803dcd589f8SShri Abhyankar 
804dcd589f8SShri Abhyankar   valOnly = PETSC_FALSE;
805*16ebf90aSShri Abhyankar   ierr = (*lu->ConvertToTriples)(A, 1 , valOnly, &lu->nz, &lu->irn, &lu->jcn, &lu->val);CHKERRQ(ierr);
806dcd589f8SShri Abhyankar 
8072792810eSHong Zhang   F->ops->choleskyfactornumeric =  MatFactorNumeric_MUMPS;
808dcd589f8SShri Abhyankar   F->ops->solve                 =  MatSolve_MUMPS;
809db4efbfdSBarry Smith #if !defined(PETSC_USE_COMPLEX)
810dcd589f8SShri Abhyankar   (F)->ops->getinertia          =  MatGetInertia_SBAIJMUMPS;
811db4efbfdSBarry Smith #endif
812b24902e0SBarry Smith   PetscFunctionReturn(0);
813b24902e0SBarry Smith }
814b24902e0SBarry Smith 
815397b6df1SKris Buschelman #undef __FUNCT__
816f6c57405SHong Zhang #define __FUNCT__ "MatFactorInfo_MUMPS"
81774ed9c26SBarry Smith PetscErrorCode MatFactorInfo_MUMPS(Mat A,PetscViewer viewer)
81874ed9c26SBarry Smith {
819f6c57405SHong Zhang   Mat_MUMPS      *lu=(Mat_MUMPS*)A->spptr;
820f6c57405SHong Zhang   PetscErrorCode ierr;
821f6c57405SHong Zhang 
822f6c57405SHong Zhang   PetscFunctionBegin;
823f6c57405SHong Zhang   ierr = PetscViewerASCIIPrintf(viewer,"  ICNTL(1) (output for error):        %d \n",lu->id.ICNTL(1));CHKERRQ(ierr);
824f6c57405SHong Zhang   ierr = PetscViewerASCIIPrintf(viewer,"  ICNTL(2) (output of diagnostic msg):%d \n",lu->id.ICNTL(2));CHKERRQ(ierr);
825f6c57405SHong Zhang   ierr = PetscViewerASCIIPrintf(viewer,"  ICNTL(3) (output for global info):  %d \n",lu->id.ICNTL(3));CHKERRQ(ierr);
826f6c57405SHong Zhang   ierr = PetscViewerASCIIPrintf(viewer,"  ICNTL(4) (level of printing):       %d \n",lu->id.ICNTL(4));CHKERRQ(ierr);
827f6c57405SHong Zhang   ierr = PetscViewerASCIIPrintf(viewer,"  ICNTL(5) (input mat struct):        %d \n",lu->id.ICNTL(5));CHKERRQ(ierr);
828f6c57405SHong Zhang   ierr = PetscViewerASCIIPrintf(viewer,"  ICNTL(6) (matrix prescaling):       %d \n",lu->id.ICNTL(6));CHKERRQ(ierr);
829f6c57405SHong Zhang   ierr = PetscViewerASCIIPrintf(viewer,"  ICNTL(7) (matrix ordering):         %d \n",lu->id.ICNTL(7));CHKERRQ(ierr);
830f6c57405SHong Zhang   ierr = PetscViewerASCIIPrintf(viewer,"  ICNTL(8) (scalling strategy):       %d \n",lu->id.ICNTL(8));CHKERRQ(ierr);
831f6c57405SHong Zhang   ierr = PetscViewerASCIIPrintf(viewer,"  ICNTL(9) (A/A^T x=b is solved):     %d \n",lu->id.ICNTL(9));CHKERRQ(ierr);
832f6c57405SHong Zhang   ierr = PetscViewerASCIIPrintf(viewer,"  ICNTL(10) (max num of refinements): %d \n",lu->id.ICNTL(10));CHKERRQ(ierr);
833f6c57405SHong Zhang   ierr = PetscViewerASCIIPrintf(viewer,"  ICNTL(11) (error analysis):         %d \n",lu->id.ICNTL(11));CHKERRQ(ierr);
834f6c57405SHong Zhang   if (!lu->myid && lu->id.ICNTL(11)>0) {
835f6c57405SHong Zhang     ierr = PetscPrintf(PETSC_COMM_SELF,"        RINFOG(4) (inf norm of input mat):        %g\n",lu->id.RINFOG(4));CHKERRQ(ierr);
836f6c57405SHong Zhang     ierr = PetscPrintf(PETSC_COMM_SELF,"        RINFOG(5) (inf norm of solution):         %g\n",lu->id.RINFOG(5));CHKERRQ(ierr);
837f6c57405SHong Zhang     ierr = PetscPrintf(PETSC_COMM_SELF,"        RINFOG(6) (inf norm of residual):         %g\n",lu->id.RINFOG(6));CHKERRQ(ierr);
838f6c57405SHong 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);
839f6c57405SHong Zhang     ierr = PetscPrintf(PETSC_COMM_SELF,"        RINFOG(9) (error estimate):               %g \n",lu->id.RINFOG(9));CHKERRQ(ierr);
840f6c57405SHong 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);
841f6c57405SHong Zhang 
842f6c57405SHong Zhang   }
843f6c57405SHong Zhang   ierr = PetscViewerASCIIPrintf(viewer,"  ICNTL(12) (efficiency control):                         %d \n",lu->id.ICNTL(12));CHKERRQ(ierr);
844f6c57405SHong Zhang   ierr = PetscViewerASCIIPrintf(viewer,"  ICNTL(13) (efficiency control):                         %d \n",lu->id.ICNTL(13));CHKERRQ(ierr);
845f6c57405SHong Zhang   ierr = PetscViewerASCIIPrintf(viewer,"  ICNTL(14) (percentage of estimated workspace increase): %d \n",lu->id.ICNTL(14));CHKERRQ(ierr);
846f6c57405SHong Zhang   /* ICNTL(15-17) not used */
847f6c57405SHong Zhang   ierr = PetscViewerASCIIPrintf(viewer,"  ICNTL(18) (input mat struct):                           %d \n",lu->id.ICNTL(18));CHKERRQ(ierr);
848f6c57405SHong Zhang   ierr = PetscViewerASCIIPrintf(viewer,"  ICNTL(19) (Shur complement info):                       %d \n",lu->id.ICNTL(19));CHKERRQ(ierr);
849f6c57405SHong Zhang   ierr = PetscViewerASCIIPrintf(viewer,"  ICNTL(20) (rhs sparse pattern):                         %d \n",lu->id.ICNTL(20));CHKERRQ(ierr);
850f6c57405SHong Zhang   ierr = PetscViewerASCIIPrintf(viewer,"  ICNTL(21) (solution struct):                            %d \n",lu->id.ICNTL(21));CHKERRQ(ierr);
851c0165424SHong Zhang   ierr = PetscViewerASCIIPrintf(viewer,"  ICNTL(22) (in-core/out-of-core facility):               %d \n",lu->id.ICNTL(22));CHKERRQ(ierr);
852c0165424SHong Zhang   ierr = PetscViewerASCIIPrintf(viewer,"  ICNTL(23) (max size of memory can be allocated locally):%d \n",lu->id.ICNTL(23));CHKERRQ(ierr);
853c0165424SHong Zhang 
854c0165424SHong Zhang   ierr = PetscViewerASCIIPrintf(viewer,"  ICNTL(24) (detection of null pivot rows):               %d \n",lu->id.ICNTL(24));CHKERRQ(ierr);
855c0165424SHong Zhang   ierr = PetscViewerASCIIPrintf(viewer,"  ICNTL(25) (computation of a null space basis):          %d \n",lu->id.ICNTL(25));CHKERRQ(ierr);
856c0165424SHong Zhang   ierr = PetscViewerASCIIPrintf(viewer,"  ICNTL(26) (Schur options for rhs or solution):          %d \n",lu->id.ICNTL(26));CHKERRQ(ierr);
857c0165424SHong Zhang   ierr = PetscViewerASCIIPrintf(viewer,"  ICNTL(27) (experimental parameter):                     %d \n",lu->id.ICNTL(27));CHKERRQ(ierr);
858f6c57405SHong Zhang 
859f6c57405SHong Zhang   ierr = PetscViewerASCIIPrintf(viewer,"  CNTL(1) (relative pivoting threshold):      %g \n",lu->id.CNTL(1));CHKERRQ(ierr);
860f6c57405SHong Zhang   ierr = PetscViewerASCIIPrintf(viewer,"  CNTL(2) (stopping criterion of refinement): %g \n",lu->id.CNTL(2));CHKERRQ(ierr);
861f6c57405SHong Zhang   ierr = PetscViewerASCIIPrintf(viewer,"  CNTL(3) (absolute pivoting threshold):      %g \n",lu->id.CNTL(3));CHKERRQ(ierr);
862f6c57405SHong Zhang   ierr = PetscViewerASCIIPrintf(viewer,"  CNTL(4) (value of static pivoting):         %g \n",lu->id.CNTL(4));CHKERRQ(ierr);
863c0165424SHong Zhang   ierr = PetscViewerASCIIPrintf(viewer,"  CNTL(5) (fixation for null pivots):         %g \n",lu->id.CNTL(5));CHKERRQ(ierr);
864f6c57405SHong Zhang 
865f6c57405SHong Zhang   /* infomation local to each processor */
866f6c57405SHong Zhang   if (!lu->myid) {ierr = PetscPrintf(PETSC_COMM_SELF, "              RINFO(1) (local estimated flops for the elimination after analysis): \n");CHKERRQ(ierr);}
8677adad957SLisandro Dalcin   ierr = PetscSynchronizedPrintf(((PetscObject)A)->comm,"              [%d] %g \n",lu->myid,lu->id.RINFO(1));CHKERRQ(ierr);
8687adad957SLisandro Dalcin   ierr = PetscSynchronizedFlush(((PetscObject)A)->comm);
869f6c57405SHong Zhang   if (!lu->myid) {ierr = PetscPrintf(PETSC_COMM_SELF, "              RINFO(2) (local estimated flops for the assembly after factorization): \n");CHKERRQ(ierr);}
8707adad957SLisandro Dalcin   ierr = PetscSynchronizedPrintf(((PetscObject)A)->comm,"              [%d]  %g \n",lu->myid,lu->id.RINFO(2));CHKERRQ(ierr);
8717adad957SLisandro Dalcin   ierr = PetscSynchronizedFlush(((PetscObject)A)->comm);
872f6c57405SHong Zhang   if (!lu->myid) {ierr = PetscPrintf(PETSC_COMM_SELF, "              RINFO(3) (local estimated flops for the elimination after factorization): \n");CHKERRQ(ierr);}
8737adad957SLisandro Dalcin   ierr = PetscSynchronizedPrintf(((PetscObject)A)->comm,"              [%d]  %g \n",lu->myid,lu->id.RINFO(3));CHKERRQ(ierr);
8747adad957SLisandro Dalcin   ierr = PetscSynchronizedFlush(((PetscObject)A)->comm);
875f6c57405SHong Zhang 
876f6c57405SHong 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);}
8777adad957SLisandro Dalcin   ierr = PetscSynchronizedPrintf(((PetscObject)A)->comm,"              [%d] %d \n",lu->myid,lu->id.INFO(15));CHKERRQ(ierr);
8787adad957SLisandro Dalcin   ierr = PetscSynchronizedFlush(((PetscObject)A)->comm);
879f6c57405SHong Zhang 
880f6c57405SHong 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);}
8817adad957SLisandro Dalcin   ierr = PetscSynchronizedPrintf(((PetscObject)A)->comm,"              [%d] %d \n",lu->myid,lu->id.INFO(16));CHKERRQ(ierr);
8827adad957SLisandro Dalcin   ierr = PetscSynchronizedFlush(((PetscObject)A)->comm);
883f6c57405SHong Zhang 
884f6c57405SHong Zhang   if (!lu->myid) {ierr = PetscPrintf(PETSC_COMM_SELF, "              INFO(23) (num of pivots eliminated on this processor after factorization): \n");CHKERRQ(ierr);}
8857adad957SLisandro Dalcin   ierr = PetscSynchronizedPrintf(((PetscObject)A)->comm,"              [%d] %d \n",lu->myid,lu->id.INFO(23));CHKERRQ(ierr);
8867adad957SLisandro Dalcin   ierr = PetscSynchronizedFlush(((PetscObject)A)->comm);
887f6c57405SHong Zhang 
888f6c57405SHong Zhang   if (!lu->myid){ /* information from the host */
889f6c57405SHong Zhang     ierr = PetscViewerASCIIPrintf(viewer,"  RINFOG(1) (global estimated flops for the elimination after analysis): %g \n",lu->id.RINFOG(1));CHKERRQ(ierr);
890f6c57405SHong Zhang     ierr = PetscViewerASCIIPrintf(viewer,"  RINFOG(2) (global estimated flops for the assembly after factorization): %g \n",lu->id.RINFOG(2));CHKERRQ(ierr);
891f6c57405SHong Zhang     ierr = PetscViewerASCIIPrintf(viewer,"  RINFOG(3) (global estimated flops for the elimination after factorization): %g \n",lu->id.RINFOG(3));CHKERRQ(ierr);
892f6c57405SHong Zhang 
893f6c57405SHong Zhang     ierr = PetscViewerASCIIPrintf(viewer,"  INFOG(3) (estimated real workspace for factors on all processors after analysis): %d \n",lu->id.INFOG(3));CHKERRQ(ierr);
894f6c57405SHong Zhang     ierr = PetscViewerASCIIPrintf(viewer,"  INFOG(4) (estimated integer workspace for factors on all processors after analysis): %d \n",lu->id.INFOG(4));CHKERRQ(ierr);
895f6c57405SHong Zhang     ierr = PetscViewerASCIIPrintf(viewer,"  INFOG(5) (estimated maximum front size in the complete tree): %d \n",lu->id.INFOG(5));CHKERRQ(ierr);
896f6c57405SHong Zhang     ierr = PetscViewerASCIIPrintf(viewer,"  INFOG(6) (number of nodes in the complete tree): %d \n",lu->id.INFOG(6));CHKERRQ(ierr);
897f6c57405SHong Zhang     ierr = PetscViewerASCIIPrintf(viewer,"  INFOG(7) (ordering option effectively uese after analysis): %d \n",lu->id.INFOG(7));CHKERRQ(ierr);
898f6c57405SHong Zhang     ierr = PetscViewerASCIIPrintf(viewer,"  INFOG(8) (structural symmetry in percent of the permuted matrix after analysis): %d \n",lu->id.INFOG(8));CHKERRQ(ierr);
899f6c57405SHong 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);
900f6c57405SHong Zhang     ierr = PetscViewerASCIIPrintf(viewer,"  INFOG(10) (total integer space store the matrix factors after factorization): %d \n",lu->id.INFOG(10));CHKERRQ(ierr);
901f6c57405SHong Zhang     ierr = PetscViewerASCIIPrintf(viewer,"  INFOG(11) (order of largest frontal matrix after factorization): %d \n",lu->id.INFOG(11));CHKERRQ(ierr);
902f6c57405SHong Zhang     ierr = PetscViewerASCIIPrintf(viewer,"  INFOG(12) (number of off-diagonal pivots): %d \n",lu->id.INFOG(12));CHKERRQ(ierr);
903f6c57405SHong Zhang     ierr = PetscViewerASCIIPrintf(viewer,"  INFOG(13) (number of delayed pivots after factorization): %d \n",lu->id.INFOG(13));CHKERRQ(ierr);
904f6c57405SHong Zhang     ierr = PetscViewerASCIIPrintf(viewer,"  INFOG(14) (number of memory compress after factorization): %d \n",lu->id.INFOG(14));CHKERRQ(ierr);
905f6c57405SHong Zhang     ierr = PetscViewerASCIIPrintf(viewer,"  INFOG(15) (number of steps of iterative refinement after solution): %d \n",lu->id.INFOG(15));CHKERRQ(ierr);
906f6c57405SHong 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);
907f6c57405SHong 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);
908f6c57405SHong 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);
909f6c57405SHong 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);
910f6c57405SHong Zhang      ierr = PetscViewerASCIIPrintf(viewer,"  INFOG(20) (estimated number of entries in the factors): %d \n",lu->id.INFOG(20));CHKERRQ(ierr);
911f6c57405SHong 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);
912f6c57405SHong 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);
913f6c57405SHong Zhang      ierr = PetscViewerASCIIPrintf(viewer,"  INFOG(23) (after analysis: value of ICNTL(6) effectively used): %d \n",lu->id.INFOG(23));CHKERRQ(ierr);
914f6c57405SHong Zhang      ierr = PetscViewerASCIIPrintf(viewer,"  INFOG(24) (after analysis: value of ICNTL(12) effectively used): %d \n",lu->id.INFOG(24));CHKERRQ(ierr);
915f6c57405SHong Zhang      ierr = PetscViewerASCIIPrintf(viewer,"  INFOG(25) (after factorization: number of pivots modified by static pivoting): %d \n",lu->id.INFOG(25));CHKERRQ(ierr);
916f6c57405SHong Zhang   }
917f6c57405SHong Zhang   PetscFunctionReturn(0);
918f6c57405SHong Zhang }
919f6c57405SHong Zhang 
920f6c57405SHong Zhang #undef __FUNCT__
921f6c57405SHong Zhang #define __FUNCT__ "MatView_MUMPS"
922b24902e0SBarry Smith PetscErrorCode MatView_MUMPS(Mat A,PetscViewer viewer)
923b24902e0SBarry Smith {
924f6c57405SHong Zhang   PetscErrorCode    ierr;
925f6c57405SHong Zhang   PetscTruth        iascii;
926f6c57405SHong Zhang   PetscViewerFormat format;
927cb828f0fSHong Zhang   Mat_MUMPS         *mumps=(Mat_MUMPS*)A->spptr;
928f6c57405SHong Zhang 
929f6c57405SHong Zhang   PetscFunctionBegin;
930cb828f0fSHong Zhang   /* check if matrix is mumps type */
931cb828f0fSHong Zhang   if (A->ops->solve != MatSolve_MUMPS) PetscFunctionReturn(0);
932cb828f0fSHong Zhang 
933f6c57405SHong Zhang   ierr = PetscTypeCompare((PetscObject)viewer,PETSC_VIEWER_ASCII,&iascii);CHKERRQ(ierr);
934f6c57405SHong Zhang   if (iascii) {
935f6c57405SHong Zhang     ierr = PetscViewerGetFormat(viewer,&format);CHKERRQ(ierr);
936cb828f0fSHong Zhang     if (format == PETSC_VIEWER_ASCII_INFO || mumps->mumpsview){
937cb828f0fSHong Zhang       ierr = PetscViewerASCIIPrintf(viewer,"MUMPS run parameters:\n");CHKERRQ(ierr);
938cb828f0fSHong Zhang       ierr = PetscViewerASCIIPrintf(viewer,"  SYM (matrix type):                  %d \n",mumps->id.sym);CHKERRQ(ierr);
939cb828f0fSHong Zhang       ierr = PetscViewerASCIIPrintf(viewer,"  PAR (host participation):           %d \n",mumps->id.par);CHKERRQ(ierr);
940cb828f0fSHong Zhang       if (mumps->mumpsview){ /* View all MUMPS parameters */
941f6c57405SHong Zhang         ierr = MatFactorInfo_MUMPS(A,viewer);CHKERRQ(ierr);
942f6c57405SHong Zhang       }
943f6c57405SHong Zhang     }
944cb828f0fSHong Zhang   }
945f6c57405SHong Zhang   PetscFunctionReturn(0);
946f6c57405SHong Zhang }
947f6c57405SHong Zhang 
94835bd34faSBarry Smith #undef __FUNCT__
94935bd34faSBarry Smith #define __FUNCT__ "MatGetInfo_MUMPS"
95035bd34faSBarry Smith PetscErrorCode MatGetInfo_MUMPS(Mat A,MatInfoType flag,MatInfo *info)
95135bd34faSBarry Smith {
952cb828f0fSHong Zhang   Mat_MUMPS  *mumps =(Mat_MUMPS*)A->spptr;
95335bd34faSBarry Smith 
95435bd34faSBarry Smith   PetscFunctionBegin;
95535bd34faSBarry Smith   info->block_size        = 1.0;
956cb828f0fSHong Zhang   info->nz_allocated      = mumps->id.INFOG(20);
957cb828f0fSHong Zhang   info->nz_used           = mumps->id.INFOG(20);
95835bd34faSBarry Smith   info->nz_unneeded       = 0.0;
95935bd34faSBarry Smith   info->assemblies        = 0.0;
96035bd34faSBarry Smith   info->mallocs           = 0.0;
96135bd34faSBarry Smith   info->memory            = 0.0;
96235bd34faSBarry Smith   info->fill_ratio_given  = 0;
96335bd34faSBarry Smith   info->fill_ratio_needed = 0;
96435bd34faSBarry Smith   info->factor_mallocs    = 0;
96535bd34faSBarry Smith   PetscFunctionReturn(0);
96635bd34faSBarry Smith }
96735bd34faSBarry Smith 
96824b6179bSKris Buschelman /*MC
96941c8de11SBarry Smith   MAT_SOLVER_MUMPS -  A matrix type providing direct solvers (LU and Cholesky) for
97024b6179bSKris Buschelman   distributed and sequential matrices via the external package MUMPS.
97124b6179bSKris Buschelman 
97241c8de11SBarry Smith   Works with MATAIJ and MATSBAIJ matrices
97324b6179bSKris Buschelman 
97424b6179bSKris Buschelman   Options Database Keys:
97541c8de11SBarry Smith + -mat_mumps_sym <0,1,2> - 0 the matrix is unsymmetric, 1 symmetric positive definite, 2 symmetric
97624b6179bSKris Buschelman . -mat_mumps_icntl_4 <0,...,4> - print level
97724b6179bSKris Buschelman . -mat_mumps_icntl_6 <0,...,7> - matrix prescaling options (see MUMPS User's Guide)
97824b6179bSKris Buschelman . -mat_mumps_icntl_7 <0,...,7> - matrix orderings (see MUMPS User's Guide)
97924b6179bSKris Buschelman . -mat_mumps_icntl_9 <1,2> - A or A^T x=b to be solved: 1 denotes A, 2 denotes A^T
98024b6179bSKris Buschelman . -mat_mumps_icntl_10 <n> - maximum number of iterative refinements
98194b7f48cSBarry Smith . -mat_mumps_icntl_11 <n> - error analysis, a positive value returns statistics during -ksp_view
98224b6179bSKris Buschelman . -mat_mumps_icntl_12 <n> - efficiency control (see MUMPS User's Guide)
98324b6179bSKris Buschelman . -mat_mumps_icntl_13 <n> - efficiency control (see MUMPS User's Guide)
98424b6179bSKris Buschelman . -mat_mumps_icntl_14 <n> - efficiency control (see MUMPS User's Guide)
98524b6179bSKris Buschelman . -mat_mumps_icntl_15 <n> - efficiency control (see MUMPS User's Guide)
98624b6179bSKris Buschelman . -mat_mumps_cntl_1 <delta> - relative pivoting threshold
98724b6179bSKris Buschelman . -mat_mumps_cntl_2 <tol> - stopping criterion for refinement
98824b6179bSKris Buschelman - -mat_mumps_cntl_3 <adelta> - absolute pivoting threshold
98924b6179bSKris Buschelman 
99024b6179bSKris Buschelman   Level: beginner
99124b6179bSKris Buschelman 
99241c8de11SBarry Smith .seealso: PCFactorSetMatSolverPackage(), MatSolverPackage
99341c8de11SBarry Smith 
99424b6179bSKris Buschelman M*/
99524b6179bSKris Buschelman 
9962877fffaSHong Zhang EXTERN_C_BEGIN
99735bd34faSBarry Smith #undef __FUNCT__
99835bd34faSBarry Smith #define __FUNCT__ "MatFactorGetSolverPackage_mumps"
99935bd34faSBarry Smith PetscErrorCode MatFactorGetSolverPackage_mumps(Mat A,const MatSolverPackage *type)
100035bd34faSBarry Smith {
100135bd34faSBarry Smith   PetscFunctionBegin;
100235bd34faSBarry Smith   *type = MAT_SOLVER_MUMPS;
100335bd34faSBarry Smith   PetscFunctionReturn(0);
100435bd34faSBarry Smith }
100535bd34faSBarry Smith EXTERN_C_END
100635bd34faSBarry Smith 
100735bd34faSBarry Smith EXTERN_C_BEGIN
10082877fffaSHong Zhang /*
10092877fffaSHong Zhang     The seq and mpi versions of this function are the same
10102877fffaSHong Zhang */
10112877fffaSHong Zhang #undef __FUNCT__
10122877fffaSHong Zhang #define __FUNCT__ "MatGetFactor_seqaij_mumps"
10132877fffaSHong Zhang PetscErrorCode MatGetFactor_seqaij_mumps(Mat A,MatFactorType ftype,Mat *F)
10142877fffaSHong Zhang {
10152877fffaSHong Zhang   Mat            B;
10162877fffaSHong Zhang   PetscErrorCode ierr;
10172877fffaSHong Zhang   Mat_MUMPS      *mumps;
10182877fffaSHong Zhang 
10192877fffaSHong Zhang   PetscFunctionBegin;
10202877fffaSHong Zhang   /* Create the factorization matrix */
10212877fffaSHong Zhang   ierr = MatCreate(((PetscObject)A)->comm,&B);CHKERRQ(ierr);
10222877fffaSHong Zhang   ierr = MatSetSizes(B,A->rmap->n,A->cmap->n,A->rmap->N,A->cmap->N);CHKERRQ(ierr);
10232877fffaSHong Zhang   ierr = MatSetType(B,((PetscObject)A)->type_name);CHKERRQ(ierr);
10242877fffaSHong Zhang   ierr = MatSeqAIJSetPreallocation(B,0,PETSC_NULL);CHKERRQ(ierr);
10252877fffaSHong Zhang 
1026*16ebf90aSShri Abhyankar   ierr = PetscNewLog(B,Mat_MUMPS,&mumps);CHKERRQ(ierr);
10272877fffaSHong Zhang   B->ops->view             = MatView_MUMPS;
102835bd34faSBarry Smith   B->ops->getinfo          = MatGetInfo_MUMPS;
102935bd34faSBarry Smith   ierr = PetscObjectComposeFunctionDynamic((PetscObject)B,"MatFactorGetSolverPackage_C","MatFactorGetSolverPackage_mumps",MatFactorGetSolverPackage_mumps);CHKERRQ(ierr);
103097969023SHong Zhang   ierr = PetscObjectComposeFunctionDynamic((PetscObject)B,"MatMumpsSetIcntl_C","MatMumpsSetIcntl",MatMumpsSetIcntl);CHKERRQ(ierr);
1031450b117fSShri Abhyankar   if (ftype == MAT_FACTOR_LU) {
1032450b117fSShri Abhyankar     B->ops->lufactorsymbolic = MatLUFactorSymbolic_AIJMUMPS;
1033d5f3da31SBarry Smith     B->factortype = MAT_FACTOR_LU;
1034*16ebf90aSShri Abhyankar     mumps->ConvertToTriples = MatConvertToTriples_seqaij_seqaij;
1035dcd589f8SShri Abhyankar   } else {
1036450b117fSShri Abhyankar     B->ops->choleskyfactorsymbolic = MatCholeskyFactorSymbolic_SBAIJMUMPS;
1037450b117fSShri Abhyankar     B->factortype = MAT_FACTOR_CHOLESKY;
1038*16ebf90aSShri Abhyankar     mumps->ConvertToTriples = MatConvertToTriples_seqaij_seqsbaij;
1039450b117fSShri Abhyankar   }
10402877fffaSHong Zhang 
10412877fffaSHong Zhang   mumps->CleanUpMUMPS              = PETSC_FALSE;
10422877fffaSHong Zhang   mumps->isAIJ                     = PETSC_TRUE;
10432877fffaSHong Zhang   mumps->scat_rhs                  = PETSC_NULL;
10442877fffaSHong Zhang   mumps->scat_sol                  = PETSC_NULL;
10452877fffaSHong Zhang   mumps->nSolve                    = 0;
10462877fffaSHong Zhang   mumps->MatDestroy                = B->ops->destroy;
10472877fffaSHong Zhang   B->ops->destroy                  = MatDestroy_MUMPS;
10482877fffaSHong Zhang   B->spptr                         = (void*)mumps;
10492877fffaSHong Zhang 
10502877fffaSHong Zhang   *F = B;
10512877fffaSHong Zhang   PetscFunctionReturn(0);
10522877fffaSHong Zhang }
10532877fffaSHong Zhang EXTERN_C_END
10542877fffaSHong Zhang 
10552877fffaSHong Zhang EXTERN_C_BEGIN
10562877fffaSHong Zhang #undef __FUNCT__
10572877fffaSHong Zhang #define __FUNCT__ "MatGetFactor_seqsbaij_mumps"
10582877fffaSHong Zhang PetscErrorCode MatGetFactor_seqsbaij_mumps(Mat A,MatFactorType ftype,Mat *F)
10592877fffaSHong Zhang {
10602877fffaSHong Zhang   Mat            B;
10612877fffaSHong Zhang   PetscErrorCode ierr;
10622877fffaSHong Zhang   Mat_MUMPS      *mumps;
10632877fffaSHong Zhang 
10642877fffaSHong Zhang   PetscFunctionBegin;
1065e7e72b3dSBarry Smith   if (ftype != MAT_FACTOR_CHOLESKY) SETERRQ(((PetscObject)A)->comm,PETSC_ERR_SUP,"Cannot use PETSc SBAIJ matrices with MUMPS LU, use AIJ matrix");
10662877fffaSHong Zhang   /* Create the factorization matrix */
10672877fffaSHong Zhang   ierr = MatCreate(((PetscObject)A)->comm,&B);CHKERRQ(ierr);
10682877fffaSHong Zhang   ierr = MatSetSizes(B,A->rmap->n,A->cmap->n,A->rmap->N,A->cmap->N);CHKERRQ(ierr);
10692877fffaSHong Zhang   ierr = MatSetType(B,((PetscObject)A)->type_name);CHKERRQ(ierr);
10702877fffaSHong Zhang   ierr = MatSeqSBAIJSetPreallocation(B,1,0,PETSC_NULL);CHKERRQ(ierr);
10712877fffaSHong Zhang   ierr = MatMPISBAIJSetPreallocation(B,1,0,PETSC_NULL,0,PETSC_NULL);CHKERRQ(ierr);
10722877fffaSHong Zhang 
1073*16ebf90aSShri Abhyankar   ierr = PetscNewLog(B,Mat_MUMPS,&mumps);CHKERRQ(ierr);
10742877fffaSHong Zhang   B->ops->choleskyfactorsymbolic = MatCholeskyFactorSymbolic_SBAIJMUMPS;
10752877fffaSHong Zhang   B->ops->view                   = MatView_MUMPS;
107635bd34faSBarry Smith   ierr = PetscObjectComposeFunctionDynamic((PetscObject)B,"MatFactorGetSolverPackage_C","MatFactorGetSolverPackage_mumps",MatFactorGetSolverPackage_mumps);CHKERRQ(ierr);
107797969023SHong Zhang   ierr = PetscObjectComposeFunctionDynamic((PetscObject)B,"MatMumpsSetIcntl_C","MatMumpsSetIcntl",MatMumpsSetIcntl);CHKERRQ(ierr);
1078d5f3da31SBarry Smith   B->factortype                   = MAT_FACTOR_CHOLESKY;
10792877fffaSHong Zhang 
1080*16ebf90aSShri Abhyankar   mumps->ConvertToTriples          = MatConvertToTriples_seqsbaij_seqsbaij;
10812877fffaSHong Zhang   mumps->CleanUpMUMPS              = PETSC_FALSE;
1082450b117fSShri Abhyankar   mumps->isAIJ                     = PETSC_FALSE;
10832877fffaSHong Zhang   mumps->scat_rhs                  = PETSC_NULL;
10842877fffaSHong Zhang   mumps->scat_sol                  = PETSC_NULL;
10852877fffaSHong Zhang   mumps->nSolve                    = 0;
10862877fffaSHong Zhang   mumps->MatDestroy                = B->ops->destroy;
10872877fffaSHong Zhang   B->ops->destroy                  = MatDestroy_MUMPS;
10882877fffaSHong Zhang   B->spptr                         = (void*)mumps;
1089f3c0ef26SHong Zhang 
10902877fffaSHong Zhang   *F = B;
10912877fffaSHong Zhang   PetscFunctionReturn(0);
10922877fffaSHong Zhang }
10932877fffaSHong Zhang EXTERN_C_END
10942877fffaSHong Zhang 
10952877fffaSHong Zhang EXTERN_C_BEGIN
10962877fffaSHong Zhang #undef __FUNCT__
10972877fffaSHong Zhang #define __FUNCT__ "MatGetFactor_mpisbaij_mumps"
10982877fffaSHong Zhang PetscErrorCode MatGetFactor_mpisbaij_mumps(Mat A,MatFactorType ftype,Mat *F)
10992877fffaSHong Zhang {
11002877fffaSHong Zhang   Mat            B;
11012877fffaSHong Zhang   PetscErrorCode ierr;
11022877fffaSHong Zhang   Mat_MUMPS      *mumps;
11032877fffaSHong Zhang 
11042877fffaSHong Zhang   PetscFunctionBegin;
1105e7e72b3dSBarry Smith   if (ftype != MAT_FACTOR_CHOLESKY) SETERRQ(((PetscObject)A)->comm,PETSC_ERR_SUP,"Cannot use PETSc SBAIJ matrices with MUMPS LU, use AIJ matrix");
11062877fffaSHong Zhang   /* Create the factorization matrix */
11072877fffaSHong Zhang   ierr = MatCreate(((PetscObject)A)->comm,&B);CHKERRQ(ierr);
11082877fffaSHong Zhang   ierr = MatSetSizes(B,A->rmap->n,A->cmap->n,A->rmap->N,A->cmap->N);CHKERRQ(ierr);
11092877fffaSHong Zhang   ierr = MatSetType(B,((PetscObject)A)->type_name);CHKERRQ(ierr);
11102877fffaSHong Zhang   ierr = MatSeqSBAIJSetPreallocation(B,1,0,PETSC_NULL);CHKERRQ(ierr);
11112877fffaSHong Zhang   ierr = MatMPISBAIJSetPreallocation(B,1,0,PETSC_NULL,0,PETSC_NULL);CHKERRQ(ierr);
11122877fffaSHong Zhang 
11132877fffaSHong Zhang   B->ops->choleskyfactorsymbolic = MatCholeskyFactorSymbolic_SBAIJMUMPS;
11142877fffaSHong Zhang   B->ops->view                   = MatView_MUMPS;
111535bd34faSBarry Smith   ierr = PetscObjectComposeFunctionDynamic((PetscObject)B,"MatFactorGetSolverPackage_C","MatFactorGetSolverPackage_mumps",MatFactorGetSolverPackage_mumps);CHKERRQ(ierr);
111697969023SHong Zhang   ierr = PetscObjectComposeFunctionDynamic((PetscObject)B,"MatMumpsSetIcntl_C","MatMumpsSetIcntl",MatMumpsSetIcntl);CHKERRQ(ierr);
1117d5f3da31SBarry Smith   B->factortype                  = MAT_FACTOR_CHOLESKY;
11182877fffaSHong Zhang 
11192877fffaSHong Zhang   ierr = PetscNewLog(B,Mat_MUMPS,&mumps);CHKERRQ(ierr);
1120*16ebf90aSShri Abhyankar   mumps->ConvertToTriples          = MatConvertToTriples_mpisbaij_mpisbaij;
11212877fffaSHong Zhang   mumps->CleanUpMUMPS              = PETSC_FALSE;
1122a214ac2aSShri Abhyankar   mumps->isAIJ                     = PETSC_FALSE;
1123a214ac2aSShri Abhyankar   mumps->scat_rhs                  = PETSC_NULL;
1124a214ac2aSShri Abhyankar   mumps->scat_sol                  = PETSC_NULL;
1125a214ac2aSShri Abhyankar   mumps->nSolve                    = 0;
1126a214ac2aSShri Abhyankar   mumps->MatDestroy                = B->ops->destroy;
1127a214ac2aSShri Abhyankar   B->ops->destroy                  = MatDestroy_MUMPS;
1128a214ac2aSShri Abhyankar   B->spptr                         = (void*)mumps;
1129a214ac2aSShri Abhyankar 
1130a214ac2aSShri Abhyankar   *F = B;
1131a214ac2aSShri Abhyankar   PetscFunctionReturn(0);
1132a214ac2aSShri Abhyankar }
1133a214ac2aSShri Abhyankar EXTERN_C_END
1134a214ac2aSShri Abhyankar 
1135a214ac2aSShri Abhyankar EXTERN_C_BEGIN
1136a214ac2aSShri Abhyankar #undef __FUNCT__
1137a214ac2aSShri Abhyankar #define __FUNCT__ "MatGetFactor_mpiaij_mumps"
1138a214ac2aSShri Abhyankar PetscErrorCode MatGetFactor_mpiaij_mumps(Mat A,MatFactorType ftype,Mat *F)
1139a214ac2aSShri Abhyankar {
1140a214ac2aSShri Abhyankar   Mat            B;
1141a214ac2aSShri Abhyankar   PetscErrorCode ierr;
1142a214ac2aSShri Abhyankar   Mat_MUMPS      *mumps;
1143a214ac2aSShri Abhyankar 
1144a214ac2aSShri Abhyankar   PetscFunctionBegin;
1145a214ac2aSShri Abhyankar   /* Create the factorization matrix */
1146a214ac2aSShri Abhyankar   ierr = MatCreate(((PetscObject)A)->comm,&B);CHKERRQ(ierr);
1147a214ac2aSShri Abhyankar   ierr = MatSetSizes(B,A->rmap->n,A->cmap->n,A->rmap->N,A->cmap->N);CHKERRQ(ierr);
1148a214ac2aSShri Abhyankar   ierr = MatSetType(B,((PetscObject)A)->type_name);CHKERRQ(ierr);
1149a214ac2aSShri Abhyankar   ierr = MatSeqAIJSetPreallocation(B,0,PETSC_NULL);CHKERRQ(ierr);
1150a214ac2aSShri Abhyankar   ierr = MatMPIAIJSetPreallocation(B,0,PETSC_NULL,0,PETSC_NULL);CHKERRQ(ierr);
1151a214ac2aSShri Abhyankar 
1152*16ebf90aSShri Abhyankar   ierr = PetscNewLog(B,Mat_MUMPS,&mumps);CHKERRQ(ierr);
1153*16ebf90aSShri Abhyankar 
1154a214ac2aSShri Abhyankar   if (ftype == MAT_FACTOR_LU) {
1155a214ac2aSShri Abhyankar     B->ops->lufactorsymbolic = MatLUFactorSymbolic_AIJMUMPS;
1156f4762488SHong Zhang     B->factortype = MAT_FACTOR_LU;
1157*16ebf90aSShri Abhyankar     mumps->ConvertToTriples = MatConvertToTriples_mpiaij_mpiaij;
1158dcd589f8SShri Abhyankar   } else {
1159a214ac2aSShri Abhyankar     B->ops->choleskyfactorsymbolic = MatCholeskyFactorSymbolic_SBAIJMUMPS;
1160f4762488SHong Zhang     B->factortype = MAT_FACTOR_CHOLESKY;
1161*16ebf90aSShri Abhyankar     mumps->ConvertToTriples = MatConvertToTriples_mpiaij_mpisbaij;
1162450b117fSShri Abhyankar   }
1163a214ac2aSShri Abhyankar 
1164a214ac2aSShri Abhyankar   B->ops->view             = MatView_MUMPS;
1165a214ac2aSShri Abhyankar   ierr = PetscObjectComposeFunctionDynamic((PetscObject)B,"MatFactorGetSolverPackage_C","MatFactorGetSolverPackage_mumps",MatFactorGetSolverPackage_mumps);CHKERRQ(ierr);
1166a214ac2aSShri Abhyankar   ierr = PetscObjectComposeFunctionDynamic((PetscObject)B,"MatMumpsSetIcntl_C","MatMumpsSetIcntl",MatMumpsSetIcntl);CHKERRQ(ierr);
1167a214ac2aSShri Abhyankar 
1168a214ac2aSShri Abhyankar   mumps->CleanUpMUMPS              = PETSC_FALSE;
11692877fffaSHong Zhang   mumps->isAIJ                     = PETSC_TRUE;
11702877fffaSHong Zhang   mumps->scat_rhs                  = PETSC_NULL;
11712877fffaSHong Zhang   mumps->scat_sol                  = PETSC_NULL;
11722877fffaSHong Zhang   mumps->nSolve                    = 0;
1173f3c0ef26SHong Zhang   mumps->MatDestroy                = B->ops->destroy;
1174f3c0ef26SHong Zhang   B->ops->destroy                  = MatDestroy_MUMPS;
11752877fffaSHong Zhang   B->spptr                         = (void*)mumps;
1176f3c0ef26SHong Zhang 
11772877fffaSHong Zhang   *F = B;
11782877fffaSHong Zhang   PetscFunctionReturn(0);
11792877fffaSHong Zhang }
11802877fffaSHong Zhang EXTERN_C_END
118197969023SHong Zhang 
1182450b117fSShri Abhyankar EXTERN_C_BEGIN
1183450b117fSShri Abhyankar #undef __FUNCT__
1184450b117fSShri Abhyankar #define __FUNCT__ "MatGetFactor_mpibaij_mumps"
1185450b117fSShri Abhyankar PetscErrorCode MatGetFactor_mpibaij_mumps(Mat A,MatFactorType ftype,Mat *F)
1186450b117fSShri Abhyankar {
1187450b117fSShri Abhyankar   Mat            B;
1188450b117fSShri Abhyankar   PetscErrorCode ierr;
1189450b117fSShri Abhyankar   Mat_MUMPS      *mumps;
1190450b117fSShri Abhyankar 
1191450b117fSShri Abhyankar   PetscFunctionBegin;
1192*16ebf90aSShri Abhyankar   SETERRQ(PETSC_COMM_SELF,PETSC_ERR_SUP,"BAIJ support not added for MUMPS yet, use AIJ matrix instead\n");
1193450b117fSShri Abhyankar   /* Create the factorization matrix */
1194450b117fSShri Abhyankar   ierr = MatCreate(((PetscObject)A)->comm,&B);CHKERRQ(ierr);
1195450b117fSShri Abhyankar   ierr = MatSetSizes(B,A->rmap->n,A->cmap->n,A->rmap->N,A->cmap->N);CHKERRQ(ierr);
1196450b117fSShri Abhyankar   ierr = MatSetType(B,((PetscObject)A)->type_name);CHKERRQ(ierr);
1197450b117fSShri Abhyankar   ierr = MatSeqAIJSetPreallocation(B,0,PETSC_NULL);CHKERRQ(ierr);
1198450b117fSShri Abhyankar   ierr = MatMPIAIJSetPreallocation(B,0,PETSC_NULL,0,PETSC_NULL);CHKERRQ(ierr);
1199450b117fSShri Abhyankar 
1200450b117fSShri Abhyankar   if (ftype == MAT_FACTOR_LU) {
1201450b117fSShri Abhyankar     B->ops->lufactorsymbolic = MatLUFactorSymbolic_BAIJMUMPS;
1202450b117fSShri Abhyankar     B->factortype = MAT_FACTOR_LU;
1203450b117fSShri Abhyankar   }
1204e7e72b3dSBarry Smith   else SETERRQ(PETSC_COMM_SELF,PETSC_ERR_SUP,"Cholesky factorization for Petsc BAIJ matrices not supported yet\n");
1205450b117fSShri Abhyankar   B->ops->view             = MatView_MUMPS;
1206450b117fSShri Abhyankar   ierr = PetscObjectComposeFunctionDynamic((PetscObject)B,"MatFactorGetSolverPackage_C","MatFactorGetSolverPackage_mumps",MatFactorGetSolverPackage_mumps);CHKERRQ(ierr);
1207450b117fSShri Abhyankar   ierr = PetscObjectComposeFunctionDynamic((PetscObject)B,"MatMumpsSetIcntl_C","MatMumpsSetIcntl",MatMumpsSetIcntl);CHKERRQ(ierr);
1208450b117fSShri Abhyankar 
1209450b117fSShri Abhyankar   ierr = PetscNewLog(B,Mat_MUMPS,&mumps);CHKERRQ(ierr);
1210450b117fSShri Abhyankar   mumps->CleanUpMUMPS              = PETSC_FALSE;
1211450b117fSShri Abhyankar   mumps->isAIJ                     = PETSC_TRUE;
1212450b117fSShri Abhyankar   mumps->scat_rhs                  = PETSC_NULL;
1213450b117fSShri Abhyankar   mumps->scat_sol                  = PETSC_NULL;
1214450b117fSShri Abhyankar   mumps->nSolve                    = 0;
1215450b117fSShri Abhyankar   mumps->MatDestroy                = B->ops->destroy;
1216450b117fSShri Abhyankar   B->ops->destroy                  = MatDestroy_MUMPS;
1217450b117fSShri Abhyankar   B->spptr                         = (void*)mumps;
1218450b117fSShri Abhyankar 
1219450b117fSShri Abhyankar   *F = B;
1220450b117fSShri Abhyankar   PetscFunctionReturn(0);
1221450b117fSShri Abhyankar }
1222450b117fSShri Abhyankar EXTERN_C_END
1223a214ac2aSShri Abhyankar 
122461288eaaSHong Zhang /* -------------------------------------------------------------------------------------------*/
122561288eaaSHong Zhang /*@
122661288eaaSHong Zhang   MatMumpsSetIcntl - Set MUMPS parameter ICNTL()
122761288eaaSHong Zhang 
122861288eaaSHong Zhang    Collective on Mat
122961288eaaSHong Zhang 
123061288eaaSHong Zhang    Input Parameters:
123161288eaaSHong Zhang +  F - the factored matrix obtained by calling MatGetFactor() from PETSc-MUMPS interface
123261288eaaSHong Zhang .  idx - index of MUMPS parameter array ICNTL()
123361288eaaSHong Zhang -  icntl - value of MUMPS ICNTL(imumps)
123461288eaaSHong Zhang 
123561288eaaSHong Zhang   Options Database:
123661288eaaSHong Zhang .   -mat_mumps_icntl_<idx> <icntl>
123761288eaaSHong Zhang 
123861288eaaSHong Zhang    Level: beginner
123961288eaaSHong Zhang 
124061288eaaSHong Zhang    References: MUMPS Users' Guide
124161288eaaSHong Zhang 
124261288eaaSHong Zhang .seealso: MatGetFactor()
124361288eaaSHong Zhang @*/
124497969023SHong Zhang #undef __FUNCT__
124597969023SHong Zhang #define __FUNCT__ "MatMumpsSetIcntl"
124686e5884dSMatthew Knepley PetscErrorCode MatMumpsSetIcntl(Mat F,PetscInt idx,PetscInt icntl)
124797969023SHong Zhang {
1248dcd589f8SShri Abhyankar   Mat_MUMPS      *lu =(Mat_MUMPS*)(F)->spptr;
124997969023SHong Zhang 
125097969023SHong Zhang   PetscFunctionBegin;
125161288eaaSHong Zhang   lu->id.ICNTL(idx) = icntl;
125297969023SHong Zhang   PetscFunctionReturn(0);
125397969023SHong Zhang }
125497969023SHong Zhang 
1255