1be1d678aSKris Buschelman #define PETSCMAT_DLL 21c2a3de1SBarry Smith 3397b6df1SKris Buschelman /* 4c2b5dc30SHong Zhang Provides an interface to the MUMPS sparse solver 5397b6df1SKris Buschelman */ 64e1dd20eSHong Zhang #include "../src/mat/impls/aij/seq/aij.h" /*I "petscmat.h" I*/ 77c4f633dSBarry Smith #include "../src/mat/impls/aij/mpi/mpiaij.h" 87c4f633dSBarry Smith #include "../src/mat/impls/sbaij/seq/sbaij.h" 97c4f633dSBarry Smith #include "../src/mat/impls/sbaij/mpi/mpisbaij.h" 10450b117fSShri Abhyankar #include "../src/mat/impls/baij/seq/baij.h" 11450b117fSShri Abhyankar #include "../src/mat/impls/baij/mpi/mpibaij.h" 12397b6df1SKris Buschelman 13397b6df1SKris Buschelman EXTERN_C_BEGIN 14397b6df1SKris Buschelman #if defined(PETSC_USE_COMPLEX) 15397b6df1SKris Buschelman #include "zmumps_c.h" 16397b6df1SKris Buschelman #else 17397b6df1SKris Buschelman #include "dmumps_c.h" 18397b6df1SKris Buschelman #endif 19397b6df1SKris Buschelman EXTERN_C_END 20397b6df1SKris Buschelman #define JOB_INIT -1 21397b6df1SKris Buschelman #define JOB_END -2 22397b6df1SKris Buschelman /* macros s.t. indices match MUMPS documentation */ 23397b6df1SKris Buschelman #define ICNTL(I) icntl[(I)-1] 24397b6df1SKris Buschelman #define CNTL(I) cntl[(I)-1] 25397b6df1SKris Buschelman #define INFOG(I) infog[(I)-1] 26a7aca84bSHong Zhang #define INFO(I) info[(I)-1] 27397b6df1SKris Buschelman #define RINFOG(I) rinfog[(I)-1] 28adc1d99fSHong Zhang #define RINFO(I) rinfo[(I)-1] 29397b6df1SKris Buschelman 30397b6df1SKris Buschelman typedef struct { 31397b6df1SKris Buschelman #if defined(PETSC_USE_COMPLEX) 32397b6df1SKris Buschelman ZMUMPS_STRUC_C id; 33397b6df1SKris Buschelman #else 34397b6df1SKris Buschelman DMUMPS_STRUC_C id; 35397b6df1SKris Buschelman #endif 36397b6df1SKris Buschelman MatStructure matstruc; 37c1490034SHong Zhang PetscMPIInt myid,size; 38*16ebf90aSShri Abhyankar PetscInt *irn,*jcn,nz,sym,nSolve; 39397b6df1SKris Buschelman PetscScalar *val; 40397b6df1SKris Buschelman MPI_Comm comm_mumps; 41329ec9b3SHong Zhang VecScatter scat_rhs, scat_sol; 42cb828f0fSHong Zhang PetscTruth isAIJ,CleanUpMUMPS,mumpsview; 43329ec9b3SHong Zhang Vec b_seq,x_seq; 4467334b25SHong Zhang PetscErrorCode (*MatDestroy)(Mat); 45*16ebf90aSShri Abhyankar PetscErrorCode (*ConvertToTriples)(Mat, int, PetscTruth, int*, int**, int**, PetscScalar**); 46f0c56d0fSKris Buschelman } Mat_MUMPS; 47f0c56d0fSKris Buschelman 48dfbe8321SBarry Smith EXTERN PetscErrorCode MatDuplicate_MUMPS(Mat,MatDuplicateOption,Mat*); 49b24902e0SBarry Smith 50397b6df1SKris Buschelman /* convert Petsc mpiaij matrix to triples: row[nz], col[nz], val[nz] */ 51397b6df1SKris Buschelman /* 52397b6df1SKris Buschelman input: 5375747be1SHong Zhang A - matrix in mpiaij or mpisbaij (bs=1) format 54397b6df1SKris Buschelman shift - 0: C style output triple; 1: Fortran style output triple. 55397b6df1SKris Buschelman valOnly - FALSE: spaces are allocated and values are set for the triple 56397b6df1SKris Buschelman TRUE: only the values in v array are updated 57397b6df1SKris Buschelman output: 58397b6df1SKris Buschelman nnz - dim of r, c, and v (number of local nonzero entries of A) 59397b6df1SKris Buschelman r, c, v - row and col index, matrix values (matrix triples) 60397b6df1SKris Buschelman */ 61*16ebf90aSShri Abhyankar 62*16ebf90aSShri Abhyankar #undef __FUNCT__ 63*16ebf90aSShri Abhyankar #define __FUNCT__ "MatConvertToTriples_seqaij_seqaij" 64*16ebf90aSShri Abhyankar PetscErrorCode MatConvertToTriples_seqaij_seqaij(Mat A,int shift,PetscTruth valOnly,int *nnz,int **r, int **c, PetscScalar **v) 65b24902e0SBarry Smith { 66*16ebf90aSShri Abhyankar const PetscInt *ai,*aj,M=A->rmap->n;; 67*16ebf90aSShri Abhyankar PetscInt nz,rnz,i; 68dfbe8321SBarry Smith PetscErrorCode ierr; 69c1490034SHong Zhang PetscInt *row,*col; 70*16ebf90aSShri Abhyankar Mat_SeqAIJ *aa=(Mat_SeqAIJ*)A->data; 71397b6df1SKris Buschelman 72397b6df1SKris Buschelman PetscFunctionBegin; 73*16ebf90aSShri Abhyankar *v=aa->a; 74*16ebf90aSShri Abhyankar if (!valOnly){ 75*16ebf90aSShri Abhyankar nz = aa->nz; ai = aa->i; aj = aa->j; 76*16ebf90aSShri Abhyankar *nnz = nz; 77*16ebf90aSShri Abhyankar ierr = PetscMalloc(nz*sizeof(PetscInt), &row);CHKERRQ(ierr); 78*16ebf90aSShri Abhyankar ierr = PetscMalloc(nz*sizeof(PetscInt), &col);CHKERRQ(ierr); 79*16ebf90aSShri Abhyankar nz = 0; 80*16ebf90aSShri Abhyankar for(i=0; i<M; i++) { 81*16ebf90aSShri Abhyankar rnz = ai[i+1] - ai[i]; 82*16ebf90aSShri Abhyankar while(rnz--){ 83*16ebf90aSShri Abhyankar row[nz] = i+shift; col[nz] = (*aj)+shift; aj++;nz++; 84*16ebf90aSShri Abhyankar } 85*16ebf90aSShri Abhyankar } 86*16ebf90aSShri Abhyankar *r = row; *c = col; 87*16ebf90aSShri Abhyankar } 88*16ebf90aSShri Abhyankar PetscFunctionReturn(0); 89*16ebf90aSShri Abhyankar } 90397b6df1SKris Buschelman 91*16ebf90aSShri Abhyankar #undef __FUNCT__ 92*16ebf90aSShri Abhyankar #define __FUNCT__ "MatConvertToTriples_seqsbaij_seqsbaij" 93*16ebf90aSShri Abhyankar PetscErrorCode MatConvertToTriples_seqsbaij_seqsbaij(Mat A,int shift,PetscTruth valOnly,int *nnz,int **r, int **c, PetscScalar **v) 94*16ebf90aSShri Abhyankar { 95*16ebf90aSShri Abhyankar const PetscInt *ai, *aj,M=A->rmap->n; 96*16ebf90aSShri Abhyankar PetscInt nz,rnz,i; 97*16ebf90aSShri Abhyankar PetscErrorCode ierr; 98*16ebf90aSShri Abhyankar PetscInt *row,*col; 99*16ebf90aSShri Abhyankar Mat_SeqSBAIJ *aa=(Mat_SeqSBAIJ*)A->data; 100*16ebf90aSShri Abhyankar 101*16ebf90aSShri Abhyankar PetscFunctionBegin; 102*16ebf90aSShri Abhyankar if (!valOnly){ 103*16ebf90aSShri Abhyankar nz = aa->nz;ai=aa->i; aj=aa->j;*v=aa->a; 104*16ebf90aSShri Abhyankar *nnz = nz; 105*16ebf90aSShri Abhyankar ierr = PetscMalloc(nz*sizeof(PetscInt), &row);CHKERRQ(ierr); 106*16ebf90aSShri Abhyankar ierr = PetscMalloc(nz*sizeof(PetscInt), &col);CHKERRQ(ierr); 107*16ebf90aSShri Abhyankar nz = 0; 108*16ebf90aSShri Abhyankar for(i=0; i<M; i++) { 109*16ebf90aSShri Abhyankar rnz = ai[i+1] - ai[i]; 110*16ebf90aSShri Abhyankar while(rnz--){ 111*16ebf90aSShri Abhyankar row[nz] = i+shift; col[nz] = (*aj)+shift; aj++;nz++; 112*16ebf90aSShri Abhyankar } 113*16ebf90aSShri Abhyankar } 114*16ebf90aSShri Abhyankar *r = row; *c = col; 115*16ebf90aSShri Abhyankar } 116*16ebf90aSShri Abhyankar PetscFunctionReturn(0); 117*16ebf90aSShri Abhyankar } 118*16ebf90aSShri Abhyankar 119*16ebf90aSShri Abhyankar #undef __FUNCT__ 120*16ebf90aSShri Abhyankar #define __FUNCT__ "MatConvertToTriples_seqaij_seqsbaij" 121*16ebf90aSShri Abhyankar PetscErrorCode MatConvertToTriples_seqaij_seqsbaij(Mat A,int shift,PetscTruth valOnly,int *nnz,int **r, int **c, PetscScalar **v) 122*16ebf90aSShri Abhyankar { 123*16ebf90aSShri Abhyankar const PetscInt *ai, *aj,*adiag,M=A->rmap->n; 124*16ebf90aSShri Abhyankar PetscInt nz,rnz,jidx,i; 125*16ebf90aSShri Abhyankar const PetscScalar *av; 126*16ebf90aSShri Abhyankar PetscScalar *val; 127*16ebf90aSShri Abhyankar PetscErrorCode ierr; 128*16ebf90aSShri Abhyankar PetscInt *row,*col; 129*16ebf90aSShri Abhyankar Mat_SeqSBAIJ *aa=(Mat_SeqSBAIJ*)A->data; 130*16ebf90aSShri Abhyankar 131*16ebf90aSShri Abhyankar PetscFunctionBegin; 132*16ebf90aSShri Abhyankar ai=aa->i; aj=aa->j;av=aa->a; 133*16ebf90aSShri Abhyankar adiag=aa->diag; 134*16ebf90aSShri Abhyankar if (!valOnly){ 135*16ebf90aSShri Abhyankar nz = M + (aa->nz-M)/2; 136*16ebf90aSShri Abhyankar *nnz = nz; 137*16ebf90aSShri Abhyankar ierr = PetscMalloc(nz*sizeof(PetscInt), &row);CHKERRQ(ierr); 138*16ebf90aSShri Abhyankar ierr = PetscMalloc(nz*sizeof(PetscInt), &col);CHKERRQ(ierr); 139*16ebf90aSShri Abhyankar ierr = PetscMalloc(nz*sizeof(PetscScalar), &val);CHKERRQ(ierr); 140*16ebf90aSShri Abhyankar nz = 0; 141*16ebf90aSShri Abhyankar for(i=0; i<M; i++) { 142*16ebf90aSShri Abhyankar rnz = ai[i+1] - adiag[i]; 143*16ebf90aSShri Abhyankar jidx = adiag[i]; 144*16ebf90aSShri Abhyankar while(rnz--){ 145*16ebf90aSShri Abhyankar row[nz] = i+shift; col[nz] = aj[jidx]+shift; val[nz] = av[jidx]; 146*16ebf90aSShri Abhyankar jidx++;nz++; 147*16ebf90aSShri Abhyankar } 148*16ebf90aSShri Abhyankar } 149*16ebf90aSShri Abhyankar *r = row; *c = col; *v = val; 150397b6df1SKris Buschelman } else { 151*16ebf90aSShri Abhyankar nz = 0; val = *v; 152*16ebf90aSShri Abhyankar for(i=0; i <M; i++) { 153*16ebf90aSShri Abhyankar rnz = ai[i+1] - adiag[i]; 154*16ebf90aSShri Abhyankar jidx = adiag[i]; 155*16ebf90aSShri Abhyankar while(rnz--) { 156*16ebf90aSShri Abhyankar val[nz] = av[jidx]; nz++; jidx++; 157*16ebf90aSShri Abhyankar } 158*16ebf90aSShri Abhyankar } 159*16ebf90aSShri Abhyankar } 160*16ebf90aSShri Abhyankar PetscFunctionReturn(0); 161*16ebf90aSShri Abhyankar } 162*16ebf90aSShri Abhyankar 163*16ebf90aSShri Abhyankar #undef __FUNCT__ 164*16ebf90aSShri Abhyankar #define __FUNCT__ "MatConvertToTriples_mpisbaij_mpisbaij" 165*16ebf90aSShri Abhyankar PetscErrorCode MatConvertToTriples_mpisbaij_mpisbaij(Mat A,int shift,PetscTruth valOnly,int *nnz,int **r, int **c, PetscScalar **v) 166*16ebf90aSShri Abhyankar { 167*16ebf90aSShri Abhyankar const PetscInt *ai, *aj, *bi, *bj,*garray,m=A->rmap->n,*ajj,*bjj; 168*16ebf90aSShri Abhyankar PetscErrorCode ierr; 169*16ebf90aSShri Abhyankar PetscInt rstart,nz,i,j,jj,irow,countA,countB; 170*16ebf90aSShri Abhyankar PetscInt *row,*col; 171*16ebf90aSShri Abhyankar const PetscScalar *av, *bv,*v1,*v2; 172*16ebf90aSShri Abhyankar PetscScalar *val; 173397b6df1SKris Buschelman Mat_MPISBAIJ *mat = (Mat_MPISBAIJ*)A->data; 174397b6df1SKris Buschelman Mat_SeqSBAIJ *aa=(Mat_SeqSBAIJ*)(mat->A)->data; 175397b6df1SKris Buschelman Mat_SeqBAIJ *bb=(Mat_SeqBAIJ*)(mat->B)->data; 176*16ebf90aSShri Abhyankar 177*16ebf90aSShri Abhyankar PetscFunctionBegin; 178d0f46423SBarry Smith ai=aa->i; aj=aa->j; bi=bb->i; bj=bb->j; rstart= A->rmap->rstart; 179397b6df1SKris Buschelman garray = mat->garray; 180397b6df1SKris Buschelman av=aa->a; bv=bb->a; 181397b6df1SKris Buschelman 182397b6df1SKris Buschelman if (!valOnly){ 183*16ebf90aSShri Abhyankar nz = aa->nz + bb->nz; 184*16ebf90aSShri Abhyankar *nnz = nz; 1857c307921SBarry Smith ierr = PetscMalloc(nz*sizeof(PetscInt) ,&row);CHKERRQ(ierr); 1867c307921SBarry Smith ierr = PetscMalloc(nz*sizeof(PetscInt),&col);CHKERRQ(ierr); 187397b6df1SKris Buschelman ierr = PetscMalloc(nz*sizeof(PetscScalar),&val);CHKERRQ(ierr); 188397b6df1SKris Buschelman *r = row; *c = col; *v = val; 189397b6df1SKris Buschelman } else { 190397b6df1SKris Buschelman row = *r; col = *c; val = *v; 191397b6df1SKris Buschelman } 192397b6df1SKris Buschelman 193028e57e8SHong Zhang jj = 0; irow = rstart; 194397b6df1SKris Buschelman for ( i=0; i<m; i++ ) { 195397b6df1SKris Buschelman ajj = aj + ai[i]; /* ptr to the beginning of this row */ 196397b6df1SKris Buschelman countA = ai[i+1] - ai[i]; 197397b6df1SKris Buschelman countB = bi[i+1] - bi[i]; 198397b6df1SKris Buschelman bjj = bj + bi[i]; 199*16ebf90aSShri Abhyankar v1 = av + ai[i]; 200*16ebf90aSShri Abhyankar v2 = bv + bi[i]; 201397b6df1SKris Buschelman 202397b6df1SKris Buschelman /* A-part */ 203397b6df1SKris Buschelman for (j=0; j<countA; j++){ 204397b6df1SKris Buschelman if (!valOnly){ 205397b6df1SKris Buschelman row[jj] = irow + shift; col[jj] = rstart + ajj[j] + shift; 206397b6df1SKris Buschelman } 207*16ebf90aSShri Abhyankar val[jj++] = v1[j]; 208397b6df1SKris Buschelman } 209*16ebf90aSShri Abhyankar 210*16ebf90aSShri Abhyankar /* B-part */ 211*16ebf90aSShri Abhyankar for(j=0; j < countB; j++){ 212*16ebf90aSShri Abhyankar if (j == countB) break; 213397b6df1SKris Buschelman if (!valOnly){ 214397b6df1SKris Buschelman row[jj] = irow + shift; col[jj] = garray[bjj[j]] + shift; 215397b6df1SKris Buschelman } 216*16ebf90aSShri Abhyankar val[jj++] = v2[j]; 217*16ebf90aSShri Abhyankar } 218*16ebf90aSShri Abhyankar irow++; 219*16ebf90aSShri Abhyankar } 220*16ebf90aSShri Abhyankar PetscFunctionReturn(0); 221*16ebf90aSShri Abhyankar } 222*16ebf90aSShri Abhyankar 223*16ebf90aSShri Abhyankar #undef __FUNCT__ 224*16ebf90aSShri Abhyankar #define __FUNCT__ "MatConvertToTriples_mpiaij_mpiaij" 225*16ebf90aSShri Abhyankar PetscErrorCode MatConvertToTriples_mpiaij_mpiaij(Mat A,int shift,PetscTruth valOnly,int *nnz,int **r, int **c, PetscScalar **v) 226*16ebf90aSShri Abhyankar { 227*16ebf90aSShri Abhyankar const PetscInt *ai, *aj, *bi, *bj,*garray,m=A->rmap->n,*ajj,*bjj; 228*16ebf90aSShri Abhyankar PetscErrorCode ierr; 229*16ebf90aSShri Abhyankar PetscInt rstart,nz,i,j,jj,irow,countA,countB; 230*16ebf90aSShri Abhyankar PetscInt *row,*col; 231*16ebf90aSShri Abhyankar const PetscScalar *av, *bv,*v1,*v2; 232*16ebf90aSShri Abhyankar PetscScalar *val; 233*16ebf90aSShri Abhyankar Mat_MPIAIJ *mat = (Mat_MPIAIJ*)A->data; 234*16ebf90aSShri Abhyankar Mat_SeqAIJ *aa=(Mat_SeqAIJ*)(mat->A)->data; 235*16ebf90aSShri Abhyankar Mat_SeqAIJ *bb=(Mat_SeqAIJ*)(mat->B)->data; 236*16ebf90aSShri Abhyankar 237*16ebf90aSShri Abhyankar PetscFunctionBegin; 238*16ebf90aSShri Abhyankar ai=aa->i; aj=aa->j; bi=bb->i; bj=bb->j; rstart= A->rmap->rstart; 239*16ebf90aSShri Abhyankar garray = mat->garray; 240*16ebf90aSShri Abhyankar av=aa->a; bv=bb->a; 241*16ebf90aSShri Abhyankar 242*16ebf90aSShri Abhyankar if (!valOnly){ 243*16ebf90aSShri Abhyankar nz = aa->nz + bb->nz; 244*16ebf90aSShri Abhyankar *nnz = nz; 245*16ebf90aSShri Abhyankar ierr = PetscMalloc(nz*sizeof(PetscInt) ,&row);CHKERRQ(ierr); 246*16ebf90aSShri Abhyankar ierr = PetscMalloc(nz*sizeof(PetscInt),&col);CHKERRQ(ierr); 247*16ebf90aSShri Abhyankar ierr = PetscMalloc(nz*sizeof(PetscScalar),&val);CHKERRQ(ierr); 248*16ebf90aSShri Abhyankar *r = row; *c = col; *v = val; 249*16ebf90aSShri Abhyankar } else { 250*16ebf90aSShri Abhyankar row = *r; col = *c; val = *v; 251*16ebf90aSShri Abhyankar } 252*16ebf90aSShri Abhyankar 253*16ebf90aSShri Abhyankar jj = 0; irow = rstart; 254*16ebf90aSShri Abhyankar for ( i=0; i<m; i++ ) { 255*16ebf90aSShri Abhyankar ajj = aj + ai[i]; /* ptr to the beginning of this row */ 256*16ebf90aSShri Abhyankar countA = ai[i+1] - ai[i]; 257*16ebf90aSShri Abhyankar countB = bi[i+1] - bi[i]; 258*16ebf90aSShri Abhyankar bjj = bj + bi[i]; 259*16ebf90aSShri Abhyankar v1 = av + ai[i]; 260*16ebf90aSShri Abhyankar v2 = bv + bi[i]; 261*16ebf90aSShri Abhyankar 262*16ebf90aSShri Abhyankar /* A-part */ 263*16ebf90aSShri Abhyankar for (j=0; j<countA; j++){ 264*16ebf90aSShri Abhyankar if (!valOnly){ 265*16ebf90aSShri Abhyankar row[jj] = irow + shift; col[jj] = rstart + ajj[j] + shift; 266*16ebf90aSShri Abhyankar } 267*16ebf90aSShri Abhyankar val[jj++] = v1[j]; 268*16ebf90aSShri Abhyankar } 269*16ebf90aSShri Abhyankar 270*16ebf90aSShri Abhyankar /* B-part */ 271*16ebf90aSShri Abhyankar for(j=0; j < countB; j++){ 272*16ebf90aSShri Abhyankar if (j == countB) break; 273*16ebf90aSShri Abhyankar if (!valOnly){ 274*16ebf90aSShri Abhyankar row[jj] = irow + shift; col[jj] = garray[bjj[j]] + shift; 275*16ebf90aSShri Abhyankar } 276*16ebf90aSShri Abhyankar val[jj++] = v2[j]; 277*16ebf90aSShri Abhyankar } 278*16ebf90aSShri Abhyankar irow++; 279*16ebf90aSShri Abhyankar } 280*16ebf90aSShri Abhyankar PetscFunctionReturn(0); 281*16ebf90aSShri Abhyankar } 282*16ebf90aSShri Abhyankar 283*16ebf90aSShri Abhyankar #undef __FUNCT__ 284*16ebf90aSShri Abhyankar #define __FUNCT__ "MatConvertToTriples_mpiaij_mpisbaij" 285*16ebf90aSShri Abhyankar PetscErrorCode MatConvertToTriples_mpiaij_mpisbaij(Mat A,int shift,PetscTruth valOnly,int *nnz,int **r, int **c, PetscScalar **v) 286*16ebf90aSShri Abhyankar { 287*16ebf90aSShri Abhyankar const PetscInt *ai, *aj,*adiag, *bi, *bj,*garray,m=A->rmap->n,*ajj,*bjj; 288*16ebf90aSShri Abhyankar PetscErrorCode ierr; 289*16ebf90aSShri Abhyankar PetscInt rstart,nz,nza,nzb_low,i,j,jj,irow,countA,countB; 290*16ebf90aSShri Abhyankar PetscInt *row,*col; 291*16ebf90aSShri Abhyankar const PetscScalar *av, *bv,*v1,*v2; 292*16ebf90aSShri Abhyankar PetscScalar *val; 293*16ebf90aSShri Abhyankar Mat_MPIAIJ *mat = (Mat_MPIAIJ*)A->data; 294*16ebf90aSShri Abhyankar Mat_SeqAIJ *aa=(Mat_SeqAIJ*)(mat->A)->data; 295*16ebf90aSShri Abhyankar Mat_SeqAIJ *bb=(Mat_SeqAIJ*)(mat->B)->data; 296*16ebf90aSShri Abhyankar 297*16ebf90aSShri Abhyankar PetscFunctionBegin; 298*16ebf90aSShri Abhyankar ai=aa->i; aj=aa->j; adiag=aa->diag; 299*16ebf90aSShri Abhyankar bi=bb->i; bj=bb->j; garray = mat->garray; 300*16ebf90aSShri Abhyankar av=aa->a; bv=bb->a; 301*16ebf90aSShri Abhyankar rstart = A->rmap->rstart; 302*16ebf90aSShri Abhyankar 303*16ebf90aSShri Abhyankar if (!valOnly){ 304*16ebf90aSShri Abhyankar nza = 0;nzb_low = 0; 305*16ebf90aSShri Abhyankar for(i=0; i<m; i++){ 306*16ebf90aSShri Abhyankar nza = nza + (ai[i+1] - adiag[i]); 307*16ebf90aSShri Abhyankar countB = bi[i+1] - bi[i]; 308*16ebf90aSShri Abhyankar bjj = bj + bi[i]; 309*16ebf90aSShri Abhyankar 310*16ebf90aSShri Abhyankar j = 0; 311*16ebf90aSShri Abhyankar while(garray[bjj[j]] < rstart) { 312*16ebf90aSShri Abhyankar if(j == countB) break; 313*16ebf90aSShri Abhyankar j++;nzb_low++; 314*16ebf90aSShri Abhyankar } 315*16ebf90aSShri Abhyankar } 316*16ebf90aSShri Abhyankar /* Total nz = nz for the upper triangular A part + nz for the 2nd B part */ 317*16ebf90aSShri Abhyankar nz = nza + (bb->nz - nzb_low); 318*16ebf90aSShri Abhyankar *nnz = nz; 319*16ebf90aSShri Abhyankar ierr = PetscMalloc(nz*sizeof(PetscInt) ,&row);CHKERRQ(ierr); 320*16ebf90aSShri Abhyankar ierr = PetscMalloc(nz*sizeof(PetscInt),&col);CHKERRQ(ierr); 321*16ebf90aSShri Abhyankar ierr = PetscMalloc(nz*sizeof(PetscScalar),&val);CHKERRQ(ierr); 322*16ebf90aSShri Abhyankar *r = row; *c = col; *v = val; 323*16ebf90aSShri Abhyankar } else { 324*16ebf90aSShri Abhyankar row = *r; col = *c; val = *v; 325*16ebf90aSShri Abhyankar } 326*16ebf90aSShri Abhyankar 327*16ebf90aSShri Abhyankar jj = 0; irow = rstart; 328*16ebf90aSShri Abhyankar for ( i=0; i<m; i++ ) { 329*16ebf90aSShri Abhyankar ajj = aj + adiag[i]; /* ptr to the beginning of the diagonal of this row */ 330*16ebf90aSShri Abhyankar v1 = av + adiag[i]; 331*16ebf90aSShri Abhyankar countA = ai[i+1] - adiag[i]; 332*16ebf90aSShri Abhyankar countB = bi[i+1] - bi[i]; 333*16ebf90aSShri Abhyankar bjj = bj + bi[i]; 334*16ebf90aSShri Abhyankar v2 = bv + bi[i]; 335*16ebf90aSShri Abhyankar 336*16ebf90aSShri Abhyankar /* A-part */ 337*16ebf90aSShri Abhyankar for (j=0; j<countA; j++){ 338*16ebf90aSShri Abhyankar if (!valOnly){ 339*16ebf90aSShri Abhyankar row[jj] = irow + shift; col[jj] = rstart + ajj[j] + shift; 340*16ebf90aSShri Abhyankar } 341*16ebf90aSShri Abhyankar val[jj++] = v1[j]; 342*16ebf90aSShri Abhyankar } 343*16ebf90aSShri Abhyankar 344*16ebf90aSShri Abhyankar /* B-part */ 345*16ebf90aSShri Abhyankar for(j=0; j < countB; j++){ 346*16ebf90aSShri Abhyankar if (j == countB) break; 347*16ebf90aSShri Abhyankar if (garray[bjj[j]] > rstart) { 348*16ebf90aSShri Abhyankar if (!valOnly){ 349*16ebf90aSShri Abhyankar row[jj] = irow + shift; col[jj] = garray[bjj[j]] + shift; 350*16ebf90aSShri Abhyankar } 351*16ebf90aSShri Abhyankar val[jj++] = v2[j]; 352*16ebf90aSShri Abhyankar } 353397b6df1SKris Buschelman } 354397b6df1SKris Buschelman irow++; 355397b6df1SKris Buschelman } 356397b6df1SKris Buschelman PetscFunctionReturn(0); 357397b6df1SKris Buschelman } 358397b6df1SKris Buschelman 359397b6df1SKris Buschelman #undef __FUNCT__ 3603924e44cSKris Buschelman #define __FUNCT__ "MatDestroy_MUMPS" 361dfbe8321SBarry Smith PetscErrorCode MatDestroy_MUMPS(Mat A) 362dfbe8321SBarry Smith { 363f0c56d0fSKris Buschelman Mat_MUMPS *lu=(Mat_MUMPS*)A->spptr; 364dfbe8321SBarry Smith PetscErrorCode ierr; 365c1490034SHong Zhang PetscMPIInt size=lu->size; 366b24902e0SBarry Smith 367397b6df1SKris Buschelman PetscFunctionBegin; 368397b6df1SKris Buschelman if (lu->CleanUpMUMPS) { 369397b6df1SKris Buschelman /* Terminate instance, deallocate memories */ 370329ec9b3SHong Zhang if (size > 1){ 37168653410SBarry Smith ierr = PetscFree2(lu->id.sol_loc,lu->id.isol_loc);CHKERRQ(ierr); 372329ec9b3SHong Zhang ierr = VecScatterDestroy(lu->scat_rhs);CHKERRQ(ierr); 373329ec9b3SHong Zhang ierr = VecDestroy(lu->b_seq);CHKERRQ(ierr); 3742750af12SHong Zhang if (lu->nSolve && lu->scat_sol){ierr = VecScatterDestroy(lu->scat_sol);CHKERRQ(ierr);} 3752750af12SHong Zhang if (lu->nSolve && lu->x_seq){ierr = VecDestroy(lu->x_seq);CHKERRQ(ierr);} 376329ec9b3SHong Zhang ierr = PetscFree(lu->val);CHKERRQ(ierr); 377329ec9b3SHong Zhang } 378*16ebf90aSShri Abhyankar if( size == 1 && A->factortype == MAT_FACTOR_CHOLESKY && lu->isAIJ) { 379450b117fSShri Abhyankar ierr = PetscFree(lu->val);CHKERRQ(ierr); 380450b117fSShri Abhyankar } 381397b6df1SKris Buschelman lu->id.job=JOB_END; 382397b6df1SKris Buschelman #if defined(PETSC_USE_COMPLEX) 383397b6df1SKris Buschelman zmumps_c(&lu->id); 384397b6df1SKris Buschelman #else 385397b6df1SKris Buschelman dmumps_c(&lu->id); 386397b6df1SKris Buschelman #endif 387c338a77dSKris Buschelman ierr = PetscFree(lu->irn);CHKERRQ(ierr); 388c338a77dSKris Buschelman ierr = PetscFree(lu->jcn);CHKERRQ(ierr); 389397b6df1SKris Buschelman ierr = MPI_Comm_free(&(lu->comm_mumps));CHKERRQ(ierr); 390397b6df1SKris Buschelman } 39197969023SHong Zhang /* clear composed functions */ 39297969023SHong Zhang ierr = PetscObjectComposeFunctionDynamic((PetscObject)A,"MatFactorGetSolverPackage_C","",PETSC_NULL);CHKERRQ(ierr); 39397969023SHong Zhang ierr = PetscObjectComposeFunctionDynamic((PetscObject)A,"MatMumpsSetIcntl_C","",PETSC_NULL);CHKERRQ(ierr); 39467334b25SHong Zhang ierr = (lu->MatDestroy)(A);CHKERRQ(ierr); 395397b6df1SKris Buschelman PetscFunctionReturn(0); 396397b6df1SKris Buschelman } 397397b6df1SKris Buschelman 398397b6df1SKris Buschelman #undef __FUNCT__ 399f6c57405SHong Zhang #define __FUNCT__ "MatSolve_MUMPS" 400b24902e0SBarry Smith PetscErrorCode MatSolve_MUMPS(Mat A,Vec b,Vec x) 401b24902e0SBarry Smith { 402f0c56d0fSKris Buschelman Mat_MUMPS *lu=(Mat_MUMPS*)A->spptr; 403d54de34fSKris Buschelman PetscScalar *array; 404397b6df1SKris Buschelman Vec x_seq; 405329ec9b3SHong Zhang IS is_iden,is_petsc; 406dfbe8321SBarry Smith PetscErrorCode ierr; 407329ec9b3SHong Zhang PetscInt i; 408397b6df1SKris Buschelman 409397b6df1SKris Buschelman PetscFunctionBegin; 410329ec9b3SHong Zhang lu->id.nrhs = 1; 411329ec9b3SHong Zhang x_seq = lu->b_seq; 412397b6df1SKris Buschelman if (lu->size > 1){ 413329ec9b3SHong Zhang /* MUMPS only supports centralized rhs. Scatter b into a seqential rhs vector */ 414f6cfb2d1SLisandro Dalcin ierr = VecScatterBegin(lu->scat_rhs,b,x_seq,INSERT_VALUES,SCATTER_FORWARD);CHKERRQ(ierr); 415f6cfb2d1SLisandro Dalcin ierr = VecScatterEnd(lu->scat_rhs,b,x_seq,INSERT_VALUES,SCATTER_FORWARD);CHKERRQ(ierr); 416397b6df1SKris Buschelman if (!lu->myid) {ierr = VecGetArray(x_seq,&array);CHKERRQ(ierr);} 417397b6df1SKris Buschelman } else { /* size == 1 */ 418397b6df1SKris Buschelman ierr = VecCopy(b,x);CHKERRQ(ierr); 419397b6df1SKris Buschelman ierr = VecGetArray(x,&array);CHKERRQ(ierr); 420397b6df1SKris Buschelman } 421397b6df1SKris Buschelman if (!lu->myid) { /* define rhs on the host */ 4228278f211SHong Zhang lu->id.nrhs = 1; 423397b6df1SKris Buschelman #if defined(PETSC_USE_COMPLEX) 424397b6df1SKris Buschelman lu->id.rhs = (mumps_double_complex*)array; 425397b6df1SKris Buschelman #else 426397b6df1SKris Buschelman lu->id.rhs = array; 427397b6df1SKris Buschelman #endif 428397b6df1SKris Buschelman } 429329ec9b3SHong Zhang if (lu->size == 1){ 430329ec9b3SHong Zhang ierr = VecRestoreArray(x,&array);CHKERRQ(ierr); 431329ec9b3SHong Zhang } else if (!lu->myid){ 432329ec9b3SHong Zhang ierr = VecRestoreArray(x_seq,&array);CHKERRQ(ierr); 433329ec9b3SHong Zhang } 434329ec9b3SHong Zhang 435329ec9b3SHong Zhang if (lu->size > 1){ 436329ec9b3SHong Zhang /* distributed solution */ 437329ec9b3SHong Zhang lu->id.ICNTL(21) = 1; 438329ec9b3SHong Zhang if (!lu->nSolve){ 439329ec9b3SHong Zhang /* Create x_seq=sol_loc for repeated use */ 440329ec9b3SHong Zhang PetscInt lsol_loc; 441329ec9b3SHong Zhang PetscScalar *sol_loc; 442329ec9b3SHong Zhang lsol_loc = lu->id.INFO(23); /* length of sol_loc */ 4430e83c824SBarry Smith ierr = PetscMalloc2(lsol_loc,PetscScalar,&sol_loc,lsol_loc,PetscInt,&lu->id.isol_loc);CHKERRQ(ierr); 444329ec9b3SHong Zhang lu->id.lsol_loc = lsol_loc; 44544ea04b1SSatish Balay #if defined(PETSC_USE_COMPLEX) 44644ea04b1SSatish Balay lu->id.sol_loc = (mumps_double_complex*)sol_loc; 44744ea04b1SSatish Balay #else 44844ea04b1SSatish Balay lu->id.sol_loc = sol_loc; 44944ea04b1SSatish Balay #endif 450329ec9b3SHong Zhang ierr = VecCreateSeqWithArray(PETSC_COMM_SELF,lsol_loc,sol_loc,&lu->x_seq);CHKERRQ(ierr); 451329ec9b3SHong Zhang } 452329ec9b3SHong Zhang } 453397b6df1SKris Buschelman 454397b6df1SKris Buschelman /* solve phase */ 455329ec9b3SHong Zhang /*-------------*/ 456397b6df1SKris Buschelman lu->id.job = 3; 457397b6df1SKris Buschelman #if defined(PETSC_USE_COMPLEX) 458397b6df1SKris Buschelman zmumps_c(&lu->id); 459397b6df1SKris Buschelman #else 460397b6df1SKris Buschelman dmumps_c(&lu->id); 461397b6df1SKris Buschelman #endif 46265e19b50SBarry Smith if (lu->id.INFOG(1) < 0) SETERRQ1(PETSC_COMM_SELF,PETSC_ERR_LIB,"Error reported by MUMPS in solve phase: INFOG(1)=%d\n",lu->id.INFOG(1)); 463397b6df1SKris Buschelman 464329ec9b3SHong Zhang if (lu->size > 1) { /* convert mumps distributed solution to petsc mpi x */ 465329ec9b3SHong Zhang if (!lu->nSolve){ /* create scatter scat_sol */ 466329ec9b3SHong Zhang ierr = ISCreateStride(PETSC_COMM_SELF,lu->id.lsol_loc,0,1,&is_iden);CHKERRQ(ierr); /* from */ 467329ec9b3SHong Zhang for (i=0; i<lu->id.lsol_loc; i++){ 468329ec9b3SHong Zhang lu->id.isol_loc[i] -= 1; /* change Fortran style to C style */ 469397b6df1SKris Buschelman } 470329ec9b3SHong Zhang ierr = ISCreateGeneral(PETSC_COMM_SELF,lu->id.lsol_loc,lu->id.isol_loc,&is_petsc);CHKERRQ(ierr); /* to */ 471329ec9b3SHong Zhang ierr = VecScatterCreate(lu->x_seq,is_iden,x,is_petsc,&lu->scat_sol);CHKERRQ(ierr); 472329ec9b3SHong Zhang ierr = ISDestroy(is_iden);CHKERRQ(ierr); 473329ec9b3SHong Zhang ierr = ISDestroy(is_petsc);CHKERRQ(ierr); 474397b6df1SKris Buschelman } 475ca9f406cSSatish Balay ierr = VecScatterBegin(lu->scat_sol,lu->x_seq,x,INSERT_VALUES,SCATTER_FORWARD);CHKERRQ(ierr); 476ca9f406cSSatish Balay ierr = VecScatterEnd(lu->scat_sol,lu->x_seq,x,INSERT_VALUES,SCATTER_FORWARD);CHKERRQ(ierr); 477329ec9b3SHong Zhang } 478329ec9b3SHong Zhang lu->nSolve++; 479397b6df1SKris Buschelman PetscFunctionReturn(0); 480397b6df1SKris Buschelman } 481397b6df1SKris Buschelman 482ace3df97SHong Zhang #if !defined(PETSC_USE_COMPLEX) 483a58c3f20SHong Zhang /* 484a58c3f20SHong Zhang input: 485a58c3f20SHong Zhang F: numeric factor 486a58c3f20SHong Zhang output: 487a58c3f20SHong Zhang nneg: total number of negative pivots 488a58c3f20SHong Zhang nzero: 0 489a58c3f20SHong Zhang npos: (global dimension of F) - nneg 490a58c3f20SHong Zhang */ 491a58c3f20SHong Zhang 492a58c3f20SHong Zhang #undef __FUNCT__ 493a58c3f20SHong Zhang #define __FUNCT__ "MatGetInertia_SBAIJMUMPS" 494dfbe8321SBarry Smith PetscErrorCode MatGetInertia_SBAIJMUMPS(Mat F,int *nneg,int *nzero,int *npos) 495a58c3f20SHong Zhang { 496a58c3f20SHong Zhang Mat_MUMPS *lu =(Mat_MUMPS*)F->spptr; 497dfbe8321SBarry Smith PetscErrorCode ierr; 498c1490034SHong Zhang PetscMPIInt size; 499a58c3f20SHong Zhang 500a58c3f20SHong Zhang PetscFunctionBegin; 5017adad957SLisandro Dalcin ierr = MPI_Comm_size(((PetscObject)F)->comm,&size);CHKERRQ(ierr); 502bcb30aebSHong 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 */ 50365e19b50SBarry Smith if (size > 1 && lu->id.ICNTL(13) != 1) SETERRQ1(PETSC_COMM_SELF,PETSC_ERR_ARG_WRONG,"ICNTL(13)=%d. -mat_mumps_icntl_13 must be set as 1 for correct global matrix inertia\n",lu->id.INFOG(13)); 504a58c3f20SHong Zhang if (nneg){ 505a58c3f20SHong Zhang if (!lu->myid){ 506a58c3f20SHong Zhang *nneg = lu->id.INFOG(12); 507a58c3f20SHong Zhang } 508bcb30aebSHong Zhang ierr = MPI_Bcast(nneg,1,MPI_INT,0,lu->comm_mumps);CHKERRQ(ierr); 509a58c3f20SHong Zhang } 510a58c3f20SHong Zhang if (nzero) *nzero = 0; 511d0f46423SBarry Smith if (npos) *npos = F->rmap->N - (*nneg); 512a58c3f20SHong Zhang PetscFunctionReturn(0); 513a58c3f20SHong Zhang } 514ace3df97SHong Zhang #endif /* !defined(PETSC_USE_COMPLEX) */ 515a58c3f20SHong Zhang 516397b6df1SKris Buschelman #undef __FUNCT__ 517f6c57405SHong Zhang #define __FUNCT__ "MatFactorNumeric_MUMPS" 5180481f469SBarry Smith PetscErrorCode MatFactorNumeric_MUMPS(Mat F,Mat A,const MatFactorInfo *info) 519af281ebdSHong Zhang { 520dcd589f8SShri Abhyankar Mat_MUMPS *lu =(Mat_MUMPS*)(F)->spptr; 5216849ba73SBarry Smith PetscErrorCode ierr; 522*16ebf90aSShri Abhyankar const PetscInt M=A->rmap->N; 523dcd589f8SShri Abhyankar PetscTruth valOnly; 524e09efc27SHong Zhang Mat F_diag; 525c349612cSHong Zhang IS is_iden; 526c349612cSHong Zhang Vec b; 527*16ebf90aSShri Abhyankar PetscTruth isMPIAIJ; 528397b6df1SKris Buschelman 529397b6df1SKris Buschelman PetscFunctionBegin; 530*16ebf90aSShri Abhyankar valOnly = PETSC_TRUE; 531*16ebf90aSShri Abhyankar ierr = (*lu->ConvertToTriples)(A, 1, valOnly, &lu->nz, &lu->irn, &lu->jcn, &lu->val);CHKERRQ(ierr); 532397b6df1SKris Buschelman /* analysis phase */ 533329ec9b3SHong Zhang /*----------------*/ 534397b6df1SKris Buschelman if (lu->matstruc == DIFFERENT_NONZERO_PATTERN){ 535329ec9b3SHong Zhang lu->id.job = 1; 536329ec9b3SHong Zhang 537397b6df1SKris Buschelman lu->id.n = M; 538397b6df1SKris Buschelman switch (lu->id.ICNTL(18)){ 539397b6df1SKris Buschelman case 0: /* centralized assembled matrix input */ 540397b6df1SKris Buschelman if (!lu->myid) { 541*16ebf90aSShri Abhyankar lu->id.nz =lu->nz; lu->id.irn=lu->irn; lu->id.jcn=lu->jcn; 542397b6df1SKris Buschelman if (lu->id.ICNTL(6)>1){ 543397b6df1SKris Buschelman #if defined(PETSC_USE_COMPLEX) 544397b6df1SKris Buschelman lu->id.a = (mumps_double_complex*)lu->val; 545397b6df1SKris Buschelman #else 546397b6df1SKris Buschelman lu->id.a = lu->val; 547397b6df1SKris Buschelman #endif 548397b6df1SKris Buschelman } 549397b6df1SKris Buschelman } 550397b6df1SKris Buschelman break; 551397b6df1SKris Buschelman case 3: /* distributed assembled matrix input (size>1) */ 552*16ebf90aSShri Abhyankar lu->id.nz_loc = lu->nz; 553397b6df1SKris Buschelman lu->id.irn_loc=lu->irn; lu->id.jcn_loc=lu->jcn; 554397b6df1SKris Buschelman if (lu->id.ICNTL(6)>1) { 555397b6df1SKris Buschelman #if defined(PETSC_USE_COMPLEX) 556397b6df1SKris Buschelman lu->id.a_loc = (mumps_double_complex*)lu->val; 557397b6df1SKris Buschelman #else 558397b6df1SKris Buschelman lu->id.a_loc = lu->val; 559397b6df1SKris Buschelman #endif 560397b6df1SKris Buschelman } 561329ec9b3SHong Zhang /* MUMPS only supports centralized rhs. Create scatter scat_rhs for repeated use in MatSolve() */ 562329ec9b3SHong Zhang if (!lu->myid){ 563d0f46423SBarry Smith ierr = VecCreateSeq(PETSC_COMM_SELF,A->cmap->N,&lu->b_seq);CHKERRQ(ierr); 564d0f46423SBarry Smith ierr = ISCreateStride(PETSC_COMM_SELF,A->cmap->N,0,1,&is_iden);CHKERRQ(ierr); 565329ec9b3SHong Zhang } else { 566329ec9b3SHong Zhang ierr = VecCreateSeq(PETSC_COMM_SELF,0,&lu->b_seq);CHKERRQ(ierr); 567329ec9b3SHong Zhang ierr = ISCreateStride(PETSC_COMM_SELF,0,0,1,&is_iden);CHKERRQ(ierr); 568329ec9b3SHong Zhang } 5697adad957SLisandro Dalcin ierr = VecCreate(((PetscObject)A)->comm,&b);CHKERRQ(ierr); 570d0f46423SBarry Smith ierr = VecSetSizes(b,A->rmap->n,PETSC_DECIDE);CHKERRQ(ierr); 571329ec9b3SHong Zhang ierr = VecSetFromOptions(b);CHKERRQ(ierr); 572329ec9b3SHong Zhang 573329ec9b3SHong Zhang ierr = VecScatterCreate(b,is_iden,lu->b_seq,is_iden,&lu->scat_rhs);CHKERRQ(ierr); 574329ec9b3SHong Zhang ierr = ISDestroy(is_iden);CHKERRQ(ierr); 575329ec9b3SHong Zhang ierr = VecDestroy(b);CHKERRQ(ierr); 576397b6df1SKris Buschelman break; 577397b6df1SKris Buschelman } 578397b6df1SKris Buschelman #if defined(PETSC_USE_COMPLEX) 579397b6df1SKris Buschelman zmumps_c(&lu->id); 580397b6df1SKris Buschelman #else 581397b6df1SKris Buschelman dmumps_c(&lu->id); 582397b6df1SKris Buschelman #endif 58365e19b50SBarry Smith if (lu->id.INFOG(1) < 0) SETERRQ1(PETSC_COMM_SELF,PETSC_ERR_LIB,"Error reported by MUMPS in analysis phase: INFOG(1)=%d\n",lu->id.INFOG(1)); 584397b6df1SKris Buschelman } 585397b6df1SKris Buschelman 586397b6df1SKris Buschelman /* numerical factorization phase */ 587329ec9b3SHong Zhang /*-------------------------------*/ 588329ec9b3SHong Zhang lu->id.job = 2; 589958c9bccSBarry Smith if(!lu->id.ICNTL(18)) { 590a7aca84bSHong Zhang if (!lu->myid) { 591397b6df1SKris Buschelman #if defined(PETSC_USE_COMPLEX) 592397b6df1SKris Buschelman lu->id.a = (mumps_double_complex*)lu->val; 593397b6df1SKris Buschelman #else 594397b6df1SKris Buschelman lu->id.a = lu->val; 595397b6df1SKris Buschelman #endif 596397b6df1SKris Buschelman } 597397b6df1SKris Buschelman } else { 598397b6df1SKris Buschelman #if defined(PETSC_USE_COMPLEX) 599397b6df1SKris Buschelman lu->id.a_loc = (mumps_double_complex*)lu->val; 600397b6df1SKris Buschelman #else 601397b6df1SKris Buschelman lu->id.a_loc = lu->val; 602397b6df1SKris Buschelman #endif 603397b6df1SKris Buschelman } 604397b6df1SKris Buschelman #if defined(PETSC_USE_COMPLEX) 605397b6df1SKris Buschelman zmumps_c(&lu->id); 606397b6df1SKris Buschelman #else 607397b6df1SKris Buschelman dmumps_c(&lu->id); 608397b6df1SKris Buschelman #endif 609397b6df1SKris Buschelman if (lu->id.INFOG(1) < 0) { 61065e19b50SBarry Smith if (lu->id.INFO(1) == -13) SETERRQ1(PETSC_COMM_SELF,PETSC_ERR_LIB,"Error reported by MUMPS in numerical factorization phase: Cannot allocate required memory %d megabytes\n",lu->id.INFO(2)); 61165e19b50SBarry Smith else SETERRQ2(PETSC_COMM_SELF,PETSC_ERR_LIB,"Error reported by MUMPS in numerical factorization phase: INFO(1)=%d, INFO(2)=%d\n",lu->id.INFO(1),lu->id.INFO(2)); 612397b6df1SKris Buschelman } 61365e19b50SBarry Smith if (!lu->myid && lu->id.ICNTL(16) > 0) SETERRQ1(PETSC_COMM_SELF,PETSC_ERR_LIB," lu->id.ICNTL(16):=%d\n",lu->id.INFOG(16)); 614397b6df1SKris Buschelman 6158ada1bb4SHong Zhang if (lu->size > 1){ 616*16ebf90aSShri Abhyankar ierr = PetscTypeCompare((PetscObject)A,MATMPIAIJ,&isMPIAIJ);CHKERRQ(ierr); 617a214ac2aSShri Abhyankar if(isMPIAIJ) { 618dcd589f8SShri Abhyankar F_diag = ((Mat_MPIAIJ *)(F)->data)->A; 619e09efc27SHong Zhang } else { 620dcd589f8SShri Abhyankar F_diag = ((Mat_MPISBAIJ *)(F)->data)->A; 621e09efc27SHong Zhang } 622e09efc27SHong Zhang F_diag->assembled = PETSC_TRUE; 623329ec9b3SHong Zhang if (lu->nSolve){ 624329ec9b3SHong Zhang ierr = VecScatterDestroy(lu->scat_sol);CHKERRQ(ierr); 6250e83c824SBarry Smith ierr = PetscFree2(lu->id.sol_loc,lu->id.isol_loc);CHKERRQ(ierr); 626329ec9b3SHong Zhang ierr = VecDestroy(lu->x_seq);CHKERRQ(ierr); 627329ec9b3SHong Zhang } 6288ada1bb4SHong Zhang } 629dcd589f8SShri Abhyankar (F)->assembled = PETSC_TRUE; 630397b6df1SKris Buschelman lu->matstruc = SAME_NONZERO_PATTERN; 631ace87b0dSHong Zhang lu->CleanUpMUMPS = PETSC_TRUE; 632329ec9b3SHong Zhang lu->nSolve = 0; 633397b6df1SKris Buschelman PetscFunctionReturn(0); 634397b6df1SKris Buschelman } 635397b6df1SKris Buschelman 636dcd589f8SShri Abhyankar #undef __FUNCT__ 637dcd589f8SShri Abhyankar #define __FUNCT__ "PetscSetMUMPSOptions" 638dcd589f8SShri Abhyankar PetscErrorCode PetscSetMUMPSOptions(Mat F, Mat A) 639dcd589f8SShri Abhyankar { 640dcd589f8SShri Abhyankar Mat_MUMPS *lu = (Mat_MUMPS*)F->spptr; 641dcd589f8SShri Abhyankar PetscErrorCode ierr; 642dcd589f8SShri Abhyankar PetscInt icntl; 643dcd589f8SShri Abhyankar PetscTruth flg; 644dcd589f8SShri Abhyankar 645dcd589f8SShri Abhyankar PetscFunctionBegin; 646dcd589f8SShri Abhyankar ierr = PetscOptionsBegin(((PetscObject)A)->comm,((PetscObject)A)->prefix,"MUMPS Options","Mat");CHKERRQ(ierr); 647cb828f0fSHong Zhang ierr = PetscOptionsTruth("-mat_mumps_view","View MUMPS parameters","None",lu->mumpsview,&lu->mumpsview,PETSC_NULL);CHKERRQ(ierr); 648dcd589f8SShri Abhyankar if (lu->size == 1){ 649dcd589f8SShri Abhyankar lu->id.ICNTL(18) = 0; /* centralized assembled matrix input */ 650dcd589f8SShri Abhyankar } else { 651dcd589f8SShri Abhyankar lu->id.ICNTL(18) = 3; /* distributed assembled matrix input */ 652dcd589f8SShri Abhyankar } 653dcd589f8SShri Abhyankar 654dcd589f8SShri Abhyankar icntl=-1; 655dcd589f8SShri Abhyankar lu->id.ICNTL(4) = 0; /* level of printing; overwrite mumps default ICNTL(4)=2 */ 656dcd589f8SShri Abhyankar ierr = PetscOptionsInt("-mat_mumps_icntl_4","ICNTL(4): level of printing (0 to 4)","None",lu->id.ICNTL(4),&icntl,&flg);CHKERRQ(ierr); 657dcd589f8SShri Abhyankar if ((flg && icntl > 0) || PetscLogPrintInfo) { 658dcd589f8SShri Abhyankar lu->id.ICNTL(4)=icntl; /* and use mumps default icntl(i), i=1,2,3 */ 659dcd589f8SShri Abhyankar } else { /* no output */ 660dcd589f8SShri Abhyankar lu->id.ICNTL(1) = 0; /* error message, default= 6 */ 661dcd589f8SShri Abhyankar lu->id.ICNTL(2) = 0; /* output stream for diagnostic printing, statistics, and warning. default=0 */ 662dcd589f8SShri Abhyankar lu->id.ICNTL(3) = 0; /* output stream for global information, default=6 */ 663dcd589f8SShri Abhyankar } 664dcd589f8SShri Abhyankar ierr = PetscOptionsInt("-mat_mumps_icntl_6","ICNTL(6): column permutation and/or scaling to get a zero-free diagonal (0 to 7)","None",lu->id.ICNTL(6),&lu->id.ICNTL(6),PETSC_NULL);CHKERRQ(ierr); 665dcd589f8SShri Abhyankar icntl=-1; 666dcd589f8SShri Abhyankar ierr = PetscOptionsInt("-mat_mumps_icntl_7","ICNTL(7): matrix ordering (0 to 7)","None",lu->id.ICNTL(7),&icntl,&flg);CHKERRQ(ierr); 667dcd589f8SShri Abhyankar if (flg) { 668dcd589f8SShri Abhyankar if (icntl== 1){ 669e32f2f54SBarry Smith SETERRQ(PETSC_COMM_SELF,PETSC_ERR_SUP,"pivot order be set by the user in PERM_IN -- not supported by the PETSc/MUMPS interface\n"); 670dcd589f8SShri Abhyankar } else { 671dcd589f8SShri Abhyankar lu->id.ICNTL(7) = icntl; 672dcd589f8SShri Abhyankar } 673dcd589f8SShri Abhyankar } 674dcd589f8SShri Abhyankar ierr = PetscOptionsInt("-mat_mumps_icntl_8","ICNTL(8): scaling strategy (-2 to 7 or 77)","None",lu->id.ICNTL(8),&lu->id.ICNTL(8),PETSC_NULL);CHKERRQ(ierr); 675dcd589f8SShri Abhyankar ierr = PetscOptionsInt("-mat_mumps_icntl_9","ICNTL(9): A or A^T x=b to be solved. 1: A; otherwise: A^T","None",lu->id.ICNTL(9),&lu->id.ICNTL(9),PETSC_NULL);CHKERRQ(ierr); 676dcd589f8SShri Abhyankar ierr = PetscOptionsInt("-mat_mumps_icntl_10","ICNTL(10): max num of refinements","None",lu->id.ICNTL(10),&lu->id.ICNTL(10),PETSC_NULL);CHKERRQ(ierr); 677dcd589f8SShri Abhyankar ierr = PetscOptionsInt("-mat_mumps_icntl_11","ICNTL(11): statistics related to the linear system solved (via -ksp_view)","None",lu->id.ICNTL(11),&lu->id.ICNTL(11),PETSC_NULL);CHKERRQ(ierr); 678dcd589f8SShri Abhyankar ierr = PetscOptionsInt("-mat_mumps_icntl_12","ICNTL(12): efficiency control: defines the ordering strategy with scaling constraints (0 to 3","None",lu->id.ICNTL(12),&lu->id.ICNTL(12),PETSC_NULL);CHKERRQ(ierr); 679dcd589f8SShri Abhyankar ierr = PetscOptionsInt("-mat_mumps_icntl_13","ICNTL(13): efficiency control: with or without ScaLAPACK","None",lu->id.ICNTL(13),&lu->id.ICNTL(13),PETSC_NULL);CHKERRQ(ierr); 680dcd589f8SShri Abhyankar ierr = PetscOptionsInt("-mat_mumps_icntl_14","ICNTL(14): percentage of estimated workspace increase","None",lu->id.ICNTL(14),&lu->id.ICNTL(14),PETSC_NULL);CHKERRQ(ierr); 681dcd589f8SShri Abhyankar ierr = PetscOptionsInt("-mat_mumps_icntl_19","ICNTL(19): Schur complement","None",lu->id.ICNTL(19),&lu->id.ICNTL(19),PETSC_NULL);CHKERRQ(ierr); 682dcd589f8SShri Abhyankar 683dcd589f8SShri Abhyankar ierr = PetscOptionsInt("-mat_mumps_icntl_22","ICNTL(22): in-core/out-of-core facility (0 or 1)","None",lu->id.ICNTL(22),&lu->id.ICNTL(22),PETSC_NULL);CHKERRQ(ierr); 684dcd589f8SShri Abhyankar ierr = PetscOptionsInt("-mat_mumps_icntl_23","ICNTL(23): max size of the working memory (MB) that can allocate per processor","None",lu->id.ICNTL(23),&lu->id.ICNTL(23),PETSC_NULL);CHKERRQ(ierr); 685dcd589f8SShri Abhyankar ierr = PetscOptionsInt("-mat_mumps_icntl_24","ICNTL(24): detection of null pivot rows (0 or 1)","None",lu->id.ICNTL(24),&lu->id.ICNTL(24),PETSC_NULL);CHKERRQ(ierr); 686dcd589f8SShri Abhyankar ierr = PetscOptionsInt("-mat_mumps_icntl_25","ICNTL(25): computation of a null space basis","None",lu->id.ICNTL(25),&lu->id.ICNTL(25),PETSC_NULL);CHKERRQ(ierr); 687dcd589f8SShri Abhyankar ierr = PetscOptionsInt("-mat_mumps_icntl_26","ICNTL(26): Schur options for right-hand side or solution vector","None",lu->id.ICNTL(26),&lu->id.ICNTL(26),PETSC_NULL);CHKERRQ(ierr); 688dcd589f8SShri Abhyankar ierr = PetscOptionsInt("-mat_mumps_icntl_27","ICNTL(27): experimental parameter","None",lu->id.ICNTL(27),&lu->id.ICNTL(27),PETSC_NULL);CHKERRQ(ierr); 689dcd589f8SShri Abhyankar 690dcd589f8SShri Abhyankar ierr = PetscOptionsReal("-mat_mumps_cntl_1","CNTL(1): relative pivoting threshold","None",lu->id.CNTL(1),&lu->id.CNTL(1),PETSC_NULL);CHKERRQ(ierr); 691dcd589f8SShri Abhyankar ierr = PetscOptionsReal("-mat_mumps_cntl_2","CNTL(2): stopping criterion of refinement","None",lu->id.CNTL(2),&lu->id.CNTL(2),PETSC_NULL);CHKERRQ(ierr); 692dcd589f8SShri Abhyankar ierr = PetscOptionsReal("-mat_mumps_cntl_3","CNTL(3): absolute pivoting threshold","None",lu->id.CNTL(3),&lu->id.CNTL(3),PETSC_NULL);CHKERRQ(ierr); 693dcd589f8SShri Abhyankar ierr = PetscOptionsReal("-mat_mumps_cntl_4","CNTL(4): value for static pivoting","None",lu->id.CNTL(4),&lu->id.CNTL(4),PETSC_NULL);CHKERRQ(ierr); 694dcd589f8SShri Abhyankar ierr = PetscOptionsReal("-mat_mumps_cntl_5","CNTL(5): fixation for null pivots","None",lu->id.CNTL(5),&lu->id.CNTL(5),PETSC_NULL);CHKERRQ(ierr); 695dcd589f8SShri Abhyankar PetscOptionsEnd(); 696dcd589f8SShri Abhyankar PetscFunctionReturn(0); 697dcd589f8SShri Abhyankar } 698dcd589f8SShri Abhyankar 699dcd589f8SShri Abhyankar #undef __FUNCT__ 700dcd589f8SShri Abhyankar #define __FUNCT__ "PetscInitializeMUMPS" 701dcd589f8SShri Abhyankar PetscErrorCode PetscInitializeMUMPS(Mat F) 702dcd589f8SShri Abhyankar { 703dcd589f8SShri Abhyankar Mat_MUMPS *lu = (Mat_MUMPS*)F->spptr; 704dcd589f8SShri Abhyankar PetscErrorCode ierr; 705dcd589f8SShri Abhyankar PetscInt icntl; 706dcd589f8SShri Abhyankar PetscTruth flg; 707dcd589f8SShri Abhyankar 708dcd589f8SShri Abhyankar PetscFunctionBegin; 709dcd589f8SShri Abhyankar lu->id.job = JOB_INIT; 710dcd589f8SShri Abhyankar lu->id.par=1; /* host participates factorizaton and solve */ 711dcd589f8SShri Abhyankar lu->id.sym=lu->sym; 712dcd589f8SShri Abhyankar if (lu->sym == 2){ 713dcd589f8SShri Abhyankar ierr = PetscOptionsInt("-mat_mumps_sym","SYM: (1,2)","None",lu->id.sym,&icntl,&flg);CHKERRQ(ierr); 714dcd589f8SShri Abhyankar if (flg && icntl == 1) lu->id.sym=icntl; /* matrix is spd */ 715dcd589f8SShri Abhyankar } 716dcd589f8SShri Abhyankar #if defined(PETSC_USE_COMPLEX) 717dcd589f8SShri Abhyankar zmumps_c(&lu->id); 718dcd589f8SShri Abhyankar #else 719dcd589f8SShri Abhyankar dmumps_c(&lu->id); 720dcd589f8SShri Abhyankar #endif 721dcd589f8SShri Abhyankar PetscFunctionReturn(0); 722dcd589f8SShri Abhyankar } 723dcd589f8SShri Abhyankar 724397b6df1SKris Buschelman /* Note the Petsc r and c permutations are ignored */ 725397b6df1SKris Buschelman #undef __FUNCT__ 726f0c56d0fSKris Buschelman #define __FUNCT__ "MatLUFactorSymbolic_AIJMUMPS" 7270481f469SBarry Smith PetscErrorCode MatLUFactorSymbolic_AIJMUMPS(Mat F,Mat A,IS r,IS c,const MatFactorInfo *info) 728b24902e0SBarry Smith { 729719d5645SBarry Smith Mat_MUMPS *lu = (Mat_MUMPS*)F->spptr; 730dcd589f8SShri Abhyankar PetscErrorCode ierr; 731dcd589f8SShri Abhyankar PetscTruth valOnly; 732397b6df1SKris Buschelman 733397b6df1SKris Buschelman PetscFunctionBegin; 734b24902e0SBarry Smith lu->sym = 0; 735b24902e0SBarry Smith lu->matstruc = DIFFERENT_NONZERO_PATTERN; 736dcd589f8SShri Abhyankar 737dcd589f8SShri Abhyankar ierr = MPI_Comm_rank(((PetscObject)A)->comm, &lu->myid); 738dcd589f8SShri Abhyankar ierr = MPI_Comm_size(((PetscObject)A)->comm,&lu->size);CHKERRQ(ierr); 739dcd589f8SShri Abhyankar ierr = MPI_Comm_dup(((PetscObject)A)->comm,&(lu->comm_mumps));CHKERRQ(ierr); 740dcd589f8SShri Abhyankar lu->id.comm_fortran = MPI_Comm_c2f(lu->comm_mumps); 741dcd589f8SShri Abhyankar 742dcd589f8SShri Abhyankar /* Initialize a MUMPS instance */ 743dcd589f8SShri Abhyankar ierr = PetscInitializeMUMPS(F);CHKERRQ(ierr); 744dcd589f8SShri Abhyankar /* Set MUMPS options */ 745dcd589f8SShri Abhyankar ierr = PetscSetMUMPSOptions(F,A);CHKERRQ(ierr); 746dcd589f8SShri Abhyankar 747dcd589f8SShri Abhyankar valOnly = PETSC_FALSE; 748*16ebf90aSShri Abhyankar ierr = (*lu->ConvertToTriples)(A, 1, valOnly, &lu->nz, &lu->irn, &lu->jcn, &lu->val);CHKERRQ(ierr); 749dcd589f8SShri Abhyankar 750719d5645SBarry Smith F->ops->lufactornumeric = MatFactorNumeric_MUMPS; 751dcd589f8SShri Abhyankar F->ops->solve = MatSolve_MUMPS; 752b24902e0SBarry Smith PetscFunctionReturn(0); 753b24902e0SBarry Smith } 754b24902e0SBarry Smith 755450b117fSShri Abhyankar /* Note the Petsc r and c permutations are ignored */ 756450b117fSShri Abhyankar #undef __FUNCT__ 757450b117fSShri Abhyankar #define __FUNCT__ "MatLUFactorSymbolic_BAIJMUMPS" 758450b117fSShri Abhyankar PetscErrorCode MatLUFactorSymbolic_BAIJMUMPS(Mat F,Mat A,IS r,IS c,const MatFactorInfo *info) 759450b117fSShri Abhyankar { 760dcd589f8SShri Abhyankar 761450b117fSShri Abhyankar Mat_MUMPS *lu = (Mat_MUMPS*)F->spptr; 762dcd589f8SShri Abhyankar PetscErrorCode ierr; 763450b117fSShri Abhyankar 764450b117fSShri Abhyankar PetscFunctionBegin; 765450b117fSShri Abhyankar lu->sym = 0; 766450b117fSShri Abhyankar lu->matstruc = DIFFERENT_NONZERO_PATTERN; 767dcd589f8SShri Abhyankar ierr = MPI_Comm_rank(((PetscObject)A)->comm, &lu->myid); 768dcd589f8SShri Abhyankar ierr = MPI_Comm_size(((PetscObject)A)->comm,&lu->size);CHKERRQ(ierr); 769dcd589f8SShri Abhyankar ierr = MPI_Comm_dup(((PetscObject)A)->comm,&(lu->comm_mumps));CHKERRQ(ierr); 770dcd589f8SShri Abhyankar lu->id.comm_fortran = MPI_Comm_c2f(lu->comm_mumps); 771dcd589f8SShri Abhyankar 772dcd589f8SShri Abhyankar /* Initialize a MUMPS instance */ 773dcd589f8SShri Abhyankar ierr = PetscInitializeMUMPS(F);CHKERRQ(ierr); 774dcd589f8SShri Abhyankar /* Set MUMPS options */ 775dcd589f8SShri Abhyankar ierr = PetscSetMUMPSOptions(F,A);CHKERRQ(ierr); 776dcd589f8SShri Abhyankar 777450b117fSShri Abhyankar F->ops->lufactornumeric = MatFactorNumeric_MUMPS; 778dcd589f8SShri Abhyankar F->ops->solve = MatSolve_MUMPS; 779450b117fSShri Abhyankar PetscFunctionReturn(0); 780450b117fSShri Abhyankar } 781b24902e0SBarry Smith 782397b6df1SKris Buschelman /* Note the Petsc r permutation is ignored */ 783397b6df1SKris Buschelman #undef __FUNCT__ 784f0c56d0fSKris Buschelman #define __FUNCT__ "MatCholeskyFactorSymbolic_SBAIJMUMPS" 7850481f469SBarry Smith PetscErrorCode MatCholeskyFactorSymbolic_SBAIJMUMPS(Mat F,Mat A,IS r,const MatFactorInfo *info) 786b24902e0SBarry Smith { 7872792810eSHong Zhang Mat_MUMPS *lu = (Mat_MUMPS*)F->spptr; 788dcd589f8SShri Abhyankar PetscErrorCode ierr; 789*16ebf90aSShri Abhyankar PetscTruth valOnly; 790397b6df1SKris Buschelman 791397b6df1SKris Buschelman PetscFunctionBegin; 792b24902e0SBarry Smith lu->sym = 2; 793b24902e0SBarry Smith lu->matstruc = DIFFERENT_NONZERO_PATTERN; 794dcd589f8SShri Abhyankar ierr = MPI_Comm_rank(((PetscObject)A)->comm, &lu->myid); 795dcd589f8SShri Abhyankar ierr = MPI_Comm_size(((PetscObject)A)->comm,&lu->size);CHKERRQ(ierr); 796dcd589f8SShri Abhyankar ierr = MPI_Comm_dup(((PetscObject)A)->comm,&(lu->comm_mumps));CHKERRQ(ierr); 797dcd589f8SShri Abhyankar lu->id.comm_fortran = MPI_Comm_c2f(lu->comm_mumps); 798dcd589f8SShri Abhyankar 799dcd589f8SShri Abhyankar /* Initialize a MUMPS instance */ 800dcd589f8SShri Abhyankar ierr = PetscInitializeMUMPS(F);CHKERRQ(ierr); 801dcd589f8SShri Abhyankar /* Set MUMPS options */ 802dcd589f8SShri Abhyankar ierr = PetscSetMUMPSOptions(F,A);CHKERRQ(ierr); 803dcd589f8SShri Abhyankar 804dcd589f8SShri Abhyankar valOnly = PETSC_FALSE; 805*16ebf90aSShri Abhyankar ierr = (*lu->ConvertToTriples)(A, 1 , valOnly, &lu->nz, &lu->irn, &lu->jcn, &lu->val);CHKERRQ(ierr); 806dcd589f8SShri Abhyankar 8072792810eSHong Zhang F->ops->choleskyfactornumeric = MatFactorNumeric_MUMPS; 808dcd589f8SShri Abhyankar F->ops->solve = MatSolve_MUMPS; 809db4efbfdSBarry Smith #if !defined(PETSC_USE_COMPLEX) 810dcd589f8SShri Abhyankar (F)->ops->getinertia = MatGetInertia_SBAIJMUMPS; 811db4efbfdSBarry Smith #endif 812b24902e0SBarry Smith PetscFunctionReturn(0); 813b24902e0SBarry Smith } 814b24902e0SBarry Smith 815397b6df1SKris Buschelman #undef __FUNCT__ 816f6c57405SHong Zhang #define __FUNCT__ "MatFactorInfo_MUMPS" 81774ed9c26SBarry Smith PetscErrorCode MatFactorInfo_MUMPS(Mat A,PetscViewer viewer) 81874ed9c26SBarry Smith { 819f6c57405SHong Zhang Mat_MUMPS *lu=(Mat_MUMPS*)A->spptr; 820f6c57405SHong Zhang PetscErrorCode ierr; 821f6c57405SHong Zhang 822f6c57405SHong Zhang PetscFunctionBegin; 823f6c57405SHong Zhang ierr = PetscViewerASCIIPrintf(viewer," ICNTL(1) (output for error): %d \n",lu->id.ICNTL(1));CHKERRQ(ierr); 824f6c57405SHong Zhang ierr = PetscViewerASCIIPrintf(viewer," ICNTL(2) (output of diagnostic msg):%d \n",lu->id.ICNTL(2));CHKERRQ(ierr); 825f6c57405SHong Zhang ierr = PetscViewerASCIIPrintf(viewer," ICNTL(3) (output for global info): %d \n",lu->id.ICNTL(3));CHKERRQ(ierr); 826f6c57405SHong Zhang ierr = PetscViewerASCIIPrintf(viewer," ICNTL(4) (level of printing): %d \n",lu->id.ICNTL(4));CHKERRQ(ierr); 827f6c57405SHong Zhang ierr = PetscViewerASCIIPrintf(viewer," ICNTL(5) (input mat struct): %d \n",lu->id.ICNTL(5));CHKERRQ(ierr); 828f6c57405SHong Zhang ierr = PetscViewerASCIIPrintf(viewer," ICNTL(6) (matrix prescaling): %d \n",lu->id.ICNTL(6));CHKERRQ(ierr); 829f6c57405SHong Zhang ierr = PetscViewerASCIIPrintf(viewer," ICNTL(7) (matrix ordering): %d \n",lu->id.ICNTL(7));CHKERRQ(ierr); 830f6c57405SHong Zhang ierr = PetscViewerASCIIPrintf(viewer," ICNTL(8) (scalling strategy): %d \n",lu->id.ICNTL(8));CHKERRQ(ierr); 831f6c57405SHong Zhang ierr = PetscViewerASCIIPrintf(viewer," ICNTL(9) (A/A^T x=b is solved): %d \n",lu->id.ICNTL(9));CHKERRQ(ierr); 832f6c57405SHong Zhang ierr = PetscViewerASCIIPrintf(viewer," ICNTL(10) (max num of refinements): %d \n",lu->id.ICNTL(10));CHKERRQ(ierr); 833f6c57405SHong Zhang ierr = PetscViewerASCIIPrintf(viewer," ICNTL(11) (error analysis): %d \n",lu->id.ICNTL(11));CHKERRQ(ierr); 834f6c57405SHong Zhang if (!lu->myid && lu->id.ICNTL(11)>0) { 835f6c57405SHong Zhang ierr = PetscPrintf(PETSC_COMM_SELF," RINFOG(4) (inf norm of input mat): %g\n",lu->id.RINFOG(4));CHKERRQ(ierr); 836f6c57405SHong Zhang ierr = PetscPrintf(PETSC_COMM_SELF," RINFOG(5) (inf norm of solution): %g\n",lu->id.RINFOG(5));CHKERRQ(ierr); 837f6c57405SHong Zhang ierr = PetscPrintf(PETSC_COMM_SELF," RINFOG(6) (inf norm of residual): %g\n",lu->id.RINFOG(6));CHKERRQ(ierr); 838f6c57405SHong Zhang ierr = PetscPrintf(PETSC_COMM_SELF," RINFOG(7),RINFOG(8) (backward error est): %g, %g\n",lu->id.RINFOG(7),lu->id.RINFOG(8));CHKERRQ(ierr); 839f6c57405SHong Zhang ierr = PetscPrintf(PETSC_COMM_SELF," RINFOG(9) (error estimate): %g \n",lu->id.RINFOG(9));CHKERRQ(ierr); 840f6c57405SHong Zhang ierr = PetscPrintf(PETSC_COMM_SELF," RINFOG(10),RINFOG(11)(condition numbers): %g, %g\n",lu->id.RINFOG(10),lu->id.RINFOG(11));CHKERRQ(ierr); 841f6c57405SHong Zhang 842f6c57405SHong Zhang } 843f6c57405SHong Zhang ierr = PetscViewerASCIIPrintf(viewer," ICNTL(12) (efficiency control): %d \n",lu->id.ICNTL(12));CHKERRQ(ierr); 844f6c57405SHong Zhang ierr = PetscViewerASCIIPrintf(viewer," ICNTL(13) (efficiency control): %d \n",lu->id.ICNTL(13));CHKERRQ(ierr); 845f6c57405SHong Zhang ierr = PetscViewerASCIIPrintf(viewer," ICNTL(14) (percentage of estimated workspace increase): %d \n",lu->id.ICNTL(14));CHKERRQ(ierr); 846f6c57405SHong Zhang /* ICNTL(15-17) not used */ 847f6c57405SHong Zhang ierr = PetscViewerASCIIPrintf(viewer," ICNTL(18) (input mat struct): %d \n",lu->id.ICNTL(18));CHKERRQ(ierr); 848f6c57405SHong Zhang ierr = PetscViewerASCIIPrintf(viewer," ICNTL(19) (Shur complement info): %d \n",lu->id.ICNTL(19));CHKERRQ(ierr); 849f6c57405SHong Zhang ierr = PetscViewerASCIIPrintf(viewer," ICNTL(20) (rhs sparse pattern): %d \n",lu->id.ICNTL(20));CHKERRQ(ierr); 850f6c57405SHong Zhang ierr = PetscViewerASCIIPrintf(viewer," ICNTL(21) (solution struct): %d \n",lu->id.ICNTL(21));CHKERRQ(ierr); 851c0165424SHong Zhang ierr = PetscViewerASCIIPrintf(viewer," ICNTL(22) (in-core/out-of-core facility): %d \n",lu->id.ICNTL(22));CHKERRQ(ierr); 852c0165424SHong Zhang ierr = PetscViewerASCIIPrintf(viewer," ICNTL(23) (max size of memory can be allocated locally):%d \n",lu->id.ICNTL(23));CHKERRQ(ierr); 853c0165424SHong Zhang 854c0165424SHong Zhang ierr = PetscViewerASCIIPrintf(viewer," ICNTL(24) (detection of null pivot rows): %d \n",lu->id.ICNTL(24));CHKERRQ(ierr); 855c0165424SHong Zhang ierr = PetscViewerASCIIPrintf(viewer," ICNTL(25) (computation of a null space basis): %d \n",lu->id.ICNTL(25));CHKERRQ(ierr); 856c0165424SHong Zhang ierr = PetscViewerASCIIPrintf(viewer," ICNTL(26) (Schur options for rhs or solution): %d \n",lu->id.ICNTL(26));CHKERRQ(ierr); 857c0165424SHong Zhang ierr = PetscViewerASCIIPrintf(viewer," ICNTL(27) (experimental parameter): %d \n",lu->id.ICNTL(27));CHKERRQ(ierr); 858f6c57405SHong Zhang 859f6c57405SHong Zhang ierr = PetscViewerASCIIPrintf(viewer," CNTL(1) (relative pivoting threshold): %g \n",lu->id.CNTL(1));CHKERRQ(ierr); 860f6c57405SHong Zhang ierr = PetscViewerASCIIPrintf(viewer," CNTL(2) (stopping criterion of refinement): %g \n",lu->id.CNTL(2));CHKERRQ(ierr); 861f6c57405SHong Zhang ierr = PetscViewerASCIIPrintf(viewer," CNTL(3) (absolute pivoting threshold): %g \n",lu->id.CNTL(3));CHKERRQ(ierr); 862f6c57405SHong Zhang ierr = PetscViewerASCIIPrintf(viewer," CNTL(4) (value of static pivoting): %g \n",lu->id.CNTL(4));CHKERRQ(ierr); 863c0165424SHong Zhang ierr = PetscViewerASCIIPrintf(viewer," CNTL(5) (fixation for null pivots): %g \n",lu->id.CNTL(5));CHKERRQ(ierr); 864f6c57405SHong Zhang 865f6c57405SHong Zhang /* infomation local to each processor */ 866f6c57405SHong Zhang if (!lu->myid) {ierr = PetscPrintf(PETSC_COMM_SELF, " RINFO(1) (local estimated flops for the elimination after analysis): \n");CHKERRQ(ierr);} 8677adad957SLisandro Dalcin ierr = PetscSynchronizedPrintf(((PetscObject)A)->comm," [%d] %g \n",lu->myid,lu->id.RINFO(1));CHKERRQ(ierr); 8687adad957SLisandro Dalcin ierr = PetscSynchronizedFlush(((PetscObject)A)->comm); 869f6c57405SHong Zhang if (!lu->myid) {ierr = PetscPrintf(PETSC_COMM_SELF, " RINFO(2) (local estimated flops for the assembly after factorization): \n");CHKERRQ(ierr);} 8707adad957SLisandro Dalcin ierr = PetscSynchronizedPrintf(((PetscObject)A)->comm," [%d] %g \n",lu->myid,lu->id.RINFO(2));CHKERRQ(ierr); 8717adad957SLisandro Dalcin ierr = PetscSynchronizedFlush(((PetscObject)A)->comm); 872f6c57405SHong Zhang if (!lu->myid) {ierr = PetscPrintf(PETSC_COMM_SELF, " RINFO(3) (local estimated flops for the elimination after factorization): \n");CHKERRQ(ierr);} 8737adad957SLisandro Dalcin ierr = PetscSynchronizedPrintf(((PetscObject)A)->comm," [%d] %g \n",lu->myid,lu->id.RINFO(3));CHKERRQ(ierr); 8747adad957SLisandro Dalcin ierr = PetscSynchronizedFlush(((PetscObject)A)->comm); 875f6c57405SHong Zhang 876f6c57405SHong Zhang if (!lu->myid) {ierr = PetscPrintf(PETSC_COMM_SELF, " INFO(15) (estimated size of (in MB) MUMPS internal data for running numerical factorization): \n");CHKERRQ(ierr);} 8777adad957SLisandro Dalcin ierr = PetscSynchronizedPrintf(((PetscObject)A)->comm," [%d] %d \n",lu->myid,lu->id.INFO(15));CHKERRQ(ierr); 8787adad957SLisandro Dalcin ierr = PetscSynchronizedFlush(((PetscObject)A)->comm); 879f6c57405SHong Zhang 880f6c57405SHong Zhang if (!lu->myid) {ierr = PetscPrintf(PETSC_COMM_SELF, " INFO(16) (size of (in MB) MUMPS internal data used during numerical factorization): \n");CHKERRQ(ierr);} 8817adad957SLisandro Dalcin ierr = PetscSynchronizedPrintf(((PetscObject)A)->comm," [%d] %d \n",lu->myid,lu->id.INFO(16));CHKERRQ(ierr); 8827adad957SLisandro Dalcin ierr = PetscSynchronizedFlush(((PetscObject)A)->comm); 883f6c57405SHong Zhang 884f6c57405SHong Zhang if (!lu->myid) {ierr = PetscPrintf(PETSC_COMM_SELF, " INFO(23) (num of pivots eliminated on this processor after factorization): \n");CHKERRQ(ierr);} 8857adad957SLisandro Dalcin ierr = PetscSynchronizedPrintf(((PetscObject)A)->comm," [%d] %d \n",lu->myid,lu->id.INFO(23));CHKERRQ(ierr); 8867adad957SLisandro Dalcin ierr = PetscSynchronizedFlush(((PetscObject)A)->comm); 887f6c57405SHong Zhang 888f6c57405SHong Zhang if (!lu->myid){ /* information from the host */ 889f6c57405SHong Zhang ierr = PetscViewerASCIIPrintf(viewer," RINFOG(1) (global estimated flops for the elimination after analysis): %g \n",lu->id.RINFOG(1));CHKERRQ(ierr); 890f6c57405SHong Zhang ierr = PetscViewerASCIIPrintf(viewer," RINFOG(2) (global estimated flops for the assembly after factorization): %g \n",lu->id.RINFOG(2));CHKERRQ(ierr); 891f6c57405SHong Zhang ierr = PetscViewerASCIIPrintf(viewer," RINFOG(3) (global estimated flops for the elimination after factorization): %g \n",lu->id.RINFOG(3));CHKERRQ(ierr); 892f6c57405SHong Zhang 893f6c57405SHong Zhang ierr = PetscViewerASCIIPrintf(viewer," INFOG(3) (estimated real workspace for factors on all processors after analysis): %d \n",lu->id.INFOG(3));CHKERRQ(ierr); 894f6c57405SHong Zhang ierr = PetscViewerASCIIPrintf(viewer," INFOG(4) (estimated integer workspace for factors on all processors after analysis): %d \n",lu->id.INFOG(4));CHKERRQ(ierr); 895f6c57405SHong Zhang ierr = PetscViewerASCIIPrintf(viewer," INFOG(5) (estimated maximum front size in the complete tree): %d \n",lu->id.INFOG(5));CHKERRQ(ierr); 896f6c57405SHong Zhang ierr = PetscViewerASCIIPrintf(viewer," INFOG(6) (number of nodes in the complete tree): %d \n",lu->id.INFOG(6));CHKERRQ(ierr); 897f6c57405SHong Zhang ierr = PetscViewerASCIIPrintf(viewer," INFOG(7) (ordering option effectively uese after analysis): %d \n",lu->id.INFOG(7));CHKERRQ(ierr); 898f6c57405SHong Zhang ierr = PetscViewerASCIIPrintf(viewer," INFOG(8) (structural symmetry in percent of the permuted matrix after analysis): %d \n",lu->id.INFOG(8));CHKERRQ(ierr); 899f6c57405SHong Zhang ierr = PetscViewerASCIIPrintf(viewer," INFOG(9) (total real/complex workspace to store the matrix factors after factorization): %d \n",lu->id.INFOG(9));CHKERRQ(ierr); 900f6c57405SHong Zhang ierr = PetscViewerASCIIPrintf(viewer," INFOG(10) (total integer space store the matrix factors after factorization): %d \n",lu->id.INFOG(10));CHKERRQ(ierr); 901f6c57405SHong Zhang ierr = PetscViewerASCIIPrintf(viewer," INFOG(11) (order of largest frontal matrix after factorization): %d \n",lu->id.INFOG(11));CHKERRQ(ierr); 902f6c57405SHong Zhang ierr = PetscViewerASCIIPrintf(viewer," INFOG(12) (number of off-diagonal pivots): %d \n",lu->id.INFOG(12));CHKERRQ(ierr); 903f6c57405SHong Zhang ierr = PetscViewerASCIIPrintf(viewer," INFOG(13) (number of delayed pivots after factorization): %d \n",lu->id.INFOG(13));CHKERRQ(ierr); 904f6c57405SHong Zhang ierr = PetscViewerASCIIPrintf(viewer," INFOG(14) (number of memory compress after factorization): %d \n",lu->id.INFOG(14));CHKERRQ(ierr); 905f6c57405SHong Zhang ierr = PetscViewerASCIIPrintf(viewer," INFOG(15) (number of steps of iterative refinement after solution): %d \n",lu->id.INFOG(15));CHKERRQ(ierr); 906f6c57405SHong Zhang ierr = PetscViewerASCIIPrintf(viewer," INFOG(16) (estimated size (in MB) of all MUMPS internal data for factorization after analysis: value on the most memory consuming processor): %d \n",lu->id.INFOG(16));CHKERRQ(ierr); 907f6c57405SHong Zhang ierr = PetscViewerASCIIPrintf(viewer," INFOG(17) (estimated size of all MUMPS internal data for factorization after analysis: sum over all processors): %d \n",lu->id.INFOG(17));CHKERRQ(ierr); 908f6c57405SHong Zhang ierr = PetscViewerASCIIPrintf(viewer," INFOG(18) (size of all MUMPS internal data allocated during factorization: value on the most memory consuming processor): %d \n",lu->id.INFOG(18));CHKERRQ(ierr); 909f6c57405SHong Zhang ierr = PetscViewerASCIIPrintf(viewer," INFOG(19) (size of all MUMPS internal data allocated during factorization: sum over all processors): %d \n",lu->id.INFOG(19));CHKERRQ(ierr); 910f6c57405SHong Zhang ierr = PetscViewerASCIIPrintf(viewer," INFOG(20) (estimated number of entries in the factors): %d \n",lu->id.INFOG(20));CHKERRQ(ierr); 911f6c57405SHong Zhang ierr = PetscViewerASCIIPrintf(viewer," INFOG(21) (size in MB of memory effectively used during factorization - value on the most memory consuming processor): %d \n",lu->id.INFOG(21));CHKERRQ(ierr); 912f6c57405SHong Zhang ierr = PetscViewerASCIIPrintf(viewer," INFOG(22) (size in MB of memory effectively used during factorization - sum over all processors): %d \n",lu->id.INFOG(22));CHKERRQ(ierr); 913f6c57405SHong Zhang ierr = PetscViewerASCIIPrintf(viewer," INFOG(23) (after analysis: value of ICNTL(6) effectively used): %d \n",lu->id.INFOG(23));CHKERRQ(ierr); 914f6c57405SHong Zhang ierr = PetscViewerASCIIPrintf(viewer," INFOG(24) (after analysis: value of ICNTL(12) effectively used): %d \n",lu->id.INFOG(24));CHKERRQ(ierr); 915f6c57405SHong Zhang ierr = PetscViewerASCIIPrintf(viewer," INFOG(25) (after factorization: number of pivots modified by static pivoting): %d \n",lu->id.INFOG(25));CHKERRQ(ierr); 916f6c57405SHong Zhang } 917f6c57405SHong Zhang PetscFunctionReturn(0); 918f6c57405SHong Zhang } 919f6c57405SHong Zhang 920f6c57405SHong Zhang #undef __FUNCT__ 921f6c57405SHong Zhang #define __FUNCT__ "MatView_MUMPS" 922b24902e0SBarry Smith PetscErrorCode MatView_MUMPS(Mat A,PetscViewer viewer) 923b24902e0SBarry Smith { 924f6c57405SHong Zhang PetscErrorCode ierr; 925f6c57405SHong Zhang PetscTruth iascii; 926f6c57405SHong Zhang PetscViewerFormat format; 927cb828f0fSHong Zhang Mat_MUMPS *mumps=(Mat_MUMPS*)A->spptr; 928f6c57405SHong Zhang 929f6c57405SHong Zhang PetscFunctionBegin; 930cb828f0fSHong Zhang /* check if matrix is mumps type */ 931cb828f0fSHong Zhang if (A->ops->solve != MatSolve_MUMPS) PetscFunctionReturn(0); 932cb828f0fSHong Zhang 933f6c57405SHong Zhang ierr = PetscTypeCompare((PetscObject)viewer,PETSC_VIEWER_ASCII,&iascii);CHKERRQ(ierr); 934f6c57405SHong Zhang if (iascii) { 935f6c57405SHong Zhang ierr = PetscViewerGetFormat(viewer,&format);CHKERRQ(ierr); 936cb828f0fSHong Zhang if (format == PETSC_VIEWER_ASCII_INFO || mumps->mumpsview){ 937cb828f0fSHong Zhang ierr = PetscViewerASCIIPrintf(viewer,"MUMPS run parameters:\n");CHKERRQ(ierr); 938cb828f0fSHong Zhang ierr = PetscViewerASCIIPrintf(viewer," SYM (matrix type): %d \n",mumps->id.sym);CHKERRQ(ierr); 939cb828f0fSHong Zhang ierr = PetscViewerASCIIPrintf(viewer," PAR (host participation): %d \n",mumps->id.par);CHKERRQ(ierr); 940cb828f0fSHong Zhang if (mumps->mumpsview){ /* View all MUMPS parameters */ 941f6c57405SHong Zhang ierr = MatFactorInfo_MUMPS(A,viewer);CHKERRQ(ierr); 942f6c57405SHong Zhang } 943f6c57405SHong Zhang } 944cb828f0fSHong Zhang } 945f6c57405SHong Zhang PetscFunctionReturn(0); 946f6c57405SHong Zhang } 947f6c57405SHong Zhang 94835bd34faSBarry Smith #undef __FUNCT__ 94935bd34faSBarry Smith #define __FUNCT__ "MatGetInfo_MUMPS" 95035bd34faSBarry Smith PetscErrorCode MatGetInfo_MUMPS(Mat A,MatInfoType flag,MatInfo *info) 95135bd34faSBarry Smith { 952cb828f0fSHong Zhang Mat_MUMPS *mumps =(Mat_MUMPS*)A->spptr; 95335bd34faSBarry Smith 95435bd34faSBarry Smith PetscFunctionBegin; 95535bd34faSBarry Smith info->block_size = 1.0; 956cb828f0fSHong Zhang info->nz_allocated = mumps->id.INFOG(20); 957cb828f0fSHong Zhang info->nz_used = mumps->id.INFOG(20); 95835bd34faSBarry Smith info->nz_unneeded = 0.0; 95935bd34faSBarry Smith info->assemblies = 0.0; 96035bd34faSBarry Smith info->mallocs = 0.0; 96135bd34faSBarry Smith info->memory = 0.0; 96235bd34faSBarry Smith info->fill_ratio_given = 0; 96335bd34faSBarry Smith info->fill_ratio_needed = 0; 96435bd34faSBarry Smith info->factor_mallocs = 0; 96535bd34faSBarry Smith PetscFunctionReturn(0); 96635bd34faSBarry Smith } 96735bd34faSBarry Smith 96824b6179bSKris Buschelman /*MC 96941c8de11SBarry Smith MAT_SOLVER_MUMPS - A matrix type providing direct solvers (LU and Cholesky) for 97024b6179bSKris Buschelman distributed and sequential matrices via the external package MUMPS. 97124b6179bSKris Buschelman 97241c8de11SBarry Smith Works with MATAIJ and MATSBAIJ matrices 97324b6179bSKris Buschelman 97424b6179bSKris Buschelman Options Database Keys: 97541c8de11SBarry Smith + -mat_mumps_sym <0,1,2> - 0 the matrix is unsymmetric, 1 symmetric positive definite, 2 symmetric 97624b6179bSKris Buschelman . -mat_mumps_icntl_4 <0,...,4> - print level 97724b6179bSKris Buschelman . -mat_mumps_icntl_6 <0,...,7> - matrix prescaling options (see MUMPS User's Guide) 97824b6179bSKris Buschelman . -mat_mumps_icntl_7 <0,...,7> - matrix orderings (see MUMPS User's Guide) 97924b6179bSKris Buschelman . -mat_mumps_icntl_9 <1,2> - A or A^T x=b to be solved: 1 denotes A, 2 denotes A^T 98024b6179bSKris Buschelman . -mat_mumps_icntl_10 <n> - maximum number of iterative refinements 98194b7f48cSBarry Smith . -mat_mumps_icntl_11 <n> - error analysis, a positive value returns statistics during -ksp_view 98224b6179bSKris Buschelman . -mat_mumps_icntl_12 <n> - efficiency control (see MUMPS User's Guide) 98324b6179bSKris Buschelman . -mat_mumps_icntl_13 <n> - efficiency control (see MUMPS User's Guide) 98424b6179bSKris Buschelman . -mat_mumps_icntl_14 <n> - efficiency control (see MUMPS User's Guide) 98524b6179bSKris Buschelman . -mat_mumps_icntl_15 <n> - efficiency control (see MUMPS User's Guide) 98624b6179bSKris Buschelman . -mat_mumps_cntl_1 <delta> - relative pivoting threshold 98724b6179bSKris Buschelman . -mat_mumps_cntl_2 <tol> - stopping criterion for refinement 98824b6179bSKris Buschelman - -mat_mumps_cntl_3 <adelta> - absolute pivoting threshold 98924b6179bSKris Buschelman 99024b6179bSKris Buschelman Level: beginner 99124b6179bSKris Buschelman 99241c8de11SBarry Smith .seealso: PCFactorSetMatSolverPackage(), MatSolverPackage 99341c8de11SBarry Smith 99424b6179bSKris Buschelman M*/ 99524b6179bSKris Buschelman 9962877fffaSHong Zhang EXTERN_C_BEGIN 99735bd34faSBarry Smith #undef __FUNCT__ 99835bd34faSBarry Smith #define __FUNCT__ "MatFactorGetSolverPackage_mumps" 99935bd34faSBarry Smith PetscErrorCode MatFactorGetSolverPackage_mumps(Mat A,const MatSolverPackage *type) 100035bd34faSBarry Smith { 100135bd34faSBarry Smith PetscFunctionBegin; 100235bd34faSBarry Smith *type = MAT_SOLVER_MUMPS; 100335bd34faSBarry Smith PetscFunctionReturn(0); 100435bd34faSBarry Smith } 100535bd34faSBarry Smith EXTERN_C_END 100635bd34faSBarry Smith 100735bd34faSBarry Smith EXTERN_C_BEGIN 10082877fffaSHong Zhang /* 10092877fffaSHong Zhang The seq and mpi versions of this function are the same 10102877fffaSHong Zhang */ 10112877fffaSHong Zhang #undef __FUNCT__ 10122877fffaSHong Zhang #define __FUNCT__ "MatGetFactor_seqaij_mumps" 10132877fffaSHong Zhang PetscErrorCode MatGetFactor_seqaij_mumps(Mat A,MatFactorType ftype,Mat *F) 10142877fffaSHong Zhang { 10152877fffaSHong Zhang Mat B; 10162877fffaSHong Zhang PetscErrorCode ierr; 10172877fffaSHong Zhang Mat_MUMPS *mumps; 10182877fffaSHong Zhang 10192877fffaSHong Zhang PetscFunctionBegin; 10202877fffaSHong Zhang /* Create the factorization matrix */ 10212877fffaSHong Zhang ierr = MatCreate(((PetscObject)A)->comm,&B);CHKERRQ(ierr); 10222877fffaSHong Zhang ierr = MatSetSizes(B,A->rmap->n,A->cmap->n,A->rmap->N,A->cmap->N);CHKERRQ(ierr); 10232877fffaSHong Zhang ierr = MatSetType(B,((PetscObject)A)->type_name);CHKERRQ(ierr); 10242877fffaSHong Zhang ierr = MatSeqAIJSetPreallocation(B,0,PETSC_NULL);CHKERRQ(ierr); 10252877fffaSHong Zhang 1026*16ebf90aSShri Abhyankar ierr = PetscNewLog(B,Mat_MUMPS,&mumps);CHKERRQ(ierr); 10272877fffaSHong Zhang B->ops->view = MatView_MUMPS; 102835bd34faSBarry Smith B->ops->getinfo = MatGetInfo_MUMPS; 102935bd34faSBarry Smith ierr = PetscObjectComposeFunctionDynamic((PetscObject)B,"MatFactorGetSolverPackage_C","MatFactorGetSolverPackage_mumps",MatFactorGetSolverPackage_mumps);CHKERRQ(ierr); 103097969023SHong Zhang ierr = PetscObjectComposeFunctionDynamic((PetscObject)B,"MatMumpsSetIcntl_C","MatMumpsSetIcntl",MatMumpsSetIcntl);CHKERRQ(ierr); 1031450b117fSShri Abhyankar if (ftype == MAT_FACTOR_LU) { 1032450b117fSShri Abhyankar B->ops->lufactorsymbolic = MatLUFactorSymbolic_AIJMUMPS; 1033d5f3da31SBarry Smith B->factortype = MAT_FACTOR_LU; 1034*16ebf90aSShri Abhyankar mumps->ConvertToTriples = MatConvertToTriples_seqaij_seqaij; 1035dcd589f8SShri Abhyankar } else { 1036450b117fSShri Abhyankar B->ops->choleskyfactorsymbolic = MatCholeskyFactorSymbolic_SBAIJMUMPS; 1037450b117fSShri Abhyankar B->factortype = MAT_FACTOR_CHOLESKY; 1038*16ebf90aSShri Abhyankar mumps->ConvertToTriples = MatConvertToTriples_seqaij_seqsbaij; 1039450b117fSShri Abhyankar } 10402877fffaSHong Zhang 10412877fffaSHong Zhang mumps->CleanUpMUMPS = PETSC_FALSE; 10422877fffaSHong Zhang mumps->isAIJ = PETSC_TRUE; 10432877fffaSHong Zhang mumps->scat_rhs = PETSC_NULL; 10442877fffaSHong Zhang mumps->scat_sol = PETSC_NULL; 10452877fffaSHong Zhang mumps->nSolve = 0; 10462877fffaSHong Zhang mumps->MatDestroy = B->ops->destroy; 10472877fffaSHong Zhang B->ops->destroy = MatDestroy_MUMPS; 10482877fffaSHong Zhang B->spptr = (void*)mumps; 10492877fffaSHong Zhang 10502877fffaSHong Zhang *F = B; 10512877fffaSHong Zhang PetscFunctionReturn(0); 10522877fffaSHong Zhang } 10532877fffaSHong Zhang EXTERN_C_END 10542877fffaSHong Zhang 10552877fffaSHong Zhang EXTERN_C_BEGIN 10562877fffaSHong Zhang #undef __FUNCT__ 10572877fffaSHong Zhang #define __FUNCT__ "MatGetFactor_seqsbaij_mumps" 10582877fffaSHong Zhang PetscErrorCode MatGetFactor_seqsbaij_mumps(Mat A,MatFactorType ftype,Mat *F) 10592877fffaSHong Zhang { 10602877fffaSHong Zhang Mat B; 10612877fffaSHong Zhang PetscErrorCode ierr; 10622877fffaSHong Zhang Mat_MUMPS *mumps; 10632877fffaSHong Zhang 10642877fffaSHong Zhang PetscFunctionBegin; 1065e7e72b3dSBarry Smith if (ftype != MAT_FACTOR_CHOLESKY) SETERRQ(((PetscObject)A)->comm,PETSC_ERR_SUP,"Cannot use PETSc SBAIJ matrices with MUMPS LU, use AIJ matrix"); 10662877fffaSHong Zhang /* Create the factorization matrix */ 10672877fffaSHong Zhang ierr = MatCreate(((PetscObject)A)->comm,&B);CHKERRQ(ierr); 10682877fffaSHong Zhang ierr = MatSetSizes(B,A->rmap->n,A->cmap->n,A->rmap->N,A->cmap->N);CHKERRQ(ierr); 10692877fffaSHong Zhang ierr = MatSetType(B,((PetscObject)A)->type_name);CHKERRQ(ierr); 10702877fffaSHong Zhang ierr = MatSeqSBAIJSetPreallocation(B,1,0,PETSC_NULL);CHKERRQ(ierr); 10712877fffaSHong Zhang ierr = MatMPISBAIJSetPreallocation(B,1,0,PETSC_NULL,0,PETSC_NULL);CHKERRQ(ierr); 10722877fffaSHong Zhang 1073*16ebf90aSShri Abhyankar ierr = PetscNewLog(B,Mat_MUMPS,&mumps);CHKERRQ(ierr); 10742877fffaSHong Zhang B->ops->choleskyfactorsymbolic = MatCholeskyFactorSymbolic_SBAIJMUMPS; 10752877fffaSHong Zhang B->ops->view = MatView_MUMPS; 107635bd34faSBarry Smith ierr = PetscObjectComposeFunctionDynamic((PetscObject)B,"MatFactorGetSolverPackage_C","MatFactorGetSolverPackage_mumps",MatFactorGetSolverPackage_mumps);CHKERRQ(ierr); 107797969023SHong Zhang ierr = PetscObjectComposeFunctionDynamic((PetscObject)B,"MatMumpsSetIcntl_C","MatMumpsSetIcntl",MatMumpsSetIcntl);CHKERRQ(ierr); 1078d5f3da31SBarry Smith B->factortype = MAT_FACTOR_CHOLESKY; 10792877fffaSHong Zhang 1080*16ebf90aSShri Abhyankar mumps->ConvertToTriples = MatConvertToTriples_seqsbaij_seqsbaij; 10812877fffaSHong Zhang mumps->CleanUpMUMPS = PETSC_FALSE; 1082450b117fSShri Abhyankar mumps->isAIJ = PETSC_FALSE; 10832877fffaSHong Zhang mumps->scat_rhs = PETSC_NULL; 10842877fffaSHong Zhang mumps->scat_sol = PETSC_NULL; 10852877fffaSHong Zhang mumps->nSolve = 0; 10862877fffaSHong Zhang mumps->MatDestroy = B->ops->destroy; 10872877fffaSHong Zhang B->ops->destroy = MatDestroy_MUMPS; 10882877fffaSHong Zhang B->spptr = (void*)mumps; 1089f3c0ef26SHong Zhang 10902877fffaSHong Zhang *F = B; 10912877fffaSHong Zhang PetscFunctionReturn(0); 10922877fffaSHong Zhang } 10932877fffaSHong Zhang EXTERN_C_END 10942877fffaSHong Zhang 10952877fffaSHong Zhang EXTERN_C_BEGIN 10962877fffaSHong Zhang #undef __FUNCT__ 10972877fffaSHong Zhang #define __FUNCT__ "MatGetFactor_mpisbaij_mumps" 10982877fffaSHong Zhang PetscErrorCode MatGetFactor_mpisbaij_mumps(Mat A,MatFactorType ftype,Mat *F) 10992877fffaSHong Zhang { 11002877fffaSHong Zhang Mat B; 11012877fffaSHong Zhang PetscErrorCode ierr; 11022877fffaSHong Zhang Mat_MUMPS *mumps; 11032877fffaSHong Zhang 11042877fffaSHong Zhang PetscFunctionBegin; 1105e7e72b3dSBarry Smith if (ftype != MAT_FACTOR_CHOLESKY) SETERRQ(((PetscObject)A)->comm,PETSC_ERR_SUP,"Cannot use PETSc SBAIJ matrices with MUMPS LU, use AIJ matrix"); 11062877fffaSHong Zhang /* Create the factorization matrix */ 11072877fffaSHong Zhang ierr = MatCreate(((PetscObject)A)->comm,&B);CHKERRQ(ierr); 11082877fffaSHong Zhang ierr = MatSetSizes(B,A->rmap->n,A->cmap->n,A->rmap->N,A->cmap->N);CHKERRQ(ierr); 11092877fffaSHong Zhang ierr = MatSetType(B,((PetscObject)A)->type_name);CHKERRQ(ierr); 11102877fffaSHong Zhang ierr = MatSeqSBAIJSetPreallocation(B,1,0,PETSC_NULL);CHKERRQ(ierr); 11112877fffaSHong Zhang ierr = MatMPISBAIJSetPreallocation(B,1,0,PETSC_NULL,0,PETSC_NULL);CHKERRQ(ierr); 11122877fffaSHong Zhang 11132877fffaSHong Zhang B->ops->choleskyfactorsymbolic = MatCholeskyFactorSymbolic_SBAIJMUMPS; 11142877fffaSHong Zhang B->ops->view = MatView_MUMPS; 111535bd34faSBarry Smith ierr = PetscObjectComposeFunctionDynamic((PetscObject)B,"MatFactorGetSolverPackage_C","MatFactorGetSolverPackage_mumps",MatFactorGetSolverPackage_mumps);CHKERRQ(ierr); 111697969023SHong Zhang ierr = PetscObjectComposeFunctionDynamic((PetscObject)B,"MatMumpsSetIcntl_C","MatMumpsSetIcntl",MatMumpsSetIcntl);CHKERRQ(ierr); 1117d5f3da31SBarry Smith B->factortype = MAT_FACTOR_CHOLESKY; 11182877fffaSHong Zhang 11192877fffaSHong Zhang ierr = PetscNewLog(B,Mat_MUMPS,&mumps);CHKERRQ(ierr); 1120*16ebf90aSShri Abhyankar mumps->ConvertToTriples = MatConvertToTriples_mpisbaij_mpisbaij; 11212877fffaSHong Zhang mumps->CleanUpMUMPS = PETSC_FALSE; 1122a214ac2aSShri Abhyankar mumps->isAIJ = PETSC_FALSE; 1123a214ac2aSShri Abhyankar mumps->scat_rhs = PETSC_NULL; 1124a214ac2aSShri Abhyankar mumps->scat_sol = PETSC_NULL; 1125a214ac2aSShri Abhyankar mumps->nSolve = 0; 1126a214ac2aSShri Abhyankar mumps->MatDestroy = B->ops->destroy; 1127a214ac2aSShri Abhyankar B->ops->destroy = MatDestroy_MUMPS; 1128a214ac2aSShri Abhyankar B->spptr = (void*)mumps; 1129a214ac2aSShri Abhyankar 1130a214ac2aSShri Abhyankar *F = B; 1131a214ac2aSShri Abhyankar PetscFunctionReturn(0); 1132a214ac2aSShri Abhyankar } 1133a214ac2aSShri Abhyankar EXTERN_C_END 1134a214ac2aSShri Abhyankar 1135a214ac2aSShri Abhyankar EXTERN_C_BEGIN 1136a214ac2aSShri Abhyankar #undef __FUNCT__ 1137a214ac2aSShri Abhyankar #define __FUNCT__ "MatGetFactor_mpiaij_mumps" 1138a214ac2aSShri Abhyankar PetscErrorCode MatGetFactor_mpiaij_mumps(Mat A,MatFactorType ftype,Mat *F) 1139a214ac2aSShri Abhyankar { 1140a214ac2aSShri Abhyankar Mat B; 1141a214ac2aSShri Abhyankar PetscErrorCode ierr; 1142a214ac2aSShri Abhyankar Mat_MUMPS *mumps; 1143a214ac2aSShri Abhyankar 1144a214ac2aSShri Abhyankar PetscFunctionBegin; 1145a214ac2aSShri Abhyankar /* Create the factorization matrix */ 1146a214ac2aSShri Abhyankar ierr = MatCreate(((PetscObject)A)->comm,&B);CHKERRQ(ierr); 1147a214ac2aSShri Abhyankar ierr = MatSetSizes(B,A->rmap->n,A->cmap->n,A->rmap->N,A->cmap->N);CHKERRQ(ierr); 1148a214ac2aSShri Abhyankar ierr = MatSetType(B,((PetscObject)A)->type_name);CHKERRQ(ierr); 1149a214ac2aSShri Abhyankar ierr = MatSeqAIJSetPreallocation(B,0,PETSC_NULL);CHKERRQ(ierr); 1150a214ac2aSShri Abhyankar ierr = MatMPIAIJSetPreallocation(B,0,PETSC_NULL,0,PETSC_NULL);CHKERRQ(ierr); 1151a214ac2aSShri Abhyankar 1152*16ebf90aSShri Abhyankar ierr = PetscNewLog(B,Mat_MUMPS,&mumps);CHKERRQ(ierr); 1153*16ebf90aSShri Abhyankar 1154a214ac2aSShri Abhyankar if (ftype == MAT_FACTOR_LU) { 1155a214ac2aSShri Abhyankar B->ops->lufactorsymbolic = MatLUFactorSymbolic_AIJMUMPS; 1156f4762488SHong Zhang B->factortype = MAT_FACTOR_LU; 1157*16ebf90aSShri Abhyankar mumps->ConvertToTriples = MatConvertToTriples_mpiaij_mpiaij; 1158dcd589f8SShri Abhyankar } else { 1159a214ac2aSShri Abhyankar B->ops->choleskyfactorsymbolic = MatCholeskyFactorSymbolic_SBAIJMUMPS; 1160f4762488SHong Zhang B->factortype = MAT_FACTOR_CHOLESKY; 1161*16ebf90aSShri Abhyankar mumps->ConvertToTriples = MatConvertToTriples_mpiaij_mpisbaij; 1162450b117fSShri Abhyankar } 1163a214ac2aSShri Abhyankar 1164a214ac2aSShri Abhyankar B->ops->view = MatView_MUMPS; 1165a214ac2aSShri Abhyankar ierr = PetscObjectComposeFunctionDynamic((PetscObject)B,"MatFactorGetSolverPackage_C","MatFactorGetSolverPackage_mumps",MatFactorGetSolverPackage_mumps);CHKERRQ(ierr); 1166a214ac2aSShri Abhyankar ierr = PetscObjectComposeFunctionDynamic((PetscObject)B,"MatMumpsSetIcntl_C","MatMumpsSetIcntl",MatMumpsSetIcntl);CHKERRQ(ierr); 1167a214ac2aSShri Abhyankar 1168a214ac2aSShri Abhyankar mumps->CleanUpMUMPS = PETSC_FALSE; 11692877fffaSHong Zhang mumps->isAIJ = PETSC_TRUE; 11702877fffaSHong Zhang mumps->scat_rhs = PETSC_NULL; 11712877fffaSHong Zhang mumps->scat_sol = PETSC_NULL; 11722877fffaSHong Zhang mumps->nSolve = 0; 1173f3c0ef26SHong Zhang mumps->MatDestroy = B->ops->destroy; 1174f3c0ef26SHong Zhang B->ops->destroy = MatDestroy_MUMPS; 11752877fffaSHong Zhang B->spptr = (void*)mumps; 1176f3c0ef26SHong Zhang 11772877fffaSHong Zhang *F = B; 11782877fffaSHong Zhang PetscFunctionReturn(0); 11792877fffaSHong Zhang } 11802877fffaSHong Zhang EXTERN_C_END 118197969023SHong Zhang 1182450b117fSShri Abhyankar EXTERN_C_BEGIN 1183450b117fSShri Abhyankar #undef __FUNCT__ 1184450b117fSShri Abhyankar #define __FUNCT__ "MatGetFactor_mpibaij_mumps" 1185450b117fSShri Abhyankar PetscErrorCode MatGetFactor_mpibaij_mumps(Mat A,MatFactorType ftype,Mat *F) 1186450b117fSShri Abhyankar { 1187450b117fSShri Abhyankar Mat B; 1188450b117fSShri Abhyankar PetscErrorCode ierr; 1189450b117fSShri Abhyankar Mat_MUMPS *mumps; 1190450b117fSShri Abhyankar 1191450b117fSShri Abhyankar PetscFunctionBegin; 1192*16ebf90aSShri Abhyankar SETERRQ(PETSC_COMM_SELF,PETSC_ERR_SUP,"BAIJ support not added for MUMPS yet, use AIJ matrix instead\n"); 1193450b117fSShri Abhyankar /* Create the factorization matrix */ 1194450b117fSShri Abhyankar ierr = MatCreate(((PetscObject)A)->comm,&B);CHKERRQ(ierr); 1195450b117fSShri Abhyankar ierr = MatSetSizes(B,A->rmap->n,A->cmap->n,A->rmap->N,A->cmap->N);CHKERRQ(ierr); 1196450b117fSShri Abhyankar ierr = MatSetType(B,((PetscObject)A)->type_name);CHKERRQ(ierr); 1197450b117fSShri Abhyankar ierr = MatSeqAIJSetPreallocation(B,0,PETSC_NULL);CHKERRQ(ierr); 1198450b117fSShri Abhyankar ierr = MatMPIAIJSetPreallocation(B,0,PETSC_NULL,0,PETSC_NULL);CHKERRQ(ierr); 1199450b117fSShri Abhyankar 1200450b117fSShri Abhyankar if (ftype == MAT_FACTOR_LU) { 1201450b117fSShri Abhyankar B->ops->lufactorsymbolic = MatLUFactorSymbolic_BAIJMUMPS; 1202450b117fSShri Abhyankar B->factortype = MAT_FACTOR_LU; 1203450b117fSShri Abhyankar } 1204e7e72b3dSBarry Smith else SETERRQ(PETSC_COMM_SELF,PETSC_ERR_SUP,"Cholesky factorization for Petsc BAIJ matrices not supported yet\n"); 1205450b117fSShri Abhyankar B->ops->view = MatView_MUMPS; 1206450b117fSShri Abhyankar ierr = PetscObjectComposeFunctionDynamic((PetscObject)B,"MatFactorGetSolverPackage_C","MatFactorGetSolverPackage_mumps",MatFactorGetSolverPackage_mumps);CHKERRQ(ierr); 1207450b117fSShri Abhyankar ierr = PetscObjectComposeFunctionDynamic((PetscObject)B,"MatMumpsSetIcntl_C","MatMumpsSetIcntl",MatMumpsSetIcntl);CHKERRQ(ierr); 1208450b117fSShri Abhyankar 1209450b117fSShri Abhyankar ierr = PetscNewLog(B,Mat_MUMPS,&mumps);CHKERRQ(ierr); 1210450b117fSShri Abhyankar mumps->CleanUpMUMPS = PETSC_FALSE; 1211450b117fSShri Abhyankar mumps->isAIJ = PETSC_TRUE; 1212450b117fSShri Abhyankar mumps->scat_rhs = PETSC_NULL; 1213450b117fSShri Abhyankar mumps->scat_sol = PETSC_NULL; 1214450b117fSShri Abhyankar mumps->nSolve = 0; 1215450b117fSShri Abhyankar mumps->MatDestroy = B->ops->destroy; 1216450b117fSShri Abhyankar B->ops->destroy = MatDestroy_MUMPS; 1217450b117fSShri Abhyankar B->spptr = (void*)mumps; 1218450b117fSShri Abhyankar 1219450b117fSShri Abhyankar *F = B; 1220450b117fSShri Abhyankar PetscFunctionReturn(0); 1221450b117fSShri Abhyankar } 1222450b117fSShri Abhyankar EXTERN_C_END 1223a214ac2aSShri Abhyankar 122461288eaaSHong Zhang /* -------------------------------------------------------------------------------------------*/ 122561288eaaSHong Zhang /*@ 122661288eaaSHong Zhang MatMumpsSetIcntl - Set MUMPS parameter ICNTL() 122761288eaaSHong Zhang 122861288eaaSHong Zhang Collective on Mat 122961288eaaSHong Zhang 123061288eaaSHong Zhang Input Parameters: 123161288eaaSHong Zhang + F - the factored matrix obtained by calling MatGetFactor() from PETSc-MUMPS interface 123261288eaaSHong Zhang . idx - index of MUMPS parameter array ICNTL() 123361288eaaSHong Zhang - icntl - value of MUMPS ICNTL(imumps) 123461288eaaSHong Zhang 123561288eaaSHong Zhang Options Database: 123661288eaaSHong Zhang . -mat_mumps_icntl_<idx> <icntl> 123761288eaaSHong Zhang 123861288eaaSHong Zhang Level: beginner 123961288eaaSHong Zhang 124061288eaaSHong Zhang References: MUMPS Users' Guide 124161288eaaSHong Zhang 124261288eaaSHong Zhang .seealso: MatGetFactor() 124361288eaaSHong Zhang @*/ 124497969023SHong Zhang #undef __FUNCT__ 124597969023SHong Zhang #define __FUNCT__ "MatMumpsSetIcntl" 124686e5884dSMatthew Knepley PetscErrorCode MatMumpsSetIcntl(Mat F,PetscInt idx,PetscInt icntl) 124797969023SHong Zhang { 1248dcd589f8SShri Abhyankar Mat_MUMPS *lu =(Mat_MUMPS*)(F)->spptr; 124997969023SHong Zhang 125097969023SHong Zhang PetscFunctionBegin; 125161288eaaSHong Zhang lu->id.ICNTL(idx) = icntl; 125297969023SHong Zhang PetscFunctionReturn(0); 125397969023SHong Zhang } 125497969023SHong Zhang 1255