1c6db04a5SJed Brown #include <../src/ksp/pc/impls/factor/factor.h> /*I "petscpc.h" I*/
285317021SBarry Smith
PCFactorSetUpMatSolverType_Factor(PC pc)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
PCFactorSetZeroPivot_Factor(PC pc,PetscReal z)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
PCFactorSetShiftType_Factor(PC pc,MatFactorShiftType shifttype)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;
32ac530a7eSPierre Jolivet 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
PCFactorSetShiftAmount_Factor(PC pc,PetscReal shiftamount)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
PCFactorSetDropTolerance_Factor(PC pc,PetscReal dt,PetscReal dtcol,PetscInt dtcount)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
PCFactorSetFill_Factor(PC pc,PetscReal fill)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
PCFactorSetMatOrderingType_Factor(PC pc,MatOrderingType ordering)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
PCFactorGetLevels_Factor(PC pc,PetscInt * levels)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
PCFactorGetZeroPivot_Factor(PC pc,PetscReal * pivot)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
PCFactorGetShiftAmount_Factor(PC pc,PetscReal * shift)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
PCFactorGetShiftType_Factor(PC pc,MatFactorShiftType * type)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
PCFactorSetLevels_Factor(PC pc,PetscInt levels)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 */
130371d2eb7SMartin 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
PCFactorSetAllowDiagonalFill_Factor(PC pc,PetscBool flg)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
PCFactorGetAllowDiagonalFill_Factor(PC pc,PetscBool * flg)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
PCFactorSetPivotInBlocks_Factor(PC pc,PetscBool pivot)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
PCFactorGetMatrix_Factor(PC pc,Mat * mat)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
PCFactorSetMatSolverType_Factor(PC pc,MatSolverType stype)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
PCFactorGetMatSolverType_Factor(PC pc,MatSolverType * stype)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
PCFactorSetColumnPivot_Factor(PC pc,PetscReal dtcol)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
PCSetFromOptions_Factor(PC pc,PetscOptionItems PetscOptionsObject)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
PCView_Factor(PC pc,PetscViewer viewer)256d71ae5a4SJacob Faibussowitsch PetscErrorCode PCView_Factor(PC pc, PetscViewer viewer)
257d71ae5a4SJacob Faibussowitsch {
258914a5d51SHong Zhang PC_Factor *factor = (PC_Factor *)pc->data;
2599f196a02SMartin Diehl PetscBool isstring, isascii, 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));
2669f196a02SMartin Diehl PetscCall(PetscObjectTypeCompare((PetscObject)viewer, PETSCVIEWERASCII, &isascii));
2679f196a02SMartin Diehl if (isascii) {
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));
304*ecf3d421SBarry Smith PetscCall(PetscViewerASCIIPrintf(viewer, " Factored matrix:\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