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