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,<ype);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