xref: /petsc/src/mat/impls/aij/mpi/mumps/mumps.c (revision 5248a706e4630accd3e1258c7e536cb505fdff79)
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 
453d472b54SHong Zhang 
46397b6df1SKris Buschelman /* macros s.t. indices match MUMPS documentation */
47397b6df1SKris Buschelman #define ICNTL(I) icntl[(I)-1]
48397b6df1SKris Buschelman #define CNTL(I) cntl[(I)-1]
49397b6df1SKris Buschelman #define INFOG(I) infog[(I)-1]
50a7aca84bSHong Zhang #define INFO(I) info[(I)-1]
51397b6df1SKris Buschelman #define RINFOG(I) rinfog[(I)-1]
52adc1d99fSHong Zhang #define RINFO(I) rinfo[(I)-1]
53397b6df1SKris Buschelman 
54397b6df1SKris Buschelman typedef struct {
55397b6df1SKris Buschelman #if defined(PETSC_USE_COMPLEX)
562907cef9SHong Zhang #if defined(PETSC_USE_REAL_SINGLE)
572907cef9SHong Zhang   CMUMPS_STRUC_C id;
582907cef9SHong Zhang #else
59397b6df1SKris Buschelman   ZMUMPS_STRUC_C id;
602907cef9SHong Zhang #endif
612907cef9SHong Zhang #else
622907cef9SHong Zhang #if defined(PETSC_USE_REAL_SINGLE)
632907cef9SHong Zhang   SMUMPS_STRUC_C id;
64397b6df1SKris Buschelman #else
65397b6df1SKris Buschelman   DMUMPS_STRUC_C id;
66397b6df1SKris Buschelman #endif
672907cef9SHong Zhang #endif
682907cef9SHong Zhang 
69397b6df1SKris Buschelman   MatStructure   matstruc;
70c1490034SHong Zhang   PetscMPIInt    myid,size;
7116ebf90aSShri Abhyankar   PetscInt       *irn,*jcn,nz,sym,nSolve;
72397b6df1SKris Buschelman   PetscScalar    *val;
73397b6df1SKris Buschelman   MPI_Comm       comm_mumps;
74329ec9b3SHong Zhang   VecScatter     scat_rhs, scat_sol;
7564e6c443SBarry Smith   PetscBool      isAIJ,CleanUpMUMPS;
76329ec9b3SHong Zhang   Vec            b_seq,x_seq;
77bf0cc555SLisandro Dalcin   PetscErrorCode (*Destroy)(Mat);
78bccb9932SShri Abhyankar   PetscErrorCode (*ConvertToTriples)(Mat, int, MatReuse, int*, int**, int**, PetscScalar**);
79f0c56d0fSKris Buschelman } Mat_MUMPS;
80f0c56d0fSKris Buschelman 
8109573ac7SBarry Smith extern PetscErrorCode MatDuplicate_MUMPS(Mat,MatDuplicateOption,Mat*);
82b24902e0SBarry Smith 
8367877ebaSShri Abhyankar 
8467877ebaSShri Abhyankar /* MatConvertToTriples_A_B */
8567877ebaSShri Abhyankar /*convert Petsc matrix to triples: row[nz], col[nz], val[nz] */
86397b6df1SKris Buschelman /*
87397b6df1SKris Buschelman   input:
8867877ebaSShri Abhyankar     A       - matrix in aij,baij or sbaij (bs=1) format
89397b6df1SKris Buschelman     shift   - 0: C style output triple; 1: Fortran style output triple.
90bccb9932SShri Abhyankar     reuse   - MAT_INITIAL_MATRIX: spaces are allocated and values are set for the triple
91bccb9932SShri Abhyankar               MAT_REUSE_MATRIX:   only the values in v array are updated
92397b6df1SKris Buschelman   output:
93397b6df1SKris Buschelman     nnz     - dim of r, c, and v (number of local nonzero entries of A)
94397b6df1SKris Buschelman     r, c, v - row and col index, matrix values (matrix triples)
95397b6df1SKris Buschelman  */
9616ebf90aSShri Abhyankar 
9716ebf90aSShri Abhyankar #undef __FUNCT__
9816ebf90aSShri Abhyankar #define __FUNCT__ "MatConvertToTriples_seqaij_seqaij"
99bccb9932SShri Abhyankar PetscErrorCode MatConvertToTriples_seqaij_seqaij(Mat A,int shift,MatReuse reuse,int *nnz,int **r, int **c, PetscScalar **v)
100b24902e0SBarry Smith {
101185f6596SHong Zhang   const PetscInt   *ai,*aj,*ajj,M=A->rmap->n;
10267877ebaSShri Abhyankar   PetscInt         nz,rnz,i,j;
103dfbe8321SBarry Smith   PetscErrorCode   ierr;
104c1490034SHong Zhang   PetscInt         *row,*col;
10516ebf90aSShri Abhyankar   Mat_SeqAIJ       *aa=(Mat_SeqAIJ*)A->data;
106397b6df1SKris Buschelman 
107397b6df1SKris Buschelman   PetscFunctionBegin;
10816ebf90aSShri Abhyankar   *v=aa->a;
109bccb9932SShri Abhyankar   if (reuse == MAT_INITIAL_MATRIX){
11016ebf90aSShri Abhyankar     nz = aa->nz; ai = aa->i; aj = aa->j;
11116ebf90aSShri Abhyankar     *nnz = nz;
112185f6596SHong Zhang     ierr = PetscMalloc(2*nz*sizeof(PetscInt), &row);CHKERRQ(ierr);
113185f6596SHong Zhang     col  = row + nz;
114185f6596SHong Zhang 
11516ebf90aSShri Abhyankar     nz = 0;
11616ebf90aSShri Abhyankar     for (i=0; i<M; i++) {
11716ebf90aSShri Abhyankar       rnz = ai[i+1] - ai[i];
11867877ebaSShri Abhyankar       ajj = aj + ai[i];
11967877ebaSShri Abhyankar       for (j=0; j<rnz; j++) {
12067877ebaSShri Abhyankar 	row[nz] = i+shift; col[nz++] = ajj[j] + shift;
12116ebf90aSShri Abhyankar       }
12216ebf90aSShri Abhyankar     }
12316ebf90aSShri Abhyankar     *r = row; *c = col;
12416ebf90aSShri Abhyankar   }
12516ebf90aSShri Abhyankar   PetscFunctionReturn(0);
12616ebf90aSShri Abhyankar }
127397b6df1SKris Buschelman 
12816ebf90aSShri Abhyankar #undef __FUNCT__
12967877ebaSShri Abhyankar #define __FUNCT__ "MatConvertToTriples_seqbaij_seqaij"
130bccb9932SShri Abhyankar PetscErrorCode MatConvertToTriples_seqbaij_seqaij(Mat A,int shift,MatReuse reuse,int *nnz,int **r, int **c, PetscScalar **v)
13167877ebaSShri Abhyankar {
13267877ebaSShri Abhyankar   Mat_SeqBAIJ        *aa=(Mat_SeqBAIJ*)A->data;
13367877ebaSShri Abhyankar   const PetscInt     *ai,*aj,*ajj,bs=A->rmap->bs,bs2=aa->bs2,M=A->rmap->N/bs;
1340ad0caddSJed Brown   PetscInt           nz,idx=0,rnz,i,j,k,m;
13567877ebaSShri Abhyankar   PetscErrorCode     ierr;
13667877ebaSShri Abhyankar   PetscInt           *row,*col;
13767877ebaSShri Abhyankar 
13867877ebaSShri Abhyankar   PetscFunctionBegin;
139cf3759fdSShri Abhyankar   *v = aa->a;
140bccb9932SShri Abhyankar   if (reuse == MAT_INITIAL_MATRIX){
141cf3759fdSShri Abhyankar     ai = aa->i; aj = aa->j;
14267877ebaSShri Abhyankar     nz = bs2*aa->nz;
14367877ebaSShri Abhyankar     *nnz = nz;
144185f6596SHong Zhang     ierr = PetscMalloc(2*nz*sizeof(PetscInt), &row);CHKERRQ(ierr);
145185f6596SHong Zhang     col  = row + nz;
146185f6596SHong Zhang 
14767877ebaSShri Abhyankar     for (i=0; i<M; i++) {
14867877ebaSShri Abhyankar       ajj = aj + ai[i];
14967877ebaSShri Abhyankar       rnz = ai[i+1] - ai[i];
15067877ebaSShri Abhyankar       for (k=0; k<rnz; k++) {
15167877ebaSShri Abhyankar 	for (j=0; j<bs; j++) {
15267877ebaSShri Abhyankar 	  for (m=0; m<bs; m++) {
15367877ebaSShri Abhyankar 	    row[idx]     = i*bs + m + shift;
154cf3759fdSShri Abhyankar 	    col[idx++]   = bs*(ajj[k]) + j + shift;
15567877ebaSShri Abhyankar 	  }
15667877ebaSShri Abhyankar 	}
15767877ebaSShri Abhyankar       }
15867877ebaSShri Abhyankar     }
159cf3759fdSShri Abhyankar     *r = row; *c = col;
16067877ebaSShri Abhyankar   }
16167877ebaSShri Abhyankar   PetscFunctionReturn(0);
16267877ebaSShri Abhyankar }
16367877ebaSShri Abhyankar 
16467877ebaSShri Abhyankar #undef __FUNCT__
16516ebf90aSShri Abhyankar #define __FUNCT__ "MatConvertToTriples_seqsbaij_seqsbaij"
166bccb9932SShri Abhyankar PetscErrorCode MatConvertToTriples_seqsbaij_seqsbaij(Mat A,int shift,MatReuse reuse,int *nnz,int **r, int **c, PetscScalar **v)
16716ebf90aSShri Abhyankar {
16867877ebaSShri Abhyankar   const PetscInt   *ai, *aj,*ajj,M=A->rmap->n;
16967877ebaSShri Abhyankar   PetscInt         nz,rnz,i,j;
17016ebf90aSShri Abhyankar   PetscErrorCode   ierr;
17116ebf90aSShri Abhyankar   PetscInt         *row,*col;
17216ebf90aSShri Abhyankar   Mat_SeqSBAIJ     *aa=(Mat_SeqSBAIJ*)A->data;
17316ebf90aSShri Abhyankar 
17416ebf90aSShri Abhyankar   PetscFunctionBegin;
175882afa5aSHong Zhang   *v = aa->a;
176bccb9932SShri Abhyankar   if (reuse == MAT_INITIAL_MATRIX){
17716ebf90aSShri Abhyankar     nz = aa->nz;ai=aa->i; aj=aa->j;*v=aa->a;
17816ebf90aSShri Abhyankar     *nnz = nz;
179185f6596SHong Zhang     ierr = PetscMalloc(2*nz*sizeof(PetscInt), &row);CHKERRQ(ierr);
180185f6596SHong Zhang     col  = row + nz;
181185f6596SHong Zhang 
18216ebf90aSShri Abhyankar     nz = 0;
18316ebf90aSShri Abhyankar     for (i=0; i<M; i++) {
18416ebf90aSShri Abhyankar       rnz = ai[i+1] - ai[i];
18567877ebaSShri Abhyankar       ajj = aj + ai[i];
18667877ebaSShri Abhyankar       for (j=0; j<rnz; j++) {
18767877ebaSShri Abhyankar 	row[nz] = i+shift; col[nz++] = ajj[j] + shift;
18816ebf90aSShri Abhyankar       }
18916ebf90aSShri Abhyankar     }
19016ebf90aSShri Abhyankar     *r = row; *c = col;
19116ebf90aSShri Abhyankar   }
19216ebf90aSShri Abhyankar   PetscFunctionReturn(0);
19316ebf90aSShri Abhyankar }
19416ebf90aSShri Abhyankar 
19516ebf90aSShri Abhyankar #undef __FUNCT__
19616ebf90aSShri Abhyankar #define __FUNCT__ "MatConvertToTriples_seqaij_seqsbaij"
197bccb9932SShri Abhyankar PetscErrorCode MatConvertToTriples_seqaij_seqsbaij(Mat A,int shift,MatReuse reuse,int *nnz,int **r, int **c, PetscScalar **v)
19816ebf90aSShri Abhyankar {
19967877ebaSShri Abhyankar   const PetscInt     *ai,*aj,*ajj,*adiag,M=A->rmap->n;
20067877ebaSShri Abhyankar   PetscInt           nz,rnz,i,j;
20167877ebaSShri Abhyankar   const PetscScalar  *av,*v1;
20216ebf90aSShri Abhyankar   PetscScalar        *val;
20316ebf90aSShri Abhyankar   PetscErrorCode     ierr;
20416ebf90aSShri Abhyankar   PetscInt           *row,*col;
20516ebf90aSShri Abhyankar   Mat_SeqSBAIJ       *aa=(Mat_SeqSBAIJ*)A->data;
20616ebf90aSShri Abhyankar 
20716ebf90aSShri Abhyankar   PetscFunctionBegin;
20816ebf90aSShri Abhyankar   ai=aa->i; aj=aa->j;av=aa->a;
20916ebf90aSShri Abhyankar   adiag=aa->diag;
210bccb9932SShri Abhyankar   if (reuse == MAT_INITIAL_MATRIX){
21116ebf90aSShri Abhyankar     nz = M + (aa->nz-M)/2;
21216ebf90aSShri Abhyankar     *nnz = nz;
213185f6596SHong Zhang     ierr = PetscMalloc((2*nz*sizeof(PetscInt)+nz*sizeof(PetscScalar)), &row);CHKERRQ(ierr);
214185f6596SHong Zhang     col  = row + nz;
215185f6596SHong Zhang     val  = (PetscScalar*)(col + nz);
216185f6596SHong Zhang 
21716ebf90aSShri Abhyankar     nz = 0;
21816ebf90aSShri Abhyankar     for (i=0; i<M; i++) {
21916ebf90aSShri Abhyankar       rnz = ai[i+1] - adiag[i];
22067877ebaSShri Abhyankar       ajj  = aj + adiag[i];
221cf3759fdSShri Abhyankar       v1   = av + adiag[i];
22267877ebaSShri Abhyankar       for (j=0; j<rnz; j++) {
22367877ebaSShri Abhyankar 	row[nz] = i+shift; col[nz] = ajj[j] + shift; val[nz++] = v1[j];
22416ebf90aSShri Abhyankar       }
22516ebf90aSShri Abhyankar     }
22616ebf90aSShri Abhyankar     *r = row; *c = col; *v = val;
227397b6df1SKris Buschelman   } else {
22816ebf90aSShri Abhyankar     nz = 0; val = *v;
22916ebf90aSShri Abhyankar     for (i=0; i <M; i++) {
23016ebf90aSShri Abhyankar       rnz = ai[i+1] - adiag[i];
23167877ebaSShri Abhyankar       ajj = aj + adiag[i];
23267877ebaSShri Abhyankar       v1  = av + adiag[i];
23367877ebaSShri Abhyankar       for (j=0; j<rnz; j++) {
23467877ebaSShri Abhyankar 	val[nz++] = v1[j];
23516ebf90aSShri Abhyankar       }
23616ebf90aSShri Abhyankar     }
23716ebf90aSShri Abhyankar   }
23816ebf90aSShri Abhyankar   PetscFunctionReturn(0);
23916ebf90aSShri Abhyankar }
24016ebf90aSShri Abhyankar 
24116ebf90aSShri Abhyankar #undef __FUNCT__
24216ebf90aSShri Abhyankar #define __FUNCT__ "MatConvertToTriples_mpisbaij_mpisbaij"
243bccb9932SShri Abhyankar PetscErrorCode MatConvertToTriples_mpisbaij_mpisbaij(Mat A,int shift,MatReuse reuse,int *nnz,int **r, int **c, PetscScalar **v)
24416ebf90aSShri Abhyankar {
24516ebf90aSShri Abhyankar   const PetscInt     *ai, *aj, *bi, *bj,*garray,m=A->rmap->n,*ajj,*bjj;
24616ebf90aSShri Abhyankar   PetscErrorCode     ierr;
24716ebf90aSShri Abhyankar   PetscInt           rstart,nz,i,j,jj,irow,countA,countB;
24816ebf90aSShri Abhyankar   PetscInt           *row,*col;
24916ebf90aSShri Abhyankar   const PetscScalar  *av, *bv,*v1,*v2;
25016ebf90aSShri Abhyankar   PetscScalar        *val;
251397b6df1SKris Buschelman   Mat_MPISBAIJ       *mat =  (Mat_MPISBAIJ*)A->data;
252397b6df1SKris Buschelman   Mat_SeqSBAIJ       *aa=(Mat_SeqSBAIJ*)(mat->A)->data;
253397b6df1SKris Buschelman   Mat_SeqBAIJ        *bb=(Mat_SeqBAIJ*)(mat->B)->data;
25416ebf90aSShri Abhyankar 
25516ebf90aSShri Abhyankar   PetscFunctionBegin;
256d0f46423SBarry Smith   ai=aa->i; aj=aa->j; bi=bb->i; bj=bb->j; rstart= A->rmap->rstart;
257397b6df1SKris Buschelman   garray = mat->garray;
258397b6df1SKris Buschelman   av=aa->a; bv=bb->a;
259397b6df1SKris Buschelman 
260bccb9932SShri Abhyankar   if (reuse == MAT_INITIAL_MATRIX){
26116ebf90aSShri Abhyankar     nz = aa->nz + bb->nz;
26216ebf90aSShri Abhyankar     *nnz = nz;
263185f6596SHong Zhang     ierr = PetscMalloc((2*nz*sizeof(PetscInt)+nz*sizeof(PetscScalar)), &row);CHKERRQ(ierr);
264185f6596SHong Zhang     col  = row + nz;
265185f6596SHong Zhang     val  = (PetscScalar*)(col + nz);
266185f6596SHong Zhang 
267397b6df1SKris Buschelman     *r = row; *c = col; *v = val;
268397b6df1SKris Buschelman   } else {
269397b6df1SKris Buschelman     row = *r; col = *c; val = *v;
270397b6df1SKris Buschelman   }
271397b6df1SKris Buschelman 
272028e57e8SHong Zhang   jj = 0; irow = rstart;
273397b6df1SKris Buschelman   for ( i=0; i<m; i++ ) {
274397b6df1SKris Buschelman     ajj    = aj + ai[i];                 /* ptr to the beginning of this row */
275397b6df1SKris Buschelman     countA = ai[i+1] - ai[i];
276397b6df1SKris Buschelman     countB = bi[i+1] - bi[i];
277397b6df1SKris Buschelman     bjj    = bj + bi[i];
27816ebf90aSShri Abhyankar     v1     = av + ai[i];
27916ebf90aSShri Abhyankar     v2     = bv + bi[i];
280397b6df1SKris Buschelman 
281397b6df1SKris Buschelman     /* A-part */
282397b6df1SKris Buschelman     for (j=0; j<countA; j++){
283bccb9932SShri Abhyankar       if (reuse == MAT_INITIAL_MATRIX) {
284397b6df1SKris Buschelman         row[jj] = irow + shift; col[jj] = rstart + ajj[j] + shift;
285397b6df1SKris Buschelman       }
28616ebf90aSShri Abhyankar       val[jj++] = v1[j];
287397b6df1SKris Buschelman     }
28816ebf90aSShri Abhyankar 
28916ebf90aSShri Abhyankar     /* B-part */
29016ebf90aSShri Abhyankar     for (j=0; j < countB; j++){
291bccb9932SShri Abhyankar       if (reuse == MAT_INITIAL_MATRIX) {
292397b6df1SKris Buschelman 	row[jj] = irow + shift; col[jj] = garray[bjj[j]] + shift;
293397b6df1SKris Buschelman       }
29416ebf90aSShri Abhyankar       val[jj++] = v2[j];
29516ebf90aSShri Abhyankar     }
29616ebf90aSShri Abhyankar     irow++;
29716ebf90aSShri Abhyankar   }
29816ebf90aSShri Abhyankar   PetscFunctionReturn(0);
29916ebf90aSShri Abhyankar }
30016ebf90aSShri Abhyankar 
30116ebf90aSShri Abhyankar #undef __FUNCT__
30216ebf90aSShri Abhyankar #define __FUNCT__ "MatConvertToTriples_mpiaij_mpiaij"
303bccb9932SShri Abhyankar PetscErrorCode MatConvertToTriples_mpiaij_mpiaij(Mat A,int shift,MatReuse reuse,int *nnz,int **r, int **c, PetscScalar **v)
30416ebf90aSShri Abhyankar {
30516ebf90aSShri Abhyankar   const PetscInt     *ai, *aj, *bi, *bj,*garray,m=A->rmap->n,*ajj,*bjj;
30616ebf90aSShri Abhyankar   PetscErrorCode     ierr;
30716ebf90aSShri Abhyankar   PetscInt           rstart,nz,i,j,jj,irow,countA,countB;
30816ebf90aSShri Abhyankar   PetscInt           *row,*col;
30916ebf90aSShri Abhyankar   const PetscScalar  *av, *bv,*v1,*v2;
31016ebf90aSShri Abhyankar   PetscScalar        *val;
31116ebf90aSShri Abhyankar   Mat_MPIAIJ         *mat =  (Mat_MPIAIJ*)A->data;
31216ebf90aSShri Abhyankar   Mat_SeqAIJ         *aa=(Mat_SeqAIJ*)(mat->A)->data;
31316ebf90aSShri Abhyankar   Mat_SeqAIJ         *bb=(Mat_SeqAIJ*)(mat->B)->data;
31416ebf90aSShri Abhyankar 
31516ebf90aSShri Abhyankar   PetscFunctionBegin;
31616ebf90aSShri Abhyankar   ai=aa->i; aj=aa->j; bi=bb->i; bj=bb->j; rstart= A->rmap->rstart;
31716ebf90aSShri Abhyankar   garray = mat->garray;
31816ebf90aSShri Abhyankar   av=aa->a; bv=bb->a;
31916ebf90aSShri Abhyankar 
320bccb9932SShri Abhyankar   if (reuse == MAT_INITIAL_MATRIX){
32116ebf90aSShri Abhyankar     nz = aa->nz + bb->nz;
32216ebf90aSShri Abhyankar     *nnz = nz;
323185f6596SHong Zhang     ierr = PetscMalloc((2*nz*sizeof(PetscInt)+nz*sizeof(PetscScalar)), &row);CHKERRQ(ierr);
324185f6596SHong Zhang     col  = row + nz;
325185f6596SHong Zhang     val  = (PetscScalar*)(col + nz);
326185f6596SHong Zhang 
32716ebf90aSShri Abhyankar     *r = row; *c = col; *v = val;
32816ebf90aSShri Abhyankar   } else {
32916ebf90aSShri Abhyankar     row = *r; col = *c; val = *v;
33016ebf90aSShri Abhyankar   }
33116ebf90aSShri Abhyankar 
33216ebf90aSShri Abhyankar   jj = 0; irow = rstart;
33316ebf90aSShri Abhyankar   for ( i=0; i<m; i++ ) {
33416ebf90aSShri Abhyankar     ajj    = aj + ai[i];                 /* ptr to the beginning of this row */
33516ebf90aSShri Abhyankar     countA = ai[i+1] - ai[i];
33616ebf90aSShri Abhyankar     countB = bi[i+1] - bi[i];
33716ebf90aSShri Abhyankar     bjj    = bj + bi[i];
33816ebf90aSShri Abhyankar     v1     = av + ai[i];
33916ebf90aSShri Abhyankar     v2     = bv + bi[i];
34016ebf90aSShri Abhyankar 
34116ebf90aSShri Abhyankar     /* A-part */
34216ebf90aSShri Abhyankar     for (j=0; j<countA; j++){
343bccb9932SShri Abhyankar       if (reuse == MAT_INITIAL_MATRIX){
34416ebf90aSShri Abhyankar         row[jj] = irow + shift; col[jj] = rstart + ajj[j] + shift;
34516ebf90aSShri Abhyankar       }
34616ebf90aSShri Abhyankar       val[jj++] = v1[j];
34716ebf90aSShri Abhyankar     }
34816ebf90aSShri Abhyankar 
34916ebf90aSShri Abhyankar     /* B-part */
35016ebf90aSShri Abhyankar     for (j=0; j < countB; j++){
351bccb9932SShri Abhyankar       if (reuse == MAT_INITIAL_MATRIX){
35216ebf90aSShri Abhyankar 	row[jj] = irow + shift; col[jj] = garray[bjj[j]] + shift;
35316ebf90aSShri Abhyankar       }
35416ebf90aSShri Abhyankar       val[jj++] = v2[j];
35516ebf90aSShri Abhyankar     }
35616ebf90aSShri Abhyankar     irow++;
35716ebf90aSShri Abhyankar   }
35816ebf90aSShri Abhyankar   PetscFunctionReturn(0);
35916ebf90aSShri Abhyankar }
36016ebf90aSShri Abhyankar 
36116ebf90aSShri Abhyankar #undef __FUNCT__
36267877ebaSShri Abhyankar #define __FUNCT__ "MatConvertToTriples_mpibaij_mpiaij"
363bccb9932SShri Abhyankar PetscErrorCode MatConvertToTriples_mpibaij_mpiaij(Mat A,int shift,MatReuse reuse,int *nnz,int **r, int **c, PetscScalar **v)
36467877ebaSShri Abhyankar {
36567877ebaSShri Abhyankar   Mat_MPIBAIJ        *mat =  (Mat_MPIBAIJ*)A->data;
36667877ebaSShri Abhyankar   Mat_SeqBAIJ        *aa=(Mat_SeqBAIJ*)(mat->A)->data;
36767877ebaSShri Abhyankar   Mat_SeqBAIJ        *bb=(Mat_SeqBAIJ*)(mat->B)->data;
36867877ebaSShri Abhyankar   const PetscInt     *ai = aa->i, *bi = bb->i, *aj = aa->j, *bj = bb->j,*ajj, *bjj;
369d985c460SShri Abhyankar   const PetscInt     *garray = mat->garray,mbs=mat->mbs,rstart=A->rmap->rstart;
37067877ebaSShri Abhyankar   const PetscInt     bs = A->rmap->bs,bs2=mat->bs2;
37167877ebaSShri Abhyankar   PetscErrorCode     ierr;
37267877ebaSShri Abhyankar   PetscInt           nz,i,j,k,n,jj,irow,countA,countB,idx;
37367877ebaSShri Abhyankar   PetscInt           *row,*col;
37467877ebaSShri Abhyankar   const PetscScalar  *av=aa->a, *bv=bb->a,*v1,*v2;
37567877ebaSShri Abhyankar   PetscScalar        *val;
37667877ebaSShri Abhyankar 
37767877ebaSShri Abhyankar   PetscFunctionBegin;
37867877ebaSShri Abhyankar 
379bccb9932SShri Abhyankar   if (reuse == MAT_INITIAL_MATRIX) {
38067877ebaSShri Abhyankar     nz = bs2*(aa->nz + bb->nz);
38167877ebaSShri Abhyankar     *nnz = nz;
382185f6596SHong Zhang     ierr = PetscMalloc((2*nz*sizeof(PetscInt)+nz*sizeof(PetscScalar)), &row);CHKERRQ(ierr);
383185f6596SHong Zhang     col  = row + nz;
384185f6596SHong Zhang     val  = (PetscScalar*)(col + nz);
385185f6596SHong Zhang 
38667877ebaSShri Abhyankar     *r = row; *c = col; *v = val;
38767877ebaSShri Abhyankar   } else {
38867877ebaSShri Abhyankar     row = *r; col = *c; val = *v;
38967877ebaSShri Abhyankar   }
39067877ebaSShri Abhyankar 
391d985c460SShri Abhyankar   jj = 0; irow = rstart;
39267877ebaSShri Abhyankar   for ( i=0; i<mbs; i++ ) {
39367877ebaSShri Abhyankar     countA = ai[i+1] - ai[i];
39467877ebaSShri Abhyankar     countB = bi[i+1] - bi[i];
39567877ebaSShri Abhyankar     ajj    = aj + ai[i];
39667877ebaSShri Abhyankar     bjj    = bj + bi[i];
39767877ebaSShri Abhyankar     v1     = av + bs2*ai[i];
39867877ebaSShri Abhyankar     v2     = bv + bs2*bi[i];
39967877ebaSShri Abhyankar 
40067877ebaSShri Abhyankar     idx = 0;
40167877ebaSShri Abhyankar     /* A-part */
40267877ebaSShri Abhyankar     for (k=0; k<countA; k++){
40367877ebaSShri Abhyankar       for (j=0; j<bs; j++) {
40467877ebaSShri Abhyankar 	for (n=0; n<bs; n++) {
405bccb9932SShri Abhyankar 	  if (reuse == MAT_INITIAL_MATRIX){
406d985c460SShri Abhyankar 	    row[jj] = irow + n + shift;
407d985c460SShri Abhyankar 	    col[jj] = rstart + bs*ajj[k] + j + shift;
40867877ebaSShri Abhyankar 	  }
40967877ebaSShri Abhyankar 	  val[jj++] = v1[idx++];
41067877ebaSShri Abhyankar 	}
41167877ebaSShri Abhyankar       }
41267877ebaSShri Abhyankar     }
41367877ebaSShri Abhyankar 
41467877ebaSShri Abhyankar     idx = 0;
41567877ebaSShri Abhyankar     /* B-part */
41667877ebaSShri Abhyankar     for (k=0; k<countB; k++){
41767877ebaSShri Abhyankar       for (j=0; j<bs; j++) {
41867877ebaSShri Abhyankar 	for (n=0; n<bs; n++) {
419bccb9932SShri Abhyankar 	  if (reuse == MAT_INITIAL_MATRIX){
420d985c460SShri Abhyankar 	    row[jj] = irow + n + shift;
421d985c460SShri Abhyankar 	    col[jj] = bs*garray[bjj[k]] + j + shift;
42267877ebaSShri Abhyankar 	  }
423d985c460SShri Abhyankar 	  val[jj++] = v2[idx++];
42467877ebaSShri Abhyankar 	}
42567877ebaSShri Abhyankar       }
42667877ebaSShri Abhyankar     }
427d985c460SShri Abhyankar     irow += bs;
42867877ebaSShri Abhyankar   }
42967877ebaSShri Abhyankar   PetscFunctionReturn(0);
43067877ebaSShri Abhyankar }
43167877ebaSShri Abhyankar 
43267877ebaSShri Abhyankar #undef __FUNCT__
43316ebf90aSShri Abhyankar #define __FUNCT__ "MatConvertToTriples_mpiaij_mpisbaij"
434bccb9932SShri Abhyankar PetscErrorCode MatConvertToTriples_mpiaij_mpisbaij(Mat A,int shift,MatReuse reuse,int *nnz,int **r, int **c, PetscScalar **v)
43516ebf90aSShri Abhyankar {
43616ebf90aSShri Abhyankar   const PetscInt     *ai, *aj,*adiag, *bi, *bj,*garray,m=A->rmap->n,*ajj,*bjj;
43716ebf90aSShri Abhyankar   PetscErrorCode     ierr;
438e0bace9bSHong Zhang   PetscInt           rstart,nz,nza,nzb,i,j,jj,irow,countA,countB;
43916ebf90aSShri Abhyankar   PetscInt           *row,*col;
44016ebf90aSShri Abhyankar   const PetscScalar  *av, *bv,*v1,*v2;
44116ebf90aSShri Abhyankar   PetscScalar        *val;
44216ebf90aSShri Abhyankar   Mat_MPIAIJ         *mat =  (Mat_MPIAIJ*)A->data;
44316ebf90aSShri Abhyankar   Mat_SeqAIJ         *aa=(Mat_SeqAIJ*)(mat->A)->data;
44416ebf90aSShri Abhyankar   Mat_SeqAIJ         *bb=(Mat_SeqAIJ*)(mat->B)->data;
44516ebf90aSShri Abhyankar 
44616ebf90aSShri Abhyankar   PetscFunctionBegin;
44716ebf90aSShri Abhyankar   ai=aa->i; aj=aa->j; adiag=aa->diag;
44816ebf90aSShri Abhyankar   bi=bb->i; bj=bb->j; garray = mat->garray;
44916ebf90aSShri Abhyankar   av=aa->a; bv=bb->a;
45016ebf90aSShri Abhyankar   rstart = A->rmap->rstart;
45116ebf90aSShri Abhyankar 
452bccb9932SShri Abhyankar   if (reuse == MAT_INITIAL_MATRIX) {
453e0bace9bSHong Zhang     nza = 0;    /* num of upper triangular entries in mat->A, including diagonals */
454e0bace9bSHong Zhang     nzb = 0;    /* num of upper triangular entries in mat->B */
45516ebf90aSShri Abhyankar     for (i=0; i<m; i++){
456e0bace9bSHong Zhang       nza    += (ai[i+1] - adiag[i]);
45716ebf90aSShri Abhyankar       countB  = bi[i+1] - bi[i];
45816ebf90aSShri Abhyankar       bjj     = bj + bi[i];
459e0bace9bSHong Zhang       for (j=0; j<countB; j++){
460e0bace9bSHong Zhang         if (garray[bjj[j]] > rstart) nzb++;
461e0bace9bSHong Zhang       }
462e0bace9bSHong Zhang     }
46316ebf90aSShri Abhyankar 
464e0bace9bSHong Zhang     nz = nza + nzb; /* total nz of upper triangular part of mat */
46516ebf90aSShri Abhyankar     *nnz = nz;
466185f6596SHong Zhang     ierr = PetscMalloc((2*nz*sizeof(PetscInt)+nz*sizeof(PetscScalar)), &row);CHKERRQ(ierr);
467185f6596SHong Zhang     col  = row + nz;
468185f6596SHong Zhang     val  = (PetscScalar*)(col + nz);
469185f6596SHong Zhang 
47016ebf90aSShri Abhyankar     *r = row; *c = col; *v = val;
47116ebf90aSShri Abhyankar   } else {
47216ebf90aSShri Abhyankar     row = *r; col = *c; val = *v;
47316ebf90aSShri Abhyankar   }
47416ebf90aSShri Abhyankar 
47516ebf90aSShri Abhyankar   jj = 0; irow = rstart;
47616ebf90aSShri Abhyankar   for ( i=0; i<m; i++ ) {
47716ebf90aSShri Abhyankar     ajj    = aj + adiag[i];                 /* ptr to the beginning of the diagonal of this row */
47816ebf90aSShri Abhyankar     v1     = av + adiag[i];
47916ebf90aSShri Abhyankar     countA = ai[i+1] - adiag[i];
48016ebf90aSShri Abhyankar     countB = bi[i+1] - bi[i];
48116ebf90aSShri Abhyankar     bjj    = bj + bi[i];
48216ebf90aSShri Abhyankar     v2     = bv + bi[i];
48316ebf90aSShri Abhyankar 
48416ebf90aSShri Abhyankar      /* A-part */
48516ebf90aSShri Abhyankar     for (j=0; j<countA; j++){
486bccb9932SShri Abhyankar       if (reuse == MAT_INITIAL_MATRIX) {
48716ebf90aSShri Abhyankar         row[jj] = irow + shift; col[jj] = rstart + ajj[j] + shift;
48816ebf90aSShri Abhyankar       }
48916ebf90aSShri Abhyankar       val[jj++] = v1[j];
49016ebf90aSShri Abhyankar     }
49116ebf90aSShri Abhyankar 
49216ebf90aSShri Abhyankar     /* B-part */
49316ebf90aSShri Abhyankar     for (j=0; j < countB; j++){
49416ebf90aSShri Abhyankar       if (garray[bjj[j]] > rstart) {
495bccb9932SShri Abhyankar 	if (reuse == MAT_INITIAL_MATRIX) {
49616ebf90aSShri Abhyankar 	  row[jj] = irow + shift; col[jj] = garray[bjj[j]] + shift;
49716ebf90aSShri Abhyankar 	}
49816ebf90aSShri Abhyankar 	val[jj++] = v2[j];
49916ebf90aSShri Abhyankar       }
500397b6df1SKris Buschelman     }
501397b6df1SKris Buschelman     irow++;
502397b6df1SKris Buschelman   }
503397b6df1SKris Buschelman   PetscFunctionReturn(0);
504397b6df1SKris Buschelman }
505397b6df1SKris Buschelman 
506397b6df1SKris Buschelman #undef __FUNCT__
5073924e44cSKris Buschelman #define __FUNCT__ "MatDestroy_MUMPS"
508dfbe8321SBarry Smith PetscErrorCode MatDestroy_MUMPS(Mat A)
509dfbe8321SBarry Smith {
510f0c56d0fSKris Buschelman   Mat_MUMPS      *lu=(Mat_MUMPS*)A->spptr;
511dfbe8321SBarry Smith   PetscErrorCode ierr;
512b24902e0SBarry Smith 
513397b6df1SKris Buschelman   PetscFunctionBegin;
514bf0cc555SLisandro Dalcin   if (lu && lu->CleanUpMUMPS) {
515397b6df1SKris Buschelman     /* Terminate instance, deallocate memories */
5166bf464f9SBarry Smith     ierr = PetscFree2(lu->id.sol_loc,lu->id.isol_loc);CHKERRQ(ierr);
5176bf464f9SBarry Smith     ierr = VecScatterDestroy(&lu->scat_rhs);CHKERRQ(ierr);
5186bf464f9SBarry Smith     ierr = VecDestroy(&lu->b_seq);CHKERRQ(ierr);
519bf0cc555SLisandro Dalcin     ierr = VecScatterDestroy(&lu->scat_sol);CHKERRQ(ierr);
520bf0cc555SLisandro Dalcin     ierr = VecDestroy(&lu->x_seq);CHKERRQ(ierr);
5216bf464f9SBarry Smith     ierr=PetscFree(lu->id.perm_in);CHKERRQ(ierr);
522185f6596SHong Zhang     ierr = PetscFree(lu->irn);CHKERRQ(ierr);
523397b6df1SKris Buschelman     lu->id.job=JOB_END;
5242907cef9SHong Zhang     PetscMUMPS_c(&lu->id);
525397b6df1SKris Buschelman     ierr = MPI_Comm_free(&(lu->comm_mumps));CHKERRQ(ierr);
526397b6df1SKris Buschelman   }
527bf0cc555SLisandro Dalcin   if (lu && lu->Destroy) {
528bf0cc555SLisandro Dalcin     ierr = (lu->Destroy)(A);CHKERRQ(ierr);
529bf0cc555SLisandro Dalcin   }
530bf0cc555SLisandro Dalcin   ierr = PetscFree(A->spptr);CHKERRQ(ierr);
531bf0cc555SLisandro Dalcin 
53297969023SHong Zhang   /* clear composed functions */
53397969023SHong Zhang   ierr = PetscObjectComposeFunctionDynamic((PetscObject)A,"MatFactorGetSolverPackage_C","",PETSC_NULL);CHKERRQ(ierr);
534f250808bSBarry Smith   ierr = PetscObjectComposeFunctionDynamic((PetscObject)A,"MatMumpsSetIcntl_C","",PETSC_NULL);CHKERRQ(ierr);
535397b6df1SKris Buschelman   PetscFunctionReturn(0);
536397b6df1SKris Buschelman }
537397b6df1SKris Buschelman 
538397b6df1SKris Buschelman #undef __FUNCT__
539f6c57405SHong Zhang #define __FUNCT__ "MatSolve_MUMPS"
540b24902e0SBarry Smith PetscErrorCode MatSolve_MUMPS(Mat A,Vec b,Vec x)
541b24902e0SBarry Smith {
542f0c56d0fSKris Buschelman   Mat_MUMPS      *lu=(Mat_MUMPS*)A->spptr;
543d54de34fSKris Buschelman   PetscScalar    *array;
54467877ebaSShri Abhyankar   Vec            b_seq;
545329ec9b3SHong Zhang   IS             is_iden,is_petsc;
546dfbe8321SBarry Smith   PetscErrorCode ierr;
547329ec9b3SHong Zhang   PetscInt       i;
548397b6df1SKris Buschelman 
549397b6df1SKris Buschelman   PetscFunctionBegin;
550329ec9b3SHong Zhang   lu->id.nrhs = 1;
55167877ebaSShri Abhyankar   b_seq = lu->b_seq;
552397b6df1SKris Buschelman   if (lu->size > 1){
553329ec9b3SHong Zhang     /* MUMPS only supports centralized rhs. Scatter b into a seqential rhs vector */
55467877ebaSShri Abhyankar     ierr = VecScatterBegin(lu->scat_rhs,b,b_seq,INSERT_VALUES,SCATTER_FORWARD);CHKERRQ(ierr);
55567877ebaSShri Abhyankar     ierr = VecScatterEnd(lu->scat_rhs,b,b_seq,INSERT_VALUES,SCATTER_FORWARD);CHKERRQ(ierr);
55667877ebaSShri Abhyankar     if (!lu->myid) {ierr = VecGetArray(b_seq,&array);CHKERRQ(ierr);}
557397b6df1SKris Buschelman   } else {  /* size == 1 */
558397b6df1SKris Buschelman     ierr = VecCopy(b,x);CHKERRQ(ierr);
559397b6df1SKris Buschelman     ierr = VecGetArray(x,&array);CHKERRQ(ierr);
560397b6df1SKris Buschelman   }
561397b6df1SKris Buschelman   if (!lu->myid) { /* define rhs on the host */
5628278f211SHong Zhang     lu->id.nrhs = 1;
563397b6df1SKris Buschelman #if defined(PETSC_USE_COMPLEX)
5642907cef9SHong Zhang #if defined(PETSC_USE_REAL_SINGLE)
5652907cef9SHong Zhang     lu->id.rhs = (mumps_complex*)array;
5662907cef9SHong Zhang #else
567397b6df1SKris Buschelman     lu->id.rhs = (mumps_double_complex*)array;
5682907cef9SHong Zhang #endif
569397b6df1SKris Buschelman #else
570397b6df1SKris Buschelman     lu->id.rhs = array;
571397b6df1SKris Buschelman #endif
572397b6df1SKris Buschelman   }
573397b6df1SKris Buschelman 
574397b6df1SKris Buschelman   /* solve phase */
575329ec9b3SHong Zhang   /*-------------*/
5763d472b54SHong Zhang   lu->id.job = JOB_SOLVE;
5772907cef9SHong Zhang   PetscMUMPS_c(&lu->id);
57865e19b50SBarry Smith   if (lu->id.INFOG(1) < 0) SETERRQ1(PETSC_COMM_SELF,PETSC_ERR_LIB,"Error reported by MUMPS in solve phase: INFOG(1)=%d\n",lu->id.INFOG(1));
579397b6df1SKris Buschelman 
580329ec9b3SHong Zhang   if (lu->size > 1) { /* convert mumps distributed solution to petsc mpi x */
581329ec9b3SHong Zhang     if (!lu->nSolve){ /* create scatter scat_sol */
582329ec9b3SHong Zhang       ierr = ISCreateStride(PETSC_COMM_SELF,lu->id.lsol_loc,0,1,&is_iden);CHKERRQ(ierr); /* from */
583329ec9b3SHong Zhang       for (i=0; i<lu->id.lsol_loc; i++){
584329ec9b3SHong Zhang         lu->id.isol_loc[i] -= 1; /* change Fortran style to C style */
585397b6df1SKris Buschelman       }
58670b3c8c7SBarry Smith       ierr = ISCreateGeneral(PETSC_COMM_SELF,lu->id.lsol_loc,lu->id.isol_loc,PETSC_COPY_VALUES,&is_petsc);CHKERRQ(ierr);  /* to */
587329ec9b3SHong Zhang       ierr = VecScatterCreate(lu->x_seq,is_iden,x,is_petsc,&lu->scat_sol);CHKERRQ(ierr);
5886bf464f9SBarry Smith       ierr = ISDestroy(&is_iden);CHKERRQ(ierr);
5896bf464f9SBarry Smith       ierr = ISDestroy(&is_petsc);CHKERRQ(ierr);
590397b6df1SKris Buschelman     }
591ca9f406cSSatish Balay     ierr = VecScatterBegin(lu->scat_sol,lu->x_seq,x,INSERT_VALUES,SCATTER_FORWARD);CHKERRQ(ierr);
592ca9f406cSSatish Balay     ierr = VecScatterEnd(lu->scat_sol,lu->x_seq,x,INSERT_VALUES,SCATTER_FORWARD);CHKERRQ(ierr);
593329ec9b3SHong Zhang   }
594329ec9b3SHong Zhang   lu->nSolve++;
595397b6df1SKris Buschelman   PetscFunctionReturn(0);
596397b6df1SKris Buschelman }
597397b6df1SKris Buschelman 
59851d5961aSHong Zhang #undef __FUNCT__
59951d5961aSHong Zhang #define __FUNCT__ "MatSolveTranspose_MUMPS"
60051d5961aSHong Zhang PetscErrorCode MatSolveTranspose_MUMPS(Mat A,Vec b,Vec x)
60151d5961aSHong Zhang {
60251d5961aSHong Zhang   Mat_MUMPS      *lu=(Mat_MUMPS*)A->spptr;
60351d5961aSHong Zhang   PetscErrorCode ierr;
60451d5961aSHong Zhang 
60551d5961aSHong Zhang   PetscFunctionBegin;
60651d5961aSHong Zhang   lu->id.ICNTL(9) = 0;
6070ad0caddSJed Brown   ierr = MatSolve_MUMPS(A,b,x);CHKERRQ(ierr);
60851d5961aSHong Zhang   lu->id.ICNTL(9) = 1;
60951d5961aSHong Zhang   PetscFunctionReturn(0);
61051d5961aSHong Zhang }
61151d5961aSHong Zhang 
612e0b74bf9SHong Zhang #undef __FUNCT__
613e0b74bf9SHong Zhang #define __FUNCT__ "MatMatSolve_MUMPS"
614e0b74bf9SHong Zhang PetscErrorCode MatMatSolve_MUMPS(Mat A,Mat B,Mat X)
615e0b74bf9SHong Zhang {
616bda8bf91SBarry Smith   PetscErrorCode ierr;
617bda8bf91SBarry Smith   PetscBool      flg;
618bda8bf91SBarry Smith 
619e0b74bf9SHong Zhang   PetscFunctionBegin;
620251f4c67SDmitry Karpeev   ierr = PetscObjectTypeCompareAny((PetscObject)B,&flg,MATSEQDENSE,MATMPIDENSE,PETSC_NULL);CHKERRQ(ierr);
621bda8bf91SBarry Smith   if (!flg) SETERRQ(((PetscObject)A)->comm,PETSC_ERR_ARG_WRONG,"Matrix B must be MATDENSE matrix");
622251f4c67SDmitry Karpeev   ierr = PetscObjectTypeCompareAny((PetscObject)X,&flg,MATSEQDENSE,MATMPIDENSE,PETSC_NULL);CHKERRQ(ierr);
623bda8bf91SBarry Smith   if (!flg) SETERRQ(((PetscObject)A)->comm,PETSC_ERR_ARG_WRONG,"Matrix X must be MATDENSE matrix");  SETERRQ(PETSC_COMM_SELF,PETSC_ERR_SUP,"MatMatSolve_MUMPS() is not implemented yet");
624e0b74bf9SHong Zhang   PetscFunctionReturn(0);
625e0b74bf9SHong Zhang }
626e0b74bf9SHong Zhang 
627ace3df97SHong Zhang #if !defined(PETSC_USE_COMPLEX)
628a58c3f20SHong Zhang /*
629a58c3f20SHong Zhang   input:
630a58c3f20SHong Zhang    F:        numeric factor
631a58c3f20SHong Zhang   output:
632a58c3f20SHong Zhang    nneg:     total number of negative pivots
633a58c3f20SHong Zhang    nzero:    0
634a58c3f20SHong Zhang    npos:     (global dimension of F) - nneg
635a58c3f20SHong Zhang */
636a58c3f20SHong Zhang 
637a58c3f20SHong Zhang #undef __FUNCT__
638a58c3f20SHong Zhang #define __FUNCT__ "MatGetInertia_SBAIJMUMPS"
639dfbe8321SBarry Smith PetscErrorCode MatGetInertia_SBAIJMUMPS(Mat F,int *nneg,int *nzero,int *npos)
640a58c3f20SHong Zhang {
641a58c3f20SHong Zhang   Mat_MUMPS      *lu =(Mat_MUMPS*)F->spptr;
642dfbe8321SBarry Smith   PetscErrorCode ierr;
643c1490034SHong Zhang   PetscMPIInt    size;
644a58c3f20SHong Zhang 
645a58c3f20SHong Zhang   PetscFunctionBegin;
6467adad957SLisandro Dalcin   ierr = MPI_Comm_size(((PetscObject)F)->comm,&size);CHKERRQ(ierr);
647bcb30aebSHong 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 */
64865e19b50SBarry Smith   if (size > 1 && lu->id.ICNTL(13) != 1) SETERRQ1(PETSC_COMM_SELF,PETSC_ERR_ARG_WRONG,"ICNTL(13)=%d. -mat_mumps_icntl_13 must be set as 1 for correct global matrix inertia\n",lu->id.INFOG(13));
649a58c3f20SHong Zhang   if (nneg){
650a58c3f20SHong Zhang     if (!lu->myid){
651a58c3f20SHong Zhang       *nneg = lu->id.INFOG(12);
652a58c3f20SHong Zhang     }
653bcb30aebSHong Zhang     ierr = MPI_Bcast(nneg,1,MPI_INT,0,lu->comm_mumps);CHKERRQ(ierr);
654a58c3f20SHong Zhang   }
655a58c3f20SHong Zhang   if (nzero) *nzero = 0;
656d0f46423SBarry Smith   if (npos)  *npos  = F->rmap->N - (*nneg);
657a58c3f20SHong Zhang   PetscFunctionReturn(0);
658a58c3f20SHong Zhang }
659ace3df97SHong Zhang #endif /* !defined(PETSC_USE_COMPLEX) */
660a58c3f20SHong Zhang 
661397b6df1SKris Buschelman #undef __FUNCT__
662f6c57405SHong Zhang #define __FUNCT__ "MatFactorNumeric_MUMPS"
6630481f469SBarry Smith PetscErrorCode MatFactorNumeric_MUMPS(Mat F,Mat A,const MatFactorInfo *info)
664af281ebdSHong Zhang {
665dcd589f8SShri Abhyankar   Mat_MUMPS       *lu =(Mat_MUMPS*)(F)->spptr;
6666849ba73SBarry Smith   PetscErrorCode  ierr;
667e09efc27SHong Zhang   Mat             F_diag;
668ace3abfcSBarry Smith   PetscBool       isMPIAIJ;
669397b6df1SKris Buschelman 
670397b6df1SKris Buschelman   PetscFunctionBegin;
671eb85809bSHong Zhang   ierr = (*lu->ConvertToTriples)(A, 1, MAT_REUSE_MATRIX, &lu->nz, &lu->irn, &lu->jcn, &lu->val);CHKERRQ(ierr);
672397b6df1SKris Buschelman 
673397b6df1SKris Buschelman   /* numerical factorization phase */
674329ec9b3SHong Zhang   /*-------------------------------*/
6753d472b54SHong Zhang   lu->id.job = JOB_FACTNUMERIC;
676958c9bccSBarry Smith   if (!lu->id.ICNTL(18)) {
677a7aca84bSHong Zhang     if (!lu->myid) {
678397b6df1SKris Buschelman #if defined(PETSC_USE_COMPLEX)
6792907cef9SHong Zhang #if defined(PETSC_USE_REAL_SINGLE)
6802907cef9SHong Zhang       lu->id.a = (mumps_complex*)lu->val;
6812907cef9SHong Zhang #else
682397b6df1SKris Buschelman       lu->id.a = (mumps_double_complex*)lu->val;
6832907cef9SHong Zhang #endif
684397b6df1SKris Buschelman #else
685397b6df1SKris Buschelman       lu->id.a = lu->val;
686397b6df1SKris Buschelman #endif
687397b6df1SKris Buschelman     }
688397b6df1SKris Buschelman   } else {
689397b6df1SKris Buschelman #if defined(PETSC_USE_COMPLEX)
6902907cef9SHong Zhang #if defined(PETSC_USE_REAL_SINGLE)
6912907cef9SHong Zhang     lu->id.a_loc = (mumps_complex*)lu->val;
6922907cef9SHong Zhang #else
693397b6df1SKris Buschelman     lu->id.a_loc = (mumps_double_complex*)lu->val;
6942907cef9SHong Zhang #endif
695397b6df1SKris Buschelman #else
696397b6df1SKris Buschelman     lu->id.a_loc = lu->val;
697397b6df1SKris Buschelman #endif
698397b6df1SKris Buschelman   }
6992907cef9SHong Zhang   PetscMUMPS_c(&lu->id);
700397b6df1SKris Buschelman   if (lu->id.INFOG(1) < 0) {
70165e19b50SBarry Smith     if (lu->id.INFO(1) == -13) SETERRQ1(PETSC_COMM_SELF,PETSC_ERR_LIB,"Error reported by MUMPS in numerical factorization phase: Cannot allocate required memory %d megabytes\n",lu->id.INFO(2));
70265e19b50SBarry Smith     else SETERRQ2(PETSC_COMM_SELF,PETSC_ERR_LIB,"Error reported by MUMPS in numerical factorization phase: INFO(1)=%d, INFO(2)=%d\n",lu->id.INFO(1),lu->id.INFO(2));
703397b6df1SKris Buschelman   }
70465e19b50SBarry Smith   if (!lu->myid && lu->id.ICNTL(16) > 0) SETERRQ1(PETSC_COMM_SELF,PETSC_ERR_LIB,"  lu->id.ICNTL(16):=%d\n",lu->id.INFOG(16));
705397b6df1SKris Buschelman 
7068ada1bb4SHong Zhang   if (lu->size > 1){
707251f4c67SDmitry Karpeev     ierr = PetscObjectTypeCompare((PetscObject)A,MATMPIAIJ,&isMPIAIJ);CHKERRQ(ierr);
708a214ac2aSShri Abhyankar     if (isMPIAIJ) {
709dcd589f8SShri Abhyankar       F_diag = ((Mat_MPIAIJ *)(F)->data)->A;
710e09efc27SHong Zhang     } else {
711dcd589f8SShri Abhyankar       F_diag = ((Mat_MPISBAIJ *)(F)->data)->A;
712e09efc27SHong Zhang     }
713e09efc27SHong Zhang     F_diag->assembled = PETSC_TRUE;
714329ec9b3SHong Zhang     if (lu->nSolve){
7156bf464f9SBarry Smith       ierr = VecScatterDestroy(&lu->scat_sol);CHKERRQ(ierr);
7160e83c824SBarry Smith       ierr = PetscFree2(lu->id.sol_loc,lu->id.isol_loc);CHKERRQ(ierr);
7176bf464f9SBarry Smith       ierr = VecDestroy(&lu->x_seq);CHKERRQ(ierr);
718329ec9b3SHong Zhang     }
7198ada1bb4SHong Zhang   }
720dcd589f8SShri Abhyankar   (F)->assembled   = PETSC_TRUE;
721397b6df1SKris Buschelman   lu->matstruc     = SAME_NONZERO_PATTERN;
722ace87b0dSHong Zhang   lu->CleanUpMUMPS = PETSC_TRUE;
723329ec9b3SHong Zhang   lu->nSolve       = 0;
72467877ebaSShri Abhyankar 
72567877ebaSShri Abhyankar   if (lu->size > 1){
72667877ebaSShri Abhyankar     /* distributed solution */
72767877ebaSShri Abhyankar     if (!lu->nSolve){
72867877ebaSShri Abhyankar       /* Create x_seq=sol_loc for repeated use */
72967877ebaSShri Abhyankar       PetscInt    lsol_loc;
73067877ebaSShri Abhyankar       PetscScalar *sol_loc;
73167877ebaSShri Abhyankar       lsol_loc = lu->id.INFO(23); /* length of sol_loc */
73267877ebaSShri Abhyankar       ierr = PetscMalloc2(lsol_loc,PetscScalar,&sol_loc,lsol_loc,PetscInt,&lu->id.isol_loc);CHKERRQ(ierr);
73367877ebaSShri Abhyankar       lu->id.lsol_loc = lsol_loc;
73467877ebaSShri Abhyankar #if defined(PETSC_USE_COMPLEX)
7352907cef9SHong Zhang #if defined(PETSC_USE_REAL_SINGLE)
7362907cef9SHong Zhang       lu->id.sol_loc  = (mumps_complex*)sol_loc;
7372907cef9SHong Zhang #else
73867877ebaSShri Abhyankar       lu->id.sol_loc  = (mumps_double_complex*)sol_loc;
7392907cef9SHong Zhang #endif
74067877ebaSShri Abhyankar #else
74167877ebaSShri Abhyankar       lu->id.sol_loc  = sol_loc;
74267877ebaSShri Abhyankar #endif
743778a2246SBarry Smith       ierr = VecCreateSeqWithArray(PETSC_COMM_SELF,1,lsol_loc,sol_loc,&lu->x_seq);CHKERRQ(ierr);
74467877ebaSShri Abhyankar     }
74567877ebaSShri Abhyankar   }
746397b6df1SKris Buschelman   PetscFunctionReturn(0);
747397b6df1SKris Buschelman }
748397b6df1SKris Buschelman 
7499a2535b5SHong Zhang /* Sets MUMPS options from the options database */
750dcd589f8SShri Abhyankar #undef __FUNCT__
7519a2535b5SHong Zhang #define __FUNCT__ "PetscSetMUMPSFromOptions"
7529a2535b5SHong Zhang PetscErrorCode PetscSetMUMPSFromOptions(Mat F, Mat A)
753dcd589f8SShri Abhyankar {
7549a2535b5SHong Zhang   Mat_MUMPS        *mumps = (Mat_MUMPS*)F->spptr;
755dcd589f8SShri Abhyankar   PetscErrorCode   ierr;
756dcd589f8SShri Abhyankar   PetscInt         icntl;
757ace3abfcSBarry Smith   PetscBool        flg;
758dcd589f8SShri Abhyankar 
759dcd589f8SShri Abhyankar   PetscFunctionBegin;
760dcd589f8SShri Abhyankar   ierr = PetscOptionsBegin(((PetscObject)A)->comm,((PetscObject)A)->prefix,"MUMPS Options","Mat");CHKERRQ(ierr);
7619a2535b5SHong Zhang   ierr = PetscOptionsInt("-mat_mumps_icntl_1","ICNTL(1): output stream for error messages","None",mumps->id.ICNTL(1),&icntl,&flg);CHKERRQ(ierr);
7629a2535b5SHong Zhang   if (flg) mumps->id.ICNTL(1) = icntl;
7639a2535b5SHong 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);
7649a2535b5SHong Zhang   if (flg) mumps->id.ICNTL(2) = icntl;
7659a2535b5SHong 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);
7669a2535b5SHong Zhang   if (flg) mumps->id.ICNTL(3) = icntl;
767dcd589f8SShri Abhyankar 
7689a2535b5SHong Zhang   ierr = PetscOptionsInt("-mat_mumps_icntl_4","ICNTL(4): level of printing (0 to 4)","None",mumps->id.ICNTL(4),&icntl,&flg);CHKERRQ(ierr);
7699a2535b5SHong Zhang   if (flg) mumps->id.ICNTL(4) = icntl;
7709a2535b5SHong Zhang   if (mumps->id.ICNTL(4) || PetscLogPrintInfo ) mumps->id.ICNTL(3) = 6; /* resume MUMPS default id.ICNTL(3) = 6 */
7719a2535b5SHong Zhang 
7729a2535b5SHong Zhang   ierr = PetscOptionsInt("-mat_mumps_icntl_6","ICNTL(6): permuting and/or scaling the matrix (0 to 7)","None",mumps->id.ICNTL(6),&icntl,&flg);CHKERRQ(ierr);
7739a2535b5SHong Zhang   if (flg) mumps->id.ICNTL(6) = icntl;
7749a2535b5SHong Zhang 
7759a2535b5SHong Zhang   ierr = PetscOptionsInt("-mat_mumps_icntl_7","ICNTL(7): matrix ordering (0 to 7). 3=Scotch, 4=PORD, 5=Metis","None",mumps->id.ICNTL(7),&icntl,&flg);CHKERRQ(ierr);
776dcd589f8SShri Abhyankar   if (flg) {
7779a2535b5SHong Zhang     if (icntl== 1 && mumps->size > 1){
778e32f2f54SBarry Smith       SETERRQ(PETSC_COMM_SELF,PETSC_ERR_SUP,"pivot order be set by the user in PERM_IN -- not supported by the PETSc/MUMPS interface\n");
779dcd589f8SShri Abhyankar     } else {
7809a2535b5SHong Zhang       mumps->id.ICNTL(7) = icntl;
781dcd589f8SShri Abhyankar     }
782dcd589f8SShri Abhyankar   }
783e0b74bf9SHong Zhang 
78470544d5fSHong Zhang   ierr = PetscOptionsInt("-mat_mumps_icntl_8","ICNTL(8): scaling strategy (-2 to 8 or 77)","None",mumps->id.ICNTL(8),&mumps->id.ICNTL(8),PETSC_NULL);CHKERRQ(ierr);
7859a2535b5SHong Zhang   ierr = PetscOptionsInt("-mat_mumps_icntl_10","ICNTL(10): max num of refinements","None",mumps->id.ICNTL(10),&mumps->id.ICNTL(10),PETSC_NULL);CHKERRQ(ierr);
7869a2535b5SHong Zhang   ierr = PetscOptionsInt("-mat_mumps_icntl_11","ICNTL(11): statistics related to the linear system solved (via -ksp_view)","None",mumps->id.ICNTL(11),&mumps->id.ICNTL(11),PETSC_NULL);CHKERRQ(ierr);
78770544d5fSHong Zhang   ierr = PetscOptionsInt("-mat_mumps_icntl_12","ICNTL(12): efficiency control: defines the ordering strategy with scaling constraints (0 to 3)","None",mumps->id.ICNTL(12),&mumps->id.ICNTL(12),PETSC_NULL);CHKERRQ(ierr);
7889a2535b5SHong Zhang   ierr = PetscOptionsInt("-mat_mumps_icntl_13","ICNTL(13): efficiency control: with or without ScaLAPACK","None",mumps->id.ICNTL(13),&mumps->id.ICNTL(13),PETSC_NULL);CHKERRQ(ierr);
7899a2535b5SHong Zhang   ierr = PetscOptionsInt("-mat_mumps_icntl_14","ICNTL(14): percentage of estimated workspace increase","None",mumps->id.ICNTL(14),&mumps->id.ICNTL(14),PETSC_NULL);CHKERRQ(ierr);
7909a2535b5SHong Zhang   ierr = PetscOptionsInt("-mat_mumps_icntl_19","ICNTL(19): Schur complement","None",mumps->id.ICNTL(19),&mumps->id.ICNTL(19),PETSC_NULL);CHKERRQ(ierr);
7919a2535b5SHong Zhang 
7929a2535b5SHong Zhang   ierr = PetscOptionsInt("-mat_mumps_icntl_22","ICNTL(22): in-core/out-of-core facility (0 or 1)","None",mumps->id.ICNTL(22),&mumps->id.ICNTL(22),PETSC_NULL);CHKERRQ(ierr);
7939a2535b5SHong Zhang   ierr = PetscOptionsInt("-mat_mumps_icntl_23","ICNTL(23): max size of the working memory (MB) that can allocate per processor","None",mumps->id.ICNTL(23),&mumps->id.ICNTL(23),PETSC_NULL);CHKERRQ(ierr);
7949a2535b5SHong Zhang   ierr = PetscOptionsInt("-mat_mumps_icntl_24","ICNTL(24): detection of null pivot rows (0 or 1)","None",mumps->id.ICNTL(24),&mumps->id.ICNTL(24),PETSC_NULL);CHKERRQ(ierr);
7959a2535b5SHong Zhang   if (mumps->id.ICNTL(24)){
7969a2535b5SHong Zhang     mumps->id.ICNTL(13) = 1; /* turn-off ScaLAPACK to help with the correct detection of null pivots */
797d7ebd59bSHong Zhang   }
798d7ebd59bSHong Zhang 
7999a2535b5SHong Zhang   ierr = PetscOptionsInt("-mat_mumps_icntl_25","ICNTL(25): computation of a null space basis","None",mumps->id.ICNTL(25),&mumps->id.ICNTL(25),PETSC_NULL);CHKERRQ(ierr);
8009a2535b5SHong Zhang   ierr = PetscOptionsInt("-mat_mumps_icntl_26","ICNTL(26): Schur options for right-hand side or solution vector","None",mumps->id.ICNTL(26),&mumps->id.ICNTL(26),PETSC_NULL);CHKERRQ(ierr);
8019a2535b5SHong Zhang   ierr = PetscOptionsInt("-mat_mumps_icntl_27","ICNTL(27): experimental parameter","None",mumps->id.ICNTL(27),&mumps->id.ICNTL(27),PETSC_NULL);CHKERRQ(ierr);
8029a2535b5SHong Zhang   ierr = PetscOptionsInt("-mat_mumps_icntl_28","ICNTL(28): use 1 for sequential analysis and ictnl(7) ordering, or 2 for parallel analysis and ictnl(29) ordering","None",mumps->id.ICNTL(28),&mumps->id.ICNTL(28),PETSC_NULL);CHKERRQ(ierr);
8039a2535b5SHong Zhang   ierr = PetscOptionsInt("-mat_mumps_icntl_29","ICNTL(29): parallel ordering 1 = ptscotch 2 = parmetis","None",mumps->id.ICNTL(29),&mumps->id.ICNTL(29),PETSC_NULL);CHKERRQ(ierr);
8049a2535b5SHong Zhang   ierr = PetscOptionsInt("-mat_mumps_icntl_30","ICNTL(30): compute user-specified set of entries in inv(A)","None",mumps->id.ICNTL(30),&mumps->id.ICNTL(30),PETSC_NULL);CHKERRQ(ierr);
8059a2535b5SHong Zhang   ierr = PetscOptionsInt("-mat_mumps_icntl_31","ICNTL(31): factors can be discarded in the solve phase","None",mumps->id.ICNTL(31),&mumps->id.ICNTL(31),PETSC_NULL);CHKERRQ(ierr);
8069a2535b5SHong Zhang   ierr = PetscOptionsInt("-mat_mumps_icntl_33","ICNTL(33): compute determinant","None",mumps->id.ICNTL(33),&mumps->id.ICNTL(33),PETSC_NULL);CHKERRQ(ierr);
807dcd589f8SShri Abhyankar 
8089a2535b5SHong Zhang   ierr = PetscOptionsReal("-mat_mumps_cntl_1","CNTL(1): relative pivoting threshold","None",mumps->id.CNTL(1),&mumps->id.CNTL(1),PETSC_NULL);CHKERRQ(ierr);
8099a2535b5SHong Zhang   ierr = PetscOptionsReal("-mat_mumps_cntl_2","CNTL(2): stopping criterion of refinement","None",mumps->id.CNTL(2),&mumps->id.CNTL(2),PETSC_NULL);CHKERRQ(ierr);
8109a2535b5SHong Zhang   ierr = PetscOptionsReal("-mat_mumps_cntl_3","CNTL(3): absolute pivoting threshold","None",mumps->id.CNTL(3),&mumps->id.CNTL(3),PETSC_NULL);CHKERRQ(ierr);
8119a2535b5SHong Zhang   ierr = PetscOptionsReal("-mat_mumps_cntl_4","CNTL(4): value for static pivoting","None",mumps->id.CNTL(4),&mumps->id.CNTL(4),PETSC_NULL);CHKERRQ(ierr);
8129a2535b5SHong Zhang   ierr = PetscOptionsReal("-mat_mumps_cntl_5","CNTL(5): fixation for null pivots","None",mumps->id.CNTL(5),&mumps->id.CNTL(5),PETSC_NULL);CHKERRQ(ierr);
813e5bb22a1SHong Zhang 
814e5bb22a1SHong Zhang   ierr = PetscOptionsString("-mat_mumps_ooc_tmpdir", "out of core directory", "None", mumps->id.ooc_tmpdir, mumps->id.ooc_tmpdir, 256, PETSC_NULL);
815dcd589f8SShri Abhyankar   PetscOptionsEnd();
816dcd589f8SShri Abhyankar   PetscFunctionReturn(0);
817dcd589f8SShri Abhyankar }
818dcd589f8SShri Abhyankar 
819dcd589f8SShri Abhyankar #undef __FUNCT__
820dcd589f8SShri Abhyankar #define __FUNCT__ "PetscInitializeMUMPS"
821f697e70eSHong Zhang PetscErrorCode PetscInitializeMUMPS(Mat A,Mat_MUMPS* mumps)
822dcd589f8SShri Abhyankar {
823dcd589f8SShri Abhyankar   PetscErrorCode  ierr;
824dcd589f8SShri Abhyankar 
825dcd589f8SShri Abhyankar   PetscFunctionBegin;
826f697e70eSHong Zhang   ierr = MPI_Comm_rank(((PetscObject)A)->comm, &mumps->myid);
827f697e70eSHong Zhang   ierr = MPI_Comm_size(((PetscObject)A)->comm,&mumps->size);CHKERRQ(ierr);
828f697e70eSHong Zhang   ierr = MPI_Comm_dup(((PetscObject)A)->comm,&(mumps->comm_mumps));CHKERRQ(ierr);
829f697e70eSHong Zhang   mumps->id.comm_fortran = MPI_Comm_c2f(mumps->comm_mumps);
830f697e70eSHong Zhang 
831f697e70eSHong Zhang   mumps->id.job = JOB_INIT;
832f697e70eSHong Zhang   mumps->id.par = 1;  /* host participates factorizaton and solve */
833f697e70eSHong Zhang   mumps->id.sym = mumps->sym;
8342907cef9SHong Zhang   PetscMUMPS_c(&mumps->id);
835f697e70eSHong Zhang 
836f697e70eSHong Zhang   mumps->CleanUpMUMPS = PETSC_FALSE;
837f697e70eSHong Zhang   mumps->scat_rhs     = PETSC_NULL;
838f697e70eSHong Zhang   mumps->scat_sol     = PETSC_NULL;
839f697e70eSHong Zhang   mumps->nSolve       = 0;
8409a2535b5SHong Zhang 
84170544d5fSHong Zhang   /* set PETSc-MUMPS default options - override MUMPS default */
8429a2535b5SHong Zhang   mumps->id.ICNTL(3) = 0;
8439a2535b5SHong Zhang   mumps->id.ICNTL(4) = 0;
8449a2535b5SHong Zhang   if (mumps->size == 1){
8459a2535b5SHong Zhang     mumps->id.ICNTL(18) = 0;   /* centralized assembled matrix input */
8469a2535b5SHong Zhang   } else {
8479a2535b5SHong Zhang     mumps->id.ICNTL(18) = 3;   /* distributed assembled matrix input */
84870544d5fSHong Zhang     mumps->id.ICNTL(21) = 1;   /* distributed solution */
8499a2535b5SHong Zhang   }
850dcd589f8SShri Abhyankar   PetscFunctionReturn(0);
851dcd589f8SShri Abhyankar }
852dcd589f8SShri Abhyankar 
853*5248a706SHong Zhang /* Note Petsc r(=c) permutation is used when lu->id.ICNTL(7)==1 with centralized assembled matrix input; otherwise r and c are ignored */
854397b6df1SKris Buschelman #undef __FUNCT__
855f0c56d0fSKris Buschelman #define __FUNCT__ "MatLUFactorSymbolic_AIJMUMPS"
8560481f469SBarry Smith PetscErrorCode MatLUFactorSymbolic_AIJMUMPS(Mat F,Mat A,IS r,IS c,const MatFactorInfo *info)
857b24902e0SBarry Smith {
858719d5645SBarry Smith   Mat_MUMPS          *lu = (Mat_MUMPS*)F->spptr;
859dcd589f8SShri Abhyankar   PetscErrorCode     ierr;
86067877ebaSShri Abhyankar   Vec                b;
86167877ebaSShri Abhyankar   IS                 is_iden;
86267877ebaSShri Abhyankar   const PetscInt     M = A->rmap->N;
863397b6df1SKris Buschelman 
864397b6df1SKris Buschelman   PetscFunctionBegin;
865b24902e0SBarry Smith   lu->matstruc = DIFFERENT_NONZERO_PATTERN;
866dcd589f8SShri Abhyankar 
8679a2535b5SHong Zhang   /* Set MUMPS options from the options database */
8689a2535b5SHong Zhang   ierr = PetscSetMUMPSFromOptions(F,A);CHKERRQ(ierr);
869dcd589f8SShri Abhyankar 
870eb85809bSHong Zhang   ierr = (*lu->ConvertToTriples)(A, 1, MAT_INITIAL_MATRIX, &lu->nz, &lu->irn, &lu->jcn, &lu->val);CHKERRQ(ierr);
871dcd589f8SShri Abhyankar 
87267877ebaSShri Abhyankar   /* analysis phase */
87367877ebaSShri Abhyankar   /*----------------*/
8743d472b54SHong Zhang   lu->id.job = JOB_FACTSYMBOLIC;
87567877ebaSShri Abhyankar   lu->id.n = M;
87667877ebaSShri Abhyankar   switch (lu->id.ICNTL(18)){
87767877ebaSShri Abhyankar   case 0:  /* centralized assembled matrix input */
87867877ebaSShri Abhyankar     if (!lu->myid) {
87967877ebaSShri Abhyankar       lu->id.nz =lu->nz; lu->id.irn=lu->irn; lu->id.jcn=lu->jcn;
88067877ebaSShri Abhyankar       if (lu->id.ICNTL(6)>1){
88167877ebaSShri Abhyankar #if defined(PETSC_USE_COMPLEX)
8822907cef9SHong Zhang #if defined(PETSC_USE_REAL_SINGLE)
8832907cef9SHong Zhang         lu->id.a = (mumps_complex*)lu->val;
8842907cef9SHong Zhang #else
88567877ebaSShri Abhyankar         lu->id.a = (mumps_double_complex*)lu->val;
8862907cef9SHong Zhang #endif
88767877ebaSShri Abhyankar #else
88867877ebaSShri Abhyankar         lu->id.a = lu->val;
88967877ebaSShri Abhyankar #endif
89067877ebaSShri Abhyankar       }
891*5248a706SHong Zhang       if (lu->id.ICNTL(7) == 1){ /* use user-provide matrix ordering - assuming r = c ordering */
892*5248a706SHong Zhang         /*
893*5248a706SHong Zhang         PetscBool      flag;
894*5248a706SHong Zhang         ierr = ISEqual(r,c,&flag);CHKERRQ(ierr);
895*5248a706SHong Zhang         if (!flag) SETERRQ(PETSC_COMM_SELF,PETSC_ERR_USER,"row_perm != col_perm");
896*5248a706SHong Zhang         ierr = ISView(r,PETSC_VIEWER_STDOUT_SELF);
897*5248a706SHong Zhang          */
898e0b74bf9SHong Zhang         if (!lu->myid) {
899e0b74bf9SHong Zhang           const PetscInt *idx;
900e0b74bf9SHong Zhang           PetscInt i,*perm_in;
901e0b74bf9SHong Zhang           ierr = PetscMalloc(M*sizeof(PetscInt),&perm_in);CHKERRQ(ierr);
902e0b74bf9SHong Zhang           ierr = ISGetIndices(r,&idx);CHKERRQ(ierr);
903e0b74bf9SHong Zhang           lu->id.perm_in = perm_in;
904e0b74bf9SHong Zhang           for (i=0; i<M; i++) perm_in[i] = idx[i]+1; /* perm_in[]: start from 1, not 0! */
905e0b74bf9SHong Zhang           ierr = ISRestoreIndices(r,&idx);CHKERRQ(ierr);
906e0b74bf9SHong Zhang         }
907e0b74bf9SHong Zhang       }
90867877ebaSShri Abhyankar     }
90967877ebaSShri Abhyankar     break;
91067877ebaSShri Abhyankar   case 3:  /* distributed assembled matrix input (size>1) */
91167877ebaSShri Abhyankar     lu->id.nz_loc = lu->nz;
91267877ebaSShri Abhyankar     lu->id.irn_loc=lu->irn; lu->id.jcn_loc=lu->jcn;
91367877ebaSShri Abhyankar     if (lu->id.ICNTL(6)>1) {
91467877ebaSShri Abhyankar #if defined(PETSC_USE_COMPLEX)
9152907cef9SHong Zhang #if defined(PETSC_USE_REAL_SINGLE)
9162907cef9SHong Zhang       lu->id.a_loc = (mumps_complex*)lu->val;
9172907cef9SHong Zhang #else
91867877ebaSShri Abhyankar       lu->id.a_loc = (mumps_double_complex*)lu->val;
9192907cef9SHong Zhang #endif
92067877ebaSShri Abhyankar #else
92167877ebaSShri Abhyankar       lu->id.a_loc = lu->val;
92267877ebaSShri Abhyankar #endif
92367877ebaSShri Abhyankar     }
92467877ebaSShri Abhyankar     /* MUMPS only supports centralized rhs. Create scatter scat_rhs for repeated use in MatSolve() */
92567877ebaSShri Abhyankar     if (!lu->myid){
92667877ebaSShri Abhyankar       ierr = VecCreateSeq(PETSC_COMM_SELF,A->cmap->N,&lu->b_seq);CHKERRQ(ierr);
92767877ebaSShri Abhyankar       ierr = ISCreateStride(PETSC_COMM_SELF,A->cmap->N,0,1,&is_iden);CHKERRQ(ierr);
92867877ebaSShri Abhyankar     } else {
92967877ebaSShri Abhyankar       ierr = VecCreateSeq(PETSC_COMM_SELF,0,&lu->b_seq);CHKERRQ(ierr);
93067877ebaSShri Abhyankar       ierr = ISCreateStride(PETSC_COMM_SELF,0,0,1,&is_iden);CHKERRQ(ierr);
93167877ebaSShri Abhyankar     }
93267877ebaSShri Abhyankar     ierr = VecCreate(((PetscObject)A)->comm,&b);CHKERRQ(ierr);
93367877ebaSShri Abhyankar     ierr = VecSetSizes(b,A->rmap->n,PETSC_DECIDE);CHKERRQ(ierr);
93467877ebaSShri Abhyankar     ierr = VecSetFromOptions(b);CHKERRQ(ierr);
93567877ebaSShri Abhyankar 
93667877ebaSShri Abhyankar     ierr = VecScatterCreate(b,is_iden,lu->b_seq,is_iden,&lu->scat_rhs);CHKERRQ(ierr);
9376bf464f9SBarry Smith     ierr = ISDestroy(&is_iden);CHKERRQ(ierr);
9386bf464f9SBarry Smith     ierr = VecDestroy(&b);CHKERRQ(ierr);
93967877ebaSShri Abhyankar     break;
94067877ebaSShri Abhyankar     }
9412907cef9SHong Zhang   PetscMUMPS_c(&lu->id);
94267877ebaSShri Abhyankar   if (lu->id.INFOG(1) < 0) SETERRQ1(PETSC_COMM_SELF,PETSC_ERR_LIB,"Error reported by MUMPS in analysis phase: INFOG(1)=%d\n",lu->id.INFOG(1));
94367877ebaSShri Abhyankar 
944719d5645SBarry Smith   F->ops->lufactornumeric  = MatFactorNumeric_MUMPS;
945dcd589f8SShri Abhyankar   F->ops->solve            = MatSolve_MUMPS;
94651d5961aSHong Zhang   F->ops->solvetranspose   = MatSolveTranspose_MUMPS;
947e0b74bf9SHong Zhang   F->ops->matsolve         = MatMatSolve_MUMPS;
948b24902e0SBarry Smith   PetscFunctionReturn(0);
949b24902e0SBarry Smith }
950b24902e0SBarry Smith 
951450b117fSShri Abhyankar /* Note the Petsc r and c permutations are ignored */
952450b117fSShri Abhyankar #undef __FUNCT__
953450b117fSShri Abhyankar #define __FUNCT__ "MatLUFactorSymbolic_BAIJMUMPS"
954450b117fSShri Abhyankar PetscErrorCode MatLUFactorSymbolic_BAIJMUMPS(Mat F,Mat A,IS r,IS c,const MatFactorInfo *info)
955450b117fSShri Abhyankar {
956dcd589f8SShri Abhyankar 
957450b117fSShri Abhyankar   Mat_MUMPS       *lu = (Mat_MUMPS*)F->spptr;
958dcd589f8SShri Abhyankar   PetscErrorCode  ierr;
95967877ebaSShri Abhyankar   Vec             b;
96067877ebaSShri Abhyankar   IS              is_iden;
96167877ebaSShri Abhyankar   const PetscInt  M = A->rmap->N;
962450b117fSShri Abhyankar 
963450b117fSShri Abhyankar   PetscFunctionBegin;
964450b117fSShri Abhyankar   lu->matstruc = DIFFERENT_NONZERO_PATTERN;
965dcd589f8SShri Abhyankar 
9669a2535b5SHong Zhang   /* Set MUMPS options from the options database */
9679a2535b5SHong Zhang   ierr = PetscSetMUMPSFromOptions(F,A);CHKERRQ(ierr);
968dcd589f8SShri Abhyankar 
969eb85809bSHong Zhang   ierr = (*lu->ConvertToTriples)(A, 1, MAT_INITIAL_MATRIX, &lu->nz, &lu->irn, &lu->jcn, &lu->val);CHKERRQ(ierr);
97067877ebaSShri Abhyankar 
97167877ebaSShri Abhyankar   /* analysis phase */
97267877ebaSShri Abhyankar   /*----------------*/
9733d472b54SHong Zhang   lu->id.job = JOB_FACTSYMBOLIC;
97467877ebaSShri Abhyankar   lu->id.n = M;
97567877ebaSShri Abhyankar   switch (lu->id.ICNTL(18)){
97667877ebaSShri Abhyankar   case 0:  /* centralized assembled matrix input */
97767877ebaSShri Abhyankar     if (!lu->myid) {
97867877ebaSShri Abhyankar       lu->id.nz =lu->nz; lu->id.irn=lu->irn; lu->id.jcn=lu->jcn;
97967877ebaSShri Abhyankar       if (lu->id.ICNTL(6)>1){
98067877ebaSShri Abhyankar #if defined(PETSC_USE_COMPLEX)
9812907cef9SHong Zhang #if defined(PETSC_USE_REAL_SINGLE)
9822907cef9SHong Zhang         lu->id.a = (mumps_complex*)lu->val;
9832907cef9SHong Zhang #else
98467877ebaSShri Abhyankar         lu->id.a = (mumps_double_complex*)lu->val;
9852907cef9SHong Zhang #endif
98667877ebaSShri Abhyankar #else
98767877ebaSShri Abhyankar         lu->id.a = lu->val;
98867877ebaSShri Abhyankar #endif
98967877ebaSShri Abhyankar       }
99067877ebaSShri Abhyankar     }
99167877ebaSShri Abhyankar     break;
99267877ebaSShri Abhyankar   case 3:  /* distributed assembled matrix input (size>1) */
99367877ebaSShri Abhyankar     lu->id.nz_loc = lu->nz;
99467877ebaSShri Abhyankar     lu->id.irn_loc=lu->irn; lu->id.jcn_loc=lu->jcn;
99567877ebaSShri Abhyankar     if (lu->id.ICNTL(6)>1) {
99667877ebaSShri Abhyankar #if defined(PETSC_USE_COMPLEX)
9972907cef9SHong Zhang #if defined(PETSC_USE_REAL_SINGLE)
9982907cef9SHong Zhang       lu->id.a_loc = (mumps_complex*)lu->val;
9992907cef9SHong Zhang #else
100067877ebaSShri Abhyankar       lu->id.a_loc = (mumps_double_complex*)lu->val;
10012907cef9SHong Zhang #endif
100267877ebaSShri Abhyankar #else
100367877ebaSShri Abhyankar       lu->id.a_loc = lu->val;
100467877ebaSShri Abhyankar #endif
100567877ebaSShri Abhyankar     }
100667877ebaSShri Abhyankar     /* MUMPS only supports centralized rhs. Create scatter scat_rhs for repeated use in MatSolve() */
100767877ebaSShri Abhyankar     if (!lu->myid){
100867877ebaSShri Abhyankar       ierr = VecCreateSeq(PETSC_COMM_SELF,A->cmap->N,&lu->b_seq);CHKERRQ(ierr);
100967877ebaSShri Abhyankar       ierr = ISCreateStride(PETSC_COMM_SELF,A->cmap->N,0,1,&is_iden);CHKERRQ(ierr);
101067877ebaSShri Abhyankar     } else {
101167877ebaSShri Abhyankar       ierr = VecCreateSeq(PETSC_COMM_SELF,0,&lu->b_seq);CHKERRQ(ierr);
101267877ebaSShri Abhyankar       ierr = ISCreateStride(PETSC_COMM_SELF,0,0,1,&is_iden);CHKERRQ(ierr);
101367877ebaSShri Abhyankar     }
101467877ebaSShri Abhyankar     ierr = VecCreate(((PetscObject)A)->comm,&b);CHKERRQ(ierr);
101567877ebaSShri Abhyankar     ierr = VecSetSizes(b,A->rmap->n,PETSC_DECIDE);CHKERRQ(ierr);
101667877ebaSShri Abhyankar     ierr = VecSetFromOptions(b);CHKERRQ(ierr);
101767877ebaSShri Abhyankar 
101867877ebaSShri Abhyankar     ierr = VecScatterCreate(b,is_iden,lu->b_seq,is_iden,&lu->scat_rhs);CHKERRQ(ierr);
10196bf464f9SBarry Smith     ierr = ISDestroy(&is_iden);CHKERRQ(ierr);
10206bf464f9SBarry Smith     ierr = VecDestroy(&b);CHKERRQ(ierr);
102167877ebaSShri Abhyankar     break;
102267877ebaSShri Abhyankar     }
10232907cef9SHong Zhang   PetscMUMPS_c(&lu->id);
102467877ebaSShri Abhyankar   if (lu->id.INFOG(1) < 0) SETERRQ1(PETSC_COMM_SELF,PETSC_ERR_LIB,"Error reported by MUMPS in analysis phase: INFOG(1)=%d\n",lu->id.INFOG(1));
102567877ebaSShri Abhyankar 
1026450b117fSShri Abhyankar   F->ops->lufactornumeric  = MatFactorNumeric_MUMPS;
1027dcd589f8SShri Abhyankar   F->ops->solve            = MatSolve_MUMPS;
102851d5961aSHong Zhang   F->ops->solvetranspose   = MatSolveTranspose_MUMPS;
1029450b117fSShri Abhyankar   PetscFunctionReturn(0);
1030450b117fSShri Abhyankar }
1031b24902e0SBarry Smith 
1032141f4205SHong Zhang /* Note the Petsc r permutation and factor info are ignored */
1033397b6df1SKris Buschelman #undef __FUNCT__
103467877ebaSShri Abhyankar #define __FUNCT__ "MatCholeskyFactorSymbolic_MUMPS"
103567877ebaSShri Abhyankar PetscErrorCode MatCholeskyFactorSymbolic_MUMPS(Mat F,Mat A,IS r,const MatFactorInfo *info)
1036b24902e0SBarry Smith {
10372792810eSHong Zhang   Mat_MUMPS          *lu = (Mat_MUMPS*)F->spptr;
1038dcd589f8SShri Abhyankar   PetscErrorCode     ierr;
103967877ebaSShri Abhyankar   Vec                b;
104067877ebaSShri Abhyankar   IS                 is_iden;
104167877ebaSShri Abhyankar   const PetscInt     M = A->rmap->N;
1042397b6df1SKris Buschelman 
1043397b6df1SKris Buschelman   PetscFunctionBegin;
1044b24902e0SBarry Smith   lu->matstruc = DIFFERENT_NONZERO_PATTERN;
1045dcd589f8SShri Abhyankar 
10469a2535b5SHong Zhang   /* Set MUMPS options from the options database */
10479a2535b5SHong Zhang   ierr = PetscSetMUMPSFromOptions(F,A);CHKERRQ(ierr);
1048dcd589f8SShri Abhyankar 
1049eb85809bSHong Zhang   ierr = (*lu->ConvertToTriples)(A, 1 , MAT_INITIAL_MATRIX, &lu->nz, &lu->irn, &lu->jcn, &lu->val);CHKERRQ(ierr);
1050dcd589f8SShri Abhyankar 
105167877ebaSShri Abhyankar   /* analysis phase */
105267877ebaSShri Abhyankar   /*----------------*/
10533d472b54SHong Zhang   lu->id.job = JOB_FACTSYMBOLIC;
105467877ebaSShri Abhyankar   lu->id.n = M;
105567877ebaSShri Abhyankar   switch (lu->id.ICNTL(18)){
105667877ebaSShri Abhyankar   case 0:  /* centralized assembled matrix input */
105767877ebaSShri Abhyankar     if (!lu->myid) {
105867877ebaSShri Abhyankar       lu->id.nz =lu->nz; lu->id.irn=lu->irn; lu->id.jcn=lu->jcn;
105967877ebaSShri Abhyankar       if (lu->id.ICNTL(6)>1){
106067877ebaSShri Abhyankar #if defined(PETSC_USE_COMPLEX)
10612907cef9SHong Zhang #if defined(PETSC_USE_REAL_SINGLE)
10622907cef9SHong Zhang         lu->id.a = (mumps_complex*)lu->val;
10632907cef9SHong Zhang #else
106467877ebaSShri Abhyankar         lu->id.a = (mumps_double_complex*)lu->val;
10652907cef9SHong Zhang #endif
106667877ebaSShri Abhyankar #else
106767877ebaSShri Abhyankar         lu->id.a = lu->val;
106867877ebaSShri Abhyankar #endif
106967877ebaSShri Abhyankar       }
107067877ebaSShri Abhyankar     }
107167877ebaSShri Abhyankar     break;
107267877ebaSShri Abhyankar   case 3:  /* distributed assembled matrix input (size>1) */
107367877ebaSShri Abhyankar     lu->id.nz_loc = lu->nz;
107467877ebaSShri Abhyankar     lu->id.irn_loc=lu->irn; lu->id.jcn_loc=lu->jcn;
107567877ebaSShri Abhyankar     if (lu->id.ICNTL(6)>1) {
107667877ebaSShri Abhyankar #if defined(PETSC_USE_COMPLEX)
10772907cef9SHong Zhang #if defined(PETSC_USE_REAL_SINGLE)
10782907cef9SHong Zhang       lu->id.a_loc = (mumps_complex*)lu->val;
10792907cef9SHong Zhang #else
108067877ebaSShri Abhyankar       lu->id.a_loc = (mumps_double_complex*)lu->val;
10812907cef9SHong Zhang #endif
108267877ebaSShri Abhyankar #else
108367877ebaSShri Abhyankar       lu->id.a_loc = lu->val;
108467877ebaSShri Abhyankar #endif
108567877ebaSShri Abhyankar     }
108667877ebaSShri Abhyankar     /* MUMPS only supports centralized rhs. Create scatter scat_rhs for repeated use in MatSolve() */
108767877ebaSShri Abhyankar     if (!lu->myid){
108867877ebaSShri Abhyankar       ierr = VecCreateSeq(PETSC_COMM_SELF,A->cmap->N,&lu->b_seq);CHKERRQ(ierr);
108967877ebaSShri Abhyankar       ierr = ISCreateStride(PETSC_COMM_SELF,A->cmap->N,0,1,&is_iden);CHKERRQ(ierr);
109067877ebaSShri Abhyankar     } else {
109167877ebaSShri Abhyankar       ierr = VecCreateSeq(PETSC_COMM_SELF,0,&lu->b_seq);CHKERRQ(ierr);
109267877ebaSShri Abhyankar       ierr = ISCreateStride(PETSC_COMM_SELF,0,0,1,&is_iden);CHKERRQ(ierr);
109367877ebaSShri Abhyankar     }
109467877ebaSShri Abhyankar     ierr = VecCreate(((PetscObject)A)->comm,&b);CHKERRQ(ierr);
109567877ebaSShri Abhyankar     ierr = VecSetSizes(b,A->rmap->n,PETSC_DECIDE);CHKERRQ(ierr);
109667877ebaSShri Abhyankar     ierr = VecSetFromOptions(b);CHKERRQ(ierr);
109767877ebaSShri Abhyankar 
109867877ebaSShri Abhyankar     ierr = VecScatterCreate(b,is_iden,lu->b_seq,is_iden,&lu->scat_rhs);CHKERRQ(ierr);
10996bf464f9SBarry Smith     ierr = ISDestroy(&is_iden);CHKERRQ(ierr);
11006bf464f9SBarry Smith     ierr = VecDestroy(&b);CHKERRQ(ierr);
110167877ebaSShri Abhyankar     break;
110267877ebaSShri Abhyankar     }
11032907cef9SHong Zhang   PetscMUMPS_c(&lu->id);
110467877ebaSShri Abhyankar   if (lu->id.INFOG(1) < 0) SETERRQ1(PETSC_COMM_SELF,PETSC_ERR_LIB,"Error reported by MUMPS in analysis phase: INFOG(1)=%d\n",lu->id.INFOG(1));
110567877ebaSShri Abhyankar 
11062792810eSHong Zhang   F->ops->choleskyfactornumeric = MatFactorNumeric_MUMPS;
1107dcd589f8SShri Abhyankar   F->ops->solve                 = MatSolve_MUMPS;
110851d5961aSHong Zhang   F->ops->solvetranspose        = MatSolve_MUMPS;
1109377a2891SHong Zhang   F->ops->matsolve              = MatMatSolve_MUMPS;
1110db4efbfdSBarry Smith #if !defined(PETSC_USE_COMPLEX)
111105aa0992SJose Roman   F->ops->getinertia            = MatGetInertia_SBAIJMUMPS;
111205aa0992SJose Roman #else
111305aa0992SJose Roman   F->ops->getinertia            = PETSC_NULL;
1114db4efbfdSBarry Smith #endif
1115b24902e0SBarry Smith   PetscFunctionReturn(0);
1116b24902e0SBarry Smith }
1117b24902e0SBarry Smith 
1118397b6df1SKris Buschelman #undef __FUNCT__
111964e6c443SBarry Smith #define __FUNCT__ "MatView_MUMPS"
112064e6c443SBarry Smith PetscErrorCode MatView_MUMPS(Mat A,PetscViewer viewer)
112174ed9c26SBarry Smith {
1122f6c57405SHong Zhang   PetscErrorCode    ierr;
112364e6c443SBarry Smith   PetscBool         iascii;
112464e6c443SBarry Smith   PetscViewerFormat format;
112564e6c443SBarry Smith   Mat_MUMPS         *lu=(Mat_MUMPS*)A->spptr;
1126f6c57405SHong Zhang 
1127f6c57405SHong Zhang   PetscFunctionBegin;
112864e6c443SBarry Smith   /* check if matrix is mumps type */
112964e6c443SBarry Smith   if (A->ops->solve != MatSolve_MUMPS) PetscFunctionReturn(0);
113064e6c443SBarry Smith 
1131251f4c67SDmitry Karpeev   ierr = PetscObjectTypeCompare((PetscObject)viewer,PETSCVIEWERASCII,&iascii);CHKERRQ(ierr);
113264e6c443SBarry Smith   if (iascii) {
113364e6c443SBarry Smith     ierr = PetscViewerGetFormat(viewer,&format);CHKERRQ(ierr);
113464e6c443SBarry Smith     if (format == PETSC_VIEWER_ASCII_INFO){
113564e6c443SBarry Smith       ierr = PetscViewerASCIIPrintf(viewer,"MUMPS run parameters:\n");CHKERRQ(ierr);
113664e6c443SBarry Smith       ierr = PetscViewerASCIIPrintf(viewer,"  SYM (matrix type):                   %d \n",lu->id.sym);CHKERRQ(ierr);
113764e6c443SBarry Smith       ierr = PetscViewerASCIIPrintf(viewer,"  PAR (host participation):            %d \n",lu->id.par);CHKERRQ(ierr);
1138f6c57405SHong Zhang       ierr = PetscViewerASCIIPrintf(viewer,"  ICNTL(1) (output for error):         %d \n",lu->id.ICNTL(1));CHKERRQ(ierr);
1139f6c57405SHong Zhang       ierr = PetscViewerASCIIPrintf(viewer,"  ICNTL(2) (output of diagnostic msg): %d \n",lu->id.ICNTL(2));CHKERRQ(ierr);
1140f6c57405SHong Zhang       ierr = PetscViewerASCIIPrintf(viewer,"  ICNTL(3) (output for global info):   %d \n",lu->id.ICNTL(3));CHKERRQ(ierr);
1141f6c57405SHong Zhang       ierr = PetscViewerASCIIPrintf(viewer,"  ICNTL(4) (level of printing):        %d \n",lu->id.ICNTL(4));CHKERRQ(ierr);
1142f6c57405SHong Zhang       ierr = PetscViewerASCIIPrintf(viewer,"  ICNTL(5) (input mat struct):         %d \n",lu->id.ICNTL(5));CHKERRQ(ierr);
1143f6c57405SHong Zhang       ierr = PetscViewerASCIIPrintf(viewer,"  ICNTL(6) (matrix prescaling):        %d \n",lu->id.ICNTL(6));CHKERRQ(ierr);
1144d06efebcSBarry Smith       ierr = PetscViewerASCIIPrintf(viewer,"  ICNTL(7) (sequentia matrix ordering):%d \n",lu->id.ICNTL(7));CHKERRQ(ierr);
1145f6c57405SHong Zhang       ierr = PetscViewerASCIIPrintf(viewer,"  ICNTL(8) (scalling strategy):        %d \n",lu->id.ICNTL(8));CHKERRQ(ierr);
1146f6c57405SHong Zhang       ierr = PetscViewerASCIIPrintf(viewer,"  ICNTL(10) (max num of refinements):  %d \n",lu->id.ICNTL(10));CHKERRQ(ierr);
1147f6c57405SHong Zhang       ierr = PetscViewerASCIIPrintf(viewer,"  ICNTL(11) (error analysis):          %d \n",lu->id.ICNTL(11));CHKERRQ(ierr);
114834ed7027SBarry Smith       if (lu->id.ICNTL(11)>0) {
114934ed7027SBarry Smith         ierr = PetscViewerASCIIPrintf(viewer,"    RINFOG(4) (inf norm of input mat):        %g\n",lu->id.RINFOG(4));CHKERRQ(ierr);
115034ed7027SBarry Smith         ierr = PetscViewerASCIIPrintf(viewer,"    RINFOG(5) (inf norm of solution):         %g\n",lu->id.RINFOG(5));CHKERRQ(ierr);
115134ed7027SBarry Smith         ierr = PetscViewerASCIIPrintf(viewer,"    RINFOG(6) (inf norm of residual):         %g\n",lu->id.RINFOG(6));CHKERRQ(ierr);
115234ed7027SBarry Smith         ierr = PetscViewerASCIIPrintf(viewer,"    RINFOG(7),RINFOG(8) (backward error est): %g, %g\n",lu->id.RINFOG(7),lu->id.RINFOG(8));CHKERRQ(ierr);
115334ed7027SBarry Smith         ierr = PetscViewerASCIIPrintf(viewer,"    RINFOG(9) (error estimate):               %g \n",lu->id.RINFOG(9));CHKERRQ(ierr);
115434ed7027SBarry Smith         ierr = PetscViewerASCIIPrintf(viewer,"    RINFOG(10),RINFOG(11)(condition numbers): %g, %g\n",lu->id.RINFOG(10),lu->id.RINFOG(11));CHKERRQ(ierr);
1155f6c57405SHong Zhang       }
1156f6c57405SHong Zhang       ierr = PetscViewerASCIIPrintf(viewer,"  ICNTL(12) (efficiency control):                         %d \n",lu->id.ICNTL(12));CHKERRQ(ierr);
1157f6c57405SHong Zhang       ierr = PetscViewerASCIIPrintf(viewer,"  ICNTL(13) (efficiency control):                         %d \n",lu->id.ICNTL(13));CHKERRQ(ierr);
1158f6c57405SHong Zhang       ierr = PetscViewerASCIIPrintf(viewer,"  ICNTL(14) (percentage of estimated workspace increase): %d \n",lu->id.ICNTL(14));CHKERRQ(ierr);
1159f6c57405SHong Zhang       /* ICNTL(15-17) not used */
1160f6c57405SHong Zhang       ierr = PetscViewerASCIIPrintf(viewer,"  ICNTL(18) (input mat struct):                           %d \n",lu->id.ICNTL(18));CHKERRQ(ierr);
1161f6c57405SHong Zhang       ierr = PetscViewerASCIIPrintf(viewer,"  ICNTL(19) (Shur complement info):                       %d \n",lu->id.ICNTL(19));CHKERRQ(ierr);
1162f6c57405SHong Zhang       ierr = PetscViewerASCIIPrintf(viewer,"  ICNTL(20) (rhs sparse pattern):                         %d \n",lu->id.ICNTL(20));CHKERRQ(ierr);
1163f6c57405SHong Zhang       ierr = PetscViewerASCIIPrintf(viewer,"  ICNTL(21) (solution struct):                            %d \n",lu->id.ICNTL(21));CHKERRQ(ierr);
1164c0165424SHong Zhang       ierr = PetscViewerASCIIPrintf(viewer,"  ICNTL(22) (in-core/out-of-core facility):               %d \n",lu->id.ICNTL(22));CHKERRQ(ierr);
1165c0165424SHong Zhang       ierr = PetscViewerASCIIPrintf(viewer,"  ICNTL(23) (max size of memory can be allocated locally):%d \n",lu->id.ICNTL(23));CHKERRQ(ierr);
1166c0165424SHong Zhang 
1167c0165424SHong Zhang       ierr = PetscViewerASCIIPrintf(viewer,"  ICNTL(24) (detection of null pivot rows):               %d \n",lu->id.ICNTL(24));CHKERRQ(ierr);
1168c0165424SHong Zhang       ierr = PetscViewerASCIIPrintf(viewer,"  ICNTL(25) (computation of a null space basis):          %d \n",lu->id.ICNTL(25));CHKERRQ(ierr);
1169c0165424SHong Zhang       ierr = PetscViewerASCIIPrintf(viewer,"  ICNTL(26) (Schur options for rhs or solution):          %d \n",lu->id.ICNTL(26));CHKERRQ(ierr);
1170c0165424SHong Zhang       ierr = PetscViewerASCIIPrintf(viewer,"  ICNTL(27) (experimental parameter):                     %d \n",lu->id.ICNTL(27));CHKERRQ(ierr);
117142179a6aSHong Zhang       ierr = PetscViewerASCIIPrintf(viewer,"  ICNTL(28) (use parallel or sequential ordering):        %d \n",lu->id.ICNTL(28));CHKERRQ(ierr);
117242179a6aSHong Zhang       ierr = PetscViewerASCIIPrintf(viewer,"  ICNTL(29) (parallel ordering):                          %d \n",lu->id.ICNTL(29));CHKERRQ(ierr);
117342179a6aSHong Zhang 
117442179a6aSHong Zhang       ierr = PetscViewerASCIIPrintf(viewer,"  ICNTL(30) (user-specified set of entries in inv(A)):    %d \n",lu->id.ICNTL(30));CHKERRQ(ierr);
117542179a6aSHong Zhang       ierr = PetscViewerASCIIPrintf(viewer,"  ICNTL(31) (factors is discarded in the solve phase):    %d \n",lu->id.ICNTL(31));CHKERRQ(ierr);
117642179a6aSHong Zhang       ierr = PetscViewerASCIIPrintf(viewer,"  ICNTL(33) (compute determinant):                        %d \n",lu->id.ICNTL(33));CHKERRQ(ierr);
1177f6c57405SHong Zhang 
1178f6c57405SHong Zhang       ierr = PetscViewerASCIIPrintf(viewer,"  CNTL(1) (relative pivoting threshold):      %g \n",lu->id.CNTL(1));CHKERRQ(ierr);
1179f6c57405SHong Zhang       ierr = PetscViewerASCIIPrintf(viewer,"  CNTL(2) (stopping criterion of refinement): %g \n",lu->id.CNTL(2));CHKERRQ(ierr);
1180f6c57405SHong Zhang       ierr = PetscViewerASCIIPrintf(viewer,"  CNTL(3) (absolute pivoting threshold):      %g \n",lu->id.CNTL(3));CHKERRQ(ierr);
1181f6c57405SHong Zhang       ierr = PetscViewerASCIIPrintf(viewer,"  CNTL(4) (value of static pivoting):         %g \n",lu->id.CNTL(4));CHKERRQ(ierr);
1182c0165424SHong Zhang       ierr = PetscViewerASCIIPrintf(viewer,"  CNTL(5) (fixation for null pivots):         %g \n",lu->id.CNTL(5));CHKERRQ(ierr);
1183f6c57405SHong Zhang 
1184f6c57405SHong Zhang       /* infomation local to each processor */
118534ed7027SBarry Smith       ierr = PetscViewerASCIIPrintf(viewer, "  RINFO(1) (local estimated flops for the elimination after analysis): \n");CHKERRQ(ierr);
11867b23a99aSBarry Smith       ierr = PetscViewerASCIISynchronizedAllow(viewer,PETSC_TRUE);CHKERRQ(ierr);
118734ed7027SBarry Smith       ierr = PetscViewerASCIISynchronizedPrintf(viewer,"    [%d] %g \n",lu->myid,lu->id.RINFO(1));CHKERRQ(ierr);
118834ed7027SBarry Smith       ierr = PetscViewerFlush(viewer);
118934ed7027SBarry Smith       ierr = PetscViewerASCIIPrintf(viewer, "  RINFO(2) (local estimated flops for the assembly after factorization): \n");CHKERRQ(ierr);
119034ed7027SBarry Smith       ierr = PetscViewerASCIISynchronizedPrintf(viewer,"    [%d]  %g \n",lu->myid,lu->id.RINFO(2));CHKERRQ(ierr);
119134ed7027SBarry Smith       ierr = PetscViewerFlush(viewer);
119234ed7027SBarry Smith       ierr = PetscViewerASCIIPrintf(viewer, "  RINFO(3) (local estimated flops for the elimination after factorization): \n");CHKERRQ(ierr);
119334ed7027SBarry Smith       ierr = PetscViewerASCIISynchronizedPrintf(viewer,"    [%d]  %g \n",lu->myid,lu->id.RINFO(3));CHKERRQ(ierr);
119434ed7027SBarry Smith       ierr = PetscViewerFlush(viewer);
1195f6c57405SHong Zhang 
119634ed7027SBarry Smith       ierr = PetscViewerASCIIPrintf(viewer, "  INFO(15) (estimated size of (in MB) MUMPS internal data for running numerical factorization): \n");CHKERRQ(ierr);
119734ed7027SBarry Smith       ierr = PetscViewerASCIISynchronizedPrintf(viewer,"  [%d] %d \n",lu->myid,lu->id.INFO(15));CHKERRQ(ierr);
119834ed7027SBarry Smith       ierr = PetscViewerFlush(viewer);
1199f6c57405SHong Zhang 
120034ed7027SBarry Smith       ierr = PetscViewerASCIIPrintf(viewer, "  INFO(16) (size of (in MB) MUMPS internal data used during numerical factorization): \n");CHKERRQ(ierr);
120134ed7027SBarry Smith       ierr = PetscViewerASCIISynchronizedPrintf(viewer,"    [%d] %d \n",lu->myid,lu->id.INFO(16));CHKERRQ(ierr);
120234ed7027SBarry Smith       ierr = PetscViewerFlush(viewer);
1203f6c57405SHong Zhang 
120434ed7027SBarry Smith       ierr = PetscViewerASCIIPrintf(viewer, "  INFO(23) (num of pivots eliminated on this processor after factorization): \n");CHKERRQ(ierr);
120534ed7027SBarry Smith       ierr = PetscViewerASCIISynchronizedPrintf(viewer,"    [%d] %d \n",lu->myid,lu->id.INFO(23));CHKERRQ(ierr);
120634ed7027SBarry Smith       ierr = PetscViewerFlush(viewer);
12077b23a99aSBarry Smith       ierr = PetscViewerASCIISynchronizedAllow(viewer,PETSC_FALSE);CHKERRQ(ierr);
1208f6c57405SHong Zhang 
1209f6c57405SHong Zhang       if (!lu->myid){ /* information from the host */
1210f6c57405SHong Zhang         ierr = PetscViewerASCIIPrintf(viewer,"  RINFOG(1) (global estimated flops for the elimination after analysis): %g \n",lu->id.RINFOG(1));CHKERRQ(ierr);
1211f6c57405SHong Zhang         ierr = PetscViewerASCIIPrintf(viewer,"  RINFOG(2) (global estimated flops for the assembly after factorization): %g \n",lu->id.RINFOG(2));CHKERRQ(ierr);
1212f6c57405SHong Zhang         ierr = PetscViewerASCIIPrintf(viewer,"  RINFOG(3) (global estimated flops for the elimination after factorization): %g \n",lu->id.RINFOG(3));CHKERRQ(ierr);
121342179a6aSHong Zhang         ierr = PetscViewerASCIIPrintf(viewer,"  (RINFOG(12) RINFOG(13))*2^INFOG(34) (determinant): (%g,%g)*(2^%d)\n",lu->id.RINFOG(12),lu->id.RINFOG(13),lu->id.INFOG(34));CHKERRQ(ierr);
1214f6c57405SHong Zhang 
1215f6c57405SHong Zhang         ierr = PetscViewerASCIIPrintf(viewer,"  INFOG(3) (estimated real workspace for factors on all processors after analysis): %d \n",lu->id.INFOG(3));CHKERRQ(ierr);
1216f6c57405SHong Zhang         ierr = PetscViewerASCIIPrintf(viewer,"  INFOG(4) (estimated integer workspace for factors on all processors after analysis): %d \n",lu->id.INFOG(4));CHKERRQ(ierr);
1217f6c57405SHong Zhang         ierr = PetscViewerASCIIPrintf(viewer,"  INFOG(5) (estimated maximum front size in the complete tree): %d \n",lu->id.INFOG(5));CHKERRQ(ierr);
1218f6c57405SHong Zhang         ierr = PetscViewerASCIIPrintf(viewer,"  INFOG(6) (number of nodes in the complete tree): %d \n",lu->id.INFOG(6));CHKERRQ(ierr);
12192bd8dccdSBarry Smith         ierr = PetscViewerASCIIPrintf(viewer,"  INFOG(7) (ordering option effectively use after analysis): %d \n",lu->id.INFOG(7));CHKERRQ(ierr);
1220f6c57405SHong Zhang         ierr = PetscViewerASCIIPrintf(viewer,"  INFOG(8) (structural symmetry in percent of the permuted matrix after analysis): %d \n",lu->id.INFOG(8));CHKERRQ(ierr);
1221f6c57405SHong Zhang         ierr = PetscViewerASCIIPrintf(viewer,"  INFOG(9) (total real/complex workspace to store the matrix factors after factorization): %d \n",lu->id.INFOG(9));CHKERRQ(ierr);
1222f6c57405SHong Zhang         ierr = PetscViewerASCIIPrintf(viewer,"  INFOG(10) (total integer space store the matrix factors after factorization): %d \n",lu->id.INFOG(10));CHKERRQ(ierr);
1223f6c57405SHong Zhang         ierr = PetscViewerASCIIPrintf(viewer,"  INFOG(11) (order of largest frontal matrix after factorization): %d \n",lu->id.INFOG(11));CHKERRQ(ierr);
1224f6c57405SHong Zhang         ierr = PetscViewerASCIIPrintf(viewer,"  INFOG(12) (number of off-diagonal pivots): %d \n",lu->id.INFOG(12));CHKERRQ(ierr);
1225f6c57405SHong Zhang         ierr = PetscViewerASCIIPrintf(viewer,"  INFOG(13) (number of delayed pivots after factorization): %d \n",lu->id.INFOG(13));CHKERRQ(ierr);
1226f6c57405SHong Zhang         ierr = PetscViewerASCIIPrintf(viewer,"  INFOG(14) (number of memory compress after factorization): %d \n",lu->id.INFOG(14));CHKERRQ(ierr);
1227f6c57405SHong Zhang         ierr = PetscViewerASCIIPrintf(viewer,"  INFOG(15) (number of steps of iterative refinement after solution): %d \n",lu->id.INFOG(15));CHKERRQ(ierr);
1228f6c57405SHong Zhang         ierr = PetscViewerASCIIPrintf(viewer,"  INFOG(16) (estimated size (in MB) of all MUMPS internal data for factorization after analysis: value on the most memory consuming processor): %d \n",lu->id.INFOG(16));CHKERRQ(ierr);
1229f6c57405SHong Zhang         ierr = PetscViewerASCIIPrintf(viewer,"  INFOG(17) (estimated size of all MUMPS internal data for factorization after analysis: sum over all processors): %d \n",lu->id.INFOG(17));CHKERRQ(ierr);
1230f6c57405SHong Zhang         ierr = PetscViewerASCIIPrintf(viewer,"  INFOG(18) (size of all MUMPS internal data allocated during factorization: value on the most memory consuming processor): %d \n",lu->id.INFOG(18));CHKERRQ(ierr);
1231f6c57405SHong Zhang         ierr = PetscViewerASCIIPrintf(viewer,"  INFOG(19) (size of all MUMPS internal data allocated during factorization: sum over all processors): %d \n",lu->id.INFOG(19));CHKERRQ(ierr);
1232f6c57405SHong Zhang         ierr = PetscViewerASCIIPrintf(viewer,"  INFOG(20) (estimated number of entries in the factors): %d \n",lu->id.INFOG(20));CHKERRQ(ierr);
1233f6c57405SHong Zhang         ierr = PetscViewerASCIIPrintf(viewer,"  INFOG(21) (size in MB of memory effectively used during factorization - value on the most memory consuming processor): %d \n",lu->id.INFOG(21));CHKERRQ(ierr);
1234f6c57405SHong Zhang         ierr = PetscViewerASCIIPrintf(viewer,"  INFOG(22) (size in MB of memory effectively used during factorization - sum over all processors): %d \n",lu->id.INFOG(22));CHKERRQ(ierr);
1235f6c57405SHong Zhang         ierr = PetscViewerASCIIPrintf(viewer,"  INFOG(23) (after analysis: value of ICNTL(6) effectively used): %d \n",lu->id.INFOG(23));CHKERRQ(ierr);
1236f6c57405SHong Zhang         ierr = PetscViewerASCIIPrintf(viewer,"  INFOG(24) (after analysis: value of ICNTL(12) effectively used): %d \n",lu->id.INFOG(24));CHKERRQ(ierr);
1237f6c57405SHong Zhang         ierr = PetscViewerASCIIPrintf(viewer,"  INFOG(25) (after factorization: number of pivots modified by static pivoting): %d \n",lu->id.INFOG(25));CHKERRQ(ierr);
1238f6c57405SHong Zhang       }
1239f6c57405SHong Zhang     }
1240cb828f0fSHong Zhang   }
1241f6c57405SHong Zhang   PetscFunctionReturn(0);
1242f6c57405SHong Zhang }
1243f6c57405SHong Zhang 
124435bd34faSBarry Smith #undef __FUNCT__
124535bd34faSBarry Smith #define __FUNCT__ "MatGetInfo_MUMPS"
124635bd34faSBarry Smith PetscErrorCode MatGetInfo_MUMPS(Mat A,MatInfoType flag,MatInfo *info)
124735bd34faSBarry Smith {
1248cb828f0fSHong Zhang   Mat_MUMPS  *mumps =(Mat_MUMPS*)A->spptr;
124935bd34faSBarry Smith 
125035bd34faSBarry Smith   PetscFunctionBegin;
125135bd34faSBarry Smith   info->block_size        = 1.0;
1252cb828f0fSHong Zhang   info->nz_allocated      = mumps->id.INFOG(20);
1253cb828f0fSHong Zhang   info->nz_used           = mumps->id.INFOG(20);
125435bd34faSBarry Smith   info->nz_unneeded       = 0.0;
125535bd34faSBarry Smith   info->assemblies        = 0.0;
125635bd34faSBarry Smith   info->mallocs           = 0.0;
125735bd34faSBarry Smith   info->memory            = 0.0;
125835bd34faSBarry Smith   info->fill_ratio_given  = 0;
125935bd34faSBarry Smith   info->fill_ratio_needed = 0;
126035bd34faSBarry Smith   info->factor_mallocs    = 0;
126135bd34faSBarry Smith   PetscFunctionReturn(0);
126235bd34faSBarry Smith }
126335bd34faSBarry Smith 
12645ccb76cbSHong Zhang /* -------------------------------------------------------------------------------------------*/
12655ccb76cbSHong Zhang #undef __FUNCT__
12665ccb76cbSHong Zhang #define __FUNCT__ "MatMumpsSetIcntl_MUMPS"
12675ccb76cbSHong Zhang PetscErrorCode MatMumpsSetIcntl_MUMPS(Mat F,PetscInt icntl,PetscInt ival)
12685ccb76cbSHong Zhang {
12695ccb76cbSHong Zhang   Mat_MUMPS *lu =(Mat_MUMPS*)F->spptr;
12705ccb76cbSHong Zhang 
12715ccb76cbSHong Zhang   PetscFunctionBegin;
12725ccb76cbSHong Zhang   lu->id.ICNTL(icntl) = ival;
12735ccb76cbSHong Zhang   PetscFunctionReturn(0);
12745ccb76cbSHong Zhang }
12755ccb76cbSHong Zhang 
12765ccb76cbSHong Zhang #undef __FUNCT__
12775ccb76cbSHong Zhang #define __FUNCT__ "MatMumpsSetIcntl"
12785ccb76cbSHong Zhang /*@
12795ccb76cbSHong Zhang   MatMumpsSetIcntl - Set MUMPS parameter ICNTL()
12805ccb76cbSHong Zhang 
12815ccb76cbSHong Zhang    Logically Collective on Mat
12825ccb76cbSHong Zhang 
12835ccb76cbSHong Zhang    Input Parameters:
12845ccb76cbSHong Zhang +  F - the factored matrix obtained by calling MatGetFactor() from PETSc-MUMPS interface
12855ccb76cbSHong Zhang .  icntl - index of MUMPS parameter array ICNTL()
12865ccb76cbSHong Zhang -  ival - value of MUMPS ICNTL(icntl)
12875ccb76cbSHong Zhang 
12885ccb76cbSHong Zhang   Options Database:
12895ccb76cbSHong Zhang .   -mat_mumps_icntl_<icntl> <ival>
12905ccb76cbSHong Zhang 
12915ccb76cbSHong Zhang    Level: beginner
12925ccb76cbSHong Zhang 
12935ccb76cbSHong Zhang    References: MUMPS Users' Guide
12945ccb76cbSHong Zhang 
12955ccb76cbSHong Zhang .seealso: MatGetFactor()
12965ccb76cbSHong Zhang @*/
12975ccb76cbSHong Zhang PetscErrorCode MatMumpsSetIcntl(Mat F,PetscInt icntl,PetscInt ival)
12985ccb76cbSHong Zhang {
12995ccb76cbSHong Zhang   PetscErrorCode ierr;
13005ccb76cbSHong Zhang 
13015ccb76cbSHong Zhang   PetscFunctionBegin;
13025ccb76cbSHong Zhang   PetscValidLogicalCollectiveInt(F,icntl,2);
13035ccb76cbSHong Zhang   PetscValidLogicalCollectiveInt(F,ival,3);
13045ccb76cbSHong Zhang   ierr = PetscTryMethod(F,"MatMumpsSetIcntl_C",(Mat,PetscInt,PetscInt),(F,icntl,ival));CHKERRQ(ierr);
13055ccb76cbSHong Zhang   PetscFunctionReturn(0);
13065ccb76cbSHong Zhang }
13075ccb76cbSHong Zhang 
130824b6179bSKris Buschelman /*MC
13092692d6eeSBarry Smith   MATSOLVERMUMPS -  A matrix type providing direct solvers (LU and Cholesky) for
131024b6179bSKris Buschelman   distributed and sequential matrices via the external package MUMPS.
131124b6179bSKris Buschelman 
131241c8de11SBarry Smith   Works with MATAIJ and MATSBAIJ matrices
131324b6179bSKris Buschelman 
131424b6179bSKris Buschelman   Options Database Keys:
1315fb8376fbSHong Zhang + -mat_mumps_icntl_4 <0,...,4> - print level
131624b6179bSKris Buschelman . -mat_mumps_icntl_6 <0,...,7> - matrix prescaling options (see MUMPS User's Guide)
131764e6c443SBarry Smith . -mat_mumps_icntl_7 <0,...,7> - matrix orderings (see MUMPS User's Guidec)
131824b6179bSKris Buschelman . -mat_mumps_icntl_9 <1,2> - A or A^T x=b to be solved: 1 denotes A, 2 denotes A^T
131924b6179bSKris Buschelman . -mat_mumps_icntl_10 <n> - maximum number of iterative refinements
132094b7f48cSBarry Smith . -mat_mumps_icntl_11 <n> - error analysis, a positive value returns statistics during -ksp_view
132124b6179bSKris Buschelman . -mat_mumps_icntl_12 <n> - efficiency control (see MUMPS User's Guide)
132224b6179bSKris Buschelman . -mat_mumps_icntl_13 <n> - efficiency control (see MUMPS User's Guide)
132324b6179bSKris Buschelman . -mat_mumps_icntl_14 <n> - efficiency control (see MUMPS User's Guide)
132424b6179bSKris Buschelman . -mat_mumps_icntl_15 <n> - efficiency control (see MUMPS User's Guide)
132524b6179bSKris Buschelman . -mat_mumps_cntl_1 <delta> - relative pivoting threshold
132624b6179bSKris Buschelman . -mat_mumps_cntl_2 <tol> - stopping criterion for refinement
132724b6179bSKris Buschelman - -mat_mumps_cntl_3 <adelta> - absolute pivoting threshold
132824b6179bSKris Buschelman 
132924b6179bSKris Buschelman   Level: beginner
133024b6179bSKris Buschelman 
133141c8de11SBarry Smith .seealso: PCFactorSetMatSolverPackage(), MatSolverPackage
133241c8de11SBarry Smith 
133324b6179bSKris Buschelman M*/
133424b6179bSKris Buschelman 
13352877fffaSHong Zhang EXTERN_C_BEGIN
133635bd34faSBarry Smith #undef __FUNCT__
133735bd34faSBarry Smith #define __FUNCT__ "MatFactorGetSolverPackage_mumps"
133835bd34faSBarry Smith PetscErrorCode MatFactorGetSolverPackage_mumps(Mat A,const MatSolverPackage *type)
133935bd34faSBarry Smith {
134035bd34faSBarry Smith   PetscFunctionBegin;
13412692d6eeSBarry Smith   *type = MATSOLVERMUMPS;
134235bd34faSBarry Smith   PetscFunctionReturn(0);
134335bd34faSBarry Smith }
134435bd34faSBarry Smith EXTERN_C_END
134535bd34faSBarry Smith 
134635bd34faSBarry Smith EXTERN_C_BEGIN
1347bccb9932SShri Abhyankar /* MatGetFactor for Seq and MPI AIJ matrices */
13482877fffaSHong Zhang #undef __FUNCT__
1349bccb9932SShri Abhyankar #define __FUNCT__ "MatGetFactor_aij_mumps"
1350bccb9932SShri Abhyankar PetscErrorCode MatGetFactor_aij_mumps(Mat A,MatFactorType ftype,Mat *F)
13512877fffaSHong Zhang {
13522877fffaSHong Zhang   Mat            B;
13532877fffaSHong Zhang   PetscErrorCode ierr;
13542877fffaSHong Zhang   Mat_MUMPS      *mumps;
1355ace3abfcSBarry Smith   PetscBool      isSeqAIJ;
13562877fffaSHong Zhang 
13572877fffaSHong Zhang   PetscFunctionBegin;
13582877fffaSHong Zhang   /* Create the factorization matrix */
1359251f4c67SDmitry Karpeev   ierr = PetscObjectTypeCompare((PetscObject)A,MATSEQAIJ,&isSeqAIJ);CHKERRQ(ierr);
13602877fffaSHong Zhang   ierr = MatCreate(((PetscObject)A)->comm,&B);CHKERRQ(ierr);
13612877fffaSHong Zhang   ierr = MatSetSizes(B,A->rmap->n,A->cmap->n,A->rmap->N,A->cmap->N);CHKERRQ(ierr);
13622877fffaSHong Zhang   ierr = MatSetType(B,((PetscObject)A)->type_name);CHKERRQ(ierr);
1363bccb9932SShri Abhyankar   if (isSeqAIJ) {
13642877fffaSHong Zhang     ierr = MatSeqAIJSetPreallocation(B,0,PETSC_NULL);CHKERRQ(ierr);
1365bccb9932SShri Abhyankar   } else {
1366bccb9932SShri Abhyankar     ierr = MatMPIAIJSetPreallocation(B,0,PETSC_NULL,0,PETSC_NULL);CHKERRQ(ierr);
1367bccb9932SShri Abhyankar   }
13682877fffaSHong Zhang 
136916ebf90aSShri Abhyankar   ierr = PetscNewLog(B,Mat_MUMPS,&mumps);CHKERRQ(ierr);
13702877fffaSHong Zhang   B->ops->view             = MatView_MUMPS;
137135bd34faSBarry Smith   B->ops->getinfo          = MatGetInfo_MUMPS;
137235bd34faSBarry Smith   ierr = PetscObjectComposeFunctionDynamic((PetscObject)B,"MatFactorGetSolverPackage_C","MatFactorGetSolverPackage_mumps",MatFactorGetSolverPackage_mumps);CHKERRQ(ierr);
13735ccb76cbSHong Zhang   ierr = PetscObjectComposeFunctionDynamic((PetscObject)B,"MatMumpsSetIcntl_C","MatMumpsSetIcntl_MUMPS",MatMumpsSetIcntl_MUMPS);CHKERRQ(ierr);
1374450b117fSShri Abhyankar   if (ftype == MAT_FACTOR_LU) {
1375450b117fSShri Abhyankar     B->ops->lufactorsymbolic = MatLUFactorSymbolic_AIJMUMPS;
1376d5f3da31SBarry Smith     B->factortype = MAT_FACTOR_LU;
1377bccb9932SShri Abhyankar     if (isSeqAIJ) mumps->ConvertToTriples = MatConvertToTriples_seqaij_seqaij;
1378bccb9932SShri Abhyankar     else mumps->ConvertToTriples = MatConvertToTriples_mpiaij_mpiaij;
1379746480a1SHong Zhang     mumps->sym = 0;
1380dcd589f8SShri Abhyankar   } else {
138167877ebaSShri Abhyankar     B->ops->choleskyfactorsymbolic = MatCholeskyFactorSymbolic_MUMPS;
1382450b117fSShri Abhyankar     B->factortype = MAT_FACTOR_CHOLESKY;
1383bccb9932SShri Abhyankar     if (isSeqAIJ) mumps->ConvertToTriples = MatConvertToTriples_seqaij_seqsbaij;
1384bccb9932SShri Abhyankar     else mumps->ConvertToTriples = MatConvertToTriples_mpiaij_mpisbaij;
13856fdc2a6dSBarry Smith     if (A->spd_set && A->spd) mumps->sym = 1;
13866fdc2a6dSBarry Smith     else                      mumps->sym = 2;
1387450b117fSShri Abhyankar   }
13882877fffaSHong Zhang 
13892877fffaSHong Zhang   mumps->isAIJ        = PETSC_TRUE;
1390bf0cc555SLisandro Dalcin   mumps->Destroy      = B->ops->destroy;
13912877fffaSHong Zhang   B->ops->destroy     = MatDestroy_MUMPS;
13922877fffaSHong Zhang   B->spptr            = (void*)mumps;
1393f697e70eSHong Zhang   ierr = PetscInitializeMUMPS(A,mumps);CHKERRQ(ierr);
1394746480a1SHong Zhang 
13952877fffaSHong Zhang   *F = B;
13962877fffaSHong Zhang   PetscFunctionReturn(0);
13972877fffaSHong Zhang }
13982877fffaSHong Zhang EXTERN_C_END
13992877fffaSHong Zhang 
1400bccb9932SShri Abhyankar 
14012877fffaSHong Zhang EXTERN_C_BEGIN
1402bccb9932SShri Abhyankar /* MatGetFactor for Seq and MPI SBAIJ matrices */
14032877fffaSHong Zhang #undef __FUNCT__
1404bccb9932SShri Abhyankar #define __FUNCT__ "MatGetFactor_sbaij_mumps"
1405bccb9932SShri Abhyankar PetscErrorCode MatGetFactor_sbaij_mumps(Mat A,MatFactorType ftype,Mat *F)
14062877fffaSHong Zhang {
14072877fffaSHong Zhang   Mat            B;
14082877fffaSHong Zhang   PetscErrorCode ierr;
14092877fffaSHong Zhang   Mat_MUMPS      *mumps;
1410ace3abfcSBarry Smith   PetscBool      isSeqSBAIJ;
14112877fffaSHong Zhang 
14122877fffaSHong Zhang   PetscFunctionBegin;
1413e7e72b3dSBarry Smith   if (ftype != MAT_FACTOR_CHOLESKY) SETERRQ(((PetscObject)A)->comm,PETSC_ERR_SUP,"Cannot use PETSc SBAIJ matrices with MUMPS LU, use AIJ matrix");
1414bccb9932SShri Abhyankar   if (A->rmap->bs > 1) SETERRQ(((PetscObject)A)->comm,PETSC_ERR_SUP,"Cannot use PETSc SBAIJ matrices with block size > 1 with MUMPS Cholesky, use AIJ matrix instead");
1415251f4c67SDmitry Karpeev   ierr = PetscObjectTypeCompare((PetscObject)A,MATSEQSBAIJ,&isSeqSBAIJ);CHKERRQ(ierr);
14162877fffaSHong Zhang   /* Create the factorization matrix */
14172877fffaSHong Zhang   ierr = MatCreate(((PetscObject)A)->comm,&B);CHKERRQ(ierr);
14182877fffaSHong Zhang   ierr = MatSetSizes(B,A->rmap->n,A->cmap->n,A->rmap->N,A->cmap->N);CHKERRQ(ierr);
14192877fffaSHong Zhang   ierr = MatSetType(B,((PetscObject)A)->type_name);CHKERRQ(ierr);
142016ebf90aSShri Abhyankar   ierr = PetscNewLog(B,Mat_MUMPS,&mumps);CHKERRQ(ierr);
1421bccb9932SShri Abhyankar   if (isSeqSBAIJ) {
1422bccb9932SShri Abhyankar     ierr = MatSeqSBAIJSetPreallocation(B,1,0,PETSC_NULL);CHKERRQ(ierr);
142316ebf90aSShri Abhyankar     mumps->ConvertToTriples = MatConvertToTriples_seqsbaij_seqsbaij;
1424dcd589f8SShri Abhyankar   } else {
1425bccb9932SShri Abhyankar     ierr = MatMPISBAIJSetPreallocation(B,1,0,PETSC_NULL,0,PETSC_NULL);CHKERRQ(ierr);
1426bccb9932SShri Abhyankar     mumps->ConvertToTriples = MatConvertToTriples_mpisbaij_mpisbaij;
1427bccb9932SShri Abhyankar   }
1428bccb9932SShri Abhyankar 
142967877ebaSShri Abhyankar   B->ops->choleskyfactorsymbolic = MatCholeskyFactorSymbolic_MUMPS;
1430bccb9932SShri Abhyankar   B->ops->view                   = MatView_MUMPS;
1431bccb9932SShri Abhyankar   ierr = PetscObjectComposeFunctionDynamic((PetscObject)B,"MatFactorGetSolverPackage_C","MatFactorGetSolverPackage_mumps",MatFactorGetSolverPackage_mumps);CHKERRQ(ierr);
1432f250808bSBarry Smith   ierr = PetscObjectComposeFunctionDynamic((PetscObject)B,"MatMumpsSetIcntl_C","MatMumpsSetIcntl",MatMumpsSetIcntl);CHKERRQ(ierr);
1433f4762488SHong Zhang   B->factortype                  = MAT_FACTOR_CHOLESKY;
14346fdc2a6dSBarry Smith   if (A->spd_set && A->spd) mumps->sym = 1;
14356fdc2a6dSBarry Smith   else                      mumps->sym = 2;
1436a214ac2aSShri Abhyankar 
1437bccb9932SShri Abhyankar   mumps->isAIJ        = PETSC_FALSE;
1438bf0cc555SLisandro Dalcin   mumps->Destroy      = B->ops->destroy;
1439f3c0ef26SHong Zhang   B->ops->destroy     = MatDestroy_MUMPS;
14402877fffaSHong Zhang   B->spptr            = (void*)mumps;
1441f697e70eSHong Zhang   ierr = PetscInitializeMUMPS(A,mumps);CHKERRQ(ierr);
1442746480a1SHong Zhang 
14432877fffaSHong Zhang   *F = B;
14442877fffaSHong Zhang   PetscFunctionReturn(0);
14452877fffaSHong Zhang }
14462877fffaSHong Zhang EXTERN_C_END
144797969023SHong Zhang 
1448450b117fSShri Abhyankar EXTERN_C_BEGIN
1449450b117fSShri Abhyankar #undef __FUNCT__
1450bccb9932SShri Abhyankar #define __FUNCT__ "MatGetFactor_baij_mumps"
1451bccb9932SShri Abhyankar PetscErrorCode MatGetFactor_baij_mumps(Mat A,MatFactorType ftype,Mat *F)
145267877ebaSShri Abhyankar {
145367877ebaSShri Abhyankar   Mat            B;
145467877ebaSShri Abhyankar   PetscErrorCode ierr;
145567877ebaSShri Abhyankar   Mat_MUMPS      *mumps;
1456ace3abfcSBarry Smith   PetscBool      isSeqBAIJ;
145767877ebaSShri Abhyankar 
145867877ebaSShri Abhyankar   PetscFunctionBegin;
145967877ebaSShri Abhyankar   /* Create the factorization matrix */
1460251f4c67SDmitry Karpeev   ierr = PetscObjectTypeCompare((PetscObject)A,MATSEQBAIJ,&isSeqBAIJ);CHKERRQ(ierr);
146167877ebaSShri Abhyankar   ierr = MatCreate(((PetscObject)A)->comm,&B);CHKERRQ(ierr);
146267877ebaSShri Abhyankar   ierr = MatSetSizes(B,A->rmap->n,A->cmap->n,A->rmap->N,A->cmap->N);CHKERRQ(ierr);
146367877ebaSShri Abhyankar   ierr = MatSetType(B,((PetscObject)A)->type_name);CHKERRQ(ierr);
1464bccb9932SShri Abhyankar   if (isSeqBAIJ) {
146567877ebaSShri Abhyankar     ierr = MatSeqBAIJSetPreallocation(B,A->rmap->bs,0,PETSC_NULL);CHKERRQ(ierr);
1466bccb9932SShri Abhyankar   } else {
146767877ebaSShri Abhyankar     ierr = MatMPIBAIJSetPreallocation(B,A->rmap->bs,0,PETSC_NULL,0,PETSC_NULL);CHKERRQ(ierr);
1468bccb9932SShri Abhyankar   }
1469450b117fSShri Abhyankar 
147067877ebaSShri Abhyankar   ierr = PetscNewLog(B,Mat_MUMPS,&mumps);CHKERRQ(ierr);
1471450b117fSShri Abhyankar   if (ftype == MAT_FACTOR_LU) {
1472450b117fSShri Abhyankar     B->ops->lufactorsymbolic = MatLUFactorSymbolic_BAIJMUMPS;
1473450b117fSShri Abhyankar     B->factortype = MAT_FACTOR_LU;
1474bccb9932SShri Abhyankar     if (isSeqBAIJ) mumps->ConvertToTriples = MatConvertToTriples_seqbaij_seqaij;
1475bccb9932SShri Abhyankar     else mumps->ConvertToTriples = MatConvertToTriples_mpibaij_mpiaij;
1476746480a1SHong Zhang     mumps->sym = 0;
1477746480a1SHong Zhang   } else {
1478746480a1SHong Zhang     SETERRQ(PETSC_COMM_SELF,PETSC_ERR_SUP,"Cannot use PETSc BAIJ matrices with MUMPS Cholesky, use SBAIJ or AIJ matrix instead\n");
1479450b117fSShri Abhyankar   }
1480bccb9932SShri Abhyankar 
1481450b117fSShri Abhyankar   B->ops->view             = MatView_MUMPS;
1482450b117fSShri Abhyankar   ierr = PetscObjectComposeFunctionDynamic((PetscObject)B,"MatFactorGetSolverPackage_C","MatFactorGetSolverPackage_mumps",MatFactorGetSolverPackage_mumps);CHKERRQ(ierr);
14835ccb76cbSHong Zhang   ierr = PetscObjectComposeFunctionDynamic((PetscObject)B,"MatMumpsSetIcntl_C","MatMumpsSetIcntl_MUMPS",MatMumpsSetIcntl_MUMPS);CHKERRQ(ierr);
1484450b117fSShri Abhyankar 
1485450b117fSShri Abhyankar   mumps->isAIJ        = PETSC_TRUE;
1486bf0cc555SLisandro Dalcin   mumps->Destroy      = B->ops->destroy;
1487450b117fSShri Abhyankar   B->ops->destroy     = MatDestroy_MUMPS;
1488450b117fSShri Abhyankar   B->spptr            = (void*)mumps;
1489f697e70eSHong Zhang   ierr = PetscInitializeMUMPS(A,mumps);CHKERRQ(ierr);
1490746480a1SHong Zhang 
1491450b117fSShri Abhyankar   *F = B;
1492450b117fSShri Abhyankar   PetscFunctionReturn(0);
1493450b117fSShri Abhyankar }
1494450b117fSShri Abhyankar EXTERN_C_END
1495a214ac2aSShri Abhyankar 
1496