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