1c6db04a5SJed Brown #include <../src/ksp/pc/impls/factor/factor.h> /*I "petscpc.h" I*/ 285317021SBarry Smith 3d71ae5a4SJacob Faibussowitsch PetscErrorCode PCFactorSetUpMatSolverType_Factor(PC pc) 4d71ae5a4SJacob Faibussowitsch { 5f8260c8fSBarry Smith PC_Factor *icc = (PC_Factor *)pc->data; 6f8260c8fSBarry Smith 7f8260c8fSBarry Smith PetscFunctionBegin; 828b400f6SJacob Faibussowitsch PetscCheck(pc->pmat, PetscObjectComm((PetscObject)pc), PETSC_ERR_ARG_WRONGSTATE, "You can only call this routine after the matrix object has been provided to the solver, for example with KSPSetOperators() or SNESSetJacobian()"); 9835f2295SStefano Zampini if (!icc->fact) PetscCall(MatGetFactor(pc->pmat, icc->solvertype, icc->factortype, &icc->fact)); 10835f2295SStefano Zampini PetscCheck(icc->fact, PetscObjectComm((PetscObject)pc->pmat), PETSC_ERR_SUP, "MatFactor type %s not supported by this matrix instance of type %s and solver type %s. Rerun with \"-info :mat | grep MatGetFactor_\" for additional information.", 11835f2295SStefano Zampini MatFactorTypes[icc->factortype], ((PetscObject)pc->pmat)->type_name, icc->solvertype); 123ba16761SJacob Faibussowitsch PetscFunctionReturn(PETSC_SUCCESS); 13f8260c8fSBarry Smith } 14f8260c8fSBarry Smith 15d71ae5a4SJacob Faibussowitsch PetscErrorCode PCFactorSetZeroPivot_Factor(PC pc, PetscReal z) 16d71ae5a4SJacob Faibussowitsch { 1785317021SBarry Smith PC_Factor *ilu = (PC_Factor *)pc->data; 1885317021SBarry Smith 1985317021SBarry Smith PetscFunctionBegin; 2085317021SBarry Smith ilu->info.zeropivot = z; 213ba16761SJacob Faibussowitsch PetscFunctionReturn(PETSC_SUCCESS); 2285317021SBarry Smith } 2385317021SBarry Smith 24d71ae5a4SJacob Faibussowitsch PetscErrorCode PCFactorSetShiftType_Factor(PC pc, MatFactorShiftType shifttype) 25d71ae5a4SJacob Faibussowitsch { 26d90ac83dSHong Zhang PC_Factor *dir = (PC_Factor *)pc->data; 27d90ac83dSHong Zhang 28d90ac83dSHong Zhang PetscFunctionBegin; 292fa5cd67SKarl Rupp if (shifttype == (MatFactorShiftType)PETSC_DECIDE) dir->info.shifttype = (PetscReal)MAT_SHIFT_NONE; 302fa5cd67SKarl Rupp else { 31f4db908eSBarry Smith dir->info.shifttype = (PetscReal)shifttype; 329371c9d4SSatish Balay if ((shifttype == MAT_SHIFT_NONZERO || shifttype == MAT_SHIFT_INBLOCKS) && dir->info.shiftamount == 0.0) { dir->info.shiftamount = 100.0 * PETSC_MACHINE_EPSILON; /* set default amount if user has not called PCFactorSetShiftAmount() yet */ } 33d90ac83dSHong Zhang } 343ba16761SJacob Faibussowitsch PetscFunctionReturn(PETSC_SUCCESS); 35d90ac83dSHong Zhang } 36d90ac83dSHong Zhang 37d71ae5a4SJacob Faibussowitsch PetscErrorCode PCFactorSetShiftAmount_Factor(PC pc, PetscReal shiftamount) 38d71ae5a4SJacob Faibussowitsch { 39d90ac83dSHong Zhang PC_Factor *dir = (PC_Factor *)pc->data; 40d90ac83dSHong Zhang 41d90ac83dSHong Zhang PetscFunctionBegin; 422fa5cd67SKarl Rupp if (shiftamount == (PetscReal)PETSC_DECIDE) dir->info.shiftamount = 100.0 * PETSC_MACHINE_EPSILON; 432fa5cd67SKarl Rupp else dir->info.shiftamount = shiftamount; 443ba16761SJacob Faibussowitsch PetscFunctionReturn(PETSC_SUCCESS); 45d90ac83dSHong Zhang } 46d90ac83dSHong Zhang 47d71ae5a4SJacob Faibussowitsch PetscErrorCode PCFactorSetDropTolerance_Factor(PC pc, PetscReal dt, PetscReal dtcol, PetscInt dtcount) 48d71ae5a4SJacob Faibussowitsch { 4985317021SBarry Smith PC_Factor *ilu = (PC_Factor *)pc->data; 5085317021SBarry Smith 5185317021SBarry Smith PetscFunctionBegin; 52835f2295SStefano Zampini PetscCheck(pc->setupcalled && (!ilu->info.usedt || ilu->info.dt != dt || ilu->info.dtcol != dtcol || ilu->info.dtcount != dtcount), PetscObjectComm((PetscObject)pc), PETSC_ERR_ARG_WRONGSTATE, "Cannot change tolerance after use"); 5385317021SBarry Smith ilu->info.usedt = PETSC_TRUE; 5485317021SBarry Smith ilu->info.dt = dt; 5585317021SBarry Smith ilu->info.dtcol = dtcol; 5685317021SBarry Smith ilu->info.dtcount = dtcount; 5785317021SBarry Smith ilu->info.fill = PETSC_DEFAULT; 583ba16761SJacob Faibussowitsch PetscFunctionReturn(PETSC_SUCCESS); 5985317021SBarry Smith } 6085317021SBarry Smith 61d71ae5a4SJacob Faibussowitsch PetscErrorCode PCFactorSetFill_Factor(PC pc, PetscReal fill) 62d71ae5a4SJacob Faibussowitsch { 6385317021SBarry Smith PC_Factor *dir = (PC_Factor *)pc->data; 6485317021SBarry Smith 6585317021SBarry Smith PetscFunctionBegin; 6685317021SBarry Smith dir->info.fill = fill; 673ba16761SJacob Faibussowitsch PetscFunctionReturn(PETSC_SUCCESS); 6885317021SBarry Smith } 6985317021SBarry Smith 70d71ae5a4SJacob Faibussowitsch PetscErrorCode PCFactorSetMatOrderingType_Factor(PC pc, MatOrderingType ordering) 71d71ae5a4SJacob Faibussowitsch { 7285317021SBarry Smith PC_Factor *dir = (PC_Factor *)pc->data; 73ace3abfcSBarry Smith PetscBool flg; 7485317021SBarry Smith 7585317021SBarry Smith PetscFunctionBegin; 7685317021SBarry Smith if (!pc->setupcalled) { 779566063dSJacob Faibussowitsch PetscCall(PetscFree(dir->ordering)); 789566063dSJacob Faibussowitsch PetscCall(PetscStrallocpy(ordering, (char **)&dir->ordering)); 7985317021SBarry Smith } else { 809566063dSJacob Faibussowitsch PetscCall(PetscStrcmp(dir->ordering, ordering, &flg)); 8128b400f6SJacob Faibussowitsch PetscCheck(flg, PetscObjectComm((PetscObject)pc), PETSC_ERR_ARG_WRONGSTATE, "Cannot change ordering after use"); 8285317021SBarry Smith } 833ba16761SJacob Faibussowitsch PetscFunctionReturn(PETSC_SUCCESS); 8485317021SBarry Smith } 8585317021SBarry Smith 86d71ae5a4SJacob Faibussowitsch PetscErrorCode PCFactorGetLevels_Factor(PC pc, PetscInt *levels) 87d71ae5a4SJacob Faibussowitsch { 882591b318SToby Isaac PC_Factor *ilu = (PC_Factor *)pc->data; 892591b318SToby Isaac 902591b318SToby Isaac PetscFunctionBegin; 912591b318SToby Isaac *levels = ilu->info.levels; 923ba16761SJacob Faibussowitsch PetscFunctionReturn(PETSC_SUCCESS); 932591b318SToby Isaac } 942591b318SToby Isaac 95d71ae5a4SJacob Faibussowitsch PetscErrorCode PCFactorGetZeroPivot_Factor(PC pc, PetscReal *pivot) 96d71ae5a4SJacob Faibussowitsch { 97c7f610a1SBarry Smith PC_Factor *ilu = (PC_Factor *)pc->data; 98c7f610a1SBarry Smith 99c7f610a1SBarry Smith PetscFunctionBegin; 100c7f610a1SBarry Smith *pivot = ilu->info.zeropivot; 1013ba16761SJacob Faibussowitsch PetscFunctionReturn(PETSC_SUCCESS); 102c7f610a1SBarry Smith } 103c7f610a1SBarry Smith 104d71ae5a4SJacob Faibussowitsch PetscErrorCode PCFactorGetShiftAmount_Factor(PC pc, PetscReal *shift) 105d71ae5a4SJacob Faibussowitsch { 106c7f610a1SBarry Smith PC_Factor *ilu = (PC_Factor *)pc->data; 107c7f610a1SBarry Smith 108c7f610a1SBarry Smith PetscFunctionBegin; 109c7f610a1SBarry Smith *shift = ilu->info.shiftamount; 1103ba16761SJacob Faibussowitsch PetscFunctionReturn(PETSC_SUCCESS); 111c7f610a1SBarry Smith } 112c7f610a1SBarry Smith 113d71ae5a4SJacob Faibussowitsch PetscErrorCode PCFactorGetShiftType_Factor(PC pc, MatFactorShiftType *type) 114d71ae5a4SJacob Faibussowitsch { 115c7f610a1SBarry Smith PC_Factor *ilu = (PC_Factor *)pc->data; 116c7f610a1SBarry Smith 117c7f610a1SBarry Smith PetscFunctionBegin; 118b729e602SBarry Smith *type = (MatFactorShiftType)(int)ilu->info.shifttype; 1193ba16761SJacob Faibussowitsch PetscFunctionReturn(PETSC_SUCCESS); 120c7f610a1SBarry Smith } 121c7f610a1SBarry Smith 122d71ae5a4SJacob Faibussowitsch PetscErrorCode PCFactorSetLevels_Factor(PC pc, PetscInt levels) 123d71ae5a4SJacob Faibussowitsch { 12485317021SBarry Smith PC_Factor *ilu = (PC_Factor *)pc->data; 12585317021SBarry Smith 12685317021SBarry Smith PetscFunctionBegin; 1272fa5cd67SKarl Rupp if (!pc->setupcalled) ilu->info.levels = levels; 1282fa5cd67SKarl Rupp else if (ilu->info.levels != levels) { 129dbbe0bcdSBarry Smith PetscUseTypeMethod(pc, reset); /* remove previous factored matrices */ 130*371d2eb7SMartin Diehl pc->setupcalled = PETSC_FALSE; /* force a complete rebuild of preconditioner factored matrices */ 1315b9c68c7SBarry Smith ilu->info.levels = levels; 1322472a847SBarry Smith } else PetscCheck(!ilu->info.usedt, PetscObjectComm((PetscObject)pc), PETSC_ERR_ARG_WRONGSTATE, "Cannot change levels after use with ILUdt"); 1333ba16761SJacob Faibussowitsch PetscFunctionReturn(PETSC_SUCCESS); 13485317021SBarry Smith } 13585317021SBarry Smith 136d71ae5a4SJacob Faibussowitsch PetscErrorCode PCFactorSetAllowDiagonalFill_Factor(PC pc, PetscBool flg) 137d71ae5a4SJacob Faibussowitsch { 13885317021SBarry Smith PC_Factor *dir = (PC_Factor *)pc->data; 13985317021SBarry Smith 14085317021SBarry Smith PetscFunctionBegin; 14192e9c092SBarry Smith dir->info.diagonal_fill = (PetscReal)flg; 1423ba16761SJacob Faibussowitsch PetscFunctionReturn(PETSC_SUCCESS); 14392e9c092SBarry Smith } 14492e9c092SBarry Smith 145d71ae5a4SJacob Faibussowitsch PetscErrorCode PCFactorGetAllowDiagonalFill_Factor(PC pc, PetscBool *flg) 146d71ae5a4SJacob Faibussowitsch { 14792e9c092SBarry Smith PC_Factor *dir = (PC_Factor *)pc->data; 14892e9c092SBarry Smith 14992e9c092SBarry Smith PetscFunctionBegin; 15092e9c092SBarry Smith *flg = dir->info.diagonal_fill ? PETSC_TRUE : PETSC_FALSE; 1513ba16761SJacob Faibussowitsch PetscFunctionReturn(PETSC_SUCCESS); 15285317021SBarry Smith } 15385317021SBarry Smith 154d71ae5a4SJacob Faibussowitsch PetscErrorCode PCFactorSetPivotInBlocks_Factor(PC pc, PetscBool pivot) 155d71ae5a4SJacob Faibussowitsch { 15685317021SBarry Smith PC_Factor *dir = (PC_Factor *)pc->data; 15785317021SBarry Smith 15885317021SBarry Smith PetscFunctionBegin; 15985317021SBarry Smith dir->info.pivotinblocks = pivot ? 1.0 : 0.0; 1603ba16761SJacob Faibussowitsch PetscFunctionReturn(PETSC_SUCCESS); 16185317021SBarry Smith } 16285317021SBarry Smith 163d71ae5a4SJacob Faibussowitsch PetscErrorCode PCFactorGetMatrix_Factor(PC pc, Mat *mat) 164d71ae5a4SJacob Faibussowitsch { 16585317021SBarry Smith PC_Factor *ilu = (PC_Factor *)pc->data; 16685317021SBarry Smith 16785317021SBarry Smith PetscFunctionBegin; 16828b400f6SJacob Faibussowitsch PetscCheck(ilu->fact, PetscObjectComm((PetscObject)pc), PETSC_ERR_ORDER, "Matrix not yet factored; call after KSPSetUp() or PCSetUp()"); 16985317021SBarry Smith *mat = ilu->fact; 1703ba16761SJacob Faibussowitsch PetscFunctionReturn(PETSC_SUCCESS); 17185317021SBarry Smith } 17285317021SBarry Smith 173978beb7fSPierre Jolivet /* allow access to preallocation information */ 174978beb7fSPierre Jolivet #include <petsc/private/matimpl.h> 175978beb7fSPierre Jolivet 176d71ae5a4SJacob Faibussowitsch PetscErrorCode PCFactorSetMatSolverType_Factor(PC pc, MatSolverType stype) 177d71ae5a4SJacob Faibussowitsch { 17885317021SBarry Smith PC_Factor *lu = (PC_Factor *)pc->data; 17985317021SBarry Smith 18085317021SBarry Smith PetscFunctionBegin; 181978beb7fSPierre Jolivet if (lu->fact && lu->fact->assembled) { 182ea799195SBarry Smith MatSolverType ltype; 183ace3abfcSBarry Smith PetscBool flg; 184ce78bad3SBarry Smith 1859566063dSJacob Faibussowitsch PetscCall(MatFactorGetSolverType(lu->fact, <ype)); 1869566063dSJacob Faibussowitsch PetscCall(PetscStrcmp(stype, ltype, &flg)); 18728b400f6SJacob Faibussowitsch PetscCheck(flg, PetscObjectComm((PetscObject)pc), PETSC_ERR_ARG_WRONGSTATE, "Cannot change solver matrix package from %s to %s after PC has been setup or used", ltype, stype); 18800c67f3bSHong Zhang } 18900c67f3bSHong Zhang 1909566063dSJacob Faibussowitsch PetscCall(PetscFree(lu->solvertype)); 1919566063dSJacob Faibussowitsch PetscCall(PetscStrallocpy(stype, &lu->solvertype)); 1923ba16761SJacob Faibussowitsch PetscFunctionReturn(PETSC_SUCCESS); 19385317021SBarry Smith } 19485317021SBarry Smith 195d71ae5a4SJacob Faibussowitsch PetscErrorCode PCFactorGetMatSolverType_Factor(PC pc, MatSolverType *stype) 196d71ae5a4SJacob Faibussowitsch { 1977112b564SBarry Smith PC_Factor *lu = (PC_Factor *)pc->data; 1987112b564SBarry Smith 1997112b564SBarry Smith PetscFunctionBegin; 2007112b564SBarry Smith *stype = lu->solvertype; 2013ba16761SJacob Faibussowitsch PetscFunctionReturn(PETSC_SUCCESS); 2027112b564SBarry Smith } 2037112b564SBarry Smith 204d71ae5a4SJacob Faibussowitsch PetscErrorCode PCFactorSetColumnPivot_Factor(PC pc, PetscReal dtcol) 205d71ae5a4SJacob Faibussowitsch { 20685317021SBarry Smith PC_Factor *dir = (PC_Factor *)pc->data; 20785317021SBarry Smith 20885317021SBarry Smith PetscFunctionBegin; 2092472a847SBarry Smith PetscCheck(dtcol >= 0.0 && dtcol <= 1.0, PetscObjectComm((PetscObject)pc), PETSC_ERR_ARG_OUTOFRANGE, "Column pivot tolerance is %g must be between 0 and 1", (double)dtcol); 21085317021SBarry Smith dir->info.dtcol = dtcol; 2113ba16761SJacob Faibussowitsch PetscFunctionReturn(PETSC_SUCCESS); 21285317021SBarry Smith } 2138ff23777SHong Zhang 214ce78bad3SBarry Smith PetscErrorCode PCSetFromOptions_Factor(PC pc, PetscOptionItems PetscOptionsObject) 215d71ae5a4SJacob Faibussowitsch { 2168ff23777SHong Zhang PC_Factor *factor = (PC_Factor *)pc->data; 2178afaa268SBarry Smith PetscBool flg, set; 2188ff23777SHong Zhang char tname[256], solvertype[64]; 219140e18c1SBarry Smith PetscFunctionList ordlist; 220018dd85eSSatish Balay PetscEnum etmp; 2218e37d05fSBarry Smith PetscBool inplace; 2228ff23777SHong Zhang 2238ff23777SHong Zhang PetscFunctionBegin; 2249566063dSJacob Faibussowitsch PetscCall(PCFactorGetUseInPlace(pc, &inplace)); 2259566063dSJacob Faibussowitsch PetscCall(PetscOptionsBool("-pc_factor_in_place", "Form factored matrix in the same memory as the matrix", "PCFactorSetUseInPlace", inplace, &flg, &set)); 2261baa6e33SBarry Smith if (set) PetscCall(PCFactorSetUseInPlace(pc, flg)); 227835f2295SStefano Zampini PetscCall(PetscOptionsReal("-pc_factor_fill", "Expected non-zeros in factored matrix", "PCFactorSetFill", factor->info.fill, &factor->info.fill, NULL)); 2288ff23777SHong Zhang 229835f2295SStefano Zampini PetscCall(PetscOptionsEnum("-pc_factor_shift_type", "Type of shift to add to diagonal", "PCFactorSetShiftType", MatFactorShiftTypes, (PetscEnum)(int)factor->info.shifttype, &etmp, &flg)); 2301baa6e33SBarry Smith if (flg) PetscCall(PCFactorSetShiftType(pc, (MatFactorShiftType)etmp)); 231835f2295SStefano Zampini PetscCall(PetscOptionsReal("-pc_factor_shift_amount", "Shift added to diagonal", "PCFactorSetShiftAmount", factor->info.shiftamount, &factor->info.shiftamount, NULL)); 232d90ac83dSHong Zhang 233835f2295SStefano Zampini PetscCall(PetscOptionsReal("-pc_factor_zeropivot", "Pivot is considered zero if less than", "PCFactorSetZeroPivot", factor->info.zeropivot, &factor->info.zeropivot, NULL)); 234835f2295SStefano Zampini PetscCall(PetscOptionsReal("-pc_factor_column_pivot", "Column pivot tolerance (used only for some factorization)", "PCFactorSetColumnPivot", factor->info.dtcol, &factor->info.dtcol, &flg)); 2358ff23777SHong Zhang 236835f2295SStefano Zampini PetscCall(PetscOptionsBool("-pc_factor_pivot_in_blocks", "Pivot inside matrix dense blocks for BAIJ and SBAIJ", "PCFactorSetPivotInBlocks", factor->info.pivotinblocks ? PETSC_TRUE : PETSC_FALSE, &flg, &set)); 2371baa6e33SBarry Smith if (set) PetscCall(PCFactorSetPivotInBlocks(pc, flg)); 2388ff23777SHong Zhang 2399566063dSJacob Faibussowitsch PetscCall(PetscOptionsBool("-pc_factor_reuse_fill", "Use fill from previous factorization", "PCFactorSetReuseFill", PETSC_FALSE, &flg, &set)); 2401baa6e33SBarry Smith if (set) PetscCall(PCFactorSetReuseFill(pc, flg)); 2419566063dSJacob Faibussowitsch PetscCall(PetscOptionsBool("-pc_factor_reuse_ordering", "Reuse ordering from previous factorization", "PCFactorSetReuseOrdering", PETSC_FALSE, &flg, &set)); 2421baa6e33SBarry Smith if (set) PetscCall(PCFactorSetReuseOrdering(pc, flg)); 2438ff23777SHong Zhang 2449566063dSJacob Faibussowitsch PetscCall(PetscOptionsDeprecated("-pc_factor_mat_solver_package", "-pc_factor_mat_solver_type", "3.9", NULL)); 245835f2295SStefano Zampini PetscCall(PetscOptionsString("-pc_factor_mat_solver_type", "Specific direct solver to use", "MatGetFactor", factor->solvertype, solvertype, sizeof(solvertype), &flg)); 2461baa6e33SBarry Smith if (flg) PetscCall(PCFactorSetMatSolverType(pc, solvertype)); 2479566063dSJacob Faibussowitsch PetscCall(PCFactorSetDefaultOrdering_Factor(pc)); 2489566063dSJacob Faibussowitsch PetscCall(MatGetOrderingList(&ordlist)); 249835f2295SStefano Zampini PetscCall(PetscOptionsFList("-pc_factor_mat_ordering_type", "Reordering to reduce nonzeros in factored matrix", "PCFactorSetMatOrderingType", ordlist, factor->ordering, tname, sizeof(tname), &flg)); 2501baa6e33SBarry Smith if (flg) PetscCall(PCFactorSetMatOrderingType(pc, tname)); 251f82ac72cSJunchao Zhang PetscCall(PetscOptionsBool("-pc_factor_mat_factor_on_host", "Do mat factorization on host (with device matrix types)", "MatGetFactor", factor->info.factoronhost, &factor->info.factoronhost, NULL)); 252f82ac72cSJunchao Zhang PetscCall(PetscOptionsBool("-pc_factor_mat_solve_on_host", "Do mat solve on host with the factor (with device matrix types)", "MatGetFactor", factor->info.solveonhost, &factor->info.solveonhost, NULL)); 2533ba16761SJacob Faibussowitsch PetscFunctionReturn(PETSC_SUCCESS); 2548ff23777SHong Zhang } 255914a5d51SHong Zhang 256d71ae5a4SJacob Faibussowitsch PetscErrorCode PCView_Factor(PC pc, PetscViewer viewer) 257d71ae5a4SJacob Faibussowitsch { 258914a5d51SHong Zhang PC_Factor *factor = (PC_Factor *)pc->data; 2594ac6704cSBarry Smith PetscBool isstring, iascii, canuseordering; 2604ac6704cSBarry Smith MatInfo info; 2619bd791bbSBarry Smith MatOrderingType ordering; 2621511cd71SPierre Jolivet PetscViewerFormat format; 263914a5d51SHong Zhang 264914a5d51SHong Zhang PetscFunctionBegin; 2659566063dSJacob Faibussowitsch PetscCall(PetscObjectTypeCompare((PetscObject)viewer, PETSCVIEWERSTRING, &isstring)); 2669566063dSJacob Faibussowitsch PetscCall(PetscObjectTypeCompare((PetscObject)viewer, PETSCVIEWERASCII, &iascii)); 267914a5d51SHong Zhang if (iascii) { 2683d1c1ea0SBarry Smith if (factor->inplace) { 2699566063dSJacob Faibussowitsch PetscCall(PetscViewerASCIIPrintf(viewer, " in-place factorization\n")); 2703d1c1ea0SBarry Smith } else { 2719566063dSJacob Faibussowitsch PetscCall(PetscViewerASCIIPrintf(viewer, " out-of-place factorization\n")); 2723d1c1ea0SBarry Smith } 2733d1c1ea0SBarry Smith 2749566063dSJacob Faibussowitsch if (factor->reusefill) PetscCall(PetscViewerASCIIPrintf(viewer, " Reusing fill from past factorization\n")); 2759566063dSJacob Faibussowitsch if (factor->reuseordering) PetscCall(PetscViewerASCIIPrintf(viewer, " Reusing reordering from past factorization\n")); 276879e8a4dSBarry Smith if (factor->factortype == MAT_FACTOR_ILU || factor->factortype == MAT_FACTOR_ICC) { 277914a5d51SHong Zhang if (factor->info.dt > 0) { 2789566063dSJacob Faibussowitsch PetscCall(PetscViewerASCIIPrintf(viewer, " drop tolerance %g\n", (double)factor->info.dt)); 27963a3b9bcSJacob Faibussowitsch PetscCall(PetscViewerASCIIPrintf(viewer, " max nonzeros per row %" PetscInt_FMT "\n", (PetscInt)factor->info.dtcount)); 2809566063dSJacob Faibussowitsch PetscCall(PetscViewerASCIIPrintf(viewer, " column permutation tolerance %g\n", (double)factor->info.dtcol)); 281914a5d51SHong Zhang } else if (factor->info.levels == 1) { 28263a3b9bcSJacob Faibussowitsch PetscCall(PetscViewerASCIIPrintf(viewer, " %" PetscInt_FMT " level of fill\n", (PetscInt)factor->info.levels)); 283914a5d51SHong Zhang } else { 28463a3b9bcSJacob Faibussowitsch PetscCall(PetscViewerASCIIPrintf(viewer, " %" PetscInt_FMT " levels of fill\n", (PetscInt)factor->info.levels)); 285914a5d51SHong Zhang } 286914a5d51SHong Zhang } 287914a5d51SHong Zhang 2889566063dSJacob Faibussowitsch PetscCall(PetscViewerASCIIPrintf(viewer, " tolerance for zero pivot %g\n", (double)factor->info.zeropivot)); 2895e9742b9SJed Brown if (MatFactorShiftTypesDetail[(int)factor->info.shifttype]) { /* Only print when using a nontrivial shift */ 2909566063dSJacob Faibussowitsch PetscCall(PetscViewerASCIIPrintf(viewer, " using %s [%s]\n", MatFactorShiftTypesDetail[(int)factor->info.shifttype], MatFactorShiftTypes[(int)factor->info.shifttype])); 291914a5d51SHong Zhang } 292914a5d51SHong Zhang 2934ac6704cSBarry Smith if (factor->fact) { 2949566063dSJacob Faibussowitsch PetscCall(MatFactorGetCanUseOrdering(factor->fact, &canuseordering)); 2954ac6704cSBarry Smith if (!canuseordering) ordering = MATORDERINGEXTERNAL; 2964ac6704cSBarry Smith else ordering = factor->ordering; 2979566063dSJacob Faibussowitsch PetscCall(PetscViewerASCIIPrintf(viewer, " matrix ordering: %s\n", ordering)); 298978beb7fSPierre Jolivet if (!factor->fact->assembled) { 2999566063dSJacob Faibussowitsch PetscCall(PetscViewerASCIIPrintf(viewer, " matrix solver type: %s\n", factor->fact->solvertype)); 3009566063dSJacob Faibussowitsch PetscCall(PetscViewerASCIIPrintf(viewer, " matrix not yet factored; no additional information available\n")); 301978beb7fSPierre Jolivet } else { 3029566063dSJacob Faibussowitsch PetscCall(MatGetInfo(factor->fact, MAT_LOCAL, &info)); 303835f2295SStefano Zampini PetscCall(PetscViewerASCIIPrintf(viewer, " factor fill ratio given %g, needed %g\n", info.fill_ratio_given, info.fill_ratio_needed)); 3049566063dSJacob Faibussowitsch PetscCall(PetscViewerASCIIPrintf(viewer, " Factored matrix follows:\n")); 3059566063dSJacob Faibussowitsch PetscCall(PetscViewerASCIIPushTab(viewer)); 3069566063dSJacob Faibussowitsch PetscCall(PetscViewerASCIIPushTab(viewer)); 3079566063dSJacob Faibussowitsch PetscCall(PetscViewerASCIIPushTab(viewer)); 3081511cd71SPierre Jolivet PetscCall(PetscViewerGetFormat(viewer, &format)); 3091511cd71SPierre Jolivet PetscCall(PetscViewerPushFormat(viewer, format != PETSC_VIEWER_ASCII_INFO_DETAIL ? PETSC_VIEWER_ASCII_INFO : PETSC_VIEWER_ASCII_INFO_DETAIL)); 3109566063dSJacob Faibussowitsch PetscCall(MatView(factor->fact, viewer)); 3119566063dSJacob Faibussowitsch PetscCall(PetscViewerPopFormat(viewer)); 3129566063dSJacob Faibussowitsch PetscCall(PetscViewerASCIIPopTab(viewer)); 3139566063dSJacob Faibussowitsch PetscCall(PetscViewerASCIIPopTab(viewer)); 3149566063dSJacob Faibussowitsch PetscCall(PetscViewerASCIIPopTab(viewer)); 315914a5d51SHong Zhang } 316978beb7fSPierre Jolivet } 317914a5d51SHong Zhang 318914a5d51SHong Zhang } else if (isstring) { 3196335c336SBarry Smith MatFactorType t; 3209566063dSJacob Faibussowitsch PetscCall(MatGetFactorType(factor->fact, &t)); 32148a46eb9SPierre Jolivet if (t == MAT_FACTOR_ILU || t == MAT_FACTOR_ICC) PetscCall(PetscViewerStringSPrintf(viewer, " lvls=%" PetscInt_FMT ",order=%s", (PetscInt)factor->info.levels, factor->ordering)); 322914a5d51SHong Zhang } 3233ba16761SJacob Faibussowitsch PetscFunctionReturn(PETSC_SUCCESS); 324914a5d51SHong Zhang } 325