11677d0b8SKris Buschelman /*$Id: umfpack.c,v 1.10 2001/08/15 15:56:50 bsmith Exp $*/ 21677d0b8SKris Buschelman 31677d0b8SKris Buschelman /* 41677d0b8SKris Buschelman Provides an interface to the UMFPACK sparse solver 51677d0b8SKris Buschelman */ 61677d0b8SKris Buschelman 71677d0b8SKris Buschelman #include "src/mat/impls/aij/seq/aij.h" 81677d0b8SKris Buschelman 91677d0b8SKris Buschelman EXTERN_C_BEGIN 101677d0b8SKris Buschelman #include "umfpack.h" 111677d0b8SKris Buschelman EXTERN_C_END 121677d0b8SKris Buschelman 131677d0b8SKris Buschelman typedef struct { 141677d0b8SKris Buschelman void *Symbolic, *Numeric; 151677d0b8SKris Buschelman double Info[UMFPACK_INFO], Control[UMFPACK_CONTROL],*W; 161677d0b8SKris Buschelman int *Wi,*ai,*aj,*perm_c; 171677d0b8SKris Buschelman PetscScalar *av; 181677d0b8SKris Buschelman MatStructure flg; 191677d0b8SKris Buschelman PetscTruth PetscMatOdering; 201677d0b8SKris Buschelman 211677d0b8SKris Buschelman /* A few function pointers for inheritance */ 221677d0b8SKris Buschelman int (*MatView)(Mat,PetscViewer); 231677d0b8SKris Buschelman int (*MatAssemblyEnd)(Mat,MatAssemblyType); 24*d844382dSKris Buschelman int (*MatLUFactorSymbolic)(Mat,IS,IS,MatFactorInfo*,Mat*); 251677d0b8SKris Buschelman int (*MatDestroy)(Mat); 261677d0b8SKris Buschelman 271677d0b8SKris Buschelman /* Flag to clean up UMFPACK objects during Destroy */ 281677d0b8SKris Buschelman PetscTruth CleanUpUMFPACK; 291677d0b8SKris Buschelman } Mat_SeqAIJ_UMFPACK; 30*d844382dSKris Buschelman 31*d844382dSKris Buschelman EXTERN_C_BEGIN 32*d844382dSKris Buschelman #undef __FUNCT__ 33*d844382dSKris Buschelman #define __FUNCT__ "MatConvert_UMFPACK_SeqAIJ" 34*d844382dSKris Buschelman int MatConvert_UMFPACK_SeqAIJ(Mat A,MatType type,Mat *newmat) { 35*d844382dSKris Buschelman /* This routine is only called to convert an unfactored PETSc-UMFPACK matrix */ 36*d844382dSKris Buschelman /* to its base PETSc type, so we will ignore 'MatType type'. */ 37*d844382dSKris Buschelman int ierr; 38*d844382dSKris Buschelman Mat B=*newmat; 39*d844382dSKris Buschelman Mat_SeqAIJ_UMFPACK *lu=(Mat_SeqAIJ_UMFPACK*)A->spptr; 40*d844382dSKris Buschelman 41*d844382dSKris Buschelman PetscFunctionBegin; 42*d844382dSKris Buschelman if (B != A) { 43*d844382dSKris Buschelman /* This routine was inherited from SeqAIJ. */ 44*d844382dSKris Buschelman ierr = MatDuplicate(A,MAT_COPY_VALUES,&B);CHKERRQ(ierr); 45*d844382dSKris Buschelman } else { 46*d844382dSKris Buschelman /* Reset the original function pointers */ 47*d844382dSKris Buschelman A->ops->view = lu->MatView; 48*d844382dSKris Buschelman A->ops->assemblyend = lu->MatAssemblyEnd; 49*d844382dSKris Buschelman A->ops->lufactorsymbolic = lu->MatLUFactorSymbolic; 50*d844382dSKris Buschelman A->ops->destroy = lu->MatDestroy; 51*d844382dSKris Buschelman 52*d844382dSKris Buschelman ierr = PetscFree(lu);CHKERRQ(ierr); 53*d844382dSKris Buschelman ierr = PetscObjectChangeTypeName((PetscObject)B,MATSEQAIJ);CHKERRQ(ierr); 54*d844382dSKris Buschelman } 55*d844382dSKris Buschelman *newmat = B; 56*d844382dSKris Buschelman PetscFunctionReturn(0); 57*d844382dSKris Buschelman } 58*d844382dSKris Buschelman EXTERN_C_END 591677d0b8SKris Buschelman 601677d0b8SKris Buschelman #undef __FUNCT__ 611677d0b8SKris Buschelman #define __FUNCT__ "MatDestroy_SeqAIJ_UMFPACK" 621677d0b8SKris Buschelman int MatDestroy_SeqAIJ_UMFPACK(Mat A) 631677d0b8SKris Buschelman { 64*d844382dSKris Buschelman int ierr; 651677d0b8SKris Buschelman Mat_SeqAIJ_UMFPACK *lu = (Mat_SeqAIJ_UMFPACK*)A->spptr; 661677d0b8SKris Buschelman 671677d0b8SKris Buschelman PetscFunctionBegin; 68fb731535SKris Buschelman if (lu->CleanUpUMFPACK) { 691677d0b8SKris Buschelman umfpack_di_free_symbolic(&lu->Symbolic) ; 701677d0b8SKris Buschelman umfpack_di_free_numeric(&lu->Numeric) ; 711677d0b8SKris Buschelman ierr = PetscFree(lu->Wi);CHKERRQ(ierr); 721677d0b8SKris Buschelman ierr = PetscFree(lu->W);CHKERRQ(ierr); 731677d0b8SKris Buschelman 741677d0b8SKris Buschelman if (lu->PetscMatOdering) { 751677d0b8SKris Buschelman ierr = PetscFree(lu->perm_c);CHKERRQ(ierr); 761677d0b8SKris Buschelman } 771677d0b8SKris Buschelman } 78*d844382dSKris Buschelman ierr = MatConvert_UMFPACK_SeqAIJ(A,MATSEQAIJ,&A);CHKERRQ(ierr); 79*d844382dSKris Buschelman ierr = (*A->ops->destroy)(A);CHKERRQ(ierr); 801677d0b8SKris Buschelman PetscFunctionReturn(0); 811677d0b8SKris Buschelman } 821677d0b8SKris Buschelman 831677d0b8SKris Buschelman #undef __FUNCT__ 841677d0b8SKris Buschelman #define __FUNCT__ "MatSolve_SeqAIJ_UMFPACK" 851677d0b8SKris Buschelman int MatSolve_SeqAIJ_UMFPACK(Mat A,Vec b,Vec x) 861677d0b8SKris Buschelman { 871677d0b8SKris Buschelman Mat_SeqAIJ_UMFPACK *lu = (Mat_SeqAIJ_UMFPACK*)A->spptr; 881677d0b8SKris Buschelman PetscScalar *av=lu->av,*ba,*xa; 891677d0b8SKris Buschelman int ierr,*ai=lu->ai,*aj=lu->aj,status; 901677d0b8SKris Buschelman 911677d0b8SKris Buschelman PetscFunctionBegin; 921677d0b8SKris Buschelman /* solve Ax = b by umfpack_di_wsolve */ 931677d0b8SKris Buschelman /* ----------------------------------*/ 941677d0b8SKris Buschelman ierr = VecGetArray(b,&ba); 951677d0b8SKris Buschelman ierr = VecGetArray(x,&xa); 961677d0b8SKris Buschelman 971677d0b8SKris Buschelman status = umfpack_di_wsolve(UMFPACK_At,ai,aj,av,xa,ba,lu->Numeric,lu->Control,lu->Info,lu->Wi,lu->W); 981677d0b8SKris Buschelman umfpack_di_report_info(lu->Control, lu->Info); 991677d0b8SKris Buschelman if (status < 0){ 1001677d0b8SKris Buschelman umfpack_di_report_status(lu->Control, status) ; 1011677d0b8SKris Buschelman SETERRQ(1,"umfpack_di_wsolve failed") ; 1021677d0b8SKris Buschelman } 1031677d0b8SKris Buschelman 1041677d0b8SKris Buschelman ierr = VecRestoreArray(b,&ba); 1051677d0b8SKris Buschelman ierr = VecRestoreArray(x,&xa); 1061677d0b8SKris Buschelman PetscFunctionReturn(0); 1071677d0b8SKris Buschelman } 1081677d0b8SKris Buschelman 1091677d0b8SKris Buschelman #undef __FUNCT__ 1101677d0b8SKris Buschelman #define __FUNCT__ "MatLUFactorNumeric_SeqAIJ_UMFPACK" 1111677d0b8SKris Buschelman int MatLUFactorNumeric_SeqAIJ_UMFPACK(Mat A,Mat *F) 1121677d0b8SKris Buschelman { 1131677d0b8SKris Buschelman Mat_SeqAIJ_UMFPACK *lu = (Mat_SeqAIJ_UMFPACK*)(*F)->spptr; 1141677d0b8SKris Buschelman int *ai=lu->ai,*aj=lu->aj,m=A->m,status,ierr; 1151677d0b8SKris Buschelman PetscScalar *av=lu->av; 1161677d0b8SKris Buschelman 1171677d0b8SKris Buschelman PetscFunctionBegin; 1181677d0b8SKris Buschelman /* numeric factorization of A' */ 1191677d0b8SKris Buschelman /* ----------------------------*/ 1201677d0b8SKris Buschelman status = umfpack_di_numeric (ai,aj,av,lu->Symbolic,&lu->Numeric,lu->Control,lu->Info) ; 1211677d0b8SKris Buschelman if (status < 0) SETERRQ(1,"umfpack_di_numeric failed"); 1221677d0b8SKris Buschelman /* report numeric factorization of A' when Control[PRL] > 3 */ 1231677d0b8SKris Buschelman (void) umfpack_di_report_numeric (lu->Numeric, lu->Control) ; 1241677d0b8SKris Buschelman 1251677d0b8SKris Buschelman if (lu->flg == DIFFERENT_NONZERO_PATTERN){ /* first numeric factorization */ 1261677d0b8SKris Buschelman /* allocate working space to be used by Solve */ 1271677d0b8SKris Buschelman ierr = PetscMalloc(m * sizeof(int), &lu->Wi);CHKERRQ(ierr); 1281677d0b8SKris Buschelman ierr = PetscMalloc(5*m * sizeof(double), &lu->W);CHKERRQ(ierr); 1291677d0b8SKris Buschelman 1301677d0b8SKris Buschelman lu->flg = SAME_NONZERO_PATTERN; 1311677d0b8SKris Buschelman } 1321677d0b8SKris Buschelman 1331677d0b8SKris Buschelman PetscFunctionReturn(0); 1341677d0b8SKris Buschelman } 1351677d0b8SKris Buschelman 1361677d0b8SKris Buschelman /* 1371677d0b8SKris Buschelman Note the r permutation is ignored 1381677d0b8SKris Buschelman */ 1391677d0b8SKris Buschelman #undef __FUNCT__ 1401677d0b8SKris Buschelman #define __FUNCT__ "MatLUFactorSymbolic_SeqAIJ_UMFPACK" 1411677d0b8SKris Buschelman int MatLUFactorSymbolic_SeqAIJ_UMFPACK(Mat A,IS r,IS c,MatFactorInfo *info,Mat *F) 1421677d0b8SKris Buschelman { 143e1b4c3a1SKris Buschelman Mat B; 1441677d0b8SKris Buschelman Mat_SeqAIJ *mat=(Mat_SeqAIJ*)A->data; 1451677d0b8SKris Buschelman Mat_SeqAIJ_UMFPACK *lu; 1461677d0b8SKris Buschelman int ierr,m=A->m,n=A->n,*ai=mat->i,*aj=mat->j,status,*ca; 1471677d0b8SKris Buschelman PetscScalar *av=mat->a; 1481677d0b8SKris Buschelman 1491677d0b8SKris Buschelman PetscFunctionBegin; 1501677d0b8SKris Buschelman /* Create the factorization matrix F */ 151e1b4c3a1SKris Buschelman ierr = MatCreate(A->comm,PETSC_DECIDE,PETSC_DECIDE,m,n,&B);CHKERRQ(ierr); 152e1b4c3a1SKris Buschelman ierr = MatSetType(B,MATUMFPACK);CHKERRQ(ierr); 153e1b4c3a1SKris Buschelman ierr = MatSeqAIJSetPreallocation(B,0,PETSC_NULL);CHKERRQ(ierr); 1541677d0b8SKris Buschelman 155e1b4c3a1SKris Buschelman B->ops->lufactornumeric = MatLUFactorNumeric_SeqAIJ_UMFPACK; 156e1b4c3a1SKris Buschelman B->ops->solve = MatSolve_SeqAIJ_UMFPACK; 157e1b4c3a1SKris Buschelman B->factor = FACTOR_LU; 158e1b4c3a1SKris Buschelman B->assembled = PETSC_TRUE; /* required by -sles_view */ 1591677d0b8SKris Buschelman 160e1b4c3a1SKris Buschelman lu = (Mat_SeqAIJ_UMFPACK*)(B->spptr); 1611677d0b8SKris Buschelman 1621677d0b8SKris Buschelman /* initializations */ 1631677d0b8SKris Buschelman /* ------------------------------------------------*/ 1641677d0b8SKris Buschelman /* get the default control parameters */ 1651677d0b8SKris Buschelman umfpack_di_defaults (lu->Control) ; 1661677d0b8SKris Buschelman lu->perm_c = PETSC_NULL; /* use defaul UMFPACK col permutation */ 1671677d0b8SKris Buschelman 1681677d0b8SKris Buschelman ierr = PetscOptionsBegin(A->comm,A->prefix,"UMFPACK Options","Mat");CHKERRQ(ierr); 1691677d0b8SKris Buschelman /* Control parameters used by reporting routiones */ 1701677d0b8SKris Buschelman ierr = PetscOptionsReal("-mat_umfpack_prl","Control[UMFPACK_PRL]","None",lu->Control[UMFPACK_PRL],&lu->Control[UMFPACK_PRL],PETSC_NULL);CHKERRQ(ierr); 1711677d0b8SKris Buschelman 1721677d0b8SKris Buschelman /* Control parameters for symbolic factorization */ 1731677d0b8SKris Buschelman ierr = PetscOptionsReal("-mat_umfpack_dense_col","Control[UMFPACK_DENSE_COL]","None",lu->Control[UMFPACK_DENSE_COL],&lu->Control[UMFPACK_DENSE_COL],PETSC_NULL);CHKERRQ(ierr); 1741677d0b8SKris Buschelman ierr = PetscOptionsReal("-mat_umfpack_dense_row","Control[UMFPACK_DENSE_ROW]","None",lu->Control[UMFPACK_DENSE_ROW],&lu->Control[UMFPACK_DENSE_ROW],PETSC_NULL);CHKERRQ(ierr); 1751677d0b8SKris Buschelman ierr = PetscOptionsReal("-mat_umfpack_block_size","Control[UMFPACK_BLOCK_SIZE]","None",lu->Control[UMFPACK_BLOCK_SIZE],&lu->Control[UMFPACK_BLOCK_SIZE],PETSC_NULL);CHKERRQ(ierr); 1761677d0b8SKris Buschelman 1771677d0b8SKris Buschelman /* Control parameters used by numeric factorization */ 1781677d0b8SKris Buschelman ierr = PetscOptionsReal("-mat_umfpack_pivot_tolerance","Control[UMFPACK_PIVOT_TOLERANCE]","None",lu->Control[UMFPACK_PIVOT_TOLERANCE],&lu->Control[UMFPACK_PIVOT_TOLERANCE],PETSC_NULL);CHKERRQ(ierr); 1790801d200SKris Buschelman #if !defined(PETSC_HAVE_UMFPACK_41_OR_NEWER) 1801677d0b8SKris Buschelman ierr = PetscOptionsReal("-mat_umfpack_relaxed_amalgamation","Control[UMFPACK_RELAXED_AMALGAMATION]","None",lu->Control[UMFPACK_RELAXED_AMALGAMATION],&lu->Control[UMFPACK_RELAXED_AMALGAMATION],PETSC_NULL);CHKERRQ(ierr); 1811677d0b8SKris Buschelman ierr = PetscOptionsReal("-mat_umfpack_relaxed2_amalgamation","Control[UMFPACK_RELAXED2_AMALGAMATION]","None",lu->Control[UMFPACK_RELAXED2_AMALGAMATION],&lu->Control[UMFPACK_RELAXED2_AMALGAMATION],PETSC_NULL);CHKERRQ(ierr); 1821677d0b8SKris Buschelman ierr = PetscOptionsReal("-mat_umfpack_relaxed3_amalgamation","Control[UMFPACK_RELAXED3_AMALGAMATION]","None",lu->Control[UMFPACK_RELAXED3_AMALGAMATION],&lu->Control[UMFPACK_RELAXED3_AMALGAMATION],PETSC_NULL);CHKERRQ(ierr); 183fb731535SKris Buschelman #endif 1841677d0b8SKris Buschelman ierr = PetscOptionsReal("-mat_umfpack_alloc_init","Control[UMFPACK_ALLOC_INIT]","None",lu->Control[UMFPACK_ALLOC_INIT],&lu->Control[UMFPACK_ALLOC_INIT],PETSC_NULL);CHKERRQ(ierr); 1851677d0b8SKris Buschelman 1861677d0b8SKris Buschelman /* Control parameters used by solve */ 1871677d0b8SKris Buschelman ierr = PetscOptionsReal("-mat_umfpack_irstep","Control[UMFPACK_IRSTEP]","None",lu->Control[UMFPACK_IRSTEP],&lu->Control[UMFPACK_IRSTEP],PETSC_NULL);CHKERRQ(ierr); 1881677d0b8SKris Buschelman 1891677d0b8SKris Buschelman /* use Petsc mat ordering (notice size is for the transpose) */ 1901677d0b8SKris Buschelman ierr = PetscOptionsHasName(PETSC_NULL,"-pc_lu_mat_ordering_type",&lu->PetscMatOdering);CHKERRQ(ierr); 1911677d0b8SKris Buschelman if (lu->PetscMatOdering) { 1921677d0b8SKris Buschelman ierr = ISGetIndices(c,&ca);CHKERRQ(ierr); 1931677d0b8SKris Buschelman ierr = PetscMalloc(A->m*sizeof(int),&lu->perm_c);CHKERRQ(ierr); 1941677d0b8SKris Buschelman ierr = PetscMemcpy(lu->perm_c,ca,A->m*sizeof(int));CHKERRQ(ierr); 1951677d0b8SKris Buschelman ierr = ISRestoreIndices(c,&ca);CHKERRQ(ierr); 1961677d0b8SKris Buschelman } 1971677d0b8SKris Buschelman PetscOptionsEnd(); 1981677d0b8SKris Buschelman 1991677d0b8SKris Buschelman /* print the control parameters */ 2001677d0b8SKris Buschelman if( lu->Control[UMFPACK_PRL] > 1 ) umfpack_di_report_control (lu->Control); 2011677d0b8SKris Buschelman 2021677d0b8SKris Buschelman /* symbolic factorization of A' */ 2031677d0b8SKris Buschelman /* ---------------------------------------------------------------------- */ 2040801d200SKris Buschelman #if defined(PETSC_HAVE_UMFPACK_41_OR_NEWER) 2050801d200SKris Buschelman status = umfpack_di_qsymbolic(n,m,ai,aj,PETSC_NULL,lu->perm_c,&lu->Symbolic,lu->Control,lu->Info) ; 2060801d200SKris Buschelman #else 2071677d0b8SKris Buschelman status = umfpack_di_qsymbolic(n,m,ai,aj,lu->perm_c,&lu->Symbolic,lu->Control,lu->Info) ; 2080801d200SKris Buschelman #endif 2091677d0b8SKris Buschelman if (status < 0){ 2101677d0b8SKris Buschelman umfpack_di_report_info(lu->Control, lu->Info) ; 2111677d0b8SKris Buschelman umfpack_di_report_status(lu->Control, status) ; 2121677d0b8SKris Buschelman SETERRQ(1,"umfpack_di_symbolic failed"); 2131677d0b8SKris Buschelman } 2141677d0b8SKris Buschelman /* report sumbolic factorization of A' when Control[PRL] > 3 */ 2151677d0b8SKris Buschelman (void) umfpack_di_report_symbolic(lu->Symbolic, lu->Control) ; 2161677d0b8SKris Buschelman 2171677d0b8SKris Buschelman lu->flg = DIFFERENT_NONZERO_PATTERN; 2181677d0b8SKris Buschelman lu->ai = ai; 2191677d0b8SKris Buschelman lu->aj = aj; 2201677d0b8SKris Buschelman lu->av = av; 221e1b4c3a1SKris Buschelman lu->CleanUpUMFPACK = PETSC_TRUE; 222e1b4c3a1SKris Buschelman *F = B; 2231677d0b8SKris Buschelman PetscFunctionReturn(0); 2241677d0b8SKris Buschelman } 2251677d0b8SKris Buschelman 2261677d0b8SKris Buschelman #undef __FUNCT__ 227*d844382dSKris Buschelman #define __FUNCT__ "MatAssemblyEnd_SeqAIJ_UMFPACK" 228*d844382dSKris Buschelman int MatAssemblyEnd_SeqAIJ_UMFPACK(Mat A,MatAssemblyType mode) { 229*d844382dSKris Buschelman int ierr; 230*d844382dSKris Buschelman Mat_SeqAIJ_UMFPACK *lu=(Mat_SeqAIJ_UMFPACK*)(A->spptr); 231*d844382dSKris Buschelman 2321677d0b8SKris Buschelman PetscFunctionBegin; 233*d844382dSKris Buschelman ierr = (*lu->MatAssemblyEnd)(A,mode);CHKERRQ(ierr); 234*d844382dSKris Buschelman lu->MatLUFactorSymbolic = A->ops->lufactorsymbolic; 2351677d0b8SKris Buschelman A->ops->lufactorsymbolic = MatLUFactorSymbolic_SeqAIJ_UMFPACK; 2361677d0b8SKris Buschelman PetscFunctionReturn(0); 2371677d0b8SKris Buschelman } 2381677d0b8SKris Buschelman 2391677d0b8SKris Buschelman /* used by -sles_view */ 2401677d0b8SKris Buschelman #undef __FUNCT__ 2411677d0b8SKris Buschelman #define __FUNCT__ "MatSeqAIJFactorInfo_UMFPACK" 2421677d0b8SKris Buschelman int MatSeqAIJFactorInfo_UMFPACK(Mat A,PetscViewer viewer) 2431677d0b8SKris Buschelman { 2441677d0b8SKris Buschelman Mat_SeqAIJ_UMFPACK *lu= (Mat_SeqAIJ_UMFPACK*)A->spptr; 2451677d0b8SKris Buschelman int ierr; 2461677d0b8SKris Buschelman PetscFunctionBegin; 2471677d0b8SKris Buschelman /* check if matrix is UMFPACK type */ 2481677d0b8SKris Buschelman if (A->ops->solve != MatSolve_SeqAIJ_UMFPACK) PetscFunctionReturn(0); 2491677d0b8SKris Buschelman 2501677d0b8SKris Buschelman ierr = PetscViewerASCIIPrintf(viewer,"UMFPACK run parameters:\n");CHKERRQ(ierr); 2511677d0b8SKris Buschelman /* Control parameters used by reporting routiones */ 2521677d0b8SKris Buschelman ierr = PetscViewerASCIIPrintf(viewer," Control[UMFPACK_PRL]: %g\n",lu->Control[UMFPACK_PRL]);CHKERRQ(ierr); 2531677d0b8SKris Buschelman 2541677d0b8SKris Buschelman /* Control parameters used by symbolic factorization */ 2551677d0b8SKris Buschelman ierr = PetscViewerASCIIPrintf(viewer," Control[UMFPACK_DENSE_COL]: %g\n",lu->Control[UMFPACK_DENSE_COL]);CHKERRQ(ierr); 2561677d0b8SKris Buschelman ierr = PetscViewerASCIIPrintf(viewer," Control[UMFPACK_DENSE_ROW]: %g\n",lu->Control[UMFPACK_DENSE_ROW]);CHKERRQ(ierr); 2571677d0b8SKris Buschelman ierr = PetscViewerASCIIPrintf(viewer," Control[UMFPACK_BLOCK_SIZE]: %g\n",lu->Control[UMFPACK_BLOCK_SIZE]);CHKERRQ(ierr); 2581677d0b8SKris Buschelman 2591677d0b8SKris Buschelman /* Control parameters used by numeric factorization */ 2601677d0b8SKris Buschelman ierr = PetscViewerASCIIPrintf(viewer," Control[UMFPACK_PIVOT_TOLERANCE]: %g\n",lu->Control[UMFPACK_PIVOT_TOLERANCE]);CHKERRQ(ierr); 26154c494e3SKris Buschelman #if !defined(PETSC_HAVE_UMFPACK_41_OR_NEWER) 2621677d0b8SKris Buschelman ierr = PetscViewerASCIIPrintf(viewer," Control[UMFPACK_RELAXED_AMALGAMATION]: %g\n",lu->Control[UMFPACK_RELAXED_AMALGAMATION]);CHKERRQ(ierr); 2631677d0b8SKris Buschelman ierr = PetscViewerASCIIPrintf(viewer," Control[UMFPACK_RELAXED2_AMALGAMATION]: %g\n",lu->Control[UMFPACK_RELAXED2_AMALGAMATION]);CHKERRQ(ierr); 2641677d0b8SKris Buschelman ierr = PetscViewerASCIIPrintf(viewer," Control[UMFPACK_RELAXED3_AMALGAMATION]: %g\n",lu->Control[UMFPACK_RELAXED3_AMALGAMATION]);CHKERRQ(ierr); 265fb731535SKris Buschelman #endif 2661677d0b8SKris Buschelman ierr = PetscViewerASCIIPrintf(viewer," Control[UMFPACK_ALLOC_INIT]: %g\n",lu->Control[UMFPACK_ALLOC_INIT]);CHKERRQ(ierr); 2671677d0b8SKris Buschelman 2681677d0b8SKris Buschelman /* Control parameters used by solve */ 2691677d0b8SKris Buschelman ierr = PetscViewerASCIIPrintf(viewer," Control[UMFPACK_IRSTEP]: %g\n",lu->Control[UMFPACK_IRSTEP]);CHKERRQ(ierr); 2701677d0b8SKris Buschelman 2711677d0b8SKris Buschelman /* mat ordering */ 2721677d0b8SKris Buschelman if(!lu->PetscMatOdering) ierr = PetscViewerASCIIPrintf(viewer," UMFPACK default matrix ordering is used (not the PETSc matrix ordering) \n");CHKERRQ(ierr); 2731677d0b8SKris Buschelman 2741677d0b8SKris Buschelman PetscFunctionReturn(0); 2751677d0b8SKris Buschelman } 2761677d0b8SKris Buschelman 277*d844382dSKris Buschelman #undef __FUNCT__ 278*d844382dSKris Buschelman #define __FUNCT__ "MatView_SeqAIJ_UMFPACK" 279*d844382dSKris Buschelman int MatView_SeqAIJ_UMFPACK(Mat A,PetscViewer viewer) 280*d844382dSKris Buschelman { 281*d844382dSKris Buschelman int ierr; 282*d844382dSKris Buschelman PetscTruth isascii; 283*d844382dSKris Buschelman PetscViewerFormat format; 284*d844382dSKris Buschelman Mat_SeqAIJ_UMFPACK *lu=(Mat_SeqAIJ_UMFPACK*)(A->spptr); 285*d844382dSKris Buschelman 286*d844382dSKris Buschelman PetscFunctionBegin; 287*d844382dSKris Buschelman ierr = (*lu->MatView)(A,viewer);CHKERRQ(ierr); 288*d844382dSKris Buschelman 289*d844382dSKris Buschelman ierr = PetscTypeCompare((PetscObject)viewer,PETSC_VIEWER_ASCII,&isascii);CHKERRQ(ierr); 290*d844382dSKris Buschelman if (isascii) { 291*d844382dSKris Buschelman ierr = PetscViewerGetFormat(viewer,&format);CHKERRQ(ierr); 292*d844382dSKris Buschelman if (format == PETSC_VIEWER_ASCII_FACTOR_INFO) { 293*d844382dSKris Buschelman ierr = MatSeqAIJFactorInfo_UMFPACK(A,viewer);CHKERRQ(ierr); 294*d844382dSKris Buschelman } 295*d844382dSKris Buschelman } 296*d844382dSKris Buschelman PetscFunctionReturn(0); 297*d844382dSKris Buschelman } 298*d844382dSKris Buschelman 299*d844382dSKris Buschelman EXTERN_C_BEGIN 300*d844382dSKris Buschelman #undef __FUNCT__ 301*d844382dSKris Buschelman #define __FUNCT__ "MatConvert_SeqAIJ_UMFPACK" 302*d844382dSKris Buschelman int MatConvert_SeqAIJ_UMFPACK(Mat A,MatType type,Mat *newmat) { 303*d844382dSKris Buschelman /* This routine is only called to convert to MATUMFPACK */ 304*d844382dSKris Buschelman /* from MATSEQAIJ, so we will ignore 'MatType type'. */ 305*d844382dSKris Buschelman int ierr; 306*d844382dSKris Buschelman Mat B=*newmat; 307*d844382dSKris Buschelman Mat_SeqAIJ_UMFPACK *lu; 308*d844382dSKris Buschelman 309*d844382dSKris Buschelman PetscFunctionBegin; 310*d844382dSKris Buschelman if (B != A) { 311*d844382dSKris Buschelman ierr = MatDuplicate(A,MAT_COPY_VALUES,&B);CHKERRQ(ierr); 312*d844382dSKris Buschelman } 313*d844382dSKris Buschelman 314*d844382dSKris Buschelman ierr = PetscNew(Mat_SeqAIJ_UMFPACK,&lu);CHKERRQ(ierr); 315*d844382dSKris Buschelman lu->MatView = A->ops->view; 316*d844382dSKris Buschelman lu->MatAssemblyEnd = A->ops->assemblyend; 317*d844382dSKris Buschelman lu->MatLUFactorSymbolic = A->ops->lufactorsymbolic; 318*d844382dSKris Buschelman lu->MatDestroy = A->ops->destroy; 319*d844382dSKris Buschelman lu->CleanUpUMFPACK = PETSC_FALSE; 320*d844382dSKris Buschelman 321*d844382dSKris Buschelman B->spptr = (void*)lu; 322*d844382dSKris Buschelman B->ops->view = MatView_SeqAIJ_UMFPACK; 323*d844382dSKris Buschelman B->ops->assemblyend = MatAssemblyEnd_SeqAIJ_UMFPACK; 324*d844382dSKris Buschelman B->ops->lufactorsymbolic = MatLUFactorSymbolic_SeqAIJ_UMFPACK; 325*d844382dSKris Buschelman B->ops->destroy = MatDestroy_SeqAIJ_UMFPACK; 326*d844382dSKris Buschelman 327*d844382dSKris Buschelman ierr = PetscObjectComposeFunctionDynamic((PetscObject)B,"MatConvert_seqaij_umfpack_C", 328*d844382dSKris Buschelman "MatConvert_SeqAIJ_UMFPACK",MatConvert_SeqAIJ_UMFPACK);CHKERRQ(ierr); 329*d844382dSKris Buschelman ierr = PetscObjectComposeFunctionDynamic((PetscObject)B,"MatConvert_umfpack_seqaij_C", 330*d844382dSKris Buschelman "MatConvert_UMFPACK_SeqAIJ",MatConvert_UMFPACK_SeqAIJ);CHKERRQ(ierr); 331*d844382dSKris Buschelman PetscLogInfo(0,"Using UMFPACK for SeqAIJ LU factorization and solves."); 332*d844382dSKris Buschelman ierr = PetscObjectChangeTypeName((PetscObject)B,MATUMFPACK);CHKERRQ(ierr); 333*d844382dSKris Buschelman *newmat = B; 334*d844382dSKris Buschelman PetscFunctionReturn(0); 335*d844382dSKris Buschelman } 336*d844382dSKris Buschelman EXTERN_C_END 337*d844382dSKris Buschelman 3381677d0b8SKris Buschelman EXTERN_C_BEGIN 3391677d0b8SKris Buschelman #undef __FUNCT__ 3401677d0b8SKris Buschelman #define __FUNCT__ "MatCreate_SeqAIJ_UMFPACK" 3411677d0b8SKris Buschelman int MatCreate_SeqAIJ_UMFPACK(Mat A) { 3421677d0b8SKris Buschelman int ierr; 3431677d0b8SKris Buschelman 3441677d0b8SKris Buschelman PetscFunctionBegin; 3451677d0b8SKris Buschelman ierr = MatSetType(A,MATSEQAIJ);CHKERRQ(ierr); 346*d844382dSKris Buschelman ierr = MatConvert_SeqAIJ_UMFPACK(A,MATUMFPACK,&A);CHKERRQ(ierr); 3471677d0b8SKris Buschelman PetscFunctionReturn(0); 3481677d0b8SKris Buschelman } 3491677d0b8SKris Buschelman EXTERN_C_END 350