xref: /petsc/src/mat/impls/aij/mpi/mumps/mumps.c (revision 6444a565fe1a122f7660ac98656b38d500ed0746)
11c2a3de1SBarry Smith 
2397b6df1SKris Buschelman /*
3c2b5dc30SHong Zhang     Provides an interface to the MUMPS sparse solver
4397b6df1SKris Buschelman */
551d5961aSHong Zhang 
6c6db04a5SJed Brown #include <../src/mat/impls/aij/mpi/mpiaij.h> /*I  "petscmat.h"  I*/
7c6db04a5SJed Brown #include <../src/mat/impls/sbaij/mpi/mpisbaij.h>
8397b6df1SKris Buschelman 
9397b6df1SKris Buschelman EXTERN_C_BEGIN
10397b6df1SKris Buschelman #if defined(PETSC_USE_COMPLEX)
112907cef9SHong Zhang #if defined(PETSC_USE_REAL_SINGLE)
122907cef9SHong Zhang #include <cmumps_c.h>
132907cef9SHong Zhang #else
14c6db04a5SJed Brown #include <zmumps_c.h>
152907cef9SHong Zhang #endif
162907cef9SHong Zhang #else
172907cef9SHong Zhang #if defined(PETSC_USE_REAL_SINGLE)
182907cef9SHong Zhang #include <smumps_c.h>
19397b6df1SKris Buschelman #else
20c6db04a5SJed Brown #include <dmumps_c.h>
21397b6df1SKris Buschelman #endif
222907cef9SHong Zhang #endif
23397b6df1SKris Buschelman EXTERN_C_END
24397b6df1SKris Buschelman #define JOB_INIT -1
253d472b54SHong Zhang #define JOB_FACTSYMBOLIC 1
263d472b54SHong Zhang #define JOB_FACTNUMERIC 2
273d472b54SHong Zhang #define JOB_SOLVE 3
28397b6df1SKris Buschelman #define JOB_END -2
293d472b54SHong Zhang 
302907cef9SHong Zhang /* calls to MUMPS */
312907cef9SHong Zhang #if defined(PETSC_USE_COMPLEX)
322907cef9SHong Zhang #if defined(PETSC_USE_REAL_SINGLE)
332907cef9SHong Zhang #define PetscMUMPS_c cmumps_c
342907cef9SHong Zhang #else
352907cef9SHong Zhang #define PetscMUMPS_c zmumps_c
362907cef9SHong Zhang #endif
372907cef9SHong Zhang #else
382907cef9SHong Zhang #if defined(PETSC_USE_REAL_SINGLE)
392907cef9SHong Zhang #define PetscMUMPS_c smumps_c
402907cef9SHong Zhang #else
412907cef9SHong Zhang #define PetscMUMPS_c dmumps_c
422907cef9SHong Zhang #endif
432907cef9SHong Zhang #endif
442907cef9SHong Zhang 
45940cd9d6SSatish Balay /* declare MumpsScalar */
46940cd9d6SSatish Balay #if defined(PETSC_USE_COMPLEX)
47940cd9d6SSatish Balay #if defined(PETSC_USE_REAL_SINGLE)
48940cd9d6SSatish Balay #define MumpsScalar mumps_complex
49940cd9d6SSatish Balay #else
50940cd9d6SSatish Balay #define MumpsScalar mumps_double_complex
51940cd9d6SSatish Balay #endif
52940cd9d6SSatish Balay #else
53940cd9d6SSatish Balay #define MumpsScalar PetscScalar
54940cd9d6SSatish Balay #endif
553d472b54SHong Zhang 
56397b6df1SKris Buschelman /* macros s.t. indices match MUMPS documentation */
57397b6df1SKris Buschelman #define ICNTL(I) icntl[(I)-1]
58397b6df1SKris Buschelman #define CNTL(I) cntl[(I)-1]
59397b6df1SKris Buschelman #define INFOG(I) infog[(I)-1]
60a7aca84bSHong Zhang #define INFO(I) info[(I)-1]
61397b6df1SKris Buschelman #define RINFOG(I) rinfog[(I)-1]
62adc1d99fSHong Zhang #define RINFO(I) rinfo[(I)-1]
63397b6df1SKris Buschelman 
64397b6df1SKris Buschelman typedef struct {
65397b6df1SKris Buschelman #if defined(PETSC_USE_COMPLEX)
662907cef9SHong Zhang #if defined(PETSC_USE_REAL_SINGLE)
672907cef9SHong Zhang   CMUMPS_STRUC_C id;
682907cef9SHong Zhang #else
69397b6df1SKris Buschelman   ZMUMPS_STRUC_C id;
702907cef9SHong Zhang #endif
712907cef9SHong Zhang #else
722907cef9SHong Zhang #if defined(PETSC_USE_REAL_SINGLE)
732907cef9SHong Zhang   SMUMPS_STRUC_C id;
74397b6df1SKris Buschelman #else
75397b6df1SKris Buschelman   DMUMPS_STRUC_C id;
76397b6df1SKris Buschelman #endif
772907cef9SHong Zhang #endif
782907cef9SHong Zhang 
79397b6df1SKris Buschelman   MatStructure matstruc;
80c1490034SHong Zhang   PetscMPIInt  myid,size;
81a5e57a09SHong Zhang   PetscInt     *irn,*jcn,nz,sym;
82397b6df1SKris Buschelman   PetscScalar  *val;
83397b6df1SKris Buschelman   MPI_Comm     comm_mumps;
8464e6c443SBarry Smith   PetscBool    isAIJ,CleanUpMUMPS;
85a5e57a09SHong Zhang   PetscInt     ICNTL9_pre;           /* check if ICNTL(9) is changed from previous MatSolve */
86801fbe65SHong Zhang   VecScatter   scat_rhs, scat_sol;   /* used by MatSolve() */
87801fbe65SHong Zhang   Vec          b_seq,x_seq;
88b34f08ffSHong Zhang   PetscInt     ninfo,*info;          /* display INFO */
892205254eSKarl Rupp 
90bf0cc555SLisandro Dalcin   PetscErrorCode (*Destroy)(Mat);
91bccb9932SShri Abhyankar   PetscErrorCode (*ConvertToTriples)(Mat, int, MatReuse, int*, int**, int**, PetscScalar**);
92f0c56d0fSKris Buschelman } Mat_MUMPS;
93f0c56d0fSKris Buschelman 
9409573ac7SBarry Smith extern PetscErrorCode MatDuplicate_MUMPS(Mat,MatDuplicateOption,Mat*);
95b24902e0SBarry Smith 
96397b6df1SKris Buschelman /*
97d341cd04SHong Zhang   MatConvertToTriples_A_B - convert Petsc matrix to triples: row[nz], col[nz], val[nz]
98d341cd04SHong Zhang 
99397b6df1SKris Buschelman   input:
10067877ebaSShri Abhyankar     A       - matrix in aij,baij or sbaij (bs=1) format
101397b6df1SKris Buschelman     shift   - 0: C style output triple; 1: Fortran style output triple.
102bccb9932SShri Abhyankar     reuse   - MAT_INITIAL_MATRIX: spaces are allocated and values are set for the triple
103bccb9932SShri Abhyankar               MAT_REUSE_MATRIX:   only the values in v array are updated
104397b6df1SKris Buschelman   output:
105397b6df1SKris Buschelman     nnz     - dim of r, c, and v (number of local nonzero entries of A)
106397b6df1SKris Buschelman     r, c, v - row and col index, matrix values (matrix triples)
107eb9baa12SBarry Smith 
108eb9baa12SBarry Smith   The returned values r, c, and sometimes v are obtained in a single PetscMalloc(). Then in MatDestroy_MUMPS() it is
109eb9baa12SBarry Smith   freed with PetscFree((mumps->irn);  This is not ideal code, the fact that v is ONLY sometimes part of mumps->irn means
110eb9baa12SBarry Smith   that the PetscMalloc() cannot easily be replaced with a PetscMalloc3().
111eb9baa12SBarry Smith 
112397b6df1SKris Buschelman  */
11316ebf90aSShri Abhyankar 
11416ebf90aSShri Abhyankar #undef __FUNCT__
11516ebf90aSShri Abhyankar #define __FUNCT__ "MatConvertToTriples_seqaij_seqaij"
116bccb9932SShri Abhyankar PetscErrorCode MatConvertToTriples_seqaij_seqaij(Mat A,int shift,MatReuse reuse,int *nnz,int **r, int **c, PetscScalar **v)
117b24902e0SBarry Smith {
118185f6596SHong Zhang   const PetscInt *ai,*aj,*ajj,M=A->rmap->n;
11967877ebaSShri Abhyankar   PetscInt       nz,rnz,i,j;
120dfbe8321SBarry Smith   PetscErrorCode ierr;
121c1490034SHong Zhang   PetscInt       *row,*col;
12216ebf90aSShri Abhyankar   Mat_SeqAIJ     *aa=(Mat_SeqAIJ*)A->data;
123397b6df1SKris Buschelman 
124397b6df1SKris Buschelman   PetscFunctionBegin;
12516ebf90aSShri Abhyankar   *v=aa->a;
126bccb9932SShri Abhyankar   if (reuse == MAT_INITIAL_MATRIX) {
1272205254eSKarl Rupp     nz   = aa->nz;
1282205254eSKarl Rupp     ai   = aa->i;
1292205254eSKarl Rupp     aj   = aa->j;
13016ebf90aSShri Abhyankar     *nnz = nz;
131785e854fSJed Brown     ierr = PetscMalloc1(2*nz, &row);CHKERRQ(ierr);
132185f6596SHong Zhang     col  = row + nz;
133185f6596SHong Zhang 
13416ebf90aSShri Abhyankar     nz = 0;
13516ebf90aSShri Abhyankar     for (i=0; i<M; i++) {
13616ebf90aSShri Abhyankar       rnz = ai[i+1] - ai[i];
13767877ebaSShri Abhyankar       ajj = aj + ai[i];
13867877ebaSShri Abhyankar       for (j=0; j<rnz; j++) {
13967877ebaSShri Abhyankar         row[nz] = i+shift; col[nz++] = ajj[j] + shift;
14016ebf90aSShri Abhyankar       }
14116ebf90aSShri Abhyankar     }
14216ebf90aSShri Abhyankar     *r = row; *c = col;
14316ebf90aSShri Abhyankar   }
14416ebf90aSShri Abhyankar   PetscFunctionReturn(0);
14516ebf90aSShri Abhyankar }
146397b6df1SKris Buschelman 
14716ebf90aSShri Abhyankar #undef __FUNCT__
14867877ebaSShri Abhyankar #define __FUNCT__ "MatConvertToTriples_seqbaij_seqaij"
149bccb9932SShri Abhyankar PetscErrorCode MatConvertToTriples_seqbaij_seqaij(Mat A,int shift,MatReuse reuse,int *nnz,int **r, int **c, PetscScalar **v)
15067877ebaSShri Abhyankar {
15167877ebaSShri Abhyankar   Mat_SeqBAIJ    *aa=(Mat_SeqBAIJ*)A->data;
15233d57670SJed Brown   const PetscInt *ai,*aj,*ajj,bs2 = aa->bs2;
15333d57670SJed Brown   PetscInt       bs,M,nz,idx=0,rnz,i,j,k,m;
15467877ebaSShri Abhyankar   PetscErrorCode ierr;
15567877ebaSShri Abhyankar   PetscInt       *row,*col;
15667877ebaSShri Abhyankar 
15767877ebaSShri Abhyankar   PetscFunctionBegin;
15833d57670SJed Brown   ierr = MatGetBlockSize(A,&bs);CHKERRQ(ierr);
15933d57670SJed Brown   M = A->rmap->N/bs;
160cf3759fdSShri Abhyankar   *v = aa->a;
161bccb9932SShri Abhyankar   if (reuse == MAT_INITIAL_MATRIX) {
162cf3759fdSShri Abhyankar     ai   = aa->i; aj = aa->j;
16367877ebaSShri Abhyankar     nz   = bs2*aa->nz;
16467877ebaSShri Abhyankar     *nnz = nz;
165785e854fSJed Brown     ierr = PetscMalloc1(2*nz, &row);CHKERRQ(ierr);
166185f6596SHong Zhang     col  = row + nz;
167185f6596SHong Zhang 
16867877ebaSShri Abhyankar     for (i=0; i<M; i++) {
16967877ebaSShri Abhyankar       ajj = aj + ai[i];
17067877ebaSShri Abhyankar       rnz = ai[i+1] - ai[i];
17167877ebaSShri Abhyankar       for (k=0; k<rnz; k++) {
17267877ebaSShri Abhyankar         for (j=0; j<bs; j++) {
17367877ebaSShri Abhyankar           for (m=0; m<bs; m++) {
17467877ebaSShri Abhyankar             row[idx]   = i*bs + m + shift;
175cf3759fdSShri Abhyankar             col[idx++] = bs*(ajj[k]) + j + shift;
17667877ebaSShri Abhyankar           }
17767877ebaSShri Abhyankar         }
17867877ebaSShri Abhyankar       }
17967877ebaSShri Abhyankar     }
180cf3759fdSShri Abhyankar     *r = row; *c = col;
18167877ebaSShri Abhyankar   }
18267877ebaSShri Abhyankar   PetscFunctionReturn(0);
18367877ebaSShri Abhyankar }
18467877ebaSShri Abhyankar 
18567877ebaSShri Abhyankar #undef __FUNCT__
18616ebf90aSShri Abhyankar #define __FUNCT__ "MatConvertToTriples_seqsbaij_seqsbaij"
187bccb9932SShri Abhyankar PetscErrorCode MatConvertToTriples_seqsbaij_seqsbaij(Mat A,int shift,MatReuse reuse,int *nnz,int **r, int **c, PetscScalar **v)
18816ebf90aSShri Abhyankar {
18967877ebaSShri Abhyankar   const PetscInt *ai, *aj,*ajj,M=A->rmap->n;
19067877ebaSShri Abhyankar   PetscInt       nz,rnz,i,j;
19116ebf90aSShri Abhyankar   PetscErrorCode ierr;
19216ebf90aSShri Abhyankar   PetscInt       *row,*col;
19316ebf90aSShri Abhyankar   Mat_SeqSBAIJ   *aa=(Mat_SeqSBAIJ*)A->data;
19416ebf90aSShri Abhyankar 
19516ebf90aSShri Abhyankar   PetscFunctionBegin;
196882afa5aSHong Zhang   *v = aa->a;
197bccb9932SShri Abhyankar   if (reuse == MAT_INITIAL_MATRIX) {
1982205254eSKarl Rupp     nz   = aa->nz;
1992205254eSKarl Rupp     ai   = aa->i;
2002205254eSKarl Rupp     aj   = aa->j;
2012205254eSKarl Rupp     *v   = aa->a;
20216ebf90aSShri Abhyankar     *nnz = nz;
203785e854fSJed Brown     ierr = PetscMalloc1(2*nz, &row);CHKERRQ(ierr);
204185f6596SHong Zhang     col  = row + nz;
205185f6596SHong Zhang 
20616ebf90aSShri Abhyankar     nz = 0;
20716ebf90aSShri Abhyankar     for (i=0; i<M; i++) {
20816ebf90aSShri Abhyankar       rnz = ai[i+1] - ai[i];
20967877ebaSShri Abhyankar       ajj = aj + ai[i];
21067877ebaSShri Abhyankar       for (j=0; j<rnz; j++) {
21167877ebaSShri Abhyankar         row[nz] = i+shift; col[nz++] = ajj[j] + shift;
21216ebf90aSShri Abhyankar       }
21316ebf90aSShri Abhyankar     }
21416ebf90aSShri Abhyankar     *r = row; *c = col;
21516ebf90aSShri Abhyankar   }
21616ebf90aSShri Abhyankar   PetscFunctionReturn(0);
21716ebf90aSShri Abhyankar }
21816ebf90aSShri Abhyankar 
21916ebf90aSShri Abhyankar #undef __FUNCT__
22016ebf90aSShri Abhyankar #define __FUNCT__ "MatConvertToTriples_seqaij_seqsbaij"
221bccb9932SShri Abhyankar PetscErrorCode MatConvertToTriples_seqaij_seqsbaij(Mat A,int shift,MatReuse reuse,int *nnz,int **r, int **c, PetscScalar **v)
22216ebf90aSShri Abhyankar {
22367877ebaSShri Abhyankar   const PetscInt    *ai,*aj,*ajj,*adiag,M=A->rmap->n;
22467877ebaSShri Abhyankar   PetscInt          nz,rnz,i,j;
22567877ebaSShri Abhyankar   const PetscScalar *av,*v1;
22616ebf90aSShri Abhyankar   PetscScalar       *val;
22716ebf90aSShri Abhyankar   PetscErrorCode    ierr;
22816ebf90aSShri Abhyankar   PetscInt          *row,*col;
229829b1710SHong Zhang   Mat_SeqAIJ        *aa=(Mat_SeqAIJ*)A->data;
23016ebf90aSShri Abhyankar 
23116ebf90aSShri Abhyankar   PetscFunctionBegin;
23216ebf90aSShri Abhyankar   ai   =aa->i; aj=aa->j;av=aa->a;
23316ebf90aSShri Abhyankar   adiag=aa->diag;
234bccb9932SShri Abhyankar   if (reuse == MAT_INITIAL_MATRIX) {
235829b1710SHong Zhang     /* count nz in the uppper triangular part of A */
236829b1710SHong Zhang     nz = 0;
237829b1710SHong Zhang     for (i=0; i<M; i++) nz += ai[i+1] - adiag[i];
23816ebf90aSShri Abhyankar     *nnz = nz;
239829b1710SHong Zhang 
240185f6596SHong Zhang     ierr = PetscMalloc((2*nz*sizeof(PetscInt)+nz*sizeof(PetscScalar)), &row);CHKERRQ(ierr);
241185f6596SHong Zhang     col  = row + nz;
242185f6596SHong Zhang     val  = (PetscScalar*)(col + nz);
243185f6596SHong Zhang 
24416ebf90aSShri Abhyankar     nz = 0;
24516ebf90aSShri Abhyankar     for (i=0; i<M; i++) {
24616ebf90aSShri Abhyankar       rnz = ai[i+1] - adiag[i];
24767877ebaSShri Abhyankar       ajj = aj + adiag[i];
248cf3759fdSShri Abhyankar       v1  = av + adiag[i];
24967877ebaSShri Abhyankar       for (j=0; j<rnz; j++) {
25067877ebaSShri Abhyankar         row[nz] = i+shift; col[nz] = ajj[j] + shift; val[nz++] = v1[j];
25116ebf90aSShri Abhyankar       }
25216ebf90aSShri Abhyankar     }
25316ebf90aSShri Abhyankar     *r = row; *c = col; *v = val;
254397b6df1SKris Buschelman   } else {
25516ebf90aSShri Abhyankar     nz = 0; val = *v;
25616ebf90aSShri Abhyankar     for (i=0; i <M; i++) {
25716ebf90aSShri Abhyankar       rnz = ai[i+1] - adiag[i];
25867877ebaSShri Abhyankar       ajj = aj + adiag[i];
25967877ebaSShri Abhyankar       v1  = av + adiag[i];
26067877ebaSShri Abhyankar       for (j=0; j<rnz; j++) {
26167877ebaSShri Abhyankar         val[nz++] = v1[j];
26216ebf90aSShri Abhyankar       }
26316ebf90aSShri Abhyankar     }
26416ebf90aSShri Abhyankar   }
26516ebf90aSShri Abhyankar   PetscFunctionReturn(0);
26616ebf90aSShri Abhyankar }
26716ebf90aSShri Abhyankar 
26816ebf90aSShri Abhyankar #undef __FUNCT__
26916ebf90aSShri Abhyankar #define __FUNCT__ "MatConvertToTriples_mpisbaij_mpisbaij"
270bccb9932SShri Abhyankar PetscErrorCode MatConvertToTriples_mpisbaij_mpisbaij(Mat A,int shift,MatReuse reuse,int *nnz,int **r, int **c, PetscScalar **v)
27116ebf90aSShri Abhyankar {
27216ebf90aSShri Abhyankar   const PetscInt    *ai, *aj, *bi, *bj,*garray,m=A->rmap->n,*ajj,*bjj;
27316ebf90aSShri Abhyankar   PetscErrorCode    ierr;
27416ebf90aSShri Abhyankar   PetscInt          rstart,nz,i,j,jj,irow,countA,countB;
27516ebf90aSShri Abhyankar   PetscInt          *row,*col;
27616ebf90aSShri Abhyankar   const PetscScalar *av, *bv,*v1,*v2;
27716ebf90aSShri Abhyankar   PetscScalar       *val;
278397b6df1SKris Buschelman   Mat_MPISBAIJ      *mat = (Mat_MPISBAIJ*)A->data;
279397b6df1SKris Buschelman   Mat_SeqSBAIJ      *aa  = (Mat_SeqSBAIJ*)(mat->A)->data;
280397b6df1SKris Buschelman   Mat_SeqBAIJ       *bb  = (Mat_SeqBAIJ*)(mat->B)->data;
28116ebf90aSShri Abhyankar 
28216ebf90aSShri Abhyankar   PetscFunctionBegin;
283d0f46423SBarry Smith   ai=aa->i; aj=aa->j; bi=bb->i; bj=bb->j; rstart= A->rmap->rstart;
284397b6df1SKris Buschelman   av=aa->a; bv=bb->a;
285397b6df1SKris Buschelman 
2862205254eSKarl Rupp   garray = mat->garray;
2872205254eSKarl Rupp 
288bccb9932SShri Abhyankar   if (reuse == MAT_INITIAL_MATRIX) {
28916ebf90aSShri Abhyankar     nz   = aa->nz + bb->nz;
29016ebf90aSShri Abhyankar     *nnz = nz;
291185f6596SHong Zhang     ierr = PetscMalloc((2*nz*sizeof(PetscInt)+nz*sizeof(PetscScalar)), &row);CHKERRQ(ierr);
292185f6596SHong Zhang     col  = row + nz;
293185f6596SHong Zhang     val  = (PetscScalar*)(col + nz);
294185f6596SHong Zhang 
295397b6df1SKris Buschelman     *r = row; *c = col; *v = val;
296397b6df1SKris Buschelman   } else {
297397b6df1SKris Buschelman     row = *r; col = *c; val = *v;
298397b6df1SKris Buschelman   }
299397b6df1SKris Buschelman 
300028e57e8SHong Zhang   jj = 0; irow = rstart;
301397b6df1SKris Buschelman   for (i=0; i<m; i++) {
302397b6df1SKris Buschelman     ajj    = aj + ai[i];                 /* ptr to the beginning of this row */
303397b6df1SKris Buschelman     countA = ai[i+1] - ai[i];
304397b6df1SKris Buschelman     countB = bi[i+1] - bi[i];
305397b6df1SKris Buschelman     bjj    = bj + bi[i];
30616ebf90aSShri Abhyankar     v1     = av + ai[i];
30716ebf90aSShri Abhyankar     v2     = bv + bi[i];
308397b6df1SKris Buschelman 
309397b6df1SKris Buschelman     /* A-part */
310397b6df1SKris Buschelman     for (j=0; j<countA; j++) {
311bccb9932SShri Abhyankar       if (reuse == MAT_INITIAL_MATRIX) {
312397b6df1SKris Buschelman         row[jj] = irow + shift; col[jj] = rstart + ajj[j] + shift;
313397b6df1SKris Buschelman       }
31416ebf90aSShri Abhyankar       val[jj++] = v1[j];
315397b6df1SKris Buschelman     }
31616ebf90aSShri Abhyankar 
31716ebf90aSShri Abhyankar     /* B-part */
31816ebf90aSShri Abhyankar     for (j=0; j < countB; j++) {
319bccb9932SShri Abhyankar       if (reuse == MAT_INITIAL_MATRIX) {
320397b6df1SKris Buschelman         row[jj] = irow + shift; col[jj] = garray[bjj[j]] + shift;
321397b6df1SKris Buschelman       }
32216ebf90aSShri Abhyankar       val[jj++] = v2[j];
32316ebf90aSShri Abhyankar     }
32416ebf90aSShri Abhyankar     irow++;
32516ebf90aSShri Abhyankar   }
32616ebf90aSShri Abhyankar   PetscFunctionReturn(0);
32716ebf90aSShri Abhyankar }
32816ebf90aSShri Abhyankar 
32916ebf90aSShri Abhyankar #undef __FUNCT__
33016ebf90aSShri Abhyankar #define __FUNCT__ "MatConvertToTriples_mpiaij_mpiaij"
331bccb9932SShri Abhyankar PetscErrorCode MatConvertToTriples_mpiaij_mpiaij(Mat A,int shift,MatReuse reuse,int *nnz,int **r, int **c, PetscScalar **v)
33216ebf90aSShri Abhyankar {
33316ebf90aSShri Abhyankar   const PetscInt    *ai, *aj, *bi, *bj,*garray,m=A->rmap->n,*ajj,*bjj;
33416ebf90aSShri Abhyankar   PetscErrorCode    ierr;
33516ebf90aSShri Abhyankar   PetscInt          rstart,nz,i,j,jj,irow,countA,countB;
33616ebf90aSShri Abhyankar   PetscInt          *row,*col;
33716ebf90aSShri Abhyankar   const PetscScalar *av, *bv,*v1,*v2;
33816ebf90aSShri Abhyankar   PetscScalar       *val;
33916ebf90aSShri Abhyankar   Mat_MPIAIJ        *mat = (Mat_MPIAIJ*)A->data;
34016ebf90aSShri Abhyankar   Mat_SeqAIJ        *aa  = (Mat_SeqAIJ*)(mat->A)->data;
34116ebf90aSShri Abhyankar   Mat_SeqAIJ        *bb  = (Mat_SeqAIJ*)(mat->B)->data;
34216ebf90aSShri Abhyankar 
34316ebf90aSShri Abhyankar   PetscFunctionBegin;
34416ebf90aSShri Abhyankar   ai=aa->i; aj=aa->j; bi=bb->i; bj=bb->j; rstart= A->rmap->rstart;
34516ebf90aSShri Abhyankar   av=aa->a; bv=bb->a;
34616ebf90aSShri Abhyankar 
3472205254eSKarl Rupp   garray = mat->garray;
3482205254eSKarl Rupp 
349bccb9932SShri Abhyankar   if (reuse == MAT_INITIAL_MATRIX) {
35016ebf90aSShri Abhyankar     nz   = aa->nz + bb->nz;
35116ebf90aSShri Abhyankar     *nnz = nz;
352185f6596SHong Zhang     ierr = PetscMalloc((2*nz*sizeof(PetscInt)+nz*sizeof(PetscScalar)), &row);CHKERRQ(ierr);
353185f6596SHong Zhang     col  = row + nz;
354185f6596SHong Zhang     val  = (PetscScalar*)(col + nz);
355185f6596SHong Zhang 
35616ebf90aSShri Abhyankar     *r = row; *c = col; *v = val;
35716ebf90aSShri Abhyankar   } else {
35816ebf90aSShri Abhyankar     row = *r; col = *c; val = *v;
35916ebf90aSShri Abhyankar   }
36016ebf90aSShri Abhyankar 
36116ebf90aSShri Abhyankar   jj = 0; irow = rstart;
36216ebf90aSShri Abhyankar   for (i=0; i<m; i++) {
36316ebf90aSShri Abhyankar     ajj    = aj + ai[i];                 /* ptr to the beginning of this row */
36416ebf90aSShri Abhyankar     countA = ai[i+1] - ai[i];
36516ebf90aSShri Abhyankar     countB = bi[i+1] - bi[i];
36616ebf90aSShri Abhyankar     bjj    = bj + bi[i];
36716ebf90aSShri Abhyankar     v1     = av + ai[i];
36816ebf90aSShri Abhyankar     v2     = bv + bi[i];
36916ebf90aSShri Abhyankar 
37016ebf90aSShri Abhyankar     /* A-part */
37116ebf90aSShri Abhyankar     for (j=0; j<countA; j++) {
372bccb9932SShri Abhyankar       if (reuse == MAT_INITIAL_MATRIX) {
37316ebf90aSShri Abhyankar         row[jj] = irow + shift; col[jj] = rstart + ajj[j] + shift;
37416ebf90aSShri Abhyankar       }
37516ebf90aSShri Abhyankar       val[jj++] = v1[j];
37616ebf90aSShri Abhyankar     }
37716ebf90aSShri Abhyankar 
37816ebf90aSShri Abhyankar     /* B-part */
37916ebf90aSShri Abhyankar     for (j=0; j < countB; j++) {
380bccb9932SShri Abhyankar       if (reuse == MAT_INITIAL_MATRIX) {
38116ebf90aSShri Abhyankar         row[jj] = irow + shift; col[jj] = garray[bjj[j]] + shift;
38216ebf90aSShri Abhyankar       }
38316ebf90aSShri Abhyankar       val[jj++] = v2[j];
38416ebf90aSShri Abhyankar     }
38516ebf90aSShri Abhyankar     irow++;
38616ebf90aSShri Abhyankar   }
38716ebf90aSShri Abhyankar   PetscFunctionReturn(0);
38816ebf90aSShri Abhyankar }
38916ebf90aSShri Abhyankar 
39016ebf90aSShri Abhyankar #undef __FUNCT__
39167877ebaSShri Abhyankar #define __FUNCT__ "MatConvertToTriples_mpibaij_mpiaij"
392bccb9932SShri Abhyankar PetscErrorCode MatConvertToTriples_mpibaij_mpiaij(Mat A,int shift,MatReuse reuse,int *nnz,int **r, int **c, PetscScalar **v)
39367877ebaSShri Abhyankar {
39467877ebaSShri Abhyankar   Mat_MPIBAIJ       *mat    = (Mat_MPIBAIJ*)A->data;
39567877ebaSShri Abhyankar   Mat_SeqBAIJ       *aa     = (Mat_SeqBAIJ*)(mat->A)->data;
39667877ebaSShri Abhyankar   Mat_SeqBAIJ       *bb     = (Mat_SeqBAIJ*)(mat->B)->data;
39767877ebaSShri Abhyankar   const PetscInt    *ai     = aa->i, *bi = bb->i, *aj = aa->j, *bj = bb->j,*ajj, *bjj;
398d985c460SShri Abhyankar   const PetscInt    *garray = mat->garray,mbs=mat->mbs,rstart=A->rmap->rstart;
39933d57670SJed Brown   const PetscInt    bs2=mat->bs2;
40067877ebaSShri Abhyankar   PetscErrorCode    ierr;
40133d57670SJed Brown   PetscInt          bs,nz,i,j,k,n,jj,irow,countA,countB,idx;
40267877ebaSShri Abhyankar   PetscInt          *row,*col;
40367877ebaSShri Abhyankar   const PetscScalar *av=aa->a, *bv=bb->a,*v1,*v2;
40467877ebaSShri Abhyankar   PetscScalar       *val;
40567877ebaSShri Abhyankar 
40667877ebaSShri Abhyankar   PetscFunctionBegin;
40733d57670SJed Brown   ierr = MatGetBlockSize(A,&bs);CHKERRQ(ierr);
408bccb9932SShri Abhyankar   if (reuse == MAT_INITIAL_MATRIX) {
40967877ebaSShri Abhyankar     nz   = bs2*(aa->nz + bb->nz);
41067877ebaSShri Abhyankar     *nnz = nz;
411185f6596SHong Zhang     ierr = PetscMalloc((2*nz*sizeof(PetscInt)+nz*sizeof(PetscScalar)), &row);CHKERRQ(ierr);
412185f6596SHong Zhang     col  = row + nz;
413185f6596SHong Zhang     val  = (PetscScalar*)(col + nz);
414185f6596SHong Zhang 
41567877ebaSShri Abhyankar     *r = row; *c = col; *v = val;
41667877ebaSShri Abhyankar   } else {
41767877ebaSShri Abhyankar     row = *r; col = *c; val = *v;
41867877ebaSShri Abhyankar   }
41967877ebaSShri Abhyankar 
420d985c460SShri Abhyankar   jj = 0; irow = rstart;
42167877ebaSShri Abhyankar   for (i=0; i<mbs; i++) {
42267877ebaSShri Abhyankar     countA = ai[i+1] - ai[i];
42367877ebaSShri Abhyankar     countB = bi[i+1] - bi[i];
42467877ebaSShri Abhyankar     ajj    = aj + ai[i];
42567877ebaSShri Abhyankar     bjj    = bj + bi[i];
42667877ebaSShri Abhyankar     v1     = av + bs2*ai[i];
42767877ebaSShri Abhyankar     v2     = bv + bs2*bi[i];
42867877ebaSShri Abhyankar 
42967877ebaSShri Abhyankar     idx = 0;
43067877ebaSShri Abhyankar     /* A-part */
43167877ebaSShri Abhyankar     for (k=0; k<countA; k++) {
43267877ebaSShri Abhyankar       for (j=0; j<bs; j++) {
43367877ebaSShri Abhyankar         for (n=0; n<bs; n++) {
434bccb9932SShri Abhyankar           if (reuse == MAT_INITIAL_MATRIX) {
435d985c460SShri Abhyankar             row[jj] = irow + n + shift;
436d985c460SShri Abhyankar             col[jj] = rstart + bs*ajj[k] + j + shift;
43767877ebaSShri Abhyankar           }
43867877ebaSShri Abhyankar           val[jj++] = v1[idx++];
43967877ebaSShri Abhyankar         }
44067877ebaSShri Abhyankar       }
44167877ebaSShri Abhyankar     }
44267877ebaSShri Abhyankar 
44367877ebaSShri Abhyankar     idx = 0;
44467877ebaSShri Abhyankar     /* B-part */
44567877ebaSShri Abhyankar     for (k=0; k<countB; k++) {
44667877ebaSShri Abhyankar       for (j=0; j<bs; j++) {
44767877ebaSShri Abhyankar         for (n=0; n<bs; n++) {
448bccb9932SShri Abhyankar           if (reuse == MAT_INITIAL_MATRIX) {
449d985c460SShri Abhyankar             row[jj] = irow + n + shift;
450d985c460SShri Abhyankar             col[jj] = bs*garray[bjj[k]] + j + shift;
45167877ebaSShri Abhyankar           }
452d985c460SShri Abhyankar           val[jj++] = v2[idx++];
45367877ebaSShri Abhyankar         }
45467877ebaSShri Abhyankar       }
45567877ebaSShri Abhyankar     }
456d985c460SShri Abhyankar     irow += bs;
45767877ebaSShri Abhyankar   }
45867877ebaSShri Abhyankar   PetscFunctionReturn(0);
45967877ebaSShri Abhyankar }
46067877ebaSShri Abhyankar 
46167877ebaSShri Abhyankar #undef __FUNCT__
46216ebf90aSShri Abhyankar #define __FUNCT__ "MatConvertToTriples_mpiaij_mpisbaij"
463bccb9932SShri Abhyankar PetscErrorCode MatConvertToTriples_mpiaij_mpisbaij(Mat A,int shift,MatReuse reuse,int *nnz,int **r, int **c, PetscScalar **v)
46416ebf90aSShri Abhyankar {
46516ebf90aSShri Abhyankar   const PetscInt    *ai, *aj,*adiag, *bi, *bj,*garray,m=A->rmap->n,*ajj,*bjj;
46616ebf90aSShri Abhyankar   PetscErrorCode    ierr;
467e0bace9bSHong Zhang   PetscInt          rstart,nz,nza,nzb,i,j,jj,irow,countA,countB;
46816ebf90aSShri Abhyankar   PetscInt          *row,*col;
46916ebf90aSShri Abhyankar   const PetscScalar *av, *bv,*v1,*v2;
47016ebf90aSShri Abhyankar   PetscScalar       *val;
47116ebf90aSShri Abhyankar   Mat_MPIAIJ        *mat =  (Mat_MPIAIJ*)A->data;
47216ebf90aSShri Abhyankar   Mat_SeqAIJ        *aa  =(Mat_SeqAIJ*)(mat->A)->data;
47316ebf90aSShri Abhyankar   Mat_SeqAIJ        *bb  =(Mat_SeqAIJ*)(mat->B)->data;
47416ebf90aSShri Abhyankar 
47516ebf90aSShri Abhyankar   PetscFunctionBegin;
47616ebf90aSShri Abhyankar   ai=aa->i; aj=aa->j; adiag=aa->diag;
47716ebf90aSShri Abhyankar   bi=bb->i; bj=bb->j; garray = mat->garray;
47816ebf90aSShri Abhyankar   av=aa->a; bv=bb->a;
4792205254eSKarl Rupp 
48016ebf90aSShri Abhyankar   rstart = A->rmap->rstart;
48116ebf90aSShri Abhyankar 
482bccb9932SShri Abhyankar   if (reuse == MAT_INITIAL_MATRIX) {
483e0bace9bSHong Zhang     nza = 0;    /* num of upper triangular entries in mat->A, including diagonals */
484e0bace9bSHong Zhang     nzb = 0;    /* num of upper triangular entries in mat->B */
48516ebf90aSShri Abhyankar     for (i=0; i<m; i++) {
486e0bace9bSHong Zhang       nza   += (ai[i+1] - adiag[i]);
48716ebf90aSShri Abhyankar       countB = bi[i+1] - bi[i];
48816ebf90aSShri Abhyankar       bjj    = bj + bi[i];
489e0bace9bSHong Zhang       for (j=0; j<countB; j++) {
490e0bace9bSHong Zhang         if (garray[bjj[j]] > rstart) nzb++;
491e0bace9bSHong Zhang       }
492e0bace9bSHong Zhang     }
49316ebf90aSShri Abhyankar 
494e0bace9bSHong Zhang     nz   = nza + nzb; /* total nz of upper triangular part of mat */
49516ebf90aSShri Abhyankar     *nnz = nz;
496185f6596SHong Zhang     ierr = PetscMalloc((2*nz*sizeof(PetscInt)+nz*sizeof(PetscScalar)), &row);CHKERRQ(ierr);
497185f6596SHong Zhang     col  = row + nz;
498185f6596SHong Zhang     val  = (PetscScalar*)(col + nz);
499185f6596SHong Zhang 
50016ebf90aSShri Abhyankar     *r = row; *c = col; *v = val;
50116ebf90aSShri Abhyankar   } else {
50216ebf90aSShri Abhyankar     row = *r; col = *c; val = *v;
50316ebf90aSShri Abhyankar   }
50416ebf90aSShri Abhyankar 
50516ebf90aSShri Abhyankar   jj = 0; irow = rstart;
50616ebf90aSShri Abhyankar   for (i=0; i<m; i++) {
50716ebf90aSShri Abhyankar     ajj    = aj + adiag[i];                 /* ptr to the beginning of the diagonal of this row */
50816ebf90aSShri Abhyankar     v1     = av + adiag[i];
50916ebf90aSShri Abhyankar     countA = ai[i+1] - adiag[i];
51016ebf90aSShri Abhyankar     countB = bi[i+1] - bi[i];
51116ebf90aSShri Abhyankar     bjj    = bj + bi[i];
51216ebf90aSShri Abhyankar     v2     = bv + bi[i];
51316ebf90aSShri Abhyankar 
51416ebf90aSShri Abhyankar     /* A-part */
51516ebf90aSShri Abhyankar     for (j=0; j<countA; j++) {
516bccb9932SShri Abhyankar       if (reuse == MAT_INITIAL_MATRIX) {
51716ebf90aSShri Abhyankar         row[jj] = irow + shift; col[jj] = rstart + ajj[j] + shift;
51816ebf90aSShri Abhyankar       }
51916ebf90aSShri Abhyankar       val[jj++] = v1[j];
52016ebf90aSShri Abhyankar     }
52116ebf90aSShri Abhyankar 
52216ebf90aSShri Abhyankar     /* B-part */
52316ebf90aSShri Abhyankar     for (j=0; j < countB; j++) {
52416ebf90aSShri Abhyankar       if (garray[bjj[j]] > rstart) {
525bccb9932SShri Abhyankar         if (reuse == MAT_INITIAL_MATRIX) {
52616ebf90aSShri Abhyankar           row[jj] = irow + shift; col[jj] = garray[bjj[j]] + shift;
52716ebf90aSShri Abhyankar         }
52816ebf90aSShri Abhyankar         val[jj++] = v2[j];
52916ebf90aSShri Abhyankar       }
530397b6df1SKris Buschelman     }
531397b6df1SKris Buschelman     irow++;
532397b6df1SKris Buschelman   }
533397b6df1SKris Buschelman   PetscFunctionReturn(0);
534397b6df1SKris Buschelman }
535397b6df1SKris Buschelman 
536397b6df1SKris Buschelman #undef __FUNCT__
53720be8e61SHong Zhang #define __FUNCT__ "MatGetDiagonal_MUMPS"
53820be8e61SHong Zhang PetscErrorCode MatGetDiagonal_MUMPS(Mat A,Vec v)
53920be8e61SHong Zhang {
54020be8e61SHong Zhang   PetscFunctionBegin;
54120be8e61SHong Zhang   SETERRQ(PetscObjectComm((PetscObject)A),PETSC_ERR_SUP,"Mat type: MUMPS factor");
54220be8e61SHong Zhang   PetscFunctionReturn(0);
54320be8e61SHong Zhang }
54420be8e61SHong Zhang 
54520be8e61SHong Zhang #undef __FUNCT__
5463924e44cSKris Buschelman #define __FUNCT__ "MatDestroy_MUMPS"
547dfbe8321SBarry Smith PetscErrorCode MatDestroy_MUMPS(Mat A)
548dfbe8321SBarry Smith {
549a5e57a09SHong Zhang   Mat_MUMPS      *mumps=(Mat_MUMPS*)A->spptr;
550dfbe8321SBarry Smith   PetscErrorCode ierr;
551b24902e0SBarry Smith 
552397b6df1SKris Buschelman   PetscFunctionBegin;
553a5e57a09SHong Zhang   if (mumps->CleanUpMUMPS) {
554397b6df1SKris Buschelman     /* Terminate instance, deallocate memories */
555a5e57a09SHong Zhang     ierr = PetscFree2(mumps->id.sol_loc,mumps->id.isol_loc);CHKERRQ(ierr);
556a5e57a09SHong Zhang     ierr = VecScatterDestroy(&mumps->scat_rhs);CHKERRQ(ierr);
557a5e57a09SHong Zhang     ierr = VecScatterDestroy(&mumps->scat_sol);CHKERRQ(ierr);
558801fbe65SHong Zhang     ierr = VecDestroy(&mumps->b_seq);CHKERRQ(ierr);
559a5e57a09SHong Zhang     ierr = VecDestroy(&mumps->x_seq);CHKERRQ(ierr);
560a5e57a09SHong Zhang     ierr = PetscFree(mumps->id.perm_in);CHKERRQ(ierr);
561a5e57a09SHong Zhang     ierr = PetscFree(mumps->irn);CHKERRQ(ierr);
562*6444a565SStefano Zampini     ierr = PetscFree2(mumps->id.listvar_schur,mumps->id.schur);CHKERRQ(ierr);
563b34f08ffSHong Zhang     ierr = PetscFree(mumps->info);CHKERRQ(ierr);
5642205254eSKarl Rupp 
565a5e57a09SHong Zhang     mumps->id.job = JOB_END;
566a5e57a09SHong Zhang     PetscMUMPS_c(&mumps->id);
567a5e57a09SHong Zhang     ierr = MPI_Comm_free(&(mumps->comm_mumps));CHKERRQ(ierr);
568397b6df1SKris Buschelman   }
569a5e57a09SHong Zhang   if (mumps->Destroy) {
570a5e57a09SHong Zhang     ierr = (mumps->Destroy)(A);CHKERRQ(ierr);
571bf0cc555SLisandro Dalcin   }
572bf0cc555SLisandro Dalcin   ierr = PetscFree(A->spptr);CHKERRQ(ierr);
573bf0cc555SLisandro Dalcin 
57497969023SHong Zhang   /* clear composed functions */
575bdf89e91SBarry Smith   ierr = PetscObjectComposeFunction((PetscObject)A,"MatFactorGetSolverPackage_C",NULL);CHKERRQ(ierr);
576bdf89e91SBarry Smith   ierr = PetscObjectComposeFunction((PetscObject)A,"MatMumpsSetIcntl_C",NULL);CHKERRQ(ierr);
577bc6112feSHong Zhang   ierr = PetscObjectComposeFunction((PetscObject)A,"MatMumpsGetIcntl_C",NULL);CHKERRQ(ierr);
578bdf89e91SBarry Smith   ierr = PetscObjectComposeFunction((PetscObject)A,"MatMumpsSetCntl_C",NULL);CHKERRQ(ierr);
579bc6112feSHong Zhang   ierr = PetscObjectComposeFunction((PetscObject)A,"MatMumpsGetCntl_C",NULL);CHKERRQ(ierr);
580bc6112feSHong Zhang 
581ca810319SHong Zhang   ierr = PetscObjectComposeFunction((PetscObject)A,"MatMumpsGetInfo_C",NULL);CHKERRQ(ierr);
582ca810319SHong Zhang   ierr = PetscObjectComposeFunction((PetscObject)A,"MatMumpsGetInfog_C",NULL);CHKERRQ(ierr);
583ca810319SHong Zhang   ierr = PetscObjectComposeFunction((PetscObject)A,"MatMumpsGetRinfo_C",NULL);CHKERRQ(ierr);
584ca810319SHong Zhang   ierr = PetscObjectComposeFunction((PetscObject)A,"MatMumpsGetRinfog_C",NULL);CHKERRQ(ierr);
585*6444a565SStefano Zampini 
586*6444a565SStefano Zampini   ierr = PetscObjectComposeFunction((PetscObject)A,"MatMumpsSetSchurIndices_C",NULL);CHKERRQ(ierr);
587*6444a565SStefano Zampini   ierr = PetscObjectComposeFunction((PetscObject)A,"MatMumpsGetSchurComplement_C",NULL);CHKERRQ(ierr);
588397b6df1SKris Buschelman   PetscFunctionReturn(0);
589397b6df1SKris Buschelman }
590397b6df1SKris Buschelman 
591397b6df1SKris Buschelman #undef __FUNCT__
592f6c57405SHong Zhang #define __FUNCT__ "MatSolve_MUMPS"
593b24902e0SBarry Smith PetscErrorCode MatSolve_MUMPS(Mat A,Vec b,Vec x)
594b24902e0SBarry Smith {
595a5e57a09SHong Zhang   Mat_MUMPS        *mumps=(Mat_MUMPS*)A->spptr;
596d54de34fSKris Buschelman   PetscScalar      *array;
59767877ebaSShri Abhyankar   Vec              b_seq;
598329ec9b3SHong Zhang   IS               is_iden,is_petsc;
599dfbe8321SBarry Smith   PetscErrorCode   ierr;
600329ec9b3SHong Zhang   PetscInt         i;
601883f2eb9SBarry Smith   static PetscBool cite1 = PETSC_FALSE,cite2 = PETSC_FALSE;
602397b6df1SKris Buschelman 
603397b6df1SKris Buschelman   PetscFunctionBegin;
604883f2eb9SBarry Smith   ierr = PetscCitationsRegister("@article{MUMPS01,\n  author = {P.~R. Amestoy and I.~S. Duff and J.-Y. L'Excellent and J. Koster},\n  title = {A fully asynchronous multifrontal solver using distributed dynamic scheduling},\n  journal = {SIAM Journal on Matrix Analysis and Applications},\n  volume = {23},\n  number = {1},\n  pages = {15--41},\n  year = {2001}\n}\n",&cite1);CHKERRQ(ierr);
605883f2eb9SBarry Smith   ierr = PetscCitationsRegister("@article{MUMPS02,\n  author = {P.~R. Amestoy and A. Guermouche and J.-Y. L'Excellent and S. Pralet},\n  title = {Hybrid scheduling for the parallel solution of linear systems},\n  journal = {Parallel Computing},\n  volume = {32},\n  number = {2},\n  pages = {136--156},\n  year = {2006}\n}\n",&cite2);CHKERRQ(ierr);
606a5e57a09SHong Zhang   mumps->id.nrhs = 1;
607a5e57a09SHong Zhang   b_seq          = mumps->b_seq;
608a5e57a09SHong Zhang   if (mumps->size > 1) {
609329ec9b3SHong Zhang     /* MUMPS only supports centralized rhs. Scatter b into a seqential rhs vector */
610a5e57a09SHong Zhang     ierr = VecScatterBegin(mumps->scat_rhs,b,b_seq,INSERT_VALUES,SCATTER_FORWARD);CHKERRQ(ierr);
611a5e57a09SHong Zhang     ierr = VecScatterEnd(mumps->scat_rhs,b,b_seq,INSERT_VALUES,SCATTER_FORWARD);CHKERRQ(ierr);
612a5e57a09SHong Zhang     if (!mumps->myid) {ierr = VecGetArray(b_seq,&array);CHKERRQ(ierr);}
613397b6df1SKris Buschelman   } else {  /* size == 1 */
614397b6df1SKris Buschelman     ierr = VecCopy(b,x);CHKERRQ(ierr);
615397b6df1SKris Buschelman     ierr = VecGetArray(x,&array);CHKERRQ(ierr);
616397b6df1SKris Buschelman   }
617a5e57a09SHong Zhang   if (!mumps->myid) { /* define rhs on the host */
618a5e57a09SHong Zhang     mumps->id.nrhs = 1;
619940cd9d6SSatish Balay     mumps->id.rhs = (MumpsScalar*)array;
620397b6df1SKris Buschelman   }
621397b6df1SKris Buschelman 
622397b6df1SKris Buschelman   /* solve phase */
623329ec9b3SHong Zhang   /*-------------*/
624a5e57a09SHong Zhang   mumps->id.job = JOB_SOLVE;
625a5e57a09SHong Zhang   PetscMUMPS_c(&mumps->id);
626a5e57a09SHong Zhang   if (mumps->id.INFOG(1) < 0) SETERRQ1(PETSC_COMM_SELF,PETSC_ERR_LIB,"Error reported by MUMPS in solve phase: INFOG(1)=%d\n",mumps->id.INFOG(1));
627397b6df1SKris Buschelman 
628a5e57a09SHong Zhang   if (mumps->size > 1) { /* convert mumps distributed solution to petsc mpi x */
629a5e57a09SHong Zhang     if (mumps->scat_sol && mumps->ICNTL9_pre != mumps->id.ICNTL(9)) {
630a5e57a09SHong Zhang       /* when id.ICNTL(9) changes, the contents of lsol_loc may change (not its size, lsol_loc), recreates scat_sol */
631a5e57a09SHong Zhang       ierr = VecScatterDestroy(&mumps->scat_sol);CHKERRQ(ierr);
632397b6df1SKris Buschelman     }
633a5e57a09SHong Zhang     if (!mumps->scat_sol) { /* create scatter scat_sol */
634a5e57a09SHong Zhang       ierr = ISCreateStride(PETSC_COMM_SELF,mumps->id.lsol_loc,0,1,&is_iden);CHKERRQ(ierr); /* from */
635a5e57a09SHong Zhang       for (i=0; i<mumps->id.lsol_loc; i++) {
636a5e57a09SHong Zhang         mumps->id.isol_loc[i] -= 1; /* change Fortran style to C style */
637a5e57a09SHong Zhang       }
638a5e57a09SHong Zhang       ierr = ISCreateGeneral(PETSC_COMM_SELF,mumps->id.lsol_loc,mumps->id.isol_loc,PETSC_COPY_VALUES,&is_petsc);CHKERRQ(ierr);  /* to */
639a5e57a09SHong Zhang       ierr = VecScatterCreate(mumps->x_seq,is_iden,x,is_petsc,&mumps->scat_sol);CHKERRQ(ierr);
6406bf464f9SBarry Smith       ierr = ISDestroy(&is_iden);CHKERRQ(ierr);
6416bf464f9SBarry Smith       ierr = ISDestroy(&is_petsc);CHKERRQ(ierr);
6422205254eSKarl Rupp 
643a5e57a09SHong Zhang       mumps->ICNTL9_pre = mumps->id.ICNTL(9); /* save current value of id.ICNTL(9) */
644397b6df1SKris Buschelman     }
645a5e57a09SHong Zhang 
646a5e57a09SHong Zhang     ierr = VecScatterBegin(mumps->scat_sol,mumps->x_seq,x,INSERT_VALUES,SCATTER_FORWARD);CHKERRQ(ierr);
647a5e57a09SHong Zhang     ierr = VecScatterEnd(mumps->scat_sol,mumps->x_seq,x,INSERT_VALUES,SCATTER_FORWARD);CHKERRQ(ierr);
648329ec9b3SHong Zhang   }
649397b6df1SKris Buschelman   PetscFunctionReturn(0);
650397b6df1SKris Buschelman }
651397b6df1SKris Buschelman 
65251d5961aSHong Zhang #undef __FUNCT__
65351d5961aSHong Zhang #define __FUNCT__ "MatSolveTranspose_MUMPS"
65451d5961aSHong Zhang PetscErrorCode MatSolveTranspose_MUMPS(Mat A,Vec b,Vec x)
65551d5961aSHong Zhang {
656a5e57a09SHong Zhang   Mat_MUMPS      *mumps=(Mat_MUMPS*)A->spptr;
65751d5961aSHong Zhang   PetscErrorCode ierr;
65851d5961aSHong Zhang 
65951d5961aSHong Zhang   PetscFunctionBegin;
660a5e57a09SHong Zhang   mumps->id.ICNTL(9) = 0;
6610ad0caddSJed Brown   ierr = MatSolve_MUMPS(A,b,x);CHKERRQ(ierr);
662a5e57a09SHong Zhang   mumps->id.ICNTL(9) = 1;
66351d5961aSHong Zhang   PetscFunctionReturn(0);
66451d5961aSHong Zhang }
66551d5961aSHong Zhang 
666e0b74bf9SHong Zhang #undef __FUNCT__
667e0b74bf9SHong Zhang #define __FUNCT__ "MatMatSolve_MUMPS"
668e0b74bf9SHong Zhang PetscErrorCode MatMatSolve_MUMPS(Mat A,Mat B,Mat X)
669e0b74bf9SHong Zhang {
670bda8bf91SBarry Smith   PetscErrorCode ierr;
671bda8bf91SBarry Smith   PetscBool      flg;
6724e34a73bSHong Zhang   Mat_MUMPS      *mumps=(Mat_MUMPS*)A->spptr;
673334c5f61SHong Zhang   PetscInt       i,nrhs,M;
6742cd7d884SHong Zhang   PetscScalar    *array,*bray;
675bda8bf91SBarry Smith 
676e0b74bf9SHong Zhang   PetscFunctionBegin;
6770298fd71SBarry Smith   ierr = PetscObjectTypeCompareAny((PetscObject)B,&flg,MATSEQDENSE,MATMPIDENSE,NULL);CHKERRQ(ierr);
678801fbe65SHong Zhang   if (!flg) SETERRQ(PetscObjectComm((PetscObject)B),PETSC_ERR_ARG_WRONG,"Matrix B must be MATDENSE matrix");
6790298fd71SBarry Smith   ierr = PetscObjectTypeCompareAny((PetscObject)X,&flg,MATSEQDENSE,MATMPIDENSE,NULL);CHKERRQ(ierr);
680801fbe65SHong Zhang   if (!flg) SETERRQ(PetscObjectComm((PetscObject)X),PETSC_ERR_ARG_WRONG,"Matrix X must be MATDENSE matrix");
681801fbe65SHong Zhang   if (B->rmap->n != X->rmap->n) SETERRQ(PetscObjectComm((PetscObject)B),PETSC_ERR_ARG_WRONG,"Matrix B and X must have same row distribution");
6824e34a73bSHong Zhang 
6832cd7d884SHong Zhang   ierr = MatGetSize(B,&M,&nrhs);CHKERRQ(ierr);
684334c5f61SHong Zhang   mumps->id.nrhs = nrhs;
685334c5f61SHong Zhang   mumps->id.lrhs = M;
6864e34a73bSHong Zhang 
6872cd7d884SHong Zhang   if (mumps->size == 1) {
6882cd7d884SHong Zhang     /* copy B to X */
6892cd7d884SHong Zhang     ierr = MatDenseGetArray(B,&bray);CHKERRQ(ierr);
6902cd7d884SHong Zhang     ierr = MatDenseGetArray(X,&array);CHKERRQ(ierr);
691*6444a565SStefano Zampini     ierr = PetscMemcpy(array,bray,M*nrhs*sizeof(PetscScalar));CHKERRQ(ierr);
6922cd7d884SHong Zhang     ierr = MatDenseRestoreArray(B,&bray);CHKERRQ(ierr);
693940cd9d6SSatish Balay     mumps->id.rhs = (MumpsScalar*)array;
694801fbe65SHong Zhang 
6952cd7d884SHong Zhang     /* solve phase */
6962cd7d884SHong Zhang     /*-------------*/
6972cd7d884SHong Zhang     mumps->id.job = JOB_SOLVE;
6982cd7d884SHong Zhang     PetscMUMPS_c(&mumps->id);
6992cd7d884SHong Zhang     if (mumps->id.INFOG(1) < 0) SETERRQ1(PETSC_COMM_SELF,PETSC_ERR_LIB,"Error reported by MUMPS in solve phase: INFOG(1)=%d\n",mumps->id.INFOG(1));
7002cd7d884SHong Zhang     ierr = MatDenseRestoreArray(X,&array);CHKERRQ(ierr);
701334c5f61SHong Zhang   } else {  /*--------- parallel case --------*/
70271aed81dSHong Zhang     PetscInt       lsol_loc,nlsol_loc,*isol_loc,*idx,*iidx,*idxx,*isol_loc_save;
7031070efccSSatish Balay     MumpsScalar    *sol_loc,*sol_loc_save;
704801fbe65SHong Zhang     IS             is_to,is_from;
705334c5f61SHong Zhang     PetscInt       k,proc,j,m;
706801fbe65SHong Zhang     const PetscInt *rstart;
707334c5f61SHong Zhang     Vec            v_mpi,b_seq,x_seq;
708334c5f61SHong Zhang     VecScatter     scat_rhs,scat_sol;
709801fbe65SHong Zhang 
710801fbe65SHong Zhang     /* create x_seq to hold local solution */
71171aed81dSHong Zhang     isol_loc_save = mumps->id.isol_loc; /* save it for MatSovle() */
71271aed81dSHong Zhang     sol_loc_save  = mumps->id.sol_loc;
713801fbe65SHong Zhang 
71471aed81dSHong Zhang     lsol_loc  = mumps->id.INFO(23);
71571aed81dSHong Zhang     nlsol_loc = nrhs*lsol_loc;     /* length of sol_loc */
71671aed81dSHong Zhang     ierr = PetscMalloc2(nlsol_loc,&sol_loc,nlsol_loc,&isol_loc);CHKERRQ(ierr);
717940cd9d6SSatish Balay     mumps->id.sol_loc = (MumpsScalar*)sol_loc;
718801fbe65SHong Zhang     mumps->id.isol_loc = isol_loc;
719801fbe65SHong Zhang 
7201070efccSSatish Balay     ierr = VecCreateSeqWithArray(PETSC_COMM_SELF,1,nlsol_loc,(PetscScalar*)sol_loc,&x_seq);CHKERRQ(ierr);
7212cd7d884SHong Zhang 
72274f0fcc7SHong Zhang     /* copy rhs matrix B into vector v_mpi */
723334c5f61SHong Zhang     ierr = MatGetLocalSize(B,&m,NULL);CHKERRQ(ierr);
724801fbe65SHong Zhang     ierr = MatDenseGetArray(B,&bray);CHKERRQ(ierr);
72574f0fcc7SHong Zhang     ierr = VecCreateMPIWithArray(PetscObjectComm((PetscObject)B),1,nrhs*m,nrhs*M,(const PetscScalar*)bray,&v_mpi);CHKERRQ(ierr);
726801fbe65SHong Zhang     ierr = MatDenseRestoreArray(B,&bray);CHKERRQ(ierr);
727801fbe65SHong Zhang 
728334c5f61SHong Zhang     /* scatter v_mpi to b_seq because MUMPS only supports centralized rhs */
72974f0fcc7SHong Zhang     /* idx: maps from k-th index of v_mpi to (i,j)-th global entry of B;
730801fbe65SHong Zhang       iidx: inverse of idx, will be used by scattering xx_seq -> X       */
731801fbe65SHong Zhang     ierr = PetscMalloc2(nrhs*M,&idx,nrhs*M,&iidx);CHKERRQ(ierr);
732801fbe65SHong Zhang     ierr = MatGetOwnershipRanges(B,&rstart);CHKERRQ(ierr);
733801fbe65SHong Zhang     k = 0;
734801fbe65SHong Zhang     for (proc=0; proc<mumps->size; proc++){
735801fbe65SHong Zhang       for (j=0; j<nrhs; j++){
736801fbe65SHong Zhang         for (i=rstart[proc]; i<rstart[proc+1]; i++){
737801fbe65SHong Zhang           iidx[j*M + i] = k;
738801fbe65SHong Zhang           idx[k++]      = j*M + i;
739801fbe65SHong Zhang         }
740801fbe65SHong Zhang       }
7412cd7d884SHong Zhang     }
7422cd7d884SHong Zhang 
743801fbe65SHong Zhang     if (!mumps->myid) {
744334c5f61SHong Zhang       ierr = VecCreateSeq(PETSC_COMM_SELF,nrhs*M,&b_seq);CHKERRQ(ierr);
745801fbe65SHong Zhang       ierr = ISCreateGeneral(PETSC_COMM_SELF,nrhs*M,idx,PETSC_COPY_VALUES,&is_to);CHKERRQ(ierr);
746801fbe65SHong Zhang       ierr = ISCreateStride(PETSC_COMM_SELF,nrhs*M,0,1,&is_from);CHKERRQ(ierr);
747801fbe65SHong Zhang     } else {
748334c5f61SHong Zhang       ierr = VecCreateSeq(PETSC_COMM_SELF,0,&b_seq);CHKERRQ(ierr);
749801fbe65SHong Zhang       ierr = ISCreateStride(PETSC_COMM_SELF,0,0,1,&is_to);CHKERRQ(ierr);
750801fbe65SHong Zhang       ierr = ISCreateStride(PETSC_COMM_SELF,0,0,1,&is_from);CHKERRQ(ierr);
751801fbe65SHong Zhang     }
752334c5f61SHong Zhang     ierr = VecScatterCreate(v_mpi,is_from,b_seq,is_to,&scat_rhs);CHKERRQ(ierr);
753334c5f61SHong Zhang     ierr = VecScatterBegin(scat_rhs,v_mpi,b_seq,INSERT_VALUES,SCATTER_FORWARD);CHKERRQ(ierr);
754801fbe65SHong Zhang     ierr = ISDestroy(&is_to);CHKERRQ(ierr);
755801fbe65SHong Zhang     ierr = ISDestroy(&is_from);CHKERRQ(ierr);
756334c5f61SHong Zhang     ierr = VecScatterEnd(scat_rhs,v_mpi,b_seq,INSERT_VALUES,SCATTER_FORWARD);CHKERRQ(ierr);
757801fbe65SHong Zhang 
758801fbe65SHong Zhang     if (!mumps->myid) { /* define rhs on the host */
759334c5f61SHong Zhang       ierr = VecGetArray(b_seq,&bray);CHKERRQ(ierr);
760940cd9d6SSatish Balay       mumps->id.rhs = (MumpsScalar*)bray;
761334c5f61SHong Zhang       ierr = VecRestoreArray(b_seq,&bray);CHKERRQ(ierr);
762801fbe65SHong Zhang     }
763801fbe65SHong Zhang 
764801fbe65SHong Zhang     /* solve phase */
765801fbe65SHong Zhang     /*-------------*/
766801fbe65SHong Zhang     mumps->id.job = JOB_SOLVE;
767801fbe65SHong Zhang     PetscMUMPS_c(&mumps->id);
768801fbe65SHong Zhang     if (mumps->id.INFOG(1) < 0) SETERRQ1(PETSC_COMM_SELF,PETSC_ERR_LIB,"Error reported by MUMPS in solve phase: INFOG(1)=%d\n",mumps->id.INFOG(1));
769801fbe65SHong Zhang 
770334c5f61SHong Zhang     /* scatter mumps distributed solution to petsc vector v_mpi, which shares local arrays with solution matrix X */
77174f0fcc7SHong Zhang     ierr = MatDenseGetArray(X,&array);CHKERRQ(ierr);
77274f0fcc7SHong Zhang     ierr = VecPlaceArray(v_mpi,array);CHKERRQ(ierr);
773801fbe65SHong Zhang 
774334c5f61SHong Zhang     /* create scatter scat_sol */
77571aed81dSHong Zhang     ierr = PetscMalloc1(nlsol_loc,&idxx);CHKERRQ(ierr);
77671aed81dSHong Zhang     ierr = ISCreateStride(PETSC_COMM_SELF,nlsol_loc,0,1,&is_from);CHKERRQ(ierr);
77771aed81dSHong Zhang     for (i=0; i<lsol_loc; i++) {
778334c5f61SHong Zhang       isol_loc[i] -= 1; /* change Fortran style to C style */
779334c5f61SHong Zhang       idxx[i] = iidx[isol_loc[i]];
780801fbe65SHong Zhang       for (j=1; j<nrhs; j++){
781334c5f61SHong Zhang         idxx[j*lsol_loc+i] = iidx[isol_loc[i]+j*M];
782801fbe65SHong Zhang       }
783801fbe65SHong Zhang     }
78471aed81dSHong Zhang     ierr = ISCreateGeneral(PETSC_COMM_SELF,nlsol_loc,idxx,PETSC_COPY_VALUES,&is_to);CHKERRQ(ierr);
785334c5f61SHong Zhang     ierr = VecScatterCreate(x_seq,is_from,v_mpi,is_to,&scat_sol);CHKERRQ(ierr);
786334c5f61SHong Zhang     ierr = VecScatterBegin(scat_sol,x_seq,v_mpi,INSERT_VALUES,SCATTER_FORWARD);CHKERRQ(ierr);
787801fbe65SHong Zhang     ierr = ISDestroy(&is_from);CHKERRQ(ierr);
788801fbe65SHong Zhang     ierr = ISDestroy(&is_to);CHKERRQ(ierr);
789334c5f61SHong Zhang     ierr = VecScatterEnd(scat_sol,x_seq,v_mpi,INSERT_VALUES,SCATTER_FORWARD);CHKERRQ(ierr);
790801fbe65SHong Zhang     ierr = MatDenseRestoreArray(X,&array);CHKERRQ(ierr);
79171aed81dSHong Zhang 
79271aed81dSHong Zhang     /* free spaces */
79371aed81dSHong Zhang     mumps->id.sol_loc = sol_loc_save;
79471aed81dSHong Zhang     mumps->id.isol_loc = isol_loc_save;
79571aed81dSHong Zhang 
79671aed81dSHong Zhang     ierr = PetscFree2(sol_loc,isol_loc);CHKERRQ(ierr);
797801fbe65SHong Zhang     ierr = PetscFree2(idx,iidx);CHKERRQ(ierr);
798801fbe65SHong Zhang     ierr = PetscFree(idxx);CHKERRQ(ierr);
79971aed81dSHong Zhang     ierr = VecDestroy(&x_seq);CHKERRQ(ierr);
80074f0fcc7SHong Zhang     ierr = VecDestroy(&v_mpi);CHKERRQ(ierr);
801334c5f61SHong Zhang     ierr = VecDestroy(&b_seq);CHKERRQ(ierr);
802334c5f61SHong Zhang     ierr = VecScatterDestroy(&scat_rhs);CHKERRQ(ierr);
803334c5f61SHong Zhang     ierr = VecScatterDestroy(&scat_sol);CHKERRQ(ierr);
804801fbe65SHong Zhang   }
805e0b74bf9SHong Zhang   PetscFunctionReturn(0);
806e0b74bf9SHong Zhang }
807e0b74bf9SHong Zhang 
808ace3df97SHong Zhang #if !defined(PETSC_USE_COMPLEX)
809a58c3f20SHong Zhang /*
810a58c3f20SHong Zhang   input:
811a58c3f20SHong Zhang    F:        numeric factor
812a58c3f20SHong Zhang   output:
813a58c3f20SHong Zhang    nneg:     total number of negative pivots
814a58c3f20SHong Zhang    nzero:    0
815a58c3f20SHong Zhang    npos:     (global dimension of F) - nneg
816a58c3f20SHong Zhang */
817a58c3f20SHong Zhang 
818a58c3f20SHong Zhang #undef __FUNCT__
819a58c3f20SHong Zhang #define __FUNCT__ "MatGetInertia_SBAIJMUMPS"
820dfbe8321SBarry Smith PetscErrorCode MatGetInertia_SBAIJMUMPS(Mat F,int *nneg,int *nzero,int *npos)
821a58c3f20SHong Zhang {
822a5e57a09SHong Zhang   Mat_MUMPS      *mumps =(Mat_MUMPS*)F->spptr;
823dfbe8321SBarry Smith   PetscErrorCode ierr;
824c1490034SHong Zhang   PetscMPIInt    size;
825a58c3f20SHong Zhang 
826a58c3f20SHong Zhang   PetscFunctionBegin;
827ce94432eSBarry Smith   ierr = MPI_Comm_size(PetscObjectComm((PetscObject)F),&size);CHKERRQ(ierr);
828bcb30aebSHong 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 */
829a5e57a09SHong Zhang   if (size > 1 && mumps->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",mumps->id.INFOG(13));
830ed85ac9fSHong Zhang 
831710ac8efSHong Zhang   if (nneg) *nneg = mumps->id.INFOG(12);
832ed85ac9fSHong Zhang   if (nzero || npos) {
833ed85ac9fSHong Zhang     if (mumps->id.ICNTL(24) != 1) SETERRQ(PETSC_COMM_SELF,PETSC_ERR_ARG_WRONG,"-mat_mumps_icntl_24 must be set as 1 for null pivot row detection");
834710ac8efSHong Zhang     if (nzero) *nzero = mumps->id.INFOG(28);
835710ac8efSHong Zhang     if (npos) *npos   = F->rmap->N - (mumps->id.INFOG(12) + mumps->id.INFOG(28));
836a58c3f20SHong Zhang   }
837a58c3f20SHong Zhang   PetscFunctionReturn(0);
838a58c3f20SHong Zhang }
839ace3df97SHong Zhang #endif /* !defined(PETSC_USE_COMPLEX) */
840a58c3f20SHong Zhang 
841397b6df1SKris Buschelman #undef __FUNCT__
842f6c57405SHong Zhang #define __FUNCT__ "MatFactorNumeric_MUMPS"
8430481f469SBarry Smith PetscErrorCode MatFactorNumeric_MUMPS(Mat F,Mat A,const MatFactorInfo *info)
844af281ebdSHong Zhang {
845a5e57a09SHong Zhang   Mat_MUMPS      *mumps =(Mat_MUMPS*)(F)->spptr;
8466849ba73SBarry Smith   PetscErrorCode ierr;
847e09efc27SHong Zhang   Mat            F_diag;
848ace3abfcSBarry Smith   PetscBool      isMPIAIJ;
849397b6df1SKris Buschelman 
850397b6df1SKris Buschelman   PetscFunctionBegin;
851a5e57a09SHong Zhang   ierr = (*mumps->ConvertToTriples)(A, 1, MAT_REUSE_MATRIX, &mumps->nz, &mumps->irn, &mumps->jcn, &mumps->val);CHKERRQ(ierr);
852397b6df1SKris Buschelman 
853397b6df1SKris Buschelman   /* numerical factorization phase */
854329ec9b3SHong Zhang   /*-------------------------------*/
855a5e57a09SHong Zhang   mumps->id.job = JOB_FACTNUMERIC;
8564e34a73bSHong Zhang   if (!mumps->id.ICNTL(18)) { /* A is centralized */
857a5e57a09SHong Zhang     if (!mumps->myid) {
858940cd9d6SSatish Balay       mumps->id.a = (MumpsScalar*)mumps->val;
859397b6df1SKris Buschelman     }
860397b6df1SKris Buschelman   } else {
861940cd9d6SSatish Balay     mumps->id.a_loc = (MumpsScalar*)mumps->val;
862397b6df1SKris Buschelman   }
863a5e57a09SHong Zhang   PetscMUMPS_c(&mumps->id);
864a5e57a09SHong Zhang   if (mumps->id.INFOG(1) < 0) {
865151787a6SHong Zhang     if (mumps->id.INFO(1) == -13) {
866151787a6SHong Zhang       if (mumps->id.INFO(2) < 0) {
867151787a6SHong Zhang         SETERRQ1(PETSC_COMM_SELF,PETSC_ERR_LIB,"Error reported by MUMPS in numerical factorization phase: Cannot allocate required memory %d megabytes\n",-mumps->id.INFO(2));
868151787a6SHong Zhang       } else {
869151787a6SHong Zhang         SETERRQ1(PETSC_COMM_SELF,PETSC_ERR_LIB,"Error reported by MUMPS in numerical factorization phase: Cannot allocate required memory %d bytes\n",mumps->id.INFO(2));
870151787a6SHong Zhang       }
871151787a6SHong Zhang     } else SETERRQ2(PETSC_COMM_SELF,PETSC_ERR_LIB,"Error reported by MUMPS in numerical factorization phase: INFO(1)=%d, INFO(2)=%d\n",mumps->id.INFO(1),mumps->id.INFO(2));
872397b6df1SKris Buschelman   }
873a5e57a09SHong Zhang   if (!mumps->myid && mumps->id.ICNTL(16) > 0) SETERRQ1(PETSC_COMM_SELF,PETSC_ERR_LIB,"  mumps->id.ICNTL(16):=%d\n",mumps->id.INFOG(16));
874397b6df1SKris Buschelman 
875dcd589f8SShri Abhyankar   (F)->assembled      = PETSC_TRUE;
876a5e57a09SHong Zhang   mumps->matstruc     = SAME_NONZERO_PATTERN;
877a5e57a09SHong Zhang   mumps->CleanUpMUMPS = PETSC_TRUE;
87867877ebaSShri Abhyankar 
879a5e57a09SHong Zhang   if (mumps->size > 1) {
88067877ebaSShri Abhyankar     PetscInt    lsol_loc;
88167877ebaSShri Abhyankar     PetscScalar *sol_loc;
8822205254eSKarl Rupp 
883c2093ab7SHong Zhang     ierr = PetscObjectTypeCompare((PetscObject)A,MATMPIAIJ,&isMPIAIJ);CHKERRQ(ierr);
884c2093ab7SHong Zhang     if (isMPIAIJ) F_diag = ((Mat_MPIAIJ*)(F)->data)->A;
885c2093ab7SHong Zhang     else F_diag = ((Mat_MPISBAIJ*)(F)->data)->A;
886c2093ab7SHong Zhang     F_diag->assembled = PETSC_TRUE;
887c2093ab7SHong Zhang 
888c2093ab7SHong Zhang     /* distributed solution; Create x_seq=sol_loc for repeated use */
889c2093ab7SHong Zhang     if (mumps->x_seq) {
890c2093ab7SHong Zhang       ierr = VecScatterDestroy(&mumps->scat_sol);CHKERRQ(ierr);
891c2093ab7SHong Zhang       ierr = PetscFree2(mumps->id.sol_loc,mumps->id.isol_loc);CHKERRQ(ierr);
892c2093ab7SHong Zhang       ierr = VecDestroy(&mumps->x_seq);CHKERRQ(ierr);
893c2093ab7SHong Zhang     }
894a5e57a09SHong Zhang     lsol_loc = mumps->id.INFO(23); /* length of sol_loc */
895dcca6d9dSJed Brown     ierr = PetscMalloc2(lsol_loc,&sol_loc,lsol_loc,&mumps->id.isol_loc);CHKERRQ(ierr);
896a5e57a09SHong Zhang     mumps->id.lsol_loc = lsol_loc;
897940cd9d6SSatish Balay     mumps->id.sol_loc = (MumpsScalar*)sol_loc;
898a5e57a09SHong Zhang     ierr = VecCreateSeqWithArray(PETSC_COMM_SELF,1,lsol_loc,sol_loc,&mumps->x_seq);CHKERRQ(ierr);
89967877ebaSShri Abhyankar   }
900397b6df1SKris Buschelman   PetscFunctionReturn(0);
901397b6df1SKris Buschelman }
902397b6df1SKris Buschelman 
9039a2535b5SHong Zhang /* Sets MUMPS options from the options database */
904dcd589f8SShri Abhyankar #undef __FUNCT__
9059a2535b5SHong Zhang #define __FUNCT__ "PetscSetMUMPSFromOptions"
9069a2535b5SHong Zhang PetscErrorCode PetscSetMUMPSFromOptions(Mat F, Mat A)
907dcd589f8SShri Abhyankar {
9089a2535b5SHong Zhang   Mat_MUMPS      *mumps = (Mat_MUMPS*)F->spptr;
909dcd589f8SShri Abhyankar   PetscErrorCode ierr;
910b34f08ffSHong Zhang   PetscInt       icntl,info[40],i,ninfo=40;
911ace3abfcSBarry Smith   PetscBool      flg;
912dcd589f8SShri Abhyankar 
913dcd589f8SShri Abhyankar   PetscFunctionBegin;
914ce94432eSBarry Smith   ierr = PetscOptionsBegin(PetscObjectComm((PetscObject)A),((PetscObject)A)->prefix,"MUMPS Options","Mat");CHKERRQ(ierr);
9159a2535b5SHong Zhang   ierr = PetscOptionsInt("-mat_mumps_icntl_1","ICNTL(1): output stream for error messages","None",mumps->id.ICNTL(1),&icntl,&flg);CHKERRQ(ierr);
9169a2535b5SHong Zhang   if (flg) mumps->id.ICNTL(1) = icntl;
9179a2535b5SHong Zhang   ierr = PetscOptionsInt("-mat_mumps_icntl_2","ICNTL(2): output stream for diagnostic printing, statistics, and warning","None",mumps->id.ICNTL(2),&icntl,&flg);CHKERRQ(ierr);
9189a2535b5SHong Zhang   if (flg) mumps->id.ICNTL(2) = icntl;
9199a2535b5SHong Zhang   ierr = PetscOptionsInt("-mat_mumps_icntl_3","ICNTL(3): output stream for global information, collected on the host","None",mumps->id.ICNTL(3),&icntl,&flg);CHKERRQ(ierr);
9209a2535b5SHong Zhang   if (flg) mumps->id.ICNTL(3) = icntl;
921dcd589f8SShri Abhyankar 
9229a2535b5SHong Zhang   ierr = PetscOptionsInt("-mat_mumps_icntl_4","ICNTL(4): level of printing (0 to 4)","None",mumps->id.ICNTL(4),&icntl,&flg);CHKERRQ(ierr);
9239a2535b5SHong Zhang   if (flg) mumps->id.ICNTL(4) = icntl;
9249a2535b5SHong Zhang   if (mumps->id.ICNTL(4) || PetscLogPrintInfo) mumps->id.ICNTL(3) = 6; /* resume MUMPS default id.ICNTL(3) = 6 */
9259a2535b5SHong Zhang 
926d341cd04SHong Zhang   ierr = PetscOptionsInt("-mat_mumps_icntl_6","ICNTL(6): permutes to a zero-free diagonal and/or scale the matrix (0 to 7)","None",mumps->id.ICNTL(6),&icntl,&flg);CHKERRQ(ierr);
9279a2535b5SHong Zhang   if (flg) mumps->id.ICNTL(6) = icntl;
9289a2535b5SHong Zhang 
929d341cd04SHong Zhang   ierr = PetscOptionsInt("-mat_mumps_icntl_7","ICNTL(7): computes a symmetric permutation in sequential analysis (0 to 7). 3=Scotch, 4=PORD, 5=Metis","None",mumps->id.ICNTL(7),&icntl,&flg);CHKERRQ(ierr);
930dcd589f8SShri Abhyankar   if (flg) {
9312205254eSKarl Rupp     if (icntl== 1 && mumps->size > 1) 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");
9322205254eSKarl Rupp     else mumps->id.ICNTL(7) = icntl;
933dcd589f8SShri Abhyankar   }
934e0b74bf9SHong Zhang 
9350298fd71SBarry Smith   ierr = PetscOptionsInt("-mat_mumps_icntl_8","ICNTL(8): scaling strategy (-2 to 8 or 77)","None",mumps->id.ICNTL(8),&mumps->id.ICNTL(8),NULL);CHKERRQ(ierr);
936d341cd04SHong Zhang   /* ierr = PetscOptionsInt("-mat_mumps_icntl_9","ICNTL(9): computes the solution using A or A^T","None",mumps->id.ICNTL(9),&mumps->id.ICNTL(9),NULL);CHKERRQ(ierr); handled by MatSolveTranspose_MUMPS() */
9370298fd71SBarry Smith   ierr = PetscOptionsInt("-mat_mumps_icntl_10","ICNTL(10): max num of refinements","None",mumps->id.ICNTL(10),&mumps->id.ICNTL(10),NULL);CHKERRQ(ierr);
938d341cd04SHong Zhang   ierr = PetscOptionsInt("-mat_mumps_icntl_11","ICNTL(11): statistics related to an error analysis (via -ksp_view)","None",mumps->id.ICNTL(11),&mumps->id.ICNTL(11),NULL);CHKERRQ(ierr);
939d341cd04SHong Zhang   ierr = PetscOptionsInt("-mat_mumps_icntl_12","ICNTL(12): an ordering strategy for symmetric matrices (0 to 3)","None",mumps->id.ICNTL(12),&mumps->id.ICNTL(12),NULL);CHKERRQ(ierr);
940d341cd04SHong Zhang   ierr = PetscOptionsInt("-mat_mumps_icntl_13","ICNTL(13): parallelism of the root node (enable ScaLAPACK) and its splitting","None",mumps->id.ICNTL(13),&mumps->id.ICNTL(13),NULL);CHKERRQ(ierr);
941d341cd04SHong Zhang   ierr = PetscOptionsInt("-mat_mumps_icntl_14","ICNTL(14): percentage increase in the estimated working space","None",mumps->id.ICNTL(14),&mumps->id.ICNTL(14),NULL);CHKERRQ(ierr);
942d341cd04SHong Zhang   ierr = PetscOptionsInt("-mat_mumps_icntl_19","ICNTL(19): computes the Schur complement","None",mumps->id.ICNTL(19),&mumps->id.ICNTL(19),NULL);CHKERRQ(ierr);
9434e34a73bSHong Zhang   /* ierr = PetscOptionsInt("-mat_mumps_icntl_20","ICNTL(20): the format (dense or sparse) of the right-hand sides","None",mumps->id.ICNTL(20),&mumps->id.ICNTL(20),NULL);CHKERRQ(ierr); -- sparse rhs is not supported in PETSc API */
944d341cd04SHong Zhang   /* ierr = PetscOptionsInt("-mat_mumps_icntl_21","ICNTL(21): the distribution (centralized or distributed) of the solution vectors","None",mumps->id.ICNTL(21),&mumps->id.ICNTL(21),NULL);CHKERRQ(ierr); we only use distributed solution vector */
9459a2535b5SHong Zhang 
946d341cd04SHong Zhang   ierr = PetscOptionsInt("-mat_mumps_icntl_22","ICNTL(22): in-core/out-of-core factorization and solve (0 or 1)","None",mumps->id.ICNTL(22),&mumps->id.ICNTL(22),NULL);CHKERRQ(ierr);
9470298fd71SBarry Smith   ierr = PetscOptionsInt("-mat_mumps_icntl_23","ICNTL(23): max size of the working memory (MB) that can allocate per processor","None",mumps->id.ICNTL(23),&mumps->id.ICNTL(23),NULL);CHKERRQ(ierr);
9480298fd71SBarry Smith   ierr = PetscOptionsInt("-mat_mumps_icntl_24","ICNTL(24): detection of null pivot rows (0 or 1)","None",mumps->id.ICNTL(24),&mumps->id.ICNTL(24),NULL);CHKERRQ(ierr);
9499a2535b5SHong Zhang   if (mumps->id.ICNTL(24)) {
9509a2535b5SHong Zhang     mumps->id.ICNTL(13) = 1; /* turn-off ScaLAPACK to help with the correct detection of null pivots */
951d7ebd59bSHong Zhang   }
952d7ebd59bSHong Zhang 
953d341cd04SHong Zhang   ierr = PetscOptionsInt("-mat_mumps_icntl_25","ICNTL(25): compute a solution of a deficient matrix and a null space basis","None",mumps->id.ICNTL(25),&mumps->id.ICNTL(25),NULL);CHKERRQ(ierr);
954d341cd04SHong Zhang   ierr = PetscOptionsInt("-mat_mumps_icntl_26","ICNTL(26): drives the solution phase if a Schur complement matrix","None",mumps->id.ICNTL(26),&mumps->id.ICNTL(26),NULL);CHKERRQ(ierr);
9552cd7d884SHong Zhang   ierr = PetscOptionsInt("-mat_mumps_icntl_27","ICNTL(27): the blocking size for multiple right-hand sides","None",mumps->id.ICNTL(27),&mumps->id.ICNTL(27),NULL);CHKERRQ(ierr);
9560298fd71SBarry Smith   ierr = PetscOptionsInt("-mat_mumps_icntl_28","ICNTL(28): use 1 for sequential analysis and ictnl(7) ordering, or 2 for parallel analysis and ictnl(29) ordering","None",mumps->id.ICNTL(28),&mumps->id.ICNTL(28),NULL);CHKERRQ(ierr);
957d341cd04SHong Zhang   ierr = PetscOptionsInt("-mat_mumps_icntl_29","ICNTL(29): parallel ordering 1 = ptscotch, 2 = parmetis","None",mumps->id.ICNTL(29),&mumps->id.ICNTL(29),NULL);CHKERRQ(ierr);
9580298fd71SBarry Smith   ierr = PetscOptionsInt("-mat_mumps_icntl_30","ICNTL(30): compute user-specified set of entries in inv(A)","None",mumps->id.ICNTL(30),&mumps->id.ICNTL(30),NULL);CHKERRQ(ierr);
959d341cd04SHong Zhang   ierr = PetscOptionsInt("-mat_mumps_icntl_31","ICNTL(31): indicates which factors may be discarded during factorization","None",mumps->id.ICNTL(31),&mumps->id.ICNTL(31),NULL);CHKERRQ(ierr);
9604e34a73bSHong Zhang   /* ierr = PetscOptionsInt("-mat_mumps_icntl_32","ICNTL(32): performs the forward elemination of the right-hand sides during factorization","None",mumps->id.ICNTL(32),&mumps->id.ICNTL(32),NULL);CHKERRQ(ierr);  -- not supported by PETSc API */
9610298fd71SBarry Smith   ierr = PetscOptionsInt("-mat_mumps_icntl_33","ICNTL(33): compute determinant","None",mumps->id.ICNTL(33),&mumps->id.ICNTL(33),NULL);CHKERRQ(ierr);
962dcd589f8SShri Abhyankar 
9630298fd71SBarry Smith   ierr = PetscOptionsReal("-mat_mumps_cntl_1","CNTL(1): relative pivoting threshold","None",mumps->id.CNTL(1),&mumps->id.CNTL(1),NULL);CHKERRQ(ierr);
9640298fd71SBarry Smith   ierr = PetscOptionsReal("-mat_mumps_cntl_2","CNTL(2): stopping criterion of refinement","None",mumps->id.CNTL(2),&mumps->id.CNTL(2),NULL);CHKERRQ(ierr);
9650298fd71SBarry Smith   ierr = PetscOptionsReal("-mat_mumps_cntl_3","CNTL(3): absolute pivoting threshold","None",mumps->id.CNTL(3),&mumps->id.CNTL(3),NULL);CHKERRQ(ierr);
9660298fd71SBarry Smith   ierr = PetscOptionsReal("-mat_mumps_cntl_4","CNTL(4): value for static pivoting","None",mumps->id.CNTL(4),&mumps->id.CNTL(4),NULL);CHKERRQ(ierr);
9670298fd71SBarry Smith   ierr = PetscOptionsReal("-mat_mumps_cntl_5","CNTL(5): fixation for null pivots","None",mumps->id.CNTL(5),&mumps->id.CNTL(5),NULL);CHKERRQ(ierr);
968e5bb22a1SHong Zhang 
9690298fd71SBarry Smith   ierr = PetscOptionsString("-mat_mumps_ooc_tmpdir", "out of core directory", "None", mumps->id.ooc_tmpdir, mumps->id.ooc_tmpdir, 256, NULL);
970b34f08ffSHong Zhang 
97116d797efSHong Zhang   ierr = PetscOptionsIntArray("-mat_mumps_view_info","request INFO local to each processor","",info,&ninfo,NULL);CHKERRQ(ierr);
972b34f08ffSHong Zhang   if (ninfo) {
973b34f08ffSHong Zhang     if (ninfo > 40) SETERRQ1(PETSC_COMM_SELF,PETSC_ERR_USER,"number of INFO %d must <= 40\n",ninfo);
974b34f08ffSHong Zhang     ierr = PetscMalloc1(ninfo,&mumps->info);CHKERRQ(ierr);
975b34f08ffSHong Zhang     mumps->ninfo = ninfo;
976b34f08ffSHong Zhang     for (i=0; i<ninfo; i++) {
977b34f08ffSHong Zhang       if (info[i] < 0 || info[i]>40) {
978b34f08ffSHong Zhang         SETERRQ1(PETSC_COMM_SELF,PETSC_ERR_USER,"index of INFO %d must between 1 and 40\n",ninfo);
979b34f08ffSHong Zhang       } else {
980b34f08ffSHong Zhang         mumps->info[i] = info[i];
981b34f08ffSHong Zhang       }
982b34f08ffSHong Zhang     }
983b34f08ffSHong Zhang   }
984b34f08ffSHong Zhang 
985dcd589f8SShri Abhyankar   PetscOptionsEnd();
986dcd589f8SShri Abhyankar   PetscFunctionReturn(0);
987dcd589f8SShri Abhyankar }
988dcd589f8SShri Abhyankar 
989dcd589f8SShri Abhyankar #undef __FUNCT__
990dcd589f8SShri Abhyankar #define __FUNCT__ "PetscInitializeMUMPS"
991f697e70eSHong Zhang PetscErrorCode PetscInitializeMUMPS(Mat A,Mat_MUMPS *mumps)
992dcd589f8SShri Abhyankar {
993dcd589f8SShri Abhyankar   PetscErrorCode ierr;
994dcd589f8SShri Abhyankar 
995dcd589f8SShri Abhyankar   PetscFunctionBegin;
996ce94432eSBarry Smith   ierr = MPI_Comm_rank(PetscObjectComm((PetscObject)A), &mumps->myid);
997ce94432eSBarry Smith   ierr = MPI_Comm_size(PetscObjectComm((PetscObject)A),&mumps->size);CHKERRQ(ierr);
998ce94432eSBarry Smith   ierr = MPI_Comm_dup(PetscObjectComm((PetscObject)A),&(mumps->comm_mumps));CHKERRQ(ierr);
9992205254eSKarl Rupp 
1000f697e70eSHong Zhang   mumps->id.comm_fortran = MPI_Comm_c2f(mumps->comm_mumps);
1001f697e70eSHong Zhang 
1002f697e70eSHong Zhang   mumps->id.job = JOB_INIT;
1003f697e70eSHong Zhang   mumps->id.par = 1;  /* host participates factorizaton and solve */
1004f697e70eSHong Zhang   mumps->id.sym = mumps->sym;
10052907cef9SHong Zhang   PetscMUMPS_c(&mumps->id);
1006f697e70eSHong Zhang 
1007f697e70eSHong Zhang   mumps->CleanUpMUMPS = PETSC_FALSE;
10080298fd71SBarry Smith   mumps->scat_rhs     = NULL;
10090298fd71SBarry Smith   mumps->scat_sol     = NULL;
10109a2535b5SHong Zhang 
101170544d5fSHong Zhang   /* set PETSc-MUMPS default options - override MUMPS default */
10129a2535b5SHong Zhang   mumps->id.ICNTL(3) = 0;
10139a2535b5SHong Zhang   mumps->id.ICNTL(4) = 0;
10149a2535b5SHong Zhang   if (mumps->size == 1) {
10159a2535b5SHong Zhang     mumps->id.ICNTL(18) = 0;   /* centralized assembled matrix input */
10169a2535b5SHong Zhang   } else {
10179a2535b5SHong Zhang     mumps->id.ICNTL(18) = 3;   /* distributed assembled matrix input */
10184e34a73bSHong Zhang     mumps->id.ICNTL(20) = 0;   /* rhs is in dense format */
101970544d5fSHong Zhang     mumps->id.ICNTL(21) = 1;   /* distributed solution */
10209a2535b5SHong Zhang   }
1021*6444a565SStefano Zampini 
1022*6444a565SStefano Zampini   /* schur */
1023*6444a565SStefano Zampini   mumps->id.size_schur = 0;
1024*6444a565SStefano Zampini   mumps->id.listvar_schur = NULL;
1025*6444a565SStefano Zampini   mumps->id.schur = NULL;
1026dcd589f8SShri Abhyankar   PetscFunctionReturn(0);
1027dcd589f8SShri Abhyankar }
1028dcd589f8SShri Abhyankar 
1029a5e57a09SHong Zhang /* Note Petsc r(=c) permutation is used when mumps->id.ICNTL(7)==1 with centralized assembled matrix input; otherwise r and c are ignored */
1030397b6df1SKris Buschelman #undef __FUNCT__
1031f0c56d0fSKris Buschelman #define __FUNCT__ "MatLUFactorSymbolic_AIJMUMPS"
10320481f469SBarry Smith PetscErrorCode MatLUFactorSymbolic_AIJMUMPS(Mat F,Mat A,IS r,IS c,const MatFactorInfo *info)
1033b24902e0SBarry Smith {
1034a5e57a09SHong Zhang   Mat_MUMPS      *mumps = (Mat_MUMPS*)F->spptr;
1035dcd589f8SShri Abhyankar   PetscErrorCode ierr;
103667877ebaSShri Abhyankar   Vec            b;
103767877ebaSShri Abhyankar   IS             is_iden;
103867877ebaSShri Abhyankar   const PetscInt M = A->rmap->N;
1039397b6df1SKris Buschelman 
1040397b6df1SKris Buschelman   PetscFunctionBegin;
1041a5e57a09SHong Zhang   mumps->matstruc = DIFFERENT_NONZERO_PATTERN;
1042dcd589f8SShri Abhyankar 
10439a2535b5SHong Zhang   /* Set MUMPS options from the options database */
10449a2535b5SHong Zhang   ierr = PetscSetMUMPSFromOptions(F,A);CHKERRQ(ierr);
1045dcd589f8SShri Abhyankar 
1046a5e57a09SHong Zhang   ierr = (*mumps->ConvertToTriples)(A, 1, MAT_INITIAL_MATRIX, &mumps->nz, &mumps->irn, &mumps->jcn, &mumps->val);CHKERRQ(ierr);
1047dcd589f8SShri Abhyankar 
104867877ebaSShri Abhyankar   /* analysis phase */
104967877ebaSShri Abhyankar   /*----------------*/
1050a5e57a09SHong Zhang   mumps->id.job = JOB_FACTSYMBOLIC;
1051a5e57a09SHong Zhang   mumps->id.n   = M;
1052a5e57a09SHong Zhang   switch (mumps->id.ICNTL(18)) {
105367877ebaSShri Abhyankar   case 0:  /* centralized assembled matrix input */
1054a5e57a09SHong Zhang     if (!mumps->myid) {
1055a5e57a09SHong Zhang       mumps->id.nz =mumps->nz; mumps->id.irn=mumps->irn; mumps->id.jcn=mumps->jcn;
1056a5e57a09SHong Zhang       if (mumps->id.ICNTL(6)>1) {
1057940cd9d6SSatish Balay         mumps->id.a = (MumpsScalar*)mumps->val;
105867877ebaSShri Abhyankar       }
1059a5e57a09SHong Zhang       if (mumps->id.ICNTL(7) == 1) { /* use user-provide matrix ordering - assuming r = c ordering */
10605248a706SHong Zhang         /*
10615248a706SHong Zhang         PetscBool      flag;
10625248a706SHong Zhang         ierr = ISEqual(r,c,&flag);CHKERRQ(ierr);
10635248a706SHong Zhang         if (!flag) SETERRQ(PETSC_COMM_SELF,PETSC_ERR_USER,"row_perm != col_perm");
10645248a706SHong Zhang         ierr = ISView(r,PETSC_VIEWER_STDOUT_SELF);
10655248a706SHong Zhang          */
1066a5e57a09SHong Zhang         if (!mumps->myid) {
1067e0b74bf9SHong Zhang           const PetscInt *idx;
1068e0b74bf9SHong Zhang           PetscInt       i,*perm_in;
10692205254eSKarl Rupp 
1070785e854fSJed Brown           ierr = PetscMalloc1(M,&perm_in);CHKERRQ(ierr);
1071e0b74bf9SHong Zhang           ierr = ISGetIndices(r,&idx);CHKERRQ(ierr);
10722205254eSKarl Rupp 
1073a5e57a09SHong Zhang           mumps->id.perm_in = perm_in;
1074e0b74bf9SHong Zhang           for (i=0; i<M; i++) perm_in[i] = idx[i]+1; /* perm_in[]: start from 1, not 0! */
1075e0b74bf9SHong Zhang           ierr = ISRestoreIndices(r,&idx);CHKERRQ(ierr);
1076e0b74bf9SHong Zhang         }
1077e0b74bf9SHong Zhang       }
107867877ebaSShri Abhyankar     }
107967877ebaSShri Abhyankar     break;
108067877ebaSShri Abhyankar   case 3:  /* distributed assembled matrix input (size>1) */
1081a5e57a09SHong Zhang     mumps->id.nz_loc = mumps->nz;
1082a5e57a09SHong Zhang     mumps->id.irn_loc=mumps->irn; mumps->id.jcn_loc=mumps->jcn;
1083a5e57a09SHong Zhang     if (mumps->id.ICNTL(6)>1) {
1084940cd9d6SSatish Balay       mumps->id.a_loc = (MumpsScalar*)mumps->val;
108567877ebaSShri Abhyankar     }
108667877ebaSShri Abhyankar     /* MUMPS only supports centralized rhs. Create scatter scat_rhs for repeated use in MatSolve() */
1087a5e57a09SHong Zhang     if (!mumps->myid) {
10882cd7d884SHong Zhang       ierr = VecCreateSeq(PETSC_COMM_SELF,A->rmap->N,&mumps->b_seq);CHKERRQ(ierr);
10892cd7d884SHong Zhang       ierr = ISCreateStride(PETSC_COMM_SELF,A->rmap->N,0,1,&is_iden);CHKERRQ(ierr);
109067877ebaSShri Abhyankar     } else {
1091a5e57a09SHong Zhang       ierr = VecCreateSeq(PETSC_COMM_SELF,0,&mumps->b_seq);CHKERRQ(ierr);
109267877ebaSShri Abhyankar       ierr = ISCreateStride(PETSC_COMM_SELF,0,0,1,&is_iden);CHKERRQ(ierr);
109367877ebaSShri Abhyankar     }
10942a7a6963SBarry Smith     ierr = MatCreateVecs(A,NULL,&b);CHKERRQ(ierr);
1095a5e57a09SHong Zhang     ierr = VecScatterCreate(b,is_iden,mumps->b_seq,is_iden,&mumps->scat_rhs);CHKERRQ(ierr);
10966bf464f9SBarry Smith     ierr = ISDestroy(&is_iden);CHKERRQ(ierr);
10976bf464f9SBarry Smith     ierr = VecDestroy(&b);CHKERRQ(ierr);
109867877ebaSShri Abhyankar     break;
109967877ebaSShri Abhyankar   }
1100a5e57a09SHong Zhang   PetscMUMPS_c(&mumps->id);
1101a5e57a09SHong Zhang   if (mumps->id.INFOG(1) < 0) SETERRQ1(PETSC_COMM_SELF,PETSC_ERR_LIB,"Error reported by MUMPS in analysis phase: INFOG(1)=%d\n",mumps->id.INFOG(1));
110267877ebaSShri Abhyankar 
1103719d5645SBarry Smith   F->ops->lufactornumeric = MatFactorNumeric_MUMPS;
1104dcd589f8SShri Abhyankar   F->ops->solve           = MatSolve_MUMPS;
110551d5961aSHong Zhang   F->ops->solvetranspose  = MatSolveTranspose_MUMPS;
11064e34a73bSHong Zhang   F->ops->matsolve        = MatMatSolve_MUMPS;
1107b24902e0SBarry Smith   PetscFunctionReturn(0);
1108b24902e0SBarry Smith }
1109b24902e0SBarry Smith 
1110450b117fSShri Abhyankar /* Note the Petsc r and c permutations are ignored */
1111450b117fSShri Abhyankar #undef __FUNCT__
1112450b117fSShri Abhyankar #define __FUNCT__ "MatLUFactorSymbolic_BAIJMUMPS"
1113450b117fSShri Abhyankar PetscErrorCode MatLUFactorSymbolic_BAIJMUMPS(Mat F,Mat A,IS r,IS c,const MatFactorInfo *info)
1114450b117fSShri Abhyankar {
1115a5e57a09SHong Zhang   Mat_MUMPS      *mumps = (Mat_MUMPS*)F->spptr;
1116dcd589f8SShri Abhyankar   PetscErrorCode ierr;
111767877ebaSShri Abhyankar   Vec            b;
111867877ebaSShri Abhyankar   IS             is_iden;
111967877ebaSShri Abhyankar   const PetscInt M = A->rmap->N;
1120450b117fSShri Abhyankar 
1121450b117fSShri Abhyankar   PetscFunctionBegin;
1122a5e57a09SHong Zhang   mumps->matstruc = DIFFERENT_NONZERO_PATTERN;
1123dcd589f8SShri Abhyankar 
11249a2535b5SHong Zhang   /* Set MUMPS options from the options database */
11259a2535b5SHong Zhang   ierr = PetscSetMUMPSFromOptions(F,A);CHKERRQ(ierr);
1126dcd589f8SShri Abhyankar 
1127a5e57a09SHong Zhang   ierr = (*mumps->ConvertToTriples)(A, 1, MAT_INITIAL_MATRIX, &mumps->nz, &mumps->irn, &mumps->jcn, &mumps->val);CHKERRQ(ierr);
112867877ebaSShri Abhyankar 
112967877ebaSShri Abhyankar   /* analysis phase */
113067877ebaSShri Abhyankar   /*----------------*/
1131a5e57a09SHong Zhang   mumps->id.job = JOB_FACTSYMBOLIC;
1132a5e57a09SHong Zhang   mumps->id.n   = M;
1133a5e57a09SHong Zhang   switch (mumps->id.ICNTL(18)) {
113467877ebaSShri Abhyankar   case 0:  /* centralized assembled matrix input */
1135a5e57a09SHong Zhang     if (!mumps->myid) {
1136a5e57a09SHong Zhang       mumps->id.nz =mumps->nz; mumps->id.irn=mumps->irn; mumps->id.jcn=mumps->jcn;
1137a5e57a09SHong Zhang       if (mumps->id.ICNTL(6)>1) {
1138940cd9d6SSatish Balay         mumps->id.a = (MumpsScalar*)mumps->val;
113967877ebaSShri Abhyankar       }
114067877ebaSShri Abhyankar     }
114167877ebaSShri Abhyankar     break;
114267877ebaSShri Abhyankar   case 3:  /* distributed assembled matrix input (size>1) */
1143a5e57a09SHong Zhang     mumps->id.nz_loc = mumps->nz;
1144a5e57a09SHong Zhang     mumps->id.irn_loc=mumps->irn; mumps->id.jcn_loc=mumps->jcn;
1145a5e57a09SHong Zhang     if (mumps->id.ICNTL(6)>1) {
1146940cd9d6SSatish Balay       mumps->id.a_loc = (MumpsScalar*)mumps->val;
114767877ebaSShri Abhyankar     }
114867877ebaSShri Abhyankar     /* MUMPS only supports centralized rhs. Create scatter scat_rhs for repeated use in MatSolve() */
1149a5e57a09SHong Zhang     if (!mumps->myid) {
1150a5e57a09SHong Zhang       ierr = VecCreateSeq(PETSC_COMM_SELF,A->cmap->N,&mumps->b_seq);CHKERRQ(ierr);
115167877ebaSShri Abhyankar       ierr = ISCreateStride(PETSC_COMM_SELF,A->cmap->N,0,1,&is_iden);CHKERRQ(ierr);
115267877ebaSShri Abhyankar     } else {
1153a5e57a09SHong Zhang       ierr = VecCreateSeq(PETSC_COMM_SELF,0,&mumps->b_seq);CHKERRQ(ierr);
115467877ebaSShri Abhyankar       ierr = ISCreateStride(PETSC_COMM_SELF,0,0,1,&is_iden);CHKERRQ(ierr);
115567877ebaSShri Abhyankar     }
11562a7a6963SBarry Smith     ierr = MatCreateVecs(A,NULL,&b);CHKERRQ(ierr);
1157a5e57a09SHong Zhang     ierr = VecScatterCreate(b,is_iden,mumps->b_seq,is_iden,&mumps->scat_rhs);CHKERRQ(ierr);
11586bf464f9SBarry Smith     ierr = ISDestroy(&is_iden);CHKERRQ(ierr);
11596bf464f9SBarry Smith     ierr = VecDestroy(&b);CHKERRQ(ierr);
116067877ebaSShri Abhyankar     break;
116167877ebaSShri Abhyankar   }
1162a5e57a09SHong Zhang   PetscMUMPS_c(&mumps->id);
1163a5e57a09SHong Zhang   if (mumps->id.INFOG(1) < 0) SETERRQ1(PETSC_COMM_SELF,PETSC_ERR_LIB,"Error reported by MUMPS in analysis phase: INFOG(1)=%d\n",mumps->id.INFOG(1));
116467877ebaSShri Abhyankar 
1165450b117fSShri Abhyankar   F->ops->lufactornumeric = MatFactorNumeric_MUMPS;
1166dcd589f8SShri Abhyankar   F->ops->solve           = MatSolve_MUMPS;
116751d5961aSHong Zhang   F->ops->solvetranspose  = MatSolveTranspose_MUMPS;
1168450b117fSShri Abhyankar   PetscFunctionReturn(0);
1169450b117fSShri Abhyankar }
1170b24902e0SBarry Smith 
1171141f4205SHong Zhang /* Note the Petsc r permutation and factor info are ignored */
1172397b6df1SKris Buschelman #undef __FUNCT__
117367877ebaSShri Abhyankar #define __FUNCT__ "MatCholeskyFactorSymbolic_MUMPS"
117467877ebaSShri Abhyankar PetscErrorCode MatCholeskyFactorSymbolic_MUMPS(Mat F,Mat A,IS r,const MatFactorInfo *info)
1175b24902e0SBarry Smith {
1176a5e57a09SHong Zhang   Mat_MUMPS      *mumps = (Mat_MUMPS*)F->spptr;
1177dcd589f8SShri Abhyankar   PetscErrorCode ierr;
117867877ebaSShri Abhyankar   Vec            b;
117967877ebaSShri Abhyankar   IS             is_iden;
118067877ebaSShri Abhyankar   const PetscInt M = A->rmap->N;
1181397b6df1SKris Buschelman 
1182397b6df1SKris Buschelman   PetscFunctionBegin;
1183a5e57a09SHong Zhang   mumps->matstruc = DIFFERENT_NONZERO_PATTERN;
1184dcd589f8SShri Abhyankar 
11859a2535b5SHong Zhang   /* Set MUMPS options from the options database */
11869a2535b5SHong Zhang   ierr = PetscSetMUMPSFromOptions(F,A);CHKERRQ(ierr);
1187dcd589f8SShri Abhyankar 
1188a5e57a09SHong Zhang   ierr = (*mumps->ConvertToTriples)(A, 1, MAT_INITIAL_MATRIX, &mumps->nz, &mumps->irn, &mumps->jcn, &mumps->val);CHKERRQ(ierr);
1189dcd589f8SShri Abhyankar 
119067877ebaSShri Abhyankar   /* analysis phase */
119167877ebaSShri Abhyankar   /*----------------*/
1192a5e57a09SHong Zhang   mumps->id.job = JOB_FACTSYMBOLIC;
1193a5e57a09SHong Zhang   mumps->id.n   = M;
1194a5e57a09SHong Zhang   switch (mumps->id.ICNTL(18)) {
119567877ebaSShri Abhyankar   case 0:  /* centralized assembled matrix input */
1196a5e57a09SHong Zhang     if (!mumps->myid) {
1197a5e57a09SHong Zhang       mumps->id.nz =mumps->nz; mumps->id.irn=mumps->irn; mumps->id.jcn=mumps->jcn;
1198a5e57a09SHong Zhang       if (mumps->id.ICNTL(6)>1) {
1199940cd9d6SSatish Balay         mumps->id.a = (MumpsScalar*)mumps->val;
120067877ebaSShri Abhyankar       }
120167877ebaSShri Abhyankar     }
120267877ebaSShri Abhyankar     break;
120367877ebaSShri Abhyankar   case 3:  /* distributed assembled matrix input (size>1) */
1204a5e57a09SHong Zhang     mumps->id.nz_loc = mumps->nz;
1205a5e57a09SHong Zhang     mumps->id.irn_loc=mumps->irn; mumps->id.jcn_loc=mumps->jcn;
1206a5e57a09SHong Zhang     if (mumps->id.ICNTL(6)>1) {
1207940cd9d6SSatish Balay       mumps->id.a_loc = (MumpsScalar*)mumps->val;
120867877ebaSShri Abhyankar     }
120967877ebaSShri Abhyankar     /* MUMPS only supports centralized rhs. Create scatter scat_rhs for repeated use in MatSolve() */
1210a5e57a09SHong Zhang     if (!mumps->myid) {
1211a5e57a09SHong Zhang       ierr = VecCreateSeq(PETSC_COMM_SELF,A->cmap->N,&mumps->b_seq);CHKERRQ(ierr);
121267877ebaSShri Abhyankar       ierr = ISCreateStride(PETSC_COMM_SELF,A->cmap->N,0,1,&is_iden);CHKERRQ(ierr);
121367877ebaSShri Abhyankar     } else {
1214a5e57a09SHong Zhang       ierr = VecCreateSeq(PETSC_COMM_SELF,0,&mumps->b_seq);CHKERRQ(ierr);
121567877ebaSShri Abhyankar       ierr = ISCreateStride(PETSC_COMM_SELF,0,0,1,&is_iden);CHKERRQ(ierr);
121667877ebaSShri Abhyankar     }
12172a7a6963SBarry Smith     ierr = MatCreateVecs(A,NULL,&b);CHKERRQ(ierr);
1218a5e57a09SHong Zhang     ierr = VecScatterCreate(b,is_iden,mumps->b_seq,is_iden,&mumps->scat_rhs);CHKERRQ(ierr);
12196bf464f9SBarry Smith     ierr = ISDestroy(&is_iden);CHKERRQ(ierr);
12206bf464f9SBarry Smith     ierr = VecDestroy(&b);CHKERRQ(ierr);
122167877ebaSShri Abhyankar     break;
122267877ebaSShri Abhyankar   }
1223a5e57a09SHong Zhang   PetscMUMPS_c(&mumps->id);
1224a5e57a09SHong Zhang   if (mumps->id.INFOG(1) < 0) SETERRQ1(PETSC_COMM_SELF,PETSC_ERR_LIB,"Error reported by MUMPS in analysis phase: INFOG(1)=%d\n",mumps->id.INFOG(1));
122567877ebaSShri Abhyankar 
12262792810eSHong Zhang   F->ops->choleskyfactornumeric = MatFactorNumeric_MUMPS;
1227dcd589f8SShri Abhyankar   F->ops->solve                 = MatSolve_MUMPS;
122851d5961aSHong Zhang   F->ops->solvetranspose        = MatSolve_MUMPS;
12294e34a73bSHong Zhang   F->ops->matsolve              = MatMatSolve_MUMPS;
12304e34a73bSHong Zhang #if defined(PETSC_USE_COMPLEX)
12310298fd71SBarry Smith   F->ops->getinertia = NULL;
12324e34a73bSHong Zhang #else
12334e34a73bSHong Zhang   F->ops->getinertia = MatGetInertia_SBAIJMUMPS;
1234db4efbfdSBarry Smith #endif
1235b24902e0SBarry Smith   PetscFunctionReturn(0);
1236b24902e0SBarry Smith }
1237b24902e0SBarry Smith 
1238397b6df1SKris Buschelman #undef __FUNCT__
123964e6c443SBarry Smith #define __FUNCT__ "MatView_MUMPS"
124064e6c443SBarry Smith PetscErrorCode MatView_MUMPS(Mat A,PetscViewer viewer)
124174ed9c26SBarry Smith {
1242f6c57405SHong Zhang   PetscErrorCode    ierr;
124364e6c443SBarry Smith   PetscBool         iascii;
124464e6c443SBarry Smith   PetscViewerFormat format;
1245a5e57a09SHong Zhang   Mat_MUMPS         *mumps=(Mat_MUMPS*)A->spptr;
1246f6c57405SHong Zhang 
1247f6c57405SHong Zhang   PetscFunctionBegin;
124864e6c443SBarry Smith   /* check if matrix is mumps type */
124964e6c443SBarry Smith   if (A->ops->solve != MatSolve_MUMPS) PetscFunctionReturn(0);
125064e6c443SBarry Smith 
1251251f4c67SDmitry Karpeev   ierr = PetscObjectTypeCompare((PetscObject)viewer,PETSCVIEWERASCII,&iascii);CHKERRQ(ierr);
125264e6c443SBarry Smith   if (iascii) {
125364e6c443SBarry Smith     ierr = PetscViewerGetFormat(viewer,&format);CHKERRQ(ierr);
125464e6c443SBarry Smith     if (format == PETSC_VIEWER_ASCII_INFO) {
125564e6c443SBarry Smith       ierr = PetscViewerASCIIPrintf(viewer,"MUMPS run parameters:\n");CHKERRQ(ierr);
1256a5e57a09SHong Zhang       ierr = PetscViewerASCIIPrintf(viewer,"  SYM (matrix type):                   %d \n",mumps->id.sym);CHKERRQ(ierr);
1257a5e57a09SHong Zhang       ierr = PetscViewerASCIIPrintf(viewer,"  PAR (host participation):            %d \n",mumps->id.par);CHKERRQ(ierr);
1258a5e57a09SHong Zhang       ierr = PetscViewerASCIIPrintf(viewer,"  ICNTL(1) (output for error):         %d \n",mumps->id.ICNTL(1));CHKERRQ(ierr);
1259a5e57a09SHong Zhang       ierr = PetscViewerASCIIPrintf(viewer,"  ICNTL(2) (output of diagnostic msg): %d \n",mumps->id.ICNTL(2));CHKERRQ(ierr);
1260a5e57a09SHong Zhang       ierr = PetscViewerASCIIPrintf(viewer,"  ICNTL(3) (output for global info):   %d \n",mumps->id.ICNTL(3));CHKERRQ(ierr);
1261a5e57a09SHong Zhang       ierr = PetscViewerASCIIPrintf(viewer,"  ICNTL(4) (level of printing):        %d \n",mumps->id.ICNTL(4));CHKERRQ(ierr);
1262a5e57a09SHong Zhang       ierr = PetscViewerASCIIPrintf(viewer,"  ICNTL(5) (input mat struct):         %d \n",mumps->id.ICNTL(5));CHKERRQ(ierr);
1263a5e57a09SHong Zhang       ierr = PetscViewerASCIIPrintf(viewer,"  ICNTL(6) (matrix prescaling):        %d \n",mumps->id.ICNTL(6));CHKERRQ(ierr);
1264a5e57a09SHong Zhang       ierr = PetscViewerASCIIPrintf(viewer,"  ICNTL(7) (sequentia matrix ordering):%d \n",mumps->id.ICNTL(7));CHKERRQ(ierr);
1265a5e57a09SHong Zhang       ierr = PetscViewerASCIIPrintf(viewer,"  ICNTL(8) (scalling strategy):        %d \n",mumps->id.ICNTL(8));CHKERRQ(ierr);
1266a5e57a09SHong Zhang       ierr = PetscViewerASCIIPrintf(viewer,"  ICNTL(10) (max num of refinements):  %d \n",mumps->id.ICNTL(10));CHKERRQ(ierr);
1267a5e57a09SHong Zhang       ierr = PetscViewerASCIIPrintf(viewer,"  ICNTL(11) (error analysis):          %d \n",mumps->id.ICNTL(11));CHKERRQ(ierr);
1268a5e57a09SHong Zhang       if (mumps->id.ICNTL(11)>0) {
1269a5e57a09SHong Zhang         ierr = PetscViewerASCIIPrintf(viewer,"    RINFOG(4) (inf norm of input mat):        %g\n",mumps->id.RINFOG(4));CHKERRQ(ierr);
1270a5e57a09SHong Zhang         ierr = PetscViewerASCIIPrintf(viewer,"    RINFOG(5) (inf norm of solution):         %g\n",mumps->id.RINFOG(5));CHKERRQ(ierr);
1271a5e57a09SHong Zhang         ierr = PetscViewerASCIIPrintf(viewer,"    RINFOG(6) (inf norm of residual):         %g\n",mumps->id.RINFOG(6));CHKERRQ(ierr);
1272a5e57a09SHong Zhang         ierr = PetscViewerASCIIPrintf(viewer,"    RINFOG(7),RINFOG(8) (backward error est): %g, %g\n",mumps->id.RINFOG(7),mumps->id.RINFOG(8));CHKERRQ(ierr);
1273a5e57a09SHong Zhang         ierr = PetscViewerASCIIPrintf(viewer,"    RINFOG(9) (error estimate):               %g \n",mumps->id.RINFOG(9));CHKERRQ(ierr);
1274a5e57a09SHong Zhang         ierr = PetscViewerASCIIPrintf(viewer,"    RINFOG(10),RINFOG(11)(condition numbers): %g, %g\n",mumps->id.RINFOG(10),mumps->id.RINFOG(11));CHKERRQ(ierr);
1275f6c57405SHong Zhang       }
1276a5e57a09SHong Zhang       ierr = PetscViewerASCIIPrintf(viewer,"  ICNTL(12) (efficiency control):                         %d \n",mumps->id.ICNTL(12));CHKERRQ(ierr);
1277a5e57a09SHong Zhang       ierr = PetscViewerASCIIPrintf(viewer,"  ICNTL(13) (efficiency control):                         %d \n",mumps->id.ICNTL(13));CHKERRQ(ierr);
1278a5e57a09SHong Zhang       ierr = PetscViewerASCIIPrintf(viewer,"  ICNTL(14) (percentage of estimated workspace increase): %d \n",mumps->id.ICNTL(14));CHKERRQ(ierr);
1279f6c57405SHong Zhang       /* ICNTL(15-17) not used */
1280a5e57a09SHong Zhang       ierr = PetscViewerASCIIPrintf(viewer,"  ICNTL(18) (input mat struct):                           %d \n",mumps->id.ICNTL(18));CHKERRQ(ierr);
1281a5e57a09SHong Zhang       ierr = PetscViewerASCIIPrintf(viewer,"  ICNTL(19) (Shur complement info):                       %d \n",mumps->id.ICNTL(19));CHKERRQ(ierr);
1282a5e57a09SHong Zhang       ierr = PetscViewerASCIIPrintf(viewer,"  ICNTL(20) (rhs sparse pattern):                         %d \n",mumps->id.ICNTL(20));CHKERRQ(ierr);
1283ca3dc52bSPierre Jolivet       ierr = PetscViewerASCIIPrintf(viewer,"  ICNTL(21) (solution struct):                            %d \n",mumps->id.ICNTL(21));CHKERRQ(ierr);
1284a5e57a09SHong Zhang       ierr = PetscViewerASCIIPrintf(viewer,"  ICNTL(22) (in-core/out-of-core facility):               %d \n",mumps->id.ICNTL(22));CHKERRQ(ierr);
1285a5e57a09SHong Zhang       ierr = PetscViewerASCIIPrintf(viewer,"  ICNTL(23) (max size of memory can be allocated locally):%d \n",mumps->id.ICNTL(23));CHKERRQ(ierr);
1286c0165424SHong Zhang 
1287a5e57a09SHong Zhang       ierr = PetscViewerASCIIPrintf(viewer,"  ICNTL(24) (detection of null pivot rows):               %d \n",mumps->id.ICNTL(24));CHKERRQ(ierr);
1288a5e57a09SHong Zhang       ierr = PetscViewerASCIIPrintf(viewer,"  ICNTL(25) (computation of a null space basis):          %d \n",mumps->id.ICNTL(25));CHKERRQ(ierr);
1289a5e57a09SHong Zhang       ierr = PetscViewerASCIIPrintf(viewer,"  ICNTL(26) (Schur options for rhs or solution):          %d \n",mumps->id.ICNTL(26));CHKERRQ(ierr);
1290a5e57a09SHong Zhang       ierr = PetscViewerASCIIPrintf(viewer,"  ICNTL(27) (experimental parameter):                     %d \n",mumps->id.ICNTL(27));CHKERRQ(ierr);
1291a5e57a09SHong Zhang       ierr = PetscViewerASCIIPrintf(viewer,"  ICNTL(28) (use parallel or sequential ordering):        %d \n",mumps->id.ICNTL(28));CHKERRQ(ierr);
1292a5e57a09SHong Zhang       ierr = PetscViewerASCIIPrintf(viewer,"  ICNTL(29) (parallel ordering):                          %d \n",mumps->id.ICNTL(29));CHKERRQ(ierr);
129342179a6aSHong Zhang 
1294a5e57a09SHong Zhang       ierr = PetscViewerASCIIPrintf(viewer,"  ICNTL(30) (user-specified set of entries in inv(A)):    %d \n",mumps->id.ICNTL(30));CHKERRQ(ierr);
1295a5e57a09SHong Zhang       ierr = PetscViewerASCIIPrintf(viewer,"  ICNTL(31) (factors is discarded in the solve phase):    %d \n",mumps->id.ICNTL(31));CHKERRQ(ierr);
1296a5e57a09SHong Zhang       ierr = PetscViewerASCIIPrintf(viewer,"  ICNTL(33) (compute determinant):                        %d \n",mumps->id.ICNTL(33));CHKERRQ(ierr);
1297f6c57405SHong Zhang 
1298a5e57a09SHong Zhang       ierr = PetscViewerASCIIPrintf(viewer,"  CNTL(1) (relative pivoting threshold):      %g \n",mumps->id.CNTL(1));CHKERRQ(ierr);
1299a5e57a09SHong Zhang       ierr = PetscViewerASCIIPrintf(viewer,"  CNTL(2) (stopping criterion of refinement): %g \n",mumps->id.CNTL(2));CHKERRQ(ierr);
1300ca3dc52bSPierre Jolivet       ierr = PetscViewerASCIIPrintf(viewer,"  CNTL(3) (absolute pivoting threshold):      %g \n",mumps->id.CNTL(3));CHKERRQ(ierr);
1301ca3dc52bSPierre Jolivet       ierr = PetscViewerASCIIPrintf(viewer,"  CNTL(4) (value of static pivoting):         %g \n",mumps->id.CNTL(4));CHKERRQ(ierr);
1302a5e57a09SHong Zhang       ierr = PetscViewerASCIIPrintf(viewer,"  CNTL(5) (fixation for null pivots):         %g \n",mumps->id.CNTL(5));CHKERRQ(ierr);
1303f6c57405SHong Zhang 
1304f6c57405SHong Zhang       /* infomation local to each processor */
130534ed7027SBarry Smith       ierr = PetscViewerASCIIPrintf(viewer, "  RINFO(1) (local estimated flops for the elimination after analysis): \n");CHKERRQ(ierr);
13067b23a99aSBarry Smith       ierr = PetscViewerASCIISynchronizedAllow(viewer,PETSC_TRUE);CHKERRQ(ierr);
1307a5e57a09SHong Zhang       ierr = PetscViewerASCIISynchronizedPrintf(viewer,"    [%d] %g \n",mumps->myid,mumps->id.RINFO(1));CHKERRQ(ierr);
130834ed7027SBarry Smith       ierr = PetscViewerFlush(viewer);
130934ed7027SBarry Smith       ierr = PetscViewerASCIIPrintf(viewer, "  RINFO(2) (local estimated flops for the assembly after factorization): \n");CHKERRQ(ierr);
1310a5e57a09SHong Zhang       ierr = PetscViewerASCIISynchronizedPrintf(viewer,"    [%d]  %g \n",mumps->myid,mumps->id.RINFO(2));CHKERRQ(ierr);
131134ed7027SBarry Smith       ierr = PetscViewerFlush(viewer);
131234ed7027SBarry Smith       ierr = PetscViewerASCIIPrintf(viewer, "  RINFO(3) (local estimated flops for the elimination after factorization): \n");CHKERRQ(ierr);
1313a5e57a09SHong Zhang       ierr = PetscViewerASCIISynchronizedPrintf(viewer,"    [%d]  %g \n",mumps->myid,mumps->id.RINFO(3));CHKERRQ(ierr);
131434ed7027SBarry Smith       ierr = PetscViewerFlush(viewer);
1315f6c57405SHong Zhang 
131634ed7027SBarry Smith       ierr = PetscViewerASCIIPrintf(viewer, "  INFO(15) (estimated size of (in MB) MUMPS internal data for running numerical factorization): \n");CHKERRQ(ierr);
1317a5e57a09SHong Zhang       ierr = PetscViewerASCIISynchronizedPrintf(viewer,"  [%d] %d \n",mumps->myid,mumps->id.INFO(15));CHKERRQ(ierr);
131834ed7027SBarry Smith       ierr = PetscViewerFlush(viewer);
1319f6c57405SHong Zhang 
132034ed7027SBarry Smith       ierr = PetscViewerASCIIPrintf(viewer, "  INFO(16) (size of (in MB) MUMPS internal data used during numerical factorization): \n");CHKERRQ(ierr);
1321a5e57a09SHong Zhang       ierr = PetscViewerASCIISynchronizedPrintf(viewer,"    [%d] %d \n",mumps->myid,mumps->id.INFO(16));CHKERRQ(ierr);
132234ed7027SBarry Smith       ierr = PetscViewerFlush(viewer);
1323f6c57405SHong Zhang 
132434ed7027SBarry Smith       ierr = PetscViewerASCIIPrintf(viewer, "  INFO(23) (num of pivots eliminated on this processor after factorization): \n");CHKERRQ(ierr);
1325a5e57a09SHong Zhang       ierr = PetscViewerASCIISynchronizedPrintf(viewer,"    [%d] %d \n",mumps->myid,mumps->id.INFO(23));CHKERRQ(ierr);
132634ed7027SBarry Smith       ierr = PetscViewerFlush(viewer);
1327b34f08ffSHong Zhang 
1328b34f08ffSHong Zhang       if (mumps->ninfo && mumps->ninfo <= 40){
1329b34f08ffSHong Zhang         PetscInt i;
1330b34f08ffSHong Zhang         for (i=0; i<mumps->ninfo; i++){
1331b34f08ffSHong Zhang           ierr = PetscViewerASCIIPrintf(viewer, "  INFO(%d): \n",mumps->info[i]);CHKERRQ(ierr);
1332b34f08ffSHong Zhang           ierr = PetscViewerASCIISynchronizedPrintf(viewer,"    [%d] %d \n",mumps->myid,mumps->id.INFO(mumps->info[i]));CHKERRQ(ierr);
1333b34f08ffSHong Zhang           ierr = PetscViewerFlush(viewer);
1334b34f08ffSHong Zhang         }
1335b34f08ffSHong Zhang       }
1336b34f08ffSHong Zhang 
1337b34f08ffSHong Zhang 
13387b23a99aSBarry Smith       ierr = PetscViewerASCIISynchronizedAllow(viewer,PETSC_FALSE);CHKERRQ(ierr);
1339f6c57405SHong Zhang 
1340a5e57a09SHong Zhang       if (!mumps->myid) { /* information from the host */
1341a5e57a09SHong Zhang         ierr = PetscViewerASCIIPrintf(viewer,"  RINFOG(1) (global estimated flops for the elimination after analysis): %g \n",mumps->id.RINFOG(1));CHKERRQ(ierr);
1342a5e57a09SHong Zhang         ierr = PetscViewerASCIIPrintf(viewer,"  RINFOG(2) (global estimated flops for the assembly after factorization): %g \n",mumps->id.RINFOG(2));CHKERRQ(ierr);
1343a5e57a09SHong Zhang         ierr = PetscViewerASCIIPrintf(viewer,"  RINFOG(3) (global estimated flops for the elimination after factorization): %g \n",mumps->id.RINFOG(3));CHKERRQ(ierr);
1344a5e57a09SHong Zhang         ierr = PetscViewerASCIIPrintf(viewer,"  (RINFOG(12) RINFOG(13))*2^INFOG(34) (determinant): (%g,%g)*(2^%d)\n",mumps->id.RINFOG(12),mumps->id.RINFOG(13),mumps->id.INFOG(34));CHKERRQ(ierr);
1345f6c57405SHong Zhang 
1346a5e57a09SHong Zhang         ierr = PetscViewerASCIIPrintf(viewer,"  INFOG(3) (estimated real workspace for factors on all processors after analysis): %d \n",mumps->id.INFOG(3));CHKERRQ(ierr);
1347a5e57a09SHong Zhang         ierr = PetscViewerASCIIPrintf(viewer,"  INFOG(4) (estimated integer workspace for factors on all processors after analysis): %d \n",mumps->id.INFOG(4));CHKERRQ(ierr);
1348a5e57a09SHong Zhang         ierr = PetscViewerASCIIPrintf(viewer,"  INFOG(5) (estimated maximum front size in the complete tree): %d \n",mumps->id.INFOG(5));CHKERRQ(ierr);
1349a5e57a09SHong Zhang         ierr = PetscViewerASCIIPrintf(viewer,"  INFOG(6) (number of nodes in the complete tree): %d \n",mumps->id.INFOG(6));CHKERRQ(ierr);
1350a5e57a09SHong Zhang         ierr = PetscViewerASCIIPrintf(viewer,"  INFOG(7) (ordering option effectively use after analysis): %d \n",mumps->id.INFOG(7));CHKERRQ(ierr);
1351a5e57a09SHong Zhang         ierr = PetscViewerASCIIPrintf(viewer,"  INFOG(8) (structural symmetry in percent of the permuted matrix after analysis): %d \n",mumps->id.INFOG(8));CHKERRQ(ierr);
1352a5e57a09SHong Zhang         ierr = PetscViewerASCIIPrintf(viewer,"  INFOG(9) (total real/complex workspace to store the matrix factors after factorization): %d \n",mumps->id.INFOG(9));CHKERRQ(ierr);
1353a5e57a09SHong Zhang         ierr = PetscViewerASCIIPrintf(viewer,"  INFOG(10) (total integer space store the matrix factors after factorization): %d \n",mumps->id.INFOG(10));CHKERRQ(ierr);
1354a5e57a09SHong Zhang         ierr = PetscViewerASCIIPrintf(viewer,"  INFOG(11) (order of largest frontal matrix after factorization): %d \n",mumps->id.INFOG(11));CHKERRQ(ierr);
1355a5e57a09SHong Zhang         ierr = PetscViewerASCIIPrintf(viewer,"  INFOG(12) (number of off-diagonal pivots): %d \n",mumps->id.INFOG(12));CHKERRQ(ierr);
1356a5e57a09SHong Zhang         ierr = PetscViewerASCIIPrintf(viewer,"  INFOG(13) (number of delayed pivots after factorization): %d \n",mumps->id.INFOG(13));CHKERRQ(ierr);
1357a5e57a09SHong Zhang         ierr = PetscViewerASCIIPrintf(viewer,"  INFOG(14) (number of memory compress after factorization): %d \n",mumps->id.INFOG(14));CHKERRQ(ierr);
1358a5e57a09SHong Zhang         ierr = PetscViewerASCIIPrintf(viewer,"  INFOG(15) (number of steps of iterative refinement after solution): %d \n",mumps->id.INFOG(15));CHKERRQ(ierr);
1359a5e57a09SHong 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",mumps->id.INFOG(16));CHKERRQ(ierr);
1360a5e57a09SHong Zhang         ierr = PetscViewerASCIIPrintf(viewer,"  INFOG(17) (estimated size of all MUMPS internal data for factorization after analysis: sum over all processors): %d \n",mumps->id.INFOG(17));CHKERRQ(ierr);
1361a5e57a09SHong Zhang         ierr = PetscViewerASCIIPrintf(viewer,"  INFOG(18) (size of all MUMPS internal data allocated during factorization: value on the most memory consuming processor): %d \n",mumps->id.INFOG(18));CHKERRQ(ierr);
1362a5e57a09SHong Zhang         ierr = PetscViewerASCIIPrintf(viewer,"  INFOG(19) (size of all MUMPS internal data allocated during factorization: sum over all processors): %d \n",mumps->id.INFOG(19));CHKERRQ(ierr);
1363a5e57a09SHong Zhang         ierr = PetscViewerASCIIPrintf(viewer,"  INFOG(20) (estimated number of entries in the factors): %d \n",mumps->id.INFOG(20));CHKERRQ(ierr);
1364a5e57a09SHong Zhang         ierr = PetscViewerASCIIPrintf(viewer,"  INFOG(21) (size in MB of memory effectively used during factorization - value on the most memory consuming processor): %d \n",mumps->id.INFOG(21));CHKERRQ(ierr);
1365a5e57a09SHong Zhang         ierr = PetscViewerASCIIPrintf(viewer,"  INFOG(22) (size in MB of memory effectively used during factorization - sum over all processors): %d \n",mumps->id.INFOG(22));CHKERRQ(ierr);
1366a5e57a09SHong Zhang         ierr = PetscViewerASCIIPrintf(viewer,"  INFOG(23) (after analysis: value of ICNTL(6) effectively used): %d \n",mumps->id.INFOG(23));CHKERRQ(ierr);
1367a5e57a09SHong Zhang         ierr = PetscViewerASCIIPrintf(viewer,"  INFOG(24) (after analysis: value of ICNTL(12) effectively used): %d \n",mumps->id.INFOG(24));CHKERRQ(ierr);
1368a5e57a09SHong Zhang         ierr = PetscViewerASCIIPrintf(viewer,"  INFOG(25) (after factorization: number of pivots modified by static pivoting): %d \n",mumps->id.INFOG(25));CHKERRQ(ierr);
136940d435e3SHong Zhang         ierr = PetscViewerASCIIPrintf(viewer,"  INFOG(28) (after factorization: number of null pivots encountered): %d\n",mumps->id.INFOG(28));CHKERRQ(ierr);
137040d435e3SHong Zhang         ierr = PetscViewerASCIIPrintf(viewer,"  INFOG(29) (after factorization: effective number of entries in the factors (sum over all processors)): %d\n",mumps->id.INFOG(29));CHKERRQ(ierr);
137140d435e3SHong Zhang         ierr = PetscViewerASCIIPrintf(viewer,"  INFOG(30, 31) (after solution: size in Mbytes of memory used during solution phase): %d, %d\n",mumps->id.INFOG(30),mumps->id.INFOG(31));CHKERRQ(ierr);
137240d435e3SHong Zhang         ierr = PetscViewerASCIIPrintf(viewer,"  INFOG(32) (after analysis: type of analysis done): %d\n",mumps->id.INFOG(32));CHKERRQ(ierr);
137340d435e3SHong Zhang         ierr = PetscViewerASCIIPrintf(viewer,"  INFOG(33) (value used for ICNTL(8)): %d\n",mumps->id.INFOG(33));CHKERRQ(ierr);
137440d435e3SHong Zhang         ierr = PetscViewerASCIIPrintf(viewer,"  INFOG(34) (exponent of the determinant if determinant is requested): %d\n",mumps->id.INFOG(34));CHKERRQ(ierr);
1375f6c57405SHong Zhang       }
1376f6c57405SHong Zhang     }
1377cb828f0fSHong Zhang   }
1378f6c57405SHong Zhang   PetscFunctionReturn(0);
1379f6c57405SHong Zhang }
1380f6c57405SHong Zhang 
138135bd34faSBarry Smith #undef __FUNCT__
138235bd34faSBarry Smith #define __FUNCT__ "MatGetInfo_MUMPS"
138335bd34faSBarry Smith PetscErrorCode MatGetInfo_MUMPS(Mat A,MatInfoType flag,MatInfo *info)
138435bd34faSBarry Smith {
1385cb828f0fSHong Zhang   Mat_MUMPS *mumps =(Mat_MUMPS*)A->spptr;
138635bd34faSBarry Smith 
138735bd34faSBarry Smith   PetscFunctionBegin;
138835bd34faSBarry Smith   info->block_size        = 1.0;
1389cb828f0fSHong Zhang   info->nz_allocated      = mumps->id.INFOG(20);
1390cb828f0fSHong Zhang   info->nz_used           = mumps->id.INFOG(20);
139135bd34faSBarry Smith   info->nz_unneeded       = 0.0;
139235bd34faSBarry Smith   info->assemblies        = 0.0;
139335bd34faSBarry Smith   info->mallocs           = 0.0;
139435bd34faSBarry Smith   info->memory            = 0.0;
139535bd34faSBarry Smith   info->fill_ratio_given  = 0;
139635bd34faSBarry Smith   info->fill_ratio_needed = 0;
139735bd34faSBarry Smith   info->factor_mallocs    = 0;
139835bd34faSBarry Smith   PetscFunctionReturn(0);
139935bd34faSBarry Smith }
140035bd34faSBarry Smith 
14015ccb76cbSHong Zhang /* -------------------------------------------------------------------------------------------*/
14025ccb76cbSHong Zhang #undef __FUNCT__
1403*6444a565SStefano Zampini #define __FUNCT__ "MatMumpsSetSchurIndices_MUMPS"
1404*6444a565SStefano Zampini PetscErrorCode MatMumpsSetSchurIndices_MUMPS(Mat F,PetscInt size,PetscInt idxs[])
1405*6444a565SStefano Zampini {
1406*6444a565SStefano Zampini   Mat_MUMPS      *mumps =(Mat_MUMPS*)F->spptr;
1407*6444a565SStefano Zampini   PetscErrorCode ierr;
1408*6444a565SStefano Zampini 
1409*6444a565SStefano Zampini   PetscFunctionBegin;
1410*6444a565SStefano Zampini   if (mumps->size > 1) SETERRQ(PETSC_COMM_SELF,PETSC_ERR_SUP,"MUMPS parallel computation of Schur complements not yet supported from PETSc\n");
1411*6444a565SStefano Zampini   if (mumps->id.size_schur != size) {
1412*6444a565SStefano Zampini     ierr = PetscFree2(mumps->id.listvar_schur,mumps->id.schur);CHKERRQ(ierr);
1413*6444a565SStefano Zampini     mumps->id.size_schur = size;
1414*6444a565SStefano Zampini     mumps->id.schur_lld = size;
1415*6444a565SStefano Zampini     ierr = PetscMalloc2(size,&mumps->id.listvar_schur,size*size,&mumps->id.schur);CHKERRQ(ierr);
1416*6444a565SStefano Zampini   }
1417*6444a565SStefano Zampini   ierr = PetscMemcpy(mumps->id.listvar_schur,idxs,size*sizeof(PetscInt));CHKERRQ(ierr);
1418*6444a565SStefano Zampini   if (F->factortype == MAT_FACTOR_LU) {
1419*6444a565SStefano Zampini     mumps->id.ICNTL(19) = 3; /* return full matrix */
1420*6444a565SStefano Zampini   } else {
1421*6444a565SStefano Zampini     mumps->id.ICNTL(19) = 2; /* return lower triangular part */
1422*6444a565SStefano Zampini   }
1423*6444a565SStefano Zampini   PetscFunctionReturn(0);
1424*6444a565SStefano Zampini }
1425*6444a565SStefano Zampini 
1426*6444a565SStefano Zampini #undef __FUNCT__
1427*6444a565SStefano Zampini #define __FUNCT__ "MatMumpsSetSchurIndices"
1428*6444a565SStefano Zampini /*@
1429*6444a565SStefano Zampini   MatMumpsSetSchurIndices - Set indices defining the Schur complement that MUMPS will compute during the factorization steps
1430*6444a565SStefano Zampini 
1431*6444a565SStefano Zampini    Logically Collective on Mat
1432*6444a565SStefano Zampini 
1433*6444a565SStefano Zampini    Input Parameters:
1434*6444a565SStefano Zampini +  F - the factored matrix obtained by calling MatGetFactor() from PETSc-MUMPS interface
1435*6444a565SStefano Zampini .  size - size of the Schur complement indices
1436*6444a565SStefano Zampini -  idxs[] - array of Schur complement indices
1437*6444a565SStefano Zampini 
1438*6444a565SStefano Zampini    Notes:
1439*6444a565SStefano Zampini    The user has to free the array idxs[] since it is copied by the routine.
1440*6444a565SStefano Zampini    Currently implemented for sequential matrices
1441*6444a565SStefano Zampini 
1442*6444a565SStefano Zampini    Level: advanced
1443*6444a565SStefano Zampini 
1444*6444a565SStefano Zampini    References: MUMPS Users' Guide
1445*6444a565SStefano Zampini 
1446*6444a565SStefano Zampini .seealso: MatGetFactor()
1447*6444a565SStefano Zampini @*/
1448*6444a565SStefano Zampini PetscErrorCode MatMumpsSetSchurIndices(Mat F,PetscInt size,PetscInt idxs[])
1449*6444a565SStefano Zampini {
1450*6444a565SStefano Zampini   PetscErrorCode ierr;
1451*6444a565SStefano Zampini 
1452*6444a565SStefano Zampini   PetscFunctionBegin;
1453*6444a565SStefano Zampini   PetscValidIntPointer(idxs,3);
1454*6444a565SStefano Zampini   ierr = PetscTryMethod(F,"MatMumpsSetSchurIndices_C",(Mat,PetscInt,PetscInt[]),(F,size,idxs));CHKERRQ(ierr);
1455*6444a565SStefano Zampini   PetscFunctionReturn(0);
1456*6444a565SStefano Zampini }
1457*6444a565SStefano Zampini /* -------------------------------------------------------------------------------------------*/
1458*6444a565SStefano Zampini #undef __FUNCT__
1459*6444a565SStefano Zampini #define __FUNCT__ "MatMumpsGetSchurComplement_MUMPS"
1460*6444a565SStefano Zampini PetscErrorCode MatMumpsGetSchurComplement_MUMPS(Mat F,Mat* S)
1461*6444a565SStefano Zampini {
1462*6444a565SStefano Zampini   Mat            St;
1463*6444a565SStefano Zampini   Mat_MUMPS      *mumps =(Mat_MUMPS*)F->spptr;
1464*6444a565SStefano Zampini   PetscScalar    *array;
1465*6444a565SStefano Zampini #if defined(PETSC_USE_COMPLEX)
1466*6444a565SStefano Zampini   PetscScalar    im = PetscSqrtScalar(-1.0);
1467*6444a565SStefano Zampini #endif
1468*6444a565SStefano Zampini   PetscErrorCode ierr;
1469*6444a565SStefano Zampini 
1470*6444a565SStefano Zampini   PetscFunctionBegin;
1471*6444a565SStefano Zampini   if (mumps->id.job != JOB_FACTNUMERIC) {
1472*6444a565SStefano Zampini     SETERRQ(PetscObjectComm((PetscObject)F),PETSC_ERR_ARG_WRONG,"Numerical factorization phase not yet performed! You should call MatFactorSymbolic/Numeric before");
1473*6444a565SStefano Zampini   } else if (mumps->id.size_schur == 0) {
1474*6444a565SStefano Zampini     SETERRQ(PetscObjectComm((PetscObject)F),PETSC_ERR_ARG_WRONG,"Schur indices not set! You should call MatMumpsSetSchurIndices before");
1475*6444a565SStefano Zampini   }
1476*6444a565SStefano Zampini 
1477*6444a565SStefano Zampini   ierr = MatCreate(PetscObjectComm((PetscObject)F),&St);CHKERRQ(ierr);
1478*6444a565SStefano Zampini   ierr = MatSetSizes(St,PETSC_DECIDE,PETSC_DECIDE,mumps->id.size_schur,mumps->id.size_schur);CHKERRQ(ierr);
1479*6444a565SStefano Zampini   ierr = MatSetType(St,MATDENSE);CHKERRQ(ierr);
1480*6444a565SStefano Zampini   ierr = MatSetUp(St);CHKERRQ(ierr);
1481*6444a565SStefano Zampini   ierr = MatDenseGetArray(St,&array);CHKERRQ(ierr);
1482*6444a565SStefano Zampini   if (mumps->sym == 0) { /* MUMPS always return a full matrix */
1483*6444a565SStefano Zampini     if (mumps->id.ICNTL(19) == 1) { /* stored by rows */
1484*6444a565SStefano Zampini       PetscInt i,j,N=mumps->id.size_schur;
1485*6444a565SStefano Zampini       for (i=0;i<N;i++) {
1486*6444a565SStefano Zampini         for (j=0;j<N;j++) {
1487*6444a565SStefano Zampini #if !defined(PETSC_USE_COMPLEX)
1488*6444a565SStefano Zampini           PetscScalar val = mumps->id.schur[i*N+j];
1489*6444a565SStefano Zampini #else
1490*6444a565SStefano Zampini           PetscScalar val = mumps->id.schur[i*N+j].r + im*mumps->id.schur[i*N+j].i;
1491*6444a565SStefano Zampini #endif
1492*6444a565SStefano Zampini           array[j*N+i] = val;
1493*6444a565SStefano Zampini         }
1494*6444a565SStefano Zampini       }
1495*6444a565SStefano Zampini     } else { /* stored by columns */
1496*6444a565SStefano Zampini       ierr = PetscMemcpy(array,mumps->id.schur,mumps->id.size_schur*mumps->id.size_schur*sizeof(PetscScalar));CHKERRQ(ierr);
1497*6444a565SStefano Zampini     }
1498*6444a565SStefano Zampini   } else { /* either full or lower-triangular (not packed) */
1499*6444a565SStefano Zampini     if (mumps->id.ICNTL(19) == 2) { /* lower triangular stored by columns */
1500*6444a565SStefano Zampini       PetscInt i,j,N=mumps->id.size_schur;
1501*6444a565SStefano Zampini       for (i=0;i<N;i++) {
1502*6444a565SStefano Zampini         for (j=i;j<N;j++) {
1503*6444a565SStefano Zampini #if !defined(PETSC_USE_COMPLEX)
1504*6444a565SStefano Zampini           PetscScalar val = mumps->id.schur[i*N+j];
1505*6444a565SStefano Zampini #else
1506*6444a565SStefano Zampini           PetscScalar val = mumps->id.schur[i*N+j].r + im*mumps->id.schur[i*N+j].i;
1507*6444a565SStefano Zampini #endif
1508*6444a565SStefano Zampini           array[i*N+j] = val;
1509*6444a565SStefano Zampini         }
1510*6444a565SStefano Zampini         for (j=i;j<N;j++) {
1511*6444a565SStefano Zampini #if !defined(PETSC_USE_COMPLEX)
1512*6444a565SStefano Zampini           PetscScalar val = mumps->id.schur[i*N+j];
1513*6444a565SStefano Zampini #else
1514*6444a565SStefano Zampini           PetscScalar val = mumps->id.schur[i*N+j].r + im*mumps->id.schur[i*N+j].i;
1515*6444a565SStefano Zampini #endif
1516*6444a565SStefano Zampini           array[j*N+i] = val;
1517*6444a565SStefano Zampini         }
1518*6444a565SStefano Zampini       }
1519*6444a565SStefano Zampini     } else if (mumps->id.ICNTL(19) == 3) { /* full matrix */
1520*6444a565SStefano Zampini       ierr = PetscMemcpy(array,mumps->id.schur,mumps->id.size_schur*mumps->id.size_schur*sizeof(PetscScalar));CHKERRQ(ierr);
1521*6444a565SStefano Zampini     } else { /* ICNTL(19) == 1 lower triangular stored by rows */
1522*6444a565SStefano Zampini       PetscInt i,j,N=mumps->id.size_schur;
1523*6444a565SStefano Zampini       for (i=0;i<N;i++) {
1524*6444a565SStefano Zampini         for (j=0;j<i+1;j++) {
1525*6444a565SStefano Zampini #if !defined(PETSC_USE_COMPLEX)
1526*6444a565SStefano Zampini           PetscScalar val = mumps->id.schur[i*N+j];
1527*6444a565SStefano Zampini #else
1528*6444a565SStefano Zampini           PetscScalar val = mumps->id.schur[i*N+j].r + im*mumps->id.schur[i*N+j].i;
1529*6444a565SStefano Zampini #endif
1530*6444a565SStefano Zampini           array[i*N+j] = val;
1531*6444a565SStefano Zampini         }
1532*6444a565SStefano Zampini         for (j=0;j<i+1;j++) {
1533*6444a565SStefano Zampini #if !defined(PETSC_USE_COMPLEX)
1534*6444a565SStefano Zampini           PetscScalar val = mumps->id.schur[i*N+j];
1535*6444a565SStefano Zampini #else
1536*6444a565SStefano Zampini           PetscScalar val = mumps->id.schur[i*N+j].r + im*mumps->id.schur[i*N+j].i;
1537*6444a565SStefano Zampini #endif
1538*6444a565SStefano Zampini           array[j*N+i] = val;
1539*6444a565SStefano Zampini         }
1540*6444a565SStefano Zampini       }
1541*6444a565SStefano Zampini     }
1542*6444a565SStefano Zampini   }
1543*6444a565SStefano Zampini   ierr = MatDenseRestoreArray(St,&array);CHKERRQ(ierr);
1544*6444a565SStefano Zampini   *S = St;
1545*6444a565SStefano Zampini   PetscFunctionReturn(0);
1546*6444a565SStefano Zampini }
1547*6444a565SStefano Zampini 
1548*6444a565SStefano Zampini #undef __FUNCT__
1549*6444a565SStefano Zampini #define __FUNCT__ "MatMumpsGetSchurComplement"
1550*6444a565SStefano Zampini /*@
1551*6444a565SStefano Zampini   MatMumpsGetSchurComplement - Get Schur complement matrix computed by MUMPS during the factorization step
1552*6444a565SStefano Zampini 
1553*6444a565SStefano Zampini    Logically Collective on Mat
1554*6444a565SStefano Zampini 
1555*6444a565SStefano Zampini    Input Parameters:
1556*6444a565SStefano Zampini +  F - the factored matrix obtained by calling MatGetFactor() from PETSc-MUMPS interface
1557*6444a565SStefano Zampini .  *S - location where to return the Schur complement (MATDENSE)
1558*6444a565SStefano Zampini 
1559*6444a565SStefano Zampini    Notes:
1560*6444a565SStefano Zampini    Currently implemented for sequential matrices
1561*6444a565SStefano Zampini 
1562*6444a565SStefano Zampini    Level: advanced
1563*6444a565SStefano Zampini 
1564*6444a565SStefano Zampini    References: MUMPS Users' Guide
1565*6444a565SStefano Zampini 
1566*6444a565SStefano Zampini .seealso: MatGetFactor()
1567*6444a565SStefano Zampini @*/
1568*6444a565SStefano Zampini PetscErrorCode MatMumpsGetSchurComplement(Mat F,Mat* S)
1569*6444a565SStefano Zampini {
1570*6444a565SStefano Zampini   PetscErrorCode ierr;
1571*6444a565SStefano Zampini 
1572*6444a565SStefano Zampini   PetscFunctionBegin;
1573*6444a565SStefano Zampini   ierr = PetscTryMethod(F,"MatMumpsGetSchurComplement_C",(Mat,Mat*),(F,S));CHKERRQ(ierr);
1574*6444a565SStefano Zampini   PetscFunctionReturn(0);
1575*6444a565SStefano Zampini }
1576*6444a565SStefano Zampini 
1577*6444a565SStefano Zampini /* -------------------------------------------------------------------------------------------*/
1578*6444a565SStefano Zampini #undef __FUNCT__
15795ccb76cbSHong Zhang #define __FUNCT__ "MatMumpsSetIcntl_MUMPS"
15805ccb76cbSHong Zhang PetscErrorCode MatMumpsSetIcntl_MUMPS(Mat F,PetscInt icntl,PetscInt ival)
15815ccb76cbSHong Zhang {
1582a5e57a09SHong Zhang   Mat_MUMPS *mumps =(Mat_MUMPS*)F->spptr;
15835ccb76cbSHong Zhang 
15845ccb76cbSHong Zhang   PetscFunctionBegin;
1585a5e57a09SHong Zhang   mumps->id.ICNTL(icntl) = ival;
15865ccb76cbSHong Zhang   PetscFunctionReturn(0);
15875ccb76cbSHong Zhang }
15885ccb76cbSHong Zhang 
15895ccb76cbSHong Zhang #undef __FUNCT__
1590bc6112feSHong Zhang #define __FUNCT__ "MatMumpsGetIcntl_MUMPS"
1591bc6112feSHong Zhang PetscErrorCode MatMumpsGetIcntl_MUMPS(Mat F,PetscInt icntl,PetscInt *ival)
1592bc6112feSHong Zhang {
1593bc6112feSHong Zhang   Mat_MUMPS *mumps =(Mat_MUMPS*)F->spptr;
1594bc6112feSHong Zhang 
1595bc6112feSHong Zhang   PetscFunctionBegin;
1596bc6112feSHong Zhang   *ival = mumps->id.ICNTL(icntl);
1597bc6112feSHong Zhang   PetscFunctionReturn(0);
1598bc6112feSHong Zhang }
1599bc6112feSHong Zhang 
1600bc6112feSHong Zhang #undef __FUNCT__
16015ccb76cbSHong Zhang #define __FUNCT__ "MatMumpsSetIcntl"
16025ccb76cbSHong Zhang /*@
16035ccb76cbSHong Zhang   MatMumpsSetIcntl - Set MUMPS parameter ICNTL()
16045ccb76cbSHong Zhang 
16055ccb76cbSHong Zhang    Logically Collective on Mat
16065ccb76cbSHong Zhang 
16075ccb76cbSHong Zhang    Input Parameters:
16085ccb76cbSHong Zhang +  F - the factored matrix obtained by calling MatGetFactor() from PETSc-MUMPS interface
16095ccb76cbSHong Zhang .  icntl - index of MUMPS parameter array ICNTL()
16105ccb76cbSHong Zhang -  ival - value of MUMPS ICNTL(icntl)
16115ccb76cbSHong Zhang 
16125ccb76cbSHong Zhang   Options Database:
16135ccb76cbSHong Zhang .   -mat_mumps_icntl_<icntl> <ival>
16145ccb76cbSHong Zhang 
16155ccb76cbSHong Zhang    Level: beginner
16165ccb76cbSHong Zhang 
16175ccb76cbSHong Zhang    References: MUMPS Users' Guide
16185ccb76cbSHong Zhang 
16195ccb76cbSHong Zhang .seealso: MatGetFactor()
16205ccb76cbSHong Zhang @*/
16215ccb76cbSHong Zhang PetscErrorCode MatMumpsSetIcntl(Mat F,PetscInt icntl,PetscInt ival)
16225ccb76cbSHong Zhang {
16235ccb76cbSHong Zhang   PetscErrorCode ierr;
16245ccb76cbSHong Zhang 
16255ccb76cbSHong Zhang   PetscFunctionBegin;
16265ccb76cbSHong Zhang   PetscValidLogicalCollectiveInt(F,icntl,2);
16275ccb76cbSHong Zhang   PetscValidLogicalCollectiveInt(F,ival,3);
16285ccb76cbSHong Zhang   ierr = PetscTryMethod(F,"MatMumpsSetIcntl_C",(Mat,PetscInt,PetscInt),(F,icntl,ival));CHKERRQ(ierr);
16295ccb76cbSHong Zhang   PetscFunctionReturn(0);
16305ccb76cbSHong Zhang }
16315ccb76cbSHong Zhang 
1632bc6112feSHong Zhang #undef __FUNCT__
1633bc6112feSHong Zhang #define __FUNCT__ "MatMumpsGetIcntl"
1634a21f80fcSHong Zhang /*@
1635a21f80fcSHong Zhang   MatMumpsGetIcntl - Get MUMPS parameter ICNTL()
1636a21f80fcSHong Zhang 
1637a21f80fcSHong Zhang    Logically Collective on Mat
1638a21f80fcSHong Zhang 
1639a21f80fcSHong Zhang    Input Parameters:
1640a21f80fcSHong Zhang +  F - the factored matrix obtained by calling MatGetFactor() from PETSc-MUMPS interface
1641a21f80fcSHong Zhang -  icntl - index of MUMPS parameter array ICNTL()
1642a21f80fcSHong Zhang 
1643a21f80fcSHong Zhang   Output Parameter:
1644a21f80fcSHong Zhang .  ival - value of MUMPS ICNTL(icntl)
1645a21f80fcSHong Zhang 
1646a21f80fcSHong Zhang    Level: beginner
1647a21f80fcSHong Zhang 
1648a21f80fcSHong Zhang    References: MUMPS Users' Guide
1649a21f80fcSHong Zhang 
1650a21f80fcSHong Zhang .seealso: MatGetFactor()
1651a21f80fcSHong Zhang @*/
1652bc6112feSHong Zhang PetscErrorCode MatMumpsGetIcntl(Mat F,PetscInt icntl,PetscInt *ival)
1653bc6112feSHong Zhang {
1654bc6112feSHong Zhang   PetscErrorCode ierr;
1655bc6112feSHong Zhang 
1656bc6112feSHong Zhang   PetscFunctionBegin;
1657bc6112feSHong Zhang   PetscValidLogicalCollectiveInt(F,icntl,2);
1658bc6112feSHong Zhang   PetscValidIntPointer(ival,3);
1659bc6112feSHong Zhang   ierr = PetscTryMethod(F,"MatMumpsGetIcntl_C",(Mat,PetscInt,PetscInt*),(F,icntl,ival));CHKERRQ(ierr);
1660bc6112feSHong Zhang   PetscFunctionReturn(0);
1661bc6112feSHong Zhang }
1662bc6112feSHong Zhang 
16638928b65cSHong Zhang /* -------------------------------------------------------------------------------------------*/
16648928b65cSHong Zhang #undef __FUNCT__
16658928b65cSHong Zhang #define __FUNCT__ "MatMumpsSetCntl_MUMPS"
16668928b65cSHong Zhang PetscErrorCode MatMumpsSetCntl_MUMPS(Mat F,PetscInt icntl,PetscReal val)
16678928b65cSHong Zhang {
16688928b65cSHong Zhang   Mat_MUMPS *mumps =(Mat_MUMPS*)F->spptr;
16698928b65cSHong Zhang 
16708928b65cSHong Zhang   PetscFunctionBegin;
16718928b65cSHong Zhang   mumps->id.CNTL(icntl) = val;
16728928b65cSHong Zhang   PetscFunctionReturn(0);
16738928b65cSHong Zhang }
16748928b65cSHong Zhang 
16758928b65cSHong Zhang #undef __FUNCT__
1676bc6112feSHong Zhang #define __FUNCT__ "MatMumpsGetCntl_MUMPS"
1677bc6112feSHong Zhang PetscErrorCode MatMumpsGetCntl_MUMPS(Mat F,PetscInt icntl,PetscReal *val)
1678bc6112feSHong Zhang {
1679bc6112feSHong Zhang   Mat_MUMPS *mumps =(Mat_MUMPS*)F->spptr;
1680bc6112feSHong Zhang 
1681bc6112feSHong Zhang   PetscFunctionBegin;
1682bc6112feSHong Zhang   *val = mumps->id.CNTL(icntl);
1683bc6112feSHong Zhang   PetscFunctionReturn(0);
1684bc6112feSHong Zhang }
1685bc6112feSHong Zhang 
1686bc6112feSHong Zhang #undef __FUNCT__
16878928b65cSHong Zhang #define __FUNCT__ "MatMumpsSetCntl"
16888928b65cSHong Zhang /*@
16898928b65cSHong Zhang   MatMumpsSetCntl - Set MUMPS parameter CNTL()
16908928b65cSHong Zhang 
16918928b65cSHong Zhang    Logically Collective on Mat
16928928b65cSHong Zhang 
16938928b65cSHong Zhang    Input Parameters:
16948928b65cSHong Zhang +  F - the factored matrix obtained by calling MatGetFactor() from PETSc-MUMPS interface
16958928b65cSHong Zhang .  icntl - index of MUMPS parameter array CNTL()
16968928b65cSHong Zhang -  val - value of MUMPS CNTL(icntl)
16978928b65cSHong Zhang 
16988928b65cSHong Zhang   Options Database:
16998928b65cSHong Zhang .   -mat_mumps_cntl_<icntl> <val>
17008928b65cSHong Zhang 
17018928b65cSHong Zhang    Level: beginner
17028928b65cSHong Zhang 
17038928b65cSHong Zhang    References: MUMPS Users' Guide
17048928b65cSHong Zhang 
17058928b65cSHong Zhang .seealso: MatGetFactor()
17068928b65cSHong Zhang @*/
17078928b65cSHong Zhang PetscErrorCode MatMumpsSetCntl(Mat F,PetscInt icntl,PetscReal val)
17088928b65cSHong Zhang {
17098928b65cSHong Zhang   PetscErrorCode ierr;
17108928b65cSHong Zhang 
17118928b65cSHong Zhang   PetscFunctionBegin;
17128928b65cSHong Zhang   PetscValidLogicalCollectiveInt(F,icntl,2);
1713bc6112feSHong Zhang   PetscValidLogicalCollectiveReal(F,val,3);
17148928b65cSHong Zhang   ierr = PetscTryMethod(F,"MatMumpsSetCntl_C",(Mat,PetscInt,PetscReal),(F,icntl,val));CHKERRQ(ierr);
17158928b65cSHong Zhang   PetscFunctionReturn(0);
17168928b65cSHong Zhang }
17178928b65cSHong Zhang 
1718bc6112feSHong Zhang #undef __FUNCT__
1719bc6112feSHong Zhang #define __FUNCT__ "MatMumpsGetCntl"
1720a21f80fcSHong Zhang /*@
1721a21f80fcSHong Zhang   MatMumpsGetCntl - Get MUMPS parameter CNTL()
1722a21f80fcSHong Zhang 
1723a21f80fcSHong Zhang    Logically Collective on Mat
1724a21f80fcSHong Zhang 
1725a21f80fcSHong Zhang    Input Parameters:
1726a21f80fcSHong Zhang +  F - the factored matrix obtained by calling MatGetFactor() from PETSc-MUMPS interface
1727a21f80fcSHong Zhang -  icntl - index of MUMPS parameter array CNTL()
1728a21f80fcSHong Zhang 
1729a21f80fcSHong Zhang   Output Parameter:
1730a21f80fcSHong Zhang .  val - value of MUMPS CNTL(icntl)
1731a21f80fcSHong Zhang 
1732a21f80fcSHong Zhang    Level: beginner
1733a21f80fcSHong Zhang 
1734a21f80fcSHong Zhang    References: MUMPS Users' Guide
1735a21f80fcSHong Zhang 
1736a21f80fcSHong Zhang .seealso: MatGetFactor()
1737a21f80fcSHong Zhang @*/
1738bc6112feSHong Zhang PetscErrorCode MatMumpsGetCntl(Mat F,PetscInt icntl,PetscReal *val)
1739bc6112feSHong Zhang {
1740bc6112feSHong Zhang   PetscErrorCode ierr;
1741bc6112feSHong Zhang 
1742bc6112feSHong Zhang   PetscFunctionBegin;
1743bc6112feSHong Zhang   PetscValidLogicalCollectiveInt(F,icntl,2);
1744bc6112feSHong Zhang   PetscValidRealPointer(val,3);
1745bc6112feSHong Zhang   ierr = PetscTryMethod(F,"MatMumpsGetCntl_C",(Mat,PetscInt,PetscReal*),(F,icntl,val));CHKERRQ(ierr);
1746bc6112feSHong Zhang   PetscFunctionReturn(0);
1747bc6112feSHong Zhang }
1748bc6112feSHong Zhang 
1749bc6112feSHong Zhang #undef __FUNCT__
1750ca810319SHong Zhang #define __FUNCT__ "MatMumpsGetInfo_MUMPS"
1751ca810319SHong Zhang PetscErrorCode MatMumpsGetInfo_MUMPS(Mat F,PetscInt icntl,PetscInt *info)
1752bc6112feSHong Zhang {
1753bc6112feSHong Zhang   Mat_MUMPS *mumps =(Mat_MUMPS*)F->spptr;
1754bc6112feSHong Zhang 
1755bc6112feSHong Zhang   PetscFunctionBegin;
1756bc6112feSHong Zhang   *info = mumps->id.INFO(icntl);
1757bc6112feSHong Zhang   PetscFunctionReturn(0);
1758bc6112feSHong Zhang }
1759bc6112feSHong Zhang 
1760bc6112feSHong Zhang #undef __FUNCT__
1761ca810319SHong Zhang #define __FUNCT__ "MatMumpsGetInfog_MUMPS"
1762ca810319SHong Zhang PetscErrorCode MatMumpsGetInfog_MUMPS(Mat F,PetscInt icntl,PetscInt *infog)
1763bc6112feSHong Zhang {
1764bc6112feSHong Zhang   Mat_MUMPS *mumps =(Mat_MUMPS*)F->spptr;
1765bc6112feSHong Zhang 
1766bc6112feSHong Zhang   PetscFunctionBegin;
1767bc6112feSHong Zhang   *infog = mumps->id.INFOG(icntl);
1768bc6112feSHong Zhang   PetscFunctionReturn(0);
1769bc6112feSHong Zhang }
1770bc6112feSHong Zhang 
1771bc6112feSHong Zhang #undef __FUNCT__
1772ca810319SHong Zhang #define __FUNCT__ "MatMumpsGetRinfo_MUMPS"
1773ca810319SHong Zhang PetscErrorCode MatMumpsGetRinfo_MUMPS(Mat F,PetscInt icntl,PetscReal *rinfo)
1774bc6112feSHong Zhang {
1775bc6112feSHong Zhang   Mat_MUMPS *mumps =(Mat_MUMPS*)F->spptr;
1776bc6112feSHong Zhang 
1777bc6112feSHong Zhang   PetscFunctionBegin;
1778bc6112feSHong Zhang   *rinfo = mumps->id.RINFO(icntl);
1779bc6112feSHong Zhang   PetscFunctionReturn(0);
1780bc6112feSHong Zhang }
1781bc6112feSHong Zhang 
1782bc6112feSHong Zhang #undef __FUNCT__
1783ca810319SHong Zhang #define __FUNCT__ "MatMumpsGetRinfog_MUMPS"
1784ca810319SHong Zhang PetscErrorCode MatMumpsGetRinfog_MUMPS(Mat F,PetscInt icntl,PetscReal *rinfog)
1785bc6112feSHong Zhang {
1786bc6112feSHong Zhang   Mat_MUMPS *mumps =(Mat_MUMPS*)F->spptr;
1787bc6112feSHong Zhang 
1788bc6112feSHong Zhang   PetscFunctionBegin;
1789bc6112feSHong Zhang   *rinfog = mumps->id.RINFOG(icntl);
1790bc6112feSHong Zhang   PetscFunctionReturn(0);
1791bc6112feSHong Zhang }
1792bc6112feSHong Zhang 
1793bc6112feSHong Zhang #undef __FUNCT__
1794ca810319SHong Zhang #define __FUNCT__ "MatMumpsGetInfo"
1795a21f80fcSHong Zhang /*@
1796a21f80fcSHong Zhang   MatMumpsGetInfo - Get MUMPS parameter INFO()
1797a21f80fcSHong Zhang 
1798a21f80fcSHong Zhang    Logically Collective on Mat
1799a21f80fcSHong Zhang 
1800a21f80fcSHong Zhang    Input Parameters:
1801a21f80fcSHong Zhang +  F - the factored matrix obtained by calling MatGetFactor() from PETSc-MUMPS interface
1802a21f80fcSHong Zhang -  icntl - index of MUMPS parameter array INFO()
1803a21f80fcSHong Zhang 
1804a21f80fcSHong Zhang   Output Parameter:
1805a21f80fcSHong Zhang .  ival - value of MUMPS INFO(icntl)
1806a21f80fcSHong Zhang 
1807a21f80fcSHong Zhang    Level: beginner
1808a21f80fcSHong Zhang 
1809a21f80fcSHong Zhang    References: MUMPS Users' Guide
1810a21f80fcSHong Zhang 
1811a21f80fcSHong Zhang .seealso: MatGetFactor()
1812a21f80fcSHong Zhang @*/
1813ca810319SHong Zhang PetscErrorCode MatMumpsGetInfo(Mat F,PetscInt icntl,PetscInt *ival)
1814bc6112feSHong Zhang {
1815bc6112feSHong Zhang   PetscErrorCode ierr;
1816bc6112feSHong Zhang 
1817bc6112feSHong Zhang   PetscFunctionBegin;
1818ca810319SHong Zhang   PetscValidIntPointer(ival,3);
1819ca810319SHong Zhang   ierr = PetscTryMethod(F,"MatMumpsGetInfo_C",(Mat,PetscInt,PetscInt*),(F,icntl,ival));CHKERRQ(ierr);
1820bc6112feSHong Zhang   PetscFunctionReturn(0);
1821bc6112feSHong Zhang }
1822bc6112feSHong Zhang 
1823bc6112feSHong Zhang #undef __FUNCT__
1824ca810319SHong Zhang #define __FUNCT__ "MatMumpsGetInfog"
1825a21f80fcSHong Zhang /*@
1826a21f80fcSHong Zhang   MatMumpsGetInfog - Get MUMPS parameter INFOG()
1827a21f80fcSHong Zhang 
1828a21f80fcSHong Zhang    Logically Collective on Mat
1829a21f80fcSHong Zhang 
1830a21f80fcSHong Zhang    Input Parameters:
1831a21f80fcSHong Zhang +  F - the factored matrix obtained by calling MatGetFactor() from PETSc-MUMPS interface
1832a21f80fcSHong Zhang -  icntl - index of MUMPS parameter array INFOG()
1833a21f80fcSHong Zhang 
1834a21f80fcSHong Zhang   Output Parameter:
1835a21f80fcSHong Zhang .  ival - value of MUMPS INFOG(icntl)
1836a21f80fcSHong Zhang 
1837a21f80fcSHong Zhang    Level: beginner
1838a21f80fcSHong Zhang 
1839a21f80fcSHong Zhang    References: MUMPS Users' Guide
1840a21f80fcSHong Zhang 
1841a21f80fcSHong Zhang .seealso: MatGetFactor()
1842a21f80fcSHong Zhang @*/
1843ca810319SHong Zhang PetscErrorCode MatMumpsGetInfog(Mat F,PetscInt icntl,PetscInt *ival)
1844bc6112feSHong Zhang {
1845bc6112feSHong Zhang   PetscErrorCode ierr;
1846bc6112feSHong Zhang 
1847bc6112feSHong Zhang   PetscFunctionBegin;
1848ca810319SHong Zhang   PetscValidIntPointer(ival,3);
1849ca810319SHong Zhang   ierr = PetscTryMethod(F,"MatMumpsGetInfog_C",(Mat,PetscInt,PetscInt*),(F,icntl,ival));CHKERRQ(ierr);
1850bc6112feSHong Zhang   PetscFunctionReturn(0);
1851bc6112feSHong Zhang }
1852bc6112feSHong Zhang 
1853bc6112feSHong Zhang #undef __FUNCT__
1854ca810319SHong Zhang #define __FUNCT__ "MatMumpsGetRinfo"
1855a21f80fcSHong Zhang /*@
1856a21f80fcSHong Zhang   MatMumpsGetRinfo - Get MUMPS parameter RINFO()
1857a21f80fcSHong Zhang 
1858a21f80fcSHong Zhang    Logically Collective on Mat
1859a21f80fcSHong Zhang 
1860a21f80fcSHong Zhang    Input Parameters:
1861a21f80fcSHong Zhang +  F - the factored matrix obtained by calling MatGetFactor() from PETSc-MUMPS interface
1862a21f80fcSHong Zhang -  icntl - index of MUMPS parameter array RINFO()
1863a21f80fcSHong Zhang 
1864a21f80fcSHong Zhang   Output Parameter:
1865a21f80fcSHong Zhang .  val - value of MUMPS RINFO(icntl)
1866a21f80fcSHong Zhang 
1867a21f80fcSHong Zhang    Level: beginner
1868a21f80fcSHong Zhang 
1869a21f80fcSHong Zhang    References: MUMPS Users' Guide
1870a21f80fcSHong Zhang 
1871a21f80fcSHong Zhang .seealso: MatGetFactor()
1872a21f80fcSHong Zhang @*/
1873ca810319SHong Zhang PetscErrorCode MatMumpsGetRinfo(Mat F,PetscInt icntl,PetscReal *val)
1874bc6112feSHong Zhang {
1875bc6112feSHong Zhang   PetscErrorCode ierr;
1876bc6112feSHong Zhang 
1877bc6112feSHong Zhang   PetscFunctionBegin;
1878bc6112feSHong Zhang   PetscValidRealPointer(val,3);
1879ca810319SHong Zhang   ierr = PetscTryMethod(F,"MatMumpsGetRinfo_C",(Mat,PetscInt,PetscReal*),(F,icntl,val));CHKERRQ(ierr);
1880bc6112feSHong Zhang   PetscFunctionReturn(0);
1881bc6112feSHong Zhang }
1882bc6112feSHong Zhang 
1883bc6112feSHong Zhang #undef __FUNCT__
1884ca810319SHong Zhang #define __FUNCT__ "MatMumpsGetRinfog"
1885a21f80fcSHong Zhang /*@
1886a21f80fcSHong Zhang   MatMumpsGetRinfog - Get MUMPS parameter RINFOG()
1887a21f80fcSHong Zhang 
1888a21f80fcSHong Zhang    Logically Collective on Mat
1889a21f80fcSHong Zhang 
1890a21f80fcSHong Zhang    Input Parameters:
1891a21f80fcSHong Zhang +  F - the factored matrix obtained by calling MatGetFactor() from PETSc-MUMPS interface
1892a21f80fcSHong Zhang -  icntl - index of MUMPS parameter array RINFOG()
1893a21f80fcSHong Zhang 
1894a21f80fcSHong Zhang   Output Parameter:
1895a21f80fcSHong Zhang .  val - value of MUMPS RINFOG(icntl)
1896a21f80fcSHong Zhang 
1897a21f80fcSHong Zhang    Level: beginner
1898a21f80fcSHong Zhang 
1899a21f80fcSHong Zhang    References: MUMPS Users' Guide
1900a21f80fcSHong Zhang 
1901a21f80fcSHong Zhang .seealso: MatGetFactor()
1902a21f80fcSHong Zhang @*/
1903ca810319SHong Zhang PetscErrorCode MatMumpsGetRinfog(Mat F,PetscInt icntl,PetscReal *val)
1904bc6112feSHong Zhang {
1905bc6112feSHong Zhang   PetscErrorCode ierr;
1906bc6112feSHong Zhang 
1907bc6112feSHong Zhang   PetscFunctionBegin;
1908bc6112feSHong Zhang   PetscValidRealPointer(val,3);
1909ca810319SHong Zhang   ierr = PetscTryMethod(F,"MatMumpsGetRinfog_C",(Mat,PetscInt,PetscReal*),(F,icntl,val));CHKERRQ(ierr);
1910bc6112feSHong Zhang   PetscFunctionReturn(0);
1911bc6112feSHong Zhang }
1912bc6112feSHong Zhang 
191324b6179bSKris Buschelman /*MC
19142692d6eeSBarry Smith   MATSOLVERMUMPS -  A matrix type providing direct solvers (LU and Cholesky) for
191524b6179bSKris Buschelman   distributed and sequential matrices via the external package MUMPS.
191624b6179bSKris Buschelman 
191741c8de11SBarry Smith   Works with MATAIJ and MATSBAIJ matrices
191824b6179bSKris Buschelman 
191924b6179bSKris Buschelman   Options Database Keys:
19204e34a73bSHong Zhang +  -mat_mumps_icntl_1 <6>: ICNTL(1): output stream for error messages (None)
19214e34a73bSHong Zhang .  -mat_mumps_icntl_2 <0>: ICNTL(2): output stream for diagnostic printing, statistics, and warning (None)
19224e34a73bSHong Zhang .  -mat_mumps_icntl_3 <0>: ICNTL(3): output stream for global information, collected on the host (None)
19234e34a73bSHong Zhang .  -mat_mumps_icntl_4 <0>: ICNTL(4): level of printing (0 to 4) (None)
19244e34a73bSHong Zhang .  -mat_mumps_icntl_6 <7>: ICNTL(6): permutes to a zero-free diagonal and/or scale the matrix (0 to 7) (None)
19254e34a73bSHong Zhang .  -mat_mumps_icntl_7 <7>: ICNTL(7): computes a symmetric permutation in sequential analysis (0 to 7). 3=Scotch, 4=PORD, 5=Metis (None)
19264e34a73bSHong Zhang .  -mat_mumps_icntl_8 <77>: ICNTL(8): scaling strategy (-2 to 8 or 77) (None)
19274e34a73bSHong Zhang .  -mat_mumps_icntl_10 <0>: ICNTL(10): max num of refinements (None)
19284e34a73bSHong Zhang .  -mat_mumps_icntl_11 <0>: ICNTL(11): statistics related to an error analysis (via -ksp_view) (None)
19294e34a73bSHong Zhang .  -mat_mumps_icntl_12 <1>: ICNTL(12): an ordering strategy for symmetric matrices (0 to 3) (None)
19304e34a73bSHong Zhang .  -mat_mumps_icntl_13 <0>: ICNTL(13): parallelism of the root node (enable ScaLAPACK) and its splitting (None)
19314e34a73bSHong Zhang .  -mat_mumps_icntl_14 <20>: ICNTL(14): percentage increase in the estimated working space (None)
19324e34a73bSHong Zhang .  -mat_mumps_icntl_19 <0>: ICNTL(19): computes the Schur complement (None)
19334e34a73bSHong Zhang .  -mat_mumps_icntl_22 <0>: ICNTL(22): in-core/out-of-core factorization and solve (0 or 1) (None)
19344e34a73bSHong Zhang .  -mat_mumps_icntl_23 <0>: ICNTL(23): max size of the working memory (MB) that can allocate per processor (None)
19354e34a73bSHong Zhang .  -mat_mumps_icntl_24 <0>: ICNTL(24): detection of null pivot rows (0 or 1) (None)
19364e34a73bSHong Zhang .  -mat_mumps_icntl_25 <0>: ICNTL(25): compute a solution of a deficient matrix and a null space basis (None)
19374e34a73bSHong Zhang .  -mat_mumps_icntl_26 <0>: ICNTL(26): drives the solution phase if a Schur complement matrix (None)
19384e34a73bSHong Zhang .  -mat_mumps_icntl_28 <1>: ICNTL(28): use 1 for sequential analysis and ictnl(7) ordering, or 2 for parallel analysis and ictnl(29) ordering (None)
19394e34a73bSHong Zhang .  -mat_mumps_icntl_29 <0>: ICNTL(29): parallel ordering 1 = ptscotch, 2 = parmetis (None)
19404e34a73bSHong Zhang .  -mat_mumps_icntl_30 <0>: ICNTL(30): compute user-specified set of entries in inv(A) (None)
19414e34a73bSHong Zhang .  -mat_mumps_icntl_31 <0>: ICNTL(31): indicates which factors may be discarded during factorization (None)
19424e34a73bSHong Zhang .  -mat_mumps_icntl_33 <0>: ICNTL(33): compute determinant (None)
19434e34a73bSHong Zhang .  -mat_mumps_cntl_1 <0.01>: CNTL(1): relative pivoting threshold (None)
19444e34a73bSHong Zhang .  -mat_mumps_cntl_2 <1.49012e-08>: CNTL(2): stopping criterion of refinement (None)
19454e34a73bSHong Zhang .  -mat_mumps_cntl_3 <0>: CNTL(3): absolute pivoting threshold (None)
19464e34a73bSHong Zhang .  -mat_mumps_cntl_4 <-1>: CNTL(4): value for static pivoting (None)
19474e34a73bSHong Zhang -  -mat_mumps_cntl_5 <0>: CNTL(5): fixation for null pivots (None)
194824b6179bSKris Buschelman 
194924b6179bSKris Buschelman   Level: beginner
195024b6179bSKris Buschelman 
195141c8de11SBarry Smith .seealso: PCFactorSetMatSolverPackage(), MatSolverPackage
195241c8de11SBarry Smith 
195324b6179bSKris Buschelman M*/
195424b6179bSKris Buschelman 
195535bd34faSBarry Smith #undef __FUNCT__
195635bd34faSBarry Smith #define __FUNCT__ "MatFactorGetSolverPackage_mumps"
1957f7a08781SBarry Smith static PetscErrorCode MatFactorGetSolverPackage_mumps(Mat A,const MatSolverPackage *type)
195835bd34faSBarry Smith {
195935bd34faSBarry Smith   PetscFunctionBegin;
19602692d6eeSBarry Smith   *type = MATSOLVERMUMPS;
196135bd34faSBarry Smith   PetscFunctionReturn(0);
196235bd34faSBarry Smith }
196335bd34faSBarry Smith 
1964bccb9932SShri Abhyankar /* MatGetFactor for Seq and MPI AIJ matrices */
19652877fffaSHong Zhang #undef __FUNCT__
1966bccb9932SShri Abhyankar #define __FUNCT__ "MatGetFactor_aij_mumps"
19678cc058d9SJed Brown PETSC_EXTERN PetscErrorCode MatGetFactor_aij_mumps(Mat A,MatFactorType ftype,Mat *F)
19682877fffaSHong Zhang {
19692877fffaSHong Zhang   Mat            B;
19702877fffaSHong Zhang   PetscErrorCode ierr;
19712877fffaSHong Zhang   Mat_MUMPS      *mumps;
1972ace3abfcSBarry Smith   PetscBool      isSeqAIJ;
19732877fffaSHong Zhang 
19742877fffaSHong Zhang   PetscFunctionBegin;
19752877fffaSHong Zhang   /* Create the factorization matrix */
1976251f4c67SDmitry Karpeev   ierr = PetscObjectTypeCompare((PetscObject)A,MATSEQAIJ,&isSeqAIJ);CHKERRQ(ierr);
1977ce94432eSBarry Smith   ierr = MatCreate(PetscObjectComm((PetscObject)A),&B);CHKERRQ(ierr);
19782877fffaSHong Zhang   ierr = MatSetSizes(B,A->rmap->n,A->cmap->n,A->rmap->N,A->cmap->N);CHKERRQ(ierr);
19792877fffaSHong Zhang   ierr = MatSetType(B,((PetscObject)A)->type_name);CHKERRQ(ierr);
1980bccb9932SShri Abhyankar   if (isSeqAIJ) {
19810298fd71SBarry Smith     ierr = MatSeqAIJSetPreallocation(B,0,NULL);CHKERRQ(ierr);
1982bccb9932SShri Abhyankar   } else {
19830298fd71SBarry Smith     ierr = MatMPIAIJSetPreallocation(B,0,NULL,0,NULL);CHKERRQ(ierr);
1984bccb9932SShri Abhyankar   }
19852877fffaSHong Zhang 
1986b00a9115SJed Brown   ierr = PetscNewLog(B,&mumps);CHKERRQ(ierr);
19872205254eSKarl Rupp 
19882877fffaSHong Zhang   B->ops->view        = MatView_MUMPS;
198935bd34faSBarry Smith   B->ops->getinfo     = MatGetInfo_MUMPS;
199020be8e61SHong Zhang   B->ops->getdiagonal = MatGetDiagonal_MUMPS;
19912205254eSKarl Rupp 
1992bdf89e91SBarry Smith   ierr = PetscObjectComposeFunction((PetscObject)B,"MatFactorGetSolverPackage_C",MatFactorGetSolverPackage_mumps);CHKERRQ(ierr);
1993bdf89e91SBarry Smith   ierr = PetscObjectComposeFunction((PetscObject)B,"MatMumpsSetIcntl_C",MatMumpsSetIcntl_MUMPS);CHKERRQ(ierr);
1994bc6112feSHong Zhang   ierr = PetscObjectComposeFunction((PetscObject)B,"MatMumpsGetIcntl_C",MatMumpsGetIcntl_MUMPS);CHKERRQ(ierr);
1995bdf89e91SBarry Smith   ierr = PetscObjectComposeFunction((PetscObject)B,"MatMumpsSetCntl_C",MatMumpsSetCntl_MUMPS);CHKERRQ(ierr);
1996bc6112feSHong Zhang   ierr = PetscObjectComposeFunction((PetscObject)B,"MatMumpsGetCntl_C",MatMumpsGetCntl_MUMPS);CHKERRQ(ierr);
1997bc6112feSHong Zhang 
1998ca810319SHong Zhang   ierr = PetscObjectComposeFunction((PetscObject)B,"MatMumpsGetInfo_C",MatMumpsGetInfo_MUMPS);CHKERRQ(ierr);
1999ca810319SHong Zhang   ierr = PetscObjectComposeFunction((PetscObject)B,"MatMumpsGetInfog_C",MatMumpsGetInfog_MUMPS);CHKERRQ(ierr);
2000ca810319SHong Zhang   ierr = PetscObjectComposeFunction((PetscObject)B,"MatMumpsGetRinfo_C",MatMumpsGetRinfo_MUMPS);CHKERRQ(ierr);
2001ca810319SHong Zhang   ierr = PetscObjectComposeFunction((PetscObject)B,"MatMumpsGetRinfog_C",MatMumpsGetRinfog_MUMPS);CHKERRQ(ierr);
2002*6444a565SStefano Zampini 
2003*6444a565SStefano Zampini   ierr = PetscObjectComposeFunction((PetscObject)B,"MatMumpsSetSchurIndices_C",MatMumpsSetSchurIndices_MUMPS);CHKERRQ(ierr);
2004*6444a565SStefano Zampini   ierr = PetscObjectComposeFunction((PetscObject)B,"MatMumpsGetSchurComplement_C",MatMumpsGetSchurComplement_MUMPS);CHKERRQ(ierr);
2005450b117fSShri Abhyankar   if (ftype == MAT_FACTOR_LU) {
2006450b117fSShri Abhyankar     B->ops->lufactorsymbolic = MatLUFactorSymbolic_AIJMUMPS;
2007d5f3da31SBarry Smith     B->factortype            = MAT_FACTOR_LU;
2008bccb9932SShri Abhyankar     if (isSeqAIJ) mumps->ConvertToTriples = MatConvertToTriples_seqaij_seqaij;
2009bccb9932SShri Abhyankar     else mumps->ConvertToTriples = MatConvertToTriples_mpiaij_mpiaij;
2010746480a1SHong Zhang     mumps->sym = 0;
2011dcd589f8SShri Abhyankar   } else {
201267877ebaSShri Abhyankar     B->ops->choleskyfactorsymbolic = MatCholeskyFactorSymbolic_MUMPS;
2013450b117fSShri Abhyankar     B->factortype                  = MAT_FACTOR_CHOLESKY;
2014bccb9932SShri Abhyankar     if (isSeqAIJ) mumps->ConvertToTriples = MatConvertToTriples_seqaij_seqsbaij;
2015bccb9932SShri Abhyankar     else mumps->ConvertToTriples = MatConvertToTriples_mpiaij_mpisbaij;
20166fdc2a6dSBarry Smith     if (A->spd_set && A->spd) mumps->sym = 1;
20176fdc2a6dSBarry Smith     else                      mumps->sym = 2;
2018450b117fSShri Abhyankar   }
20192877fffaSHong Zhang 
20202877fffaSHong Zhang   mumps->isAIJ    = PETSC_TRUE;
2021bf0cc555SLisandro Dalcin   mumps->Destroy  = B->ops->destroy;
20222877fffaSHong Zhang   B->ops->destroy = MatDestroy_MUMPS;
20232877fffaSHong Zhang   B->spptr        = (void*)mumps;
20242205254eSKarl Rupp 
2025f697e70eSHong Zhang   ierr = PetscInitializeMUMPS(A,mumps);CHKERRQ(ierr);
2026746480a1SHong Zhang 
20272877fffaSHong Zhang   *F = B;
20282877fffaSHong Zhang   PetscFunctionReturn(0);
20292877fffaSHong Zhang }
20302877fffaSHong Zhang 
2031bccb9932SShri Abhyankar /* MatGetFactor for Seq and MPI SBAIJ matrices */
20322877fffaSHong Zhang #undef __FUNCT__
2033bccb9932SShri Abhyankar #define __FUNCT__ "MatGetFactor_sbaij_mumps"
20348cc058d9SJed Brown PETSC_EXTERN PetscErrorCode MatGetFactor_sbaij_mumps(Mat A,MatFactorType ftype,Mat *F)
20352877fffaSHong Zhang {
20362877fffaSHong Zhang   Mat            B;
20372877fffaSHong Zhang   PetscErrorCode ierr;
20382877fffaSHong Zhang   Mat_MUMPS      *mumps;
2039ace3abfcSBarry Smith   PetscBool      isSeqSBAIJ;
20402877fffaSHong Zhang 
20412877fffaSHong Zhang   PetscFunctionBegin;
2042ce94432eSBarry Smith   if (ftype != MAT_FACTOR_CHOLESKY) SETERRQ(PetscObjectComm((PetscObject)A),PETSC_ERR_SUP,"Cannot use PETSc SBAIJ matrices with MUMPS LU, use AIJ matrix");
2043ce94432eSBarry Smith   if (A->rmap->bs > 1) SETERRQ(PetscObjectComm((PetscObject)A),PETSC_ERR_SUP,"Cannot use PETSc SBAIJ matrices with block size > 1 with MUMPS Cholesky, use AIJ matrix instead");
2044251f4c67SDmitry Karpeev   ierr = PetscObjectTypeCompare((PetscObject)A,MATSEQSBAIJ,&isSeqSBAIJ);CHKERRQ(ierr);
20452877fffaSHong Zhang   /* Create the factorization matrix */
2046ce94432eSBarry Smith   ierr = MatCreate(PetscObjectComm((PetscObject)A),&B);CHKERRQ(ierr);
20472877fffaSHong Zhang   ierr = MatSetSizes(B,A->rmap->n,A->cmap->n,A->rmap->N,A->cmap->N);CHKERRQ(ierr);
20482877fffaSHong Zhang   ierr = MatSetType(B,((PetscObject)A)->type_name);CHKERRQ(ierr);
2049b00a9115SJed Brown   ierr = PetscNewLog(B,&mumps);CHKERRQ(ierr);
2050bccb9932SShri Abhyankar   if (isSeqSBAIJ) {
20510298fd71SBarry Smith     ierr = MatSeqSBAIJSetPreallocation(B,1,0,NULL);CHKERRQ(ierr);
20522205254eSKarl Rupp 
205316ebf90aSShri Abhyankar     mumps->ConvertToTriples = MatConvertToTriples_seqsbaij_seqsbaij;
2054dcd589f8SShri Abhyankar   } else {
20550298fd71SBarry Smith     ierr = MatMPISBAIJSetPreallocation(B,1,0,NULL,0,NULL);CHKERRQ(ierr);
20562205254eSKarl Rupp 
2057bccb9932SShri Abhyankar     mumps->ConvertToTriples = MatConvertToTriples_mpisbaij_mpisbaij;
2058bccb9932SShri Abhyankar   }
2059bccb9932SShri Abhyankar 
206067877ebaSShri Abhyankar   B->ops->choleskyfactorsymbolic = MatCholeskyFactorSymbolic_MUMPS;
2061bccb9932SShri Abhyankar   B->ops->view                   = MatView_MUMPS;
206220be8e61SHong Zhang   B->ops->getdiagonal            = MatGetDiagonal_MUMPS;
20632205254eSKarl Rupp 
2064bdf89e91SBarry Smith   ierr = PetscObjectComposeFunction((PetscObject)B,"MatFactorGetSolverPackage_C",MatFactorGetSolverPackage_mumps);CHKERRQ(ierr);
2065b13644aeSHong Zhang   ierr = PetscObjectComposeFunction((PetscObject)B,"MatMumpsSetIcntl_C",MatMumpsSetIcntl_MUMPS);CHKERRQ(ierr);
2066b13644aeSHong Zhang   ierr = PetscObjectComposeFunction((PetscObject)B,"MatMumpsGetIcntl_C",MatMumpsGetIcntl_MUMPS);CHKERRQ(ierr);
2067b13644aeSHong Zhang   ierr = PetscObjectComposeFunction((PetscObject)B,"MatMumpsSetCntl_C",MatMumpsSetCntl_MUMPS);CHKERRQ(ierr);
2068b13644aeSHong Zhang   ierr = PetscObjectComposeFunction((PetscObject)B,"MatMumpsGetCntl_C",MatMumpsGetCntl_MUMPS);CHKERRQ(ierr);
2069bc6112feSHong Zhang 
2070ca810319SHong Zhang   ierr = PetscObjectComposeFunction((PetscObject)B,"MatMumpsGetInfo_C",MatMumpsGetInfo_MUMPS);CHKERRQ(ierr);
2071ca810319SHong Zhang   ierr = PetscObjectComposeFunction((PetscObject)B,"MatMumpsGetInfog_C",MatMumpsGetInfog_MUMPS);CHKERRQ(ierr);
2072ca810319SHong Zhang   ierr = PetscObjectComposeFunction((PetscObject)B,"MatMumpsGetRinfo_C",MatMumpsGetRinfo_MUMPS);CHKERRQ(ierr);
2073ca810319SHong Zhang   ierr = PetscObjectComposeFunction((PetscObject)B,"MatMumpsGetRinfog_C",MatMumpsGetRinfog_MUMPS);CHKERRQ(ierr);
20742205254eSKarl Rupp 
2075*6444a565SStefano Zampini   ierr = PetscObjectComposeFunction((PetscObject)B,"MatMumpsSetSchurIndices_C",MatMumpsSetSchurIndices_MUMPS);CHKERRQ(ierr);
2076*6444a565SStefano Zampini   ierr = PetscObjectComposeFunction((PetscObject)B,"MatMumpsGetSchurComplement_C",MatMumpsGetSchurComplement_MUMPS);CHKERRQ(ierr);
2077*6444a565SStefano Zampini 
2078f4762488SHong Zhang   B->factortype = MAT_FACTOR_CHOLESKY;
20796fdc2a6dSBarry Smith   if (A->spd_set && A->spd) mumps->sym = 1;
20806fdc2a6dSBarry Smith   else                      mumps->sym = 2;
2081a214ac2aSShri Abhyankar 
2082bccb9932SShri Abhyankar   mumps->isAIJ    = PETSC_FALSE;
2083bf0cc555SLisandro Dalcin   mumps->Destroy  = B->ops->destroy;
2084f3c0ef26SHong Zhang   B->ops->destroy = MatDestroy_MUMPS;
20852877fffaSHong Zhang   B->spptr        = (void*)mumps;
20862205254eSKarl Rupp 
2087f697e70eSHong Zhang   ierr = PetscInitializeMUMPS(A,mumps);CHKERRQ(ierr);
2088746480a1SHong Zhang 
20892877fffaSHong Zhang   *F = B;
20902877fffaSHong Zhang   PetscFunctionReturn(0);
20912877fffaSHong Zhang }
209297969023SHong Zhang 
2093450b117fSShri Abhyankar #undef __FUNCT__
2094bccb9932SShri Abhyankar #define __FUNCT__ "MatGetFactor_baij_mumps"
20958cc058d9SJed Brown PETSC_EXTERN PetscErrorCode MatGetFactor_baij_mumps(Mat A,MatFactorType ftype,Mat *F)
209667877ebaSShri Abhyankar {
209767877ebaSShri Abhyankar   Mat            B;
209867877ebaSShri Abhyankar   PetscErrorCode ierr;
209967877ebaSShri Abhyankar   Mat_MUMPS      *mumps;
2100ace3abfcSBarry Smith   PetscBool      isSeqBAIJ;
210167877ebaSShri Abhyankar 
210267877ebaSShri Abhyankar   PetscFunctionBegin;
210367877ebaSShri Abhyankar   /* Create the factorization matrix */
2104251f4c67SDmitry Karpeev   ierr = PetscObjectTypeCompare((PetscObject)A,MATSEQBAIJ,&isSeqBAIJ);CHKERRQ(ierr);
2105ce94432eSBarry Smith   ierr = MatCreate(PetscObjectComm((PetscObject)A),&B);CHKERRQ(ierr);
210667877ebaSShri Abhyankar   ierr = MatSetSizes(B,A->rmap->n,A->cmap->n,A->rmap->N,A->cmap->N);CHKERRQ(ierr);
210767877ebaSShri Abhyankar   ierr = MatSetType(B,((PetscObject)A)->type_name);CHKERRQ(ierr);
2108bccb9932SShri Abhyankar   if (isSeqBAIJ) {
21090298fd71SBarry Smith     ierr = MatSeqBAIJSetPreallocation(B,A->rmap->bs,0,NULL);CHKERRQ(ierr);
2110bccb9932SShri Abhyankar   } else {
21110298fd71SBarry Smith     ierr = MatMPIBAIJSetPreallocation(B,A->rmap->bs,0,NULL,0,NULL);CHKERRQ(ierr);
2112bccb9932SShri Abhyankar   }
2113450b117fSShri Abhyankar 
2114b00a9115SJed Brown   ierr = PetscNewLog(B,&mumps);CHKERRQ(ierr);
2115450b117fSShri Abhyankar   if (ftype == MAT_FACTOR_LU) {
2116450b117fSShri Abhyankar     B->ops->lufactorsymbolic = MatLUFactorSymbolic_BAIJMUMPS;
2117450b117fSShri Abhyankar     B->factortype            = MAT_FACTOR_LU;
2118bccb9932SShri Abhyankar     if (isSeqBAIJ) mumps->ConvertToTriples = MatConvertToTriples_seqbaij_seqaij;
2119bccb9932SShri Abhyankar     else mumps->ConvertToTriples = MatConvertToTriples_mpibaij_mpiaij;
2120746480a1SHong Zhang     mumps->sym = 0;
2121f23aa3ddSBarry Smith   } else SETERRQ(PETSC_COMM_SELF,PETSC_ERR_SUP,"Cannot use PETSc BAIJ matrices with MUMPS Cholesky, use SBAIJ or AIJ matrix instead\n");
2122bccb9932SShri Abhyankar 
2123450b117fSShri Abhyankar   B->ops->view        = MatView_MUMPS;
212420be8e61SHong Zhang   B->ops->getdiagonal = MatGetDiagonal_MUMPS;
21252205254eSKarl Rupp 
2126bdf89e91SBarry Smith   ierr = PetscObjectComposeFunction((PetscObject)B,"MatFactorGetSolverPackage_C",MatFactorGetSolverPackage_mumps);CHKERRQ(ierr);
2127bdf89e91SBarry Smith   ierr = PetscObjectComposeFunction((PetscObject)B,"MatMumpsSetIcntl_C",MatMumpsSetIcntl_MUMPS);CHKERRQ(ierr);
2128bc6112feSHong Zhang   ierr = PetscObjectComposeFunction((PetscObject)B,"MatMumpsGetIcntl_C",MatMumpsGetIcntl_MUMPS);CHKERRQ(ierr);
2129bdf89e91SBarry Smith   ierr = PetscObjectComposeFunction((PetscObject)B,"MatMumpsSetCntl_C",MatMumpsSetCntl_MUMPS);CHKERRQ(ierr);
2130bc6112feSHong Zhang   ierr = PetscObjectComposeFunction((PetscObject)B,"MatMumpsGetCntl_C",MatMumpsGetCntl_MUMPS);CHKERRQ(ierr);
2131bc6112feSHong Zhang 
2132ca810319SHong Zhang   ierr = PetscObjectComposeFunction((PetscObject)B,"MatMumpsGetInfo_C",MatMumpsGetInfo_MUMPS);CHKERRQ(ierr);
2133ca810319SHong Zhang   ierr = PetscObjectComposeFunction((PetscObject)B,"MatMumpsGetInfog_C",MatMumpsGetInfog_MUMPS);CHKERRQ(ierr);
2134ca810319SHong Zhang   ierr = PetscObjectComposeFunction((PetscObject)B,"MatMumpsGetRinfo_C",MatMumpsGetRinfo_MUMPS);CHKERRQ(ierr);
2135ca810319SHong Zhang   ierr = PetscObjectComposeFunction((PetscObject)B,"MatMumpsGetRinfog_C",MatMumpsGetRinfog_MUMPS);CHKERRQ(ierr);
2136450b117fSShri Abhyankar 
2137*6444a565SStefano Zampini   ierr = PetscObjectComposeFunction((PetscObject)B,"MatMumpsSetSchurIndices_C",MatMumpsSetSchurIndices_MUMPS);CHKERRQ(ierr);
2138*6444a565SStefano Zampini   ierr = PetscObjectComposeFunction((PetscObject)B,"MatMumpsGetSchurComplement_C",MatMumpsGetSchurComplement_MUMPS);CHKERRQ(ierr);
2139*6444a565SStefano Zampini 
2140450b117fSShri Abhyankar   mumps->isAIJ    = PETSC_TRUE;
2141bf0cc555SLisandro Dalcin   mumps->Destroy  = B->ops->destroy;
2142450b117fSShri Abhyankar   B->ops->destroy = MatDestroy_MUMPS;
2143450b117fSShri Abhyankar   B->spptr        = (void*)mumps;
21442205254eSKarl Rupp 
2145f697e70eSHong Zhang   ierr = PetscInitializeMUMPS(A,mumps);CHKERRQ(ierr);
2146746480a1SHong Zhang 
2147450b117fSShri Abhyankar   *F = B;
2148450b117fSShri Abhyankar   PetscFunctionReturn(0);
2149450b117fSShri Abhyankar }
215042c9c57cSBarry Smith 
215142c9c57cSBarry Smith PETSC_EXTERN PetscErrorCode MatGetFactor_aij_mumps(Mat,MatFactorType,Mat*);
215242c9c57cSBarry Smith PETSC_EXTERN PetscErrorCode MatGetFactor_baij_mumps(Mat,MatFactorType,Mat*);
215342c9c57cSBarry Smith PETSC_EXTERN PetscErrorCode MatGetFactor_sbaij_mumps(Mat,MatFactorType,Mat*);
215442c9c57cSBarry Smith 
215542c9c57cSBarry Smith #undef __FUNCT__
215642c9c57cSBarry Smith #define __FUNCT__ "MatSolverPackageRegister_MUMPS"
215729b38603SBarry Smith PETSC_EXTERN PetscErrorCode MatSolverPackageRegister_MUMPS(void)
215842c9c57cSBarry Smith {
215942c9c57cSBarry Smith   PetscErrorCode ierr;
216042c9c57cSBarry Smith 
216142c9c57cSBarry Smith   PetscFunctionBegin;
216242c9c57cSBarry Smith   ierr = MatSolverPackageRegister(MATSOLVERMUMPS,MATMPIAIJ,         MAT_FACTOR_LU,MatGetFactor_aij_mumps);CHKERRQ(ierr);
216342c9c57cSBarry Smith   ierr = MatSolverPackageRegister(MATSOLVERMUMPS,MATMPIAIJ,         MAT_FACTOR_CHOLESKY,MatGetFactor_aij_mumps);CHKERRQ(ierr);
216442c9c57cSBarry Smith   ierr = MatSolverPackageRegister(MATSOLVERMUMPS,MATMPIBAIJ,         MAT_FACTOR_LU,MatGetFactor_baij_mumps);CHKERRQ(ierr);
216542c9c57cSBarry Smith   ierr = MatSolverPackageRegister(MATSOLVERMUMPS,MATMPIBAIJ,         MAT_FACTOR_CHOLESKY,MatGetFactor_baij_mumps);CHKERRQ(ierr);
216642c9c57cSBarry Smith   ierr = MatSolverPackageRegister(MATSOLVERMUMPS,MATMPISBAIJ,         MAT_FACTOR_CHOLESKY,MatGetFactor_sbaij_mumps);CHKERRQ(ierr);
216742c9c57cSBarry Smith   ierr = MatSolverPackageRegister(MATSOLVERMUMPS,MATSEQAIJ,         MAT_FACTOR_LU,MatGetFactor_aij_mumps);CHKERRQ(ierr);
216842c9c57cSBarry Smith   ierr = MatSolverPackageRegister(MATSOLVERMUMPS,MATSEQAIJ,         MAT_FACTOR_CHOLESKY,MatGetFactor_aij_mumps);CHKERRQ(ierr);
216942c9c57cSBarry Smith   ierr = MatSolverPackageRegister(MATSOLVERMUMPS,MATSEQBAIJ,         MAT_FACTOR_LU,MatGetFactor_baij_mumps);CHKERRQ(ierr);
217042c9c57cSBarry Smith   ierr = MatSolverPackageRegister(MATSOLVERMUMPS,MATSEQBAIJ,         MAT_FACTOR_CHOLESKY,MatGetFactor_baij_mumps);CHKERRQ(ierr);
217142c9c57cSBarry Smith   ierr = MatSolverPackageRegister(MATSOLVERMUMPS,MATSEQSBAIJ,         MAT_FACTOR_CHOLESKY,MatGetFactor_sbaij_mumps);CHKERRQ(ierr);
217242c9c57cSBarry Smith   PetscFunctionReturn(0);
217342c9c57cSBarry Smith }
217442c9c57cSBarry Smith 
2175