xref: /petsc/src/ksp/pc/impls/factor/factimpl.c (revision d90ac83d909a2cb66ba66e74550740849e04bb53)
185317021SBarry Smith #define PETSCKSP_DLL
285317021SBarry Smith 
37c4f633dSBarry Smith #include "../src/ksp/pc/impls/factor/factor.h"     /*I "petscpc.h"  I*/
485317021SBarry Smith 
585317021SBarry Smith /* ------------------------------------------------------------------------------------------*/
685317021SBarry Smith 
785317021SBarry Smith EXTERN_C_BEGIN
885317021SBarry Smith #undef __FUNCT__
985317021SBarry Smith #define __FUNCT__ "PCFactorSetZeroPivot_Factor"
1085317021SBarry Smith PetscErrorCode PETSCKSP_DLLEXPORT PCFactorSetZeroPivot_Factor(PC pc,PetscReal z)
1185317021SBarry Smith {
1285317021SBarry Smith   PC_Factor *ilu = (PC_Factor*)pc->data;
1385317021SBarry Smith 
1485317021SBarry Smith   PetscFunctionBegin;
1585317021SBarry Smith   ilu->info.zeropivot = z;
1685317021SBarry Smith   PetscFunctionReturn(0);
1785317021SBarry Smith }
1885317021SBarry Smith EXTERN_C_END
1985317021SBarry Smith 
2085317021SBarry Smith EXTERN_C_BEGIN
2185317021SBarry Smith #undef __FUNCT__
22*d90ac83dSHong Zhang #define __FUNCT__ "PCFactorSetShiftType_Factor"
23*d90ac83dSHong Zhang PetscErrorCode PETSCKSP_DLLEXPORT PCFactorSetShiftType_Factor(PC pc,MatFactorShiftType shifttype)
24*d90ac83dSHong Zhang {
25*d90ac83dSHong Zhang   PC_Factor *dir = (PC_Factor*)pc->data;
26*d90ac83dSHong Zhang 
27*d90ac83dSHong Zhang   PetscFunctionBegin;
28*d90ac83dSHong Zhang   if (shifttype == (MatFactorShiftType)PETSC_DECIDE){
29*d90ac83dSHong Zhang     dir->info.shifttype = MAT_SHIFT_NONE;
30*d90ac83dSHong Zhang   } else {
31*d90ac83dSHong Zhang     dir->info.shifttype = shifttype;
32*d90ac83dSHong Zhang   }
33*d90ac83dSHong Zhang   PetscFunctionReturn(0);
34*d90ac83dSHong Zhang }
35*d90ac83dSHong Zhang 
36*d90ac83dSHong Zhang #undef __FUNCT__
37*d90ac83dSHong Zhang #define __FUNCT__ "PCFactorSetShiftAmount_Factor"
38*d90ac83dSHong Zhang PetscErrorCode PETSCKSP_DLLEXPORT PCFactorSetShiftAmount_Factor(PC pc,PetscReal shiftamount)
39*d90ac83dSHong Zhang {
40*d90ac83dSHong Zhang   PC_Factor *dir = (PC_Factor*)pc->data;
41*d90ac83dSHong Zhang 
42*d90ac83dSHong Zhang   PetscFunctionBegin;
43*d90ac83dSHong Zhang   if (shiftamount == (PetscReal) PETSC_DECIDE){
44*d90ac83dSHong Zhang     dir->info.shiftamount = 1.e-12;
45*d90ac83dSHong Zhang   } else {
46*d90ac83dSHong Zhang     dir->info.shiftamount = shiftamount;
47*d90ac83dSHong Zhang   }
48*d90ac83dSHong Zhang   PetscFunctionReturn(0);
49*d90ac83dSHong Zhang }
50*d90ac83dSHong Zhang EXTERN_C_END
51*d90ac83dSHong Zhang 
52*d90ac83dSHong Zhang EXTERN_C_BEGIN
53*d90ac83dSHong Zhang #undef __FUNCT__
5485317021SBarry Smith #define __FUNCT__ "PCFactorSetShiftNonzero_Factor"
5585317021SBarry Smith PetscErrorCode PETSCKSP_DLLEXPORT PCFactorSetShiftNonzero_Factor(PC pc,PetscReal shift)
5685317021SBarry Smith {
5785317021SBarry Smith   PC_Factor *dir = (PC_Factor*)pc->data;
5885317021SBarry Smith 
5985317021SBarry Smith   PetscFunctionBegin;
6085317021SBarry Smith   if (shift == (PetscReal) PETSC_DECIDE) {
6185317021SBarry Smith     dir->info.shiftnz = 1.e-12;
6285317021SBarry Smith   } else {
6385317021SBarry Smith     dir->info.shiftnz = shift;
6485317021SBarry Smith   }
6585317021SBarry Smith   PetscFunctionReturn(0);
6685317021SBarry Smith }
6785317021SBarry Smith EXTERN_C_END
6885317021SBarry Smith 
6985317021SBarry Smith EXTERN_C_BEGIN
7085317021SBarry Smith #undef __FUNCT__
7185317021SBarry Smith #define __FUNCT__ "PCFactorSetShiftPd_Factor"
7285317021SBarry Smith PetscErrorCode PETSCKSP_DLLEXPORT PCFactorSetShiftPd_Factor(PC pc,PetscTruth shift)
7385317021SBarry Smith {
7485317021SBarry Smith   PC_Factor *dir = (PC_Factor*)pc->data;
7585317021SBarry Smith 
7685317021SBarry Smith   PetscFunctionBegin;
7785317021SBarry Smith   if (shift) {
7885317021SBarry Smith     dir->info.shiftpd = 1.0;
7985317021SBarry Smith   } else {
8085317021SBarry Smith     dir->info.shiftpd = 0.0;
8185317021SBarry Smith   }
8285317021SBarry Smith   PetscFunctionReturn(0);
8385317021SBarry Smith }
8485317021SBarry Smith EXTERN_C_END
8585317021SBarry Smith 
8685317021SBarry Smith EXTERN_C_BEGIN
8785317021SBarry Smith #undef __FUNCT__
88b7c853c4SBarry Smith #define __FUNCT__ "PCFactorSetDropTolerance_Factor"
89b7c853c4SBarry Smith PetscErrorCode PETSCKSP_DLLEXPORT PCFactorSetDropTolerance_Factor(PC pc,PetscReal dt,PetscReal dtcol,PetscInt dtcount)
9085317021SBarry Smith {
9185317021SBarry Smith   PC_Factor         *ilu = (PC_Factor*)pc->data;
9285317021SBarry Smith 
9385317021SBarry Smith   PetscFunctionBegin;
9485317021SBarry Smith   if (pc->setupcalled && (!ilu->info.usedt || ((PC_Factor*)ilu)->info.dt != dt || ((PC_Factor*)ilu)->info.dtcol != dtcol || ((PC_Factor*)ilu)->info.dtcount != dtcount)) {
9585317021SBarry Smith     SETERRQ(PETSC_ERR_ARG_WRONGSTATE,"Cannot change tolerance after use");
9685317021SBarry Smith   }
9785317021SBarry Smith   ilu->info.usedt   = PETSC_TRUE;
9885317021SBarry Smith   ilu->info.dt      = dt;
9985317021SBarry Smith   ilu->info.dtcol   = dtcol;
10085317021SBarry Smith   ilu->info.dtcount = dtcount;
10185317021SBarry Smith   ilu->info.fill    = PETSC_DEFAULT;
10285317021SBarry Smith   PetscFunctionReturn(0);
10385317021SBarry Smith }
10485317021SBarry Smith EXTERN_C_END
10585317021SBarry Smith 
10685317021SBarry Smith EXTERN_C_BEGIN
10785317021SBarry Smith #undef __FUNCT__
10885317021SBarry Smith #define __FUNCT__ "PCFactorSetFill_Factor"
10985317021SBarry Smith PetscErrorCode PETSCKSP_DLLEXPORT PCFactorSetFill_Factor(PC pc,PetscReal fill)
11085317021SBarry Smith {
11185317021SBarry Smith   PC_Factor *dir = (PC_Factor*)pc->data;
11285317021SBarry Smith 
11385317021SBarry Smith   PetscFunctionBegin;
11485317021SBarry Smith   dir->info.fill = fill;
11585317021SBarry Smith   PetscFunctionReturn(0);
11685317021SBarry Smith }
11785317021SBarry Smith EXTERN_C_END
11885317021SBarry Smith 
11985317021SBarry Smith EXTERN_C_BEGIN
12085317021SBarry Smith #undef __FUNCT__
12185317021SBarry Smith #define __FUNCT__ "PCFactorSetMatOrderingType_Factor"
12285317021SBarry Smith PetscErrorCode PETSCKSP_DLLEXPORT PCFactorSetMatOrderingType_Factor(PC pc,const MatOrderingType ordering)
12385317021SBarry Smith {
12485317021SBarry Smith   PC_Factor      *dir = (PC_Factor*)pc->data;
12585317021SBarry Smith   PetscErrorCode ierr;
12685317021SBarry Smith   PetscTruth     flg;
12785317021SBarry Smith 
12885317021SBarry Smith   PetscFunctionBegin;
12985317021SBarry Smith   if (!pc->setupcalled) {
13085317021SBarry Smith      ierr = PetscStrfree(dir->ordering);CHKERRQ(ierr);
13185317021SBarry Smith      ierr = PetscStrallocpy(ordering,&dir->ordering);CHKERRQ(ierr);
13285317021SBarry Smith   } else {
13385317021SBarry Smith     ierr = PetscStrcmp(dir->ordering,ordering,&flg);CHKERRQ(ierr);
13485317021SBarry Smith     if (!flg) {
13585317021SBarry Smith       SETERRQ(PETSC_ERR_ARG_WRONGSTATE,"Cannot change ordering after use");
13685317021SBarry Smith     }
13785317021SBarry Smith   }
13885317021SBarry Smith   PetscFunctionReturn(0);
13985317021SBarry Smith }
14085317021SBarry Smith EXTERN_C_END
14185317021SBarry Smith 
14285317021SBarry Smith EXTERN_C_BEGIN
14385317021SBarry Smith #undef __FUNCT__
14485317021SBarry Smith #define __FUNCT__ "PCFactorSetLevels_Factor"
14585317021SBarry Smith PetscErrorCode PETSCKSP_DLLEXPORT PCFactorSetLevels_Factor(PC pc,PetscInt levels)
14685317021SBarry Smith {
14785317021SBarry Smith   PC_Factor      *ilu = (PC_Factor*)pc->data;
14885317021SBarry Smith 
14985317021SBarry Smith   PetscFunctionBegin;
15085317021SBarry Smith   if (!pc->setupcalled) {
15185317021SBarry Smith     ilu->info.levels = levels;
15285317021SBarry Smith   } else if (ilu->info.usedt || ilu->info.levels != levels) {
15385317021SBarry Smith     SETERRQ(PETSC_ERR_ARG_WRONGSTATE,"Cannot change levels after use");
15485317021SBarry Smith   }
15585317021SBarry Smith   PetscFunctionReturn(0);
15685317021SBarry Smith }
15785317021SBarry Smith EXTERN_C_END
15885317021SBarry Smith 
15985317021SBarry Smith EXTERN_C_BEGIN
16085317021SBarry Smith #undef __FUNCT__
16185317021SBarry Smith #define __FUNCT__ "PCFactorSetAllowDiagonalFill_Factor"
16285317021SBarry Smith PetscErrorCode PETSCKSP_DLLEXPORT PCFactorSetAllowDiagonalFill_Factor(PC pc)
16385317021SBarry Smith {
16485317021SBarry Smith   PC_Factor *dir = (PC_Factor*)pc->data;
16585317021SBarry Smith 
16685317021SBarry Smith   PetscFunctionBegin;
16785317021SBarry Smith   dir->info.diagonal_fill = 1;
16885317021SBarry Smith   PetscFunctionReturn(0);
16985317021SBarry Smith }
17085317021SBarry Smith EXTERN_C_END
17185317021SBarry Smith 
17285317021SBarry Smith 
17385317021SBarry Smith /* ------------------------------------------------------------------------------------------*/
17485317021SBarry Smith 
17585317021SBarry Smith EXTERN_C_BEGIN
17685317021SBarry Smith #undef __FUNCT__
17785317021SBarry Smith #define __FUNCT__ "PCFactorSetPivotInBlocks_Factor"
17885317021SBarry Smith PetscErrorCode PETSCKSP_DLLEXPORT PCFactorSetPivotInBlocks_Factor(PC pc,PetscTruth pivot)
17985317021SBarry Smith {
18085317021SBarry Smith   PC_Factor *dir = (PC_Factor*)pc->data;
18185317021SBarry Smith 
18285317021SBarry Smith   PetscFunctionBegin;
18385317021SBarry Smith   dir->info.pivotinblocks = pivot ? 1.0 : 0.0;
18485317021SBarry Smith   PetscFunctionReturn(0);
18585317021SBarry Smith }
18685317021SBarry Smith EXTERN_C_END
18785317021SBarry Smith 
18885317021SBarry Smith EXTERN_C_BEGIN
18985317021SBarry Smith #undef __FUNCT__
19085317021SBarry Smith #define __FUNCT__ "PCFactorSetShiftInBlocks_Factor"
19185317021SBarry Smith PetscErrorCode PETSCKSP_DLLEXPORT PCFactorSetShiftInBlocks_Factor(PC pc,PetscReal shift)
19285317021SBarry Smith {
19385317021SBarry Smith   PC_Factor *dir = (PC_Factor*)pc->data;
19485317021SBarry Smith 
19585317021SBarry Smith   PetscFunctionBegin;
19685317021SBarry Smith   if (shift == PETSC_DEFAULT) {
19785317021SBarry Smith     dir->info.shiftinblocks = 1.e-12;
19885317021SBarry Smith   } else {
19985317021SBarry Smith     dir->info.shiftinblocks = shift;
20085317021SBarry Smith   }
20185317021SBarry Smith   PetscFunctionReturn(0);
20285317021SBarry Smith }
20385317021SBarry Smith EXTERN_C_END
20485317021SBarry Smith 
20585317021SBarry Smith 
20685317021SBarry Smith EXTERN_C_BEGIN
20785317021SBarry Smith #undef __FUNCT__
20885317021SBarry Smith #define __FUNCT__ "PCFactorGetMatrix_Factor"
20985317021SBarry Smith PetscErrorCode PETSCKSP_DLLEXPORT PCFactorGetMatrix_Factor(PC pc,Mat *mat)
21085317021SBarry Smith {
21185317021SBarry Smith   PC_Factor *ilu = (PC_Factor*)pc->data;
21285317021SBarry Smith 
21385317021SBarry Smith   PetscFunctionBegin;
21485317021SBarry Smith   if (!ilu->fact) SETERRQ(PETSC_ERR_ORDER,"Matrix not yet factored; call after KSPSetUp() or PCSetUp()");
21585317021SBarry Smith   *mat = ilu->fact;
21685317021SBarry Smith   PetscFunctionReturn(0);
21785317021SBarry Smith }
21885317021SBarry Smith EXTERN_C_END
21985317021SBarry Smith 
22085317021SBarry Smith EXTERN_C_BEGIN
22185317021SBarry Smith #undef __FUNCT__
22285317021SBarry Smith #define __FUNCT__ "PCFactorSetMatSolverPackage_Factor"
22385317021SBarry Smith PetscErrorCode PETSCKSP_DLLEXPORT PCFactorSetMatSolverPackage_Factor(PC pc,const MatSolverPackage stype)
22485317021SBarry Smith {
22585317021SBarry Smith   PetscErrorCode ierr;
22685317021SBarry Smith   PC_Factor      *lu = (PC_Factor*)pc->data;
22785317021SBarry Smith 
22885317021SBarry Smith   PetscFunctionBegin;
2297112b564SBarry Smith   if (lu->fact) {
23085317021SBarry Smith     const MatSolverPackage ltype;
23185317021SBarry Smith     PetscTruth             flg;
23285317021SBarry Smith     ierr = MatFactorGetSolverPackage(lu->fact,&ltype);CHKERRQ(ierr);
23385317021SBarry Smith     ierr = PetscStrcmp(stype,ltype,&flg);CHKERRQ(ierr);
23485317021SBarry Smith     if (!flg) {
23585317021SBarry Smith       SETERRQ(PETSC_ERR_ARG_WRONGSTATE,"Cannot change solver matrix package after PC has been setup or used");
23685317021SBarry Smith     }
23785317021SBarry Smith   }
23885317021SBarry Smith   ierr = PetscStrfree(lu->solvertype);CHKERRQ(ierr);
23985317021SBarry Smith   ierr = PetscStrallocpy(stype,&lu->solvertype);CHKERRQ(ierr);
24085317021SBarry Smith   PetscFunctionReturn(0);
24185317021SBarry Smith }
24285317021SBarry Smith EXTERN_C_END
24385317021SBarry Smith 
24485317021SBarry Smith EXTERN_C_BEGIN
24585317021SBarry Smith #undef __FUNCT__
2467112b564SBarry Smith #define __FUNCT__ "PCFactorGetMatSolverPackage_Factor"
2477112b564SBarry Smith PetscErrorCode PETSCKSP_DLLEXPORT PCFactorGetMatSolverPackage_Factor(PC pc,const MatSolverPackage *stype)
2487112b564SBarry Smith {
2497112b564SBarry Smith   PC_Factor      *lu = (PC_Factor*)pc->data;
2507112b564SBarry Smith 
2517112b564SBarry Smith   PetscFunctionBegin;
2527112b564SBarry Smith   *stype = lu->solvertype;
2537112b564SBarry Smith   PetscFunctionReturn(0);
2547112b564SBarry Smith }
2557112b564SBarry Smith EXTERN_C_END
2567112b564SBarry Smith 
2577112b564SBarry Smith EXTERN_C_BEGIN
2587112b564SBarry Smith #undef __FUNCT__
2598ff23777SHong Zhang #define __FUNCT__ "PCFactorSetColumnPivot_Factor"
2608ff23777SHong Zhang PetscErrorCode PETSCKSP_DLLEXPORT PCFactorSetColumnPivot_Factor(PC pc,PetscReal dtcol)
26185317021SBarry Smith {
26285317021SBarry Smith   PC_Factor       *dir = (PC_Factor*)pc->data;
26385317021SBarry Smith 
26485317021SBarry Smith   PetscFunctionBegin;
26585317021SBarry Smith   if (dtcol < 0.0 || dtcol > 1.0) SETERRQ1(PETSC_ERR_ARG_OUTOFRANGE,"Column pivot tolerance is %G must be between 0 and 1",dtcol);
26685317021SBarry Smith   dir->info.dtcol = dtcol;
26785317021SBarry Smith   PetscFunctionReturn(0);
26885317021SBarry Smith }
26985317021SBarry Smith EXTERN_C_END
2708ff23777SHong Zhang 
2718ff23777SHong Zhang EXTERN_C_BEGIN
2728ff23777SHong Zhang #undef __FUNCT__
2738ff23777SHong Zhang #define __FUNCT__ "PCSetFromOptions_Factor"
2748ff23777SHong Zhang PetscErrorCode PETSCKSP_DLLEXPORT PCSetFromOptions_Factor(PC pc)
2758ff23777SHong Zhang {
2768ff23777SHong Zhang   PC_Factor       *factor = (PC_Factor*)pc->data;
2778ff23777SHong Zhang   PetscErrorCode  ierr;
2788ff23777SHong Zhang   PetscTruth      flg = PETSC_FALSE,set;
2798ff23777SHong Zhang   char            tname[256], solvertype[64];
2808ff23777SHong Zhang   PetscFList      ordlist;
2818ff23777SHong Zhang 
2828ff23777SHong Zhang   PetscFunctionBegin;
2838ff23777SHong Zhang   if (!MatOrderingRegisterAllCalled) {ierr = MatOrderingRegisterAll(PETSC_NULL);CHKERRQ(ierr);}
2848ff23777SHong Zhang   ierr = PetscOptionsTruth("-pc_factor_in_place","Form factored matrix in the same memory as the matrix","PCFactorSetUseInPlace",flg,&flg,PETSC_NULL);CHKERRQ(ierr);
2858ff23777SHong Zhang     if (flg) {
2868ff23777SHong Zhang       ierr = PCFactorSetUseInPlace(pc);CHKERRQ(ierr);
2878ff23777SHong Zhang     }
2888ff23777SHong Zhang     ierr = PetscOptionsReal("-pc_factor_fill","Expected non-zeros in factored matrix","PCFactorSetFill",((PC_Factor*)factor)->info.fill,&((PC_Factor*)factor)->info.fill,0);CHKERRQ(ierr);
2898ff23777SHong Zhang 
290*d90ac83dSHong Zhang     ierr = PetscOptionsEnum("-pc_factor_shift_type","Shift added to diagonal","PCFactorSetShiftType",
291*d90ac83dSHong Zhang                             MatFactorShiftTypes,(PetscEnum)((PC_Factor*)factor)->info.shifttype,(PetscEnum*)&((PC_Factor*)factor)->info.shifttype,&flg);CHKERRQ(ierr);
292*d90ac83dSHong Zhang     /* printf("type: %d\n",(PetscEnum)((PC_Factor*)factor)->info.shifttype); */
293*d90ac83dSHong Zhang 
294*d90ac83dSHong Zhang     ierr = PetscOptionsReal("-pc_factor_shift_amount","Shift added to diagonal","PCFactorSetShiftAmount",((PC_Factor*)factor)->info.shiftamount,&((PC_Factor*)factor)->info.shiftamount,0);CHKERRQ(ierr);
295*d90ac83dSHong Zhang     /* printf(" amount: %g\n",((PC_Factor*)factor)->info.shiftamount); */
296*d90ac83dSHong Zhang 
2978ff23777SHong Zhang     flg  = PETSC_FALSE;
2988ff23777SHong Zhang     ierr = PetscOptionsName("-pc_factor_shift_nonzero","Shift added to diagonal","PCFactorSetShiftNonzero",&flg);CHKERRQ(ierr);
2998ff23777SHong Zhang     if (flg) {
3008ff23777SHong Zhang       ierr = PCFactorSetShiftNonzero(pc,(PetscReal) PETSC_DECIDE);CHKERRQ(ierr);
3018ff23777SHong Zhang     }
3028ff23777SHong Zhang     ierr = PetscOptionsReal("-pc_factor_shift_nonzero","Shift added to diagonal","PCFactorSetShiftNonzero",((PC_Factor*)factor)->info.shiftnz,&((PC_Factor*)factor)->info.shiftnz,0);CHKERRQ(ierr);
3038ff23777SHong Zhang     flg  = PETSC_FALSE;
3048ff23777SHong Zhang     ierr = PetscOptionsTruth("-pc_factor_shift_positive_definite","Manteuffel shift applied to diagonal","PCFactorSetShiftPd",flg,&flg,PETSC_NULL);CHKERRQ(ierr);
3058ff23777SHong Zhang     if (flg) {
3068ff23777SHong Zhang       ierr = PCFactorSetShiftPd(pc,PETSC_TRUE);CHKERRQ(ierr);
3078ff23777SHong Zhang     }
3088ff23777SHong Zhang     flg  = PETSC_FALSE;
3098ff23777SHong Zhang     ierr = PetscOptionsName("-pc_factor_shift_in_blocks","Shift added to diagonal dense blocks","PCFactorSetShiftInBlocks",&flg);CHKERRQ(ierr);
3108ff23777SHong Zhang     if (flg) {
3118ff23777SHong Zhang       ierr = PCFactorSetShiftInBlocks(pc,(PetscReal) PETSC_DEFAULT);CHKERRQ(ierr);
3128ff23777SHong Zhang     }
3138ff23777SHong Zhang     ierr = PetscOptionsReal("-pc_factor_shift_in_blocks","Shift added to diagonal dense blocks","PCFactorSetShiftInBlocks",((PC_Factor*)factor)->info.shiftinblocks,&((PC_Factor*)factor)->info.shiftinblocks,0);CHKERRQ(ierr);
3148ff23777SHong Zhang 
3158ff23777SHong Zhang     ierr = PetscOptionsReal("-pc_factor_zeropivot","Pivot is considered zero if less than","PCFactorSetZeroPivot",((PC_Factor*)factor)->info.zeropivot,&((PC_Factor*)factor)->info.zeropivot,0);CHKERRQ(ierr);
3168ff23777SHong Zhang     ierr = PetscOptionsReal("-pc_factor_column_pivot","Column pivot tolerance (used only for some factorization)","PCFactorSetColumnPivot",((PC_Factor*)factor)->info.dtcol,&((PC_Factor*)factor)->info.dtcol,&flg);CHKERRQ(ierr);
3178ff23777SHong Zhang 
3188ff23777SHong Zhang     flg = ((PC_Factor*)factor)->info.pivotinblocks ? PETSC_TRUE : PETSC_FALSE;
3198ff23777SHong Zhang     ierr = PetscOptionsTruth("-pc_factor_pivot_in_blocks","Pivot inside matrix dense blocks for BAIJ and SBAIJ","PCFactorSetPivotInBlocks",flg,&flg,&set);CHKERRQ(ierr);
3208ff23777SHong Zhang     if (set) {
3218ff23777SHong Zhang       ierr = PCFactorSetPivotInBlocks(pc,flg);CHKERRQ(ierr);
3228ff23777SHong Zhang     }
3238ff23777SHong Zhang 
3248ff23777SHong Zhang     flg  = PETSC_FALSE;
3258ff23777SHong Zhang     ierr = PetscOptionsTruth("-pc_factor_reuse_fill","Use fill from previous factorization","PCFactorSetReuseFill",flg,&flg,PETSC_NULL);CHKERRQ(ierr);
3268ff23777SHong Zhang     if (flg) {
3278ff23777SHong Zhang       ierr = PCFactorSetReuseFill(pc,PETSC_TRUE);CHKERRQ(ierr);
3288ff23777SHong Zhang     }
3298ff23777SHong Zhang     flg  = PETSC_FALSE;
3308ff23777SHong Zhang     ierr = PetscOptionsTruth("-pc_factor_reuse_ordering","Reuse ordering from previous factorization","PCFactorSetReuseOrdering",flg,&flg,PETSC_NULL);CHKERRQ(ierr);
3318ff23777SHong Zhang     if (flg) {
3328ff23777SHong Zhang       ierr = PCFactorSetReuseOrdering(pc,PETSC_TRUE);CHKERRQ(ierr);
3338ff23777SHong Zhang     }
3348ff23777SHong Zhang 
3358ff23777SHong Zhang     ierr = MatGetOrderingList(&ordlist);CHKERRQ(ierr);
3368ff23777SHong Zhang     ierr = PetscOptionsList("-pc_factor_mat_ordering_type","Reordering to reduce nonzeros in factored matrix","PCFactorSetMatOrderingType",ordlist,((PC_Factor*)factor)->ordering,tname,256,&flg);CHKERRQ(ierr);
3378ff23777SHong Zhang     if (flg) {
3388ff23777SHong Zhang       ierr = PCFactorSetMatOrderingType(pc,tname);CHKERRQ(ierr);
3398ff23777SHong Zhang     }
3408ff23777SHong Zhang 
3418ff23777SHong Zhang     /* maybe should have MatGetSolverTypes(Mat,&list) like the ordering list */
3428ff23777SHong Zhang     ierr = PetscOptionsString("-pc_factor_mat_solver_package","Specific direct solver to use","MatGetFactor",((PC_Factor*)factor)->solvertype,solvertype,64,&flg);CHKERRQ(ierr);
3438ff23777SHong Zhang     if (flg) {
3448ff23777SHong Zhang       ierr = PCFactorSetMatSolverPackage(pc,solvertype);CHKERRQ(ierr);
3458ff23777SHong Zhang     }
3468ff23777SHong Zhang 
3478ff23777SHong Zhang     /*
3488ff23777SHong Zhang     ierr = PetscOptionsReal("-pc_factor_column_pivot","Column pivot tolerance (used only for some factorization)","PCFactorSetColumnPivot",((PC_Factor*)factor)->info.dtcol,&((PC_Factor*)factor)->info.dtcol,&flg);CHKERRQ(ierr);
3498ff23777SHong Zhang 
3508ff23777SHong Zhang     flg = ((PC_Factor*)factor)->info.pivotinblocks ? PETSC_TRUE : PETSC_FALSE;
3518ff23777SHong Zhang     ierr = PetscOptionsTruth("-pc_factor_pivot_in_blocks","Pivot inside matrix dense blocks for BAIJ and SBAIJ","PCFactorSetPivotInBlocks",flg,&flg,&set);CHKERRQ(ierr);
3528ff23777SHong Zhang     if (set) {
3538ff23777SHong Zhang       ierr = PCFactorSetPivotInBlocks(pc,flg);CHKERRQ(ierr);
3548ff23777SHong Zhang     }
3558ff23777SHong Zhang     */
3568ff23777SHong Zhang   PetscFunctionReturn(0);
3578ff23777SHong Zhang }
3588ff23777SHong Zhang EXTERN_C_END
359