xref: /petsc/src/ksp/pc/impls/factor/cholesky/cholesky.c (revision 3d1c1ea0033fce25879716d8a26212643c58f132)
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 
149b54502bSHong Zhang #undef __FUNCT__
159b54502bSHong Zhang #define __FUNCT__ "PCSetFromOptions_Cholesky"
164416b707SBarry Smith static PetscErrorCode PCSetFromOptions_Cholesky(PetscOptionItems *PetscOptionsObject,PC pc)
179b54502bSHong Zhang {
189b54502bSHong Zhang   PetscErrorCode ierr;
199b54502bSHong Zhang 
209b54502bSHong Zhang   PetscFunctionBegin;
21e55864a3SBarry Smith   ierr = PetscOptionsHead(PetscOptionsObject,"Cholesky options");CHKERRQ(ierr);
22e55864a3SBarry Smith   ierr = PCSetFromOptions_Factor(PetscOptionsObject,pc);CHKERRQ(ierr);
239b54502bSHong Zhang   ierr = PetscOptionsTail();CHKERRQ(ierr);
249b54502bSHong Zhang   PetscFunctionReturn(0);
259b54502bSHong Zhang }
269b54502bSHong Zhang 
279b54502bSHong Zhang #undef __FUNCT__
289b54502bSHong Zhang #define __FUNCT__ "PCView_Cholesky"
299b54502bSHong Zhang static PetscErrorCode PCView_Cholesky(PC pc,PetscViewer viewer)
309b54502bSHong Zhang {
31145b9266SHong Zhang   PC_Cholesky    *chol = (PC_Cholesky*)pc->data;
329b54502bSHong Zhang   PetscErrorCode ierr;
33ace3abfcSBarry Smith   PetscBool      iascii;
349b54502bSHong Zhang 
359b54502bSHong Zhang   PetscFunctionBegin;
36251f4c67SDmitry Karpeev   ierr = PetscObjectTypeCompare((PetscObject)viewer,PETSCVIEWERASCII,&iascii);CHKERRQ(ierr);
379b54502bSHong Zhang   if (iascii) {
38*3d1c1ea0SBarry Smith     if (chol->hdr.inplace) {
39914a5d51SHong Zhang       ierr = PetscViewerASCIIPrintf(viewer,"  Cholesky: in-place factorization\n");CHKERRQ(ierr);
40914a5d51SHong Zhang     } else {
41914a5d51SHong Zhang       ierr = PetscViewerASCIIPrintf(viewer,"  Cholesky: out-of-place factorization\n");CHKERRQ(ierr);
42145b9266SHong Zhang     }
439b54502bSHong Zhang 
44*3d1c1ea0SBarry Smith     if (chol->hdr.reusefill)    {ierr = PetscViewerASCIIPrintf(viewer,"  Reusing fill from past factorization\n");CHKERRQ(ierr);}
45*3d1c1ea0SBarry Smith     if (chol->hdr.reuseordering) {ierr = PetscViewerASCIIPrintf(viewer,"  Reusing reordering from past factorization\n");CHKERRQ(ierr);}
469b54502bSHong Zhang   }
47914a5d51SHong Zhang   ierr = PCView_Factor(pc,viewer);CHKERRQ(ierr);
489b54502bSHong Zhang   PetscFunctionReturn(0);
499b54502bSHong Zhang }
509b54502bSHong Zhang 
519b54502bSHong Zhang #undef __FUNCT__
529b54502bSHong Zhang #define __FUNCT__ "PCSetUp_Cholesky"
539b54502bSHong Zhang static PetscErrorCode PCSetUp_Cholesky(PC pc)
549b54502bSHong Zhang {
559b54502bSHong Zhang   PetscErrorCode         ierr;
56ace3abfcSBarry Smith   PetscBool              flg;
579b54502bSHong Zhang   PC_Cholesky            *dir = (PC_Cholesky*)pc->data;
5800c67f3bSHong Zhang   const MatSolverPackage stype;
5900e125f8SBarry Smith   MatFactorError         err;
609b54502bSHong Zhang 
619b54502bSHong Zhang   PetscFunctionBegin;
62*3d1c1ea0SBarry Smith   if (dir->hdr.reusefill && pc->setupcalled) ((PC_Factor*)dir)->info.fill = dir->hdr.actualfill;
639b54502bSHong Zhang 
6484d44b13SHong Zhang   ierr = MatSetErrorIfFailure(pc->pmat,pc->erroriffailure);CHKERRQ(ierr);
65*3d1c1ea0SBarry Smith   if (dir->hdr.inplace) {
669b54502bSHong Zhang     if (dir->row && dir->col && (dir->row != dir->col)) {
67fcfd50ebSBarry Smith       ierr = ISDestroy(&dir->row);CHKERRQ(ierr);
689b54502bSHong Zhang     }
69fcfd50ebSBarry Smith     ierr = ISDestroy(&dir->col);CHKERRQ(ierr);
70075768bcSBarry Smith     ierr = MatGetOrdering(pc->pmat,((PC_Factor*)dir)->ordering,&dir->row,&dir->col);CHKERRQ(ierr);
719b54502bSHong Zhang     if (dir->col && (dir->row != dir->col)) {  /* only use row ordering for SBAIJ */
72fcfd50ebSBarry Smith       ierr = ISDestroy(&dir->col);CHKERRQ(ierr);
739b54502bSHong Zhang     }
743bb1ff40SBarry Smith     if (dir->row) {ierr = PetscLogObjectParent((PetscObject)pc,(PetscObject)dir->row);CHKERRQ(ierr);}
75075768bcSBarry Smith     ierr = MatCholeskyFactor(pc->pmat,dir->row,&((PC_Factor*)dir)->info);CHKERRQ(ierr);
7600e125f8SBarry Smith     ierr = MatFactorGetError(pc->pmat,&err);CHKERRQ(ierr);
7700e125f8SBarry Smith     if (err) { /* Factor() fails */
7800e125f8SBarry Smith       pc->failedreason = (PCFailedReason)err;
796baea169SHong Zhang       PetscFunctionReturn(0);
806baea169SHong Zhang     }
812fa5cd67SKarl Rupp 
82075768bcSBarry Smith     ((PC_Factor*)dir)->fact = pc->pmat;
839b54502bSHong Zhang   } else {
849b54502bSHong Zhang     MatInfo info;
8500e125f8SBarry Smith 
869b54502bSHong Zhang     if (!pc->setupcalled) {
87075768bcSBarry Smith       ierr = MatGetOrdering(pc->pmat,((PC_Factor*)dir)->ordering,&dir->row,&dir->col);CHKERRQ(ierr);
889bfd6278SHong Zhang       /* check if dir->row == dir->col */
899bfd6278SHong Zhang       ierr = ISEqual(dir->row,dir->col,&flg);CHKERRQ(ierr);
90e32f2f54SBarry Smith       if (!flg) SETERRQ(PETSC_COMM_SELF,PETSC_ERR_ARG_INCOMP,"row and column permutations must equal");
91fcfd50ebSBarry Smith       ierr = ISDestroy(&dir->col);CHKERRQ(ierr); /* only pass one ordering into CholeskyFactor */
929bfd6278SHong Zhang 
9390d69ab7SBarry Smith       flg  = PETSC_FALSE;
94c5929fdfSBarry Smith       ierr = PetscOptionsGetBool(((PetscObject)pc)->options,((PetscObject)pc)->prefix,"-pc_factor_nonzeros_along_diagonal",&flg,NULL);CHKERRQ(ierr);
959b54502bSHong Zhang       if (flg) {
969b54502bSHong Zhang         PetscReal tol = 1.e-10;
97c5929fdfSBarry Smith         ierr = PetscOptionsGetReal(((PetscObject)pc)->options,((PetscObject)pc)->prefix,"-pc_factor_nonzeros_along_diagonal",&tol,NULL);CHKERRQ(ierr);
989b54502bSHong Zhang         ierr = MatReorderForNonzeroDiagonal(pc->pmat,tol,dir->row,dir->row);CHKERRQ(ierr);
999b54502bSHong Zhang       }
1003bb1ff40SBarry Smith       if (dir->row) {ierr = PetscLogObjectParent((PetscObject)pc,(PetscObject)dir->row);CHKERRQ(ierr);}
101d09a07f4SBarry Smith       if (!((PC_Factor*)dir)->fact) {
102075768bcSBarry Smith         ierr = MatGetFactor(pc->pmat,((PC_Factor*)dir)->solvertype,MAT_FACTOR_CHOLESKY,&((PC_Factor*)dir)->fact);CHKERRQ(ierr);
103a1f19f5aSHong Zhang       }
104075768bcSBarry Smith       ierr                = MatCholeskyFactorSymbolic(((PC_Factor*)dir)->fact,pc->pmat,dir->row,&((PC_Factor*)dir)->info);CHKERRQ(ierr);
105075768bcSBarry Smith       ierr                = MatGetInfo(((PC_Factor*)dir)->fact,MAT_LOCAL,&info);CHKERRQ(ierr);
106*3d1c1ea0SBarry Smith       dir->hdr.actualfill = info.fill_ratio_needed;
1073bb1ff40SBarry Smith       ierr                = PetscLogObjectParent((PetscObject)pc,(PetscObject)((PC_Factor*)dir)->fact);CHKERRQ(ierr);
1089b54502bSHong Zhang     } else if (pc->flag != SAME_NONZERO_PATTERN) {
109*3d1c1ea0SBarry Smith       if (!dir->hdr.reuseordering) {
110fcfd50ebSBarry Smith         ierr = ISDestroy(&dir->row);CHKERRQ(ierr);
111075768bcSBarry Smith         ierr = MatGetOrdering(pc->pmat,((PC_Factor*)dir)->ordering,&dir->row,&dir->col);CHKERRQ(ierr);
1129d61c4f5SHong Zhang         ierr = ISDestroy(&dir->col);CHKERRQ(ierr); /* only use dir->row ordering in CholeskyFactor */
1139d61c4f5SHong Zhang 
11490d69ab7SBarry Smith         flg  = PETSC_FALSE;
115c5929fdfSBarry Smith         ierr = PetscOptionsGetBool(((PetscObject)pc)->options,((PetscObject)pc)->prefix,"-pc_factor_nonzeros_along_diagonal",&flg,NULL);CHKERRQ(ierr);
1169b54502bSHong Zhang         if (flg) {
1179b54502bSHong Zhang           PetscReal tol = 1.e-10;
118c5929fdfSBarry Smith           ierr = PetscOptionsGetReal(((PetscObject)pc)->options,((PetscObject)pc)->prefix,"-pc_factor_nonzeros_along_diagonal",&tol,NULL);CHKERRQ(ierr);
1199b54502bSHong Zhang           ierr = MatReorderForNonzeroDiagonal(pc->pmat,tol,dir->row,dir->row);CHKERRQ(ierr);
1209b54502bSHong Zhang         }
1213bb1ff40SBarry Smith         if (dir->row) {ierr = PetscLogObjectParent((PetscObject)pc,(PetscObject)dir->row);CHKERRQ(ierr);}
1229b54502bSHong Zhang       }
1236bf464f9SBarry Smith       ierr                = MatDestroy(&((PC_Factor*)dir)->fact);CHKERRQ(ierr);
124075768bcSBarry Smith       ierr                = MatGetFactor(pc->pmat,((PC_Factor*)dir)->solvertype,MAT_FACTOR_CHOLESKY,&((PC_Factor*)dir)->fact);CHKERRQ(ierr);
125075768bcSBarry Smith       ierr                = MatCholeskyFactorSymbolic(((PC_Factor*)dir)->fact,pc->pmat,dir->row,&((PC_Factor*)dir)->info);CHKERRQ(ierr);
126075768bcSBarry Smith       ierr                = MatGetInfo(((PC_Factor*)dir)->fact,MAT_LOCAL,&info);CHKERRQ(ierr);
127*3d1c1ea0SBarry Smith       dir->hdr.actualfill = info.fill_ratio_needed;
1283bb1ff40SBarry Smith       ierr                = PetscLogObjectParent((PetscObject)pc,(PetscObject)((PC_Factor*)dir)->fact);CHKERRQ(ierr);
12904545d6dSBarry Smith     } else {
130b8b68cfdSBarry Smith       ierr = MatFactorGetError(((PC_Factor*)dir)->fact,&err);CHKERRQ(ierr);
131160a8794SBarry Smith       if (err == MAT_FACTOR_NUMERIC_ZEROPIVOT) {
132b8b68cfdSBarry Smith         ierr = MatFactorClearError(((PC_Factor*)dir)->fact);CHKERRQ(ierr);
133b8b68cfdSBarry Smith         pc->failedreason = PC_NOERROR;
13404545d6dSBarry Smith       }
1359b54502bSHong Zhang     }
13600e125f8SBarry Smith     ierr = MatFactorGetError(((PC_Factor*)dir)->fact,&err);CHKERRQ(ierr);
13700e125f8SBarry Smith     if (err) { /* FactorSymbolic() fails */
13800e125f8SBarry Smith       pc->failedreason = (PCFailedReason)err;
1396baea169SHong Zhang       PetscFunctionReturn(0);
1406baea169SHong Zhang     }
1416baea169SHong Zhang 
142075768bcSBarry Smith     ierr = MatCholeskyFactorNumeric(((PC_Factor*)dir)->fact,pc->pmat,&((PC_Factor*)dir)->info);CHKERRQ(ierr);
14300e125f8SBarry Smith     ierr = MatFactorGetError(((PC_Factor*)dir)->fact,&err);CHKERRQ(ierr);
14400e125f8SBarry Smith     if (err) { /* FactorNumeric() fails */
14500e125f8SBarry Smith       pc->failedreason = (PCFailedReason)err;
1466baea169SHong Zhang     }
1479b54502bSHong Zhang   }
14800c67f3bSHong Zhang 
14900c67f3bSHong Zhang   ierr = PCFactorGetMatSolverPackage(pc,&stype);CHKERRQ(ierr);
15000c67f3bSHong Zhang   if (!stype) {
15100e125f8SBarry Smith     const MatSolverPackage solverpackage;
15200e125f8SBarry Smith     ierr = MatFactorGetSolverPackage(((PC_Factor*)dir)->fact,&solverpackage);CHKERRQ(ierr);
15300e125f8SBarry Smith     ierr = PCFactorSetMatSolverPackage(pc,solverpackage);CHKERRQ(ierr);
15400c67f3bSHong Zhang   }
1559b54502bSHong Zhang   PetscFunctionReturn(0);
1569b54502bSHong Zhang }
1579b54502bSHong Zhang 
1589b54502bSHong Zhang #undef __FUNCT__
15969d2c0f9SBarry Smith #define __FUNCT__ "PCReset_Cholesky"
16069d2c0f9SBarry Smith static PetscErrorCode PCReset_Cholesky(PC pc)
1619b54502bSHong Zhang {
1629b54502bSHong Zhang   PC_Cholesky    *dir = (PC_Cholesky*)pc->data;
1639b54502bSHong Zhang   PetscErrorCode ierr;
1649b54502bSHong Zhang 
1659b54502bSHong Zhang   PetscFunctionBegin;
166*3d1c1ea0SBarry Smith   if (!dir->hdr.inplace && ((PC_Factor*)dir)->fact) {ierr = MatDestroy(&((PC_Factor*)dir)->fact);CHKERRQ(ierr);}
167fcfd50ebSBarry Smith   ierr = ISDestroy(&dir->row);CHKERRQ(ierr);
168fcfd50ebSBarry Smith   ierr = ISDestroy(&dir->col);CHKERRQ(ierr);
16969d2c0f9SBarry Smith   PetscFunctionReturn(0);
17069d2c0f9SBarry Smith }
17169d2c0f9SBarry Smith 
17269d2c0f9SBarry Smith #undef __FUNCT__
17369d2c0f9SBarry Smith #define __FUNCT__ "PCDestroy_Cholesky"
17469d2c0f9SBarry Smith static PetscErrorCode PCDestroy_Cholesky(PC pc)
17569d2c0f9SBarry Smith {
17669d2c0f9SBarry Smith   PC_Cholesky    *dir = (PC_Cholesky*)pc->data;
17769d2c0f9SBarry Smith   PetscErrorCode ierr;
17869d2c0f9SBarry Smith 
17969d2c0f9SBarry Smith   PetscFunctionBegin;
18069d2c0f9SBarry Smith   ierr = PCReset_Cholesky(pc);CHKERRQ(ierr);
181503cfb0cSBarry Smith   ierr = PetscFree(((PC_Factor*)dir)->ordering);CHKERRQ(ierr);
182503cfb0cSBarry Smith   ierr = PetscFree(((PC_Factor*)dir)->solvertype);CHKERRQ(ierr);
183c31cb41cSBarry Smith   ierr = PetscFree(pc->data);CHKERRQ(ierr);
1849b54502bSHong Zhang   PetscFunctionReturn(0);
1859b54502bSHong Zhang }
1869b54502bSHong Zhang 
1879b54502bSHong Zhang #undef __FUNCT__
1889b54502bSHong Zhang #define __FUNCT__ "PCApply_Cholesky"
1899b54502bSHong Zhang static PetscErrorCode PCApply_Cholesky(PC pc,Vec x,Vec y)
1909b54502bSHong Zhang {
1919b54502bSHong Zhang   PC_Cholesky    *dir = (PC_Cholesky*)pc->data;
1929b54502bSHong Zhang   PetscErrorCode ierr;
1939b54502bSHong Zhang 
1949b54502bSHong Zhang   PetscFunctionBegin;
195*3d1c1ea0SBarry Smith   if (dir->hdr.inplace) {
1962fa5cd67SKarl Rupp     ierr = MatSolve(pc->pmat,x,y);CHKERRQ(ierr);
1972fa5cd67SKarl Rupp   } else {
1982fa5cd67SKarl Rupp     ierr = MatSolve(((PC_Factor*)dir)->fact,x,y);CHKERRQ(ierr);
1992fa5cd67SKarl Rupp   }
2009b54502bSHong Zhang   PetscFunctionReturn(0);
2019b54502bSHong Zhang }
2029b54502bSHong Zhang 
2039b54502bSHong Zhang #undef __FUNCT__
2049b54502bSHong Zhang #define __FUNCT__ "PCApplyTranspose_Cholesky"
2059b54502bSHong Zhang static PetscErrorCode PCApplyTranspose_Cholesky(PC pc,Vec x,Vec y)
2069b54502bSHong Zhang {
2079b54502bSHong Zhang   PC_Cholesky    *dir = (PC_Cholesky*)pc->data;
2089b54502bSHong Zhang   PetscErrorCode ierr;
2099b54502bSHong Zhang 
2109b54502bSHong Zhang   PetscFunctionBegin;
211*3d1c1ea0SBarry Smith   if (dir->hdr.inplace) {
2122fa5cd67SKarl Rupp     ierr = MatSolveTranspose(pc->pmat,x,y);CHKERRQ(ierr);
2132fa5cd67SKarl Rupp   } else {
2142fa5cd67SKarl Rupp     ierr = MatSolveTranspose(((PC_Factor*)dir)->fact,x,y);CHKERRQ(ierr);
2152fa5cd67SKarl Rupp   }
2169b54502bSHong Zhang   PetscFunctionReturn(0);
2179b54502bSHong Zhang }
2189b54502bSHong Zhang 
2199b54502bSHong Zhang /* -----------------------------------------------------------------------------------*/
2209b54502bSHong Zhang 
2219b54502bSHong Zhang /* -----------------------------------------------------------------------------------*/
2229b54502bSHong Zhang 
2239b54502bSHong Zhang #undef __FUNCT__
2242401956bSBarry Smith #define __FUNCT__ "PCFactorSetReuseOrdering"
2259b54502bSHong Zhang /*@
2262401956bSBarry Smith    PCFactorSetReuseOrdering - When similar matrices are factored, this
2279b54502bSHong Zhang    causes the ordering computed in the first factor to be used for all
2289b54502bSHong Zhang    following factors.
2299b54502bSHong Zhang 
230ad4df100SBarry Smith    Logically Collective on PC
2319b54502bSHong Zhang 
2329b54502bSHong Zhang    Input Parameters:
2339b54502bSHong Zhang +  pc - the preconditioner context
2349b54502bSHong Zhang -  flag - PETSC_TRUE to reuse else PETSC_FALSE
2359b54502bSHong Zhang 
2369b54502bSHong Zhang    Options Database Key:
2372401956bSBarry Smith .  -pc_factor_reuse_ordering - Activate PCFactorSetReuseOrdering()
2389b54502bSHong Zhang 
2399b54502bSHong Zhang    Level: intermediate
2409b54502bSHong Zhang 
2419b54502bSHong Zhang .keywords: PC, levels, reordering, factorization, incomplete, LU
2429b54502bSHong Zhang 
2432401956bSBarry Smith .seealso: PCFactorSetReuseFill()
2449b54502bSHong Zhang @*/
2457087cfbeSBarry Smith PetscErrorCode  PCFactorSetReuseOrdering(PC pc,PetscBool flag)
2469b54502bSHong Zhang {
2474ac538c5SBarry Smith   PetscErrorCode ierr;
2489b54502bSHong Zhang 
2499b54502bSHong Zhang   PetscFunctionBegin;
2500700a824SBarry Smith   PetscValidHeaderSpecific(pc,PC_CLASSID,1);
251acfcf0e5SJed Brown   PetscValidLogicalCollectiveBool(pc,flag,2);
2524ac538c5SBarry Smith   ierr = PetscTryMethod(pc,"PCFactorSetReuseOrdering_C",(PC,PetscBool),(pc,flag));CHKERRQ(ierr);
2539b54502bSHong Zhang   PetscFunctionReturn(0);
2549b54502bSHong Zhang }
2559b54502bSHong Zhang 
2569b54502bSHong Zhang /*MC
25796fc60bcSBarry Smith    PCCHOLESKY - Uses a direct solver, based on Cholesky factorization, as a preconditioner
2589b54502bSHong Zhang 
2599b54502bSHong Zhang    Options Database Keys:
2602401956bSBarry Smith +  -pc_factor_reuse_ordering - Activate PCFactorSetReuseOrdering()
261f60c3dc2SHong Zhang .  -pc_factor_mat_solver_package - Actives PCFactorSetMatSolverPackage() to choose the direct solver, like superlu
2622401956bSBarry Smith .  -pc_factor_reuse_fill - Activates PCFactorSetReuseFill()
26355ba2a51SBarry Smith .  -pc_factor_fill <fill> - Sets fill amount
2642401956bSBarry Smith .  -pc_factor_in_place - Activates in-place factorization
265145b9266SHong Zhang -  -pc_factor_mat_ordering_type <nd,rcm,...> - Sets ordering routine
2669b54502bSHong Zhang 
2679b54502bSHong Zhang    Notes: Not all options work for all matrix formats
2689b54502bSHong Zhang 
2699b54502bSHong Zhang    Level: beginner
2709b54502bSHong Zhang 
2719b54502bSHong Zhang    Concepts: Cholesky factorization, direct solver
2729b54502bSHong Zhang 
2739b54502bSHong Zhang    Notes: Usually this will compute an "exact" solution in one iteration and does
2749b54502bSHong Zhang           not need a Krylov method (i.e. you can use -ksp_type preonly, or
2759b54502bSHong Zhang           KSPSetType(ksp,KSPPREONLY) for the Krylov method
2769b54502bSHong Zhang 
2779b54502bSHong Zhang .seealso:  PCCreate(), PCSetType(), PCType (for list of available types), PC,
278a4fd02acSBarry Smith            PCILU, PCLU, PCICC, PCFactorSetReuseOrdering(), PCFactorSetReuseFill(), PCFactorGetMatrix(),
279145b9266SHong Zhang            PCFactorSetFill(), PCFactorSetShiftNonzero(), PCFactorSetShiftType(), PCFactorSetShiftAmount()
2808e37d05fSBarry Smith            PCFactorSetUseInPlace(), PCFactorGetUseInPlace(), PCFactorSetMatOrderingType()
2819b54502bSHong Zhang 
2829b54502bSHong Zhang M*/
2839b54502bSHong Zhang 
2849b54502bSHong Zhang #undef __FUNCT__
2859b54502bSHong Zhang #define __FUNCT__ "PCCreate_Cholesky"
2868cc058d9SJed Brown PETSC_EXTERN PetscErrorCode PCCreate_Cholesky(PC pc)
2879b54502bSHong Zhang {
2889b54502bSHong Zhang   PetscErrorCode ierr;
2899b54502bSHong Zhang   PC_Cholesky    *dir;
2909b54502bSHong Zhang 
2919b54502bSHong Zhang   PetscFunctionBegin;
292b00a9115SJed Brown   ierr     = PetscNewLog(pc,&dir);CHKERRQ(ierr);
293*3d1c1ea0SBarry Smith   pc->data = (void*)dir;
294*3d1c1ea0SBarry Smith   ierr     = PCFactorInitialize(pc);CHKERRQ(ierr);
2952fa5cd67SKarl Rupp 
296879e8a4dSBarry Smith   ((PC_Factor*)dir)->factortype         = MAT_FACTOR_CHOLESKY;
297075768bcSBarry Smith   ((PC_Factor*)dir)->info.fill          = 5.0;
2982fa5cd67SKarl Rupp 
2999b54502bSHong Zhang   dir->col = 0;
3009b54502bSHong Zhang   dir->row = 0;
3012fa5cd67SKarl Rupp 
30219fd82e9SBarry Smith   ierr = PetscStrallocpy(MATORDERINGNATURAL,(char**)&((PC_Factor*)dir)->ordering);CHKERRQ(ierr);
3039b54502bSHong Zhang 
3049b54502bSHong Zhang   pc->ops->destroy           = PCDestroy_Cholesky;
30569d2c0f9SBarry Smith   pc->ops->reset             = PCReset_Cholesky;
3069b54502bSHong Zhang   pc->ops->apply             = PCApply_Cholesky;
3079b54502bSHong Zhang   pc->ops->applytranspose    = PCApplyTranspose_Cholesky;
3089b54502bSHong Zhang   pc->ops->setup             = PCSetUp_Cholesky;
3099b54502bSHong Zhang   pc->ops->setfromoptions    = PCSetFromOptions_Cholesky;
3109b54502bSHong Zhang   pc->ops->view              = PCView_Cholesky;
3119b54502bSHong Zhang   pc->ops->applyrichardson   = 0;
3129b54502bSHong Zhang   PetscFunctionReturn(0);
3139b54502bSHong Zhang }
314