xref: /petsc/src/ksp/pc/impls/factor/cholesky/cholesky.c (revision f023e1d5e0ee81b89f932c14ff3ff1d4c37a0ddc)
19b54502bSHong Zhang 
29b54502bSHong Zhang /*
39b54502bSHong Zhang    Defines a direct factorization preconditioner for any Mat implementation
49b54502bSHong Zhang    Note: this need not be consided a preconditioner since it supplies
59b54502bSHong Zhang          a direct solver.
69b54502bSHong Zhang */
7c6db04a5SJed Brown #include <../src/ksp/pc/impls/factor/factor.h>         /*I "petscpc.h" I*/
89b54502bSHong Zhang 
99b54502bSHong Zhang typedef struct {
10075768bcSBarry Smith   PC_Factor hdr;
119b54502bSHong Zhang   IS        row,col;                 /* index sets used for reordering */
129b54502bSHong Zhang } PC_Cholesky;
139b54502bSHong Zhang 
144416b707SBarry Smith static PetscErrorCode PCSetFromOptions_Cholesky(PetscOptionItems *PetscOptionsObject,PC pc)
159b54502bSHong Zhang {
169b54502bSHong Zhang   PetscFunctionBegin;
17d0609cedSBarry Smith   PetscOptionsHeadBegin(PetscOptionsObject,"Cholesky options");
189566063dSJacob Faibussowitsch   PetscCall(PCSetFromOptions_Factor(PetscOptionsObject,pc));
19d0609cedSBarry Smith   PetscOptionsHeadEnd();
209b54502bSHong Zhang   PetscFunctionReturn(0);
219b54502bSHong Zhang }
229b54502bSHong Zhang 
239b54502bSHong Zhang static PetscErrorCode PCSetUp_Cholesky(PC pc)
249b54502bSHong Zhang {
25ace3abfcSBarry Smith   PetscBool              flg;
269b54502bSHong Zhang   PC_Cholesky            *dir = (PC_Cholesky*)pc->data;
27ea799195SBarry Smith   MatSolverType          stype;
2800e125f8SBarry Smith   MatFactorError         err;
29*f023e1d5SPierre Jolivet   const char             *prefix;
309b54502bSHong Zhang 
319b54502bSHong Zhang   PetscFunctionBegin;
32*f023e1d5SPierre Jolivet   PetscCall(PCGetOptionsPrefix(pc,&prefix));
33*f023e1d5SPierre Jolivet   PetscCall(MatSetOptionsPrefix(pc->pmat,prefix));
34c6e4fdc6SHong Zhang   pc->failedreason = PC_NOERROR;
353d1c1ea0SBarry Smith   if (dir->hdr.reusefill && pc->setupcalled) ((PC_Factor*)dir)->info.fill = dir->hdr.actualfill;
369b54502bSHong Zhang 
379566063dSJacob Faibussowitsch   PetscCall(MatSetErrorIfFailure(pc->pmat,pc->erroriffailure));
383d1c1ea0SBarry Smith   if (dir->hdr.inplace) {
399b54502bSHong Zhang     if (dir->row && dir->col && (dir->row != dir->col)) {
409566063dSJacob Faibussowitsch       PetscCall(ISDestroy(&dir->row));
419b54502bSHong Zhang     }
429566063dSJacob Faibussowitsch     PetscCall(ISDestroy(&dir->col));
432c7c0729SBarry Smith     /* should only get reordering if the factor matrix uses it but cannot determine because MatGetFactor() not called */
449566063dSJacob Faibussowitsch     PetscCall(PCFactorSetDefaultOrdering_Factor(pc));
459566063dSJacob Faibussowitsch     PetscCall(MatGetOrdering(pc->pmat,((PC_Factor*)dir)->ordering,&dir->row,&dir->col));
469b54502bSHong Zhang     if (dir->col && (dir->row != dir->col)) {  /* only use row ordering for SBAIJ */
479566063dSJacob Faibussowitsch       PetscCall(ISDestroy(&dir->col));
489b54502bSHong Zhang     }
499566063dSJacob Faibussowitsch     if (dir->row) PetscCall(PetscLogObjectParent((PetscObject)pc,(PetscObject)dir->row));
509566063dSJacob Faibussowitsch     PetscCall(MatCholeskyFactor(pc->pmat,dir->row,&((PC_Factor*)dir)->info));
519566063dSJacob Faibussowitsch     PetscCall(MatFactorGetError(pc->pmat,&err));
5200e125f8SBarry Smith     if (err) { /* Factor() fails */
5300e125f8SBarry Smith       pc->failedreason = (PCFailedReason)err;
546baea169SHong Zhang       PetscFunctionReturn(0);
556baea169SHong Zhang     }
562fa5cd67SKarl Rupp 
57075768bcSBarry Smith     ((PC_Factor*)dir)->fact = pc->pmat;
589b54502bSHong Zhang   } else {
599b54502bSHong Zhang     MatInfo info;
6000e125f8SBarry Smith 
619b54502bSHong Zhang     if (!pc->setupcalled) {
62f73b0415SBarry Smith       PetscBool canuseordering;
632c7c0729SBarry Smith       if (!((PC_Factor*)dir)->fact) {
649566063dSJacob Faibussowitsch         PetscCall(MatGetFactor(pc->pmat,((PC_Factor*)dir)->solvertype,MAT_FACTOR_CHOLESKY,&((PC_Factor*)dir)->fact));
659566063dSJacob Faibussowitsch         PetscCall(PetscLogObjectParent((PetscObject)pc,(PetscObject)((PC_Factor*)dir)->fact));
662c7c0729SBarry Smith       }
679566063dSJacob Faibussowitsch       PetscCall(MatFactorGetCanUseOrdering(((PC_Factor*)dir)->fact,&canuseordering));
68f73b0415SBarry Smith       if (canuseordering) {
699566063dSJacob Faibussowitsch         PetscCall(PCFactorSetDefaultOrdering_Factor(pc));
709566063dSJacob Faibussowitsch         PetscCall(MatGetOrdering(pc->pmat,((PC_Factor*)dir)->ordering,&dir->row,&dir->col));
719bfd6278SHong Zhang         /* check if dir->row == dir->col */
724ac6704cSBarry Smith         if (dir->row) {
739566063dSJacob Faibussowitsch           PetscCall(ISEqual(dir->row,dir->col,&flg));
7428b400f6SJacob Faibussowitsch           PetscCheck(flg,PETSC_COMM_SELF,PETSC_ERR_ARG_INCOMP,"row and column permutations must be equal");
754ac6704cSBarry Smith         }
769566063dSJacob Faibussowitsch         PetscCall(ISDestroy(&dir->col)); /* only pass one ordering into CholeskyFactor */
779bfd6278SHong Zhang 
7890d69ab7SBarry Smith         flg  = PETSC_FALSE;
799566063dSJacob Faibussowitsch         PetscCall(PetscOptionsGetBool(((PetscObject)pc)->options,((PetscObject)pc)->prefix,"-pc_factor_nonzeros_along_diagonal",&flg,NULL));
809b54502bSHong Zhang         if (flg) {
819b54502bSHong Zhang           PetscReal tol = 1.e-10;
829566063dSJacob Faibussowitsch           PetscCall(PetscOptionsGetReal(((PetscObject)pc)->options,((PetscObject)pc)->prefix,"-pc_factor_nonzeros_along_diagonal",&tol,NULL));
839566063dSJacob Faibussowitsch           PetscCall(MatReorderForNonzeroDiagonal(pc->pmat,tol,dir->row,dir->row));
849b54502bSHong Zhang         }
859566063dSJacob Faibussowitsch         PetscCall(PetscLogObjectParent((PetscObject)pc,(PetscObject)dir->row));
86a1f19f5aSHong Zhang       }
879566063dSJacob Faibussowitsch       PetscCall(MatCholeskyFactorSymbolic(((PC_Factor*)dir)->fact,pc->pmat,dir->row,&((PC_Factor*)dir)->info));
889566063dSJacob Faibussowitsch       PetscCall(MatGetInfo(((PC_Factor*)dir)->fact,MAT_LOCAL,&info));
893d1c1ea0SBarry Smith       dir->hdr.actualfill = info.fill_ratio_needed;
909b54502bSHong Zhang     } else if (pc->flag != SAME_NONZERO_PATTERN) {
913d1c1ea0SBarry Smith       if (!dir->hdr.reuseordering) {
92f73b0415SBarry Smith         PetscBool canuseordering;
939566063dSJacob Faibussowitsch         PetscCall(MatDestroy(&((PC_Factor*)dir)->fact));
949566063dSJacob Faibussowitsch         PetscCall(MatGetFactor(pc->pmat,((PC_Factor*)dir)->solvertype,MAT_FACTOR_CHOLESKY,&((PC_Factor*)dir)->fact));
959566063dSJacob Faibussowitsch         PetscCall(PetscLogObjectParent((PetscObject)pc,(PetscObject)((PC_Factor*)dir)->fact));
969566063dSJacob Faibussowitsch         PetscCall(MatFactorGetCanUseOrdering(((PC_Factor*)dir)->fact,&canuseordering));
97f73b0415SBarry Smith         if (canuseordering) {
989566063dSJacob Faibussowitsch           PetscCall(ISDestroy(&dir->row));
999566063dSJacob Faibussowitsch           PetscCall(PCFactorSetDefaultOrdering_Factor(pc));
1009566063dSJacob Faibussowitsch           PetscCall(MatGetOrdering(pc->pmat,((PC_Factor*)dir)->ordering,&dir->row,&dir->col));
1019566063dSJacob Faibussowitsch           PetscCall(ISDestroy(&dir->col)); /* only use dir->row ordering in CholeskyFactor */
1029d61c4f5SHong Zhang 
10390d69ab7SBarry Smith           flg  = PETSC_FALSE;
1049566063dSJacob Faibussowitsch           PetscCall(PetscOptionsGetBool(((PetscObject)pc)->options,((PetscObject)pc)->prefix,"-pc_factor_nonzeros_along_diagonal",&flg,NULL));
1059b54502bSHong Zhang           if (flg) {
1069b54502bSHong Zhang             PetscReal tol = 1.e-10;
1079566063dSJacob Faibussowitsch             PetscCall(PetscOptionsGetReal(((PetscObject)pc)->options,((PetscObject)pc)->prefix,"-pc_factor_nonzeros_along_diagonal",&tol,NULL));
1089566063dSJacob Faibussowitsch             PetscCall(MatReorderForNonzeroDiagonal(pc->pmat,tol,dir->row,dir->row));
1099b54502bSHong Zhang           }
1109566063dSJacob Faibussowitsch           PetscCall(PetscLogObjectParent((PetscObject)pc,(PetscObject)dir->row));
1119b54502bSHong Zhang         }
1122c7c0729SBarry Smith       }
1139566063dSJacob Faibussowitsch       PetscCall(MatCholeskyFactorSymbolic(((PC_Factor*)dir)->fact,pc->pmat,dir->row,&((PC_Factor*)dir)->info));
1149566063dSJacob Faibussowitsch       PetscCall(MatGetInfo(((PC_Factor*)dir)->fact,MAT_LOCAL,&info));
1153d1c1ea0SBarry Smith       dir->hdr.actualfill = info.fill_ratio_needed;
1169566063dSJacob Faibussowitsch       PetscCall(PetscLogObjectParent((PetscObject)pc,(PetscObject)((PC_Factor*)dir)->fact));
11704545d6dSBarry Smith     } else {
1189566063dSJacob Faibussowitsch       PetscCall(MatFactorGetError(((PC_Factor*)dir)->fact,&err));
119160a8794SBarry Smith       if (err == MAT_FACTOR_NUMERIC_ZEROPIVOT) {
1209566063dSJacob Faibussowitsch         PetscCall(MatFactorClearError(((PC_Factor*)dir)->fact));
121b8b68cfdSBarry Smith         pc->failedreason = PC_NOERROR;
12204545d6dSBarry Smith       }
1239b54502bSHong Zhang     }
1249566063dSJacob Faibussowitsch     PetscCall(MatFactorGetError(((PC_Factor*)dir)->fact,&err));
12500e125f8SBarry Smith     if (err) { /* FactorSymbolic() fails */
12600e125f8SBarry Smith       pc->failedreason = (PCFailedReason)err;
1276baea169SHong Zhang       PetscFunctionReturn(0);
1286baea169SHong Zhang     }
1296baea169SHong Zhang 
1309566063dSJacob Faibussowitsch     PetscCall(MatCholeskyFactorNumeric(((PC_Factor*)dir)->fact,pc->pmat,&((PC_Factor*)dir)->info));
1319566063dSJacob Faibussowitsch     PetscCall(MatFactorGetError(((PC_Factor*)dir)->fact,&err));
13200e125f8SBarry Smith     if (err) { /* FactorNumeric() fails */
13300e125f8SBarry Smith       pc->failedreason = (PCFailedReason)err;
1346baea169SHong Zhang     }
1359b54502bSHong Zhang   }
13600c67f3bSHong Zhang 
1379566063dSJacob Faibussowitsch   PetscCall(PCFactorGetMatSolverType(pc,&stype));
13800c67f3bSHong Zhang   if (!stype) {
139ea799195SBarry Smith     MatSolverType solverpackage;
1409566063dSJacob Faibussowitsch     PetscCall(MatFactorGetSolverType(((PC_Factor*)dir)->fact,&solverpackage));
1419566063dSJacob Faibussowitsch     PetscCall(PCFactorSetMatSolverType(pc,solverpackage));
14200c67f3bSHong Zhang   }
1439b54502bSHong Zhang   PetscFunctionReturn(0);
1449b54502bSHong Zhang }
1459b54502bSHong Zhang 
14669d2c0f9SBarry Smith static PetscErrorCode PCReset_Cholesky(PC pc)
1479b54502bSHong Zhang {
1489b54502bSHong Zhang   PC_Cholesky    *dir = (PC_Cholesky*)pc->data;
1499b54502bSHong Zhang 
1509b54502bSHong Zhang   PetscFunctionBegin;
1519566063dSJacob Faibussowitsch   if (!dir->hdr.inplace && ((PC_Factor*)dir)->fact) PetscCall(MatDestroy(&((PC_Factor*)dir)->fact));
1529566063dSJacob Faibussowitsch   PetscCall(ISDestroy(&dir->row));
1539566063dSJacob Faibussowitsch   PetscCall(ISDestroy(&dir->col));
15469d2c0f9SBarry Smith   PetscFunctionReturn(0);
15569d2c0f9SBarry Smith }
15669d2c0f9SBarry Smith 
15769d2c0f9SBarry Smith static PetscErrorCode PCDestroy_Cholesky(PC pc)
15869d2c0f9SBarry Smith {
15969d2c0f9SBarry Smith   PC_Cholesky    *dir = (PC_Cholesky*)pc->data;
16069d2c0f9SBarry Smith 
16169d2c0f9SBarry Smith   PetscFunctionBegin;
1629566063dSJacob Faibussowitsch   PetscCall(PCReset_Cholesky(pc));
1639566063dSJacob Faibussowitsch   PetscCall(PetscFree(((PC_Factor*)dir)->ordering));
1649566063dSJacob Faibussowitsch   PetscCall(PetscFree(((PC_Factor*)dir)->solvertype));
1659566063dSJacob Faibussowitsch   PetscCall(PetscFree(pc->data));
1669b54502bSHong Zhang   PetscFunctionReturn(0);
1679b54502bSHong Zhang }
1689b54502bSHong Zhang 
1699b54502bSHong Zhang static PetscErrorCode PCApply_Cholesky(PC pc,Vec x,Vec y)
1709b54502bSHong Zhang {
1719b54502bSHong Zhang   PC_Cholesky    *dir = (PC_Cholesky*)pc->data;
1729b54502bSHong Zhang 
1739b54502bSHong Zhang   PetscFunctionBegin;
1743d1c1ea0SBarry Smith   if (dir->hdr.inplace) {
1759566063dSJacob Faibussowitsch     PetscCall(MatSolve(pc->pmat,x,y));
1762fa5cd67SKarl Rupp   } else {
1779566063dSJacob Faibussowitsch     PetscCall(MatSolve(((PC_Factor*)dir)->fact,x,y));
1782fa5cd67SKarl Rupp   }
1799b54502bSHong Zhang   PetscFunctionReturn(0);
1809b54502bSHong Zhang }
1819b54502bSHong Zhang 
1827b6e2003SPierre Jolivet static PetscErrorCode PCMatApply_Cholesky(PC pc,Mat X,Mat Y)
1837b6e2003SPierre Jolivet {
1847b6e2003SPierre Jolivet   PC_Cholesky    *dir = (PC_Cholesky*)pc->data;
1857b6e2003SPierre Jolivet 
1867b6e2003SPierre Jolivet   PetscFunctionBegin;
1877b6e2003SPierre Jolivet   if (dir->hdr.inplace) {
1889566063dSJacob Faibussowitsch     PetscCall(MatMatSolve(pc->pmat,X,Y));
1897b6e2003SPierre Jolivet   } else {
1909566063dSJacob Faibussowitsch     PetscCall(MatMatSolve(((PC_Factor*)dir)->fact,X,Y));
1917b6e2003SPierre Jolivet   }
1927b6e2003SPierre Jolivet   PetscFunctionReturn(0);
1937b6e2003SPierre Jolivet }
1947b6e2003SPierre Jolivet 
1953d72fe1eSJed Brown static PetscErrorCode PCApplySymmetricLeft_Cholesky(PC pc,Vec x,Vec y)
1963d72fe1eSJed Brown {
1973d72fe1eSJed Brown   PC_Cholesky    *dir = (PC_Cholesky*)pc->data;
1983d72fe1eSJed Brown 
1993d72fe1eSJed Brown   PetscFunctionBegin;
2003d72fe1eSJed Brown   if (dir->hdr.inplace) {
2019566063dSJacob Faibussowitsch     PetscCall(MatForwardSolve(pc->pmat,x,y));
2023d72fe1eSJed Brown   } else {
2039566063dSJacob Faibussowitsch     PetscCall(MatForwardSolve(((PC_Factor*)dir)->fact,x,y));
2043d72fe1eSJed Brown   }
2053d72fe1eSJed Brown   PetscFunctionReturn(0);
2063d72fe1eSJed Brown }
2073d72fe1eSJed Brown 
2083d72fe1eSJed Brown static PetscErrorCode PCApplySymmetricRight_Cholesky(PC pc,Vec x,Vec y)
2093d72fe1eSJed Brown {
2103d72fe1eSJed Brown   PC_Cholesky    *dir = (PC_Cholesky*)pc->data;
2113d72fe1eSJed Brown 
2123d72fe1eSJed Brown   PetscFunctionBegin;
2133d72fe1eSJed Brown   if (dir->hdr.inplace) {
2149566063dSJacob Faibussowitsch     PetscCall(MatBackwardSolve(pc->pmat,x,y));
2153d72fe1eSJed Brown   } else {
2169566063dSJacob Faibussowitsch     PetscCall(MatBackwardSolve(((PC_Factor*)dir)->fact,x,y));
2173d72fe1eSJed Brown   }
2183d72fe1eSJed Brown   PetscFunctionReturn(0);
2193d72fe1eSJed Brown }
2203d72fe1eSJed Brown 
2219b54502bSHong Zhang static PetscErrorCode PCApplyTranspose_Cholesky(PC pc,Vec x,Vec y)
2229b54502bSHong Zhang {
2239b54502bSHong Zhang   PC_Cholesky    *dir = (PC_Cholesky*)pc->data;
2249b54502bSHong Zhang 
2259b54502bSHong Zhang   PetscFunctionBegin;
2263d1c1ea0SBarry Smith   if (dir->hdr.inplace) {
2279566063dSJacob Faibussowitsch     PetscCall(MatSolveTranspose(pc->pmat,x,y));
2282fa5cd67SKarl Rupp   } else {
2299566063dSJacob Faibussowitsch     PetscCall(MatSolveTranspose(((PC_Factor*)dir)->fact,x,y));
2302fa5cd67SKarl Rupp   }
2319b54502bSHong Zhang   PetscFunctionReturn(0);
2329b54502bSHong Zhang }
2339b54502bSHong Zhang 
2349b54502bSHong Zhang /* -----------------------------------------------------------------------------------*/
2359b54502bSHong Zhang 
2369b54502bSHong Zhang /* -----------------------------------------------------------------------------------*/
2379b54502bSHong Zhang 
2389b54502bSHong Zhang /*@
2392401956bSBarry Smith    PCFactorSetReuseOrdering - When similar matrices are factored, this
2409b54502bSHong Zhang    causes the ordering computed in the first factor to be used for all
2419b54502bSHong Zhang    following factors.
2429b54502bSHong Zhang 
243ad4df100SBarry Smith    Logically Collective on PC
2449b54502bSHong Zhang 
2459b54502bSHong Zhang    Input Parameters:
2469b54502bSHong Zhang +  pc - the preconditioner context
2479b54502bSHong Zhang -  flag - PETSC_TRUE to reuse else PETSC_FALSE
2489b54502bSHong Zhang 
2499b54502bSHong Zhang    Options Database Key:
2502401956bSBarry Smith .  -pc_factor_reuse_ordering - Activate PCFactorSetReuseOrdering()
2519b54502bSHong Zhang 
2529b54502bSHong Zhang    Level: intermediate
2539b54502bSHong Zhang 
2542401956bSBarry Smith .seealso: PCFactorSetReuseFill()
2559b54502bSHong Zhang @*/
2567087cfbeSBarry Smith PetscErrorCode  PCFactorSetReuseOrdering(PC pc,PetscBool flag)
2579b54502bSHong Zhang {
2589b54502bSHong Zhang   PetscFunctionBegin;
2590700a824SBarry Smith   PetscValidHeaderSpecific(pc,PC_CLASSID,1);
260acfcf0e5SJed Brown   PetscValidLogicalCollectiveBool(pc,flag,2);
261cac4c232SBarry Smith   PetscTryMethod(pc,"PCFactorSetReuseOrdering_C",(PC,PetscBool),(pc,flag));
2629b54502bSHong Zhang   PetscFunctionReturn(0);
2639b54502bSHong Zhang }
2649b54502bSHong Zhang 
2659b54502bSHong Zhang /*MC
26696fc60bcSBarry Smith    PCCHOLESKY - Uses a direct solver, based on Cholesky factorization, as a preconditioner
2679b54502bSHong Zhang 
2689b54502bSHong Zhang    Options Database Keys:
2692401956bSBarry Smith +  -pc_factor_reuse_ordering - Activate PCFactorSetReuseOrdering()
2703ca39a21SBarry Smith .  -pc_factor_mat_solver_type - Actives PCFactorSetMatSolverType() to choose the direct solver, like superlu
2712401956bSBarry Smith .  -pc_factor_reuse_fill - Activates PCFactorSetReuseFill()
27255ba2a51SBarry Smith .  -pc_factor_fill <fill> - Sets fill amount
2732401956bSBarry Smith .  -pc_factor_in_place - Activates in-place factorization
274145b9266SHong Zhang -  -pc_factor_mat_ordering_type <nd,rcm,...> - Sets ordering routine
2759b54502bSHong Zhang 
27695452b02SPatrick Sanan    Notes:
27795452b02SPatrick Sanan     Not all options work for all matrix formats
2789b54502bSHong Zhang 
2799b54502bSHong Zhang    Level: beginner
2809b54502bSHong Zhang 
28195452b02SPatrick Sanan    Notes:
28295452b02SPatrick Sanan     Usually this will compute an "exact" solution in one iteration and does
2839b54502bSHong Zhang           not need a Krylov method (i.e. you can use -ksp_type preonly, or
2849b54502bSHong Zhang           KSPSetType(ksp,KSPPREONLY) for the Krylov method
2859b54502bSHong Zhang 
2869b54502bSHong Zhang .seealso:  PCCreate(), PCSetType(), PCType (for list of available types), PC,
287a4fd02acSBarry Smith            PCILU, PCLU, PCICC, PCFactorSetReuseOrdering(), PCFactorSetReuseFill(), PCFactorGetMatrix(),
288145b9266SHong Zhang            PCFactorSetFill(), PCFactorSetShiftNonzero(), PCFactorSetShiftType(), PCFactorSetShiftAmount()
2898e37d05fSBarry Smith            PCFactorSetUseInPlace(), PCFactorGetUseInPlace(), PCFactorSetMatOrderingType()
2909b54502bSHong Zhang 
2919b54502bSHong Zhang M*/
2929b54502bSHong Zhang 
2938cc058d9SJed Brown PETSC_EXTERN PetscErrorCode PCCreate_Cholesky(PC pc)
2949b54502bSHong Zhang {
2959b54502bSHong Zhang   PC_Cholesky    *dir;
2969b54502bSHong Zhang 
2979b54502bSHong Zhang   PetscFunctionBegin;
2989566063dSJacob Faibussowitsch   PetscCall(PetscNewLog(pc,&dir));
2993d1c1ea0SBarry Smith   pc->data = (void*)dir;
3009566063dSJacob Faibussowitsch   PetscCall(PCFactorInitialize(pc,MAT_FACTOR_CHOLESKY));
3012fa5cd67SKarl Rupp 
302075768bcSBarry Smith   ((PC_Factor*)dir)->info.fill  = 5.0;
3032fa5cd67SKarl Rupp 
3049b54502bSHong Zhang   pc->ops->destroy             = PCDestroy_Cholesky;
30569d2c0f9SBarry Smith   pc->ops->reset               = PCReset_Cholesky;
3069b54502bSHong Zhang   pc->ops->apply               = PCApply_Cholesky;
3077b6e2003SPierre Jolivet   pc->ops->matapply            = PCMatApply_Cholesky;
3083d72fe1eSJed Brown   pc->ops->applysymmetricleft  = PCApplySymmetricLeft_Cholesky;
3093d72fe1eSJed Brown   pc->ops->applysymmetricright = PCApplySymmetricRight_Cholesky;
3109b54502bSHong Zhang   pc->ops->applytranspose      = PCApplyTranspose_Cholesky;
3119b54502bSHong Zhang   pc->ops->setup               = PCSetUp_Cholesky;
3129b54502bSHong Zhang   pc->ops->setfromoptions      = PCSetFromOptions_Cholesky;
31392e08861SBarry Smith   pc->ops->view                = PCView_Factor;
3140a545947SLisandro Dalcin   pc->ops->applyrichardson     = NULL;
3159b54502bSHong Zhang   PetscFunctionReturn(0);
3169b54502bSHong Zhang }
317