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> 87ee00b23SStefano Zampini #include <../src/mat/impls/sell/mpi/mpisell.h> 9397b6df1SKris Buschelman 10397b6df1SKris Buschelman EXTERN_C_BEGIN 11397b6df1SKris Buschelman #if defined(PETSC_USE_COMPLEX) 122907cef9SHong Zhang #if defined(PETSC_USE_REAL_SINGLE) 132907cef9SHong Zhang #include <cmumps_c.h> 142907cef9SHong Zhang #else 15c6db04a5SJed Brown #include <zmumps_c.h> 162907cef9SHong Zhang #endif 172907cef9SHong Zhang #else 182907cef9SHong Zhang #if defined(PETSC_USE_REAL_SINGLE) 192907cef9SHong Zhang #include <smumps_c.h> 20397b6df1SKris Buschelman #else 21c6db04a5SJed Brown #include <dmumps_c.h> 22397b6df1SKris Buschelman #endif 232907cef9SHong Zhang #endif 24397b6df1SKris Buschelman EXTERN_C_END 25397b6df1SKris Buschelman #define JOB_INIT -1 263d472b54SHong Zhang #define JOB_FACTSYMBOLIC 1 273d472b54SHong Zhang #define JOB_FACTNUMERIC 2 283d472b54SHong Zhang #define JOB_SOLVE 3 29397b6df1SKris Buschelman #define JOB_END -2 303d472b54SHong Zhang 312907cef9SHong Zhang /* calls to MUMPS */ 322907cef9SHong Zhang #if defined(PETSC_USE_COMPLEX) 332907cef9SHong Zhang #if defined(PETSC_USE_REAL_SINGLE) 343ab56b82SJunchao Zhang #define MUMPS_c cmumps_c 352907cef9SHong Zhang #else 363ab56b82SJunchao Zhang #define MUMPS_c zmumps_c 372907cef9SHong Zhang #endif 382907cef9SHong Zhang #else 392907cef9SHong Zhang #if defined(PETSC_USE_REAL_SINGLE) 403ab56b82SJunchao Zhang #define MUMPS_c smumps_c 412907cef9SHong Zhang #else 423ab56b82SJunchao Zhang #define MUMPS_c dmumps_c 432907cef9SHong Zhang #endif 442907cef9SHong Zhang #endif 452907cef9SHong Zhang 46217d3b1eSJunchao Zhang /* if using PETSc OpenMP support, we only call MUMPS on master ranks. Before/after the call, we change/restore CPUs the master ranks can run on */ 473ab56b82SJunchao Zhang #if defined(PETSC_HAVE_OPENMP_SUPPORT) 483ab56b82SJunchao Zhang #define PetscMUMPS_c(mumps) \ 493ab56b82SJunchao Zhang do { \ 503ab56b82SJunchao Zhang if (mumps->use_petsc_omp_support) { \ 513ab56b82SJunchao Zhang if (mumps->is_omp_master) { \ 523ab56b82SJunchao Zhang ierr = PetscOmpCtrlOmpRegionOnMasterBegin(mumps->omp_ctrl);CHKERRQ(ierr); \ 533ab56b82SJunchao Zhang MUMPS_c(&mumps->id); \ 543ab56b82SJunchao Zhang ierr = PetscOmpCtrlOmpRegionOnMasterEnd(mumps->omp_ctrl);CHKERRQ(ierr); \ 553ab56b82SJunchao Zhang } \ 563ab56b82SJunchao Zhang ierr = PetscOmpCtrlBarrier(mumps->omp_ctrl);CHKERRQ(ierr); \ 573ab56b82SJunchao Zhang } else { \ 583ab56b82SJunchao Zhang MUMPS_c(&mumps->id); \ 593ab56b82SJunchao Zhang } \ 603ab56b82SJunchao Zhang } while(0) 613ab56b82SJunchao Zhang #else 623ab56b82SJunchao Zhang #define PetscMUMPS_c(mumps) \ 633ab56b82SJunchao Zhang do { MUMPS_c(&mumps->id); } while (0) 643ab56b82SJunchao Zhang #endif 653ab56b82SJunchao Zhang 66940cd9d6SSatish Balay /* declare MumpsScalar */ 67940cd9d6SSatish Balay #if defined(PETSC_USE_COMPLEX) 68940cd9d6SSatish Balay #if defined(PETSC_USE_REAL_SINGLE) 69940cd9d6SSatish Balay #define MumpsScalar mumps_complex 70940cd9d6SSatish Balay #else 71940cd9d6SSatish Balay #define MumpsScalar mumps_double_complex 72940cd9d6SSatish Balay #endif 73940cd9d6SSatish Balay #else 74940cd9d6SSatish Balay #define MumpsScalar PetscScalar 75940cd9d6SSatish Balay #endif 763d472b54SHong Zhang 77397b6df1SKris Buschelman /* macros s.t. indices match MUMPS documentation */ 78397b6df1SKris Buschelman #define ICNTL(I) icntl[(I)-1] 79397b6df1SKris Buschelman #define CNTL(I) cntl[(I)-1] 80397b6df1SKris Buschelman #define INFOG(I) infog[(I)-1] 81a7aca84bSHong Zhang #define INFO(I) info[(I)-1] 82397b6df1SKris Buschelman #define RINFOG(I) rinfog[(I)-1] 83adc1d99fSHong Zhang #define RINFO(I) rinfo[(I)-1] 84397b6df1SKris Buschelman 85397b6df1SKris Buschelman typedef struct { 86397b6df1SKris Buschelman #if defined(PETSC_USE_COMPLEX) 872907cef9SHong Zhang #if defined(PETSC_USE_REAL_SINGLE) 882907cef9SHong Zhang CMUMPS_STRUC_C id; 892907cef9SHong Zhang #else 90397b6df1SKris Buschelman ZMUMPS_STRUC_C id; 912907cef9SHong Zhang #endif 922907cef9SHong Zhang #else 932907cef9SHong Zhang #if defined(PETSC_USE_REAL_SINGLE) 942907cef9SHong Zhang SMUMPS_STRUC_C id; 95397b6df1SKris Buschelman #else 96397b6df1SKris Buschelman DMUMPS_STRUC_C id; 97397b6df1SKris Buschelman #endif 982907cef9SHong Zhang #endif 992907cef9SHong Zhang 100397b6df1SKris Buschelman MatStructure matstruc; 1012d4298aeSJunchao Zhang PetscMPIInt myid,petsc_size; 102a5e57a09SHong Zhang PetscInt *irn,*jcn,nz,sym; 103397b6df1SKris Buschelman PetscScalar *val; 1042d4298aeSJunchao Zhang MPI_Comm mumps_comm; 105a5e57a09SHong Zhang PetscInt ICNTL9_pre; /* check if ICNTL(9) is changed from previous MatSolve */ 106801fbe65SHong Zhang VecScatter scat_rhs, scat_sol; /* used by MatSolve() */ 107801fbe65SHong Zhang Vec b_seq,x_seq; 108b34f08ffSHong Zhang PetscInt ninfo,*info; /* display INFO */ 109b5fa320bSStefano Zampini PetscInt sizeredrhs; 11059ac8732SStefano Zampini PetscScalar *schur_sol; 11159ac8732SStefano Zampini PetscInt schur_sizesol; 1122205254eSKarl Rupp 1133ab56b82SJunchao Zhang PetscBool use_petsc_omp_support; 1143ab56b82SJunchao Zhang PetscOmpCtrl omp_ctrl; /* an OpenMP controler that blocked processes will release their CPU (MPI_Barrier does not have this guarantee) */ 1153ab56b82SJunchao Zhang MPI_Comm petsc_comm,omp_comm; /* petsc_comm is petsc matrix's comm */ 1163ab56b82SJunchao Zhang PetscMPIInt mpinz; /* on master rank, nz = sum(mpinz) over omp_comm; on other ranks, mpinz = nz*/ 1173ab56b82SJunchao Zhang PetscMPIInt omp_comm_size; 1183ab56b82SJunchao Zhang PetscBool is_omp_master; /* is this rank the master of omp_comm */ 1193ab56b82SJunchao Zhang PetscMPIInt *recvcount,*displs; 1203ab56b82SJunchao Zhang 121bccb9932SShri Abhyankar PetscErrorCode (*ConvertToTriples)(Mat, int, MatReuse, int*, int**, int**, PetscScalar**); 122f0c56d0fSKris Buschelman } Mat_MUMPS; 123f0c56d0fSKris Buschelman 12409573ac7SBarry Smith extern PetscErrorCode MatDuplicate_MUMPS(Mat,MatDuplicateOption,Mat*); 125b24902e0SBarry Smith 12659ac8732SStefano Zampini static PetscErrorCode MatMumpsResetSchur_Private(Mat_MUMPS* mumps) 127b5fa320bSStefano Zampini { 128b5fa320bSStefano Zampini PetscErrorCode ierr; 129b5fa320bSStefano Zampini 130b5fa320bSStefano Zampini PetscFunctionBegin; 13159ac8732SStefano Zampini ierr = PetscFree2(mumps->id.listvar_schur,mumps->id.schur);CHKERRQ(ierr); 13259ac8732SStefano Zampini ierr = PetscFree(mumps->id.redrhs);CHKERRQ(ierr); 13359ac8732SStefano Zampini ierr = PetscFree(mumps->schur_sol);CHKERRQ(ierr); 13459ac8732SStefano Zampini mumps->id.size_schur = 0; 135b3cb21ddSStefano Zampini mumps->id.schur_lld = 0; 13659ac8732SStefano Zampini mumps->id.ICNTL(19) = 0; 13759ac8732SStefano Zampini PetscFunctionReturn(0); 13859ac8732SStefano Zampini } 13959ac8732SStefano Zampini 140b3cb21ddSStefano Zampini /* solve with rhs in mumps->id.redrhs and return in the same location */ 141b3cb21ddSStefano Zampini static PetscErrorCode MatMumpsSolveSchur_Private(Mat F) 14259ac8732SStefano Zampini { 143b3cb21ddSStefano Zampini Mat_MUMPS *mumps=(Mat_MUMPS*)F->data; 144b3cb21ddSStefano Zampini Mat S,B,X; 145b3cb21ddSStefano Zampini MatFactorSchurStatus schurstatus; 146b3cb21ddSStefano Zampini PetscInt sizesol; 14759ac8732SStefano Zampini PetscErrorCode ierr; 14859ac8732SStefano Zampini 14959ac8732SStefano Zampini PetscFunctionBegin; 150b3cb21ddSStefano Zampini ierr = MatFactorFactorizeSchurComplement(F);CHKERRQ(ierr); 151b3cb21ddSStefano Zampini ierr = MatFactorGetSchurComplement(F,&S,&schurstatus);CHKERRQ(ierr); 152b3cb21ddSStefano Zampini ierr = MatCreateSeqDense(PETSC_COMM_SELF,mumps->id.size_schur,mumps->id.nrhs,(PetscScalar*)mumps->id.redrhs,&B);CHKERRQ(ierr); 153*c4163675SStefano Zampini ierr = MatSetType(B,((PetscObject)S)->type_name);CHKERRQ(ierr); 154b3cb21ddSStefano Zampini switch (schurstatus) { 155b3cb21ddSStefano Zampini case MAT_FACTOR_SCHUR_FACTORED: 156b3cb21ddSStefano Zampini ierr = MatCreateSeqDense(PETSC_COMM_SELF,mumps->id.size_schur,mumps->id.nrhs,(PetscScalar*)mumps->id.redrhs,&X);CHKERRQ(ierr); 157*c4163675SStefano Zampini ierr = MatSetType(X,((PetscObject)S)->type_name);CHKERRQ(ierr); 158b3cb21ddSStefano Zampini if (!mumps->id.ICNTL(9)) { /* transpose solve */ 159b3cb21ddSStefano Zampini ierr = MatMatSolveTranspose(S,B,X);CHKERRQ(ierr); 16059ac8732SStefano Zampini } else { 161b3cb21ddSStefano Zampini ierr = MatMatSolve(S,B,X);CHKERRQ(ierr); 16259ac8732SStefano Zampini } 163b3cb21ddSStefano Zampini break; 164b3cb21ddSStefano Zampini case MAT_FACTOR_SCHUR_INVERTED: 165b3cb21ddSStefano Zampini sizesol = mumps->id.nrhs*mumps->id.size_schur; 16659ac8732SStefano Zampini if (!mumps->schur_sol || sizesol > mumps->schur_sizesol) { 16759ac8732SStefano Zampini ierr = PetscFree(mumps->schur_sol);CHKERRQ(ierr); 16859ac8732SStefano Zampini ierr = PetscMalloc1(sizesol,&mumps->schur_sol);CHKERRQ(ierr); 16959ac8732SStefano Zampini mumps->schur_sizesol = sizesol; 170b5fa320bSStefano Zampini } 171b3cb21ddSStefano Zampini ierr = MatCreateSeqDense(PETSC_COMM_SELF,mumps->id.size_schur,mumps->id.nrhs,mumps->schur_sol,&X);CHKERRQ(ierr); 172*c4163675SStefano Zampini ierr = MatSetType(X,((PetscObject)S)->type_name);CHKERRQ(ierr); 17359ac8732SStefano Zampini if (!mumps->id.ICNTL(9)) { /* transpose solve */ 174b3cb21ddSStefano Zampini ierr = MatTransposeMatMult(S,B,MAT_REUSE_MATRIX,PETSC_DEFAULT,&X);CHKERRQ(ierr); 175b5fa320bSStefano Zampini } else { 176b3cb21ddSStefano Zampini ierr = MatMatMult(S,B,MAT_REUSE_MATRIX,PETSC_DEFAULT,&X);CHKERRQ(ierr); 177b5fa320bSStefano Zampini } 178b3cb21ddSStefano Zampini ierr = MatCopy(X,B,SAME_NONZERO_PATTERN);CHKERRQ(ierr); 179b3cb21ddSStefano Zampini break; 180b3cb21ddSStefano Zampini default: 181b3cb21ddSStefano Zampini SETERRQ1(PetscObjectComm((PetscObject)F),PETSC_ERR_SUP,"Unhandled MatFactorSchurStatus %D",F->schur_status); 182b3cb21ddSStefano Zampini break; 18359ac8732SStefano Zampini } 184b3cb21ddSStefano Zampini ierr = MatFactorRestoreSchurComplement(F,&S,schurstatus);CHKERRQ(ierr); 185b3cb21ddSStefano Zampini ierr = MatDestroy(&B);CHKERRQ(ierr); 186b3cb21ddSStefano Zampini ierr = MatDestroy(&X);CHKERRQ(ierr); 187b5fa320bSStefano Zampini PetscFunctionReturn(0); 188b5fa320bSStefano Zampini } 189b5fa320bSStefano Zampini 190b3cb21ddSStefano Zampini static PetscErrorCode MatMumpsHandleSchur_Private(Mat F, PetscBool expansion) 191b5fa320bSStefano Zampini { 192b3cb21ddSStefano Zampini Mat_MUMPS *mumps=(Mat_MUMPS*)F->data; 193b5fa320bSStefano Zampini PetscErrorCode ierr; 194b5fa320bSStefano Zampini 195b5fa320bSStefano Zampini PetscFunctionBegin; 196b5fa320bSStefano Zampini if (!mumps->id.ICNTL(19)) { /* do nothing when Schur complement has not been computed */ 197b5fa320bSStefano Zampini PetscFunctionReturn(0); 198b5fa320bSStefano Zampini } 199b8f61ee1SStefano Zampini if (!expansion) { /* prepare for the condensation step */ 200b5fa320bSStefano Zampini PetscInt sizeredrhs = mumps->id.nrhs*mumps->id.size_schur; 201b5fa320bSStefano Zampini /* allocate MUMPS internal array to store reduced right-hand sides */ 202b5fa320bSStefano Zampini if (!mumps->id.redrhs || sizeredrhs > mumps->sizeredrhs) { 203b5fa320bSStefano Zampini ierr = PetscFree(mumps->id.redrhs);CHKERRQ(ierr); 204b5fa320bSStefano Zampini mumps->id.lredrhs = mumps->id.size_schur; 205b5fa320bSStefano Zampini ierr = PetscMalloc1(mumps->id.nrhs*mumps->id.lredrhs,&mumps->id.redrhs);CHKERRQ(ierr); 206b5fa320bSStefano Zampini mumps->sizeredrhs = mumps->id.nrhs*mumps->id.lredrhs; 207b5fa320bSStefano Zampini } 208b5fa320bSStefano Zampini mumps->id.ICNTL(26) = 1; /* condensation phase */ 209b5fa320bSStefano Zampini } else { /* prepare for the expansion step */ 210b8f61ee1SStefano Zampini /* solve Schur complement (this has to be done by the MUMPS user, so basically us) */ 211b3cb21ddSStefano Zampini ierr = MatMumpsSolveSchur_Private(F);CHKERRQ(ierr); 212b5fa320bSStefano Zampini mumps->id.ICNTL(26) = 2; /* expansion phase */ 2133ab56b82SJunchao Zhang PetscMUMPS_c(mumps); 214b5fa320bSStefano Zampini 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)); 215b5fa320bSStefano Zampini /* restore defaults */ 216b5fa320bSStefano Zampini mumps->id.ICNTL(26) = -1; 217d3d598ffSStefano Zampini /* free MUMPS internal array for redrhs if we have solved for multiple rhs in order to save memory space */ 218d3d598ffSStefano Zampini if (mumps->id.nrhs > 1) { 219d3d598ffSStefano Zampini ierr = PetscFree(mumps->id.redrhs);CHKERRQ(ierr); 220d3d598ffSStefano Zampini mumps->id.lredrhs = 0; 221d3d598ffSStefano Zampini mumps->sizeredrhs = 0; 222d3d598ffSStefano Zampini } 223b5fa320bSStefano Zampini } 224b5fa320bSStefano Zampini PetscFunctionReturn(0); 225b5fa320bSStefano Zampini } 226b5fa320bSStefano Zampini 227397b6df1SKris Buschelman /* 228d341cd04SHong Zhang MatConvertToTriples_A_B - convert Petsc matrix to triples: row[nz], col[nz], val[nz] 229d341cd04SHong Zhang 230397b6df1SKris Buschelman input: 23175480915SPierre Jolivet A - matrix in aij,baij or sbaij format 232397b6df1SKris Buschelman shift - 0: C style output triple; 1: Fortran style output triple. 233bccb9932SShri Abhyankar reuse - MAT_INITIAL_MATRIX: spaces are allocated and values are set for the triple 234bccb9932SShri Abhyankar MAT_REUSE_MATRIX: only the values in v array are updated 235397b6df1SKris Buschelman output: 236397b6df1SKris Buschelman nnz - dim of r, c, and v (number of local nonzero entries of A) 237397b6df1SKris Buschelman r, c, v - row and col index, matrix values (matrix triples) 238eb9baa12SBarry Smith 239eb9baa12SBarry Smith The returned values r, c, and sometimes v are obtained in a single PetscMalloc(). Then in MatDestroy_MUMPS() it is 2407ee00b23SStefano Zampini freed with PetscFree(mumps->irn); This is not ideal code, the fact that v is ONLY sometimes part of mumps->irn means 241eb9baa12SBarry Smith that the PetscMalloc() cannot easily be replaced with a PetscMalloc3(). 242eb9baa12SBarry Smith 243397b6df1SKris Buschelman */ 24416ebf90aSShri Abhyankar 245bccb9932SShri Abhyankar PetscErrorCode MatConvertToTriples_seqaij_seqaij(Mat A,int shift,MatReuse reuse,int *nnz,int **r, int **c, PetscScalar **v) 246b24902e0SBarry Smith { 247185f6596SHong Zhang const PetscInt *ai,*aj,*ajj,M=A->rmap->n; 24867877ebaSShri Abhyankar PetscInt nz,rnz,i,j; 249dfbe8321SBarry Smith PetscErrorCode ierr; 250c1490034SHong Zhang PetscInt *row,*col; 25116ebf90aSShri Abhyankar Mat_SeqAIJ *aa=(Mat_SeqAIJ*)A->data; 252397b6df1SKris Buschelman 253397b6df1SKris Buschelman PetscFunctionBegin; 25416ebf90aSShri Abhyankar *v=aa->a; 255bccb9932SShri Abhyankar if (reuse == MAT_INITIAL_MATRIX) { 2562205254eSKarl Rupp nz = aa->nz; 2572205254eSKarl Rupp ai = aa->i; 2582205254eSKarl Rupp aj = aa->j; 25916ebf90aSShri Abhyankar *nnz = nz; 260785e854fSJed Brown ierr = PetscMalloc1(2*nz, &row);CHKERRQ(ierr); 261185f6596SHong Zhang col = row + nz; 262185f6596SHong Zhang 26316ebf90aSShri Abhyankar nz = 0; 26416ebf90aSShri Abhyankar for (i=0; i<M; i++) { 26516ebf90aSShri Abhyankar rnz = ai[i+1] - ai[i]; 26667877ebaSShri Abhyankar ajj = aj + ai[i]; 26767877ebaSShri Abhyankar for (j=0; j<rnz; j++) { 26867877ebaSShri Abhyankar row[nz] = i+shift; col[nz++] = ajj[j] + shift; 26916ebf90aSShri Abhyankar } 27016ebf90aSShri Abhyankar } 27116ebf90aSShri Abhyankar *r = row; *c = col; 27216ebf90aSShri Abhyankar } 27316ebf90aSShri Abhyankar PetscFunctionReturn(0); 27416ebf90aSShri Abhyankar } 275397b6df1SKris Buschelman 2767ee00b23SStefano Zampini PetscErrorCode MatConvertToTriples_seqsell_seqaij(Mat A,int shift,MatReuse reuse,int *nnz,int **r, int **c, PetscScalar **v) 2777ee00b23SStefano Zampini { 2787ee00b23SStefano Zampini Mat_SeqSELL *a=(Mat_SeqSELL*)A->data; 2797ee00b23SStefano Zampini PetscInt *ptr; 2807ee00b23SStefano Zampini 2817ee00b23SStefano Zampini PetscFunctionBegin; 2827ee00b23SStefano Zampini *v = a->val; 2837ee00b23SStefano Zampini if (reuse == MAT_INITIAL_MATRIX) { 2847ee00b23SStefano Zampini PetscInt nz,i,j,row; 2857ee00b23SStefano Zampini PetscErrorCode ierr; 2867ee00b23SStefano Zampini 2877ee00b23SStefano Zampini nz = a->sliidx[a->totalslices]; 2887ee00b23SStefano Zampini *nnz = nz; 2897ee00b23SStefano Zampini ierr = PetscMalloc1(2*nz, &ptr);CHKERRQ(ierr); 2907ee00b23SStefano Zampini *r = ptr; 2917ee00b23SStefano Zampini *c = ptr + nz; 2927ee00b23SStefano Zampini 2937ee00b23SStefano Zampini for (i=0; i<a->totalslices; i++) { 2947ee00b23SStefano Zampini for (j=a->sliidx[i],row=0; j<a->sliidx[i+1]; j++,row=((row+1)&0x07)) { 2957ee00b23SStefano Zampini *ptr++ = 8*i + row + shift; 2967ee00b23SStefano Zampini } 2977ee00b23SStefano Zampini } 2987ee00b23SStefano Zampini for (i=0;i<nz;i++) *ptr++ = a->colidx[i] + shift; 2997ee00b23SStefano Zampini } 3007ee00b23SStefano Zampini PetscFunctionReturn(0); 3017ee00b23SStefano Zampini } 3027ee00b23SStefano Zampini 303bccb9932SShri Abhyankar PetscErrorCode MatConvertToTriples_seqbaij_seqaij(Mat A,int shift,MatReuse reuse,int *nnz,int **r, int **c, PetscScalar **v) 30467877ebaSShri Abhyankar { 30567877ebaSShri Abhyankar Mat_SeqBAIJ *aa=(Mat_SeqBAIJ*)A->data; 30633d57670SJed Brown const PetscInt *ai,*aj,*ajj,bs2 = aa->bs2; 30733d57670SJed Brown PetscInt bs,M,nz,idx=0,rnz,i,j,k,m; 30867877ebaSShri Abhyankar PetscErrorCode ierr; 30967877ebaSShri Abhyankar PetscInt *row,*col; 31067877ebaSShri Abhyankar 31167877ebaSShri Abhyankar PetscFunctionBegin; 31233d57670SJed Brown ierr = MatGetBlockSize(A,&bs);CHKERRQ(ierr); 31333d57670SJed Brown M = A->rmap->N/bs; 314cf3759fdSShri Abhyankar *v = aa->a; 315bccb9932SShri Abhyankar if (reuse == MAT_INITIAL_MATRIX) { 316cf3759fdSShri Abhyankar ai = aa->i; aj = aa->j; 31767877ebaSShri Abhyankar nz = bs2*aa->nz; 31867877ebaSShri Abhyankar *nnz = nz; 319785e854fSJed Brown ierr = PetscMalloc1(2*nz, &row);CHKERRQ(ierr); 320185f6596SHong Zhang col = row + nz; 321185f6596SHong Zhang 32267877ebaSShri Abhyankar for (i=0; i<M; i++) { 32367877ebaSShri Abhyankar ajj = aj + ai[i]; 32467877ebaSShri Abhyankar rnz = ai[i+1] - ai[i]; 32567877ebaSShri Abhyankar for (k=0; k<rnz; k++) { 32667877ebaSShri Abhyankar for (j=0; j<bs; j++) { 32767877ebaSShri Abhyankar for (m=0; m<bs; m++) { 32867877ebaSShri Abhyankar row[idx] = i*bs + m + shift; 329cf3759fdSShri Abhyankar col[idx++] = bs*(ajj[k]) + j + shift; 33067877ebaSShri Abhyankar } 33167877ebaSShri Abhyankar } 33267877ebaSShri Abhyankar } 33367877ebaSShri Abhyankar } 334cf3759fdSShri Abhyankar *r = row; *c = col; 33567877ebaSShri Abhyankar } 33667877ebaSShri Abhyankar PetscFunctionReturn(0); 33767877ebaSShri Abhyankar } 33867877ebaSShri Abhyankar 339bccb9932SShri Abhyankar PetscErrorCode MatConvertToTriples_seqsbaij_seqsbaij(Mat A,int shift,MatReuse reuse,int *nnz,int **r,int **c,PetscScalar **v) 34016ebf90aSShri Abhyankar { 34175480915SPierre Jolivet const PetscInt *ai, *aj,*ajj; 34275480915SPierre Jolivet PetscInt nz,rnz,i,j,k,m,bs; 34316ebf90aSShri Abhyankar PetscErrorCode ierr; 34416ebf90aSShri Abhyankar PetscInt *row,*col; 34575480915SPierre Jolivet PetscScalar *val; 34616ebf90aSShri Abhyankar Mat_SeqSBAIJ *aa=(Mat_SeqSBAIJ*)A->data; 34775480915SPierre Jolivet const PetscInt bs2=aa->bs2,mbs=aa->mbs; 34838548759SBarry Smith #if defined(PETSC_USE_COMPLEX) 34938548759SBarry Smith PetscBool hermitian; 35038548759SBarry Smith #endif 35116ebf90aSShri Abhyankar 35216ebf90aSShri Abhyankar PetscFunctionBegin; 35338548759SBarry Smith #if defined(PETSC_USE_COMPLEX) 35438548759SBarry Smith ierr = MatGetOption(A,MAT_HERMITIAN,&hermitian);CHKERRQ(ierr); 35538548759SBarry Smith if (hermitian) SETERRQ(PetscObjectComm((PetscObject)A),PETSC_ERR_SUP,"MUMPS does not support Hermitian symmetric matrices for Choleksy"); 35638548759SBarry Smith #endif 3572205254eSKarl Rupp ai = aa->i; 3582205254eSKarl Rupp aj = aa->j; 35975480915SPierre Jolivet ierr = MatGetBlockSize(A,&bs);CHKERRQ(ierr); 36075480915SPierre Jolivet if (reuse == MAT_INITIAL_MATRIX) { 36175480915SPierre Jolivet nz = aa->nz; 362a81fe166SPierre Jolivet ierr = PetscMalloc((2*bs2*nz*sizeof(PetscInt)+(bs>1?bs2*nz*sizeof(PetscScalar):0)), &row);CHKERRQ(ierr); 36375480915SPierre Jolivet col = row + bs2*nz; 364574ea4fdSPierre Jolivet if (bs>1) val = (PetscScalar*)(col + bs2*nz); 365574ea4fdSPierre Jolivet else val = aa->a; 36675480915SPierre Jolivet 36775480915SPierre Jolivet *r = row; *c = col; *v = val; 36875480915SPierre Jolivet } else { 369574ea4fdSPierre Jolivet if (bs == 1) *v = aa->a; 37075480915SPierre Jolivet row = *r; col = *c; val = *v; 37175480915SPierre Jolivet } 372185f6596SHong Zhang 37316ebf90aSShri Abhyankar nz = 0; 374a81fe166SPierre Jolivet if (bs>1) { 37575480915SPierre Jolivet for (i=0; i<mbs; i++) { 37616ebf90aSShri Abhyankar rnz = ai[i+1] - ai[i]; 37767877ebaSShri Abhyankar ajj = aj + ai[i]; 37875480915SPierre Jolivet for (j=0; j<rnz; j++) { 37975480915SPierre Jolivet for (k=0; k<bs; k++) { 38075480915SPierre Jolivet for (m=0; m<bs; m++) { 381ec4f40fdSPierre Jolivet if (ajj[j]>i || k>=m) { 38275480915SPierre Jolivet if (reuse == MAT_INITIAL_MATRIX) { 38375480915SPierre Jolivet row[nz] = i*bs + m + shift; 38475480915SPierre Jolivet col[nz] = ajj[j]*bs + k + shift; 38575480915SPierre Jolivet } 38675480915SPierre Jolivet val[nz++] = aa->a[(ai[i]+j)*bs2 + m + k*bs]; 38775480915SPierre Jolivet } 38875480915SPierre Jolivet } 38975480915SPierre Jolivet } 39075480915SPierre Jolivet } 39175480915SPierre Jolivet } 392a81fe166SPierre Jolivet } else if (reuse == MAT_INITIAL_MATRIX) { 393a81fe166SPierre Jolivet for (i=0; i<mbs; i++) { 394a81fe166SPierre Jolivet rnz = ai[i+1] - ai[i]; 395a81fe166SPierre Jolivet ajj = aj + ai[i]; 396a81fe166SPierre Jolivet for (j=0; j<rnz; j++) { 397a81fe166SPierre Jolivet row[nz] = i+shift; col[nz++] = ajj[j] + shift; 398a81fe166SPierre Jolivet } 399a81fe166SPierre Jolivet } 400a81fe166SPierre Jolivet if (nz != aa->nz) SETERRQ2(PETSC_COMM_SELF,PETSC_ERR_PLIB,"Different numbers of nonzeros %D != %D",nz,aa->nz); 40175480915SPierre Jolivet } 402574ea4fdSPierre Jolivet if (reuse == MAT_INITIAL_MATRIX) *nnz = nz; 40316ebf90aSShri Abhyankar PetscFunctionReturn(0); 40416ebf90aSShri Abhyankar } 40516ebf90aSShri Abhyankar 406bccb9932SShri Abhyankar PetscErrorCode MatConvertToTriples_seqaij_seqsbaij(Mat A,int shift,MatReuse reuse,int *nnz,int **r, int **c, PetscScalar **v) 40716ebf90aSShri Abhyankar { 40867877ebaSShri Abhyankar const PetscInt *ai,*aj,*ajj,*adiag,M=A->rmap->n; 40967877ebaSShri Abhyankar PetscInt nz,rnz,i,j; 41067877ebaSShri Abhyankar const PetscScalar *av,*v1; 41116ebf90aSShri Abhyankar PetscScalar *val; 41216ebf90aSShri Abhyankar PetscErrorCode ierr; 41316ebf90aSShri Abhyankar PetscInt *row,*col; 414829b1710SHong Zhang Mat_SeqAIJ *aa=(Mat_SeqAIJ*)A->data; 41529b521d4Sstefano_zampini PetscBool missing; 41638548759SBarry Smith #if defined(PETSC_USE_COMPLEX) 41738548759SBarry Smith PetscBool hermitian; 41838548759SBarry Smith #endif 41916ebf90aSShri Abhyankar 42016ebf90aSShri Abhyankar PetscFunctionBegin; 42138548759SBarry Smith #if defined(PETSC_USE_COMPLEX) 42238548759SBarry Smith ierr = MatGetOption(A,MAT_HERMITIAN,&hermitian);CHKERRQ(ierr); 42338548759SBarry Smith if (hermitian) SETERRQ(PetscObjectComm((PetscObject)A),PETSC_ERR_SUP,"MUMPS does not support Hermitian symmetric matrices for Choleksy"); 42438548759SBarry Smith #endif 42516ebf90aSShri Abhyankar ai = aa->i; aj = aa->j; av = aa->a; 42616ebf90aSShri Abhyankar adiag = aa->diag; 42729b521d4Sstefano_zampini ierr = MatMissingDiagonal_SeqAIJ(A,&missing,&i);CHKERRQ(ierr); 428bccb9932SShri Abhyankar if (reuse == MAT_INITIAL_MATRIX) { 4297ee00b23SStefano Zampini /* count nz in the upper triangular part of A */ 430829b1710SHong Zhang nz = 0; 43129b521d4Sstefano_zampini if (missing) { 43229b521d4Sstefano_zampini for (i=0; i<M; i++) { 43329b521d4Sstefano_zampini if (PetscUnlikely(adiag[i] >= ai[i+1])) { 43429b521d4Sstefano_zampini for (j=ai[i];j<ai[i+1];j++) { 43529b521d4Sstefano_zampini if (aj[j] < i) continue; 43629b521d4Sstefano_zampini nz++; 43729b521d4Sstefano_zampini } 43829b521d4Sstefano_zampini } else { 43929b521d4Sstefano_zampini nz += ai[i+1] - adiag[i]; 44029b521d4Sstefano_zampini } 44129b521d4Sstefano_zampini } 44229b521d4Sstefano_zampini } else { 443829b1710SHong Zhang for (i=0; i<M; i++) nz += ai[i+1] - adiag[i]; 44429b521d4Sstefano_zampini } 44516ebf90aSShri Abhyankar *nnz = nz; 446829b1710SHong Zhang 447185f6596SHong Zhang ierr = PetscMalloc((2*nz*sizeof(PetscInt)+nz*sizeof(PetscScalar)), &row);CHKERRQ(ierr); 448185f6596SHong Zhang col = row + nz; 449185f6596SHong Zhang val = (PetscScalar*)(col + nz); 450185f6596SHong Zhang 45116ebf90aSShri Abhyankar nz = 0; 45229b521d4Sstefano_zampini if (missing) { 45329b521d4Sstefano_zampini for (i=0; i<M; i++) { 45429b521d4Sstefano_zampini if (PetscUnlikely(adiag[i] >= ai[i+1])) { 45529b521d4Sstefano_zampini for (j=ai[i];j<ai[i+1];j++) { 45629b521d4Sstefano_zampini if (aj[j] < i) continue; 45729b521d4Sstefano_zampini row[nz] = i+shift; 45829b521d4Sstefano_zampini col[nz] = aj[j]+shift; 45929b521d4Sstefano_zampini val[nz] = av[j]; 46029b521d4Sstefano_zampini nz++; 46129b521d4Sstefano_zampini } 46229b521d4Sstefano_zampini } else { 46329b521d4Sstefano_zampini rnz = ai[i+1] - adiag[i]; 46429b521d4Sstefano_zampini ajj = aj + adiag[i]; 46529b521d4Sstefano_zampini v1 = av + adiag[i]; 46629b521d4Sstefano_zampini for (j=0; j<rnz; j++) { 46729b521d4Sstefano_zampini row[nz] = i+shift; col[nz] = ajj[j] + shift; val[nz++] = v1[j]; 46829b521d4Sstefano_zampini } 46929b521d4Sstefano_zampini } 47029b521d4Sstefano_zampini } 47129b521d4Sstefano_zampini } else { 47216ebf90aSShri Abhyankar for (i=0; i<M; i++) { 47316ebf90aSShri Abhyankar rnz = ai[i+1] - adiag[i]; 47467877ebaSShri Abhyankar ajj = aj + adiag[i]; 475cf3759fdSShri Abhyankar v1 = av + adiag[i]; 47667877ebaSShri Abhyankar for (j=0; j<rnz; j++) { 47767877ebaSShri Abhyankar row[nz] = i+shift; col[nz] = ajj[j] + shift; val[nz++] = v1[j]; 47816ebf90aSShri Abhyankar } 47916ebf90aSShri Abhyankar } 48029b521d4Sstefano_zampini } 48116ebf90aSShri Abhyankar *r = row; *c = col; *v = val; 482397b6df1SKris Buschelman } else { 48316ebf90aSShri Abhyankar nz = 0; val = *v; 48429b521d4Sstefano_zampini if (missing) { 48516ebf90aSShri Abhyankar for (i=0; i <M; i++) { 48629b521d4Sstefano_zampini if (PetscUnlikely(adiag[i] >= ai[i+1])) { 48729b521d4Sstefano_zampini for (j=ai[i];j<ai[i+1];j++) { 48829b521d4Sstefano_zampini if (aj[j] < i) continue; 48929b521d4Sstefano_zampini val[nz++] = av[j]; 49029b521d4Sstefano_zampini } 49129b521d4Sstefano_zampini } else { 49216ebf90aSShri Abhyankar rnz = ai[i+1] - adiag[i]; 49367877ebaSShri Abhyankar v1 = av + adiag[i]; 49467877ebaSShri Abhyankar for (j=0; j<rnz; j++) { 49567877ebaSShri Abhyankar val[nz++] = v1[j]; 49616ebf90aSShri Abhyankar } 49716ebf90aSShri Abhyankar } 49816ebf90aSShri Abhyankar } 49929b521d4Sstefano_zampini } else { 50016ebf90aSShri Abhyankar for (i=0; i <M; i++) { 50116ebf90aSShri Abhyankar rnz = ai[i+1] - adiag[i]; 50216ebf90aSShri Abhyankar v1 = av + adiag[i]; 50316ebf90aSShri Abhyankar for (j=0; j<rnz; j++) { 50416ebf90aSShri Abhyankar val[nz++] = v1[j]; 50516ebf90aSShri Abhyankar } 50616ebf90aSShri Abhyankar } 50716ebf90aSShri Abhyankar } 50829b521d4Sstefano_zampini } 50916ebf90aSShri Abhyankar PetscFunctionReturn(0); 51016ebf90aSShri Abhyankar } 51116ebf90aSShri Abhyankar 512bccb9932SShri Abhyankar PetscErrorCode MatConvertToTriples_mpisbaij_mpisbaij(Mat A,int shift,MatReuse reuse,int *nnz,int **r,int **c, PetscScalar **v) 51316ebf90aSShri Abhyankar { 514ec4f40fdSPierre Jolivet const PetscInt *ai,*aj,*bi,*bj,*garray,*ajj,*bjj; 51516ebf90aSShri Abhyankar PetscErrorCode ierr; 516ec4f40fdSPierre Jolivet PetscInt rstart,nz,bs,i,j,k,m,jj,irow,countA,countB; 51716ebf90aSShri Abhyankar PetscInt *row,*col; 51816ebf90aSShri Abhyankar const PetscScalar *av,*bv,*v1,*v2; 51916ebf90aSShri Abhyankar PetscScalar *val; 520397b6df1SKris Buschelman Mat_MPISBAIJ *mat = (Mat_MPISBAIJ*)A->data; 521397b6df1SKris Buschelman Mat_SeqSBAIJ *aa = (Mat_SeqSBAIJ*)(mat->A)->data; 522397b6df1SKris Buschelman Mat_SeqBAIJ *bb = (Mat_SeqBAIJ*)(mat->B)->data; 523ec4f40fdSPierre Jolivet const PetscInt bs2=aa->bs2,mbs=aa->mbs; 52438548759SBarry Smith #if defined(PETSC_USE_COMPLEX) 52538548759SBarry Smith PetscBool hermitian; 52638548759SBarry Smith #endif 52716ebf90aSShri Abhyankar 52816ebf90aSShri Abhyankar PetscFunctionBegin; 52938548759SBarry Smith #if defined(PETSC_USE_COMPLEX) 53038548759SBarry Smith ierr = MatGetOption(A,MAT_HERMITIAN,&hermitian);CHKERRQ(ierr); 53138548759SBarry Smith if (hermitian) SETERRQ(PetscObjectComm((PetscObject)A),PETSC_ERR_SUP,"MUMPS does not support Hermitian symmetric matrices for Choleksy"); 53238548759SBarry Smith #endif 533ec4f40fdSPierre Jolivet ierr = MatGetBlockSize(A,&bs);CHKERRQ(ierr); 53438548759SBarry Smith rstart = A->rmap->rstart; 53538548759SBarry Smith ai = aa->i; 53638548759SBarry Smith aj = aa->j; 53738548759SBarry Smith bi = bb->i; 53838548759SBarry Smith bj = bb->j; 53938548759SBarry Smith av = aa->a; 54038548759SBarry Smith bv = bb->a; 541397b6df1SKris Buschelman 5422205254eSKarl Rupp garray = mat->garray; 5432205254eSKarl Rupp 544bccb9932SShri Abhyankar if (reuse == MAT_INITIAL_MATRIX) { 54516ebf90aSShri Abhyankar nz = aa->nz + bb->nz; 546ec4f40fdSPierre Jolivet ierr = PetscMalloc((2*bs2*nz*sizeof(PetscInt)+bs2*nz*sizeof(PetscScalar)), &row);CHKERRQ(ierr); 547ec4f40fdSPierre Jolivet col = row + bs2*nz; 548ec4f40fdSPierre Jolivet val = (PetscScalar*)(col + bs2*nz); 549185f6596SHong Zhang 550397b6df1SKris Buschelman *r = row; *c = col; *v = val; 551397b6df1SKris Buschelman } else { 552397b6df1SKris Buschelman row = *r; col = *c; val = *v; 553397b6df1SKris Buschelman } 554397b6df1SKris Buschelman 555028e57e8SHong Zhang jj = 0; irow = rstart; 556ec4f40fdSPierre Jolivet for (i=0; i<mbs; i++) { 557397b6df1SKris Buschelman ajj = aj + ai[i]; /* ptr to the beginning of this row */ 558397b6df1SKris Buschelman countA = ai[i+1] - ai[i]; 559397b6df1SKris Buschelman countB = bi[i+1] - bi[i]; 560397b6df1SKris Buschelman bjj = bj + bi[i]; 561ec4f40fdSPierre Jolivet v1 = av + ai[i]*bs2; 562ec4f40fdSPierre Jolivet v2 = bv + bi[i]*bs2; 563397b6df1SKris Buschelman 564ec4f40fdSPierre Jolivet if (bs>1) { 565ec4f40fdSPierre Jolivet /* A-part */ 566ec4f40fdSPierre Jolivet for (j=0; j<countA; j++) { 567ec4f40fdSPierre Jolivet for (k=0; k<bs; k++) { 568ec4f40fdSPierre Jolivet for (m=0; m<bs; m++) { 569ec4f40fdSPierre Jolivet if (rstart + ajj[j]*bs>irow || k>=m) { 570ec4f40fdSPierre Jolivet if (reuse == MAT_INITIAL_MATRIX) { 571ec4f40fdSPierre Jolivet row[jj] = irow + m + shift; col[jj] = rstart + ajj[j]*bs + k + shift; 572ec4f40fdSPierre Jolivet } 573ec4f40fdSPierre Jolivet val[jj++] = v1[j*bs2 + m + k*bs]; 574ec4f40fdSPierre Jolivet } 575ec4f40fdSPierre Jolivet } 576ec4f40fdSPierre Jolivet } 577ec4f40fdSPierre Jolivet } 578ec4f40fdSPierre Jolivet 579ec4f40fdSPierre Jolivet /* B-part */ 580ec4f40fdSPierre Jolivet for (j=0; j < countB; j++) { 581ec4f40fdSPierre Jolivet for (k=0; k<bs; k++) { 582ec4f40fdSPierre Jolivet for (m=0; m<bs; m++) { 583ec4f40fdSPierre Jolivet if (reuse == MAT_INITIAL_MATRIX) { 584ec4f40fdSPierre Jolivet row[jj] = irow + m + shift; col[jj] = garray[bjj[j]]*bs + k + shift; 585ec4f40fdSPierre Jolivet } 586ec4f40fdSPierre Jolivet val[jj++] = v2[j*bs2 + m + k*bs]; 587ec4f40fdSPierre Jolivet } 588ec4f40fdSPierre Jolivet } 589ec4f40fdSPierre Jolivet } 590ec4f40fdSPierre Jolivet } else { 591397b6df1SKris Buschelman /* A-part */ 592397b6df1SKris Buschelman for (j=0; j<countA; j++) { 593bccb9932SShri Abhyankar if (reuse == MAT_INITIAL_MATRIX) { 594397b6df1SKris Buschelman row[jj] = irow + shift; col[jj] = rstart + ajj[j] + shift; 595397b6df1SKris Buschelman } 59616ebf90aSShri Abhyankar val[jj++] = v1[j]; 597397b6df1SKris Buschelman } 59816ebf90aSShri Abhyankar 59916ebf90aSShri Abhyankar /* B-part */ 60016ebf90aSShri Abhyankar for (j=0; j < countB; j++) { 601bccb9932SShri Abhyankar if (reuse == MAT_INITIAL_MATRIX) { 602397b6df1SKris Buschelman row[jj] = irow + shift; col[jj] = garray[bjj[j]] + shift; 603397b6df1SKris Buschelman } 60416ebf90aSShri Abhyankar val[jj++] = v2[j]; 60516ebf90aSShri Abhyankar } 60616ebf90aSShri Abhyankar } 607ec4f40fdSPierre Jolivet irow+=bs; 608ec4f40fdSPierre Jolivet } 609ec4f40fdSPierre Jolivet *nnz = jj; 61016ebf90aSShri Abhyankar PetscFunctionReturn(0); 61116ebf90aSShri Abhyankar } 61216ebf90aSShri Abhyankar 613bccb9932SShri Abhyankar PetscErrorCode MatConvertToTriples_mpiaij_mpiaij(Mat A,int shift,MatReuse reuse,int *nnz,int **r, int **c, PetscScalar **v) 61416ebf90aSShri Abhyankar { 61516ebf90aSShri Abhyankar const PetscInt *ai, *aj, *bi, *bj,*garray,m=A->rmap->n,*ajj,*bjj; 61616ebf90aSShri Abhyankar PetscErrorCode ierr; 61716ebf90aSShri Abhyankar PetscInt rstart,nz,i,j,jj,irow,countA,countB; 61816ebf90aSShri Abhyankar PetscInt *row,*col; 61916ebf90aSShri Abhyankar const PetscScalar *av, *bv,*v1,*v2; 62016ebf90aSShri Abhyankar PetscScalar *val; 62116ebf90aSShri Abhyankar Mat_MPIAIJ *mat = (Mat_MPIAIJ*)A->data; 62216ebf90aSShri Abhyankar Mat_SeqAIJ *aa = (Mat_SeqAIJ*)(mat->A)->data; 62316ebf90aSShri Abhyankar Mat_SeqAIJ *bb = (Mat_SeqAIJ*)(mat->B)->data; 62416ebf90aSShri Abhyankar 62516ebf90aSShri Abhyankar PetscFunctionBegin; 62638548759SBarry Smith rstart = A->rmap->rstart; 62738548759SBarry Smith ai = aa->i; 62838548759SBarry Smith aj = aa->j; 62938548759SBarry Smith bi = bb->i; 63038548759SBarry Smith bj = bb->j; 63138548759SBarry Smith av = aa->a; 63238548759SBarry Smith bv = bb->a; 63316ebf90aSShri Abhyankar 6342205254eSKarl Rupp garray = mat->garray; 6352205254eSKarl Rupp 636bccb9932SShri Abhyankar if (reuse == MAT_INITIAL_MATRIX) { 63716ebf90aSShri Abhyankar nz = aa->nz + bb->nz; 63816ebf90aSShri Abhyankar *nnz = nz; 639185f6596SHong Zhang ierr = PetscMalloc((2*nz*sizeof(PetscInt)+nz*sizeof(PetscScalar)), &row);CHKERRQ(ierr); 640185f6596SHong Zhang col = row + nz; 641185f6596SHong Zhang val = (PetscScalar*)(col + nz); 642185f6596SHong Zhang 64316ebf90aSShri Abhyankar *r = row; *c = col; *v = val; 64416ebf90aSShri Abhyankar } else { 64516ebf90aSShri Abhyankar row = *r; col = *c; val = *v; 64616ebf90aSShri Abhyankar } 64716ebf90aSShri Abhyankar 64816ebf90aSShri Abhyankar jj = 0; irow = rstart; 64916ebf90aSShri Abhyankar for (i=0; i<m; i++) { 65016ebf90aSShri Abhyankar ajj = aj + ai[i]; /* ptr to the beginning of this row */ 65116ebf90aSShri Abhyankar countA = ai[i+1] - ai[i]; 65216ebf90aSShri Abhyankar countB = bi[i+1] - bi[i]; 65316ebf90aSShri Abhyankar bjj = bj + bi[i]; 65416ebf90aSShri Abhyankar v1 = av + ai[i]; 65516ebf90aSShri Abhyankar v2 = bv + bi[i]; 65616ebf90aSShri Abhyankar 65716ebf90aSShri Abhyankar /* A-part */ 65816ebf90aSShri Abhyankar for (j=0; j<countA; j++) { 659bccb9932SShri Abhyankar if (reuse == MAT_INITIAL_MATRIX) { 66016ebf90aSShri Abhyankar row[jj] = irow + shift; col[jj] = rstart + ajj[j] + shift; 66116ebf90aSShri Abhyankar } 66216ebf90aSShri Abhyankar val[jj++] = v1[j]; 66316ebf90aSShri Abhyankar } 66416ebf90aSShri Abhyankar 66516ebf90aSShri Abhyankar /* B-part */ 66616ebf90aSShri Abhyankar for (j=0; j < countB; j++) { 667bccb9932SShri Abhyankar if (reuse == MAT_INITIAL_MATRIX) { 66816ebf90aSShri Abhyankar row[jj] = irow + shift; col[jj] = garray[bjj[j]] + shift; 66916ebf90aSShri Abhyankar } 67016ebf90aSShri Abhyankar val[jj++] = v2[j]; 67116ebf90aSShri Abhyankar } 67216ebf90aSShri Abhyankar irow++; 67316ebf90aSShri Abhyankar } 67416ebf90aSShri Abhyankar PetscFunctionReturn(0); 67516ebf90aSShri Abhyankar } 67616ebf90aSShri Abhyankar 677bccb9932SShri Abhyankar PetscErrorCode MatConvertToTriples_mpibaij_mpiaij(Mat A,int shift,MatReuse reuse,int *nnz,int **r, int **c, PetscScalar **v) 67867877ebaSShri Abhyankar { 67967877ebaSShri Abhyankar Mat_MPIBAIJ *mat = (Mat_MPIBAIJ*)A->data; 68067877ebaSShri Abhyankar Mat_SeqBAIJ *aa = (Mat_SeqBAIJ*)(mat->A)->data; 68167877ebaSShri Abhyankar Mat_SeqBAIJ *bb = (Mat_SeqBAIJ*)(mat->B)->data; 68267877ebaSShri Abhyankar const PetscInt *ai = aa->i, *bi = bb->i, *aj = aa->j, *bj = bb->j,*ajj, *bjj; 683d985c460SShri Abhyankar const PetscInt *garray = mat->garray,mbs=mat->mbs,rstart=A->rmap->rstart; 68433d57670SJed Brown const PetscInt bs2=mat->bs2; 68567877ebaSShri Abhyankar PetscErrorCode ierr; 68633d57670SJed Brown PetscInt bs,nz,i,j,k,n,jj,irow,countA,countB,idx; 68767877ebaSShri Abhyankar PetscInt *row,*col; 68867877ebaSShri Abhyankar const PetscScalar *av=aa->a, *bv=bb->a,*v1,*v2; 68967877ebaSShri Abhyankar PetscScalar *val; 69067877ebaSShri Abhyankar 69167877ebaSShri Abhyankar PetscFunctionBegin; 69233d57670SJed Brown ierr = MatGetBlockSize(A,&bs);CHKERRQ(ierr); 693bccb9932SShri Abhyankar if (reuse == MAT_INITIAL_MATRIX) { 69467877ebaSShri Abhyankar nz = bs2*(aa->nz + bb->nz); 69567877ebaSShri Abhyankar *nnz = nz; 696185f6596SHong Zhang ierr = PetscMalloc((2*nz*sizeof(PetscInt)+nz*sizeof(PetscScalar)), &row);CHKERRQ(ierr); 697185f6596SHong Zhang col = row + nz; 698185f6596SHong Zhang val = (PetscScalar*)(col + nz); 699185f6596SHong Zhang 70067877ebaSShri Abhyankar *r = row; *c = col; *v = val; 70167877ebaSShri Abhyankar } else { 70267877ebaSShri Abhyankar row = *r; col = *c; val = *v; 70367877ebaSShri Abhyankar } 70467877ebaSShri Abhyankar 705d985c460SShri Abhyankar jj = 0; irow = rstart; 70667877ebaSShri Abhyankar for (i=0; i<mbs; i++) { 70767877ebaSShri Abhyankar countA = ai[i+1] - ai[i]; 70867877ebaSShri Abhyankar countB = bi[i+1] - bi[i]; 70967877ebaSShri Abhyankar ajj = aj + ai[i]; 71067877ebaSShri Abhyankar bjj = bj + bi[i]; 71167877ebaSShri Abhyankar v1 = av + bs2*ai[i]; 71267877ebaSShri Abhyankar v2 = bv + bs2*bi[i]; 71367877ebaSShri Abhyankar 71467877ebaSShri Abhyankar idx = 0; 71567877ebaSShri Abhyankar /* A-part */ 71667877ebaSShri Abhyankar for (k=0; k<countA; k++) { 71767877ebaSShri Abhyankar for (j=0; j<bs; j++) { 71867877ebaSShri Abhyankar for (n=0; n<bs; n++) { 719bccb9932SShri Abhyankar if (reuse == MAT_INITIAL_MATRIX) { 720d985c460SShri Abhyankar row[jj] = irow + n + shift; 721d985c460SShri Abhyankar col[jj] = rstart + bs*ajj[k] + j + shift; 72267877ebaSShri Abhyankar } 72367877ebaSShri Abhyankar val[jj++] = v1[idx++]; 72467877ebaSShri Abhyankar } 72567877ebaSShri Abhyankar } 72667877ebaSShri Abhyankar } 72767877ebaSShri Abhyankar 72867877ebaSShri Abhyankar idx = 0; 72967877ebaSShri Abhyankar /* B-part */ 73067877ebaSShri Abhyankar for (k=0; k<countB; k++) { 73167877ebaSShri Abhyankar for (j=0; j<bs; j++) { 73267877ebaSShri Abhyankar for (n=0; n<bs; n++) { 733bccb9932SShri Abhyankar if (reuse == MAT_INITIAL_MATRIX) { 734d985c460SShri Abhyankar row[jj] = irow + n + shift; 735d985c460SShri Abhyankar col[jj] = bs*garray[bjj[k]] + j + shift; 73667877ebaSShri Abhyankar } 737d985c460SShri Abhyankar val[jj++] = v2[idx++]; 73867877ebaSShri Abhyankar } 73967877ebaSShri Abhyankar } 74067877ebaSShri Abhyankar } 741d985c460SShri Abhyankar irow += bs; 74267877ebaSShri Abhyankar } 74367877ebaSShri Abhyankar PetscFunctionReturn(0); 74467877ebaSShri Abhyankar } 74567877ebaSShri Abhyankar 746bccb9932SShri Abhyankar PetscErrorCode MatConvertToTriples_mpiaij_mpisbaij(Mat A,int shift,MatReuse reuse,int *nnz,int **r, int **c, PetscScalar **v) 74716ebf90aSShri Abhyankar { 74816ebf90aSShri Abhyankar const PetscInt *ai, *aj,*adiag, *bi, *bj,*garray,m=A->rmap->n,*ajj,*bjj; 74916ebf90aSShri Abhyankar PetscErrorCode ierr; 750e0bace9bSHong Zhang PetscInt rstart,nz,nza,nzb,i,j,jj,irow,countA,countB; 75116ebf90aSShri Abhyankar PetscInt *row,*col; 75216ebf90aSShri Abhyankar const PetscScalar *av, *bv,*v1,*v2; 75316ebf90aSShri Abhyankar PetscScalar *val; 75416ebf90aSShri Abhyankar Mat_MPIAIJ *mat = (Mat_MPIAIJ*)A->data; 75516ebf90aSShri Abhyankar Mat_SeqAIJ *aa =(Mat_SeqAIJ*)(mat->A)->data; 75616ebf90aSShri Abhyankar Mat_SeqAIJ *bb =(Mat_SeqAIJ*)(mat->B)->data; 75738548759SBarry Smith #if defined(PETSC_USE_COMPLEX) 75838548759SBarry Smith PetscBool hermitian; 75938548759SBarry Smith #endif 76016ebf90aSShri Abhyankar 76116ebf90aSShri Abhyankar PetscFunctionBegin; 76238548759SBarry Smith #if defined(PETSC_USE_COMPLEX) 76338548759SBarry Smith ierr = MatGetOption(A,MAT_HERMITIAN,&hermitian);CHKERRQ(ierr); 76438548759SBarry Smith if (hermitian) SETERRQ(PetscObjectComm((PetscObject)A),PETSC_ERR_SUP,"MUMPS does not support Hermitian symmetric matrices for Choleksy"); 76538548759SBarry Smith #endif 76638548759SBarry Smith ai = aa->i; 76738548759SBarry Smith aj = aa->j; 76838548759SBarry Smith adiag = aa->diag; 76938548759SBarry Smith bi = bb->i; 77038548759SBarry Smith bj = bb->j; 77138548759SBarry Smith garray = mat->garray; 77238548759SBarry Smith av = aa->a; 77338548759SBarry Smith bv = bb->a; 7742205254eSKarl Rupp 77516ebf90aSShri Abhyankar rstart = A->rmap->rstart; 77616ebf90aSShri Abhyankar 777bccb9932SShri Abhyankar if (reuse == MAT_INITIAL_MATRIX) { 778e0bace9bSHong Zhang nza = 0; /* num of upper triangular entries in mat->A, including diagonals */ 779e0bace9bSHong Zhang nzb = 0; /* num of upper triangular entries in mat->B */ 78016ebf90aSShri Abhyankar for (i=0; i<m; i++) { 781e0bace9bSHong Zhang nza += (ai[i+1] - adiag[i]); 78216ebf90aSShri Abhyankar countB = bi[i+1] - bi[i]; 78316ebf90aSShri Abhyankar bjj = bj + bi[i]; 784e0bace9bSHong Zhang for (j=0; j<countB; j++) { 785e0bace9bSHong Zhang if (garray[bjj[j]] > rstart) nzb++; 786e0bace9bSHong Zhang } 787e0bace9bSHong Zhang } 78816ebf90aSShri Abhyankar 789e0bace9bSHong Zhang nz = nza + nzb; /* total nz of upper triangular part of mat */ 79016ebf90aSShri Abhyankar *nnz = nz; 791185f6596SHong Zhang ierr = PetscMalloc((2*nz*sizeof(PetscInt)+nz*sizeof(PetscScalar)), &row);CHKERRQ(ierr); 792185f6596SHong Zhang col = row + nz; 793185f6596SHong Zhang val = (PetscScalar*)(col + nz); 794185f6596SHong Zhang 79516ebf90aSShri Abhyankar *r = row; *c = col; *v = val; 79616ebf90aSShri Abhyankar } else { 79716ebf90aSShri Abhyankar row = *r; col = *c; val = *v; 79816ebf90aSShri Abhyankar } 79916ebf90aSShri Abhyankar 80016ebf90aSShri Abhyankar jj = 0; irow = rstart; 80116ebf90aSShri Abhyankar for (i=0; i<m; i++) { 80216ebf90aSShri Abhyankar ajj = aj + adiag[i]; /* ptr to the beginning of the diagonal of this row */ 80316ebf90aSShri Abhyankar v1 = av + adiag[i]; 80416ebf90aSShri Abhyankar countA = ai[i+1] - adiag[i]; 80516ebf90aSShri Abhyankar countB = bi[i+1] - bi[i]; 80616ebf90aSShri Abhyankar bjj = bj + bi[i]; 80716ebf90aSShri Abhyankar v2 = bv + bi[i]; 80816ebf90aSShri Abhyankar 80916ebf90aSShri Abhyankar /* A-part */ 81016ebf90aSShri Abhyankar for (j=0; j<countA; j++) { 811bccb9932SShri Abhyankar if (reuse == MAT_INITIAL_MATRIX) { 81216ebf90aSShri Abhyankar row[jj] = irow + shift; col[jj] = rstart + ajj[j] + shift; 81316ebf90aSShri Abhyankar } 81416ebf90aSShri Abhyankar val[jj++] = v1[j]; 81516ebf90aSShri Abhyankar } 81616ebf90aSShri Abhyankar 81716ebf90aSShri Abhyankar /* B-part */ 81816ebf90aSShri Abhyankar for (j=0; j < countB; j++) { 81916ebf90aSShri Abhyankar if (garray[bjj[j]] > rstart) { 820bccb9932SShri Abhyankar if (reuse == MAT_INITIAL_MATRIX) { 82116ebf90aSShri Abhyankar row[jj] = irow + shift; col[jj] = garray[bjj[j]] + shift; 82216ebf90aSShri Abhyankar } 82316ebf90aSShri Abhyankar val[jj++] = v2[j]; 82416ebf90aSShri Abhyankar } 825397b6df1SKris Buschelman } 826397b6df1SKris Buschelman irow++; 827397b6df1SKris Buschelman } 828397b6df1SKris Buschelman PetscFunctionReturn(0); 829397b6df1SKris Buschelman } 830397b6df1SKris Buschelman 831dfbe8321SBarry Smith PetscErrorCode MatDestroy_MUMPS(Mat A) 832dfbe8321SBarry Smith { 833e69c285eSBarry Smith Mat_MUMPS *mumps=(Mat_MUMPS*)A->data; 834dfbe8321SBarry Smith PetscErrorCode ierr; 835b24902e0SBarry Smith 836397b6df1SKris Buschelman PetscFunctionBegin; 837a5e57a09SHong Zhang ierr = PetscFree2(mumps->id.sol_loc,mumps->id.isol_loc);CHKERRQ(ierr); 838a5e57a09SHong Zhang ierr = VecScatterDestroy(&mumps->scat_rhs);CHKERRQ(ierr); 839a5e57a09SHong Zhang ierr = VecScatterDestroy(&mumps->scat_sol);CHKERRQ(ierr); 840801fbe65SHong Zhang ierr = VecDestroy(&mumps->b_seq);CHKERRQ(ierr); 841a5e57a09SHong Zhang ierr = VecDestroy(&mumps->x_seq);CHKERRQ(ierr); 842a5e57a09SHong Zhang ierr = PetscFree(mumps->id.perm_in);CHKERRQ(ierr); 843a5e57a09SHong Zhang ierr = PetscFree(mumps->irn);CHKERRQ(ierr); 844b34f08ffSHong Zhang ierr = PetscFree(mumps->info);CHKERRQ(ierr); 84559ac8732SStefano Zampini ierr = MatMumpsResetSchur_Private(mumps);CHKERRQ(ierr); 846a5e57a09SHong Zhang mumps->id.job = JOB_END; 8473ab56b82SJunchao Zhang PetscMUMPS_c(mumps); 8483ab56b82SJunchao Zhang #if defined(PETSC_HAVE_OPENMP_SUPPORT) 8493ab56b82SJunchao Zhang if (mumps->use_petsc_omp_support) { ierr = PetscOmpCtrlDestroy(&mumps->omp_ctrl);CHKERRQ(ierr); } 8503ab56b82SJunchao Zhang #endif 8513ab56b82SJunchao Zhang ierr = PetscFree2(mumps->recvcount,mumps->displs);CHKERRQ(ierr); 852e69c285eSBarry Smith ierr = PetscFree(A->data);CHKERRQ(ierr); 853bf0cc555SLisandro Dalcin 85497969023SHong Zhang /* clear composed functions */ 8553ca39a21SBarry Smith ierr = PetscObjectComposeFunction((PetscObject)A,"MatFactorGetSolverType_C",NULL);CHKERRQ(ierr); 8565a05ddb0SStefano Zampini ierr = PetscObjectComposeFunction((PetscObject)A,"MatFactorSetSchurIS_C",NULL);CHKERRQ(ierr); 8575a05ddb0SStefano Zampini ierr = PetscObjectComposeFunction((PetscObject)A,"MatFactorCreateSchurComplement_C",NULL);CHKERRQ(ierr); 858bdf89e91SBarry Smith ierr = PetscObjectComposeFunction((PetscObject)A,"MatMumpsSetIcntl_C",NULL);CHKERRQ(ierr); 859bc6112feSHong Zhang ierr = PetscObjectComposeFunction((PetscObject)A,"MatMumpsGetIcntl_C",NULL);CHKERRQ(ierr); 860bdf89e91SBarry Smith ierr = PetscObjectComposeFunction((PetscObject)A,"MatMumpsSetCntl_C",NULL);CHKERRQ(ierr); 861bc6112feSHong Zhang ierr = PetscObjectComposeFunction((PetscObject)A,"MatMumpsGetCntl_C",NULL);CHKERRQ(ierr); 862ca810319SHong Zhang ierr = PetscObjectComposeFunction((PetscObject)A,"MatMumpsGetInfo_C",NULL);CHKERRQ(ierr); 863ca810319SHong Zhang ierr = PetscObjectComposeFunction((PetscObject)A,"MatMumpsGetInfog_C",NULL);CHKERRQ(ierr); 864ca810319SHong Zhang ierr = PetscObjectComposeFunction((PetscObject)A,"MatMumpsGetRinfo_C",NULL);CHKERRQ(ierr); 865ca810319SHong Zhang ierr = PetscObjectComposeFunction((PetscObject)A,"MatMumpsGetRinfog_C",NULL);CHKERRQ(ierr); 86689a9c03aSHong Zhang ierr = PetscObjectComposeFunction((PetscObject)A,"MatMumpsGetInverse_C",NULL);CHKERRQ(ierr); 8670e6b8875SHong Zhang ierr = PetscObjectComposeFunction((PetscObject)A,"MatMumpsGetInverseTranspose_C",NULL);CHKERRQ(ierr); 868397b6df1SKris Buschelman PetscFunctionReturn(0); 869397b6df1SKris Buschelman } 870397b6df1SKris Buschelman 871b24902e0SBarry Smith PetscErrorCode MatSolve_MUMPS(Mat A,Vec b,Vec x) 872b24902e0SBarry Smith { 873e69c285eSBarry Smith Mat_MUMPS *mumps=(Mat_MUMPS*)A->data; 874d54de34fSKris Buschelman PetscScalar *array; 87567877ebaSShri Abhyankar Vec b_seq; 876329ec9b3SHong Zhang IS is_iden,is_petsc; 877dfbe8321SBarry Smith PetscErrorCode ierr; 878329ec9b3SHong Zhang PetscInt i; 879cc86f929SStefano Zampini PetscBool second_solve = PETSC_FALSE; 880883f2eb9SBarry Smith static PetscBool cite1 = PETSC_FALSE,cite2 = PETSC_FALSE; 881397b6df1SKris Buschelman 882397b6df1SKris Buschelman PetscFunctionBegin; 883883f2eb9SBarry 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); 884883f2eb9SBarry 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); 8852aca8efcSHong Zhang 886603e8f96SBarry Smith if (A->factorerrortype) { 8872aca8efcSHong Zhang ierr = PetscInfo2(A,"MatSolve is called with singular matrix factor, INFOG(1)=%d, INFO(2)=%d\n",mumps->id.INFOG(1),mumps->id.INFO(2));CHKERRQ(ierr); 8882aca8efcSHong Zhang ierr = VecSetInf(x);CHKERRQ(ierr); 8892aca8efcSHong Zhang PetscFunctionReturn(0); 8902aca8efcSHong Zhang } 8912aca8efcSHong Zhang 892be818407SHong Zhang mumps->id.ICNTL(20) = 0; /* dense RHS */ 893a5e57a09SHong Zhang mumps->id.nrhs = 1; 894a5e57a09SHong Zhang b_seq = mumps->b_seq; 8952d4298aeSJunchao Zhang if (mumps->petsc_size > 1) { 896329ec9b3SHong Zhang /* MUMPS only supports centralized rhs. Scatter b into a seqential rhs vector */ 897a5e57a09SHong Zhang ierr = VecScatterBegin(mumps->scat_rhs,b,b_seq,INSERT_VALUES,SCATTER_FORWARD);CHKERRQ(ierr); 898a5e57a09SHong Zhang ierr = VecScatterEnd(mumps->scat_rhs,b,b_seq,INSERT_VALUES,SCATTER_FORWARD);CHKERRQ(ierr); 899a5e57a09SHong Zhang if (!mumps->myid) {ierr = VecGetArray(b_seq,&array);CHKERRQ(ierr);} 9003ab56b82SJunchao Zhang } else { /* petsc_size == 1 */ 901397b6df1SKris Buschelman ierr = VecCopy(b,x);CHKERRQ(ierr); 902397b6df1SKris Buschelman ierr = VecGetArray(x,&array);CHKERRQ(ierr); 903397b6df1SKris Buschelman } 904a5e57a09SHong Zhang if (!mumps->myid) { /* define rhs on the host */ 905a5e57a09SHong Zhang mumps->id.nrhs = 1; 906940cd9d6SSatish Balay mumps->id.rhs = (MumpsScalar*)array; 907397b6df1SKris Buschelman } 908397b6df1SKris Buschelman 909cc86f929SStefano Zampini /* 910cc86f929SStefano Zampini handle condensation step of Schur complement (if any) 911cc86f929SStefano Zampini We set by default ICNTL(26) == -1 when Schur indices have been provided by the user. 912cc86f929SStefano Zampini According to MUMPS (5.0.0) manual, any value should be harmful during the factorization phase 913cc86f929SStefano Zampini Unless the user provides a valid value for ICNTL(26), MatSolve and MatMatSolve routines solve the full system. 914cc86f929SStefano Zampini This requires an extra call to PetscMUMPS_c and the computation of the factors for S 915cc86f929SStefano Zampini */ 916583f777eSStefano Zampini if (mumps->id.size_schur > 0 && (mumps->id.ICNTL(26) < 0 || mumps->id.ICNTL(26) > 2)) { 9172d4298aeSJunchao Zhang if (mumps->petsc_size > 1) SETERRQ(PetscObjectComm((PetscObject)A),PETSC_ERR_SUP,"Parallel Schur complements not yet supported from PETSc\n"); 918cc86f929SStefano Zampini second_solve = PETSC_TRUE; 919b3cb21ddSStefano Zampini ierr = MatMumpsHandleSchur_Private(A,PETSC_FALSE);CHKERRQ(ierr); 920cc86f929SStefano Zampini } 921397b6df1SKris Buschelman /* solve phase */ 922329ec9b3SHong Zhang /*-------------*/ 923a5e57a09SHong Zhang mumps->id.job = JOB_SOLVE; 9243ab56b82SJunchao Zhang PetscMUMPS_c(mumps); 925a5e57a09SHong 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)); 926397b6df1SKris Buschelman 927b5fa320bSStefano Zampini /* handle expansion step of Schur complement (if any) */ 928cc86f929SStefano Zampini if (second_solve) { 929b3cb21ddSStefano Zampini ierr = MatMumpsHandleSchur_Private(A,PETSC_TRUE);CHKERRQ(ierr); 930cc86f929SStefano Zampini } 931b5fa320bSStefano Zampini 9322d4298aeSJunchao Zhang if (mumps->petsc_size > 1) { /* convert mumps distributed solution to petsc mpi x */ 933a5e57a09SHong Zhang if (mumps->scat_sol && mumps->ICNTL9_pre != mumps->id.ICNTL(9)) { 934a5e57a09SHong Zhang /* when id.ICNTL(9) changes, the contents of lsol_loc may change (not its size, lsol_loc), recreates scat_sol */ 935a5e57a09SHong Zhang ierr = VecScatterDestroy(&mumps->scat_sol);CHKERRQ(ierr); 936397b6df1SKris Buschelman } 937a5e57a09SHong Zhang if (!mumps->scat_sol) { /* create scatter scat_sol */ 938a5e57a09SHong Zhang ierr = ISCreateStride(PETSC_COMM_SELF,mumps->id.lsol_loc,0,1,&is_iden);CHKERRQ(ierr); /* from */ 939a5e57a09SHong Zhang for (i=0; i<mumps->id.lsol_loc; i++) { 940a5e57a09SHong Zhang mumps->id.isol_loc[i] -= 1; /* change Fortran style to C style */ 941a5e57a09SHong Zhang } 942a5e57a09SHong Zhang ierr = ISCreateGeneral(PETSC_COMM_SELF,mumps->id.lsol_loc,mumps->id.isol_loc,PETSC_COPY_VALUES,&is_petsc);CHKERRQ(ierr); /* to */ 9439448b7f1SJunchao Zhang ierr = VecScatterCreate(mumps->x_seq,is_iden,x,is_petsc,&mumps->scat_sol);CHKERRQ(ierr); 9446bf464f9SBarry Smith ierr = ISDestroy(&is_iden);CHKERRQ(ierr); 9456bf464f9SBarry Smith ierr = ISDestroy(&is_petsc);CHKERRQ(ierr); 9462205254eSKarl Rupp 947a5e57a09SHong Zhang mumps->ICNTL9_pre = mumps->id.ICNTL(9); /* save current value of id.ICNTL(9) */ 948397b6df1SKris Buschelman } 949a5e57a09SHong Zhang 950a5e57a09SHong Zhang ierr = VecScatterBegin(mumps->scat_sol,mumps->x_seq,x,INSERT_VALUES,SCATTER_FORWARD);CHKERRQ(ierr); 951a5e57a09SHong Zhang ierr = VecScatterEnd(mumps->scat_sol,mumps->x_seq,x,INSERT_VALUES,SCATTER_FORWARD);CHKERRQ(ierr); 952329ec9b3SHong Zhang } 953353d7d71SJunchao Zhang 954353d7d71SJunchao Zhang if (mumps->petsc_size > 1) {if (!mumps->myid) {ierr = VecRestoreArray(b_seq,&array);CHKERRQ(ierr);}} 955353d7d71SJunchao Zhang else {ierr = VecRestoreArray(x,&array);CHKERRQ(ierr);} 956353d7d71SJunchao Zhang 9579880c9b4SStefano Zampini ierr = PetscLogFlops(2.0*mumps->id.RINFO(3));CHKERRQ(ierr); 958397b6df1SKris Buschelman PetscFunctionReturn(0); 959397b6df1SKris Buschelman } 960397b6df1SKris Buschelman 96151d5961aSHong Zhang PetscErrorCode MatSolveTranspose_MUMPS(Mat A,Vec b,Vec x) 96251d5961aSHong Zhang { 963e69c285eSBarry Smith Mat_MUMPS *mumps=(Mat_MUMPS*)A->data; 96451d5961aSHong Zhang PetscErrorCode ierr; 96551d5961aSHong Zhang 96651d5961aSHong Zhang PetscFunctionBegin; 967a5e57a09SHong Zhang mumps->id.ICNTL(9) = 0; 9680ad0caddSJed Brown ierr = MatSolve_MUMPS(A,b,x);CHKERRQ(ierr); 969a5e57a09SHong Zhang mumps->id.ICNTL(9) = 1; 97051d5961aSHong Zhang PetscFunctionReturn(0); 97151d5961aSHong Zhang } 97251d5961aSHong Zhang 973e0b74bf9SHong Zhang PetscErrorCode MatMatSolve_MUMPS(Mat A,Mat B,Mat X) 974e0b74bf9SHong Zhang { 975bda8bf91SBarry Smith PetscErrorCode ierr; 976b8491c3eSStefano Zampini Mat Bt = NULL; 977b8491c3eSStefano Zampini PetscBool flg, flgT; 978e69c285eSBarry Smith Mat_MUMPS *mumps=(Mat_MUMPS*)A->data; 979334c5f61SHong Zhang PetscInt i,nrhs,M; 9801683a169SBarry Smith PetscScalar *array; 9811683a169SBarry Smith const PetscScalar *rbray; 9825b7de3c2SKarl Rupp PetscInt lsol_loc,nlsol_loc,*isol_loc,*idxx,*isol_loc_save,iidx = 0; 9831683a169SBarry Smith PetscScalar *bray,*sol_loc,*sol_loc_save; 984be818407SHong Zhang IS is_to,is_from; 985beae5ec0SHong Zhang PetscInt k,proc,j,m,myrstart; 986be818407SHong Zhang const PetscInt *rstart; 987beae5ec0SHong Zhang Vec v_mpi,b_seq,msol_loc; 988be818407SHong Zhang VecScatter scat_rhs,scat_sol; 989be818407SHong Zhang PetscScalar *aa; 990be818407SHong Zhang PetscInt spnr,*ia,*ja; 991d56c302dSHong Zhang Mat_MPIAIJ *b = NULL; 992bda8bf91SBarry Smith 993e0b74bf9SHong Zhang PetscFunctionBegin; 994be818407SHong Zhang ierr = PetscObjectTypeCompareAny((PetscObject)X,&flg,MATSEQDENSE,MATMPIDENSE,NULL);CHKERRQ(ierr); 995be818407SHong Zhang if (!flg) SETERRQ(PetscObjectComm((PetscObject)X),PETSC_ERR_ARG_WRONG,"Matrix X must be MATDENSE matrix"); 996be818407SHong Zhang 9970298fd71SBarry Smith ierr = PetscObjectTypeCompareAny((PetscObject)B,&flg,MATSEQDENSE,MATMPIDENSE,NULL);CHKERRQ(ierr); 998be818407SHong Zhang if (flg) { /* dense B */ 999c0be3364SHong Zhang if (B->rmap->n != X->rmap->n) SETERRQ(PETSC_COMM_SELF,PETSC_ERR_ARG_WRONG,"Matrix B and X must have same row distribution"); 1000be818407SHong Zhang mumps->id.ICNTL(20)= 0; /* dense RHS */ 10010e6b8875SHong Zhang } else { /* sparse B */ 1002be818407SHong Zhang ierr = PetscObjectTypeCompare((PetscObject)B,MATTRANSPOSEMAT,&flgT);CHKERRQ(ierr); 10030e6b8875SHong Zhang if (flgT) { /* input B is transpose of actural RHS matrix, 10040e6b8875SHong Zhang because mumps requires sparse compressed COLUMN storage! See MatMatTransposeSolve_MUMPS() */ 1005be818407SHong Zhang ierr = MatTransposeGetMat(B,&Bt);CHKERRQ(ierr); 10060f52d626SJunchao Zhang } else SETERRQ(PetscObjectComm((PetscObject)B),PETSC_ERR_ARG_WRONG,"Matrix B must be MATTRANSPOSEMAT matrix"); 1007be818407SHong Zhang mumps->id.ICNTL(20)= 1; /* sparse RHS */ 1008b8491c3eSStefano Zampini } 100987b22cf4SHong Zhang 10109481e6e9SHong Zhang ierr = MatGetSize(B,&M,&nrhs);CHKERRQ(ierr); 10119481e6e9SHong Zhang mumps->id.nrhs = nrhs; 10129481e6e9SHong Zhang mumps->id.lrhs = M; 10132b691707SHong Zhang mumps->id.rhs = NULL; 10149481e6e9SHong Zhang 10152d4298aeSJunchao Zhang if (mumps->petsc_size == 1) { 1016b8491c3eSStefano Zampini PetscScalar *aa; 1017b8491c3eSStefano Zampini PetscInt spnr,*ia,*ja; 1018e94cce23SStefano Zampini PetscBool second_solve = PETSC_FALSE; 1019b8491c3eSStefano Zampini 10202cd7d884SHong Zhang ierr = MatDenseGetArray(X,&array);CHKERRQ(ierr); 1021b8491c3eSStefano Zampini mumps->id.rhs = (MumpsScalar*)array; 10222b691707SHong Zhang 10232b691707SHong Zhang if (!Bt) { /* dense B */ 10242b691707SHong Zhang /* copy B to X */ 10251683a169SBarry Smith ierr = MatDenseGetArrayRead(B,&rbray);CHKERRQ(ierr); 1026580bdb30SBarry Smith ierr = PetscArraycpy(array,rbray,M*nrhs);CHKERRQ(ierr); 10271683a169SBarry Smith ierr = MatDenseRestoreArrayRead(B,&rbray);CHKERRQ(ierr); 10282b691707SHong Zhang } else { /* sparse B */ 1029b8491c3eSStefano Zampini ierr = MatSeqAIJGetArray(Bt,&aa);CHKERRQ(ierr); 1030be818407SHong Zhang ierr = MatGetRowIJ(Bt,1,PETSC_FALSE,PETSC_FALSE,&spnr,(const PetscInt**)&ia,(const PetscInt**)&ja,&flg);CHKERRQ(ierr); 1031c0be3364SHong Zhang if (!flg) SETERRQ(PETSC_COMM_SELF,PETSC_ERR_ARG_WRONG,"Cannot get IJ structure"); 10322b691707SHong Zhang /* mumps requires ia and ja start at 1! */ 1033b8491c3eSStefano Zampini mumps->id.irhs_ptr = ia; 1034b8491c3eSStefano Zampini mumps->id.irhs_sparse = ja; 1035b8491c3eSStefano Zampini mumps->id.nz_rhs = ia[spnr] - 1; 1036b8491c3eSStefano Zampini mumps->id.rhs_sparse = (MumpsScalar*)aa; 1037b8491c3eSStefano Zampini } 1038e94cce23SStefano Zampini /* handle condensation step of Schur complement (if any) */ 1039583f777eSStefano Zampini if (mumps->id.size_schur > 0 && (mumps->id.ICNTL(26) < 0 || mumps->id.ICNTL(26) > 2)) { 1040e94cce23SStefano Zampini second_solve = PETSC_TRUE; 1041b3cb21ddSStefano Zampini ierr = MatMumpsHandleSchur_Private(A,PETSC_FALSE);CHKERRQ(ierr); 1042e94cce23SStefano Zampini } 10432cd7d884SHong Zhang /* solve phase */ 10442cd7d884SHong Zhang /*-------------*/ 10452cd7d884SHong Zhang mumps->id.job = JOB_SOLVE; 10463ab56b82SJunchao Zhang PetscMUMPS_c(mumps); 10472cd7d884SHong 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)); 1048b5fa320bSStefano Zampini 1049b5fa320bSStefano Zampini /* handle expansion step of Schur complement (if any) */ 1050e94cce23SStefano Zampini if (second_solve) { 1051b3cb21ddSStefano Zampini ierr = MatMumpsHandleSchur_Private(A,PETSC_TRUE);CHKERRQ(ierr); 1052e94cce23SStefano Zampini } 10532b691707SHong Zhang if (Bt) { /* sparse B */ 1054b8491c3eSStefano Zampini ierr = MatSeqAIJRestoreArray(Bt,&aa);CHKERRQ(ierr); 1055be818407SHong Zhang ierr = MatRestoreRowIJ(Bt,1,PETSC_FALSE,PETSC_FALSE,&spnr,(const PetscInt**)&ia,(const PetscInt**)&ja,&flg);CHKERRQ(ierr); 1056c0be3364SHong Zhang if (!flg) SETERRQ(PETSC_COMM_SELF,PETSC_ERR_ARG_WRONG,"Cannot restore IJ structure"); 1057b8491c3eSStefano Zampini } 10582cd7d884SHong Zhang ierr = MatDenseRestoreArray(X,&array);CHKERRQ(ierr); 1059be818407SHong Zhang PetscFunctionReturn(0); 1060be818407SHong Zhang } 1061801fbe65SHong Zhang 1062be818407SHong Zhang /*--------- parallel case: MUMPS requires rhs B to be centralized on the host! --------*/ 10632d4298aeSJunchao Zhang if (mumps->petsc_size > 1 && mumps->id.ICNTL(19)) SETERRQ(PetscObjectComm((PetscObject)A),PETSC_ERR_SUP,"Parallel Schur complements not yet supported from PETSc\n"); 1064241dbb5eSStefano Zampini 1065beae5ec0SHong Zhang /* create msol_loc to hold mumps local solution */ 10661683a169SBarry Smith isol_loc_save = mumps->id.isol_loc; /* save it for MatSolve() */ 10671683a169SBarry Smith sol_loc_save = (PetscScalar*)mumps->id.sol_loc; 1068801fbe65SHong Zhang 1069a1dfcbd9SJunchao Zhang lsol_loc = mumps->id.lsol_loc; 107071aed81dSHong Zhang nlsol_loc = nrhs*lsol_loc; /* length of sol_loc */ 1071a1dfcbd9SJunchao Zhang ierr = PetscMalloc2(nlsol_loc,&sol_loc,lsol_loc,&isol_loc);CHKERRQ(ierr); 1072940cd9d6SSatish Balay mumps->id.sol_loc = (MumpsScalar*)sol_loc; 1073801fbe65SHong Zhang mumps->id.isol_loc = isol_loc; 1074801fbe65SHong Zhang 1075beae5ec0SHong Zhang ierr = VecCreateSeqWithArray(PETSC_COMM_SELF,1,nlsol_loc,(PetscScalar*)sol_loc,&msol_loc);CHKERRQ(ierr); 10762cd7d884SHong Zhang 10772b691707SHong Zhang if (!Bt) { /* dense B */ 107880577c12SJunchao Zhang /* TODO: Because of non-contiguous indices, the created vecscatter scat_rhs is not done in MPI_Gather, resulting in 107980577c12SJunchao Zhang very inefficient communication. An optimization is to use VecScatterCreateToZero to gather B to rank 0. Then on rank 108080577c12SJunchao Zhang 0, re-arrange B into desired order, which is a local operation. 108180577c12SJunchao Zhang */ 108280577c12SJunchao Zhang 1083beae5ec0SHong Zhang /* scatter v_mpi to b_seq because MUMPS only supports centralized rhs */ 1084be818407SHong Zhang /* wrap dense rhs matrix B into a vector v_mpi */ 10852b691707SHong Zhang ierr = MatGetLocalSize(B,&m,NULL);CHKERRQ(ierr); 10862b691707SHong Zhang ierr = MatDenseGetArray(B,&bray);CHKERRQ(ierr); 10872b691707SHong Zhang ierr = VecCreateMPIWithArray(PetscObjectComm((PetscObject)B),1,nrhs*m,nrhs*M,(const PetscScalar*)bray,&v_mpi);CHKERRQ(ierr); 10882b691707SHong Zhang ierr = MatDenseRestoreArray(B,&bray);CHKERRQ(ierr); 10892b691707SHong Zhang 1090be818407SHong Zhang /* scatter v_mpi to b_seq in proc[0]. MUMPS requires rhs to be centralized on the host! */ 1091801fbe65SHong Zhang if (!mumps->myid) { 1092beae5ec0SHong Zhang PetscInt *idx; 1093beae5ec0SHong Zhang /* idx: maps from k-th index of v_mpi to (i,j)-th global entry of B */ 1094beae5ec0SHong Zhang ierr = PetscMalloc1(nrhs*M,&idx);CHKERRQ(ierr); 1095be818407SHong Zhang ierr = MatGetOwnershipRanges(B,&rstart);CHKERRQ(ierr); 1096be818407SHong Zhang k = 0; 10972d4298aeSJunchao Zhang for (proc=0; proc<mumps->petsc_size; proc++){ 1098be818407SHong Zhang for (j=0; j<nrhs; j++){ 1099beae5ec0SHong Zhang for (i=rstart[proc]; i<rstart[proc+1]; i++) idx[k++] = j*M + i; 1100be818407SHong Zhang } 1101be818407SHong Zhang } 1102be818407SHong Zhang 1103334c5f61SHong Zhang ierr = VecCreateSeq(PETSC_COMM_SELF,nrhs*M,&b_seq);CHKERRQ(ierr); 1104beae5ec0SHong Zhang ierr = ISCreateGeneral(PETSC_COMM_SELF,nrhs*M,idx,PETSC_OWN_POINTER,&is_to);CHKERRQ(ierr); 1105801fbe65SHong Zhang ierr = ISCreateStride(PETSC_COMM_SELF,nrhs*M,0,1,&is_from);CHKERRQ(ierr); 1106801fbe65SHong Zhang } else { 1107334c5f61SHong Zhang ierr = VecCreateSeq(PETSC_COMM_SELF,0,&b_seq);CHKERRQ(ierr); 1108801fbe65SHong Zhang ierr = ISCreateStride(PETSC_COMM_SELF,0,0,1,&is_to);CHKERRQ(ierr); 1109801fbe65SHong Zhang ierr = ISCreateStride(PETSC_COMM_SELF,0,0,1,&is_from);CHKERRQ(ierr); 1110801fbe65SHong Zhang } 11119448b7f1SJunchao Zhang ierr = VecScatterCreate(v_mpi,is_from,b_seq,is_to,&scat_rhs);CHKERRQ(ierr); 1112334c5f61SHong Zhang ierr = VecScatterBegin(scat_rhs,v_mpi,b_seq,INSERT_VALUES,SCATTER_FORWARD);CHKERRQ(ierr); 1113801fbe65SHong Zhang ierr = ISDestroy(&is_to);CHKERRQ(ierr); 1114801fbe65SHong Zhang ierr = ISDestroy(&is_from);CHKERRQ(ierr); 1115334c5f61SHong Zhang ierr = VecScatterEnd(scat_rhs,v_mpi,b_seq,INSERT_VALUES,SCATTER_FORWARD);CHKERRQ(ierr); 1116801fbe65SHong Zhang 1117801fbe65SHong Zhang if (!mumps->myid) { /* define rhs on the host */ 1118334c5f61SHong Zhang ierr = VecGetArray(b_seq,&bray);CHKERRQ(ierr); 1119940cd9d6SSatish Balay mumps->id.rhs = (MumpsScalar*)bray; 1120334c5f61SHong Zhang ierr = VecRestoreArray(b_seq,&bray);CHKERRQ(ierr); 1121801fbe65SHong Zhang } 1122801fbe65SHong Zhang 11232b691707SHong Zhang } else { /* sparse B */ 11242b691707SHong Zhang b = (Mat_MPIAIJ*)Bt->data; 11252b691707SHong Zhang 1126be818407SHong Zhang /* wrap dense X into a vector v_mpi */ 11272b691707SHong Zhang ierr = MatGetLocalSize(X,&m,NULL);CHKERRQ(ierr); 11282b691707SHong Zhang ierr = MatDenseGetArray(X,&bray);CHKERRQ(ierr); 11292b691707SHong Zhang ierr = VecCreateMPIWithArray(PetscObjectComm((PetscObject)X),1,nrhs*m,nrhs*M,(const PetscScalar*)bray,&v_mpi);CHKERRQ(ierr); 11302b691707SHong Zhang ierr = MatDenseRestoreArray(X,&bray);CHKERRQ(ierr); 11312b691707SHong Zhang 11322b691707SHong Zhang if (!mumps->myid) { 11332b691707SHong Zhang ierr = MatSeqAIJGetArray(b->A,&aa);CHKERRQ(ierr); 1134be818407SHong Zhang ierr = MatGetRowIJ(b->A,1,PETSC_FALSE,PETSC_FALSE,&spnr,(const PetscInt**)&ia,(const PetscInt**)&ja,&flg);CHKERRQ(ierr); 1135c0be3364SHong Zhang if (!flg) SETERRQ(PETSC_COMM_SELF,PETSC_ERR_ARG_WRONG,"Cannot get IJ structure"); 11362b691707SHong Zhang /* mumps requires ia and ja start at 1! */ 11372b691707SHong Zhang mumps->id.irhs_ptr = ia; 11382b691707SHong Zhang mumps->id.irhs_sparse = ja; 11392b691707SHong Zhang mumps->id.nz_rhs = ia[spnr] - 1; 11402b691707SHong Zhang mumps->id.rhs_sparse = (MumpsScalar*)aa; 11412b691707SHong Zhang } else { 11422b691707SHong Zhang mumps->id.irhs_ptr = NULL; 11432b691707SHong Zhang mumps->id.irhs_sparse = NULL; 11442b691707SHong Zhang mumps->id.nz_rhs = 0; 11452b691707SHong Zhang mumps->id.rhs_sparse = NULL; 11462b691707SHong Zhang } 11472b691707SHong Zhang } 11482b691707SHong Zhang 1149801fbe65SHong Zhang /* solve phase */ 1150801fbe65SHong Zhang /*-------------*/ 1151801fbe65SHong Zhang mumps->id.job = JOB_SOLVE; 11523ab56b82SJunchao Zhang PetscMUMPS_c(mumps); 1153801fbe65SHong 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)); 1154801fbe65SHong Zhang 1155334c5f61SHong Zhang /* scatter mumps distributed solution to petsc vector v_mpi, which shares local arrays with solution matrix X */ 115674f0fcc7SHong Zhang ierr = MatDenseGetArray(X,&array);CHKERRQ(ierr); 115774f0fcc7SHong Zhang ierr = VecPlaceArray(v_mpi,array);CHKERRQ(ierr); 1158801fbe65SHong Zhang 1159334c5f61SHong Zhang /* create scatter scat_sol */ 1160be818407SHong Zhang ierr = MatGetOwnershipRanges(X,&rstart);CHKERRQ(ierr); 1161beae5ec0SHong Zhang /* iidx: index for scatter mumps solution to petsc X */ 1162beae5ec0SHong Zhang 1163beae5ec0SHong Zhang ierr = ISCreateStride(PETSC_COMM_SELF,nlsol_loc,0,1,&is_from);CHKERRQ(ierr); 1164beae5ec0SHong Zhang ierr = PetscMalloc1(nlsol_loc,&idxx);CHKERRQ(ierr); 1165beae5ec0SHong Zhang for (i=0; i<lsol_loc; i++) { 1166beae5ec0SHong Zhang isol_loc[i] -= 1; /* change Fortran style to C style. isol_loc[i+j*lsol_loc] contains x[isol_loc[i]] in j-th vector */ 1167beae5ec0SHong Zhang 11682d4298aeSJunchao Zhang for (proc=0; proc<mumps->petsc_size; proc++){ 1169beae5ec0SHong Zhang if (isol_loc[i] >= rstart[proc] && isol_loc[i] < rstart[proc+1]) { 1170beae5ec0SHong Zhang myrstart = rstart[proc]; 1171beae5ec0SHong Zhang k = isol_loc[i] - myrstart; /* local index on 1st column of petsc vector X */ 1172beae5ec0SHong Zhang iidx = k + myrstart*nrhs; /* maps mumps isol_loc[i] to petsc index in X */ 1173beae5ec0SHong Zhang m = rstart[proc+1] - rstart[proc]; /* rows of X for this proc */ 1174beae5ec0SHong Zhang break; 1175be818407SHong Zhang } 1176be818407SHong Zhang } 1177be818407SHong Zhang 1178beae5ec0SHong Zhang for (j=0; j<nrhs; j++) idxx[i+j*lsol_loc] = iidx + j*m; 1179801fbe65SHong Zhang } 1180be818407SHong Zhang ierr = ISCreateGeneral(PETSC_COMM_SELF,nlsol_loc,idxx,PETSC_COPY_VALUES,&is_to);CHKERRQ(ierr); 1181beae5ec0SHong Zhang ierr = VecScatterCreate(msol_loc,is_from,v_mpi,is_to,&scat_sol);CHKERRQ(ierr); 1182beae5ec0SHong Zhang ierr = VecScatterBegin(scat_sol,msol_loc,v_mpi,INSERT_VALUES,SCATTER_FORWARD);CHKERRQ(ierr); 1183801fbe65SHong Zhang ierr = ISDestroy(&is_from);CHKERRQ(ierr); 1184801fbe65SHong Zhang ierr = ISDestroy(&is_to);CHKERRQ(ierr); 1185beae5ec0SHong Zhang ierr = VecScatterEnd(scat_sol,msol_loc,v_mpi,INSERT_VALUES,SCATTER_FORWARD);CHKERRQ(ierr); 1186801fbe65SHong Zhang ierr = MatDenseRestoreArray(X,&array);CHKERRQ(ierr); 118771aed81dSHong Zhang 118871aed81dSHong Zhang /* free spaces */ 11891683a169SBarry Smith mumps->id.sol_loc = (MumpsScalar*)sol_loc_save; 119071aed81dSHong Zhang mumps->id.isol_loc = isol_loc_save; 119171aed81dSHong Zhang 119271aed81dSHong Zhang ierr = PetscFree2(sol_loc,isol_loc);CHKERRQ(ierr); 1193801fbe65SHong Zhang ierr = PetscFree(idxx);CHKERRQ(ierr); 1194beae5ec0SHong Zhang ierr = VecDestroy(&msol_loc);CHKERRQ(ierr); 119574f0fcc7SHong Zhang ierr = VecDestroy(&v_mpi);CHKERRQ(ierr); 11962b691707SHong Zhang if (Bt) { 11972b691707SHong Zhang if (!mumps->myid) { 1198d56c302dSHong Zhang b = (Mat_MPIAIJ*)Bt->data; 11992b691707SHong Zhang ierr = MatSeqAIJRestoreArray(b->A,&aa);CHKERRQ(ierr); 1200be818407SHong Zhang ierr = MatRestoreRowIJ(b->A,1,PETSC_FALSE,PETSC_FALSE,&spnr,(const PetscInt**)&ia,(const PetscInt**)&ja,&flg);CHKERRQ(ierr); 1201c0be3364SHong Zhang if (!flg) SETERRQ(PETSC_COMM_SELF,PETSC_ERR_ARG_WRONG,"Cannot restore IJ structure"); 12022b691707SHong Zhang } 12032b691707SHong Zhang } else { 1204334c5f61SHong Zhang ierr = VecDestroy(&b_seq);CHKERRQ(ierr); 1205334c5f61SHong Zhang ierr = VecScatterDestroy(&scat_rhs);CHKERRQ(ierr); 12062b691707SHong Zhang } 1207334c5f61SHong Zhang ierr = VecScatterDestroy(&scat_sol);CHKERRQ(ierr); 12089880c9b4SStefano Zampini ierr = PetscLogFlops(2.0*nrhs*mumps->id.RINFO(3));CHKERRQ(ierr); 1209e0b74bf9SHong Zhang PetscFunctionReturn(0); 1210e0b74bf9SHong Zhang } 1211e0b74bf9SHong Zhang 1212eb3ef3b2SHong Zhang PetscErrorCode MatMatTransposeSolve_MUMPS(Mat A,Mat Bt,Mat X) 1213eb3ef3b2SHong Zhang { 1214eb3ef3b2SHong Zhang PetscErrorCode ierr; 1215eb3ef3b2SHong Zhang PetscBool flg; 1216eb3ef3b2SHong Zhang Mat B; 1217eb3ef3b2SHong Zhang 1218eb3ef3b2SHong Zhang PetscFunctionBegin; 1219eb3ef3b2SHong Zhang ierr = PetscObjectTypeCompareAny((PetscObject)Bt,&flg,MATSEQAIJ,MATMPIAIJ,NULL);CHKERRQ(ierr); 1220eb3ef3b2SHong Zhang if (!flg) SETERRQ(PetscObjectComm((PetscObject)Bt),PETSC_ERR_ARG_WRONG,"Matrix Bt must be MATAIJ matrix"); 1221eb3ef3b2SHong Zhang 1222eb3ef3b2SHong Zhang /* Create B=Bt^T that uses Bt's data structure */ 1223eb3ef3b2SHong Zhang ierr = MatCreateTranspose(Bt,&B);CHKERRQ(ierr); 1224eb3ef3b2SHong Zhang 12250e6b8875SHong Zhang ierr = MatMatSolve_MUMPS(A,B,X);CHKERRQ(ierr); 1226eb3ef3b2SHong Zhang ierr = MatDestroy(&B);CHKERRQ(ierr); 1227eb3ef3b2SHong Zhang PetscFunctionReturn(0); 1228eb3ef3b2SHong Zhang } 1229eb3ef3b2SHong Zhang 1230ace3df97SHong Zhang #if !defined(PETSC_USE_COMPLEX) 1231a58c3f20SHong Zhang /* 1232a58c3f20SHong Zhang input: 1233a58c3f20SHong Zhang F: numeric factor 1234a58c3f20SHong Zhang output: 1235a58c3f20SHong Zhang nneg: total number of negative pivots 123619d49a3bSHong Zhang nzero: total number of zero pivots 123719d49a3bSHong Zhang npos: (global dimension of F) - nneg - nzero 1238a58c3f20SHong Zhang */ 1239dfbe8321SBarry Smith PetscErrorCode MatGetInertia_SBAIJMUMPS(Mat F,int *nneg,int *nzero,int *npos) 1240a58c3f20SHong Zhang { 1241e69c285eSBarry Smith Mat_MUMPS *mumps =(Mat_MUMPS*)F->data; 1242dfbe8321SBarry Smith PetscErrorCode ierr; 1243c1490034SHong Zhang PetscMPIInt size; 1244a58c3f20SHong Zhang 1245a58c3f20SHong Zhang PetscFunctionBegin; 1246ce94432eSBarry Smith ierr = MPI_Comm_size(PetscObjectComm((PetscObject)F),&size);CHKERRQ(ierr); 1247bcb30aebSHong 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 */ 1248a5e57a09SHong 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)); 1249ed85ac9fSHong Zhang 1250710ac8efSHong Zhang if (nneg) *nneg = mumps->id.INFOG(12); 1251ed85ac9fSHong Zhang if (nzero || npos) { 1252ed85ac9fSHong 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"); 1253710ac8efSHong Zhang if (nzero) *nzero = mumps->id.INFOG(28); 1254710ac8efSHong Zhang if (npos) *npos = F->rmap->N - (mumps->id.INFOG(12) + mumps->id.INFOG(28)); 1255a58c3f20SHong Zhang } 1256a58c3f20SHong Zhang PetscFunctionReturn(0); 1257a58c3f20SHong Zhang } 125819d49a3bSHong Zhang #endif 1259a58c3f20SHong Zhang 12603ab56b82SJunchao Zhang PetscErrorCode MatMumpsGatherNonzerosOnMaster(MatReuse reuse,Mat_MUMPS *mumps) 12613ab56b82SJunchao Zhang { 12623ab56b82SJunchao Zhang PetscErrorCode ierr; 12636ac9f4daSSatish Balay PetscInt i,nz=0,*irn,*jcn=0; 12646ac9f4daSSatish Balay PetscScalar *val=0; 12653ab56b82SJunchao Zhang PetscMPIInt mpinz,*recvcount=NULL,*displs=NULL; 12663ab56b82SJunchao Zhang 12673ab56b82SJunchao Zhang PetscFunctionBegin; 12683ab56b82SJunchao Zhang if (mumps->omp_comm_size > 1) { 12693ab56b82SJunchao Zhang if (reuse == MAT_INITIAL_MATRIX) { 12703ab56b82SJunchao Zhang /* master first gathers counts of nonzeros to receive */ 12713ab56b82SJunchao Zhang if (mumps->is_omp_master) { ierr = PetscMalloc2(mumps->omp_comm_size,&recvcount,mumps->omp_comm_size,&displs);CHKERRQ(ierr); } 12723ab56b82SJunchao Zhang ierr = PetscMPIIntCast(mumps->nz,&mpinz);CHKERRQ(ierr); 12733ab56b82SJunchao Zhang ierr = MPI_Gather(&mpinz,1,MPI_INT,recvcount,1,MPI_INT,0/*root*/,mumps->omp_comm);CHKERRQ(ierr); 12743ab56b82SJunchao Zhang 12753ab56b82SJunchao Zhang /* master allocates memory to receive nonzeros */ 12763ab56b82SJunchao Zhang if (mumps->is_omp_master) { 12773ab56b82SJunchao Zhang displs[0] = 0; 12783ab56b82SJunchao Zhang for (i=1; i<mumps->omp_comm_size; i++) displs[i] = displs[i-1] + recvcount[i-1]; 12793ab56b82SJunchao Zhang nz = displs[mumps->omp_comm_size-1] + recvcount[mumps->omp_comm_size-1]; 12803ab56b82SJunchao Zhang ierr = PetscMalloc(2*nz*sizeof(PetscInt)+nz*sizeof(PetscScalar),&irn);CHKERRQ(ierr); 12813ab56b82SJunchao Zhang jcn = irn + nz; 12823ab56b82SJunchao Zhang val = (PetscScalar*)(jcn + nz); 12833ab56b82SJunchao Zhang } 12843ab56b82SJunchao Zhang 12853ab56b82SJunchao Zhang /* save the gatherv plan */ 12863ab56b82SJunchao Zhang mumps->mpinz = mpinz; /* used as send count */ 12873ab56b82SJunchao Zhang mumps->recvcount = recvcount; 12883ab56b82SJunchao Zhang mumps->displs = displs; 12893ab56b82SJunchao Zhang 12903ab56b82SJunchao Zhang /* master gathers nonzeros */ 12913ab56b82SJunchao Zhang ierr = MPI_Gatherv(mumps->irn,mpinz,MPIU_INT,irn,mumps->recvcount,mumps->displs,MPIU_INT,0/*root*/,mumps->omp_comm);CHKERRQ(ierr); 12923ab56b82SJunchao Zhang ierr = MPI_Gatherv(mumps->jcn,mpinz,MPIU_INT,jcn,mumps->recvcount,mumps->displs,MPIU_INT,0/*root*/,mumps->omp_comm);CHKERRQ(ierr); 12933ab56b82SJunchao Zhang ierr = MPI_Gatherv(mumps->val,mpinz,MPIU_SCALAR,val,mumps->recvcount,mumps->displs,MPIU_SCALAR,0/*root*/,mumps->omp_comm);CHKERRQ(ierr); 12943ab56b82SJunchao Zhang 12953ab56b82SJunchao Zhang /* master frees its row/col/val and replaces them with bigger arrays */ 12963ab56b82SJunchao Zhang if (mumps->is_omp_master) { 12973ab56b82SJunchao Zhang ierr = PetscFree(mumps->irn);CHKERRQ(ierr); /* irn/jcn/val are allocated together so free only irn */ 12983ab56b82SJunchao Zhang mumps->nz = nz; /* it is a sum of mpinz over omp_comm */ 12993ab56b82SJunchao Zhang mumps->irn = irn; 13003ab56b82SJunchao Zhang mumps->jcn = jcn; 13013ab56b82SJunchao Zhang mumps->val = val; 13023ab56b82SJunchao Zhang } 13033ab56b82SJunchao Zhang } else { 13043ab56b82SJunchao Zhang ierr = MPI_Gatherv((mumps->is_omp_master?MPI_IN_PLACE:mumps->val),mumps->mpinz,MPIU_SCALAR,mumps->val,mumps->recvcount,mumps->displs,MPIU_SCALAR,0/*root*/,mumps->omp_comm);CHKERRQ(ierr); 13053ab56b82SJunchao Zhang } 13063ab56b82SJunchao Zhang } 13073ab56b82SJunchao Zhang PetscFunctionReturn(0); 13083ab56b82SJunchao Zhang } 13093ab56b82SJunchao Zhang 13100481f469SBarry Smith PetscErrorCode MatFactorNumeric_MUMPS(Mat F,Mat A,const MatFactorInfo *info) 1311af281ebdSHong Zhang { 1312e69c285eSBarry Smith Mat_MUMPS *mumps =(Mat_MUMPS*)(F)->data; 13136849ba73SBarry Smith PetscErrorCode ierr; 1314ace3abfcSBarry Smith PetscBool isMPIAIJ; 1315397b6df1SKris Buschelman 1316397b6df1SKris Buschelman PetscFunctionBegin; 13176baea169SHong Zhang if (mumps->id.INFOG(1) < 0) { 13182aca8efcSHong Zhang if (mumps->id.INFOG(1) == -6) { 13192aca8efcSHong Zhang ierr = PetscInfo2(A,"MatFactorNumeric is called with singular matrix structure, INFOG(1)=%d, INFO(2)=%d\n",mumps->id.INFOG(1),mumps->id.INFO(2));CHKERRQ(ierr); 13206baea169SHong Zhang } 13216baea169SHong Zhang ierr = PetscInfo2(A,"MatFactorNumeric is called after analysis phase fails, INFOG(1)=%d, INFO(2)=%d\n",mumps->id.INFOG(1),mumps->id.INFO(2));CHKERRQ(ierr); 13222aca8efcSHong Zhang PetscFunctionReturn(0); 13232aca8efcSHong Zhang } 13246baea169SHong Zhang 1325a5e57a09SHong Zhang ierr = (*mumps->ConvertToTriples)(A, 1, MAT_REUSE_MATRIX, &mumps->nz, &mumps->irn, &mumps->jcn, &mumps->val);CHKERRQ(ierr); 13263ab56b82SJunchao Zhang ierr = MatMumpsGatherNonzerosOnMaster(MAT_REUSE_MATRIX,mumps);CHKERRQ(ierr); 1327397b6df1SKris Buschelman 1328397b6df1SKris Buschelman /* numerical factorization phase */ 1329329ec9b3SHong Zhang /*-------------------------------*/ 1330a5e57a09SHong Zhang mumps->id.job = JOB_FACTNUMERIC; 13314e34a73bSHong Zhang if (!mumps->id.ICNTL(18)) { /* A is centralized */ 1332a5e57a09SHong Zhang if (!mumps->myid) { 1333940cd9d6SSatish Balay mumps->id.a = (MumpsScalar*)mumps->val; 1334397b6df1SKris Buschelman } 1335397b6df1SKris Buschelman } else { 1336940cd9d6SSatish Balay mumps->id.a_loc = (MumpsScalar*)mumps->val; 1337397b6df1SKris Buschelman } 13383ab56b82SJunchao Zhang PetscMUMPS_c(mumps); 1339a5e57a09SHong Zhang if (mumps->id.INFOG(1) < 0) { 1340c0d63f2fSHong Zhang if (A->erroriffailure) { 1341c0d63f2fSHong Zhang SETERRQ2(PETSC_COMM_SELF,PETSC_ERR_LIB,"Error reported by MUMPS in numerical factorization phase: INFOG(1)=%d, INFO(2)=%d\n",mumps->id.INFOG(1),mumps->id.INFO(2)); 1342151787a6SHong Zhang } else { 1343c0d63f2fSHong Zhang if (mumps->id.INFOG(1) == -10) { /* numerically singular matrix */ 13442aca8efcSHong Zhang ierr = PetscInfo2(F,"matrix is numerically singular, INFOG(1)=%d, INFO(2)=%d\n",mumps->id.INFOG(1),mumps->id.INFO(2));CHKERRQ(ierr); 1345603e8f96SBarry Smith F->factorerrortype = MAT_FACTOR_NUMERIC_ZEROPIVOT; 1346c0d63f2fSHong Zhang } else if (mumps->id.INFOG(1) == -13) { 1347c0d63f2fSHong Zhang ierr = PetscInfo2(F,"MUMPS in numerical factorization phase: INFOG(1)=%d, cannot allocate required memory %d megabytes\n",mumps->id.INFOG(1),mumps->id.INFO(2));CHKERRQ(ierr); 1348603e8f96SBarry Smith F->factorerrortype = MAT_FACTOR_OUTMEMORY; 1349c0d63f2fSHong Zhang } else if (mumps->id.INFOG(1) == -8 || mumps->id.INFOG(1) == -9 || (-16 < mumps->id.INFOG(1) && mumps->id.INFOG(1) < -10) ) { 1350c0d63f2fSHong Zhang ierr = PetscInfo2(F,"MUMPS in numerical factorization phase: INFOG(1)=%d, INFO(2)=%d, problem with workarray \n",mumps->id.INFOG(1),mumps->id.INFO(2));CHKERRQ(ierr); 1351603e8f96SBarry Smith F->factorerrortype = MAT_FACTOR_OUTMEMORY; 13522aca8efcSHong Zhang } else { 1353c0d63f2fSHong Zhang ierr = PetscInfo2(F,"MUMPS in numerical factorization phase: INFOG(1)=%d, INFO(2)=%d\n",mumps->id.INFOG(1),mumps->id.INFO(2));CHKERRQ(ierr); 1354603e8f96SBarry Smith F->factorerrortype = MAT_FACTOR_OTHER; 1355151787a6SHong Zhang } 13562aca8efcSHong Zhang } 1357397b6df1SKris Buschelman } 1358a5e57a09SHong 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)); 1359397b6df1SKris Buschelman 1360b3cb21ddSStefano Zampini F->assembled = PETSC_TRUE; 1361a5e57a09SHong Zhang mumps->matstruc = SAME_NONZERO_PATTERN; 1362b3cb21ddSStefano Zampini if (F->schur) { /* reset Schur status to unfactored */ 13633cb7dd0eSStefano Zampini #if defined(PETSC_HAVE_CUDA) 13643cb7dd0eSStefano Zampini F->schur->valid_GPU_matrix = PETSC_OFFLOAD_CPU; 13653cb7dd0eSStefano Zampini #endif 1366b3cb21ddSStefano Zampini if (mumps->id.ICNTL(19) == 1) { /* stored by rows */ 1367b3cb21ddSStefano Zampini mumps->id.ICNTL(19) = 2; 1368b3cb21ddSStefano Zampini ierr = MatTranspose(F->schur,MAT_INPLACE_MATRIX,&F->schur);CHKERRQ(ierr); 1369b3cb21ddSStefano Zampini } 1370b3cb21ddSStefano Zampini ierr = MatFactorRestoreSchurComplement(F,NULL,MAT_FACTOR_SCHUR_UNFACTORED);CHKERRQ(ierr); 1371b3cb21ddSStefano Zampini } 137267877ebaSShri Abhyankar 1373066565c5SStefano Zampini /* just to be sure that ICNTL(19) value returned by a call from MatMumpsGetIcntl is always consistent */ 1374066565c5SStefano Zampini if (!mumps->sym && mumps->id.ICNTL(19) && mumps->id.ICNTL(19) != 1) mumps->id.ICNTL(19) = 3; 1375066565c5SStefano Zampini 13763ab56b82SJunchao Zhang if (!mumps->is_omp_master) mumps->id.INFO(23) = 0; 13772d4298aeSJunchao Zhang if (mumps->petsc_size > 1) { 137867877ebaSShri Abhyankar PetscInt lsol_loc; 137967877ebaSShri Abhyankar PetscScalar *sol_loc; 13802205254eSKarl Rupp 1381c2093ab7SHong Zhang ierr = PetscObjectTypeCompare((PetscObject)A,MATMPIAIJ,&isMPIAIJ);CHKERRQ(ierr); 1382c2093ab7SHong Zhang 1383c2093ab7SHong Zhang /* distributed solution; Create x_seq=sol_loc for repeated use */ 1384c2093ab7SHong Zhang if (mumps->x_seq) { 1385c2093ab7SHong Zhang ierr = VecScatterDestroy(&mumps->scat_sol);CHKERRQ(ierr); 1386c2093ab7SHong Zhang ierr = PetscFree2(mumps->id.sol_loc,mumps->id.isol_loc);CHKERRQ(ierr); 1387c2093ab7SHong Zhang ierr = VecDestroy(&mumps->x_seq);CHKERRQ(ierr); 1388c2093ab7SHong Zhang } 1389a5e57a09SHong Zhang lsol_loc = mumps->id.INFO(23); /* length of sol_loc */ 1390dcca6d9dSJed Brown ierr = PetscMalloc2(lsol_loc,&sol_loc,lsol_loc,&mumps->id.isol_loc);CHKERRQ(ierr); 1391a5e57a09SHong Zhang mumps->id.lsol_loc = lsol_loc; 1392940cd9d6SSatish Balay mumps->id.sol_loc = (MumpsScalar*)sol_loc; 1393a5e57a09SHong Zhang ierr = VecCreateSeqWithArray(PETSC_COMM_SELF,1,lsol_loc,sol_loc,&mumps->x_seq);CHKERRQ(ierr); 139467877ebaSShri Abhyankar } 13959880c9b4SStefano Zampini ierr = PetscLogFlops(mumps->id.RINFO(2));CHKERRQ(ierr); 1396397b6df1SKris Buschelman PetscFunctionReturn(0); 1397397b6df1SKris Buschelman } 1398397b6df1SKris Buschelman 13999a2535b5SHong Zhang /* Sets MUMPS options from the options database */ 14009a2535b5SHong Zhang PetscErrorCode PetscSetMUMPSFromOptions(Mat F, Mat A) 1401dcd589f8SShri Abhyankar { 1402e69c285eSBarry Smith Mat_MUMPS *mumps = (Mat_MUMPS*)F->data; 1403dcd589f8SShri Abhyankar PetscErrorCode ierr; 1404a0e18203SThibaut Appel PetscInt icntl,info[80],i,ninfo=80; 1405ace3abfcSBarry Smith PetscBool flg; 1406dcd589f8SShri Abhyankar 1407dcd589f8SShri Abhyankar PetscFunctionBegin; 1408ce94432eSBarry Smith ierr = PetscOptionsBegin(PetscObjectComm((PetscObject)A),((PetscObject)A)->prefix,"MUMPS Options","Mat");CHKERRQ(ierr); 14099a2535b5SHong Zhang ierr = PetscOptionsInt("-mat_mumps_icntl_1","ICNTL(1): output stream for error messages","None",mumps->id.ICNTL(1),&icntl,&flg);CHKERRQ(ierr); 14109a2535b5SHong Zhang if (flg) mumps->id.ICNTL(1) = icntl; 14119a2535b5SHong 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); 14129a2535b5SHong Zhang if (flg) mumps->id.ICNTL(2) = icntl; 14139a2535b5SHong 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); 14149a2535b5SHong Zhang if (flg) mumps->id.ICNTL(3) = icntl; 1415dcd589f8SShri Abhyankar 14169a2535b5SHong Zhang ierr = PetscOptionsInt("-mat_mumps_icntl_4","ICNTL(4): level of printing (0 to 4)","None",mumps->id.ICNTL(4),&icntl,&flg);CHKERRQ(ierr); 14179a2535b5SHong Zhang if (flg) mumps->id.ICNTL(4) = icntl; 14189a2535b5SHong Zhang if (mumps->id.ICNTL(4) || PetscLogPrintInfo) mumps->id.ICNTL(3) = 6; /* resume MUMPS default id.ICNTL(3) = 6 */ 14199a2535b5SHong Zhang 1420d341cd04SHong 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); 14219a2535b5SHong Zhang if (flg) mumps->id.ICNTL(6) = icntl; 14229a2535b5SHong Zhang 1423d341cd04SHong 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); 1424dcd589f8SShri Abhyankar if (flg) { 14252d4298aeSJunchao Zhang if (icntl== 1 && mumps->petsc_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"); 14262205254eSKarl Rupp else mumps->id.ICNTL(7) = icntl; 1427dcd589f8SShri Abhyankar } 1428e0b74bf9SHong Zhang 14290298fd71SBarry 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); 1430d341cd04SHong 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() */ 14310298fd71SBarry 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); 1432d341cd04SHong 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); 1433d341cd04SHong 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); 1434d341cd04SHong 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); 1435d341cd04SHong 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); 1436d341cd04SHong 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); 143759ac8732SStefano Zampini if (mumps->id.ICNTL(19) <= 0 || mumps->id.ICNTL(19) > 3) { /* reset any schur data (if any) */ 1438b3cb21ddSStefano Zampini ierr = MatDestroy(&F->schur);CHKERRQ(ierr); 143959ac8732SStefano Zampini ierr = MatMumpsResetSchur_Private(mumps);CHKERRQ(ierr); 144059ac8732SStefano Zampini } 14414e34a73bSHong 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 */ 1442d341cd04SHong 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 */ 14439a2535b5SHong Zhang 1444d341cd04SHong 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); 14450298fd71SBarry 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); 14460298fd71SBarry 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); 14479a2535b5SHong Zhang if (mumps->id.ICNTL(24)) { 14489a2535b5SHong Zhang mumps->id.ICNTL(13) = 1; /* turn-off ScaLAPACK to help with the correct detection of null pivots */ 1449d7ebd59bSHong Zhang } 1450d7ebd59bSHong Zhang 1451b4ed93dbSHong Zhang ierr = PetscOptionsInt("-mat_mumps_icntl_25","ICNTL(25): computes a solution of a deficient matrix and a null space basis","None",mumps->id.ICNTL(25),&mumps->id.ICNTL(25),NULL);CHKERRQ(ierr); 1452d341cd04SHong 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); 14532cd7d884SHong 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); 14540298fd71SBarry 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); 1455d341cd04SHong 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); 145689a9c03aSHong Zhang /* ierr = PetscOptionsInt("-mat_mumps_icntl_30","ICNTL(30): compute user-specified set of entries in inv(A)","None",mumps->id.ICNTL(30),&mumps->id.ICNTL(30),NULL);CHKERRQ(ierr); */ /* call MatMumpsGetInverse() directly */ 1457d341cd04SHong 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); 14584e34a73bSHong 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 */ 14590298fd71SBarry Smith ierr = PetscOptionsInt("-mat_mumps_icntl_33","ICNTL(33): compute determinant","None",mumps->id.ICNTL(33),&mumps->id.ICNTL(33),NULL);CHKERRQ(ierr); 1460a0e18203SThibaut Appel ierr = PetscOptionsInt("-mat_mumps_icntl_35","ICNTL(35): activates Block Low Rank (BLR) based factorization","None",mumps->id.ICNTL(35),&mumps->id.ICNTL(35),NULL);CHKERRQ(ierr); 1461a0e18203SThibaut Appel ierr = PetscOptionsInt("-mat_mumps_icntl_36","ICNTL(36): choice of BLR factorization variant","None",mumps->id.ICNTL(36),&mumps->id.ICNTL(36),NULL);CHKERRQ(ierr); 1462a0e18203SThibaut Appel ierr = PetscOptionsInt("-mat_mumps_icntl_38","ICNTL(38): estimated compression rate of LU factors with BLR","None",mumps->id.ICNTL(38),&mumps->id.ICNTL(38),NULL);CHKERRQ(ierr); 1463dcd589f8SShri Abhyankar 14640298fd71SBarry Smith ierr = PetscOptionsReal("-mat_mumps_cntl_1","CNTL(1): relative pivoting threshold","None",mumps->id.CNTL(1),&mumps->id.CNTL(1),NULL);CHKERRQ(ierr); 14650298fd71SBarry 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); 14660298fd71SBarry Smith ierr = PetscOptionsReal("-mat_mumps_cntl_3","CNTL(3): absolute pivoting threshold","None",mumps->id.CNTL(3),&mumps->id.CNTL(3),NULL);CHKERRQ(ierr); 14670298fd71SBarry 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); 14680298fd71SBarry 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); 1469b4ed93dbSHong Zhang ierr = PetscOptionsReal("-mat_mumps_cntl_7","CNTL(7): dropping parameter used during BLR","None",mumps->id.CNTL(7),&mumps->id.CNTL(7),NULL);CHKERRQ(ierr); 1470e5bb22a1SHong Zhang 14712a808120SBarry Smith ierr = PetscOptionsString("-mat_mumps_ooc_tmpdir", "out of core directory", "None", mumps->id.ooc_tmpdir, mumps->id.ooc_tmpdir, 256, NULL);CHKERRQ(ierr); 1472b34f08ffSHong Zhang 147316d797efSHong Zhang ierr = PetscOptionsIntArray("-mat_mumps_view_info","request INFO local to each processor","",info,&ninfo,NULL);CHKERRQ(ierr); 1474b34f08ffSHong Zhang if (ninfo) { 1475a0e18203SThibaut Appel if (ninfo > 80) SETERRQ1(PETSC_COMM_SELF,PETSC_ERR_USER,"number of INFO %d must <= 80\n",ninfo); 1476b34f08ffSHong Zhang ierr = PetscMalloc1(ninfo,&mumps->info);CHKERRQ(ierr); 1477b34f08ffSHong Zhang mumps->ninfo = ninfo; 1478b34f08ffSHong Zhang for (i=0; i<ninfo; i++) { 1479a0e18203SThibaut Appel if (info[i] < 0 || info[i]>80) SETERRQ1(PETSC_COMM_SELF,PETSC_ERR_USER,"index of INFO %d must between 1 and 80\n",ninfo); 14802a808120SBarry Smith else mumps->info[i] = info[i]; 1481b34f08ffSHong Zhang } 1482b34f08ffSHong Zhang } 1483b34f08ffSHong Zhang 14842a808120SBarry Smith ierr = PetscOptionsEnd();CHKERRQ(ierr); 1485dcd589f8SShri Abhyankar PetscFunctionReturn(0); 1486dcd589f8SShri Abhyankar } 1487dcd589f8SShri Abhyankar 1488f697e70eSHong Zhang PetscErrorCode PetscInitializeMUMPS(Mat A,Mat_MUMPS *mumps) 1489dcd589f8SShri Abhyankar { 1490dcd589f8SShri Abhyankar PetscErrorCode ierr; 14917c405c4aSJunchao Zhang PetscInt nthreads=0; 1492dcd589f8SShri Abhyankar 1493dcd589f8SShri Abhyankar PetscFunctionBegin; 14943ab56b82SJunchao Zhang mumps->petsc_comm = PetscObjectComm((PetscObject)A); 14953ab56b82SJunchao Zhang ierr = MPI_Comm_size(mumps->petsc_comm,&mumps->petsc_size);CHKERRQ(ierr); 14963ab56b82SJunchao Zhang ierr = MPI_Comm_rank(mumps->petsc_comm,&mumps->myid);CHKERRQ(ierr); /* so that code like "if (!myid)" still works even if mumps_comm is different */ 14973ab56b82SJunchao Zhang 14987c405c4aSJunchao Zhang ierr = PetscOptionsHasName(NULL,NULL,"-mat_mumps_use_omp_threads",&mumps->use_petsc_omp_support);CHKERRQ(ierr); 14997c405c4aSJunchao Zhang if (mumps->use_petsc_omp_support) nthreads = -1; /* -1 will let PetscOmpCtrlCreate() guess a proper value when user did not supply one */ 15007c405c4aSJunchao Zhang ierr = PetscOptionsGetInt(NULL,NULL,"-mat_mumps_use_omp_threads",&nthreads,NULL);CHKERRQ(ierr); 15013ab56b82SJunchao Zhang if (mumps->use_petsc_omp_support) { 15023ab56b82SJunchao Zhang #if defined(PETSC_HAVE_OPENMP_SUPPORT) 15033ab56b82SJunchao Zhang ierr = PetscOmpCtrlCreate(mumps->petsc_comm,nthreads,&mumps->omp_ctrl);CHKERRQ(ierr); 15043ab56b82SJunchao Zhang ierr = PetscOmpCtrlGetOmpComms(mumps->omp_ctrl,&mumps->omp_comm,&mumps->mumps_comm,&mumps->is_omp_master);CHKERRQ(ierr); 15053ab56b82SJunchao Zhang #else 1506217d3b1eSJunchao Zhang SETERRQ(PETSC_COMM_SELF,PETSC_ERR_SUP_SYS,"the system does not have PETSc OpenMP support but you added the -mat_mumps_use_omp_threads option. Configure PETSc with --with-openmp --download-hwloc (or --with-hwloc) to enable it, see more in MATSOLVERMUMPS manual\n"); 15073ab56b82SJunchao Zhang #endif 15083ab56b82SJunchao Zhang } else { 15093ab56b82SJunchao Zhang mumps->omp_comm = PETSC_COMM_SELF; 15103ab56b82SJunchao Zhang mumps->mumps_comm = mumps->petsc_comm; 15113ab56b82SJunchao Zhang mumps->is_omp_master = PETSC_TRUE; 15123ab56b82SJunchao Zhang } 15133ab56b82SJunchao Zhang ierr = MPI_Comm_size(mumps->omp_comm,&mumps->omp_comm_size);CHKERRQ(ierr); 15142205254eSKarl Rupp 15152d4298aeSJunchao Zhang mumps->id.comm_fortran = MPI_Comm_c2f(mumps->mumps_comm); 1516f697e70eSHong Zhang mumps->id.job = JOB_INIT; 1517f697e70eSHong Zhang mumps->id.par = 1; /* host participates factorizaton and solve */ 1518f697e70eSHong Zhang mumps->id.sym = mumps->sym; 15193ab56b82SJunchao Zhang 15203ab56b82SJunchao Zhang PetscMUMPS_c(mumps); 15213ab56b82SJunchao Zhang 15223ab56b82SJunchao Zhang /* copy MUMPS default control values from master to slaves. Although slaves do not call MUMPS, they may access these values in code. 15233ab56b82SJunchao Zhang For example, ICNTL(9) is initialized to 1 by MUMPS and slaves check ICNTL(9) in MatSolve_MUMPS. 15243ab56b82SJunchao Zhang */ 1525a0e18203SThibaut Appel ierr = MPI_Bcast(mumps->id.icntl,60,MPIU_INT, 0,mumps->omp_comm);CHKERRQ(ierr); /* see MUMPS-5.1.2 Manual Section 9 */ 15263ab56b82SJunchao Zhang ierr = MPI_Bcast(mumps->id.cntl, 15,MPIU_REAL,0,mumps->omp_comm);CHKERRQ(ierr); 1527f697e70eSHong Zhang 15280298fd71SBarry Smith mumps->scat_rhs = NULL; 15290298fd71SBarry Smith mumps->scat_sol = NULL; 15309a2535b5SHong Zhang 153170544d5fSHong Zhang /* set PETSc-MUMPS default options - override MUMPS default */ 15329a2535b5SHong Zhang mumps->id.ICNTL(3) = 0; 15339a2535b5SHong Zhang mumps->id.ICNTL(4) = 0; 15342d4298aeSJunchao Zhang if (mumps->petsc_size == 1) { 15359a2535b5SHong Zhang mumps->id.ICNTL(18) = 0; /* centralized assembled matrix input */ 15369a2535b5SHong Zhang } else { 15379a2535b5SHong Zhang mumps->id.ICNTL(18) = 3; /* distributed assembled matrix input */ 15384e34a73bSHong Zhang mumps->id.ICNTL(20) = 0; /* rhs is in dense format */ 153970544d5fSHong Zhang mumps->id.ICNTL(21) = 1; /* distributed solution */ 15409a2535b5SHong Zhang } 15416444a565SStefano Zampini 15426444a565SStefano Zampini /* schur */ 15436444a565SStefano Zampini mumps->id.size_schur = 0; 15446444a565SStefano Zampini mumps->id.listvar_schur = NULL; 15456444a565SStefano Zampini mumps->id.schur = NULL; 1546b5fa320bSStefano Zampini mumps->sizeredrhs = 0; 154759ac8732SStefano Zampini mumps->schur_sol = NULL; 154859ac8732SStefano Zampini mumps->schur_sizesol = 0; 1549dcd589f8SShri Abhyankar PetscFunctionReturn(0); 1550dcd589f8SShri Abhyankar } 1551dcd589f8SShri Abhyankar 15529a625307SHong Zhang PetscErrorCode MatFactorSymbolic_MUMPS_ReportIfError(Mat F,Mat A,const MatFactorInfo *info,Mat_MUMPS *mumps) 15535cd7cf9dSHong Zhang { 15545cd7cf9dSHong Zhang PetscErrorCode ierr; 15555cd7cf9dSHong Zhang 15565cd7cf9dSHong Zhang PetscFunctionBegin; 1557a0e18203SThibaut Appel ierr = MPI_Bcast(mumps->id.infog, 80,MPIU_INT, 0,mumps->omp_comm);CHKERRQ(ierr); /* see MUMPS-5.1.2 manual p82 */ 15583ab56b82SJunchao Zhang ierr = MPI_Bcast(mumps->id.rinfog,20,MPIU_REAL,0,mumps->omp_comm);CHKERRQ(ierr); 15595cd7cf9dSHong Zhang if (mumps->id.INFOG(1) < 0) { 15605cd7cf9dSHong Zhang if (A->erroriffailure) { 15615cd7cf9dSHong Zhang SETERRQ1(PETSC_COMM_SELF,PETSC_ERR_LIB,"Error reported by MUMPS in analysis phase: INFOG(1)=%d\n",mumps->id.INFOG(1)); 15625cd7cf9dSHong Zhang } else { 15635cd7cf9dSHong Zhang if (mumps->id.INFOG(1) == -6) { 15645cd7cf9dSHong Zhang ierr = PetscInfo2(F,"matrix is singular in structure, INFOG(1)=%d, INFO(2)=%d\n",mumps->id.INFOG(1),mumps->id.INFO(2));CHKERRQ(ierr); 1565603e8f96SBarry Smith F->factorerrortype = MAT_FACTOR_STRUCT_ZEROPIVOT; 15665cd7cf9dSHong Zhang } else if (mumps->id.INFOG(1) == -5 || mumps->id.INFOG(1) == -7) { 15675cd7cf9dSHong Zhang ierr = PetscInfo2(F,"problem of workspace, INFOG(1)=%d, INFO(2)=%d\n",mumps->id.INFOG(1),mumps->id.INFO(2));CHKERRQ(ierr); 1568603e8f96SBarry Smith F->factorerrortype = MAT_FACTOR_OUTMEMORY; 15695cd7cf9dSHong Zhang } else { 15705cd7cf9dSHong Zhang ierr = PetscInfo2(F,"Error reported by MUMPS in analysis phase: INFOG(1)=%d, INFO(2)=%d\n",mumps->id.INFOG(1),mumps->id.INFO(2));CHKERRQ(ierr); 1571603e8f96SBarry Smith F->factorerrortype = MAT_FACTOR_OTHER; 15725cd7cf9dSHong Zhang } 15735cd7cf9dSHong Zhang } 15745cd7cf9dSHong Zhang } 15755cd7cf9dSHong Zhang PetscFunctionReturn(0); 15765cd7cf9dSHong Zhang } 15775cd7cf9dSHong Zhang 1578a5e57a09SHong 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 */ 15790481f469SBarry Smith PetscErrorCode MatLUFactorSymbolic_AIJMUMPS(Mat F,Mat A,IS r,IS c,const MatFactorInfo *info) 1580b24902e0SBarry Smith { 1581e69c285eSBarry Smith Mat_MUMPS *mumps = (Mat_MUMPS*)F->data; 1582dcd589f8SShri Abhyankar PetscErrorCode ierr; 158367877ebaSShri Abhyankar Vec b; 158467877ebaSShri Abhyankar const PetscInt M = A->rmap->N; 1585397b6df1SKris Buschelman 1586397b6df1SKris Buschelman PetscFunctionBegin; 1587a5e57a09SHong Zhang mumps->matstruc = DIFFERENT_NONZERO_PATTERN; 1588dcd589f8SShri Abhyankar 15899a2535b5SHong Zhang /* Set MUMPS options from the options database */ 15909a2535b5SHong Zhang ierr = PetscSetMUMPSFromOptions(F,A);CHKERRQ(ierr); 1591dcd589f8SShri Abhyankar 1592a5e57a09SHong Zhang ierr = (*mumps->ConvertToTriples)(A, 1, MAT_INITIAL_MATRIX, &mumps->nz, &mumps->irn, &mumps->jcn, &mumps->val);CHKERRQ(ierr); 15933ab56b82SJunchao Zhang ierr = MatMumpsGatherNonzerosOnMaster(MAT_INITIAL_MATRIX,mumps);CHKERRQ(ierr); 1594dcd589f8SShri Abhyankar 159567877ebaSShri Abhyankar /* analysis phase */ 159667877ebaSShri Abhyankar /*----------------*/ 1597a5e57a09SHong Zhang mumps->id.job = JOB_FACTSYMBOLIC; 1598a5e57a09SHong Zhang mumps->id.n = M; 1599a5e57a09SHong Zhang switch (mumps->id.ICNTL(18)) { 160067877ebaSShri Abhyankar case 0: /* centralized assembled matrix input */ 1601a5e57a09SHong Zhang if (!mumps->myid) { 1602a5e57a09SHong Zhang mumps->id.nz =mumps->nz; mumps->id.irn=mumps->irn; mumps->id.jcn=mumps->jcn; 1603a5e57a09SHong Zhang if (mumps->id.ICNTL(6)>1) { 1604940cd9d6SSatish Balay mumps->id.a = (MumpsScalar*)mumps->val; 160567877ebaSShri Abhyankar } 1606a5e57a09SHong Zhang if (mumps->id.ICNTL(7) == 1) { /* use user-provide matrix ordering - assuming r = c ordering */ 16075248a706SHong Zhang /* 16085248a706SHong Zhang PetscBool flag; 16095248a706SHong Zhang ierr = ISEqual(r,c,&flag);CHKERRQ(ierr); 16105248a706SHong Zhang if (!flag) SETERRQ(PETSC_COMM_SELF,PETSC_ERR_USER,"row_perm != col_perm"); 16115248a706SHong Zhang ierr = ISView(r,PETSC_VIEWER_STDOUT_SELF); 16125248a706SHong Zhang */ 1613a5e57a09SHong Zhang if (!mumps->myid) { 1614e0b74bf9SHong Zhang const PetscInt *idx; 1615e0b74bf9SHong Zhang PetscInt i,*perm_in; 16162205254eSKarl Rupp 1617785e854fSJed Brown ierr = PetscMalloc1(M,&perm_in);CHKERRQ(ierr); 1618e0b74bf9SHong Zhang ierr = ISGetIndices(r,&idx);CHKERRQ(ierr); 16192205254eSKarl Rupp 1620a5e57a09SHong Zhang mumps->id.perm_in = perm_in; 1621e0b74bf9SHong Zhang for (i=0; i<M; i++) perm_in[i] = idx[i]+1; /* perm_in[]: start from 1, not 0! */ 1622e0b74bf9SHong Zhang ierr = ISRestoreIndices(r,&idx);CHKERRQ(ierr); 1623e0b74bf9SHong Zhang } 1624e0b74bf9SHong Zhang } 162567877ebaSShri Abhyankar } 162667877ebaSShri Abhyankar break; 162767877ebaSShri Abhyankar case 3: /* distributed assembled matrix input (size>1) */ 1628a5e57a09SHong Zhang mumps->id.nz_loc = mumps->nz; 1629a5e57a09SHong Zhang mumps->id.irn_loc=mumps->irn; mumps->id.jcn_loc=mumps->jcn; 1630a5e57a09SHong Zhang if (mumps->id.ICNTL(6)>1) { 1631940cd9d6SSatish Balay mumps->id.a_loc = (MumpsScalar*)mumps->val; 163267877ebaSShri Abhyankar } 163367877ebaSShri Abhyankar /* MUMPS only supports centralized rhs. Create scatter scat_rhs for repeated use in MatSolve() */ 16342a7a6963SBarry Smith ierr = MatCreateVecs(A,NULL,&b);CHKERRQ(ierr); 163594b42a18SJunchao Zhang ierr = VecScatterCreateToZero(b,&mumps->scat_rhs,&mumps->b_seq);CHKERRQ(ierr); 16366bf464f9SBarry Smith ierr = VecDestroy(&b);CHKERRQ(ierr); 163767877ebaSShri Abhyankar break; 163867877ebaSShri Abhyankar } 16393ab56b82SJunchao Zhang PetscMUMPS_c(mumps); 16405cd7cf9dSHong Zhang ierr = MatFactorSymbolic_MUMPS_ReportIfError(F,A,info,mumps);CHKERRQ(ierr); 164167877ebaSShri Abhyankar 1642719d5645SBarry Smith F->ops->lufactornumeric = MatFactorNumeric_MUMPS; 1643dcd589f8SShri Abhyankar F->ops->solve = MatSolve_MUMPS; 164451d5961aSHong Zhang F->ops->solvetranspose = MatSolveTranspose_MUMPS; 16454e34a73bSHong Zhang F->ops->matsolve = MatMatSolve_MUMPS; 1646eb3ef3b2SHong Zhang F->ops->mattransposesolve = MatMatTransposeSolve_MUMPS; 1647b24902e0SBarry Smith PetscFunctionReturn(0); 1648b24902e0SBarry Smith } 1649b24902e0SBarry Smith 1650450b117fSShri Abhyankar /* Note the Petsc r and c permutations are ignored */ 1651450b117fSShri Abhyankar PetscErrorCode MatLUFactorSymbolic_BAIJMUMPS(Mat F,Mat A,IS r,IS c,const MatFactorInfo *info) 1652450b117fSShri Abhyankar { 1653e69c285eSBarry Smith Mat_MUMPS *mumps = (Mat_MUMPS*)F->data; 1654dcd589f8SShri Abhyankar PetscErrorCode ierr; 165567877ebaSShri Abhyankar Vec b; 165667877ebaSShri Abhyankar const PetscInt M = A->rmap->N; 1657450b117fSShri Abhyankar 1658450b117fSShri Abhyankar PetscFunctionBegin; 1659a5e57a09SHong Zhang mumps->matstruc = DIFFERENT_NONZERO_PATTERN; 1660dcd589f8SShri Abhyankar 16619a2535b5SHong Zhang /* Set MUMPS options from the options database */ 16629a2535b5SHong Zhang ierr = PetscSetMUMPSFromOptions(F,A);CHKERRQ(ierr); 1663dcd589f8SShri Abhyankar 1664a5e57a09SHong Zhang ierr = (*mumps->ConvertToTriples)(A, 1, MAT_INITIAL_MATRIX, &mumps->nz, &mumps->irn, &mumps->jcn, &mumps->val);CHKERRQ(ierr); 16653ab56b82SJunchao Zhang ierr = MatMumpsGatherNonzerosOnMaster(MAT_INITIAL_MATRIX,mumps);CHKERRQ(ierr); 166667877ebaSShri Abhyankar 166767877ebaSShri Abhyankar /* analysis phase */ 166867877ebaSShri Abhyankar /*----------------*/ 1669a5e57a09SHong Zhang mumps->id.job = JOB_FACTSYMBOLIC; 1670a5e57a09SHong Zhang mumps->id.n = M; 1671a5e57a09SHong Zhang switch (mumps->id.ICNTL(18)) { 167267877ebaSShri Abhyankar case 0: /* centralized assembled matrix input */ 1673a5e57a09SHong Zhang if (!mumps->myid) { 1674a5e57a09SHong Zhang mumps->id.nz =mumps->nz; mumps->id.irn=mumps->irn; mumps->id.jcn=mumps->jcn; 1675a5e57a09SHong Zhang if (mumps->id.ICNTL(6)>1) { 1676940cd9d6SSatish Balay mumps->id.a = (MumpsScalar*)mumps->val; 167767877ebaSShri Abhyankar } 167867877ebaSShri Abhyankar } 167967877ebaSShri Abhyankar break; 168067877ebaSShri Abhyankar case 3: /* distributed assembled matrix input (size>1) */ 1681a5e57a09SHong Zhang mumps->id.nz_loc = mumps->nz; 1682a5e57a09SHong Zhang mumps->id.irn_loc=mumps->irn; mumps->id.jcn_loc=mumps->jcn; 1683a5e57a09SHong Zhang if (mumps->id.ICNTL(6)>1) { 1684940cd9d6SSatish Balay mumps->id.a_loc = (MumpsScalar*)mumps->val; 168567877ebaSShri Abhyankar } 168667877ebaSShri Abhyankar /* MUMPS only supports centralized rhs. Create scatter scat_rhs for repeated use in MatSolve() */ 16872a7a6963SBarry Smith ierr = MatCreateVecs(A,NULL,&b);CHKERRQ(ierr); 168894b42a18SJunchao Zhang ierr = VecScatterCreateToZero(b,&mumps->scat_rhs,&mumps->b_seq);CHKERRQ(ierr); 16896bf464f9SBarry Smith ierr = VecDestroy(&b);CHKERRQ(ierr); 169067877ebaSShri Abhyankar break; 169167877ebaSShri Abhyankar } 16923ab56b82SJunchao Zhang PetscMUMPS_c(mumps); 16935cd7cf9dSHong Zhang ierr = MatFactorSymbolic_MUMPS_ReportIfError(F,A,info,mumps);CHKERRQ(ierr); 169467877ebaSShri Abhyankar 1695450b117fSShri Abhyankar F->ops->lufactornumeric = MatFactorNumeric_MUMPS; 1696dcd589f8SShri Abhyankar F->ops->solve = MatSolve_MUMPS; 169751d5961aSHong Zhang F->ops->solvetranspose = MatSolveTranspose_MUMPS; 1698450b117fSShri Abhyankar PetscFunctionReturn(0); 1699450b117fSShri Abhyankar } 1700b24902e0SBarry Smith 1701141f4205SHong Zhang /* Note the Petsc r permutation and factor info are ignored */ 170267877ebaSShri Abhyankar PetscErrorCode MatCholeskyFactorSymbolic_MUMPS(Mat F,Mat A,IS r,const MatFactorInfo *info) 1703b24902e0SBarry Smith { 1704e69c285eSBarry Smith Mat_MUMPS *mumps = (Mat_MUMPS*)F->data; 1705dcd589f8SShri Abhyankar PetscErrorCode ierr; 170667877ebaSShri Abhyankar Vec b; 170767877ebaSShri Abhyankar const PetscInt M = A->rmap->N; 1708397b6df1SKris Buschelman 1709397b6df1SKris Buschelman PetscFunctionBegin; 1710a5e57a09SHong Zhang mumps->matstruc = DIFFERENT_NONZERO_PATTERN; 1711dcd589f8SShri Abhyankar 17129a2535b5SHong Zhang /* Set MUMPS options from the options database */ 17139a2535b5SHong Zhang ierr = PetscSetMUMPSFromOptions(F,A);CHKERRQ(ierr); 1714dcd589f8SShri Abhyankar 1715a5e57a09SHong Zhang ierr = (*mumps->ConvertToTriples)(A, 1, MAT_INITIAL_MATRIX, &mumps->nz, &mumps->irn, &mumps->jcn, &mumps->val);CHKERRQ(ierr); 17163ab56b82SJunchao Zhang ierr = MatMumpsGatherNonzerosOnMaster(MAT_INITIAL_MATRIX,mumps);CHKERRQ(ierr); 1717dcd589f8SShri Abhyankar 171867877ebaSShri Abhyankar /* analysis phase */ 171967877ebaSShri Abhyankar /*----------------*/ 1720a5e57a09SHong Zhang mumps->id.job = JOB_FACTSYMBOLIC; 1721a5e57a09SHong Zhang mumps->id.n = M; 1722a5e57a09SHong Zhang switch (mumps->id.ICNTL(18)) { 172367877ebaSShri Abhyankar case 0: /* centralized assembled matrix input */ 1724a5e57a09SHong Zhang if (!mumps->myid) { 1725a5e57a09SHong Zhang mumps->id.nz =mumps->nz; mumps->id.irn=mumps->irn; mumps->id.jcn=mumps->jcn; 1726a5e57a09SHong Zhang if (mumps->id.ICNTL(6)>1) { 1727940cd9d6SSatish Balay mumps->id.a = (MumpsScalar*)mumps->val; 172867877ebaSShri Abhyankar } 172967877ebaSShri Abhyankar } 173067877ebaSShri Abhyankar break; 173167877ebaSShri Abhyankar case 3: /* distributed assembled matrix input (size>1) */ 1732a5e57a09SHong Zhang mumps->id.nz_loc = mumps->nz; 1733a5e57a09SHong Zhang mumps->id.irn_loc=mumps->irn; mumps->id.jcn_loc=mumps->jcn; 1734a5e57a09SHong Zhang if (mumps->id.ICNTL(6)>1) { 1735940cd9d6SSatish Balay mumps->id.a_loc = (MumpsScalar*)mumps->val; 173667877ebaSShri Abhyankar } 173767877ebaSShri Abhyankar /* MUMPS only supports centralized rhs. Create scatter scat_rhs for repeated use in MatSolve() */ 17382a7a6963SBarry Smith ierr = MatCreateVecs(A,NULL,&b);CHKERRQ(ierr); 173994b42a18SJunchao Zhang ierr = VecScatterCreateToZero(b,&mumps->scat_rhs,&mumps->b_seq);CHKERRQ(ierr); 17406bf464f9SBarry Smith ierr = VecDestroy(&b);CHKERRQ(ierr); 174167877ebaSShri Abhyankar break; 174267877ebaSShri Abhyankar } 17433ab56b82SJunchao Zhang PetscMUMPS_c(mumps); 17445cd7cf9dSHong Zhang ierr = MatFactorSymbolic_MUMPS_ReportIfError(F,A,info,mumps);CHKERRQ(ierr); 17455cd7cf9dSHong Zhang 17462792810eSHong Zhang F->ops->choleskyfactornumeric = MatFactorNumeric_MUMPS; 1747dcd589f8SShri Abhyankar F->ops->solve = MatSolve_MUMPS; 174851d5961aSHong Zhang F->ops->solvetranspose = MatSolve_MUMPS; 17494e34a73bSHong Zhang F->ops->matsolve = MatMatSolve_MUMPS; 175023a5080aSHong Zhang F->ops->mattransposesolve = MatMatTransposeSolve_MUMPS; 17514e34a73bSHong Zhang #if defined(PETSC_USE_COMPLEX) 17520298fd71SBarry Smith F->ops->getinertia = NULL; 17534e34a73bSHong Zhang #else 17544e34a73bSHong Zhang F->ops->getinertia = MatGetInertia_SBAIJMUMPS; 1755db4efbfdSBarry Smith #endif 1756b24902e0SBarry Smith PetscFunctionReturn(0); 1757b24902e0SBarry Smith } 1758b24902e0SBarry Smith 175964e6c443SBarry Smith PetscErrorCode MatView_MUMPS(Mat A,PetscViewer viewer) 176074ed9c26SBarry Smith { 1761f6c57405SHong Zhang PetscErrorCode ierr; 176264e6c443SBarry Smith PetscBool iascii; 176364e6c443SBarry Smith PetscViewerFormat format; 1764e69c285eSBarry Smith Mat_MUMPS *mumps=(Mat_MUMPS*)A->data; 1765f6c57405SHong Zhang 1766f6c57405SHong Zhang PetscFunctionBegin; 176764e6c443SBarry Smith /* check if matrix is mumps type */ 176864e6c443SBarry Smith if (A->ops->solve != MatSolve_MUMPS) PetscFunctionReturn(0); 176964e6c443SBarry Smith 1770251f4c67SDmitry Karpeev ierr = PetscObjectTypeCompare((PetscObject)viewer,PETSCVIEWERASCII,&iascii);CHKERRQ(ierr); 177164e6c443SBarry Smith if (iascii) { 177264e6c443SBarry Smith ierr = PetscViewerGetFormat(viewer,&format);CHKERRQ(ierr); 177364e6c443SBarry Smith if (format == PETSC_VIEWER_ASCII_INFO) { 177464e6c443SBarry Smith ierr = PetscViewerASCIIPrintf(viewer,"MUMPS run parameters:\n");CHKERRQ(ierr); 1775a5e57a09SHong Zhang ierr = PetscViewerASCIIPrintf(viewer," SYM (matrix type): %d \n",mumps->id.sym);CHKERRQ(ierr); 1776a5e57a09SHong Zhang ierr = PetscViewerASCIIPrintf(viewer," PAR (host participation): %d \n",mumps->id.par);CHKERRQ(ierr); 1777a5e57a09SHong Zhang ierr = PetscViewerASCIIPrintf(viewer," ICNTL(1) (output for error): %d \n",mumps->id.ICNTL(1));CHKERRQ(ierr); 1778a5e57a09SHong Zhang ierr = PetscViewerASCIIPrintf(viewer," ICNTL(2) (output of diagnostic msg): %d \n",mumps->id.ICNTL(2));CHKERRQ(ierr); 1779a5e57a09SHong Zhang ierr = PetscViewerASCIIPrintf(viewer," ICNTL(3) (output for global info): %d \n",mumps->id.ICNTL(3));CHKERRQ(ierr); 1780a5e57a09SHong Zhang ierr = PetscViewerASCIIPrintf(viewer," ICNTL(4) (level of printing): %d \n",mumps->id.ICNTL(4));CHKERRQ(ierr); 1781a5e57a09SHong Zhang ierr = PetscViewerASCIIPrintf(viewer," ICNTL(5) (input mat struct): %d \n",mumps->id.ICNTL(5));CHKERRQ(ierr); 1782a5e57a09SHong Zhang ierr = PetscViewerASCIIPrintf(viewer," ICNTL(6) (matrix prescaling): %d \n",mumps->id.ICNTL(6));CHKERRQ(ierr); 1783d4ed72bbSHong Zhang ierr = PetscViewerASCIIPrintf(viewer," ICNTL(7) (sequential matrix ordering):%d \n",mumps->id.ICNTL(7));CHKERRQ(ierr); 1784d4ed72bbSHong Zhang ierr = PetscViewerASCIIPrintf(viewer," ICNTL(8) (scaling strategy): %d \n",mumps->id.ICNTL(8));CHKERRQ(ierr); 1785a5e57a09SHong Zhang ierr = PetscViewerASCIIPrintf(viewer," ICNTL(10) (max num of refinements): %d \n",mumps->id.ICNTL(10));CHKERRQ(ierr); 1786a5e57a09SHong Zhang ierr = PetscViewerASCIIPrintf(viewer," ICNTL(11) (error analysis): %d \n",mumps->id.ICNTL(11));CHKERRQ(ierr); 1787a5e57a09SHong Zhang if (mumps->id.ICNTL(11)>0) { 1788a5e57a09SHong Zhang ierr = PetscViewerASCIIPrintf(viewer," RINFOG(4) (inf norm of input mat): %g\n",mumps->id.RINFOG(4));CHKERRQ(ierr); 1789a5e57a09SHong Zhang ierr = PetscViewerASCIIPrintf(viewer," RINFOG(5) (inf norm of solution): %g\n",mumps->id.RINFOG(5));CHKERRQ(ierr); 1790a5e57a09SHong Zhang ierr = PetscViewerASCIIPrintf(viewer," RINFOG(6) (inf norm of residual): %g\n",mumps->id.RINFOG(6));CHKERRQ(ierr); 1791a5e57a09SHong Zhang ierr = PetscViewerASCIIPrintf(viewer," RINFOG(7),RINFOG(8) (backward error est): %g, %g\n",mumps->id.RINFOG(7),mumps->id.RINFOG(8));CHKERRQ(ierr); 1792a5e57a09SHong Zhang ierr = PetscViewerASCIIPrintf(viewer," RINFOG(9) (error estimate): %g \n",mumps->id.RINFOG(9));CHKERRQ(ierr); 1793a5e57a09SHong Zhang ierr = PetscViewerASCIIPrintf(viewer," RINFOG(10),RINFOG(11)(condition numbers): %g, %g\n",mumps->id.RINFOG(10),mumps->id.RINFOG(11));CHKERRQ(ierr); 1794f6c57405SHong Zhang } 1795a5e57a09SHong Zhang ierr = PetscViewerASCIIPrintf(viewer," ICNTL(12) (efficiency control): %d \n",mumps->id.ICNTL(12));CHKERRQ(ierr); 1796a5e57a09SHong Zhang ierr = PetscViewerASCIIPrintf(viewer," ICNTL(13) (efficiency control): %d \n",mumps->id.ICNTL(13));CHKERRQ(ierr); 1797a5e57a09SHong Zhang ierr = PetscViewerASCIIPrintf(viewer," ICNTL(14) (percentage of estimated workspace increase): %d \n",mumps->id.ICNTL(14));CHKERRQ(ierr); 1798f6c57405SHong Zhang /* ICNTL(15-17) not used */ 1799a5e57a09SHong Zhang ierr = PetscViewerASCIIPrintf(viewer," ICNTL(18) (input mat struct): %d \n",mumps->id.ICNTL(18));CHKERRQ(ierr); 1800d4ed72bbSHong Zhang ierr = PetscViewerASCIIPrintf(viewer," ICNTL(19) (Schur complement info): %d \n",mumps->id.ICNTL(19));CHKERRQ(ierr); 1801a5e57a09SHong Zhang ierr = PetscViewerASCIIPrintf(viewer," ICNTL(20) (rhs sparse pattern): %d \n",mumps->id.ICNTL(20));CHKERRQ(ierr); 1802ca3dc52bSPierre Jolivet ierr = PetscViewerASCIIPrintf(viewer," ICNTL(21) (solution struct): %d \n",mumps->id.ICNTL(21));CHKERRQ(ierr); 1803a5e57a09SHong Zhang ierr = PetscViewerASCIIPrintf(viewer," ICNTL(22) (in-core/out-of-core facility): %d \n",mumps->id.ICNTL(22));CHKERRQ(ierr); 1804a5e57a09SHong Zhang ierr = PetscViewerASCIIPrintf(viewer," ICNTL(23) (max size of memory can be allocated locally):%d \n",mumps->id.ICNTL(23));CHKERRQ(ierr); 1805c0165424SHong Zhang 1806a5e57a09SHong Zhang ierr = PetscViewerASCIIPrintf(viewer," ICNTL(24) (detection of null pivot rows): %d \n",mumps->id.ICNTL(24));CHKERRQ(ierr); 1807a5e57a09SHong Zhang ierr = PetscViewerASCIIPrintf(viewer," ICNTL(25) (computation of a null space basis): %d \n",mumps->id.ICNTL(25));CHKERRQ(ierr); 1808a5e57a09SHong Zhang ierr = PetscViewerASCIIPrintf(viewer," ICNTL(26) (Schur options for rhs or solution): %d \n",mumps->id.ICNTL(26));CHKERRQ(ierr); 1809a5e57a09SHong Zhang ierr = PetscViewerASCIIPrintf(viewer," ICNTL(27) (experimental parameter): %d \n",mumps->id.ICNTL(27));CHKERRQ(ierr); 1810a5e57a09SHong Zhang ierr = PetscViewerASCIIPrintf(viewer," ICNTL(28) (use parallel or sequential ordering): %d \n",mumps->id.ICNTL(28));CHKERRQ(ierr); 1811a5e57a09SHong Zhang ierr = PetscViewerASCIIPrintf(viewer," ICNTL(29) (parallel ordering): %d \n",mumps->id.ICNTL(29));CHKERRQ(ierr); 181242179a6aSHong Zhang 1813a5e57a09SHong Zhang ierr = PetscViewerASCIIPrintf(viewer," ICNTL(30) (user-specified set of entries in inv(A)): %d \n",mumps->id.ICNTL(30));CHKERRQ(ierr); 1814a5e57a09SHong Zhang ierr = PetscViewerASCIIPrintf(viewer," ICNTL(31) (factors is discarded in the solve phase): %d \n",mumps->id.ICNTL(31));CHKERRQ(ierr); 1815a5e57a09SHong Zhang ierr = PetscViewerASCIIPrintf(viewer," ICNTL(33) (compute determinant): %d \n",mumps->id.ICNTL(33));CHKERRQ(ierr); 18166e32de5dSHong Zhang ierr = PetscViewerASCIIPrintf(viewer," ICNTL(35) (activate BLR based factorization): %d \n",mumps->id.ICNTL(35));CHKERRQ(ierr); 1817a0e18203SThibaut Appel ierr = PetscViewerASCIIPrintf(viewer," ICNTL(36) (choice of BLR factorization variant): %d \n",mumps->id.ICNTL(36));CHKERRQ(ierr); 1818a0e18203SThibaut Appel ierr = PetscViewerASCIIPrintf(viewer," ICNTL(38) (estimated compression rate of LU factors): %d \n",mumps->id.ICNTL(38));CHKERRQ(ierr); 1819f6c57405SHong Zhang 1820a5e57a09SHong Zhang ierr = PetscViewerASCIIPrintf(viewer," CNTL(1) (relative pivoting threshold): %g \n",mumps->id.CNTL(1));CHKERRQ(ierr); 1821a5e57a09SHong Zhang ierr = PetscViewerASCIIPrintf(viewer," CNTL(2) (stopping criterion of refinement): %g \n",mumps->id.CNTL(2));CHKERRQ(ierr); 1822ca3dc52bSPierre Jolivet ierr = PetscViewerASCIIPrintf(viewer," CNTL(3) (absolute pivoting threshold): %g \n",mumps->id.CNTL(3));CHKERRQ(ierr); 1823ca3dc52bSPierre Jolivet ierr = PetscViewerASCIIPrintf(viewer," CNTL(4) (value of static pivoting): %g \n",mumps->id.CNTL(4));CHKERRQ(ierr); 1824a5e57a09SHong Zhang ierr = PetscViewerASCIIPrintf(viewer," CNTL(5) (fixation for null pivots): %g \n",mumps->id.CNTL(5));CHKERRQ(ierr); 18256e32de5dSHong Zhang ierr = PetscViewerASCIIPrintf(viewer," CNTL(7) (dropping parameter for BLR): %g \n",mumps->id.CNTL(7));CHKERRQ(ierr); 1826f6c57405SHong Zhang 1827f6c57405SHong Zhang /* infomation local to each processor */ 182834ed7027SBarry Smith ierr = PetscViewerASCIIPrintf(viewer, " RINFO(1) (local estimated flops for the elimination after analysis): \n");CHKERRQ(ierr); 18291575c14dSBarry Smith ierr = PetscViewerASCIIPushSynchronized(viewer);CHKERRQ(ierr); 1830a5e57a09SHong Zhang ierr = PetscViewerASCIISynchronizedPrintf(viewer," [%d] %g \n",mumps->myid,mumps->id.RINFO(1));CHKERRQ(ierr); 18312a808120SBarry Smith ierr = PetscViewerFlush(viewer);CHKERRQ(ierr); 183234ed7027SBarry Smith ierr = PetscViewerASCIIPrintf(viewer, " RINFO(2) (local estimated flops for the assembly after factorization): \n");CHKERRQ(ierr); 1833a5e57a09SHong Zhang ierr = PetscViewerASCIISynchronizedPrintf(viewer," [%d] %g \n",mumps->myid,mumps->id.RINFO(2));CHKERRQ(ierr); 18342a808120SBarry Smith ierr = PetscViewerFlush(viewer);CHKERRQ(ierr); 183534ed7027SBarry Smith ierr = PetscViewerASCIIPrintf(viewer, " RINFO(3) (local estimated flops for the elimination after factorization): \n");CHKERRQ(ierr); 1836a5e57a09SHong Zhang ierr = PetscViewerASCIISynchronizedPrintf(viewer," [%d] %g \n",mumps->myid,mumps->id.RINFO(3));CHKERRQ(ierr); 18372a808120SBarry Smith ierr = PetscViewerFlush(viewer);CHKERRQ(ierr); 1838f6c57405SHong Zhang 183934ed7027SBarry Smith ierr = PetscViewerASCIIPrintf(viewer, " INFO(15) (estimated size of (in MB) MUMPS internal data for running numerical factorization): \n");CHKERRQ(ierr); 1840a5e57a09SHong Zhang ierr = PetscViewerASCIISynchronizedPrintf(viewer," [%d] %d \n",mumps->myid,mumps->id.INFO(15));CHKERRQ(ierr); 18412a808120SBarry Smith ierr = PetscViewerFlush(viewer);CHKERRQ(ierr); 1842f6c57405SHong Zhang 184334ed7027SBarry Smith ierr = PetscViewerASCIIPrintf(viewer, " INFO(16) (size of (in MB) MUMPS internal data used during numerical factorization): \n");CHKERRQ(ierr); 1844a5e57a09SHong Zhang ierr = PetscViewerASCIISynchronizedPrintf(viewer," [%d] %d \n",mumps->myid,mumps->id.INFO(16));CHKERRQ(ierr); 18452a808120SBarry Smith ierr = PetscViewerFlush(viewer);CHKERRQ(ierr); 1846f6c57405SHong Zhang 184734ed7027SBarry Smith ierr = PetscViewerASCIIPrintf(viewer, " INFO(23) (num of pivots eliminated on this processor after factorization): \n");CHKERRQ(ierr); 1848a5e57a09SHong Zhang ierr = PetscViewerASCIISynchronizedPrintf(viewer," [%d] %d \n",mumps->myid,mumps->id.INFO(23));CHKERRQ(ierr); 18492a808120SBarry Smith ierr = PetscViewerFlush(viewer);CHKERRQ(ierr); 1850b34f08ffSHong Zhang 1851a0e18203SThibaut Appel if (mumps->ninfo && mumps->ninfo <= 80){ 1852b34f08ffSHong Zhang PetscInt i; 1853b34f08ffSHong Zhang for (i=0; i<mumps->ninfo; i++){ 1854b34f08ffSHong Zhang ierr = PetscViewerASCIIPrintf(viewer, " INFO(%d): \n",mumps->info[i]);CHKERRQ(ierr); 1855b34f08ffSHong Zhang ierr = PetscViewerASCIISynchronizedPrintf(viewer," [%d] %d \n",mumps->myid,mumps->id.INFO(mumps->info[i]));CHKERRQ(ierr); 18562a808120SBarry Smith ierr = PetscViewerFlush(viewer);CHKERRQ(ierr); 1857b34f08ffSHong Zhang } 1858b34f08ffSHong Zhang } 18591575c14dSBarry Smith ierr = PetscViewerASCIIPopSynchronized(viewer);CHKERRQ(ierr); 1860f6c57405SHong Zhang 1861a5e57a09SHong Zhang if (!mumps->myid) { /* information from the host */ 1862a5e57a09SHong Zhang ierr = PetscViewerASCIIPrintf(viewer," RINFOG(1) (global estimated flops for the elimination after analysis): %g \n",mumps->id.RINFOG(1));CHKERRQ(ierr); 1863a5e57a09SHong Zhang ierr = PetscViewerASCIIPrintf(viewer," RINFOG(2) (global estimated flops for the assembly after factorization): %g \n",mumps->id.RINFOG(2));CHKERRQ(ierr); 1864a5e57a09SHong Zhang ierr = PetscViewerASCIIPrintf(viewer," RINFOG(3) (global estimated flops for the elimination after factorization): %g \n",mumps->id.RINFOG(3));CHKERRQ(ierr); 1865a5e57a09SHong 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); 1866f6c57405SHong Zhang 1867a5e57a09SHong Zhang ierr = PetscViewerASCIIPrintf(viewer," INFOG(3) (estimated real workspace for factors on all processors after analysis): %d \n",mumps->id.INFOG(3));CHKERRQ(ierr); 1868a5e57a09SHong Zhang ierr = PetscViewerASCIIPrintf(viewer," INFOG(4) (estimated integer workspace for factors on all processors after analysis): %d \n",mumps->id.INFOG(4));CHKERRQ(ierr); 1869a5e57a09SHong Zhang ierr = PetscViewerASCIIPrintf(viewer," INFOG(5) (estimated maximum front size in the complete tree): %d \n",mumps->id.INFOG(5));CHKERRQ(ierr); 1870a5e57a09SHong Zhang ierr = PetscViewerASCIIPrintf(viewer," INFOG(6) (number of nodes in the complete tree): %d \n",mumps->id.INFOG(6));CHKERRQ(ierr); 1871a5e57a09SHong Zhang ierr = PetscViewerASCIIPrintf(viewer," INFOG(7) (ordering option effectively use after analysis): %d \n",mumps->id.INFOG(7));CHKERRQ(ierr); 1872a5e57a09SHong Zhang ierr = PetscViewerASCIIPrintf(viewer," INFOG(8) (structural symmetry in percent of the permuted matrix after analysis): %d \n",mumps->id.INFOG(8));CHKERRQ(ierr); 1873a5e57a09SHong 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); 1874a5e57a09SHong Zhang ierr = PetscViewerASCIIPrintf(viewer," INFOG(10) (total integer space store the matrix factors after factorization): %d \n",mumps->id.INFOG(10));CHKERRQ(ierr); 1875a5e57a09SHong Zhang ierr = PetscViewerASCIIPrintf(viewer," INFOG(11) (order of largest frontal matrix after factorization): %d \n",mumps->id.INFOG(11));CHKERRQ(ierr); 1876a5e57a09SHong Zhang ierr = PetscViewerASCIIPrintf(viewer," INFOG(12) (number of off-diagonal pivots): %d \n",mumps->id.INFOG(12));CHKERRQ(ierr); 1877a5e57a09SHong Zhang ierr = PetscViewerASCIIPrintf(viewer," INFOG(13) (number of delayed pivots after factorization): %d \n",mumps->id.INFOG(13));CHKERRQ(ierr); 1878a5e57a09SHong Zhang ierr = PetscViewerASCIIPrintf(viewer," INFOG(14) (number of memory compress after factorization): %d \n",mumps->id.INFOG(14));CHKERRQ(ierr); 1879a5e57a09SHong Zhang ierr = PetscViewerASCIIPrintf(viewer," INFOG(15) (number of steps of iterative refinement after solution): %d \n",mumps->id.INFOG(15));CHKERRQ(ierr); 1880a5e57a09SHong 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); 1881a5e57a09SHong 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); 1882a5e57a09SHong 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); 1883a5e57a09SHong 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); 1884a5e57a09SHong Zhang ierr = PetscViewerASCIIPrintf(viewer," INFOG(20) (estimated number of entries in the factors): %d \n",mumps->id.INFOG(20));CHKERRQ(ierr); 1885a5e57a09SHong 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); 1886a5e57a09SHong 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); 1887a5e57a09SHong Zhang ierr = PetscViewerASCIIPrintf(viewer," INFOG(23) (after analysis: value of ICNTL(6) effectively used): %d \n",mumps->id.INFOG(23));CHKERRQ(ierr); 1888a5e57a09SHong Zhang ierr = PetscViewerASCIIPrintf(viewer," INFOG(24) (after analysis: value of ICNTL(12) effectively used): %d \n",mumps->id.INFOG(24));CHKERRQ(ierr); 1889a5e57a09SHong Zhang ierr = PetscViewerASCIIPrintf(viewer," INFOG(25) (after factorization: number of pivots modified by static pivoting): %d \n",mumps->id.INFOG(25));CHKERRQ(ierr); 189040d435e3SHong Zhang ierr = PetscViewerASCIIPrintf(viewer," INFOG(28) (after factorization: number of null pivots encountered): %d\n",mumps->id.INFOG(28));CHKERRQ(ierr); 189140d435e3SHong 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); 189240d435e3SHong 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); 189340d435e3SHong Zhang ierr = PetscViewerASCIIPrintf(viewer," INFOG(32) (after analysis: type of analysis done): %d\n",mumps->id.INFOG(32));CHKERRQ(ierr); 189440d435e3SHong Zhang ierr = PetscViewerASCIIPrintf(viewer," INFOG(33) (value used for ICNTL(8)): %d\n",mumps->id.INFOG(33));CHKERRQ(ierr); 189540d435e3SHong Zhang ierr = PetscViewerASCIIPrintf(viewer," INFOG(34) (exponent of the determinant if determinant is requested): %d\n",mumps->id.INFOG(34));CHKERRQ(ierr); 1896a0e18203SThibaut Appel ierr = PetscViewerASCIIPrintf(viewer," INFOG(35) (after factorization: number of entries taking into account BLR factor compression - sum over all processors): %d\n",mumps->id.INFOG(35));CHKERRQ(ierr); 1897a0e18203SThibaut Appel ierr = PetscViewerASCIIPrintf(viewer," INFOG(36) (after analysis: estimated size of all MUMPS internal data for running BLR in-core - value on the most memory consuming processor): %d \n",mumps->id.INFOG(36));CHKERRQ(ierr); 1898a0e18203SThibaut Appel ierr = PetscViewerASCIIPrintf(viewer," INFOG(37) (after analysis: estimated size of all MUMPS internal data for running BLR in-core - sum over all processors): %d \n",mumps->id.INFOG(37));CHKERRQ(ierr); 1899a0e18203SThibaut Appel ierr = PetscViewerASCIIPrintf(viewer," INFOG(38) (after analysis: estimated size of all MUMPS internal data for running BLR out-of-core - value on the most memory consuming processor): %d \n",mumps->id.INFOG(38));CHKERRQ(ierr); 1900a0e18203SThibaut Appel ierr = PetscViewerASCIIPrintf(viewer," INFOG(39) (after analysis: estimated size of all MUMPS internal data for running BLR out-of-core - sum over all processors): %d \n",mumps->id.INFOG(39));CHKERRQ(ierr); 1901f6c57405SHong Zhang } 1902f6c57405SHong Zhang } 1903cb828f0fSHong Zhang } 1904f6c57405SHong Zhang PetscFunctionReturn(0); 1905f6c57405SHong Zhang } 1906f6c57405SHong Zhang 190735bd34faSBarry Smith PetscErrorCode MatGetInfo_MUMPS(Mat A,MatInfoType flag,MatInfo *info) 190835bd34faSBarry Smith { 1909e69c285eSBarry Smith Mat_MUMPS *mumps =(Mat_MUMPS*)A->data; 191035bd34faSBarry Smith 191135bd34faSBarry Smith PetscFunctionBegin; 191235bd34faSBarry Smith info->block_size = 1.0; 1913cb828f0fSHong Zhang info->nz_allocated = mumps->id.INFOG(20); 1914cb828f0fSHong Zhang info->nz_used = mumps->id.INFOG(20); 191535bd34faSBarry Smith info->nz_unneeded = 0.0; 191635bd34faSBarry Smith info->assemblies = 0.0; 191735bd34faSBarry Smith info->mallocs = 0.0; 191835bd34faSBarry Smith info->memory = 0.0; 191935bd34faSBarry Smith info->fill_ratio_given = 0; 192035bd34faSBarry Smith info->fill_ratio_needed = 0; 192135bd34faSBarry Smith info->factor_mallocs = 0; 192235bd34faSBarry Smith PetscFunctionReturn(0); 192335bd34faSBarry Smith } 192435bd34faSBarry Smith 19255ccb76cbSHong Zhang /* -------------------------------------------------------------------------------------------*/ 19268e7ba810SStefano Zampini PetscErrorCode MatFactorSetSchurIS_MUMPS(Mat F, IS is) 19276444a565SStefano Zampini { 1928e69c285eSBarry Smith Mat_MUMPS *mumps =(Mat_MUMPS*)F->data; 19298e7ba810SStefano Zampini const PetscInt *idxs; 19308e7ba810SStefano Zampini PetscInt size,i; 19316444a565SStefano Zampini PetscErrorCode ierr; 19326444a565SStefano Zampini 19336444a565SStefano Zampini PetscFunctionBegin; 1934b3cb21ddSStefano Zampini ierr = ISGetLocalSize(is,&size);CHKERRQ(ierr); 19352d4298aeSJunchao Zhang if (mumps->petsc_size > 1) { 19363ab56b82SJunchao Zhang PetscBool ls,gs; /* gs is false if any rank other than root has non-empty IS */ 1937241dbb5eSStefano Zampini 19383ab56b82SJunchao Zhang ls = mumps->myid ? (size ? PETSC_FALSE : PETSC_TRUE) : PETSC_TRUE; /* always true on root; false on others if their size != 0 */ 19393ab56b82SJunchao Zhang ierr = MPI_Allreduce(&ls,&gs,1,MPIU_BOOL,MPI_LAND,mumps->petsc_comm);CHKERRQ(ierr); 1940241dbb5eSStefano Zampini if (!gs) SETERRQ(PETSC_COMM_SELF,PETSC_ERR_SUP,"MUMPS distributed parallel Schur complements not yet supported from PETSc\n"); 1941241dbb5eSStefano Zampini } 19426444a565SStefano Zampini if (mumps->id.size_schur != size) { 19436444a565SStefano Zampini ierr = PetscFree2(mumps->id.listvar_schur,mumps->id.schur);CHKERRQ(ierr); 19446444a565SStefano Zampini mumps->id.size_schur = size; 19456444a565SStefano Zampini mumps->id.schur_lld = size; 19466444a565SStefano Zampini ierr = PetscMalloc2(size,&mumps->id.listvar_schur,size*size,&mumps->id.schur);CHKERRQ(ierr); 19476444a565SStefano Zampini } 1948b3cb21ddSStefano Zampini 1949b3cb21ddSStefano Zampini /* Schur complement matrix */ 1950b3cb21ddSStefano Zampini ierr = MatCreateSeqDense(PETSC_COMM_SELF,mumps->id.size_schur,mumps->id.size_schur,(PetscScalar*)mumps->id.schur,&F->schur);CHKERRQ(ierr); 1951b3cb21ddSStefano Zampini if (mumps->sym == 1) { 1952b3cb21ddSStefano Zampini ierr = MatSetOption(F->schur,MAT_SPD,PETSC_TRUE);CHKERRQ(ierr); 1953b3cb21ddSStefano Zampini } 1954b3cb21ddSStefano Zampini 1955b3cb21ddSStefano Zampini /* MUMPS expects Fortran style indices */ 19568e7ba810SStefano Zampini ierr = ISGetIndices(is,&idxs);CHKERRQ(ierr); 1957580bdb30SBarry Smith ierr = PetscArraycpy(mumps->id.listvar_schur,idxs,size);CHKERRQ(ierr); 19588e7ba810SStefano Zampini for (i=0;i<size;i++) mumps->id.listvar_schur[i]++; 19598e7ba810SStefano Zampini ierr = ISRestoreIndices(is,&idxs);CHKERRQ(ierr); 19602d4298aeSJunchao Zhang if (mumps->petsc_size > 1) { 1961241dbb5eSStefano Zampini mumps->id.ICNTL(19) = 1; /* MUMPS returns Schur centralized on the host */ 1962241dbb5eSStefano Zampini } else { 19636444a565SStefano Zampini if (F->factortype == MAT_FACTOR_LU) { 196459ac8732SStefano Zampini mumps->id.ICNTL(19) = 3; /* MUMPS returns full matrix */ 19656444a565SStefano Zampini } else { 196659ac8732SStefano Zampini mumps->id.ICNTL(19) = 2; /* MUMPS returns lower triangular part */ 19676444a565SStefano Zampini } 1968241dbb5eSStefano Zampini } 196959ac8732SStefano Zampini /* set a special value of ICNTL (not handled my MUMPS) to be used in the solve phase by PETSc */ 1970b5fa320bSStefano Zampini mumps->id.ICNTL(26) = -1; 19716444a565SStefano Zampini PetscFunctionReturn(0); 19726444a565SStefano Zampini } 197359ac8732SStefano Zampini 19746444a565SStefano Zampini /* -------------------------------------------------------------------------------------------*/ 19755a05ddb0SStefano Zampini PetscErrorCode MatFactorCreateSchurComplement_MUMPS(Mat F,Mat* S) 19766444a565SStefano Zampini { 19776444a565SStefano Zampini Mat St; 1978e69c285eSBarry Smith Mat_MUMPS *mumps =(Mat_MUMPS*)F->data; 19796444a565SStefano Zampini PetscScalar *array; 19806444a565SStefano Zampini #if defined(PETSC_USE_COMPLEX) 19818ac429a0SStefano Zampini PetscScalar im = PetscSqrtScalar((PetscScalar)-1.0); 19826444a565SStefano Zampini #endif 19836444a565SStefano Zampini PetscErrorCode ierr; 19846444a565SStefano Zampini 19856444a565SStefano Zampini PetscFunctionBegin; 19865a05ddb0SStefano Zampini if (!mumps->id.ICNTL(19)) SETERRQ(PetscObjectComm((PetscObject)F),PETSC_ERR_ORDER,"Schur complement mode not selected! You should call MatFactorSetSchurIS to enable it"); 1987241dbb5eSStefano Zampini ierr = MatCreate(PETSC_COMM_SELF,&St);CHKERRQ(ierr); 19886444a565SStefano Zampini ierr = MatSetSizes(St,PETSC_DECIDE,PETSC_DECIDE,mumps->id.size_schur,mumps->id.size_schur);CHKERRQ(ierr); 19896444a565SStefano Zampini ierr = MatSetType(St,MATDENSE);CHKERRQ(ierr); 19906444a565SStefano Zampini ierr = MatSetUp(St);CHKERRQ(ierr); 19916444a565SStefano Zampini ierr = MatDenseGetArray(St,&array);CHKERRQ(ierr); 199259ac8732SStefano Zampini if (!mumps->sym) { /* MUMPS always return a full matrix */ 19936444a565SStefano Zampini if (mumps->id.ICNTL(19) == 1) { /* stored by rows */ 19946444a565SStefano Zampini PetscInt i,j,N=mumps->id.size_schur; 19956444a565SStefano Zampini for (i=0;i<N;i++) { 19966444a565SStefano Zampini for (j=0;j<N;j++) { 19976444a565SStefano Zampini #if !defined(PETSC_USE_COMPLEX) 19986444a565SStefano Zampini PetscScalar val = mumps->id.schur[i*N+j]; 19996444a565SStefano Zampini #else 20006444a565SStefano Zampini PetscScalar val = mumps->id.schur[i*N+j].r + im*mumps->id.schur[i*N+j].i; 20016444a565SStefano Zampini #endif 20026444a565SStefano Zampini array[j*N+i] = val; 20036444a565SStefano Zampini } 20046444a565SStefano Zampini } 20056444a565SStefano Zampini } else { /* stored by columns */ 2006580bdb30SBarry Smith ierr = PetscArraycpy(array,mumps->id.schur,mumps->id.size_schur*mumps->id.size_schur);CHKERRQ(ierr); 20076444a565SStefano Zampini } 20086444a565SStefano Zampini } else { /* either full or lower-triangular (not packed) */ 20096444a565SStefano Zampini if (mumps->id.ICNTL(19) == 2) { /* lower triangular stored by columns */ 20106444a565SStefano Zampini PetscInt i,j,N=mumps->id.size_schur; 20116444a565SStefano Zampini for (i=0;i<N;i++) { 20126444a565SStefano Zampini for (j=i;j<N;j++) { 20136444a565SStefano Zampini #if !defined(PETSC_USE_COMPLEX) 20146444a565SStefano Zampini PetscScalar val = mumps->id.schur[i*N+j]; 20156444a565SStefano Zampini #else 20166444a565SStefano Zampini PetscScalar val = mumps->id.schur[i*N+j].r + im*mumps->id.schur[i*N+j].i; 20176444a565SStefano Zampini #endif 20186444a565SStefano Zampini array[i*N+j] = val; 20196444a565SStefano Zampini array[j*N+i] = val; 20206444a565SStefano Zampini } 20216444a565SStefano Zampini } 20226444a565SStefano Zampini } else if (mumps->id.ICNTL(19) == 3) { /* full matrix */ 2023580bdb30SBarry Smith ierr = PetscArraycpy(array,mumps->id.schur,mumps->id.size_schur*mumps->id.size_schur);CHKERRQ(ierr); 20246444a565SStefano Zampini } else { /* ICNTL(19) == 1 lower triangular stored by rows */ 20256444a565SStefano Zampini PetscInt i,j,N=mumps->id.size_schur; 20266444a565SStefano Zampini for (i=0;i<N;i++) { 20276444a565SStefano Zampini for (j=0;j<i+1;j++) { 20286444a565SStefano Zampini #if !defined(PETSC_USE_COMPLEX) 20296444a565SStefano Zampini PetscScalar val = mumps->id.schur[i*N+j]; 20306444a565SStefano Zampini #else 20316444a565SStefano Zampini PetscScalar val = mumps->id.schur[i*N+j].r + im*mumps->id.schur[i*N+j].i; 20326444a565SStefano Zampini #endif 20336444a565SStefano Zampini array[i*N+j] = val; 20346444a565SStefano Zampini array[j*N+i] = val; 20356444a565SStefano Zampini } 20366444a565SStefano Zampini } 20376444a565SStefano Zampini } 20386444a565SStefano Zampini } 20396444a565SStefano Zampini ierr = MatDenseRestoreArray(St,&array);CHKERRQ(ierr); 20406444a565SStefano Zampini *S = St; 20416444a565SStefano Zampini PetscFunctionReturn(0); 20426444a565SStefano Zampini } 20436444a565SStefano Zampini 204459ac8732SStefano Zampini /* -------------------------------------------------------------------------------------------*/ 20455ccb76cbSHong Zhang PetscErrorCode MatMumpsSetIcntl_MUMPS(Mat F,PetscInt icntl,PetscInt ival) 20465ccb76cbSHong Zhang { 2047e69c285eSBarry Smith Mat_MUMPS *mumps =(Mat_MUMPS*)F->data; 20485ccb76cbSHong Zhang 20495ccb76cbSHong Zhang PetscFunctionBegin; 2050a5e57a09SHong Zhang mumps->id.ICNTL(icntl) = ival; 20515ccb76cbSHong Zhang PetscFunctionReturn(0); 20525ccb76cbSHong Zhang } 20535ccb76cbSHong Zhang 2054bc6112feSHong Zhang PetscErrorCode MatMumpsGetIcntl_MUMPS(Mat F,PetscInt icntl,PetscInt *ival) 2055bc6112feSHong Zhang { 2056e69c285eSBarry Smith Mat_MUMPS *mumps =(Mat_MUMPS*)F->data; 2057bc6112feSHong Zhang 2058bc6112feSHong Zhang PetscFunctionBegin; 2059bc6112feSHong Zhang *ival = mumps->id.ICNTL(icntl); 2060bc6112feSHong Zhang PetscFunctionReturn(0); 2061bc6112feSHong Zhang } 2062bc6112feSHong Zhang 20635ccb76cbSHong Zhang /*@ 20645ccb76cbSHong Zhang MatMumpsSetIcntl - Set MUMPS parameter ICNTL() 20655ccb76cbSHong Zhang 20665ccb76cbSHong Zhang Logically Collective on Mat 20675ccb76cbSHong Zhang 20685ccb76cbSHong Zhang Input Parameters: 20695ccb76cbSHong Zhang + F - the factored matrix obtained by calling MatGetFactor() from PETSc-MUMPS interface 20705ccb76cbSHong Zhang . icntl - index of MUMPS parameter array ICNTL() 20715ccb76cbSHong Zhang - ival - value of MUMPS ICNTL(icntl) 20725ccb76cbSHong Zhang 20735ccb76cbSHong Zhang Options Database: 20745ccb76cbSHong Zhang . -mat_mumps_icntl_<icntl> <ival> 20755ccb76cbSHong Zhang 20765ccb76cbSHong Zhang Level: beginner 20775ccb76cbSHong Zhang 207896a0c994SBarry Smith References: 207996a0c994SBarry Smith . MUMPS Users' Guide 20805ccb76cbSHong Zhang 20819fc87aa7SBarry Smith .seealso: MatGetFactor(), MatMumpsSetICntl(), MatMumpsGetIcntl(), MatMumpsSetCntl(), MatMumpsGetCntl(), MatMumpsGetInfo(), MatMumpsGetInfog(), MatMumpsGetRinfo(), MatMumpsGetRinfog() 20825ccb76cbSHong Zhang @*/ 20835ccb76cbSHong Zhang PetscErrorCode MatMumpsSetIcntl(Mat F,PetscInt icntl,PetscInt ival) 20845ccb76cbSHong Zhang { 20855ccb76cbSHong Zhang PetscErrorCode ierr; 20865ccb76cbSHong Zhang 20875ccb76cbSHong Zhang PetscFunctionBegin; 20882989dfd4SHong Zhang PetscValidType(F,1); 20892989dfd4SHong Zhang if (!F->factortype) SETERRQ(PetscObjectComm((PetscObject)F),PETSC_ERR_ARG_WRONGSTATE,"Only for factored matrix"); 20905ccb76cbSHong Zhang PetscValidLogicalCollectiveInt(F,icntl,2); 20915ccb76cbSHong Zhang PetscValidLogicalCollectiveInt(F,ival,3); 20925ccb76cbSHong Zhang ierr = PetscTryMethod(F,"MatMumpsSetIcntl_C",(Mat,PetscInt,PetscInt),(F,icntl,ival));CHKERRQ(ierr); 20935ccb76cbSHong Zhang PetscFunctionReturn(0); 20945ccb76cbSHong Zhang } 20955ccb76cbSHong Zhang 2096a21f80fcSHong Zhang /*@ 2097a21f80fcSHong Zhang MatMumpsGetIcntl - Get MUMPS parameter ICNTL() 2098a21f80fcSHong Zhang 2099a21f80fcSHong Zhang Logically Collective on Mat 2100a21f80fcSHong Zhang 2101a21f80fcSHong Zhang Input Parameters: 2102a21f80fcSHong Zhang + F - the factored matrix obtained by calling MatGetFactor() from PETSc-MUMPS interface 2103a21f80fcSHong Zhang - icntl - index of MUMPS parameter array ICNTL() 2104a21f80fcSHong Zhang 2105a21f80fcSHong Zhang Output Parameter: 2106a21f80fcSHong Zhang . ival - value of MUMPS ICNTL(icntl) 2107a21f80fcSHong Zhang 2108a21f80fcSHong Zhang Level: beginner 2109a21f80fcSHong Zhang 211096a0c994SBarry Smith References: 211196a0c994SBarry Smith . MUMPS Users' Guide 2112a21f80fcSHong Zhang 21139fc87aa7SBarry Smith .seealso: MatGetFactor(), MatMumpsSetICntl(), MatMumpsGetIcntl(), MatMumpsSetCntl(), MatMumpsGetCntl(), MatMumpsGetInfo(), MatMumpsGetInfog(), MatMumpsGetRinfo(), MatMumpsGetRinfog() 2114a21f80fcSHong Zhang @*/ 2115bc6112feSHong Zhang PetscErrorCode MatMumpsGetIcntl(Mat F,PetscInt icntl,PetscInt *ival) 2116bc6112feSHong Zhang { 2117bc6112feSHong Zhang PetscErrorCode ierr; 2118bc6112feSHong Zhang 2119bc6112feSHong Zhang PetscFunctionBegin; 21202989dfd4SHong Zhang PetscValidType(F,1); 21212989dfd4SHong Zhang if (!F->factortype) SETERRQ(PetscObjectComm((PetscObject)F),PETSC_ERR_ARG_WRONGSTATE,"Only for factored matrix"); 2122bc6112feSHong Zhang PetscValidLogicalCollectiveInt(F,icntl,2); 2123bc6112feSHong Zhang PetscValidIntPointer(ival,3); 21242989dfd4SHong Zhang ierr = PetscUseMethod(F,"MatMumpsGetIcntl_C",(Mat,PetscInt,PetscInt*),(F,icntl,ival));CHKERRQ(ierr); 2125bc6112feSHong Zhang PetscFunctionReturn(0); 2126bc6112feSHong Zhang } 2127bc6112feSHong Zhang 21288928b65cSHong Zhang /* -------------------------------------------------------------------------------------------*/ 21298928b65cSHong Zhang PetscErrorCode MatMumpsSetCntl_MUMPS(Mat F,PetscInt icntl,PetscReal val) 21308928b65cSHong Zhang { 2131e69c285eSBarry Smith Mat_MUMPS *mumps =(Mat_MUMPS*)F->data; 21328928b65cSHong Zhang 21338928b65cSHong Zhang PetscFunctionBegin; 21348928b65cSHong Zhang mumps->id.CNTL(icntl) = val; 21358928b65cSHong Zhang PetscFunctionReturn(0); 21368928b65cSHong Zhang } 21378928b65cSHong Zhang 2138bc6112feSHong Zhang PetscErrorCode MatMumpsGetCntl_MUMPS(Mat F,PetscInt icntl,PetscReal *val) 2139bc6112feSHong Zhang { 2140e69c285eSBarry Smith Mat_MUMPS *mumps =(Mat_MUMPS*)F->data; 2141bc6112feSHong Zhang 2142bc6112feSHong Zhang PetscFunctionBegin; 2143bc6112feSHong Zhang *val = mumps->id.CNTL(icntl); 2144bc6112feSHong Zhang PetscFunctionReturn(0); 2145bc6112feSHong Zhang } 2146bc6112feSHong Zhang 21478928b65cSHong Zhang /*@ 21488928b65cSHong Zhang MatMumpsSetCntl - Set MUMPS parameter CNTL() 21498928b65cSHong Zhang 21508928b65cSHong Zhang Logically Collective on Mat 21518928b65cSHong Zhang 21528928b65cSHong Zhang Input Parameters: 21538928b65cSHong Zhang + F - the factored matrix obtained by calling MatGetFactor() from PETSc-MUMPS interface 21548928b65cSHong Zhang . icntl - index of MUMPS parameter array CNTL() 21558928b65cSHong Zhang - val - value of MUMPS CNTL(icntl) 21568928b65cSHong Zhang 21578928b65cSHong Zhang Options Database: 21588928b65cSHong Zhang . -mat_mumps_cntl_<icntl> <val> 21598928b65cSHong Zhang 21608928b65cSHong Zhang Level: beginner 21618928b65cSHong Zhang 216296a0c994SBarry Smith References: 216396a0c994SBarry Smith . MUMPS Users' Guide 21648928b65cSHong Zhang 21659fc87aa7SBarry Smith .seealso: MatGetFactor(), MatMumpsSetICntl(), MatMumpsGetIcntl(), MatMumpsSetCntl(), MatMumpsGetCntl(), MatMumpsGetInfo(), MatMumpsGetInfog(), MatMumpsGetRinfo(), MatMumpsGetRinfog() 21668928b65cSHong Zhang @*/ 21678928b65cSHong Zhang PetscErrorCode MatMumpsSetCntl(Mat F,PetscInt icntl,PetscReal val) 21688928b65cSHong Zhang { 21698928b65cSHong Zhang PetscErrorCode ierr; 21708928b65cSHong Zhang 21718928b65cSHong Zhang PetscFunctionBegin; 21722989dfd4SHong Zhang PetscValidType(F,1); 21732989dfd4SHong Zhang if (!F->factortype) SETERRQ(PetscObjectComm((PetscObject)F),PETSC_ERR_ARG_WRONGSTATE,"Only for factored matrix"); 21748928b65cSHong Zhang PetscValidLogicalCollectiveInt(F,icntl,2); 2175bc6112feSHong Zhang PetscValidLogicalCollectiveReal(F,val,3); 21768928b65cSHong Zhang ierr = PetscTryMethod(F,"MatMumpsSetCntl_C",(Mat,PetscInt,PetscReal),(F,icntl,val));CHKERRQ(ierr); 21778928b65cSHong Zhang PetscFunctionReturn(0); 21788928b65cSHong Zhang } 21798928b65cSHong Zhang 2180a21f80fcSHong Zhang /*@ 2181a21f80fcSHong Zhang MatMumpsGetCntl - Get MUMPS parameter CNTL() 2182a21f80fcSHong Zhang 2183a21f80fcSHong Zhang Logically Collective on Mat 2184a21f80fcSHong Zhang 2185a21f80fcSHong Zhang Input Parameters: 2186a21f80fcSHong Zhang + F - the factored matrix obtained by calling MatGetFactor() from PETSc-MUMPS interface 2187a21f80fcSHong Zhang - icntl - index of MUMPS parameter array CNTL() 2188a21f80fcSHong Zhang 2189a21f80fcSHong Zhang Output Parameter: 2190a21f80fcSHong Zhang . val - value of MUMPS CNTL(icntl) 2191a21f80fcSHong Zhang 2192a21f80fcSHong Zhang Level: beginner 2193a21f80fcSHong Zhang 219496a0c994SBarry Smith References: 219596a0c994SBarry Smith . MUMPS Users' Guide 2196a21f80fcSHong Zhang 21979fc87aa7SBarry Smith .seealso: MatGetFactor(), MatMumpsSetICntl(), MatMumpsGetIcntl(), MatMumpsSetCntl(), MatMumpsGetCntl(), MatMumpsGetInfo(), MatMumpsGetInfog(), MatMumpsGetRinfo(), MatMumpsGetRinfog() 2198a21f80fcSHong Zhang @*/ 2199bc6112feSHong Zhang PetscErrorCode MatMumpsGetCntl(Mat F,PetscInt icntl,PetscReal *val) 2200bc6112feSHong Zhang { 2201bc6112feSHong Zhang PetscErrorCode ierr; 2202bc6112feSHong Zhang 2203bc6112feSHong Zhang PetscFunctionBegin; 22042989dfd4SHong Zhang PetscValidType(F,1); 22052989dfd4SHong Zhang if (!F->factortype) SETERRQ(PetscObjectComm((PetscObject)F),PETSC_ERR_ARG_WRONGSTATE,"Only for factored matrix"); 2206bc6112feSHong Zhang PetscValidLogicalCollectiveInt(F,icntl,2); 2207bc6112feSHong Zhang PetscValidRealPointer(val,3); 22082989dfd4SHong Zhang ierr = PetscUseMethod(F,"MatMumpsGetCntl_C",(Mat,PetscInt,PetscReal*),(F,icntl,val));CHKERRQ(ierr); 2209bc6112feSHong Zhang PetscFunctionReturn(0); 2210bc6112feSHong Zhang } 2211bc6112feSHong Zhang 2212ca810319SHong Zhang PetscErrorCode MatMumpsGetInfo_MUMPS(Mat F,PetscInt icntl,PetscInt *info) 2213bc6112feSHong Zhang { 2214e69c285eSBarry Smith Mat_MUMPS *mumps =(Mat_MUMPS*)F->data; 2215bc6112feSHong Zhang 2216bc6112feSHong Zhang PetscFunctionBegin; 2217bc6112feSHong Zhang *info = mumps->id.INFO(icntl); 2218bc6112feSHong Zhang PetscFunctionReturn(0); 2219bc6112feSHong Zhang } 2220bc6112feSHong Zhang 2221ca810319SHong Zhang PetscErrorCode MatMumpsGetInfog_MUMPS(Mat F,PetscInt icntl,PetscInt *infog) 2222bc6112feSHong Zhang { 2223e69c285eSBarry Smith Mat_MUMPS *mumps =(Mat_MUMPS*)F->data; 2224bc6112feSHong Zhang 2225bc6112feSHong Zhang PetscFunctionBegin; 2226bc6112feSHong Zhang *infog = mumps->id.INFOG(icntl); 2227bc6112feSHong Zhang PetscFunctionReturn(0); 2228bc6112feSHong Zhang } 2229bc6112feSHong Zhang 2230ca810319SHong Zhang PetscErrorCode MatMumpsGetRinfo_MUMPS(Mat F,PetscInt icntl,PetscReal *rinfo) 2231bc6112feSHong Zhang { 2232e69c285eSBarry Smith Mat_MUMPS *mumps =(Mat_MUMPS*)F->data; 2233bc6112feSHong Zhang 2234bc6112feSHong Zhang PetscFunctionBegin; 2235bc6112feSHong Zhang *rinfo = mumps->id.RINFO(icntl); 2236bc6112feSHong Zhang PetscFunctionReturn(0); 2237bc6112feSHong Zhang } 2238bc6112feSHong Zhang 2239ca810319SHong Zhang PetscErrorCode MatMumpsGetRinfog_MUMPS(Mat F,PetscInt icntl,PetscReal *rinfog) 2240bc6112feSHong Zhang { 2241e69c285eSBarry Smith Mat_MUMPS *mumps =(Mat_MUMPS*)F->data; 2242bc6112feSHong Zhang 2243bc6112feSHong Zhang PetscFunctionBegin; 2244bc6112feSHong Zhang *rinfog = mumps->id.RINFOG(icntl); 2245bc6112feSHong Zhang PetscFunctionReturn(0); 2246bc6112feSHong Zhang } 2247bc6112feSHong Zhang 224889a9c03aSHong Zhang PetscErrorCode MatMumpsGetInverse_MUMPS(Mat F,Mat spRHS) 2249bb599dfdSHong Zhang { 2250bb599dfdSHong Zhang PetscErrorCode ierr; 22510e6b8875SHong Zhang Mat Bt = NULL,Btseq = NULL; 22520e6b8875SHong Zhang PetscBool flg; 2253bb599dfdSHong Zhang Mat_MUMPS *mumps =(Mat_MUMPS*)F->data; 2254bb599dfdSHong Zhang PetscScalar *aa; 2255bb599dfdSHong Zhang PetscInt spnr,*ia,*ja; 2256bb599dfdSHong Zhang 2257bb599dfdSHong Zhang PetscFunctionBegin; 2258e3f2db6aSHong Zhang PetscValidIntPointer(spRHS,2); 22590e6b8875SHong Zhang ierr = PetscObjectTypeCompare((PetscObject)spRHS,MATTRANSPOSEMAT,&flg);CHKERRQ(ierr); 22600e6b8875SHong Zhang if (flg) { 2261bb599dfdSHong Zhang ierr = MatTransposeGetMat(spRHS,&Bt);CHKERRQ(ierr); 22620e6b8875SHong Zhang } else SETERRQ(PetscObjectComm((PetscObject)spRHS),PETSC_ERR_ARG_WRONG,"Matrix spRHS must be type MATTRANSPOSEMAT matrix"); 2263bb599dfdSHong Zhang 2264bb599dfdSHong Zhang ierr = MatMumpsSetIcntl(F,30,1);CHKERRQ(ierr); 2265bb599dfdSHong Zhang 22662d4298aeSJunchao Zhang if (mumps->petsc_size > 1) { 22670e6b8875SHong Zhang Mat_MPIAIJ *b = (Mat_MPIAIJ*)Bt->data; 22680e6b8875SHong Zhang Btseq = b->A; 22690e6b8875SHong Zhang } else { 22700e6b8875SHong Zhang Btseq = Bt; 22710e6b8875SHong Zhang } 22720e6b8875SHong Zhang 2273e3f2db6aSHong Zhang if (!mumps->myid) { 22740e6b8875SHong Zhang ierr = MatSeqAIJGetArray(Btseq,&aa);CHKERRQ(ierr); 22750e6b8875SHong Zhang ierr = MatGetRowIJ(Btseq,1,PETSC_FALSE,PETSC_FALSE,&spnr,(const PetscInt**)&ia,(const PetscInt**)&ja,&flg);CHKERRQ(ierr); 22760e6b8875SHong Zhang if (!flg) SETERRQ(PETSC_COMM_SELF,PETSC_ERR_ARG_WRONG,"Cannot get IJ structure"); 2277bb599dfdSHong Zhang 2278bb599dfdSHong Zhang mumps->id.irhs_ptr = ia; 2279bb599dfdSHong Zhang mumps->id.irhs_sparse = ja; 2280bb599dfdSHong Zhang mumps->id.nz_rhs = ia[spnr] - 1; 2281bb599dfdSHong Zhang mumps->id.rhs_sparse = (MumpsScalar*)aa; 2282e3f2db6aSHong Zhang } else { 2283e3f2db6aSHong Zhang mumps->id.irhs_ptr = NULL; 2284e3f2db6aSHong Zhang mumps->id.irhs_sparse = NULL; 2285e3f2db6aSHong Zhang mumps->id.nz_rhs = 0; 2286e3f2db6aSHong Zhang mumps->id.rhs_sparse = NULL; 2287e3f2db6aSHong Zhang } 2288bb599dfdSHong Zhang mumps->id.ICNTL(20) = 1; /* rhs is sparse */ 2289e3f2db6aSHong Zhang mumps->id.ICNTL(21) = 0; /* solution is in assembled centralized format */ 2290bb599dfdSHong Zhang 2291bb599dfdSHong Zhang /* solve phase */ 2292bb599dfdSHong Zhang /*-------------*/ 2293bb599dfdSHong Zhang mumps->id.job = JOB_SOLVE; 22943ab56b82SJunchao Zhang PetscMUMPS_c(mumps); 2295e3f2db6aSHong Zhang if (mumps->id.INFOG(1) < 0) 2296e3f2db6aSHong Zhang SETERRQ2(PETSC_COMM_SELF,PETSC_ERR_LIB,"Error reported by MUMPS in solve phase: INFOG(1)=%d INFO(2)=%d\n",mumps->id.INFOG(1),mumps->id.INFO(2)); 229714267174SHong Zhang 2298e3f2db6aSHong Zhang if (!mumps->myid) { 22990e6b8875SHong Zhang ierr = MatSeqAIJRestoreArray(Btseq,&aa);CHKERRQ(ierr); 23000e6b8875SHong Zhang ierr = MatRestoreRowIJ(Btseq,1,PETSC_FALSE,PETSC_FALSE,&spnr,(const PetscInt**)&ia,(const PetscInt**)&ja,&flg);CHKERRQ(ierr); 23010e6b8875SHong Zhang if (!flg) SETERRQ(PETSC_COMM_SELF,PETSC_ERR_ARG_WRONG,"Cannot get IJ structure"); 2302e3f2db6aSHong Zhang } 2303bb599dfdSHong Zhang PetscFunctionReturn(0); 2304bb599dfdSHong Zhang } 2305bb599dfdSHong Zhang 2306bb599dfdSHong Zhang /*@ 230789a9c03aSHong Zhang MatMumpsGetInverse - Get user-specified set of entries in inverse of A 2308bb599dfdSHong Zhang 2309bb599dfdSHong Zhang Logically Collective on Mat 2310bb599dfdSHong Zhang 2311bb599dfdSHong Zhang Input Parameters: 2312bb599dfdSHong Zhang + F - the factored matrix obtained by calling MatGetFactor() from PETSc-MUMPS interface 2313e3f2db6aSHong Zhang - spRHS - sequential sparse matrix in MATTRANSPOSEMAT format holding specified indices in processor[0] 2314bb599dfdSHong Zhang 2315bb599dfdSHong Zhang Output Parameter: 2316e3f2db6aSHong Zhang . spRHS - requested entries of inverse of A 2317bb599dfdSHong Zhang 2318bb599dfdSHong Zhang Level: beginner 2319bb599dfdSHong Zhang 2320bb599dfdSHong Zhang References: 2321bb599dfdSHong Zhang . MUMPS Users' Guide 2322bb599dfdSHong Zhang 2323bb599dfdSHong Zhang .seealso: MatGetFactor(), MatCreateTranspose() 2324bb599dfdSHong Zhang @*/ 232589a9c03aSHong Zhang PetscErrorCode MatMumpsGetInverse(Mat F,Mat spRHS) 2326bb599dfdSHong Zhang { 2327bb599dfdSHong Zhang PetscErrorCode ierr; 2328bb599dfdSHong Zhang 2329bb599dfdSHong Zhang PetscFunctionBegin; 2330bb599dfdSHong Zhang PetscValidType(F,1); 2331bb599dfdSHong Zhang if (!F->factortype) SETERRQ(PetscObjectComm((PetscObject)F),PETSC_ERR_ARG_WRONGSTATE,"Only for factored matrix"); 233289a9c03aSHong Zhang ierr = PetscUseMethod(F,"MatMumpsGetInverse_C",(Mat,Mat),(F,spRHS));CHKERRQ(ierr); 2333bb599dfdSHong Zhang PetscFunctionReturn(0); 2334bb599dfdSHong Zhang } 2335bb599dfdSHong Zhang 23360e6b8875SHong Zhang PetscErrorCode MatMumpsGetInverseTranspose_MUMPS(Mat F,Mat spRHST) 23370e6b8875SHong Zhang { 23380e6b8875SHong Zhang PetscErrorCode ierr; 23390e6b8875SHong Zhang Mat spRHS; 23400e6b8875SHong Zhang 23410e6b8875SHong Zhang PetscFunctionBegin; 23420e6b8875SHong Zhang ierr = MatCreateTranspose(spRHST,&spRHS);CHKERRQ(ierr); 23430e6b8875SHong Zhang ierr = MatMumpsGetInverse_MUMPS(F,spRHS);CHKERRQ(ierr); 23440e6b8875SHong Zhang ierr = MatDestroy(&spRHS);CHKERRQ(ierr); 23450e6b8875SHong Zhang PetscFunctionReturn(0); 23460e6b8875SHong Zhang } 23470e6b8875SHong Zhang 23480e6b8875SHong Zhang /*@ 2349eef1237cSHong Zhang MatMumpsGetInverseTranspose - Get user-specified set of entries in inverse of matrix A^T 23500e6b8875SHong Zhang 23510e6b8875SHong Zhang Logically Collective on Mat 23520e6b8875SHong Zhang 23530e6b8875SHong Zhang Input Parameters: 23540e6b8875SHong Zhang + F - the factored matrix of A obtained by calling MatGetFactor() from PETSc-MUMPS interface 23550e6b8875SHong Zhang - spRHST - sequential sparse matrix in MATAIJ format holding specified indices of A^T in processor[0] 23560e6b8875SHong Zhang 23570e6b8875SHong Zhang Output Parameter: 23580e6b8875SHong Zhang . spRHST - requested entries of inverse of A^T 23590e6b8875SHong Zhang 23600e6b8875SHong Zhang Level: beginner 23610e6b8875SHong Zhang 23620e6b8875SHong Zhang References: 23630e6b8875SHong Zhang . MUMPS Users' Guide 23640e6b8875SHong Zhang 23650e6b8875SHong Zhang .seealso: MatGetFactor(), MatCreateTranspose(), MatMumpsGetInverse() 23660e6b8875SHong Zhang @*/ 23670e6b8875SHong Zhang PetscErrorCode MatMumpsGetInverseTranspose(Mat F,Mat spRHST) 23680e6b8875SHong Zhang { 23690e6b8875SHong Zhang PetscErrorCode ierr; 23700e6b8875SHong Zhang PetscBool flg; 23710e6b8875SHong Zhang 23720e6b8875SHong Zhang PetscFunctionBegin; 23730e6b8875SHong Zhang PetscValidType(F,1); 23740e6b8875SHong Zhang if (!F->factortype) SETERRQ(PetscObjectComm((PetscObject)F),PETSC_ERR_ARG_WRONGSTATE,"Only for factored matrix"); 23750e6b8875SHong Zhang ierr = PetscObjectTypeCompareAny((PetscObject)spRHST,&flg,MATSEQAIJ,MATMPIAIJ,NULL);CHKERRQ(ierr); 23760e6b8875SHong Zhang if (!flg) SETERRQ(PetscObjectComm((PetscObject)spRHST),PETSC_ERR_ARG_WRONG,"Matrix spRHST must be MATAIJ matrix"); 23770e6b8875SHong Zhang 23780e6b8875SHong Zhang ierr = PetscUseMethod(F,"MatMumpsGetInverseTranspose_C",(Mat,Mat),(F,spRHST));CHKERRQ(ierr); 23790e6b8875SHong Zhang PetscFunctionReturn(0); 23800e6b8875SHong Zhang } 23810e6b8875SHong Zhang 2382a21f80fcSHong Zhang /*@ 2383a21f80fcSHong Zhang MatMumpsGetInfo - Get MUMPS parameter INFO() 2384a21f80fcSHong Zhang 2385a21f80fcSHong Zhang Logically Collective on Mat 2386a21f80fcSHong Zhang 2387a21f80fcSHong Zhang Input Parameters: 2388a21f80fcSHong Zhang + F - the factored matrix obtained by calling MatGetFactor() from PETSc-MUMPS interface 2389a21f80fcSHong Zhang - icntl - index of MUMPS parameter array INFO() 2390a21f80fcSHong Zhang 2391a21f80fcSHong Zhang Output Parameter: 2392a21f80fcSHong Zhang . ival - value of MUMPS INFO(icntl) 2393a21f80fcSHong Zhang 2394a21f80fcSHong Zhang Level: beginner 2395a21f80fcSHong Zhang 239696a0c994SBarry Smith References: 239796a0c994SBarry Smith . MUMPS Users' Guide 2398a21f80fcSHong Zhang 23999fc87aa7SBarry Smith .seealso: MatGetFactor(), MatMumpsSetICntl(), MatMumpsGetIcntl(), MatMumpsSetCntl(), MatMumpsGetCntl(), MatMumpsGetInfo(), MatMumpsGetInfog(), MatMumpsGetRinfo(), MatMumpsGetRinfog() 2400a21f80fcSHong Zhang @*/ 2401ca810319SHong Zhang PetscErrorCode MatMumpsGetInfo(Mat F,PetscInt icntl,PetscInt *ival) 2402bc6112feSHong Zhang { 2403bc6112feSHong Zhang PetscErrorCode ierr; 2404bc6112feSHong Zhang 2405bc6112feSHong Zhang PetscFunctionBegin; 24062989dfd4SHong Zhang PetscValidType(F,1); 24072989dfd4SHong Zhang if (!F->factortype) SETERRQ(PetscObjectComm((PetscObject)F),PETSC_ERR_ARG_WRONGSTATE,"Only for factored matrix"); 2408ca810319SHong Zhang PetscValidIntPointer(ival,3); 24092989dfd4SHong Zhang ierr = PetscUseMethod(F,"MatMumpsGetInfo_C",(Mat,PetscInt,PetscInt*),(F,icntl,ival));CHKERRQ(ierr); 2410bc6112feSHong Zhang PetscFunctionReturn(0); 2411bc6112feSHong Zhang } 2412bc6112feSHong Zhang 2413a21f80fcSHong Zhang /*@ 2414a21f80fcSHong Zhang MatMumpsGetInfog - Get MUMPS parameter INFOG() 2415a21f80fcSHong Zhang 2416a21f80fcSHong Zhang Logically Collective on Mat 2417a21f80fcSHong Zhang 2418a21f80fcSHong Zhang Input Parameters: 2419a21f80fcSHong Zhang + F - the factored matrix obtained by calling MatGetFactor() from PETSc-MUMPS interface 2420a21f80fcSHong Zhang - icntl - index of MUMPS parameter array INFOG() 2421a21f80fcSHong Zhang 2422a21f80fcSHong Zhang Output Parameter: 2423a21f80fcSHong Zhang . ival - value of MUMPS INFOG(icntl) 2424a21f80fcSHong Zhang 2425a21f80fcSHong Zhang Level: beginner 2426a21f80fcSHong Zhang 242796a0c994SBarry Smith References: 242896a0c994SBarry Smith . MUMPS Users' Guide 2429a21f80fcSHong Zhang 24309fc87aa7SBarry Smith .seealso: MatGetFactor(), MatMumpsSetICntl(), MatMumpsGetIcntl(), MatMumpsSetCntl(), MatMumpsGetCntl(), MatMumpsGetInfo(), MatMumpsGetInfog(), MatMumpsGetRinfo(), MatMumpsGetRinfog() 2431a21f80fcSHong Zhang @*/ 2432ca810319SHong Zhang PetscErrorCode MatMumpsGetInfog(Mat F,PetscInt icntl,PetscInt *ival) 2433bc6112feSHong Zhang { 2434bc6112feSHong Zhang PetscErrorCode ierr; 2435bc6112feSHong Zhang 2436bc6112feSHong Zhang PetscFunctionBegin; 24372989dfd4SHong Zhang PetscValidType(F,1); 24382989dfd4SHong Zhang if (!F->factortype) SETERRQ(PetscObjectComm((PetscObject)F),PETSC_ERR_ARG_WRONGSTATE,"Only for factored matrix"); 2439ca810319SHong Zhang PetscValidIntPointer(ival,3); 24402989dfd4SHong Zhang ierr = PetscUseMethod(F,"MatMumpsGetInfog_C",(Mat,PetscInt,PetscInt*),(F,icntl,ival));CHKERRQ(ierr); 2441bc6112feSHong Zhang PetscFunctionReturn(0); 2442bc6112feSHong Zhang } 2443bc6112feSHong Zhang 2444a21f80fcSHong Zhang /*@ 2445a21f80fcSHong Zhang MatMumpsGetRinfo - Get MUMPS parameter RINFO() 2446a21f80fcSHong Zhang 2447a21f80fcSHong Zhang Logically Collective on Mat 2448a21f80fcSHong Zhang 2449a21f80fcSHong Zhang Input Parameters: 2450a21f80fcSHong Zhang + F - the factored matrix obtained by calling MatGetFactor() from PETSc-MUMPS interface 2451a21f80fcSHong Zhang - icntl - index of MUMPS parameter array RINFO() 2452a21f80fcSHong Zhang 2453a21f80fcSHong Zhang Output Parameter: 2454a21f80fcSHong Zhang . val - value of MUMPS RINFO(icntl) 2455a21f80fcSHong Zhang 2456a21f80fcSHong Zhang Level: beginner 2457a21f80fcSHong Zhang 245896a0c994SBarry Smith References: 245996a0c994SBarry Smith . MUMPS Users' Guide 2460a21f80fcSHong Zhang 24619fc87aa7SBarry Smith .seealso: MatGetFactor(), MatMumpsSetICntl(), MatMumpsGetIcntl(), MatMumpsSetCntl(), MatMumpsGetCntl(), MatMumpsGetInfo(), MatMumpsGetInfog(), MatMumpsGetRinfo(), MatMumpsGetRinfog() 2462a21f80fcSHong Zhang @*/ 2463ca810319SHong Zhang PetscErrorCode MatMumpsGetRinfo(Mat F,PetscInt icntl,PetscReal *val) 2464bc6112feSHong Zhang { 2465bc6112feSHong Zhang PetscErrorCode ierr; 2466bc6112feSHong Zhang 2467bc6112feSHong Zhang PetscFunctionBegin; 24682989dfd4SHong Zhang PetscValidType(F,1); 24692989dfd4SHong Zhang if (!F->factortype) SETERRQ(PetscObjectComm((PetscObject)F),PETSC_ERR_ARG_WRONGSTATE,"Only for factored matrix"); 2470bc6112feSHong Zhang PetscValidRealPointer(val,3); 24712989dfd4SHong Zhang ierr = PetscUseMethod(F,"MatMumpsGetRinfo_C",(Mat,PetscInt,PetscReal*),(F,icntl,val));CHKERRQ(ierr); 2472bc6112feSHong Zhang PetscFunctionReturn(0); 2473bc6112feSHong Zhang } 2474bc6112feSHong Zhang 2475a21f80fcSHong Zhang /*@ 2476a21f80fcSHong Zhang MatMumpsGetRinfog - Get MUMPS parameter RINFOG() 2477a21f80fcSHong Zhang 2478a21f80fcSHong Zhang Logically Collective on Mat 2479a21f80fcSHong Zhang 2480a21f80fcSHong Zhang Input Parameters: 2481a21f80fcSHong Zhang + F - the factored matrix obtained by calling MatGetFactor() from PETSc-MUMPS interface 2482a21f80fcSHong Zhang - icntl - index of MUMPS parameter array RINFOG() 2483a21f80fcSHong Zhang 2484a21f80fcSHong Zhang Output Parameter: 2485a21f80fcSHong Zhang . val - value of MUMPS RINFOG(icntl) 2486a21f80fcSHong Zhang 2487a21f80fcSHong Zhang Level: beginner 2488a21f80fcSHong Zhang 248996a0c994SBarry Smith References: 249096a0c994SBarry Smith . MUMPS Users' Guide 2491a21f80fcSHong Zhang 24929fc87aa7SBarry Smith .seealso: MatGetFactor(), MatMumpsSetICntl(), MatMumpsGetIcntl(), MatMumpsSetCntl(), MatMumpsGetCntl(), MatMumpsGetInfo(), MatMumpsGetInfog(), MatMumpsGetRinfo(), MatMumpsGetRinfog() 2493a21f80fcSHong Zhang @*/ 2494ca810319SHong Zhang PetscErrorCode MatMumpsGetRinfog(Mat F,PetscInt icntl,PetscReal *val) 2495bc6112feSHong Zhang { 2496bc6112feSHong Zhang PetscErrorCode ierr; 2497bc6112feSHong Zhang 2498bc6112feSHong Zhang PetscFunctionBegin; 24992989dfd4SHong Zhang PetscValidType(F,1); 25002989dfd4SHong Zhang if (!F->factortype) SETERRQ(PetscObjectComm((PetscObject)F),PETSC_ERR_ARG_WRONGSTATE,"Only for factored matrix"); 2501bc6112feSHong Zhang PetscValidRealPointer(val,3); 25022989dfd4SHong Zhang ierr = PetscUseMethod(F,"MatMumpsGetRinfog_C",(Mat,PetscInt,PetscReal*),(F,icntl,val));CHKERRQ(ierr); 2503bc6112feSHong Zhang PetscFunctionReturn(0); 2504bc6112feSHong Zhang } 2505bc6112feSHong Zhang 250624b6179bSKris Buschelman /*MC 25072692d6eeSBarry Smith MATSOLVERMUMPS - A matrix type providing direct solvers (LU and Cholesky) for 250824b6179bSKris Buschelman distributed and sequential matrices via the external package MUMPS. 250924b6179bSKris Buschelman 251041c8de11SBarry Smith Works with MATAIJ and MATSBAIJ matrices 251124b6179bSKris Buschelman 2512c2b89b5dSBarry Smith Use ./configure --download-mumps --download-scalapack --download-parmetis --download-metis --download-ptscotch to have PETSc installed with MUMPS 2513c2b89b5dSBarry Smith 2514217d3b1eSJunchao Zhang Use ./configure --with-openmp --download-hwloc (or --with-hwloc) to enable running MUMPS in MPI+OpenMP hybrid mode and non-MUMPS in flat-MPI mode. See details below. 2515217d3b1eSJunchao Zhang 25163ca39a21SBarry Smith Use -pc_type cholesky or lu -pc_factor_mat_solver_type mumps to use this direct solver 2517c2b89b5dSBarry Smith 251824b6179bSKris Buschelman Options Database Keys: 25194422a9fcSPatrick Sanan + -mat_mumps_icntl_1 - ICNTL(1): output stream for error messages 25204422a9fcSPatrick Sanan . -mat_mumps_icntl_2 - ICNTL(2): output stream for diagnostic printing, statistics, and warning 25214422a9fcSPatrick Sanan . -mat_mumps_icntl_3 - ICNTL(3): output stream for global information, collected on the host 25224422a9fcSPatrick Sanan . -mat_mumps_icntl_4 - ICNTL(4): level of printing (0 to 4) 25234422a9fcSPatrick Sanan . -mat_mumps_icntl_6 - ICNTL(6): permutes to a zero-free diagonal and/or scale the matrix (0 to 7) 25244422a9fcSPatrick Sanan . -mat_mumps_icntl_7 - ICNTL(7): computes a symmetric permutation in sequential analysis (0 to 7). 3=Scotch, 4=PORD, 5=Metis 25254422a9fcSPatrick Sanan . -mat_mumps_icntl_8 - ICNTL(8): scaling strategy (-2 to 8 or 77) 25264422a9fcSPatrick Sanan . -mat_mumps_icntl_10 - ICNTL(10): max num of refinements 25274422a9fcSPatrick Sanan . -mat_mumps_icntl_11 - ICNTL(11): statistics related to an error analysis (via -ksp_view) 25284422a9fcSPatrick Sanan . -mat_mumps_icntl_12 - ICNTL(12): an ordering strategy for symmetric matrices (0 to 3) 25294422a9fcSPatrick Sanan . -mat_mumps_icntl_13 - ICNTL(13): parallelism of the root node (enable ScaLAPACK) and its splitting 25304422a9fcSPatrick Sanan . -mat_mumps_icntl_14 - ICNTL(14): percentage increase in the estimated working space 25314422a9fcSPatrick Sanan . -mat_mumps_icntl_19 - ICNTL(19): computes the Schur complement 25324422a9fcSPatrick Sanan . -mat_mumps_icntl_22 - ICNTL(22): in-core/out-of-core factorization and solve (0 or 1) 25334422a9fcSPatrick Sanan . -mat_mumps_icntl_23 - ICNTL(23): max size of the working memory (MB) that can allocate per processor 25344422a9fcSPatrick Sanan . -mat_mumps_icntl_24 - ICNTL(24): detection of null pivot rows (0 or 1) 25354422a9fcSPatrick Sanan . -mat_mumps_icntl_25 - ICNTL(25): compute a solution of a deficient matrix and a null space basis 25364422a9fcSPatrick Sanan . -mat_mumps_icntl_26 - ICNTL(26): drives the solution phase if a Schur complement matrix 25374422a9fcSPatrick Sanan . -mat_mumps_icntl_28 - ICNTL(28): use 1 for sequential analysis and ictnl(7) ordering, or 2 for parallel analysis and ictnl(29) ordering 25384422a9fcSPatrick Sanan . -mat_mumps_icntl_29 - ICNTL(29): parallel ordering 1 = ptscotch, 2 = parmetis 25394422a9fcSPatrick Sanan . -mat_mumps_icntl_30 - ICNTL(30): compute user-specified set of entries in inv(A) 25404422a9fcSPatrick Sanan . -mat_mumps_icntl_31 - ICNTL(31): indicates which factors may be discarded during factorization 25414422a9fcSPatrick Sanan . -mat_mumps_icntl_33 - ICNTL(33): compute determinant 2542a0e18203SThibaut Appel . -mat_mumps_icntl_35 - ICNTL(35): level of activation of BLR (Block Low-Rank) feature 2543a0e18203SThibaut Appel . -mat_mumps_icntl_36 - ICNTL(36): controls the choice of BLR factorization variant 2544a0e18203SThibaut Appel . -mat_mumps_icntl_38 - ICNTL(38): sets the estimated compression rate of LU factors with BLR 25454422a9fcSPatrick Sanan . -mat_mumps_cntl_1 - CNTL(1): relative pivoting threshold 25464422a9fcSPatrick Sanan . -mat_mumps_cntl_2 - CNTL(2): stopping criterion of refinement 25474422a9fcSPatrick Sanan . -mat_mumps_cntl_3 - CNTL(3): absolute pivoting threshold 25484422a9fcSPatrick Sanan . -mat_mumps_cntl_4 - CNTL(4): value for static pivoting 2549217d3b1eSJunchao Zhang . -mat_mumps_cntl_5 - CNTL(5): fixation for null pivots 2550a0e18203SThibaut Appel . -mat_mumps_cntl_7 - CNTL(7): precision of the dropping parameter used during BLR factorization 2551217d3b1eSJunchao Zhang - -mat_mumps_use_omp_threads [m] - run MUMPS in MPI+OpenMP hybrid mode as if omp_set_num_threads(m) is called before calling MUMPS. 2552217d3b1eSJunchao Zhang Default might be the number of cores per CPU package (socket) as reported by hwloc and suggested by the MUMPS manual. 255324b6179bSKris Buschelman 255424b6179bSKris Buschelman Level: beginner 255524b6179bSKris Buschelman 255695452b02SPatrick Sanan Notes: 255738548759SBarry Smith MUMPS Cholesky does not handle (complex) Hermitian matrices http://mumps.enseeiht.fr/doc/userguide_5.2.1.pdf so using it will error if the matrix is Hermitian. 255838548759SBarry Smith 2559c0decd05SBarry Smith When a MUMPS factorization fails inside a KSP solve, for example with a KSP_DIVERGED_PC_FAILED, one can find the MUMPS information about the failure by calling 25609fc87aa7SBarry Smith $ KSPGetPC(ksp,&pc); 25619fc87aa7SBarry Smith $ PCFactorGetMatrix(pc,&mat); 25629fc87aa7SBarry Smith $ MatMumpsGetInfo(mat,....); 25639fc87aa7SBarry Smith $ MatMumpsGetInfog(mat,....); etc. 25649fc87aa7SBarry Smith Or you can run with -ksp_error_if_not_converged and the program will be stopped and the information printed in the error message. 25659fc87aa7SBarry Smith 25668fcaa860SBarry Smith Two modes to run MUMPS/PETSc with OpenMP 25678fcaa860SBarry Smith 25688fcaa860SBarry Smith $ Set OMP_NUM_THREADS and run with fewer MPI ranks than cores. For example, if you want to have 16 OpenMP 25698fcaa860SBarry Smith $ threads per rank, then you may use "export OMP_NUM_THREADS=16 && mpirun -n 4 ./test". 25708fcaa860SBarry Smith 25718fcaa860SBarry Smith $ -mat_mumps_use_omp_threads [m] and run your code with as many MPI ranks as the number of cores. For example, 25728fcaa860SBarry Smith $ if a compute node has 32 cores and you run on two nodes, you may use "mpirun -n 64 ./test -mat_mumps_use_omp_threads 16" 25738fcaa860SBarry Smith 25748fcaa860SBarry Smith To run MUMPS in MPI+OpenMP hybrid mode (i.e., enable multithreading in MUMPS), but still run the non-MUMPS part 2575217d3b1eSJunchao Zhang (i.e., PETSc part) of your code in the so-called flat-MPI (aka pure-MPI) mode, you need to configure PETSc with --with-openmp --download-hwloc 2576217d3b1eSJunchao Zhang (or --with-hwloc), and have an MPI that supports MPI-3.0's process shared memory (which is usually available). Since MUMPS calls BLAS 25778fcaa860SBarry Smith libraries, to really get performance, you should have multithreaded BLAS libraries such as Intel MKL, AMD ACML, Cray libSci or OpenBLAS 25788fcaa860SBarry Smith (PETSc will automatically try to utilized a threaded BLAS if --with-openmp is provided). 2579217d3b1eSJunchao Zhang 25808fcaa860SBarry Smith If you run your code through a job submission system, there are caveats in MPI rank mapping. We use MPI_Comm_split_type() to obtain MPI 2581217d3b1eSJunchao Zhang processes on each compute node. Listing the processes in rank ascending order, we split processes on a node into consecutive groups of 2582217d3b1eSJunchao Zhang size m and create a communicator called omp_comm for each group. Rank 0 in an omp_comm is called the master rank, and others in the omp_comm 2583217d3b1eSJunchao Zhang are called slave ranks (or slaves). Only master ranks are seen to MUMPS and slaves are not. We will free CPUs assigned to slaves (might be set 2584217d3b1eSJunchao Zhang by CPU binding policies in job scripts) and make the CPUs available to the master so that OMP threads spawned by MUMPS can run on the CPUs. 2585217d3b1eSJunchao Zhang In a multi-socket compute node, MPI rank mapping is an issue. Still use the above example and suppose your compute node has two sockets, 2586217d3b1eSJunchao Zhang if you interleave MPI ranks on the two sockets, in other words, even ranks are placed on socket 0, and odd ranks are on socket 1, and bind 2587217d3b1eSJunchao Zhang MPI ranks to cores, then with -mat_mumps_use_omp_threads 16, a master rank (and threads it spawns) will use half cores in socket 0, and half 2588217d3b1eSJunchao Zhang cores in socket 1, that definitely hurts locality. On the other hand, if you map MPI ranks consecutively on the two sockets, then the 2589217d3b1eSJunchao Zhang problem will not happen. Therefore, when you use -mat_mumps_use_omp_threads, you need to keep an eye on your MPI rank mapping and CPU binding. 25908fcaa860SBarry Smith For example, with the Slurm job scheduler, one can use srun --cpu-bind=verbose -m block:block to map consecutive MPI ranks to sockets and 2591217d3b1eSJunchao Zhang examine the mapping result. 2592217d3b1eSJunchao Zhang 2593217d3b1eSJunchao Zhang PETSc does not control thread binding in MUMPS. So to get best performance, one still has to set OMP_PROC_BIND and OMP_PLACES in job scripts, 2594217d3b1eSJunchao Zhang for example, export OMP_PLACES=threads and export OMP_PROC_BIND=spread. One does not need to export OMP_NUM_THREADS=m in job scripts as PETSc 2595217d3b1eSJunchao Zhang calls omp_set_num_threads(m) internally before calling MUMPS. 2596217d3b1eSJunchao Zhang 2597217d3b1eSJunchao Zhang References: 2598217d3b1eSJunchao Zhang + 1. - Heroux, Michael A., R. Brightwell, and Michael M. Wolf. "Bi-modal MPI and MPI+ threads computing on scalable multicore systems." IJHPCA (Submitted) (2011). 2599217d3b1eSJunchao Zhang - 2. - Gutierrez, Samuel K., et al. "Accommodating Thread-Level Heterogeneity in Coupled Parallel Applications." Parallel and Distributed Processing Symposium (IPDPS), 2017 IEEE International. IEEE, 2017. 2600217d3b1eSJunchao Zhang 26013ca39a21SBarry Smith .seealso: PCFactorSetMatSolverType(), MatSolverType, MatMumpsSetICntl(), MatMumpsGetIcntl(), MatMumpsSetCntl(), MatMumpsGetCntl(), MatMumpsGetInfo(), MatMumpsGetInfog(), MatMumpsGetRinfo(), MatMumpsGetRinfog(), KSPGetPC(), PCGetFactor(), PCFactorGetMatrix() 260241c8de11SBarry Smith 260324b6179bSKris Buschelman M*/ 260424b6179bSKris Buschelman 2605ea799195SBarry Smith static PetscErrorCode MatFactorGetSolverType_mumps(Mat A,MatSolverType *type) 260635bd34faSBarry Smith { 260735bd34faSBarry Smith PetscFunctionBegin; 26082692d6eeSBarry Smith *type = MATSOLVERMUMPS; 260935bd34faSBarry Smith PetscFunctionReturn(0); 261035bd34faSBarry Smith } 261135bd34faSBarry Smith 2612bccb9932SShri Abhyankar /* MatGetFactor for Seq and MPI AIJ matrices */ 2613cc2e6a90SBarry Smith static PetscErrorCode MatGetFactor_aij_mumps(Mat A,MatFactorType ftype,Mat *F) 26142877fffaSHong Zhang { 26152877fffaSHong Zhang Mat B; 26162877fffaSHong Zhang PetscErrorCode ierr; 26172877fffaSHong Zhang Mat_MUMPS *mumps; 2618ace3abfcSBarry Smith PetscBool isSeqAIJ; 26192877fffaSHong Zhang 26202877fffaSHong Zhang PetscFunctionBegin; 26212877fffaSHong Zhang /* Create the factorization matrix */ 2622251f4c67SDmitry Karpeev ierr = PetscObjectTypeCompare((PetscObject)A,MATSEQAIJ,&isSeqAIJ);CHKERRQ(ierr); 2623ce94432eSBarry Smith ierr = MatCreate(PetscObjectComm((PetscObject)A),&B);CHKERRQ(ierr); 26242877fffaSHong Zhang ierr = MatSetSizes(B,A->rmap->n,A->cmap->n,A->rmap->N,A->cmap->N);CHKERRQ(ierr); 2625e69c285eSBarry Smith ierr = PetscStrallocpy("mumps",&((PetscObject)B)->type_name);CHKERRQ(ierr); 2626e69c285eSBarry Smith ierr = MatSetUp(B);CHKERRQ(ierr); 26272877fffaSHong Zhang 2628b00a9115SJed Brown ierr = PetscNewLog(B,&mumps);CHKERRQ(ierr); 26292205254eSKarl Rupp 26302877fffaSHong Zhang B->ops->view = MatView_MUMPS; 263135bd34faSBarry Smith B->ops->getinfo = MatGetInfo_MUMPS; 26322205254eSKarl Rupp 26333ca39a21SBarry Smith ierr = PetscObjectComposeFunction((PetscObject)B,"MatFactorGetSolverType_C",MatFactorGetSolverType_mumps);CHKERRQ(ierr); 26345a05ddb0SStefano Zampini ierr = PetscObjectComposeFunction((PetscObject)B,"MatFactorSetSchurIS_C",MatFactorSetSchurIS_MUMPS);CHKERRQ(ierr); 26355a05ddb0SStefano Zampini ierr = PetscObjectComposeFunction((PetscObject)B,"MatFactorCreateSchurComplement_C",MatFactorCreateSchurComplement_MUMPS);CHKERRQ(ierr); 2636bdf89e91SBarry Smith ierr = PetscObjectComposeFunction((PetscObject)B,"MatMumpsSetIcntl_C",MatMumpsSetIcntl_MUMPS);CHKERRQ(ierr); 2637bc6112feSHong Zhang ierr = PetscObjectComposeFunction((PetscObject)B,"MatMumpsGetIcntl_C",MatMumpsGetIcntl_MUMPS);CHKERRQ(ierr); 2638bdf89e91SBarry Smith ierr = PetscObjectComposeFunction((PetscObject)B,"MatMumpsSetCntl_C",MatMumpsSetCntl_MUMPS);CHKERRQ(ierr); 2639bc6112feSHong Zhang ierr = PetscObjectComposeFunction((PetscObject)B,"MatMumpsGetCntl_C",MatMumpsGetCntl_MUMPS);CHKERRQ(ierr); 2640ca810319SHong Zhang ierr = PetscObjectComposeFunction((PetscObject)B,"MatMumpsGetInfo_C",MatMumpsGetInfo_MUMPS);CHKERRQ(ierr); 2641ca810319SHong Zhang ierr = PetscObjectComposeFunction((PetscObject)B,"MatMumpsGetInfog_C",MatMumpsGetInfog_MUMPS);CHKERRQ(ierr); 2642ca810319SHong Zhang ierr = PetscObjectComposeFunction((PetscObject)B,"MatMumpsGetRinfo_C",MatMumpsGetRinfo_MUMPS);CHKERRQ(ierr); 2643ca810319SHong Zhang ierr = PetscObjectComposeFunction((PetscObject)B,"MatMumpsGetRinfog_C",MatMumpsGetRinfog_MUMPS);CHKERRQ(ierr); 264489a9c03aSHong Zhang ierr = PetscObjectComposeFunction((PetscObject)B,"MatMumpsGetInverse_C",MatMumpsGetInverse_MUMPS);CHKERRQ(ierr); 26450e6b8875SHong Zhang ierr = PetscObjectComposeFunction((PetscObject)B,"MatMumpsGetInverseTranspose_C",MatMumpsGetInverseTranspose_MUMPS);CHKERRQ(ierr); 26466444a565SStefano Zampini 2647450b117fSShri Abhyankar if (ftype == MAT_FACTOR_LU) { 2648450b117fSShri Abhyankar B->ops->lufactorsymbolic = MatLUFactorSymbolic_AIJMUMPS; 2649d5f3da31SBarry Smith B->factortype = MAT_FACTOR_LU; 2650bccb9932SShri Abhyankar if (isSeqAIJ) mumps->ConvertToTriples = MatConvertToTriples_seqaij_seqaij; 2651bccb9932SShri Abhyankar else mumps->ConvertToTriples = MatConvertToTriples_mpiaij_mpiaij; 2652746480a1SHong Zhang mumps->sym = 0; 2653dcd589f8SShri Abhyankar } else { 265467877ebaSShri Abhyankar B->ops->choleskyfactorsymbolic = MatCholeskyFactorSymbolic_MUMPS; 2655450b117fSShri Abhyankar B->factortype = MAT_FACTOR_CHOLESKY; 2656bccb9932SShri Abhyankar if (isSeqAIJ) mumps->ConvertToTriples = MatConvertToTriples_seqaij_seqsbaij; 2657bccb9932SShri Abhyankar else mumps->ConvertToTriples = MatConvertToTriples_mpiaij_mpisbaij; 265859ac8732SStefano Zampini #if defined(PETSC_USE_COMPLEX) 265959ac8732SStefano Zampini mumps->sym = 2; 266059ac8732SStefano Zampini #else 26616fdc2a6dSBarry Smith if (A->spd_set && A->spd) mumps->sym = 1; 26626fdc2a6dSBarry Smith else mumps->sym = 2; 266359ac8732SStefano Zampini #endif 2664450b117fSShri Abhyankar } 26652877fffaSHong Zhang 266600c67f3bSHong Zhang /* set solvertype */ 266700c67f3bSHong Zhang ierr = PetscFree(B->solvertype);CHKERRQ(ierr); 266800c67f3bSHong Zhang ierr = PetscStrallocpy(MATSOLVERMUMPS,&B->solvertype);CHKERRQ(ierr); 266900c67f3bSHong Zhang 26702877fffaSHong Zhang B->ops->destroy = MatDestroy_MUMPS; 2671e69c285eSBarry Smith B->data = (void*)mumps; 26722205254eSKarl Rupp 2673f697e70eSHong Zhang ierr = PetscInitializeMUMPS(A,mumps);CHKERRQ(ierr); 2674746480a1SHong Zhang 26752877fffaSHong Zhang *F = B; 26762877fffaSHong Zhang PetscFunctionReturn(0); 26772877fffaSHong Zhang } 26782877fffaSHong Zhang 2679bccb9932SShri Abhyankar /* MatGetFactor for Seq and MPI SBAIJ matrices */ 2680cc2e6a90SBarry Smith static PetscErrorCode MatGetFactor_sbaij_mumps(Mat A,MatFactorType ftype,Mat *F) 26812877fffaSHong Zhang { 26822877fffaSHong Zhang Mat B; 26832877fffaSHong Zhang PetscErrorCode ierr; 26842877fffaSHong Zhang Mat_MUMPS *mumps; 2685ace3abfcSBarry Smith PetscBool isSeqSBAIJ; 26862877fffaSHong Zhang 26872877fffaSHong Zhang PetscFunctionBegin; 2688ce94432eSBarry Smith if (ftype != MAT_FACTOR_CHOLESKY) SETERRQ(PetscObjectComm((PetscObject)A),PETSC_ERR_SUP,"Cannot use PETSc SBAIJ matrices with MUMPS LU, use AIJ matrix"); 2689251f4c67SDmitry Karpeev ierr = PetscObjectTypeCompare((PetscObject)A,MATSEQSBAIJ,&isSeqSBAIJ);CHKERRQ(ierr); 26902877fffaSHong Zhang /* Create the factorization matrix */ 2691ce94432eSBarry Smith ierr = MatCreate(PetscObjectComm((PetscObject)A),&B);CHKERRQ(ierr); 26922877fffaSHong Zhang ierr = MatSetSizes(B,A->rmap->n,A->cmap->n,A->rmap->N,A->cmap->N);CHKERRQ(ierr); 2693e69c285eSBarry Smith ierr = PetscStrallocpy("mumps",&((PetscObject)B)->type_name);CHKERRQ(ierr); 2694e69c285eSBarry Smith ierr = MatSetUp(B);CHKERRQ(ierr); 2695e69c285eSBarry Smith 2696b00a9115SJed Brown ierr = PetscNewLog(B,&mumps);CHKERRQ(ierr); 2697bccb9932SShri Abhyankar if (isSeqSBAIJ) { 269816ebf90aSShri Abhyankar mumps->ConvertToTriples = MatConvertToTriples_seqsbaij_seqsbaij; 2699dcd589f8SShri Abhyankar } else { 2700bccb9932SShri Abhyankar mumps->ConvertToTriples = MatConvertToTriples_mpisbaij_mpisbaij; 2701bccb9932SShri Abhyankar } 2702bccb9932SShri Abhyankar 2703e69c285eSBarry Smith B->ops->getinfo = MatGetInfo_External; 270467877ebaSShri Abhyankar B->ops->choleskyfactorsymbolic = MatCholeskyFactorSymbolic_MUMPS; 2705bccb9932SShri Abhyankar B->ops->view = MatView_MUMPS; 27062205254eSKarl Rupp 27073ca39a21SBarry Smith ierr = PetscObjectComposeFunction((PetscObject)B,"MatFactorGetSolverType_C",MatFactorGetSolverType_mumps);CHKERRQ(ierr); 27085a05ddb0SStefano Zampini ierr = PetscObjectComposeFunction((PetscObject)B,"MatFactorSetSchurIS_C",MatFactorSetSchurIS_MUMPS);CHKERRQ(ierr); 27095a05ddb0SStefano Zampini ierr = PetscObjectComposeFunction((PetscObject)B,"MatFactorCreateSchurComplement_C",MatFactorCreateSchurComplement_MUMPS);CHKERRQ(ierr); 2710b13644aeSHong Zhang ierr = PetscObjectComposeFunction((PetscObject)B,"MatMumpsSetIcntl_C",MatMumpsSetIcntl_MUMPS);CHKERRQ(ierr); 2711b13644aeSHong Zhang ierr = PetscObjectComposeFunction((PetscObject)B,"MatMumpsGetIcntl_C",MatMumpsGetIcntl_MUMPS);CHKERRQ(ierr); 2712b13644aeSHong Zhang ierr = PetscObjectComposeFunction((PetscObject)B,"MatMumpsSetCntl_C",MatMumpsSetCntl_MUMPS);CHKERRQ(ierr); 2713b13644aeSHong Zhang ierr = PetscObjectComposeFunction((PetscObject)B,"MatMumpsGetCntl_C",MatMumpsGetCntl_MUMPS);CHKERRQ(ierr); 2714ca810319SHong Zhang ierr = PetscObjectComposeFunction((PetscObject)B,"MatMumpsGetInfo_C",MatMumpsGetInfo_MUMPS);CHKERRQ(ierr); 2715ca810319SHong Zhang ierr = PetscObjectComposeFunction((PetscObject)B,"MatMumpsGetInfog_C",MatMumpsGetInfog_MUMPS);CHKERRQ(ierr); 2716ca810319SHong Zhang ierr = PetscObjectComposeFunction((PetscObject)B,"MatMumpsGetRinfo_C",MatMumpsGetRinfo_MUMPS);CHKERRQ(ierr); 2717ca810319SHong Zhang ierr = PetscObjectComposeFunction((PetscObject)B,"MatMumpsGetRinfog_C",MatMumpsGetRinfog_MUMPS);CHKERRQ(ierr); 271889a9c03aSHong Zhang ierr = PetscObjectComposeFunction((PetscObject)B,"MatMumpsGetInverse_C",MatMumpsGetInverse_MUMPS);CHKERRQ(ierr); 2719eef1237cSHong Zhang ierr = PetscObjectComposeFunction((PetscObject)B,"MatMumpsGetInverseTranspose_C",MatMumpsGetInverseTranspose_MUMPS);CHKERRQ(ierr); 27202205254eSKarl Rupp 2721f4762488SHong Zhang B->factortype = MAT_FACTOR_CHOLESKY; 272259ac8732SStefano Zampini #if defined(PETSC_USE_COMPLEX) 272359ac8732SStefano Zampini mumps->sym = 2; 272459ac8732SStefano Zampini #else 27256fdc2a6dSBarry Smith if (A->spd_set && A->spd) mumps->sym = 1; 27266fdc2a6dSBarry Smith else mumps->sym = 2; 272759ac8732SStefano Zampini #endif 2728a214ac2aSShri Abhyankar 272900c67f3bSHong Zhang /* set solvertype */ 273000c67f3bSHong Zhang ierr = PetscFree(B->solvertype);CHKERRQ(ierr); 273100c67f3bSHong Zhang ierr = PetscStrallocpy(MATSOLVERMUMPS,&B->solvertype);CHKERRQ(ierr); 273200c67f3bSHong Zhang 2733f3c0ef26SHong Zhang B->ops->destroy = MatDestroy_MUMPS; 2734e69c285eSBarry Smith B->data = (void*)mumps; 27352205254eSKarl Rupp 2736f697e70eSHong Zhang ierr = PetscInitializeMUMPS(A,mumps);CHKERRQ(ierr); 2737746480a1SHong Zhang 27382877fffaSHong Zhang *F = B; 27392877fffaSHong Zhang PetscFunctionReturn(0); 27402877fffaSHong Zhang } 274197969023SHong Zhang 2742cc2e6a90SBarry Smith static PetscErrorCode MatGetFactor_baij_mumps(Mat A,MatFactorType ftype,Mat *F) 274367877ebaSShri Abhyankar { 274467877ebaSShri Abhyankar Mat B; 274567877ebaSShri Abhyankar PetscErrorCode ierr; 274667877ebaSShri Abhyankar Mat_MUMPS *mumps; 2747ace3abfcSBarry Smith PetscBool isSeqBAIJ; 274867877ebaSShri Abhyankar 274967877ebaSShri Abhyankar PetscFunctionBegin; 275067877ebaSShri Abhyankar /* Create the factorization matrix */ 2751251f4c67SDmitry Karpeev ierr = PetscObjectTypeCompare((PetscObject)A,MATSEQBAIJ,&isSeqBAIJ);CHKERRQ(ierr); 2752ce94432eSBarry Smith ierr = MatCreate(PetscObjectComm((PetscObject)A),&B);CHKERRQ(ierr); 275367877ebaSShri Abhyankar ierr = MatSetSizes(B,A->rmap->n,A->cmap->n,A->rmap->N,A->cmap->N);CHKERRQ(ierr); 2754e69c285eSBarry Smith ierr = PetscStrallocpy("mumps",&((PetscObject)B)->type_name);CHKERRQ(ierr); 2755e69c285eSBarry Smith ierr = MatSetUp(B);CHKERRQ(ierr); 2756450b117fSShri Abhyankar 2757b00a9115SJed Brown ierr = PetscNewLog(B,&mumps);CHKERRQ(ierr); 2758450b117fSShri Abhyankar if (ftype == MAT_FACTOR_LU) { 2759450b117fSShri Abhyankar B->ops->lufactorsymbolic = MatLUFactorSymbolic_BAIJMUMPS; 2760450b117fSShri Abhyankar B->factortype = MAT_FACTOR_LU; 2761bccb9932SShri Abhyankar if (isSeqBAIJ) mumps->ConvertToTriples = MatConvertToTriples_seqbaij_seqaij; 2762bccb9932SShri Abhyankar else mumps->ConvertToTriples = MatConvertToTriples_mpibaij_mpiaij; 2763746480a1SHong Zhang mumps->sym = 0; 2764f23aa3ddSBarry Smith } else SETERRQ(PETSC_COMM_SELF,PETSC_ERR_SUP,"Cannot use PETSc BAIJ matrices with MUMPS Cholesky, use SBAIJ or AIJ matrix instead\n"); 2765bccb9932SShri Abhyankar 2766e69c285eSBarry Smith B->ops->getinfo = MatGetInfo_External; 2767450b117fSShri Abhyankar B->ops->view = MatView_MUMPS; 27682205254eSKarl Rupp 27693ca39a21SBarry Smith ierr = PetscObjectComposeFunction((PetscObject)B,"MatFactorGetSolverType_C",MatFactorGetSolverType_mumps);CHKERRQ(ierr); 27705a05ddb0SStefano Zampini ierr = PetscObjectComposeFunction((PetscObject)B,"MatFactorSetSchurIS_C",MatFactorSetSchurIS_MUMPS);CHKERRQ(ierr); 27715a05ddb0SStefano Zampini ierr = PetscObjectComposeFunction((PetscObject)B,"MatFactorCreateSchurComplement_C",MatFactorCreateSchurComplement_MUMPS);CHKERRQ(ierr); 2772bdf89e91SBarry Smith ierr = PetscObjectComposeFunction((PetscObject)B,"MatMumpsSetIcntl_C",MatMumpsSetIcntl_MUMPS);CHKERRQ(ierr); 2773bc6112feSHong Zhang ierr = PetscObjectComposeFunction((PetscObject)B,"MatMumpsGetIcntl_C",MatMumpsGetIcntl_MUMPS);CHKERRQ(ierr); 2774bdf89e91SBarry Smith ierr = PetscObjectComposeFunction((PetscObject)B,"MatMumpsSetCntl_C",MatMumpsSetCntl_MUMPS);CHKERRQ(ierr); 2775bc6112feSHong Zhang ierr = PetscObjectComposeFunction((PetscObject)B,"MatMumpsGetCntl_C",MatMumpsGetCntl_MUMPS);CHKERRQ(ierr); 2776ca810319SHong Zhang ierr = PetscObjectComposeFunction((PetscObject)B,"MatMumpsGetInfo_C",MatMumpsGetInfo_MUMPS);CHKERRQ(ierr); 2777ca810319SHong Zhang ierr = PetscObjectComposeFunction((PetscObject)B,"MatMumpsGetInfog_C",MatMumpsGetInfog_MUMPS);CHKERRQ(ierr); 2778ca810319SHong Zhang ierr = PetscObjectComposeFunction((PetscObject)B,"MatMumpsGetRinfo_C",MatMumpsGetRinfo_MUMPS);CHKERRQ(ierr); 2779ca810319SHong Zhang ierr = PetscObjectComposeFunction((PetscObject)B,"MatMumpsGetRinfog_C",MatMumpsGetRinfog_MUMPS);CHKERRQ(ierr); 278089a9c03aSHong Zhang ierr = PetscObjectComposeFunction((PetscObject)B,"MatMumpsGetInverse_C",MatMumpsGetInverse_MUMPS);CHKERRQ(ierr); 2781eef1237cSHong Zhang ierr = PetscObjectComposeFunction((PetscObject)B,"MatMumpsGetInverseTranspose_C",MatMumpsGetInverseTranspose_MUMPS);CHKERRQ(ierr); 2782450b117fSShri Abhyankar 278300c67f3bSHong Zhang /* set solvertype */ 278400c67f3bSHong Zhang ierr = PetscFree(B->solvertype);CHKERRQ(ierr); 278500c67f3bSHong Zhang ierr = PetscStrallocpy(MATSOLVERMUMPS,&B->solvertype);CHKERRQ(ierr); 278600c67f3bSHong Zhang 27877ee00b23SStefano Zampini B->ops->destroy = MatDestroy_MUMPS; 27887ee00b23SStefano Zampini B->data = (void*)mumps; 27897ee00b23SStefano Zampini 27907ee00b23SStefano Zampini ierr = PetscInitializeMUMPS(A,mumps);CHKERRQ(ierr); 27917ee00b23SStefano Zampini 27927ee00b23SStefano Zampini *F = B; 27937ee00b23SStefano Zampini PetscFunctionReturn(0); 27947ee00b23SStefano Zampini } 27957ee00b23SStefano Zampini 27967ee00b23SStefano Zampini /* MatGetFactor for Seq and MPI SELL matrices */ 27977ee00b23SStefano Zampini static PetscErrorCode MatGetFactor_sell_mumps(Mat A,MatFactorType ftype,Mat *F) 27987ee00b23SStefano Zampini { 27997ee00b23SStefano Zampini Mat B; 28007ee00b23SStefano Zampini PetscErrorCode ierr; 28017ee00b23SStefano Zampini Mat_MUMPS *mumps; 28027ee00b23SStefano Zampini PetscBool isSeqSELL; 28037ee00b23SStefano Zampini 28047ee00b23SStefano Zampini PetscFunctionBegin; 28057ee00b23SStefano Zampini /* Create the factorization matrix */ 28067ee00b23SStefano Zampini ierr = PetscObjectTypeCompare((PetscObject)A,MATSEQSELL,&isSeqSELL);CHKERRQ(ierr); 28077ee00b23SStefano Zampini ierr = MatCreate(PetscObjectComm((PetscObject)A),&B);CHKERRQ(ierr); 28087ee00b23SStefano Zampini ierr = MatSetSizes(B,A->rmap->n,A->cmap->n,A->rmap->N,A->cmap->N);CHKERRQ(ierr); 28097ee00b23SStefano Zampini ierr = PetscStrallocpy("mumps",&((PetscObject)B)->type_name);CHKERRQ(ierr); 28107ee00b23SStefano Zampini ierr = MatSetUp(B);CHKERRQ(ierr); 28117ee00b23SStefano Zampini 28127ee00b23SStefano Zampini ierr = PetscNewLog(B,&mumps);CHKERRQ(ierr); 28137ee00b23SStefano Zampini 28147ee00b23SStefano Zampini B->ops->view = MatView_MUMPS; 28157ee00b23SStefano Zampini B->ops->getinfo = MatGetInfo_MUMPS; 28167ee00b23SStefano Zampini 28177ee00b23SStefano Zampini ierr = PetscObjectComposeFunction((PetscObject)B,"MatFactorGetSolverType_C",MatFactorGetSolverType_mumps);CHKERRQ(ierr); 28187ee00b23SStefano Zampini ierr = PetscObjectComposeFunction((PetscObject)B,"MatFactorSetSchurIS_C",MatFactorSetSchurIS_MUMPS);CHKERRQ(ierr); 28197ee00b23SStefano Zampini ierr = PetscObjectComposeFunction((PetscObject)B,"MatFactorCreateSchurComplement_C",MatFactorCreateSchurComplement_MUMPS);CHKERRQ(ierr); 28207ee00b23SStefano Zampini ierr = PetscObjectComposeFunction((PetscObject)B,"MatMumpsSetIcntl_C",MatMumpsSetIcntl_MUMPS);CHKERRQ(ierr); 28217ee00b23SStefano Zampini ierr = PetscObjectComposeFunction((PetscObject)B,"MatMumpsGetIcntl_C",MatMumpsGetIcntl_MUMPS);CHKERRQ(ierr); 28227ee00b23SStefano Zampini ierr = PetscObjectComposeFunction((PetscObject)B,"MatMumpsSetCntl_C",MatMumpsSetCntl_MUMPS);CHKERRQ(ierr); 28237ee00b23SStefano Zampini ierr = PetscObjectComposeFunction((PetscObject)B,"MatMumpsGetCntl_C",MatMumpsGetCntl_MUMPS);CHKERRQ(ierr); 28247ee00b23SStefano Zampini ierr = PetscObjectComposeFunction((PetscObject)B,"MatMumpsGetInfo_C",MatMumpsGetInfo_MUMPS);CHKERRQ(ierr); 28257ee00b23SStefano Zampini ierr = PetscObjectComposeFunction((PetscObject)B,"MatMumpsGetInfog_C",MatMumpsGetInfog_MUMPS);CHKERRQ(ierr); 28267ee00b23SStefano Zampini ierr = PetscObjectComposeFunction((PetscObject)B,"MatMumpsGetRinfo_C",MatMumpsGetRinfo_MUMPS);CHKERRQ(ierr); 28277ee00b23SStefano Zampini ierr = PetscObjectComposeFunction((PetscObject)B,"MatMumpsGetRinfog_C",MatMumpsGetRinfog_MUMPS);CHKERRQ(ierr); 28287ee00b23SStefano Zampini 28297ee00b23SStefano Zampini if (ftype == MAT_FACTOR_LU) { 28307ee00b23SStefano Zampini B->ops->lufactorsymbolic = MatLUFactorSymbolic_AIJMUMPS; 28317ee00b23SStefano Zampini B->factortype = MAT_FACTOR_LU; 28327ee00b23SStefano Zampini if (isSeqSELL) mumps->ConvertToTriples = MatConvertToTriples_seqsell_seqaij; 28337ee00b23SStefano Zampini else SETERRQ(PetscObjectComm((PetscObject)A),PETSC_ERR_SUP,"To be implemented"); 28347ee00b23SStefano Zampini mumps->sym = 0; 28357ee00b23SStefano Zampini } else SETERRQ(PetscObjectComm((PetscObject)A),PETSC_ERR_SUP,"To be implemented"); 28367ee00b23SStefano Zampini 28377ee00b23SStefano Zampini /* set solvertype */ 28387ee00b23SStefano Zampini ierr = PetscFree(B->solvertype);CHKERRQ(ierr); 28397ee00b23SStefano Zampini ierr = PetscStrallocpy(MATSOLVERMUMPS,&B->solvertype);CHKERRQ(ierr); 28407ee00b23SStefano Zampini 2841450b117fSShri Abhyankar B->ops->destroy = MatDestroy_MUMPS; 2842e69c285eSBarry Smith B->data = (void*)mumps; 28432205254eSKarl Rupp 2844f697e70eSHong Zhang ierr = PetscInitializeMUMPS(A,mumps);CHKERRQ(ierr); 2845746480a1SHong Zhang 2846450b117fSShri Abhyankar *F = B; 2847450b117fSShri Abhyankar PetscFunctionReturn(0); 2848450b117fSShri Abhyankar } 284942c9c57cSBarry Smith 28503ca39a21SBarry Smith PETSC_EXTERN PetscErrorCode MatSolverTypeRegister_MUMPS(void) 285142c9c57cSBarry Smith { 285242c9c57cSBarry Smith PetscErrorCode ierr; 285342c9c57cSBarry Smith 285442c9c57cSBarry Smith PetscFunctionBegin; 28553ca39a21SBarry Smith ierr = MatSolverTypeRegister(MATSOLVERMUMPS,MATMPIAIJ,MAT_FACTOR_LU,MatGetFactor_aij_mumps);CHKERRQ(ierr); 28563ca39a21SBarry Smith ierr = MatSolverTypeRegister(MATSOLVERMUMPS,MATMPIAIJ,MAT_FACTOR_CHOLESKY,MatGetFactor_aij_mumps);CHKERRQ(ierr); 28573ca39a21SBarry Smith ierr = MatSolverTypeRegister(MATSOLVERMUMPS,MATMPIBAIJ,MAT_FACTOR_LU,MatGetFactor_baij_mumps);CHKERRQ(ierr); 28583ca39a21SBarry Smith ierr = MatSolverTypeRegister(MATSOLVERMUMPS,MATMPIBAIJ,MAT_FACTOR_CHOLESKY,MatGetFactor_baij_mumps);CHKERRQ(ierr); 28593ca39a21SBarry Smith ierr = MatSolverTypeRegister(MATSOLVERMUMPS,MATMPISBAIJ,MAT_FACTOR_CHOLESKY,MatGetFactor_sbaij_mumps);CHKERRQ(ierr); 28603ca39a21SBarry Smith ierr = MatSolverTypeRegister(MATSOLVERMUMPS,MATSEQAIJ,MAT_FACTOR_LU,MatGetFactor_aij_mumps);CHKERRQ(ierr); 28613ca39a21SBarry Smith ierr = MatSolverTypeRegister(MATSOLVERMUMPS,MATSEQAIJ,MAT_FACTOR_CHOLESKY,MatGetFactor_aij_mumps);CHKERRQ(ierr); 28623ca39a21SBarry Smith ierr = MatSolverTypeRegister(MATSOLVERMUMPS,MATSEQBAIJ,MAT_FACTOR_LU,MatGetFactor_baij_mumps);CHKERRQ(ierr); 28633ca39a21SBarry Smith ierr = MatSolverTypeRegister(MATSOLVERMUMPS,MATSEQBAIJ,MAT_FACTOR_CHOLESKY,MatGetFactor_baij_mumps);CHKERRQ(ierr); 28643ca39a21SBarry Smith ierr = MatSolverTypeRegister(MATSOLVERMUMPS,MATSEQSBAIJ,MAT_FACTOR_CHOLESKY,MatGetFactor_sbaij_mumps);CHKERRQ(ierr); 28657ee00b23SStefano Zampini ierr = MatSolverTypeRegister(MATSOLVERMUMPS,MATSEQSELL,MAT_FACTOR_LU,MatGetFactor_sell_mumps);CHKERRQ(ierr); 286642c9c57cSBarry Smith PetscFunctionReturn(0); 286742c9c57cSBarry Smith } 286842c9c57cSBarry Smith 2869