xref: /petsc/src/ksp/pc/impls/factor/cholesky/cholesky.c (revision 9b54502bff450e1352e581e897e40ddb4a064c7d)
1*9b54502bSHong Zhang 
2*9b54502bSHong Zhang /*
3*9b54502bSHong Zhang    Defines a direct factorization preconditioner for any Mat implementation
4*9b54502bSHong Zhang    Note: this need not be consided a preconditioner since it supplies
5*9b54502bSHong Zhang          a direct solver.
6*9b54502bSHong Zhang */
7*9b54502bSHong Zhang #include "src/ksp/pc/pcimpl.h"                /*I "petscpc.h" I*/
8*9b54502bSHong Zhang 
9*9b54502bSHong Zhang typedef struct {
10*9b54502bSHong Zhang   Mat             fact;             /* factored matrix */
11*9b54502bSHong Zhang   PetscReal       actualfill;       /* actual fill in factor */
12*9b54502bSHong Zhang   PetscTruth      inplace;          /* flag indicating in-place factorization */
13*9b54502bSHong Zhang   IS              row,col;          /* index sets used for reordering */
14*9b54502bSHong Zhang   MatOrderingType ordering;         /* matrix ordering */
15*9b54502bSHong Zhang   PetscTruth      reuseordering;    /* reuses previous reordering computed */
16*9b54502bSHong Zhang   PetscTruth      reusefill;        /* reuse fill from previous Cholesky */
17*9b54502bSHong Zhang   MatFactorInfo   info;
18*9b54502bSHong Zhang } PC_Cholesky;
19*9b54502bSHong Zhang 
20*9b54502bSHong Zhang EXTERN_C_BEGIN
21*9b54502bSHong Zhang #undef __FUNCT__
22*9b54502bSHong Zhang #define __FUNCT__ "PCCholeskySetReuseOrdering_Cholesky"
23*9b54502bSHong Zhang PetscErrorCode PCCholeskySetReuseOrdering_Cholesky(PC pc,PetscTruth flag)
24*9b54502bSHong Zhang {
25*9b54502bSHong Zhang   PC_Cholesky *lu;
26*9b54502bSHong Zhang 
27*9b54502bSHong Zhang   PetscFunctionBegin;
28*9b54502bSHong Zhang   lu               = (PC_Cholesky*)pc->data;
29*9b54502bSHong Zhang   lu->reuseordering = flag;
30*9b54502bSHong Zhang   PetscFunctionReturn(0);
31*9b54502bSHong Zhang }
32*9b54502bSHong Zhang EXTERN_C_END
33*9b54502bSHong Zhang 
34*9b54502bSHong Zhang EXTERN_C_BEGIN
35*9b54502bSHong Zhang #undef __FUNCT__
36*9b54502bSHong Zhang #define __FUNCT__ "PCCholeskySetReuseFill_Cholesky"
37*9b54502bSHong Zhang PetscErrorCode PCCholeskySetReuseFill_Cholesky(PC pc,PetscTruth flag)
38*9b54502bSHong Zhang {
39*9b54502bSHong Zhang   PC_Cholesky *lu;
40*9b54502bSHong Zhang 
41*9b54502bSHong Zhang   PetscFunctionBegin;
42*9b54502bSHong Zhang   lu = (PC_Cholesky*)pc->data;
43*9b54502bSHong Zhang   lu->reusefill = flag;
44*9b54502bSHong Zhang   PetscFunctionReturn(0);
45*9b54502bSHong Zhang }
46*9b54502bSHong Zhang EXTERN_C_END
47*9b54502bSHong Zhang 
48*9b54502bSHong Zhang #undef __FUNCT__
49*9b54502bSHong Zhang #define __FUNCT__ "PCSetFromOptions_Cholesky"
50*9b54502bSHong Zhang static PetscErrorCode PCSetFromOptions_Cholesky(PC pc)
51*9b54502bSHong Zhang {
52*9b54502bSHong Zhang   PC_Cholesky    *lu = (PC_Cholesky*)pc->data;
53*9b54502bSHong Zhang   PetscErrorCode ierr;
54*9b54502bSHong Zhang   PetscTruth     flg;
55*9b54502bSHong Zhang   char           tname[256];
56*9b54502bSHong Zhang   PetscFList     ordlist;
57*9b54502bSHong Zhang 
58*9b54502bSHong Zhang   PetscFunctionBegin;
59*9b54502bSHong Zhang   ierr = MatOrderingRegisterAll(PETSC_NULL);CHKERRQ(ierr);
60*9b54502bSHong Zhang   ierr = PetscOptionsHead("Cholesky options");CHKERRQ(ierr);
61*9b54502bSHong Zhang   ierr = PetscOptionsName("-pc_cholesky_in_place","Form Cholesky in the same memory as the matrix","PCCholeskySetUseInPlace",&flg);CHKERRQ(ierr);
62*9b54502bSHong Zhang   if (flg) {
63*9b54502bSHong Zhang     ierr = PCCholeskySetUseInPlace(pc);CHKERRQ(ierr);
64*9b54502bSHong Zhang   }
65*9b54502bSHong Zhang   ierr = PetscOptionsReal("-pc_cholesky_fill","Expected non-zeros in Cholesky/non-zeros in matrix","PCCholeskySetFill",lu->info.fill,&lu->info.fill,0);CHKERRQ(ierr);
66*9b54502bSHong Zhang 
67*9b54502bSHong Zhang   ierr = PetscOptionsName("-pc_cholesky_reuse_fill","Use fill from previous factorization","PCCholeskySetReuseFill",&flg);CHKERRQ(ierr);
68*9b54502bSHong Zhang   if (flg) {
69*9b54502bSHong Zhang     ierr = PCCholeskySetReuseFill(pc,PETSC_TRUE);CHKERRQ(ierr);
70*9b54502bSHong Zhang   }
71*9b54502bSHong Zhang   ierr = PetscOptionsName("-pc_cholesky_reuse_ordering","Reuse ordering from previous factorization","PCCholeskySetReuseOrdering",&flg);CHKERRQ(ierr);
72*9b54502bSHong Zhang   if (flg) {
73*9b54502bSHong Zhang     ierr = PCCholeskySetReuseOrdering(pc,PETSC_TRUE);CHKERRQ(ierr);
74*9b54502bSHong Zhang   }
75*9b54502bSHong Zhang 
76*9b54502bSHong Zhang   ierr = MatGetOrderingList(&ordlist);CHKERRQ(ierr);
77*9b54502bSHong Zhang   ierr = PetscOptionsList("-pc_cholesky_mat_ordering_type","Reordering to reduce nonzeros in Cholesky","PCCholeskySetMatOrdering",ordlist,lu->ordering,tname,256,&flg);CHKERRQ(ierr);
78*9b54502bSHong Zhang   if (flg) {
79*9b54502bSHong Zhang     ierr = PCCholeskySetMatOrdering(pc,tname);CHKERRQ(ierr);
80*9b54502bSHong Zhang   }
81*9b54502bSHong Zhang   ierr = PetscOptionsName("-pc_cholesky_damping","Damping added to diagonal","PCCholestkySetDamping",&flg);CHKERRQ(ierr);
82*9b54502bSHong Zhang   if (flg) {
83*9b54502bSHong Zhang     ierr = PCCholeskySetDamping(pc,(PetscReal) PETSC_DECIDE);CHKERRQ(ierr);
84*9b54502bSHong Zhang   }
85*9b54502bSHong Zhang   ierr = PetscOptionsReal("-pc_cholesky_damping","Damping added to diagonal","PCCholeskySetDamping",lu->info.damping,&lu->info.damping,0);CHKERRQ(ierr);
86*9b54502bSHong Zhang   ierr = PetscOptionsName("-pc_cholesky_shift","Manteuffel shift applied to diagonal","PCCholeskySetShift",&flg);CHKERRQ(ierr);
87*9b54502bSHong Zhang   if (flg) {
88*9b54502bSHong Zhang     ierr = PCCholeskySetShift(pc,PETSC_TRUE);CHKERRQ(ierr);
89*9b54502bSHong Zhang   }
90*9b54502bSHong Zhang 
91*9b54502bSHong Zhang   ierr = PetscOptionsTail();CHKERRQ(ierr);
92*9b54502bSHong Zhang   PetscFunctionReturn(0);
93*9b54502bSHong Zhang }
94*9b54502bSHong Zhang 
95*9b54502bSHong Zhang #undef __FUNCT__
96*9b54502bSHong Zhang #define __FUNCT__ "PCView_Cholesky"
97*9b54502bSHong Zhang static PetscErrorCode PCView_Cholesky(PC pc,PetscViewer viewer)
98*9b54502bSHong Zhang {
99*9b54502bSHong Zhang   PC_Cholesky    *lu = (PC_Cholesky*)pc->data;
100*9b54502bSHong Zhang   PetscErrorCode ierr;
101*9b54502bSHong Zhang   PetscTruth     iascii,isstring;
102*9b54502bSHong Zhang 
103*9b54502bSHong Zhang   PetscFunctionBegin;
104*9b54502bSHong Zhang   ierr = PetscTypeCompare((PetscObject)viewer,PETSC_VIEWER_ASCII,&iascii);CHKERRQ(ierr);
105*9b54502bSHong Zhang   ierr = PetscTypeCompare((PetscObject)viewer,PETSC_VIEWER_STRING,&isstring);CHKERRQ(ierr);
106*9b54502bSHong Zhang   if (iascii) {
107*9b54502bSHong Zhang     MatInfo info;
108*9b54502bSHong Zhang 
109*9b54502bSHong Zhang     if (lu->inplace) {ierr = PetscViewerASCIIPrintf(viewer,"  Cholesky: in-place factorization\n");CHKERRQ(ierr);}
110*9b54502bSHong Zhang     else             {ierr = PetscViewerASCIIPrintf(viewer,"  Cholesky: out-of-place factorization\n");CHKERRQ(ierr);}
111*9b54502bSHong Zhang     ierr = PetscViewerASCIIPrintf(viewer,"    matrix ordering: %s\n",lu->ordering);CHKERRQ(ierr);
112*9b54502bSHong Zhang     if (lu->fact) {
113*9b54502bSHong Zhang       ierr = MatGetInfo(lu->fact,MAT_LOCAL,&info);CHKERRQ(ierr);
114*9b54502bSHong Zhang       ierr = PetscViewerASCIIPrintf(viewer,"    Cholesky nonzeros %g\n",info.nz_used);CHKERRQ(ierr);
115*9b54502bSHong Zhang       ierr = PetscViewerPushFormat(viewer,PETSC_VIEWER_ASCII_FACTOR_INFO);CHKERRQ(ierr);
116*9b54502bSHong Zhang       ierr = MatView(lu->fact,viewer);CHKERRQ(ierr);
117*9b54502bSHong Zhang       ierr = PetscViewerPopFormat(viewer);CHKERRQ(ierr);
118*9b54502bSHong Zhang     }
119*9b54502bSHong Zhang     if (lu->reusefill)    {ierr = PetscViewerASCIIPrintf(viewer,"       Reusing fill from past factorization\n");CHKERRQ(ierr);}
120*9b54502bSHong Zhang     if (lu->reuseordering) {ierr = PetscViewerASCIIPrintf(viewer,"       Reusing reordering from past factorization\n");CHKERRQ(ierr);}
121*9b54502bSHong Zhang   } else if (isstring) {
122*9b54502bSHong Zhang     ierr = PetscViewerStringSPrintf(viewer," order=%s",lu->ordering);CHKERRQ(ierr);CHKERRQ(ierr);
123*9b54502bSHong Zhang   } else {
124*9b54502bSHong Zhang     SETERRQ1(PETSC_ERR_SUP,"Viewer type %s not supported for PCCholesky",((PetscObject)viewer)->type_name);
125*9b54502bSHong Zhang   }
126*9b54502bSHong Zhang   PetscFunctionReturn(0);
127*9b54502bSHong Zhang }
128*9b54502bSHong Zhang 
129*9b54502bSHong Zhang #undef __FUNCT__
130*9b54502bSHong Zhang #define __FUNCT__ "PCGetFactoredMatrix_Cholesky"
131*9b54502bSHong Zhang static PetscErrorCode PCGetFactoredMatrix_Cholesky(PC pc,Mat *mat)
132*9b54502bSHong Zhang {
133*9b54502bSHong Zhang   PC_Cholesky *dir = (PC_Cholesky*)pc->data;
134*9b54502bSHong Zhang 
135*9b54502bSHong Zhang   PetscFunctionBegin;
136*9b54502bSHong Zhang   if (!dir->fact) SETERRQ(PETSC_ERR_ORDER,"Matrix not yet factored; call after KSPSetUp() or PCSetUp()");
137*9b54502bSHong Zhang   *mat = dir->fact;
138*9b54502bSHong Zhang   PetscFunctionReturn(0);
139*9b54502bSHong Zhang }
140*9b54502bSHong Zhang 
141*9b54502bSHong Zhang #undef __FUNCT__
142*9b54502bSHong Zhang #define __FUNCT__ "PCSetUp_Cholesky"
143*9b54502bSHong Zhang static PetscErrorCode PCSetUp_Cholesky(PC pc)
144*9b54502bSHong Zhang {
145*9b54502bSHong Zhang   PetscErrorCode ierr;
146*9b54502bSHong Zhang   PetscTruth     flg;
147*9b54502bSHong Zhang   PC_Cholesky    *dir = (PC_Cholesky*)pc->data;
148*9b54502bSHong Zhang 
149*9b54502bSHong Zhang   PetscFunctionBegin;
150*9b54502bSHong Zhang   if (dir->reusefill && pc->setupcalled) dir->info.fill = dir->actualfill;
151*9b54502bSHong Zhang 
152*9b54502bSHong Zhang   if (dir->inplace) {
153*9b54502bSHong Zhang     if (dir->row && dir->col && (dir->row != dir->col)) {
154*9b54502bSHong Zhang       ierr = ISDestroy(dir->row);CHKERRQ(ierr);
155*9b54502bSHong Zhang       dir->row = 0;
156*9b54502bSHong Zhang     }
157*9b54502bSHong Zhang     if (dir->col) {
158*9b54502bSHong Zhang       ierr = ISDestroy(dir->col);CHKERRQ(ierr);
159*9b54502bSHong Zhang       dir->col = 0;
160*9b54502bSHong Zhang     }
161*9b54502bSHong Zhang     ierr = MatGetOrdering(pc->pmat,dir->ordering,&dir->row,&dir->col);CHKERRQ(ierr);
162*9b54502bSHong Zhang     if (dir->col && (dir->row != dir->col)) {  /* only use row ordering for SBAIJ */
163*9b54502bSHong Zhang       ierr = ISDestroy(dir->col);CHKERRQ(ierr);
164*9b54502bSHong Zhang       dir->col=0;
165*9b54502bSHong Zhang     }
166*9b54502bSHong Zhang     if (dir->row) {PetscLogObjectParent(pc,dir->row);}
167*9b54502bSHong Zhang     ierr = MatCholeskyFactor(pc->pmat,dir->row,&dir->info);CHKERRQ(ierr);
168*9b54502bSHong Zhang     dir->fact = pc->pmat;
169*9b54502bSHong Zhang   } else {
170*9b54502bSHong Zhang     MatInfo info;
171*9b54502bSHong Zhang     if (!pc->setupcalled) {
172*9b54502bSHong Zhang       ierr = MatGetOrdering(pc->pmat,dir->ordering,&dir->row,&dir->col);CHKERRQ(ierr);
173*9b54502bSHong Zhang       if (dir->col && (dir->row != dir->col)) {  /* only use row ordering for SBAIJ */
174*9b54502bSHong Zhang         ierr = ISDestroy(dir->col);CHKERRQ(ierr);
175*9b54502bSHong Zhang         dir->col=0;
176*9b54502bSHong Zhang       }
177*9b54502bSHong Zhang       ierr = PetscOptionsHasName(pc->prefix,"-pc_cholesky_nonzeros_along_diagonal",&flg);CHKERRQ(ierr);
178*9b54502bSHong Zhang       if (flg) {
179*9b54502bSHong Zhang         PetscReal tol = 1.e-10;
180*9b54502bSHong Zhang         ierr = PetscOptionsGetReal(pc->prefix,"-pc_cholesky_nonzeros_along_diagonal",&tol,PETSC_NULL);CHKERRQ(ierr);
181*9b54502bSHong Zhang         ierr = MatReorderForNonzeroDiagonal(pc->pmat,tol,dir->row,dir->row);CHKERRQ(ierr);
182*9b54502bSHong Zhang       }
183*9b54502bSHong Zhang       if (dir->row) {PetscLogObjectParent(pc,dir->row);}
184*9b54502bSHong Zhang       ierr = MatCholeskyFactorSymbolic(pc->pmat,dir->row,&dir->info,&dir->fact);CHKERRQ(ierr);
185*9b54502bSHong Zhang       ierr = MatGetInfo(dir->fact,MAT_LOCAL,&info);CHKERRQ(ierr);
186*9b54502bSHong Zhang       dir->actualfill = info.fill_ratio_needed;
187*9b54502bSHong Zhang       PetscLogObjectParent(pc,dir->fact);
188*9b54502bSHong Zhang     } else if (pc->flag != SAME_NONZERO_PATTERN) {
189*9b54502bSHong Zhang       if (!dir->reuseordering) {
190*9b54502bSHong Zhang         if (dir->row && dir->col && (dir->row != dir->col)) {
191*9b54502bSHong Zhang           ierr = ISDestroy(dir->row);CHKERRQ(ierr);
192*9b54502bSHong Zhang           dir->row = 0;
193*9b54502bSHong Zhang         }
194*9b54502bSHong Zhang         if (dir->col) {
195*9b54502bSHong Zhang           ierr = ISDestroy(dir->col);CHKERRQ(ierr);
196*9b54502bSHong Zhang           dir->col =0;
197*9b54502bSHong Zhang         }
198*9b54502bSHong Zhang         ierr = MatGetOrdering(pc->pmat,dir->ordering,&dir->row,&dir->col);CHKERRQ(ierr);
199*9b54502bSHong Zhang         if (dir->col && (dir->row != dir->col)) {  /* only use row ordering for SBAIJ */
200*9b54502bSHong Zhang           ierr = ISDestroy(dir->col);CHKERRQ(ierr);
201*9b54502bSHong Zhang           dir->col=0;
202*9b54502bSHong Zhang         }
203*9b54502bSHong Zhang         ierr = PetscOptionsHasName(pc->prefix,"-pc_cholesky_nonzeros_along_diagonal",&flg);CHKERRQ(ierr);
204*9b54502bSHong Zhang         if (flg) {
205*9b54502bSHong Zhang           PetscReal tol = 1.e-10;
206*9b54502bSHong Zhang           ierr = PetscOptionsGetReal(pc->prefix,"-pc_cholesky_nonzeros_along_diagonal",&tol,PETSC_NULL);CHKERRQ(ierr);
207*9b54502bSHong Zhang           ierr = MatReorderForNonzeroDiagonal(pc->pmat,tol,dir->row,dir->row);CHKERRQ(ierr);
208*9b54502bSHong Zhang         }
209*9b54502bSHong Zhang         if (dir->row) {PetscLogObjectParent(pc,dir->row);}
210*9b54502bSHong Zhang       }
211*9b54502bSHong Zhang       ierr = MatDestroy(dir->fact);CHKERRQ(ierr);
212*9b54502bSHong Zhang       ierr = MatCholeskyFactorSymbolic(pc->pmat,dir->row,&dir->info,&dir->fact);CHKERRQ(ierr);
213*9b54502bSHong Zhang       ierr = MatGetInfo(dir->fact,MAT_LOCAL,&info);CHKERRQ(ierr);
214*9b54502bSHong Zhang       dir->actualfill = info.fill_ratio_needed;
215*9b54502bSHong Zhang       PetscLogObjectParent(pc,dir->fact);
216*9b54502bSHong Zhang     }
217*9b54502bSHong Zhang     ierr = MatCholeskyFactorNumeric(pc->pmat,&dir->info,&dir->fact);CHKERRQ(ierr);
218*9b54502bSHong Zhang   }
219*9b54502bSHong Zhang   PetscFunctionReturn(0);
220*9b54502bSHong Zhang }
221*9b54502bSHong Zhang 
222*9b54502bSHong Zhang #undef __FUNCT__
223*9b54502bSHong Zhang #define __FUNCT__ "PCDestroy_Cholesky"
224*9b54502bSHong Zhang static PetscErrorCode PCDestroy_Cholesky(PC pc)
225*9b54502bSHong Zhang {
226*9b54502bSHong Zhang   PC_Cholesky    *dir = (PC_Cholesky*)pc->data;
227*9b54502bSHong Zhang   PetscErrorCode ierr;
228*9b54502bSHong Zhang 
229*9b54502bSHong Zhang   PetscFunctionBegin;
230*9b54502bSHong Zhang   if (!dir->inplace && dir->fact) {ierr = MatDestroy(dir->fact);CHKERRQ(ierr);}
231*9b54502bSHong Zhang   if (dir->row) {ierr = ISDestroy(dir->row);CHKERRQ(ierr);}
232*9b54502bSHong Zhang   if (dir->col) {ierr = ISDestroy(dir->col);CHKERRQ(ierr);}
233*9b54502bSHong Zhang   ierr = PetscStrfree(dir->ordering);CHKERRQ(ierr);
234*9b54502bSHong Zhang   ierr = PetscFree(dir);CHKERRQ(ierr);
235*9b54502bSHong Zhang   PetscFunctionReturn(0);
236*9b54502bSHong Zhang }
237*9b54502bSHong Zhang 
238*9b54502bSHong Zhang #undef __FUNCT__
239*9b54502bSHong Zhang #define __FUNCT__ "PCApply_Cholesky"
240*9b54502bSHong Zhang static PetscErrorCode PCApply_Cholesky(PC pc,Vec x,Vec y)
241*9b54502bSHong Zhang {
242*9b54502bSHong Zhang   PC_Cholesky    *dir = (PC_Cholesky*)pc->data;
243*9b54502bSHong Zhang   PetscErrorCode ierr;
244*9b54502bSHong Zhang 
245*9b54502bSHong Zhang   PetscFunctionBegin;
246*9b54502bSHong Zhang   if (dir->inplace) {ierr = MatSolve(pc->pmat,x,y);CHKERRQ(ierr);}
247*9b54502bSHong Zhang   else              {ierr = MatSolve(dir->fact,x,y);CHKERRQ(ierr);}
248*9b54502bSHong Zhang   PetscFunctionReturn(0);
249*9b54502bSHong Zhang }
250*9b54502bSHong Zhang 
251*9b54502bSHong Zhang #undef __FUNCT__
252*9b54502bSHong Zhang #define __FUNCT__ "PCApplyTranspose_Cholesky"
253*9b54502bSHong Zhang static PetscErrorCode PCApplyTranspose_Cholesky(PC pc,Vec x,Vec y)
254*9b54502bSHong Zhang {
255*9b54502bSHong Zhang   PC_Cholesky    *dir = (PC_Cholesky*)pc->data;
256*9b54502bSHong Zhang   PetscErrorCode ierr;
257*9b54502bSHong Zhang 
258*9b54502bSHong Zhang   PetscFunctionBegin;
259*9b54502bSHong Zhang   if (dir->inplace) {ierr = MatSolveTranspose(pc->pmat,x,y);CHKERRQ(ierr);}
260*9b54502bSHong Zhang   else              {ierr = MatSolveTranspose(dir->fact,x,y);CHKERRQ(ierr);}
261*9b54502bSHong Zhang   PetscFunctionReturn(0);
262*9b54502bSHong Zhang }
263*9b54502bSHong Zhang 
264*9b54502bSHong Zhang /* -----------------------------------------------------------------------------------*/
265*9b54502bSHong Zhang 
266*9b54502bSHong Zhang EXTERN_C_BEGIN
267*9b54502bSHong Zhang #undef __FUNCT__
268*9b54502bSHong Zhang #define __FUNCT__ "PCCholeskySetFill_Cholesky"
269*9b54502bSHong Zhang PetscErrorCode PCCholeskySetFill_Cholesky(PC pc,PetscReal fill)
270*9b54502bSHong Zhang {
271*9b54502bSHong Zhang   PC_Cholesky *dir;
272*9b54502bSHong Zhang 
273*9b54502bSHong Zhang   PetscFunctionBegin;
274*9b54502bSHong Zhang   dir = (PC_Cholesky*)pc->data;
275*9b54502bSHong Zhang   dir->info.fill = fill;
276*9b54502bSHong Zhang   PetscFunctionReturn(0);
277*9b54502bSHong Zhang }
278*9b54502bSHong Zhang EXTERN_C_END
279*9b54502bSHong Zhang 
280*9b54502bSHong Zhang EXTERN_C_BEGIN
281*9b54502bSHong Zhang #undef __FUNCT__
282*9b54502bSHong Zhang #define __FUNCT__ "PCCholeskySetDamping_Cholesky"
283*9b54502bSHong Zhang PetscErrorCode PCCholeskySetDamping_Cholesky(PC pc,PetscReal damping)
284*9b54502bSHong Zhang {
285*9b54502bSHong Zhang   PC_Cholesky *dir;
286*9b54502bSHong Zhang 
287*9b54502bSHong Zhang   PetscFunctionBegin;
288*9b54502bSHong Zhang   dir = (PC_Cholesky*)pc->data;
289*9b54502bSHong Zhang   if (damping == (PetscReal) PETSC_DECIDE) {
290*9b54502bSHong Zhang     dir->info.damping = 1.e-12;
291*9b54502bSHong Zhang   } else {
292*9b54502bSHong Zhang     dir->info.damping = damping;
293*9b54502bSHong Zhang   }
294*9b54502bSHong Zhang   PetscFunctionReturn(0);
295*9b54502bSHong Zhang }
296*9b54502bSHong Zhang EXTERN_C_END
297*9b54502bSHong Zhang 
298*9b54502bSHong Zhang EXTERN_C_BEGIN
299*9b54502bSHong Zhang #undef __FUNCT__
300*9b54502bSHong Zhang #define __FUNCT__ "PCCholeskySetShift_Cholesky"
301*9b54502bSHong Zhang PetscErrorCode PCCholeskySetShift_Cholesky(PC pc,PetscTruth shift)
302*9b54502bSHong Zhang {
303*9b54502bSHong Zhang   PC_Cholesky *dir;
304*9b54502bSHong Zhang 
305*9b54502bSHong Zhang   PetscFunctionBegin;
306*9b54502bSHong Zhang   dir = (PC_Cholesky*)pc->data;
307*9b54502bSHong Zhang   dir->info.shift = shift;
308*9b54502bSHong Zhang   if (shift) dir->info.shift_fraction = 0.0;
309*9b54502bSHong Zhang   PetscFunctionReturn(0);
310*9b54502bSHong Zhang }
311*9b54502bSHong Zhang EXTERN_C_END
312*9b54502bSHong Zhang 
313*9b54502bSHong Zhang EXTERN_C_BEGIN
314*9b54502bSHong Zhang #undef __FUNCT__
315*9b54502bSHong Zhang #define __FUNCT__ "PCCholeskySetUseInPlace_Cholesky"
316*9b54502bSHong Zhang PetscErrorCode PCCholeskySetUseInPlace_Cholesky(PC pc)
317*9b54502bSHong Zhang {
318*9b54502bSHong Zhang   PC_Cholesky *dir;
319*9b54502bSHong Zhang 
320*9b54502bSHong Zhang   PetscFunctionBegin;
321*9b54502bSHong Zhang   dir = (PC_Cholesky*)pc->data;
322*9b54502bSHong Zhang   dir->inplace = PETSC_TRUE;
323*9b54502bSHong Zhang   PetscFunctionReturn(0);
324*9b54502bSHong Zhang }
325*9b54502bSHong Zhang EXTERN_C_END
326*9b54502bSHong Zhang 
327*9b54502bSHong Zhang EXTERN_C_BEGIN
328*9b54502bSHong Zhang #undef __FUNCT__
329*9b54502bSHong Zhang #define __FUNCT__ "PCCholeskySetMatOrdering_Cholesky"
330*9b54502bSHong Zhang PetscErrorCode PCCholeskySetMatOrdering_Cholesky(PC pc,MatOrderingType ordering)
331*9b54502bSHong Zhang {
332*9b54502bSHong Zhang   PC_Cholesky    *dir = (PC_Cholesky*)pc->data;
333*9b54502bSHong Zhang   PetscErrorCode ierr;
334*9b54502bSHong Zhang 
335*9b54502bSHong Zhang   PetscFunctionBegin;
336*9b54502bSHong Zhang   ierr = PetscStrfree(dir->ordering);CHKERRQ(ierr);
337*9b54502bSHong Zhang   ierr = PetscStrallocpy(ordering,&dir->ordering);CHKERRQ(ierr);
338*9b54502bSHong Zhang   PetscFunctionReturn(0);
339*9b54502bSHong Zhang }
340*9b54502bSHong Zhang EXTERN_C_END
341*9b54502bSHong Zhang 
342*9b54502bSHong Zhang /* -----------------------------------------------------------------------------------*/
343*9b54502bSHong Zhang 
344*9b54502bSHong Zhang #undef __FUNCT__
345*9b54502bSHong Zhang #define __FUNCT__ "PCCholeskySetReuseOrdering"
346*9b54502bSHong Zhang /*@
347*9b54502bSHong Zhang    PCCholeskySetReuseOrdering - When similar matrices are factored, this
348*9b54502bSHong Zhang    causes the ordering computed in the first factor to be used for all
349*9b54502bSHong Zhang    following factors.
350*9b54502bSHong Zhang 
351*9b54502bSHong Zhang    Collective on PC
352*9b54502bSHong Zhang 
353*9b54502bSHong Zhang    Input Parameters:
354*9b54502bSHong Zhang +  pc - the preconditioner context
355*9b54502bSHong Zhang -  flag - PETSC_TRUE to reuse else PETSC_FALSE
356*9b54502bSHong Zhang 
357*9b54502bSHong Zhang    Options Database Key:
358*9b54502bSHong Zhang .  -pc_cholesky_reuse_ordering - Activate PCCholeskySetReuseOrdering()
359*9b54502bSHong Zhang 
360*9b54502bSHong Zhang    Level: intermediate
361*9b54502bSHong Zhang 
362*9b54502bSHong Zhang .keywords: PC, levels, reordering, factorization, incomplete, LU
363*9b54502bSHong Zhang 
364*9b54502bSHong Zhang .seealso: PCCholeskySetReuseFill(), PCICholeskySetReuseOrdering(), PCICholeskyDTSetReuseFill()
365*9b54502bSHong Zhang @*/
366*9b54502bSHong Zhang PetscErrorCode PCCholeskySetReuseOrdering(PC pc,PetscTruth flag)
367*9b54502bSHong Zhang {
368*9b54502bSHong Zhang   PetscErrorCode ierr,(*f)(PC,PetscTruth);
369*9b54502bSHong Zhang 
370*9b54502bSHong Zhang   PetscFunctionBegin;
371*9b54502bSHong Zhang   PetscValidHeaderSpecific(pc,PC_COOKIE,1);
372*9b54502bSHong Zhang   ierr = PetscObjectQueryFunction((PetscObject)pc,"PCCholeskySetReuseOrdering_C",(void (**)(void))&f);CHKERRQ(ierr);
373*9b54502bSHong Zhang   if (f) {
374*9b54502bSHong Zhang     ierr = (*f)(pc,flag);CHKERRQ(ierr);
375*9b54502bSHong Zhang   }
376*9b54502bSHong Zhang   PetscFunctionReturn(0);
377*9b54502bSHong Zhang }
378*9b54502bSHong Zhang 
379*9b54502bSHong Zhang #undef __FUNCT__
380*9b54502bSHong Zhang #define __FUNCT__ "PCCholeskySetReuseFill"
381*9b54502bSHong Zhang /*@
382*9b54502bSHong Zhang    PCCholeskySetReuseFill - When matrices with same nonzero structure are Cholesky factored,
383*9b54502bSHong Zhang    this causes later ones to use the fill computed in the initial factorization.
384*9b54502bSHong Zhang 
385*9b54502bSHong Zhang    Collective on PC
386*9b54502bSHong Zhang 
387*9b54502bSHong Zhang    Input Parameters:
388*9b54502bSHong Zhang +  pc - the preconditioner context
389*9b54502bSHong Zhang -  flag - PETSC_TRUE to reuse else PETSC_FALSE
390*9b54502bSHong Zhang 
391*9b54502bSHong Zhang    Options Database Key:
392*9b54502bSHong Zhang .  -pc_cholesky_reuse_fill - Activates PCCholeskySetReuseFill()
393*9b54502bSHong Zhang 
394*9b54502bSHong Zhang    Level: intermediate
395*9b54502bSHong Zhang 
396*9b54502bSHong Zhang .keywords: PC, levels, reordering, factorization, incomplete, Cholesky
397*9b54502bSHong Zhang 
398*9b54502bSHong Zhang .seealso: PCICholeskySetReuseOrdering(), PCCholeskySetReuseOrdering(), PCICholeskyDTSetReuseFill()
399*9b54502bSHong Zhang @*/
400*9b54502bSHong Zhang PetscErrorCode PCCholeskySetReuseFill(PC pc,PetscTruth flag)
401*9b54502bSHong Zhang {
402*9b54502bSHong Zhang   PetscErrorCode ierr,(*f)(PC,PetscTruth);
403*9b54502bSHong Zhang 
404*9b54502bSHong Zhang   PetscFunctionBegin;
405*9b54502bSHong Zhang   PetscValidHeaderSpecific(pc,PC_COOKIE,2);
406*9b54502bSHong Zhang   ierr = PetscObjectQueryFunction((PetscObject)pc,"PCCholeskySetReuseFill_C",(void (**)(void))&f);CHKERRQ(ierr);
407*9b54502bSHong Zhang   if (f) {
408*9b54502bSHong Zhang     ierr = (*f)(pc,flag);CHKERRQ(ierr);
409*9b54502bSHong Zhang   }
410*9b54502bSHong Zhang   PetscFunctionReturn(0);
411*9b54502bSHong Zhang }
412*9b54502bSHong Zhang 
413*9b54502bSHong Zhang #undef __FUNCT__
414*9b54502bSHong Zhang #define __FUNCT__ "PCCholeskySetFill"
415*9b54502bSHong Zhang /*@
416*9b54502bSHong Zhang    PCCholeskySetFill - Indicates the amount of fill you expect in the factored matrix,
417*9b54502bSHong Zhang    fill = number nonzeros in factor/number nonzeros in original matrix.
418*9b54502bSHong Zhang 
419*9b54502bSHong Zhang    Collective on PC
420*9b54502bSHong Zhang 
421*9b54502bSHong Zhang    Input Parameters:
422*9b54502bSHong Zhang +  pc - the preconditioner context
423*9b54502bSHong Zhang -  fill - amount of expected fill
424*9b54502bSHong Zhang 
425*9b54502bSHong Zhang    Options Database Key:
426*9b54502bSHong Zhang .  -pc_cholesky_fill <fill> - Sets fill amount
427*9b54502bSHong Zhang 
428*9b54502bSHong Zhang    Level: intermediate
429*9b54502bSHong Zhang 
430*9b54502bSHong Zhang    Note:
431*9b54502bSHong Zhang    For sparse matrix factorizations it is difficult to predict how much
432*9b54502bSHong Zhang    fill to expect. By running with the option -log_info PETSc will print the
433*9b54502bSHong Zhang    actual amount of fill used; allowing you to set the value accurately for
434*9b54502bSHong Zhang    future runs. Default PETSc uses a value of 5.0
435*9b54502bSHong Zhang 
436*9b54502bSHong Zhang .keywords: PC, set, factorization, direct, fill
437*9b54502bSHong Zhang 
438*9b54502bSHong Zhang .seealso: PCILUSetFill()
439*9b54502bSHong Zhang @*/
440*9b54502bSHong Zhang PetscErrorCode PCCholeskySetFill(PC pc,PetscReal fill)
441*9b54502bSHong Zhang {
442*9b54502bSHong Zhang   PetscErrorCode ierr,(*f)(PC,PetscReal);
443*9b54502bSHong Zhang 
444*9b54502bSHong Zhang   PetscFunctionBegin;
445*9b54502bSHong Zhang   PetscValidHeaderSpecific(pc,PC_COOKIE,1);
446*9b54502bSHong Zhang   if (fill < 1.0) SETERRQ(PETSC_ERR_ARG_OUTOFRANGE,"Fill factor cannot be less then 1.0");
447*9b54502bSHong Zhang   ierr = PetscObjectQueryFunction((PetscObject)pc,"PCCholeskySetFill_C",(void (**)(void))&f);CHKERRQ(ierr);
448*9b54502bSHong Zhang   if (f) {
449*9b54502bSHong Zhang     ierr = (*f)(pc,fill);CHKERRQ(ierr);
450*9b54502bSHong Zhang   }
451*9b54502bSHong Zhang   PetscFunctionReturn(0);
452*9b54502bSHong Zhang }
453*9b54502bSHong Zhang 
454*9b54502bSHong Zhang #undef __FUNCT__
455*9b54502bSHong Zhang #define __FUNCT__ "PCCholeskySetDamping"
456*9b54502bSHong Zhang /*@
457*9b54502bSHong Zhang    PCCholeskySetDamping - Adds this quantity to the diagonal of the matrix during the
458*9b54502bSHong Zhang    Cholesky numerical factorization.
459*9b54502bSHong Zhang 
460*9b54502bSHong Zhang    Collective on PC
461*9b54502bSHong Zhang 
462*9b54502bSHong Zhang    Input Parameters:
463*9b54502bSHong Zhang +  pc - the preconditioner context
464*9b54502bSHong Zhang -  damping - amount of damping
465*9b54502bSHong Zhang 
466*9b54502bSHong Zhang    Options Database Key:
467*9b54502bSHong Zhang .  -pc_cholesky_damping <damping> - Sets damping amount
468*9b54502bSHong Zhang 
469*9b54502bSHong Zhang    Level: intermediate
470*9b54502bSHong Zhang 
471*9b54502bSHong Zhang .keywords: PC, set, factorization, direct, fill
472*9b54502bSHong Zhang 
473*9b54502bSHong Zhang .seealso: PCCholeskySetFill(), PCILUSetDamping()
474*9b54502bSHong Zhang @*/
475*9b54502bSHong Zhang PetscErrorCode PCCholeskySetDamping(PC pc,PetscReal damping)
476*9b54502bSHong Zhang {
477*9b54502bSHong Zhang   PetscErrorCode ierr,(*f)(PC,PetscReal);
478*9b54502bSHong Zhang 
479*9b54502bSHong Zhang   PetscFunctionBegin;
480*9b54502bSHong Zhang   PetscValidHeaderSpecific(pc,PC_COOKIE,1);
481*9b54502bSHong Zhang   ierr = PetscObjectQueryFunction((PetscObject)pc,"PCCholeskySetDamping_C",(void (**)(void))&f);CHKERRQ(ierr);
482*9b54502bSHong Zhang   if (f) {
483*9b54502bSHong Zhang     ierr = (*f)(pc,damping);CHKERRQ(ierr);
484*9b54502bSHong Zhang   }
485*9b54502bSHong Zhang   PetscFunctionReturn(0);
486*9b54502bSHong Zhang }
487*9b54502bSHong Zhang 
488*9b54502bSHong Zhang #undef __FUNCT__
489*9b54502bSHong Zhang #define __FUNCT__ "PCCholeskySetShift"
490*9b54502bSHong Zhang /*@
491*9b54502bSHong Zhang    PCCholeskySetShift - specify whether to use Manteuffel shifting of Cholesky.
492*9b54502bSHong Zhang    If an Cholesky factorisation breaks down because of nonpositive pivots,
493*9b54502bSHong Zhang    adding sufficient identity to the diagonal will remedy this.
494*9b54502bSHong Zhang    Setting this causes a bisection method to find the minimum shift that
495*9b54502bSHong Zhang    will lead to a well-defined Cholesky.
496*9b54502bSHong Zhang 
497*9b54502bSHong Zhang    Input parameters:
498*9b54502bSHong Zhang +  pc - the preconditioner context
499*9b54502bSHong Zhang -  shifting - PETSC_TRUE to set shift else PETSC_FALSE
500*9b54502bSHong Zhang 
501*9b54502bSHong Zhang    Options Database Key:
502*9b54502bSHong Zhang .  -pc_ilu_shift - Activate PCCholeskySetShift()
503*9b54502bSHong Zhang 
504*9b54502bSHong Zhang    Level: intermediate
505*9b54502bSHong Zhang 
506*9b54502bSHong Zhang .keywords: PC, indefinite, factorization, incomplete, Cholesky
507*9b54502bSHong Zhang 
508*9b54502bSHong Zhang .seealso: PCILUSetShift()
509*9b54502bSHong Zhang @*/
510*9b54502bSHong Zhang PetscErrorCode PCCholeskySetShift(PC pc,PetscTruth shift)
511*9b54502bSHong Zhang {
512*9b54502bSHong Zhang   PetscErrorCode ierr,(*f)(PC,PetscTruth);
513*9b54502bSHong Zhang 
514*9b54502bSHong Zhang   PetscFunctionBegin;
515*9b54502bSHong Zhang   PetscValidHeaderSpecific(pc,PC_COOKIE,1);
516*9b54502bSHong Zhang   ierr = PetscObjectQueryFunction((PetscObject)pc,"PCCholeskySetShift_C",(void (**)(void))&f);CHKERRQ(ierr);
517*9b54502bSHong Zhang   if (f) {
518*9b54502bSHong Zhang     ierr = (*f)(pc,shift);CHKERRQ(ierr);
519*9b54502bSHong Zhang   }
520*9b54502bSHong Zhang   PetscFunctionReturn(0);
521*9b54502bSHong Zhang }
522*9b54502bSHong Zhang 
523*9b54502bSHong Zhang #undef __FUNCT__
524*9b54502bSHong Zhang #define __FUNCT__ "PCCholeskySetUseInPlace"
525*9b54502bSHong Zhang /*@
526*9b54502bSHong Zhang    PCCholeskySetUseInPlace - Tells the system to do an in-place factorization.
527*9b54502bSHong Zhang    For dense matrices, this enables the solution of much larger problems.
528*9b54502bSHong Zhang    For sparse matrices the factorization cannot be done truly in-place
529*9b54502bSHong Zhang    so this does not save memory during the factorization, but after the matrix
530*9b54502bSHong Zhang    is factored, the original unfactored matrix is freed, thus recovering that
531*9b54502bSHong Zhang    space.
532*9b54502bSHong Zhang 
533*9b54502bSHong Zhang    Collective on PC
534*9b54502bSHong Zhang 
535*9b54502bSHong Zhang    Input Parameters:
536*9b54502bSHong Zhang .  pc - the preconditioner context
537*9b54502bSHong Zhang 
538*9b54502bSHong Zhang    Options Database Key:
539*9b54502bSHong Zhang .  -pc_cholesky_in_place - Activates in-place factorization
540*9b54502bSHong Zhang 
541*9b54502bSHong Zhang    Notes:
542*9b54502bSHong Zhang    PCCholeskySetUseInplace() can only be used with the KSP method KSPPREONLY or when
543*9b54502bSHong Zhang    a different matrix is provided for the multiply and the preconditioner in
544*9b54502bSHong Zhang    a call to KSPSetOperators().
545*9b54502bSHong Zhang    This is because the Krylov space methods require an application of the
546*9b54502bSHong Zhang    matrix multiplication, which is not possible here because the matrix has
547*9b54502bSHong Zhang    been factored in-place, replacing the original matrix.
548*9b54502bSHong Zhang 
549*9b54502bSHong Zhang    Level: intermediate
550*9b54502bSHong Zhang 
551*9b54502bSHong Zhang .keywords: PC, set, factorization, direct, inplace, in-place, Cholesky
552*9b54502bSHong Zhang 
553*9b54502bSHong Zhang .seealso: PCICholeskySetUseInPlace()
554*9b54502bSHong Zhang @*/
555*9b54502bSHong Zhang PetscErrorCode PCCholeskySetUseInPlace(PC pc)
556*9b54502bSHong Zhang {
557*9b54502bSHong Zhang   PetscErrorCode ierr,(*f)(PC);
558*9b54502bSHong Zhang 
559*9b54502bSHong Zhang   PetscFunctionBegin;
560*9b54502bSHong Zhang   PetscValidHeaderSpecific(pc,PC_COOKIE,1);
561*9b54502bSHong Zhang   ierr = PetscObjectQueryFunction((PetscObject)pc,"PCCholeskySetUseInPlace_C",(void (**)(void))&f);CHKERRQ(ierr);
562*9b54502bSHong Zhang   if (f) {
563*9b54502bSHong Zhang     ierr = (*f)(pc);CHKERRQ(ierr);
564*9b54502bSHong Zhang   }
565*9b54502bSHong Zhang   PetscFunctionReturn(0);
566*9b54502bSHong Zhang }
567*9b54502bSHong Zhang 
568*9b54502bSHong Zhang #undef __FUNCT__
569*9b54502bSHong Zhang #define __FUNCT__ "PCCholeskySetMatOrdering"
570*9b54502bSHong Zhang /*@
571*9b54502bSHong Zhang     PCCholeskySetMatOrdering - Sets the ordering routine (to reduce fill) to
572*9b54502bSHong Zhang     be used it the Cholesky factorization.
573*9b54502bSHong Zhang 
574*9b54502bSHong Zhang     Collective on PC
575*9b54502bSHong Zhang 
576*9b54502bSHong Zhang     Input Parameters:
577*9b54502bSHong Zhang +   pc - the preconditioner context
578*9b54502bSHong Zhang -   ordering - the matrix ordering name, for example, MATORDERING_ND or MATORDERING_RCM
579*9b54502bSHong Zhang 
580*9b54502bSHong Zhang     Options Database Key:
581*9b54502bSHong Zhang .   -pc_cholesky_mat_ordering_type <nd,rcm,...> - Sets ordering routine
582*9b54502bSHong Zhang 
583*9b54502bSHong Zhang     Level: intermediate
584*9b54502bSHong Zhang 
585*9b54502bSHong Zhang .seealso: PCICholeskySetMatOrdering()
586*9b54502bSHong Zhang @*/
587*9b54502bSHong Zhang PetscErrorCode PCCholeskySetMatOrdering(PC pc,MatOrderingType ordering)
588*9b54502bSHong Zhang {
589*9b54502bSHong Zhang   PetscErrorCode ierr,(*f)(PC,MatOrderingType);
590*9b54502bSHong Zhang 
591*9b54502bSHong Zhang   PetscFunctionBegin;
592*9b54502bSHong Zhang   ierr = PetscObjectQueryFunction((PetscObject)pc,"PCCholeskySetMatOrdering_C",(void (**)(void))&f);CHKERRQ(ierr);
593*9b54502bSHong Zhang   if (f) {
594*9b54502bSHong Zhang     ierr = (*f)(pc,ordering);CHKERRQ(ierr);
595*9b54502bSHong Zhang   }
596*9b54502bSHong Zhang   PetscFunctionReturn(0);
597*9b54502bSHong Zhang }
598*9b54502bSHong Zhang 
599*9b54502bSHong Zhang /*MC
600*9b54502bSHong Zhang    PCCholesky - Uses a direct solver, based on Cholesky factorization, as a preconditioner
601*9b54502bSHong Zhang 
602*9b54502bSHong Zhang    Options Database Keys:
603*9b54502bSHong Zhang +  -pc_cholesky_reuse_ordering - Activate PCLUSetReuseOrdering()
604*9b54502bSHong Zhang .  -pc_cholesky_reuse_fill - Activates PCLUSetReuseFill()
605*9b54502bSHong Zhang .  -pc_cholesky_fill <fill> - Sets fill amount
606*9b54502bSHong Zhang .  -pc_cholesky_damping <damping> - Sets damping amount
607*9b54502bSHong Zhang .  -pc_cholesky_shift - Activates Manteuffel shift
608*9b54502bSHong Zhang .  -pc_cholesky_in_place - Activates in-place factorization
609*9b54502bSHong Zhang -  -pc_cholesky_mat_ordering_type <nd,rcm,...> - Sets ordering routine
610*9b54502bSHong Zhang 
611*9b54502bSHong Zhang    Notes: Not all options work for all matrix formats
612*9b54502bSHong Zhang 
613*9b54502bSHong Zhang    Level: beginner
614*9b54502bSHong Zhang 
615*9b54502bSHong Zhang    Concepts: Cholesky factorization, direct solver
616*9b54502bSHong Zhang 
617*9b54502bSHong Zhang    Notes: Usually this will compute an "exact" solution in one iteration and does
618*9b54502bSHong Zhang           not need a Krylov method (i.e. you can use -ksp_type preonly, or
619*9b54502bSHong Zhang           KSPSetType(ksp,KSPPREONLY) for the Krylov method
620*9b54502bSHong Zhang 
621*9b54502bSHong Zhang .seealso:  PCCreate(), PCSetType(), PCType (for list of available types), PC,
622*9b54502bSHong Zhang            PCILU, PCLU, PCICC, PCCholeskySetReuseOrdering(), PCCholeskySetReuseFill(), PCGetFactoredMatrix(),
623*9b54502bSHong Zhang            PCCholeskySetFill(), PCCholeskySetDamping(), PCCholeskySetShift(),
624*9b54502bSHong Zhang 	   PCCholeskySetUseInPlace(), PCCholeskySetMatOrdering()
625*9b54502bSHong Zhang 
626*9b54502bSHong Zhang M*/
627*9b54502bSHong Zhang 
628*9b54502bSHong Zhang EXTERN_C_BEGIN
629*9b54502bSHong Zhang #undef __FUNCT__
630*9b54502bSHong Zhang #define __FUNCT__ "PCCreate_Cholesky"
631*9b54502bSHong Zhang PetscErrorCode PCCreate_Cholesky(PC pc)
632*9b54502bSHong Zhang {
633*9b54502bSHong Zhang   PetscErrorCode ierr;
634*9b54502bSHong Zhang   PC_Cholesky    *dir;
635*9b54502bSHong Zhang 
636*9b54502bSHong Zhang   PetscFunctionBegin;
637*9b54502bSHong Zhang   ierr = PetscNew(PC_Cholesky,&dir);CHKERRQ(ierr);
638*9b54502bSHong Zhang   PetscLogObjectMemory(pc,sizeof(PC_Cholesky));
639*9b54502bSHong Zhang 
640*9b54502bSHong Zhang   dir->fact                   = 0;
641*9b54502bSHong Zhang   dir->inplace                = PETSC_FALSE;
642*9b54502bSHong Zhang   ierr = MatFactorInfoInitialize(&dir->info);CHKERRQ(ierr);
643*9b54502bSHong Zhang   dir->info.fill              = 5.0;
644*9b54502bSHong Zhang   dir->info.damping           = 0.0;
645*9b54502bSHong Zhang   dir->info.shift             = PETSC_FALSE;
646*9b54502bSHong Zhang   dir->info.shift_fraction    = 0.0;
647*9b54502bSHong Zhang   dir->info.pivotinblocks     = 1.0;
648*9b54502bSHong Zhang   dir->col                    = 0;
649*9b54502bSHong Zhang   dir->row                    = 0;
650*9b54502bSHong Zhang   ierr = PetscStrallocpy(MATORDERING_NATURAL,&dir->ordering);CHKERRQ(ierr);
651*9b54502bSHong Zhang   dir->reusefill        = PETSC_FALSE;
652*9b54502bSHong Zhang   dir->reuseordering    = PETSC_FALSE;
653*9b54502bSHong Zhang   pc->data              = (void*)dir;
654*9b54502bSHong Zhang 
655*9b54502bSHong Zhang   pc->ops->destroy           = PCDestroy_Cholesky;
656*9b54502bSHong Zhang   pc->ops->apply             = PCApply_Cholesky;
657*9b54502bSHong Zhang   pc->ops->applytranspose    = PCApplyTranspose_Cholesky;
658*9b54502bSHong Zhang   pc->ops->setup             = PCSetUp_Cholesky;
659*9b54502bSHong Zhang   pc->ops->setfromoptions    = PCSetFromOptions_Cholesky;
660*9b54502bSHong Zhang   pc->ops->view              = PCView_Cholesky;
661*9b54502bSHong Zhang   pc->ops->applyrichardson   = 0;
662*9b54502bSHong Zhang   pc->ops->getfactoredmatrix = PCGetFactoredMatrix_Cholesky;
663*9b54502bSHong Zhang 
664*9b54502bSHong Zhang   ierr = PetscObjectComposeFunctionDynamic((PetscObject)pc,"PCCholeskySetFill_C","PCCholeskySetFill_Cholesky",
665*9b54502bSHong Zhang                     PCCholeskySetFill_Cholesky);CHKERRQ(ierr);
666*9b54502bSHong Zhang   ierr = PetscObjectComposeFunctionDynamic((PetscObject)pc,"PCCholeskySetDamping_C","PCCholeskySetDamping_Cholesky",
667*9b54502bSHong Zhang                     PCCholeskySetDamping_Cholesky);CHKERRQ(ierr);
668*9b54502bSHong Zhang   ierr = PetscObjectComposeFunctionDynamic((PetscObject)pc,"PCCholeskySetShift_C","PCCholeskySetShift_Cholesky",
669*9b54502bSHong Zhang                     PCCholeskySetShift_Cholesky);CHKERRQ(ierr);
670*9b54502bSHong Zhang   ierr = PetscObjectComposeFunctionDynamic((PetscObject)pc,"PCCholeskySetUseInPlace_C","PCCholeskySetUseInPlace_Cholesky",
671*9b54502bSHong Zhang                     PCCholeskySetUseInPlace_Cholesky);CHKERRQ(ierr);
672*9b54502bSHong Zhang   ierr = PetscObjectComposeFunctionDynamic((PetscObject)pc,"PCCholeskySetMatOrdering_C","PCCholeskySetMatOrdering_Cholesky",
673*9b54502bSHong Zhang                     PCCholeskySetMatOrdering_Cholesky);CHKERRQ(ierr);
674*9b54502bSHong Zhang   ierr = PetscObjectComposeFunctionDynamic((PetscObject)pc,"PCCholeskySetReuseOrdering_C","PCCholeskySetReuseOrdering_Cholesky",
675*9b54502bSHong Zhang                     PCCholeskySetReuseOrdering_Cholesky);CHKERRQ(ierr);
676*9b54502bSHong Zhang   ierr = PetscObjectComposeFunctionDynamic((PetscObject)pc,"PCCholeskySetReuseFill_C","PCCholeskySetReuseFill_Cholesky",
677*9b54502bSHong Zhang                     PCCholeskySetReuseFill_Cholesky);CHKERRQ(ierr);
678*9b54502bSHong Zhang   PetscFunctionReturn(0);
679*9b54502bSHong Zhang }
680*9b54502bSHong Zhang EXTERN_C_END
681