xref: /petsc/src/mat/impls/aij/mpi/mumps/mumps.c (revision b24902e06ab141841ce6546a773244be2474cd18)
1be1d678aSKris Buschelman #define PETSCMAT_DLL
21c2a3de1SBarry Smith 
3397b6df1SKris Buschelman /*
4c2b5dc30SHong Zhang     Provides an interface to the MUMPS sparse solver
5397b6df1SKris Buschelman */
6397b6df1SKris Buschelman #include "src/mat/impls/aij/seq/aij.h"
7397b6df1SKris Buschelman #include "src/mat/impls/aij/mpi/mpiaij.h"
8397b6df1SKris Buschelman #include "src/mat/impls/sbaij/seq/sbaij.h"
9397b6df1SKris Buschelman #include "src/mat/impls/sbaij/mpi/mpisbaij.h"
10397b6df1SKris Buschelman 
11397b6df1SKris Buschelman EXTERN_C_BEGIN
12397b6df1SKris Buschelman #if defined(PETSC_USE_COMPLEX)
13397b6df1SKris Buschelman #include "zmumps_c.h"
14397b6df1SKris Buschelman #else
15397b6df1SKris Buschelman #include "dmumps_c.h"
16397b6df1SKris Buschelman #endif
17397b6df1SKris Buschelman EXTERN_C_END
18397b6df1SKris Buschelman #define JOB_INIT -1
19397b6df1SKris Buschelman #define JOB_END -2
20397b6df1SKris Buschelman /* macros s.t. indices match MUMPS documentation */
21397b6df1SKris Buschelman #define ICNTL(I) icntl[(I)-1]
22397b6df1SKris Buschelman #define CNTL(I) cntl[(I)-1]
23397b6df1SKris Buschelman #define INFOG(I) infog[(I)-1]
24a7aca84bSHong Zhang #define INFO(I) info[(I)-1]
25397b6df1SKris Buschelman #define RINFOG(I) rinfog[(I)-1]
26adc1d99fSHong Zhang #define RINFO(I) rinfo[(I)-1]
27397b6df1SKris Buschelman 
28397b6df1SKris Buschelman typedef struct {
29397b6df1SKris Buschelman #if defined(PETSC_USE_COMPLEX)
30397b6df1SKris Buschelman   ZMUMPS_STRUC_C id;
31397b6df1SKris Buschelman #else
32397b6df1SKris Buschelman   DMUMPS_STRUC_C id;
33397b6df1SKris Buschelman #endif
34397b6df1SKris Buschelman   MatStructure   matstruc;
35c1490034SHong Zhang   PetscMPIInt    myid,size;
36329ec9b3SHong Zhang   PetscInt       *irn,*jcn,sym,nSolve;
37397b6df1SKris Buschelman   PetscScalar    *val;
38397b6df1SKris Buschelman   MPI_Comm       comm_mumps;
39329ec9b3SHong Zhang   VecScatter     scat_rhs, scat_sol;
40c338a77dSKris Buschelman   PetscTruth     isAIJ,CleanUpMUMPS;
41329ec9b3SHong Zhang   Vec            b_seq,x_seq;
42f0c56d0fSKris Buschelman } Mat_MUMPS;
43f0c56d0fSKris Buschelman 
44dfbe8321SBarry Smith EXTERN PetscErrorCode MatDuplicate_MUMPS(Mat,MatDuplicateOption,Mat*);
45*b24902e0SBarry Smith 
46397b6df1SKris Buschelman /* convert Petsc mpiaij matrix to triples: row[nz], col[nz], val[nz] */
47397b6df1SKris Buschelman /*
48397b6df1SKris Buschelman   input:
4975747be1SHong Zhang     A       - matrix in mpiaij or mpisbaij (bs=1) format
50397b6df1SKris Buschelman     shift   - 0: C style output triple; 1: Fortran style output triple.
51397b6df1SKris Buschelman     valOnly - FALSE: spaces are allocated and values are set for the triple
52397b6df1SKris Buschelman               TRUE:  only the values in v array are updated
53397b6df1SKris Buschelman   output:
54397b6df1SKris Buschelman     nnz     - dim of r, c, and v (number of local nonzero entries of A)
55397b6df1SKris Buschelman     r, c, v - row and col index, matrix values (matrix triples)
56397b6df1SKris Buschelman  */
57*b24902e0SBarry Smith PetscErrorCode MatConvertToTriples(Mat A,int shift,PetscTruth valOnly,int *nnz,int **r, int **c, PetscScalar **v)
58*b24902e0SBarry Smith {
59c1490034SHong Zhang   PetscInt       *ai, *aj, *bi, *bj, rstart,nz, *garray;
60dfbe8321SBarry Smith   PetscErrorCode ierr;
612a4c71feSBarry Smith   PetscInt       i,j,jj,jB,irow,m=A->rmap.n,*ajj,*bjj,countA,countB,colA_start,jcol;
62c1490034SHong Zhang   PetscInt       *row,*col;
63397b6df1SKris Buschelman   PetscScalar    *av, *bv,*val;
64f0c56d0fSKris Buschelman   Mat_MUMPS      *mumps=(Mat_MUMPS*)A->spptr;
65397b6df1SKris Buschelman 
66397b6df1SKris Buschelman   PetscFunctionBegin;
67397b6df1SKris Buschelman   if (mumps->isAIJ){
68397b6df1SKris Buschelman     Mat_MPIAIJ    *mat =  (Mat_MPIAIJ*)A->data;
69397b6df1SKris Buschelman     Mat_SeqAIJ    *aa=(Mat_SeqAIJ*)(mat->A)->data;
70397b6df1SKris Buschelman     Mat_SeqAIJ    *bb=(Mat_SeqAIJ*)(mat->B)->data;
71397b6df1SKris Buschelman     nz = aa->nz + bb->nz;
722a4c71feSBarry Smith     ai=aa->i; aj=aa->j; bi=bb->i; bj=bb->j; rstart= A->rmap.rstart;
73397b6df1SKris Buschelman     garray = mat->garray;
74397b6df1SKris Buschelman     av=aa->a; bv=bb->a;
75397b6df1SKris Buschelman 
76397b6df1SKris Buschelman   } else {
77397b6df1SKris Buschelman     Mat_MPISBAIJ  *mat =  (Mat_MPISBAIJ*)A->data;
78397b6df1SKris Buschelman     Mat_SeqSBAIJ  *aa=(Mat_SeqSBAIJ*)(mat->A)->data;
79397b6df1SKris Buschelman     Mat_SeqBAIJ    *bb=(Mat_SeqBAIJ*)(mat->B)->data;
800c0e133fSBarry Smith     if (A->rmap.bs > 1) SETERRQ1(PETSC_ERR_SUP," bs=%d is not supported yet\n", A->rmap.bs);
816c6c5352SBarry Smith     nz = aa->nz + bb->nz;
822a4c71feSBarry Smith     ai=aa->i; aj=aa->j; bi=bb->i; bj=bb->j; rstart= A->rmap.rstart;
83397b6df1SKris Buschelman     garray = mat->garray;
84397b6df1SKris Buschelman     av=aa->a; bv=bb->a;
85397b6df1SKris Buschelman   }
86397b6df1SKris Buschelman 
87397b6df1SKris Buschelman   if (!valOnly){
887c307921SBarry Smith     ierr = PetscMalloc(nz*sizeof(PetscInt) ,&row);CHKERRQ(ierr);
897c307921SBarry Smith     ierr = PetscMalloc(nz*sizeof(PetscInt),&col);CHKERRQ(ierr);
90397b6df1SKris Buschelman     ierr = PetscMalloc(nz*sizeof(PetscScalar),&val);CHKERRQ(ierr);
91397b6df1SKris Buschelman     *r = row; *c = col; *v = val;
92397b6df1SKris Buschelman   } else {
93397b6df1SKris Buschelman     row = *r; col = *c; val = *v;
94397b6df1SKris Buschelman   }
95397b6df1SKris Buschelman   *nnz = nz;
96397b6df1SKris Buschelman 
97028e57e8SHong Zhang   jj = 0; irow = rstart;
98397b6df1SKris Buschelman   for ( i=0; i<m; i++ ) {
99397b6df1SKris Buschelman     ajj = aj + ai[i];                 /* ptr to the beginning of this row */
100397b6df1SKris Buschelman     countA = ai[i+1] - ai[i];
101397b6df1SKris Buschelman     countB = bi[i+1] - bi[i];
102397b6df1SKris Buschelman     bjj = bj + bi[i];
103397b6df1SKris Buschelman 
104397b6df1SKris Buschelman     /* get jB, the starting local col index for the 2nd B-part */
105397b6df1SKris Buschelman     colA_start = rstart + ajj[0]; /* the smallest col index for A */
10675747be1SHong Zhang     j=-1;
10775747be1SHong Zhang     do {
10875747be1SHong Zhang       j++;
10975747be1SHong Zhang       if (j == countB) break;
110397b6df1SKris Buschelman       jcol = garray[bjj[j]];
11175747be1SHong Zhang     } while (jcol < colA_start);
11275747be1SHong Zhang     jB = j;
113397b6df1SKris Buschelman 
114397b6df1SKris Buschelman     /* B-part, smaller col index */
115397b6df1SKris Buschelman     colA_start = rstart + ajj[0]; /* the smallest col index for A */
116397b6df1SKris Buschelman     for (j=0; j<jB; j++){
117397b6df1SKris Buschelman       jcol = garray[bjj[j]];
118397b6df1SKris Buschelman       if (!valOnly){
119397b6df1SKris Buschelman         row[jj] = irow + shift; col[jj] = jcol + shift;
12075747be1SHong Zhang 
121397b6df1SKris Buschelman       }
122397b6df1SKris Buschelman       val[jj++] = *bv++;
123397b6df1SKris Buschelman     }
124397b6df1SKris Buschelman     /* A-part */
125397b6df1SKris Buschelman     for (j=0; j<countA; j++){
126397b6df1SKris Buschelman       if (!valOnly){
127397b6df1SKris Buschelman         row[jj] = irow + shift; col[jj] = rstart + ajj[j] + shift;
128397b6df1SKris Buschelman       }
129397b6df1SKris Buschelman       val[jj++] = *av++;
130397b6df1SKris Buschelman     }
131397b6df1SKris Buschelman     /* B-part, larger col index */
132397b6df1SKris Buschelman     for (j=jB; j<countB; j++){
133397b6df1SKris Buschelman       if (!valOnly){
134397b6df1SKris Buschelman         row[jj] = irow + shift; col[jj] = garray[bjj[j]] + shift;
135397b6df1SKris Buschelman       }
136397b6df1SKris Buschelman       val[jj++] = *bv++;
137397b6df1SKris Buschelman     }
138397b6df1SKris Buschelman     irow++;
139397b6df1SKris Buschelman   }
140397b6df1SKris Buschelman 
141397b6df1SKris Buschelman   PetscFunctionReturn(0);
142397b6df1SKris Buschelman }
143397b6df1SKris Buschelman 
144397b6df1SKris Buschelman #undef __FUNCT__
1453924e44cSKris Buschelman #define __FUNCT__ "MatDestroy_MUMPS"
146dfbe8321SBarry Smith PetscErrorCode MatDestroy_MUMPS(Mat A)
147dfbe8321SBarry Smith {
148f0c56d0fSKris Buschelman   Mat_MUMPS      *lu=(Mat_MUMPS*)A->spptr;
149dfbe8321SBarry Smith   PetscErrorCode ierr;
150c1490034SHong Zhang   PetscMPIInt    size=lu->size;
1516849ba73SBarry Smith   PetscErrorCode (*specialdestroy)(Mat);
152*b24902e0SBarry Smith 
153397b6df1SKris Buschelman   PetscFunctionBegin;
154397b6df1SKris Buschelman   if (lu->CleanUpMUMPS) {
155397b6df1SKris Buschelman     /* Terminate instance, deallocate memories */
156329ec9b3SHong Zhang     if (size > 1){
157329ec9b3SHong Zhang       ierr = PetscFree(lu->id.sol_loc);CHKERRQ(ierr);
158329ec9b3SHong Zhang       ierr = VecScatterDestroy(lu->scat_rhs);CHKERRQ(ierr);
159329ec9b3SHong Zhang       ierr = VecDestroy(lu->b_seq);CHKERRQ(ierr);
1602750af12SHong Zhang       if (lu->nSolve && lu->scat_sol){ierr = VecScatterDestroy(lu->scat_sol);CHKERRQ(ierr);}
1612750af12SHong Zhang       if (lu->nSolve && lu->x_seq){ierr = VecDestroy(lu->x_seq);CHKERRQ(ierr);}
162329ec9b3SHong Zhang       ierr = PetscFree(lu->val);CHKERRQ(ierr);
163329ec9b3SHong Zhang     }
164397b6df1SKris Buschelman     lu->id.job=JOB_END;
165397b6df1SKris Buschelman #if defined(PETSC_USE_COMPLEX)
166397b6df1SKris Buschelman     zmumps_c(&lu->id);
167397b6df1SKris Buschelman #else
168397b6df1SKris Buschelman     dmumps_c(&lu->id);
169397b6df1SKris Buschelman #endif
170c338a77dSKris Buschelman     ierr = PetscFree(lu->irn);CHKERRQ(ierr);
171c338a77dSKris Buschelman     ierr = PetscFree(lu->jcn);CHKERRQ(ierr);
172397b6df1SKris Buschelman     ierr = MPI_Comm_free(&(lu->comm_mumps));CHKERRQ(ierr);
173397b6df1SKris Buschelman   }
174c338a77dSKris Buschelman   ierr = (*A->ops->destroy)(A);CHKERRQ(ierr);
175397b6df1SKris Buschelman   PetscFunctionReturn(0);
176397b6df1SKris Buschelman }
177397b6df1SKris Buschelman 
178397b6df1SKris Buschelman #undef __FUNCT__
179f6c57405SHong Zhang #define __FUNCT__ "MatSolve_MUMPS"
180*b24902e0SBarry Smith PetscErrorCode MatSolve_MUMPS(Mat A,Vec b,Vec x)
181*b24902e0SBarry Smith {
182f0c56d0fSKris Buschelman   Mat_MUMPS      *lu=(Mat_MUMPS*)A->spptr;
183d54de34fSKris Buschelman   PetscScalar    *array;
184397b6df1SKris Buschelman   Vec            x_seq;
185329ec9b3SHong Zhang   IS             is_iden,is_petsc;
186dfbe8321SBarry Smith   PetscErrorCode ierr;
187329ec9b3SHong Zhang   PetscInt       i;
188397b6df1SKris Buschelman 
189397b6df1SKris Buschelman   PetscFunctionBegin;
190329ec9b3SHong Zhang   lu->id.nrhs = 1;
191329ec9b3SHong Zhang   x_seq = lu->b_seq;
192397b6df1SKris Buschelman   if (lu->size > 1){
193329ec9b3SHong Zhang     /* MUMPS only supports centralized rhs. Scatter b into a seqential rhs vector */
194f6cfb2d1SLisandro Dalcin     ierr = VecScatterBegin(lu->scat_rhs,b,x_seq,INSERT_VALUES,SCATTER_FORWARD);CHKERRQ(ierr);
195f6cfb2d1SLisandro Dalcin     ierr = VecScatterEnd(lu->scat_rhs,b,x_seq,INSERT_VALUES,SCATTER_FORWARD);CHKERRQ(ierr);
196397b6df1SKris Buschelman     if (!lu->myid) {ierr = VecGetArray(x_seq,&array);CHKERRQ(ierr);}
197397b6df1SKris Buschelman   } else {  /* size == 1 */
198397b6df1SKris Buschelman     ierr = VecCopy(b,x);CHKERRQ(ierr);
199397b6df1SKris Buschelman     ierr = VecGetArray(x,&array);CHKERRQ(ierr);
200397b6df1SKris Buschelman   }
201397b6df1SKris Buschelman   if (!lu->myid) { /* define rhs on the host */
202397b6df1SKris Buschelman #if defined(PETSC_USE_COMPLEX)
203397b6df1SKris Buschelman     lu->id.rhs = (mumps_double_complex*)array;
204397b6df1SKris Buschelman #else
205397b6df1SKris Buschelman     lu->id.rhs = array;
206397b6df1SKris Buschelman #endif
207397b6df1SKris Buschelman   }
208329ec9b3SHong Zhang   if (lu->size == 1){
209329ec9b3SHong Zhang     ierr = VecRestoreArray(x,&array);CHKERRQ(ierr);
210329ec9b3SHong Zhang   } else if (!lu->myid){
211329ec9b3SHong Zhang     ierr = VecRestoreArray(x_seq,&array);CHKERRQ(ierr);
212329ec9b3SHong Zhang   }
213329ec9b3SHong Zhang 
214329ec9b3SHong Zhang   if (lu->size > 1){
215329ec9b3SHong Zhang     /* distributed solution */
216329ec9b3SHong Zhang     lu->id.ICNTL(21) = 1;
217329ec9b3SHong Zhang     if (!lu->nSolve){
218329ec9b3SHong Zhang       /* Create x_seq=sol_loc for repeated use */
219329ec9b3SHong Zhang       PetscInt    lsol_loc;
220329ec9b3SHong Zhang       PetscScalar *sol_loc;
221329ec9b3SHong Zhang       lsol_loc = lu->id.INFO(23); /* length of sol_loc */
222329ec9b3SHong Zhang       ierr = PetscMalloc((1+lsol_loc)*(sizeof(PetscScalar)+sizeof(PetscInt)),&sol_loc);CHKERRQ(ierr);
223329ec9b3SHong Zhang       lu->id.isol_loc = (PetscInt *)(sol_loc + lsol_loc);
224329ec9b3SHong Zhang       lu->id.lsol_loc = lsol_loc;
2256f8312c5SHong Zhang #if defined(PETSC_USE_COMPLEX)
2266f8312c5SHong Zhang       lu->id.sol_loc  = (ZMUMPS_DOUBLE *)sol_loc;
2276f8312c5SHong Zhang #else
2286f8312c5SHong Zhang       lu->id.sol_loc  = (DMUMPS_DOUBLE *)sol_loc;
2296f8312c5SHong Zhang #endif
230329ec9b3SHong Zhang       ierr = VecCreateSeqWithArray(PETSC_COMM_SELF,lsol_loc,sol_loc,&lu->x_seq);CHKERRQ(ierr);
231329ec9b3SHong Zhang     }
232329ec9b3SHong Zhang   }
233397b6df1SKris Buschelman 
234397b6df1SKris Buschelman   /* solve phase */
235329ec9b3SHong Zhang   /*-------------*/
236397b6df1SKris Buschelman   lu->id.job = 3;
237397b6df1SKris Buschelman #if defined(PETSC_USE_COMPLEX)
238397b6df1SKris Buschelman   zmumps_c(&lu->id);
239397b6df1SKris Buschelman #else
240397b6df1SKris Buschelman   dmumps_c(&lu->id);
241397b6df1SKris Buschelman #endif
242397b6df1SKris Buschelman   if (lu->id.INFOG(1) < 0) {
24379a5c55eSBarry Smith     SETERRQ1(PETSC_ERR_LIB,"Error reported by MUMPS in solve phase: INFOG(1)=%d\n",lu->id.INFOG(1));
244397b6df1SKris Buschelman   }
245397b6df1SKris Buschelman 
246329ec9b3SHong Zhang   if (lu->size > 1) { /* convert mumps distributed solution to petsc mpi x */
247329ec9b3SHong Zhang     if (!lu->nSolve){ /* create scatter scat_sol */
248329ec9b3SHong Zhang       ierr = ISCreateStride(PETSC_COMM_SELF,lu->id.lsol_loc,0,1,&is_iden);CHKERRQ(ierr); /* from */
249329ec9b3SHong Zhang       for (i=0; i<lu->id.lsol_loc; i++){
250329ec9b3SHong Zhang         lu->id.isol_loc[i] -= 1; /* change Fortran style to C style */
251397b6df1SKris Buschelman       }
252329ec9b3SHong Zhang       ierr = ISCreateGeneral(PETSC_COMM_SELF,lu->id.lsol_loc,lu->id.isol_loc,&is_petsc);CHKERRQ(ierr);  /* to */
253329ec9b3SHong Zhang       ierr = VecScatterCreate(lu->x_seq,is_iden,x,is_petsc,&lu->scat_sol);CHKERRQ(ierr);
254329ec9b3SHong Zhang       ierr = ISDestroy(is_iden);CHKERRQ(ierr);
255329ec9b3SHong Zhang       ierr = ISDestroy(is_petsc);CHKERRQ(ierr);
256397b6df1SKris Buschelman     }
257ca9f406cSSatish Balay     ierr = VecScatterBegin(lu->scat_sol,lu->x_seq,x,INSERT_VALUES,SCATTER_FORWARD);CHKERRQ(ierr);
258ca9f406cSSatish Balay     ierr = VecScatterEnd(lu->scat_sol,lu->x_seq,x,INSERT_VALUES,SCATTER_FORWARD);CHKERRQ(ierr);
259329ec9b3SHong Zhang   }
260329ec9b3SHong Zhang   lu->nSolve++;
261397b6df1SKris Buschelman   PetscFunctionReturn(0);
262397b6df1SKris Buschelman }
263397b6df1SKris Buschelman 
264a58c3f20SHong Zhang /*
265a58c3f20SHong Zhang   input:
266a58c3f20SHong Zhang    F:        numeric factor
267a58c3f20SHong Zhang   output:
268a58c3f20SHong Zhang    nneg:     total number of negative pivots
269a58c3f20SHong Zhang    nzero:    0
270a58c3f20SHong Zhang    npos:     (global dimension of F) - nneg
271a58c3f20SHong Zhang */
272a58c3f20SHong Zhang 
273a58c3f20SHong Zhang #undef __FUNCT__
274a58c3f20SHong Zhang #define __FUNCT__ "MatGetInertia_SBAIJMUMPS"
275dfbe8321SBarry Smith PetscErrorCode MatGetInertia_SBAIJMUMPS(Mat F,int *nneg,int *nzero,int *npos)
276a58c3f20SHong Zhang {
277a58c3f20SHong Zhang   Mat_MUMPS      *lu =(Mat_MUMPS*)F->spptr;
278dfbe8321SBarry Smith   PetscErrorCode ierr;
279c1490034SHong Zhang   PetscMPIInt    size;
280a58c3f20SHong Zhang 
281a58c3f20SHong Zhang   PetscFunctionBegin;
2827adad957SLisandro Dalcin   ierr = MPI_Comm_size(((PetscObject)F)->comm,&size);CHKERRQ(ierr);
283bcb30aebSHong 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 */
284bcb30aebSHong Zhang   if (size > 1 && lu->id.ICNTL(13) != 1){
28579a5c55eSBarry Smith     SETERRQ1(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));
286bcb30aebSHong Zhang   }
287a58c3f20SHong Zhang   if (nneg){
288a58c3f20SHong Zhang     if (!lu->myid){
289a58c3f20SHong Zhang       *nneg = lu->id.INFOG(12);
290a58c3f20SHong Zhang     }
291bcb30aebSHong Zhang     ierr = MPI_Bcast(nneg,1,MPI_INT,0,lu->comm_mumps);CHKERRQ(ierr);
292a58c3f20SHong Zhang   }
293a58c3f20SHong Zhang   if (nzero) *nzero = 0;
2942a4c71feSBarry Smith   if (npos)  *npos  = F->rmap.N - (*nneg);
295a58c3f20SHong Zhang   PetscFunctionReturn(0);
296a58c3f20SHong Zhang }
297a58c3f20SHong Zhang 
298397b6df1SKris Buschelman #undef __FUNCT__
299f6c57405SHong Zhang #define __FUNCT__ "MatFactorNumeric_MUMPS"
300f6c57405SHong Zhang PetscErrorCode MatFactorNumeric_MUMPS(Mat A,MatFactorInfo *info,Mat *F)
301af281ebdSHong Zhang {
302f0c56d0fSKris Buschelman   Mat_MUMPS      *lu =(Mat_MUMPS*)(*F)->spptr;
303f0c56d0fSKris Buschelman   Mat_MUMPS      *lua=(Mat_MUMPS*)(A)->spptr;
3046849ba73SBarry Smith   PetscErrorCode ierr;
3052a4c71feSBarry Smith   PetscInt       rnz,nnz,nz=0,i,M=A->rmap.N,*ai,*aj,icntl;
306397b6df1SKris Buschelman   PetscTruth     valOnly,flg;
307e09efc27SHong Zhang   Mat            F_diag;
308c349612cSHong Zhang   IS             is_iden;
309c349612cSHong Zhang   Vec            b;
310397b6df1SKris Buschelman 
311397b6df1SKris Buschelman   PetscFunctionBegin;
312397b6df1SKris Buschelman   if (lu->matstruc == DIFFERENT_NONZERO_PATTERN){
313f6c57405SHong Zhang     (*F)->ops->solve    = MatSolve_MUMPS;
314397b6df1SKris Buschelman 
315397b6df1SKris Buschelman     /* Initialize a MUMPS instance */
3167adad957SLisandro Dalcin     ierr = MPI_Comm_rank(((PetscObject)A)->comm, &lu->myid);
3177adad957SLisandro Dalcin     ierr = MPI_Comm_size(((PetscObject)A)->comm,&lu->size);CHKERRQ(ierr);
31875747be1SHong Zhang     lua->myid = lu->myid; lua->size = lu->size;
319397b6df1SKris Buschelman     lu->id.job = JOB_INIT;
3207adad957SLisandro Dalcin     ierr = MPI_Comm_dup(((PetscObject)A)->comm,&(lu->comm_mumps));CHKERRQ(ierr);
3216a1dac61SBarry Smith     lu->id.comm_fortran = MPI_Comm_c2f(lu->comm_mumps);
322397b6df1SKris Buschelman 
323397b6df1SKris Buschelman     /* Set mumps options */
3247adad957SLisandro Dalcin     ierr = PetscOptionsBegin(((PetscObject)A)->comm,((PetscObject)A)->prefix,"MUMPS Options","Mat");CHKERRQ(ierr);
325397b6df1SKris Buschelman     lu->id.par=1;  /* host participates factorizaton and solve */
326397b6df1SKris Buschelman     lu->id.sym=lu->sym;
327397b6df1SKris Buschelman     if (lu->sym == 2){
328397b6df1SKris Buschelman       ierr = PetscOptionsInt("-mat_mumps_sym","SYM: (1,2)","None",lu->id.sym,&icntl,&flg);CHKERRQ(ierr);
329397b6df1SKris Buschelman       if (flg && icntl == 1) lu->id.sym=icntl;  /* matrix is spd */
330397b6df1SKris Buschelman     }
331397b6df1SKris Buschelman #if defined(PETSC_USE_COMPLEX)
332397b6df1SKris Buschelman     zmumps_c(&lu->id);
333397b6df1SKris Buschelman #else
334397b6df1SKris Buschelman     dmumps_c(&lu->id);
335397b6df1SKris Buschelman #endif
336397b6df1SKris Buschelman 
337397b6df1SKris Buschelman     if (lu->size == 1){
338397b6df1SKris Buschelman       lu->id.ICNTL(18) = 0;   /* centralized assembled matrix input */
339397b6df1SKris Buschelman     } else {
340397b6df1SKris Buschelman       lu->id.ICNTL(18) = 3;   /* distributed assembled matrix input */
341397b6df1SKris Buschelman     }
342397b6df1SKris Buschelman 
343397b6df1SKris Buschelman     icntl=-1;
34421f4b680SHong Zhang     lu->id.ICNTL(4) = 0;  /* level of printing; overwrite mumps default ICNTL(4)=2 */
345397b6df1SKris Buschelman     ierr = PetscOptionsInt("-mat_mumps_icntl_4","ICNTL(4): level of printing (0 to 4)","None",lu->id.ICNTL(4),&icntl,&flg);CHKERRQ(ierr);
34619facb7aSBarry Smith     if ((flg && icntl > 0) || PetscLogPrintInfo) {
347397b6df1SKris Buschelman       lu->id.ICNTL(4)=icntl; /* and use mumps default icntl(i), i=1,2,3 */
348397b6df1SKris Buschelman     } else { /* no output */
349397b6df1SKris Buschelman       lu->id.ICNTL(1) = 0;  /* error message, default= 6 */
350397b6df1SKris Buschelman       lu->id.ICNTL(2) = -1; /* output stream for diagnostic printing, statistics, and warning. default=0 */
351397b6df1SKris Buschelman       lu->id.ICNTL(3) = -1; /* output stream for global information, default=6 */
352397b6df1SKris Buschelman     }
353397b6df1SKris Buschelman     ierr = PetscOptionsInt("-mat_mumps_icntl_6","ICNTL(6): matrix prescaling (0 to 7)","None",lu->id.ICNTL(6),&lu->id.ICNTL(6),PETSC_NULL);CHKERRQ(ierr);
354397b6df1SKris Buschelman     icntl=-1;
355397b6df1SKris Buschelman     ierr = PetscOptionsInt("-mat_mumps_icntl_7","ICNTL(7): matrix ordering (0 to 7)","None",lu->id.ICNTL(7),&icntl,&flg);CHKERRQ(ierr);
356397b6df1SKris Buschelman     if (flg) {
357397b6df1SKris Buschelman       if (icntl== 1){
358397b6df1SKris Buschelman         SETERRQ(PETSC_ERR_SUP,"pivot order be set by the user in PERM_IN -- not supported by the PETSc/MUMPS interface\n");
359397b6df1SKris Buschelman       } else {
360397b6df1SKris Buschelman         lu->id.ICNTL(7) = icntl;
361397b6df1SKris Buschelman       }
362397b6df1SKris Buschelman     }
363397b6df1SKris Buschelman     ierr = PetscOptionsInt("-mat_mumps_icntl_9","ICNTL(9): A or A^T x=b to be solved. 1: A; otherwise: A^T","None",lu->id.ICNTL(9),&lu->id.ICNTL(9),PETSC_NULL);CHKERRQ(ierr);
364397b6df1SKris Buschelman     ierr = PetscOptionsInt("-mat_mumps_icntl_10","ICNTL(10): max num of refinements","None",lu->id.ICNTL(10),&lu->id.ICNTL(10),PETSC_NULL);CHKERRQ(ierr);
36594b7f48cSBarry Smith     ierr = PetscOptionsInt("-mat_mumps_icntl_11","ICNTL(11): error analysis, a positive value returns statistics (by -ksp_view)","None",lu->id.ICNTL(11),&lu->id.ICNTL(11),PETSC_NULL);CHKERRQ(ierr);
366397b6df1SKris Buschelman     ierr = PetscOptionsInt("-mat_mumps_icntl_12","ICNTL(12): efficiency control","None",lu->id.ICNTL(12),&lu->id.ICNTL(12),PETSC_NULL);CHKERRQ(ierr);
367397b6df1SKris Buschelman     ierr = PetscOptionsInt("-mat_mumps_icntl_13","ICNTL(13): efficiency control","None",lu->id.ICNTL(13),&lu->id.ICNTL(13),PETSC_NULL);CHKERRQ(ierr);
368adc1d99fSHong Zhang     ierr = PetscOptionsInt("-mat_mumps_icntl_14","ICNTL(14): percentage of estimated workspace increase","None",lu->id.ICNTL(14),&lu->id.ICNTL(14),PETSC_NULL);CHKERRQ(ierr);
369397b6df1SKris Buschelman     ierr = PetscOptionsInt("-mat_mumps_icntl_15","ICNTL(15): efficiency control","None",lu->id.ICNTL(15),&lu->id.ICNTL(15),PETSC_NULL);CHKERRQ(ierr);
370397b6df1SKris Buschelman 
371397b6df1SKris Buschelman     ierr = PetscOptionsReal("-mat_mumps_cntl_1","CNTL(1): relative pivoting threshold","None",lu->id.CNTL(1),&lu->id.CNTL(1),PETSC_NULL);CHKERRQ(ierr);
372397b6df1SKris Buschelman     ierr = PetscOptionsReal("-mat_mumps_cntl_2","CNTL(2): stopping criterion of refinement","None",lu->id.CNTL(2),&lu->id.CNTL(2),PETSC_NULL);CHKERRQ(ierr);
373397b6df1SKris Buschelman     ierr = PetscOptionsReal("-mat_mumps_cntl_3","CNTL(3): absolute pivoting threshold","None",lu->id.CNTL(3),&lu->id.CNTL(3),PETSC_NULL);CHKERRQ(ierr);
37425f9c88cSHong Zhang     ierr = PetscOptionsReal("-mat_mumps_cntl_4","CNTL(4): value for static pivoting","None",lu->id.CNTL(4),&lu->id.CNTL(4),PETSC_NULL);CHKERRQ(ierr);
375397b6df1SKris Buschelman     PetscOptionsEnd();
376397b6df1SKris Buschelman   }
377397b6df1SKris Buschelman 
378397b6df1SKris Buschelman   /* define matrix A */
379397b6df1SKris Buschelman   switch (lu->id.ICNTL(18)){
380397b6df1SKris Buschelman   case 0:  /* centralized assembled matrix input (size=1) */
381397b6df1SKris Buschelman     if (!lu->myid) {
382c36ead0aSKris Buschelman       if (lua->isAIJ){
383397b6df1SKris Buschelman         Mat_SeqAIJ   *aa = (Mat_SeqAIJ*)A->data;
384397b6df1SKris Buschelman         nz               = aa->nz;
385397b6df1SKris Buschelman         ai = aa->i; aj = aa->j; lu->val = aa->a;
386397b6df1SKris Buschelman       } else {
387397b6df1SKris Buschelman         Mat_SeqSBAIJ *aa = (Mat_SeqSBAIJ*)A->data;
3886c6c5352SBarry Smith         nz                  =  aa->nz;
389397b6df1SKris Buschelman         ai = aa->i; aj = aa->j; lu->val = aa->a;
390397b6df1SKris Buschelman       }
391397b6df1SKris Buschelman       if (lu->matstruc == DIFFERENT_NONZERO_PATTERN){ /* first numeric factorization, get irn and jcn */
3927c307921SBarry Smith         ierr = PetscMalloc(nz*sizeof(PetscInt),&lu->irn);CHKERRQ(ierr);
3937c307921SBarry Smith         ierr = PetscMalloc(nz*sizeof(PetscInt),&lu->jcn);CHKERRQ(ierr);
394397b6df1SKris Buschelman         nz = 0;
395397b6df1SKris Buschelman         for (i=0; i<M; i++){
396397b6df1SKris Buschelman           rnz = ai[i+1] - ai[i];
397397b6df1SKris Buschelman           while (rnz--) {  /* Fortran row/col index! */
398397b6df1SKris Buschelman             lu->irn[nz] = i+1; lu->jcn[nz] = (*aj)+1; aj++; nz++;
399397b6df1SKris Buschelman           }
400397b6df1SKris Buschelman         }
401397b6df1SKris Buschelman       }
402397b6df1SKris Buschelman     }
403397b6df1SKris Buschelman     break;
404397b6df1SKris Buschelman   case 3:  /* distributed assembled matrix input (size>1) */
405397b6df1SKris Buschelman     if (lu->matstruc == DIFFERENT_NONZERO_PATTERN){
406397b6df1SKris Buschelman       valOnly = PETSC_FALSE;
407397b6df1SKris Buschelman     } else {
408397b6df1SKris Buschelman       valOnly = PETSC_TRUE; /* only update mat values, not row and col index */
409397b6df1SKris Buschelman     }
410397b6df1SKris Buschelman     ierr = MatConvertToTriples(A,1,valOnly, &nnz, &lu->irn, &lu->jcn, &lu->val);CHKERRQ(ierr);
411397b6df1SKris Buschelman     break;
412397b6df1SKris Buschelman   default: SETERRQ(PETSC_ERR_SUP,"Matrix input format is not supported by MUMPS.");
413397b6df1SKris Buschelman   }
414397b6df1SKris Buschelman 
415397b6df1SKris Buschelman   /* analysis phase */
416329ec9b3SHong Zhang   /*----------------*/
417397b6df1SKris Buschelman   if (lu->matstruc == DIFFERENT_NONZERO_PATTERN){
418329ec9b3SHong Zhang     lu->id.job = 1;
419329ec9b3SHong Zhang 
420397b6df1SKris Buschelman     lu->id.n = M;
421397b6df1SKris Buschelman     switch (lu->id.ICNTL(18)){
422397b6df1SKris Buschelman     case 0:  /* centralized assembled matrix input */
423397b6df1SKris Buschelman       if (!lu->myid) {
424397b6df1SKris Buschelman         lu->id.nz =nz; lu->id.irn=lu->irn; lu->id.jcn=lu->jcn;
425397b6df1SKris Buschelman         if (lu->id.ICNTL(6)>1){
426397b6df1SKris Buschelman #if defined(PETSC_USE_COMPLEX)
427397b6df1SKris Buschelman           lu->id.a = (mumps_double_complex*)lu->val;
428397b6df1SKris Buschelman #else
429397b6df1SKris Buschelman           lu->id.a = lu->val;
430397b6df1SKris Buschelman #endif
431397b6df1SKris Buschelman         }
432397b6df1SKris Buschelman       }
433397b6df1SKris Buschelman       break;
434397b6df1SKris Buschelman     case 3:  /* distributed assembled matrix input (size>1) */
435397b6df1SKris Buschelman       lu->id.nz_loc = nnz;
436397b6df1SKris Buschelman       lu->id.irn_loc=lu->irn; lu->id.jcn_loc=lu->jcn;
437397b6df1SKris Buschelman       if (lu->id.ICNTL(6)>1) {
438397b6df1SKris Buschelman #if defined(PETSC_USE_COMPLEX)
439397b6df1SKris Buschelman         lu->id.a_loc = (mumps_double_complex*)lu->val;
440397b6df1SKris Buschelman #else
441397b6df1SKris Buschelman         lu->id.a_loc = lu->val;
442397b6df1SKris Buschelman #endif
443397b6df1SKris Buschelman       }
444329ec9b3SHong Zhang       /* MUMPS only supports centralized rhs. Create scatter scat_rhs for repeated use in MatSolve() */
445329ec9b3SHong Zhang       if (!lu->myid){
446329ec9b3SHong Zhang         ierr = VecCreateSeq(PETSC_COMM_SELF,A->cmap.N,&lu->b_seq);CHKERRQ(ierr);
447329ec9b3SHong Zhang         ierr = ISCreateStride(PETSC_COMM_SELF,A->cmap.N,0,1,&is_iden);CHKERRQ(ierr);
448329ec9b3SHong Zhang       } else {
449329ec9b3SHong Zhang         ierr = VecCreateSeq(PETSC_COMM_SELF,0,&lu->b_seq);CHKERRQ(ierr);
450329ec9b3SHong Zhang         ierr = ISCreateStride(PETSC_COMM_SELF,0,0,1,&is_iden);CHKERRQ(ierr);
451329ec9b3SHong Zhang       }
4527adad957SLisandro Dalcin       ierr = VecCreate(((PetscObject)A)->comm,&b);CHKERRQ(ierr);
453329ec9b3SHong Zhang       ierr = VecSetSizes(b,A->rmap.n,PETSC_DECIDE);CHKERRQ(ierr);
454329ec9b3SHong Zhang       ierr = VecSetFromOptions(b);CHKERRQ(ierr);
455329ec9b3SHong Zhang 
456329ec9b3SHong Zhang       ierr = VecScatterCreate(b,is_iden,lu->b_seq,is_iden,&lu->scat_rhs);CHKERRQ(ierr);
457329ec9b3SHong Zhang       ierr = ISDestroy(is_iden);CHKERRQ(ierr);
458329ec9b3SHong Zhang       ierr = VecDestroy(b);CHKERRQ(ierr);
459397b6df1SKris Buschelman       break;
460397b6df1SKris Buschelman     }
461397b6df1SKris Buschelman #if defined(PETSC_USE_COMPLEX)
462397b6df1SKris Buschelman     zmumps_c(&lu->id);
463397b6df1SKris Buschelman #else
464397b6df1SKris Buschelman     dmumps_c(&lu->id);
465397b6df1SKris Buschelman #endif
466397b6df1SKris Buschelman     if (lu->id.INFOG(1) < 0) {
46779a5c55eSBarry Smith       SETERRQ1(PETSC_ERR_LIB,"Error reported by MUMPS in analysis phase: INFOG(1)=%d\n",lu->id.INFOG(1));
468397b6df1SKris Buschelman     }
469397b6df1SKris Buschelman   }
470397b6df1SKris Buschelman 
471397b6df1SKris Buschelman   /* numerical factorization phase */
472329ec9b3SHong Zhang   /*-------------------------------*/
473329ec9b3SHong Zhang   lu->id.job = 2;
474958c9bccSBarry Smith   if(!lu->id.ICNTL(18)) {
475a7aca84bSHong Zhang     if (!lu->myid) {
476397b6df1SKris Buschelman #if defined(PETSC_USE_COMPLEX)
477397b6df1SKris Buschelman       lu->id.a = (mumps_double_complex*)lu->val;
478397b6df1SKris Buschelman #else
479397b6df1SKris Buschelman       lu->id.a = lu->val;
480397b6df1SKris Buschelman #endif
481397b6df1SKris Buschelman     }
482397b6df1SKris Buschelman   } else {
483397b6df1SKris Buschelman #if defined(PETSC_USE_COMPLEX)
484397b6df1SKris Buschelman     lu->id.a_loc = (mumps_double_complex*)lu->val;
485397b6df1SKris Buschelman #else
486397b6df1SKris Buschelman     lu->id.a_loc = lu->val;
487397b6df1SKris Buschelman #endif
488397b6df1SKris Buschelman   }
489397b6df1SKris Buschelman #if defined(PETSC_USE_COMPLEX)
490397b6df1SKris Buschelman   zmumps_c(&lu->id);
491397b6df1SKris Buschelman #else
492397b6df1SKris Buschelman   dmumps_c(&lu->id);
493397b6df1SKris Buschelman #endif
494397b6df1SKris Buschelman   if (lu->id.INFOG(1) < 0) {
49519facb7aSBarry Smith     if (lu->id.INFO(1) == -13) {
49619facb7aSBarry Smith       SETERRQ1(PETSC_ERR_LIB,"Error reported by MUMPS in numerical factorization phase: Cannot allocate required memory %d megabytes\n",lu->id.INFO(2));
49719facb7aSBarry Smith     } else {
49879a5c55eSBarry Smith       SETERRQ2(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));
499397b6df1SKris Buschelman     }
50019facb7aSBarry Smith   }
501397b6df1SKris Buschelman 
50219facb7aSBarry Smith   if (!lu->myid && lu->id.ICNTL(16) > 0){
50379a5c55eSBarry Smith     SETERRQ1(PETSC_ERR_LIB,"  lu->id.ICNTL(16):=%d\n",lu->id.INFOG(16));
504397b6df1SKris Buschelman   }
505397b6df1SKris Buschelman 
5068ada1bb4SHong Zhang   if (lu->size > 1){
507e09efc27SHong Zhang     if ((*F)->factor == FACTOR_LU){
508e09efc27SHong Zhang       F_diag = ((Mat_MPIAIJ *)(*F)->data)->A;
509e09efc27SHong Zhang     } else {
510e09efc27SHong Zhang       F_diag = ((Mat_MPISBAIJ *)(*F)->data)->A;
511e09efc27SHong Zhang     }
512e09efc27SHong Zhang     F_diag->assembled = PETSC_TRUE;
513329ec9b3SHong Zhang     if (lu->nSolve){
514329ec9b3SHong Zhang       ierr = VecScatterDestroy(lu->scat_sol);CHKERRQ(ierr);
515329ec9b3SHong Zhang       ierr = PetscFree(lu->id.sol_loc);CHKERRQ(ierr);
516329ec9b3SHong Zhang       ierr = VecDestroy(lu->x_seq);CHKERRQ(ierr);
517329ec9b3SHong Zhang     }
5188ada1bb4SHong Zhang   }
519397b6df1SKris Buschelman   (*F)->assembled   = PETSC_TRUE;
520397b6df1SKris Buschelman   lu->matstruc      = SAME_NONZERO_PATTERN;
521ace87b0dSHong Zhang   lu->CleanUpMUMPS  = PETSC_TRUE;
522329ec9b3SHong Zhang   lu->nSolve        = 0;
523397b6df1SKris Buschelman   PetscFunctionReturn(0);
524397b6df1SKris Buschelman }
525397b6df1SKris Buschelman 
526*b24902e0SBarry Smith 
527397b6df1SKris Buschelman /* Note the Petsc r and c permutations are ignored */
528397b6df1SKris Buschelman #undef __FUNCT__
529f0c56d0fSKris Buschelman #define __FUNCT__ "MatLUFactorSymbolic_AIJMUMPS"
530*b24902e0SBarry Smith PetscErrorCode MatLUFactorSymbolic_AIJMUMPS(Mat A,IS r,IS c,MatFactorInfo *info,Mat *F)
531*b24902e0SBarry Smith {
532f0c56d0fSKris Buschelman   Mat_MUMPS      *lu;
533dfbe8321SBarry Smith   PetscErrorCode ierr;
534397b6df1SKris Buschelman 
535397b6df1SKris Buschelman   PetscFunctionBegin;
536*b24902e0SBarry Smith 
537*b24902e0SBarry Smith   /* Create the factorization matrix */
538*b24902e0SBarry Smith   lu                      = (Mat_MUMPS*)(*F)->spptr;
539*b24902e0SBarry Smith   lu->sym                 = 0;
540*b24902e0SBarry Smith   lu->matstruc            = DIFFERENT_NONZERO_PATTERN;
541*b24902e0SBarry Smith   PetscFunctionReturn(0);
542*b24902e0SBarry Smith }
543*b24902e0SBarry Smith 
544*b24902e0SBarry Smith #undef __FUNCT__
545*b24902e0SBarry Smith #define __FUNCT__ "MatGetFactor_mpiaij_mumps"
546*b24902e0SBarry Smith PetscErrorCode MatGetFactor_mpiaij_mumps(Mat A,Mat *F)
547*b24902e0SBarry Smith {
548*b24902e0SBarry Smith   Mat            B;
549*b24902e0SBarry Smith   PetscErrorCode ierr;
550*b24902e0SBarry Smith   Mat_MUMPS      *mumps;
551*b24902e0SBarry Smith 
552*b24902e0SBarry Smith   PetscFunctionBegin;
553397b6df1SKris Buschelman   /* Create the factorization matrix */
5547adad957SLisandro Dalcin   ierr = MatCreate(((PetscObject)A)->comm,&B);CHKERRQ(ierr);
5552a4c71feSBarry Smith   ierr = MatSetSizes(B,A->rmap.n,A->cmap.n,A->rmap.N,A->cmap.N);CHKERRQ(ierr);
5567adad957SLisandro Dalcin   ierr = MatSetType(B,((PetscObject)A)->type_name);CHKERRQ(ierr);
557397b6df1SKris Buschelman   ierr = MatSeqAIJSetPreallocation(B,0,PETSC_NULL);CHKERRQ(ierr);
558397b6df1SKris Buschelman   ierr = MatMPIAIJSetPreallocation(B,0,PETSC_NULL,0,PETSC_NULL);CHKERRQ(ierr);
559397b6df1SKris Buschelman 
560f6c57405SHong Zhang   B->ops->lufactornumeric  = MatFactorNumeric_MUMPS;
561*b24902e0SBarry Smith   B->ops->lufactorsymbolic = MatLUFactorSymbolic_AIJMUMPS;
562397b6df1SKris Buschelman   B->factor                = FACTOR_LU;
563*b24902e0SBarry Smith 
564*b24902e0SBarry Smith   ierr = PetscNewLog(B,Mat_MUMPS,&mumps);CHKERRQ(ierr);
565*b24902e0SBarry Smith   mumps->CleanUpMUMPS              = PETSC_FALSE;
566*b24902e0SBarry Smith   mumps->isAIJ                     = PETSC_TRUE;
567*b24902e0SBarry Smith   mumps->scat_rhs                  = PETSC_NULL;
568*b24902e0SBarry Smith   mumps->scat_sol                  = PETSC_NULL;
569*b24902e0SBarry Smith   mumps->nSolve                    = 0;
570*b24902e0SBarry Smith 
571*b24902e0SBarry Smith   B->spptr                         = (void*)mumps;
572397b6df1SKris Buschelman 
573397b6df1SKris Buschelman   *F = B;
574397b6df1SKris Buschelman   PetscFunctionReturn(0);
575397b6df1SKris Buschelman }
576397b6df1SKris Buschelman 
577*b24902e0SBarry Smith 
578397b6df1SKris Buschelman /* Note the Petsc r permutation is ignored */
579397b6df1SKris Buschelman #undef __FUNCT__
580f0c56d0fSKris Buschelman #define __FUNCT__ "MatCholeskyFactorSymbolic_SBAIJMUMPS"
581*b24902e0SBarry Smith PetscErrorCode MatCholeskyFactorSymbolic_SBAIJMUMPS(Mat A,IS r,MatFactorInfo *info,Mat *F)
582*b24902e0SBarry Smith {
583f0c56d0fSKris Buschelman   Mat_MUMPS      *lu;
584dfbe8321SBarry Smith   PetscErrorCode ierr;
585397b6df1SKris Buschelman 
586397b6df1SKris Buschelman   PetscFunctionBegin;
587*b24902e0SBarry Smith   lu                            = (Mat_MUMPS*)(*F)->spptr;
588*b24902e0SBarry Smith   lu->sym                       = 2;
589*b24902e0SBarry Smith   lu->matstruc                  = DIFFERENT_NONZERO_PATTERN;
590*b24902e0SBarry Smith   PetscFunctionReturn(0);
591*b24902e0SBarry Smith }
592*b24902e0SBarry Smith 
593*b24902e0SBarry Smith #undef __FUNCT__
594*b24902e0SBarry Smith #define __FUNCT__ "MatGetFactor_mpisbaij_mumps"
595*b24902e0SBarry Smith PetscErrorCode MatGetFactor_mpisbaij_mumps(Mat A,Mat *F)
596*b24902e0SBarry Smith {
597*b24902e0SBarry Smith   Mat            B;
598*b24902e0SBarry Smith   PetscErrorCode ierr;
599*b24902e0SBarry Smith   Mat_MUMPS      *mumps;
600*b24902e0SBarry Smith 
601*b24902e0SBarry Smith   PetscFunctionBegin;
602397b6df1SKris Buschelman   /* Create the factorization matrix */
6037adad957SLisandro Dalcin   ierr = MatCreate(((PetscObject)A)->comm,&B);CHKERRQ(ierr);
6042a4c71feSBarry Smith   ierr = MatSetSizes(B,A->rmap.n,A->cmap.n,A->rmap.N,A->cmap.N);CHKERRQ(ierr);
6057adad957SLisandro Dalcin   ierr = MatSetType(B,((PetscObject)A)->type_name);CHKERRQ(ierr);
606efc670deSHong Zhang   ierr = MatSeqSBAIJSetPreallocation(B,1,0,PETSC_NULL);CHKERRQ(ierr);
607efc670deSHong Zhang   ierr = MatMPISBAIJSetPreallocation(B,1,0,PETSC_NULL,0,PETSC_NULL);CHKERRQ(ierr);
608397b6df1SKris Buschelman 
609*b24902e0SBarry Smith   B->ops->choleskyfactorsymbolic = MatCholeskyFactorSymbolic_SBAIJMUMPS;
610f6c57405SHong Zhang   B->ops->choleskyfactornumeric  = MatFactorNumeric_MUMPS;
611a58c3f20SHong Zhang   B->ops->getinertia             = MatGetInertia_SBAIJMUMPS;
612397b6df1SKris Buschelman   B->factor                      = FACTOR_CHOLESKY;
613397b6df1SKris Buschelman 
614*b24902e0SBarry Smith   ierr = PetscNewLog(B,Mat_MUMPS,&mumps);CHKERRQ(ierr);
615*b24902e0SBarry Smith   mumps->CleanUpMUMPS              = PETSC_FALSE;
616*b24902e0SBarry Smith   mumps->isAIJ                     = PETSC_TRUE;
617*b24902e0SBarry Smith   mumps->scat_rhs                  = PETSC_NULL;
618*b24902e0SBarry Smith   mumps->scat_sol                  = PETSC_NULL;
619*b24902e0SBarry Smith   mumps->nSolve                    = 0;
620*b24902e0SBarry Smith   B->spptr                         = (void*)mumps;
621397b6df1SKris Buschelman   *F = B;
622397b6df1SKris Buschelman   PetscFunctionReturn(0);
623397b6df1SKris Buschelman }
624397b6df1SKris Buschelman 
625397b6df1SKris Buschelman #undef __FUNCT__
626f6c57405SHong Zhang #define __FUNCT__ "MatFactorInfo_MUMPS"
627f6c57405SHong Zhang PetscErrorCode MatFactorInfo_MUMPS(Mat A,PetscViewer viewer) {
628f6c57405SHong Zhang   Mat_MUMPS      *lu=(Mat_MUMPS*)A->spptr;
629f6c57405SHong Zhang   PetscErrorCode ierr;
630f6c57405SHong Zhang 
631f6c57405SHong Zhang   PetscFunctionBegin;
632f6c57405SHong Zhang   /* check if matrix is mumps type */
633f6c57405SHong Zhang   if (A->ops->solve != MatSolve_MUMPS) PetscFunctionReturn(0);
634f6c57405SHong Zhang 
635f6c57405SHong Zhang   ierr = PetscViewerASCIIPrintf(viewer,"MUMPS run parameters:\n");CHKERRQ(ierr);
636f6c57405SHong Zhang   ierr = PetscViewerASCIIPrintf(viewer,"  SYM (matrix type):                  %d \n",lu->id.sym);CHKERRQ(ierr);
637f6c57405SHong Zhang   ierr = PetscViewerASCIIPrintf(viewer,"  PAR (host participation):           %d \n",lu->id.par);CHKERRQ(ierr);
638f6c57405SHong Zhang   ierr = PetscViewerASCIIPrintf(viewer,"  ICNTL(1) (output for error):        %d \n",lu->id.ICNTL(1));CHKERRQ(ierr);
639f6c57405SHong Zhang   ierr = PetscViewerASCIIPrintf(viewer,"  ICNTL(2) (output of diagnostic msg):%d \n",lu->id.ICNTL(2));CHKERRQ(ierr);
640f6c57405SHong Zhang   ierr = PetscViewerASCIIPrintf(viewer,"  ICNTL(3) (output for global info):  %d \n",lu->id.ICNTL(3));CHKERRQ(ierr);
641f6c57405SHong Zhang   ierr = PetscViewerASCIIPrintf(viewer,"  ICNTL(4) (level of printing):       %d \n",lu->id.ICNTL(4));CHKERRQ(ierr);
642f6c57405SHong Zhang   ierr = PetscViewerASCIIPrintf(viewer,"  ICNTL(5) (input mat struct):        %d \n",lu->id.ICNTL(5));CHKERRQ(ierr);
643f6c57405SHong Zhang   ierr = PetscViewerASCIIPrintf(viewer,"  ICNTL(6) (matrix prescaling):       %d \n",lu->id.ICNTL(6));CHKERRQ(ierr);
644f6c57405SHong Zhang   ierr = PetscViewerASCIIPrintf(viewer,"  ICNTL(7) (matrix ordering):         %d \n",lu->id.ICNTL(7));CHKERRQ(ierr);
645f6c57405SHong Zhang   ierr = PetscViewerASCIIPrintf(viewer,"  ICNTL(8) (scalling strategy):       %d \n",lu->id.ICNTL(8));CHKERRQ(ierr);
646f6c57405SHong Zhang   ierr = PetscViewerASCIIPrintf(viewer,"  ICNTL(9) (A/A^T x=b is solved):     %d \n",lu->id.ICNTL(9));CHKERRQ(ierr);
647f6c57405SHong Zhang   ierr = PetscViewerASCIIPrintf(viewer,"  ICNTL(10) (max num of refinements): %d \n",lu->id.ICNTL(10));CHKERRQ(ierr);
648f6c57405SHong Zhang   ierr = PetscViewerASCIIPrintf(viewer,"  ICNTL(11) (error analysis):         %d \n",lu->id.ICNTL(11));CHKERRQ(ierr);
649f6c57405SHong Zhang   if (!lu->myid && lu->id.ICNTL(11)>0) {
650f6c57405SHong Zhang     ierr = PetscPrintf(PETSC_COMM_SELF,"        RINFOG(4) (inf norm of input mat):        %g\n",lu->id.RINFOG(4));CHKERRQ(ierr);
651f6c57405SHong Zhang     ierr = PetscPrintf(PETSC_COMM_SELF,"        RINFOG(5) (inf norm of solution):         %g\n",lu->id.RINFOG(5));CHKERRQ(ierr);
652f6c57405SHong Zhang     ierr = PetscPrintf(PETSC_COMM_SELF,"        RINFOG(6) (inf norm of residual):         %g\n",lu->id.RINFOG(6));CHKERRQ(ierr);
653f6c57405SHong Zhang     ierr = PetscPrintf(PETSC_COMM_SELF,"        RINFOG(7),RINFOG(8) (backward error est): %g, %g\n",lu->id.RINFOG(7),lu->id.RINFOG(8));CHKERRQ(ierr);
654f6c57405SHong Zhang     ierr = PetscPrintf(PETSC_COMM_SELF,"        RINFOG(9) (error estimate):               %g \n",lu->id.RINFOG(9));CHKERRQ(ierr);
655f6c57405SHong Zhang     ierr = PetscPrintf(PETSC_COMM_SELF,"        RINFOG(10),RINFOG(11)(condition numbers): %g, %g\n",lu->id.RINFOG(10),lu->id.RINFOG(11));CHKERRQ(ierr);
656f6c57405SHong Zhang 
657f6c57405SHong Zhang   }
658f6c57405SHong Zhang   ierr = PetscViewerASCIIPrintf(viewer,"  ICNTL(12) (efficiency control):                         %d \n",lu->id.ICNTL(12));CHKERRQ(ierr);
659f6c57405SHong Zhang   ierr = PetscViewerASCIIPrintf(viewer,"  ICNTL(13) (efficiency control):                         %d \n",lu->id.ICNTL(13));CHKERRQ(ierr);
660f6c57405SHong Zhang   ierr = PetscViewerASCIIPrintf(viewer,"  ICNTL(14) (percentage of estimated workspace increase): %d \n",lu->id.ICNTL(14));CHKERRQ(ierr);
661f6c57405SHong Zhang   /* ICNTL(15-17) not used */
662f6c57405SHong Zhang   ierr = PetscViewerASCIIPrintf(viewer,"  ICNTL(18) (input mat struct):                           %d \n",lu->id.ICNTL(18));CHKERRQ(ierr);
663f6c57405SHong Zhang   ierr = PetscViewerASCIIPrintf(viewer,"  ICNTL(19) (Shur complement info):                       %d \n",lu->id.ICNTL(19));CHKERRQ(ierr);
664f6c57405SHong Zhang   ierr = PetscViewerASCIIPrintf(viewer,"  ICNTL(20) (rhs sparse pattern):                         %d \n",lu->id.ICNTL(20));CHKERRQ(ierr);
665f6c57405SHong Zhang   ierr = PetscViewerASCIIPrintf(viewer,"  ICNTL(21) (solution struct):                            %d \n",lu->id.ICNTL(21));CHKERRQ(ierr);
666f6c57405SHong Zhang 
667f6c57405SHong Zhang   ierr = PetscViewerASCIIPrintf(viewer,"  CNTL(1) (relative pivoting threshold):      %g \n",lu->id.CNTL(1));CHKERRQ(ierr);
668f6c57405SHong Zhang   ierr = PetscViewerASCIIPrintf(viewer,"  CNTL(2) (stopping criterion of refinement): %g \n",lu->id.CNTL(2));CHKERRQ(ierr);
669f6c57405SHong Zhang   ierr = PetscViewerASCIIPrintf(viewer,"  CNTL(3) (absolute pivoting threshold):      %g \n",lu->id.CNTL(3));CHKERRQ(ierr);
670f6c57405SHong Zhang   ierr = PetscViewerASCIIPrintf(viewer,"  CNTL(4) (value of static pivoting):         %g \n",lu->id.CNTL(4));CHKERRQ(ierr);
671f6c57405SHong Zhang 
672f6c57405SHong Zhang   /* infomation local to each processor */
673f6c57405SHong Zhang   if (!lu->myid) {ierr = PetscPrintf(PETSC_COMM_SELF, "      RINFO(1) (local estimated flops for the elimination after analysis): \n");CHKERRQ(ierr);}
6747adad957SLisandro Dalcin   ierr = PetscSynchronizedPrintf(((PetscObject)A)->comm,"             [%d] %g \n",lu->myid,lu->id.RINFO(1));CHKERRQ(ierr);
6757adad957SLisandro Dalcin   ierr = PetscSynchronizedFlush(((PetscObject)A)->comm);
676f6c57405SHong Zhang   if (!lu->myid) {ierr = PetscPrintf(PETSC_COMM_SELF, "      RINFO(2) (local estimated flops for the assembly after factorization): \n");CHKERRQ(ierr);}
6777adad957SLisandro Dalcin   ierr = PetscSynchronizedPrintf(((PetscObject)A)->comm,"             [%d]  %g \n",lu->myid,lu->id.RINFO(2));CHKERRQ(ierr);
6787adad957SLisandro Dalcin   ierr = PetscSynchronizedFlush(((PetscObject)A)->comm);
679f6c57405SHong Zhang   if (!lu->myid) {ierr = PetscPrintf(PETSC_COMM_SELF, "      RINFO(3) (local estimated flops for the elimination after factorization): \n");CHKERRQ(ierr);}
6807adad957SLisandro Dalcin   ierr = PetscSynchronizedPrintf(((PetscObject)A)->comm,"             [%d]  %g \n",lu->myid,lu->id.RINFO(3));CHKERRQ(ierr);
6817adad957SLisandro Dalcin   ierr = PetscSynchronizedFlush(((PetscObject)A)->comm);
682f6c57405SHong Zhang   /*
683f6c57405SHong Zhang   if (!lu->myid) {ierr = PetscPrintf(PETSC_COMM_SELF, "      INFO(2) (info about error or warning ): \n");CHKERRQ(ierr);}
6847adad957SLisandro Dalcin   ierr = PetscSynchronizedPrintf(((PetscObject)A)->comm,"             [%d] %d \n",lu->myid,lu->id.INFO(2));CHKERRQ(ierr);
6857adad957SLisandro Dalcin   ierr = PetscSynchronizedFlush(((PetscObject)A)->comm);
686f6c57405SHong Zhang   */
687f6c57405SHong Zhang 
688f6c57405SHong Zhang   if (!lu->myid) {ierr = PetscPrintf(PETSC_COMM_SELF, "      INFO(15) (estimated size of (in MB) MUMPS internal data for running numerical factorization): \n");CHKERRQ(ierr);}
6897adad957SLisandro Dalcin   ierr = PetscSynchronizedPrintf(((PetscObject)A)->comm,"             [%d] %d \n",lu->myid,lu->id.INFO(15));CHKERRQ(ierr);
6907adad957SLisandro Dalcin   ierr = PetscSynchronizedFlush(((PetscObject)A)->comm);
691f6c57405SHong Zhang 
692f6c57405SHong Zhang   if (!lu->myid) {ierr = PetscPrintf(PETSC_COMM_SELF, "      INFO(16) (size of (in MB) MUMPS internal data used during numerical factorization): \n");CHKERRQ(ierr);}
6937adad957SLisandro Dalcin   ierr = PetscSynchronizedPrintf(((PetscObject)A)->comm,"             [%d] %d \n",lu->myid,lu->id.INFO(16));CHKERRQ(ierr);
6947adad957SLisandro Dalcin   ierr = PetscSynchronizedFlush(((PetscObject)A)->comm);
695f6c57405SHong Zhang 
696f6c57405SHong Zhang   if (!lu->myid) {ierr = PetscPrintf(PETSC_COMM_SELF, "      INFO(23) (num of pivots eliminated on this processor after factorization): \n");CHKERRQ(ierr);}
6977adad957SLisandro Dalcin   ierr = PetscSynchronizedPrintf(((PetscObject)A)->comm,"             [%d] %d \n",lu->myid,lu->id.INFO(23));CHKERRQ(ierr);
6987adad957SLisandro Dalcin   ierr = PetscSynchronizedFlush(((PetscObject)A)->comm);
699f6c57405SHong Zhang 
700f6c57405SHong Zhang   if (!lu->myid){ /* information from the host */
701f6c57405SHong Zhang     ierr = PetscViewerASCIIPrintf(viewer,"  RINFOG(1) (global estimated flops for the elimination after analysis): %g \n",lu->id.RINFOG(1));CHKERRQ(ierr);
702f6c57405SHong Zhang     ierr = PetscViewerASCIIPrintf(viewer,"  RINFOG(2) (global estimated flops for the assembly after factorization): %g \n",lu->id.RINFOG(2));CHKERRQ(ierr);
703f6c57405SHong Zhang     ierr = PetscViewerASCIIPrintf(viewer,"  RINFOG(3) (global estimated flops for the elimination after factorization): %g \n",lu->id.RINFOG(3));CHKERRQ(ierr);
704f6c57405SHong Zhang 
705f6c57405SHong Zhang     ierr = PetscViewerASCIIPrintf(viewer,"  INFOG(3) (estimated real workspace for factors on all processors after analysis): %d \n",lu->id.INFOG(3));CHKERRQ(ierr);
706f6c57405SHong Zhang     ierr = PetscViewerASCIIPrintf(viewer,"  INFOG(4) (estimated integer workspace for factors on all processors after analysis): %d \n",lu->id.INFOG(4));CHKERRQ(ierr);
707f6c57405SHong Zhang     ierr = PetscViewerASCIIPrintf(viewer,"  INFOG(5) (estimated maximum front size in the complete tree): %d \n",lu->id.INFOG(5));CHKERRQ(ierr);
708f6c57405SHong Zhang     ierr = PetscViewerASCIIPrintf(viewer,"  INFOG(6) (number of nodes in the complete tree): %d \n",lu->id.INFOG(6));CHKERRQ(ierr);
709f6c57405SHong Zhang     ierr = PetscViewerASCIIPrintf(viewer,"  INFOG(7) (ordering option effectively uese after analysis): %d \n",lu->id.INFOG(7));CHKERRQ(ierr);
710f6c57405SHong Zhang     ierr = PetscViewerASCIIPrintf(viewer,"  INFOG(8) (structural symmetry in percent of the permuted matrix after analysis): %d \n",lu->id.INFOG(8));CHKERRQ(ierr);
711f6c57405SHong 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);
712f6c57405SHong Zhang     ierr = PetscViewerASCIIPrintf(viewer,"  INFOG(10) (total integer space store the matrix factors after factorization): %d \n",lu->id.INFOG(10));CHKERRQ(ierr);
713f6c57405SHong Zhang     ierr = PetscViewerASCIIPrintf(viewer,"  INFOG(11) (order of largest frontal matrix after factorization): %d \n",lu->id.INFOG(11));CHKERRQ(ierr);
714f6c57405SHong Zhang     ierr = PetscViewerASCIIPrintf(viewer,"  INFOG(12) (number of off-diagonal pivots): %d \n",lu->id.INFOG(12));CHKERRQ(ierr);
715f6c57405SHong Zhang     ierr = PetscViewerASCIIPrintf(viewer,"  INFOG(13) (number of delayed pivots after factorization): %d \n",lu->id.INFOG(13));CHKERRQ(ierr);
716f6c57405SHong Zhang     ierr = PetscViewerASCIIPrintf(viewer,"  INFOG(14) (number of memory compress after factorization): %d \n",lu->id.INFOG(14));CHKERRQ(ierr);
717f6c57405SHong Zhang     ierr = PetscViewerASCIIPrintf(viewer,"  INFOG(15) (number of steps of iterative refinement after solution): %d \n",lu->id.INFOG(15));CHKERRQ(ierr);
718f6c57405SHong 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);
719f6c57405SHong 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);
720f6c57405SHong 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);
721f6c57405SHong 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);
722f6c57405SHong Zhang      ierr = PetscViewerASCIIPrintf(viewer,"  INFOG(20) (estimated number of entries in the factors): %d \n",lu->id.INFOG(20));CHKERRQ(ierr);
723f6c57405SHong 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);
724f6c57405SHong 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);
725f6c57405SHong Zhang      ierr = PetscViewerASCIIPrintf(viewer,"  INFOG(23) (after analysis: value of ICNTL(6) effectively used): %d \n",lu->id.INFOG(23));CHKERRQ(ierr);
726f6c57405SHong Zhang      ierr = PetscViewerASCIIPrintf(viewer,"  INFOG(24) (after analysis: value of ICNTL(12) effectively used): %d \n",lu->id.INFOG(24));CHKERRQ(ierr);
727f6c57405SHong Zhang      ierr = PetscViewerASCIIPrintf(viewer,"  INFOG(25) (after factorization: number of pivots modified by static pivoting): %d \n",lu->id.INFOG(25));CHKERRQ(ierr);
728f6c57405SHong Zhang   }
729f6c57405SHong Zhang 
730f6c57405SHong Zhang   PetscFunctionReturn(0);
731f6c57405SHong Zhang }
732f6c57405SHong Zhang 
733f6c57405SHong Zhang #undef __FUNCT__
734f6c57405SHong Zhang #define __FUNCT__ "MatView_MUMPS"
735*b24902e0SBarry Smith PetscErrorCode MatView_MUMPS(Mat A,PetscViewer viewer)
736*b24902e0SBarry Smith {
737f6c57405SHong Zhang   PetscErrorCode    ierr;
738f6c57405SHong Zhang   PetscTruth        iascii;
739f6c57405SHong Zhang   PetscViewerFormat format;
740f6c57405SHong Zhang   Mat_MUMPS         *mumps=(Mat_MUMPS*)(A->spptr);
741f6c57405SHong Zhang 
742f6c57405SHong Zhang   PetscFunctionBegin;
743f6c57405SHong Zhang     ierr = PetscTypeCompare((PetscObject)viewer,PETSC_VIEWER_ASCII,&iascii);CHKERRQ(ierr);
744f6c57405SHong Zhang   if (iascii) {
745f6c57405SHong Zhang     ierr = PetscViewerGetFormat(viewer,&format);CHKERRQ(ierr);
746f6c57405SHong Zhang     if (format == PETSC_VIEWER_ASCII_INFO){
747f6c57405SHong Zhang       ierr = MatFactorInfo_MUMPS(A,viewer);CHKERRQ(ierr);
748f6c57405SHong Zhang     }
749f6c57405SHong Zhang   }
750f6c57405SHong Zhang   PetscFunctionReturn(0);
751f6c57405SHong Zhang }
752f6c57405SHong Zhang 
753397b6df1SKris Buschelman 
75424b6179bSKris Buschelman /*MC
755fafad747SKris Buschelman   MATAIJMUMPS - MATAIJMUMPS = "aijmumps" - A matrix type providing direct solvers (LU) for distributed
75624b6179bSKris Buschelman   and sequential matrices via the external package MUMPS.
75724b6179bSKris Buschelman 
75824b6179bSKris Buschelman   If MUMPS is installed (see the manual for instructions
75924b6179bSKris Buschelman   on how to declare the existence of external packages),
76024b6179bSKris Buschelman   a matrix type can be constructed which invokes MUMPS solvers.
761175b88e8SBarry Smith   After calling MatCreate(...,A), simply call MatSetType(A,MATAIJMUMPS), then
762175b88e8SBarry Smith   optionally call MatSeqAIJSetPreallocation() or MatMPIAIJSetPreallocation() etc DO NOT
763175b88e8SBarry Smith   call MatCreateSeqAIJ/MPIAIJ() directly or the preallocation information will be LOST!
76424b6179bSKris Buschelman 
76524b6179bSKris Buschelman   If created with a single process communicator, this matrix type inherits from MATSEQAIJ.
76624b6179bSKris Buschelman   Otherwise, this matrix type inherits from MATMPIAIJ.  Hence for single process communicators,
7673ec795f1SBarry Smith   MatSeqAIJSetPreallocation() is supported, and similarly MatMPIAIJSetPreallocation() is supported
76824b6179bSKris Buschelman   for communicators controlling multiple processes.  It is recommended that you call both of
7693ec795f1SBarry Smith   the above preallocation routines for simplicity.  One can also call MatConvert() for an inplace
77028b08bd3SKris Buschelman   conversion to or from the MATSEQAIJ or MATMPIAIJ type (depending on the communicator size)
771175b88e8SBarry Smith   without data copy AFTER the matrix values are set.
77224b6179bSKris Buschelman 
77324b6179bSKris Buschelman   Options Database Keys:
7740bad9183SKris Buschelman + -mat_type aijmumps - sets the matrix type to "aijmumps" during a call to MatSetFromOptions()
77524b6179bSKris Buschelman . -mat_mumps_sym <0,1,2> - 0 the matrix is unsymmetric, 1 symmetric positive definite, 2 symmetric
77624b6179bSKris Buschelman . -mat_mumps_icntl_4 <0,1,2,3,4> - print level
77724b6179bSKris Buschelman . -mat_mumps_icntl_6 <0,...,7> - matrix prescaling options (see MUMPS User's Guide)
77824b6179bSKris Buschelman . -mat_mumps_icntl_7 <0,...,7> - matrix orderings (see MUMPS User's Guide)
77924b6179bSKris Buschelman . -mat_mumps_icntl_9 <1,2> - A or A^T x=b to be solved: 1 denotes A, 2 denotes A^T
78024b6179bSKris Buschelman . -mat_mumps_icntl_10 <n> - maximum number of iterative refinements
78194b7f48cSBarry Smith . -mat_mumps_icntl_11 <n> - error analysis, a positive value returns statistics during -ksp_view
78224b6179bSKris Buschelman . -mat_mumps_icntl_12 <n> - efficiency control (see MUMPS User's Guide)
78324b6179bSKris Buschelman . -mat_mumps_icntl_13 <n> - efficiency control (see MUMPS User's Guide)
78424b6179bSKris Buschelman . -mat_mumps_icntl_14 <n> - efficiency control (see MUMPS User's Guide)
78524b6179bSKris Buschelman . -mat_mumps_icntl_15 <n> - efficiency control (see MUMPS User's Guide)
78624b6179bSKris Buschelman . -mat_mumps_cntl_1 <delta> - relative pivoting threshold
78724b6179bSKris Buschelman . -mat_mumps_cntl_2 <tol> - stopping criterion for refinement
78824b6179bSKris Buschelman - -mat_mumps_cntl_3 <adelta> - absolute pivoting threshold
78924b6179bSKris Buschelman 
79024b6179bSKris Buschelman   Level: beginner
79124b6179bSKris Buschelman 
79224b6179bSKris Buschelman .seealso: MATSBAIJMUMPS
79324b6179bSKris Buschelman M*/
79424b6179bSKris Buschelman 
795f0c56d0fSKris Buschelman 
79624b6179bSKris Buschelman /*MC
797fafad747SKris Buschelman   MATSBAIJMUMPS - MATSBAIJMUMPS = "sbaijmumps" - A symmetric matrix type providing direct solvers (Cholesky) for
79824b6179bSKris Buschelman   distributed and sequential matrices via the external package MUMPS.
79924b6179bSKris Buschelman 
80024b6179bSKris Buschelman   If MUMPS is installed (see the manual for instructions
80124b6179bSKris Buschelman   on how to declare the existence of external packages),
80224b6179bSKris Buschelman   a matrix type can be constructed which invokes MUMPS solvers.
803175b88e8SBarry Smith   After calling MatCreate(...,A), simply call MatSetType(A,MATSBAIJMUMPS), then
804175b88e8SBarry Smith   optionally call MatSeqSBAIJSetPreallocation() or MatMPISBAIJSetPreallocation() DO NOT
805175b88e8SBarry Smith   call MatCreateSeqSBAIJ/MPISBAIJ() directly or the preallocation information will be LOST!
80624b6179bSKris Buschelman 
80724b6179bSKris Buschelman   If created with a single process communicator, this matrix type inherits from MATSEQSBAIJ.
80824b6179bSKris Buschelman   Otherwise, this matrix type inherits from MATMPISBAIJ.  Hence for single process communicators,
809175b88e8SBarry Smith   MatSeqSBAIJSetPreallocation() is supported, and similarly MatMPISBAIJSetPreallocation() is supported
81024b6179bSKris Buschelman   for communicators controlling multiple processes.  It is recommended that you call both of
811175b88e8SBarry Smith   the above preallocation routines for simplicity.  One can also call MatConvert() for an inplace
81228b08bd3SKris Buschelman   conversion to or from the MATSEQSBAIJ or MATMPISBAIJ type (depending on the communicator size)
813175b88e8SBarry Smith   without data copy AFTER the matrix values have been set.
81424b6179bSKris Buschelman 
81524b6179bSKris Buschelman   Options Database Keys:
8160bad9183SKris Buschelman + -mat_type sbaijmumps - sets the matrix type to "sbaijmumps" during a call to MatSetFromOptions()
81724b6179bSKris Buschelman . -mat_mumps_sym <0,1,2> - 0 the matrix is unsymmetric, 1 symmetric positive definite, 2 symmetric
81824b6179bSKris Buschelman . -mat_mumps_icntl_4 <0,...,4> - print level
81924b6179bSKris Buschelman . -mat_mumps_icntl_6 <0,...,7> - matrix prescaling options (see MUMPS User's Guide)
82024b6179bSKris Buschelman . -mat_mumps_icntl_7 <0,...,7> - matrix orderings (see MUMPS User's Guide)
82124b6179bSKris Buschelman . -mat_mumps_icntl_9 <1,2> - A or A^T x=b to be solved: 1 denotes A, 2 denotes A^T
82224b6179bSKris Buschelman . -mat_mumps_icntl_10 <n> - maximum number of iterative refinements
82394b7f48cSBarry Smith . -mat_mumps_icntl_11 <n> - error analysis, a positive value returns statistics during -ksp_view
82424b6179bSKris Buschelman . -mat_mumps_icntl_12 <n> - efficiency control (see MUMPS User's Guide)
82524b6179bSKris Buschelman . -mat_mumps_icntl_13 <n> - efficiency control (see MUMPS User's Guide)
82624b6179bSKris Buschelman . -mat_mumps_icntl_14 <n> - efficiency control (see MUMPS User's Guide)
82724b6179bSKris Buschelman . -mat_mumps_icntl_15 <n> - efficiency control (see MUMPS User's Guide)
82824b6179bSKris Buschelman . -mat_mumps_cntl_1 <delta> - relative pivoting threshold
82924b6179bSKris Buschelman . -mat_mumps_cntl_2 <tol> - stopping criterion for refinement
83024b6179bSKris Buschelman - -mat_mumps_cntl_3 <adelta> - absolute pivoting threshold
83124b6179bSKris Buschelman 
83224b6179bSKris Buschelman   Level: beginner
83324b6179bSKris Buschelman 
83424b6179bSKris Buschelman .seealso: MATAIJMUMPS
83524b6179bSKris Buschelman M*/
83624b6179bSKris Buschelman 
837