xref: /petsc/src/ksp/pc/impls/factor/cholesky/cholesky.c (revision 0a29876a071cef59d7981a1132723471d13956e0)
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 */
79b54502bSHong Zhang #include "src/ksp/pc/pcimpl.h"                /*I "petscpc.h" I*/
89b54502bSHong Zhang 
99b54502bSHong Zhang typedef struct {
109b54502bSHong Zhang   Mat             fact;             /* factored matrix */
119b54502bSHong Zhang   PetscReal       actualfill;       /* actual fill in factor */
129b54502bSHong Zhang   PetscTruth      inplace;          /* flag indicating in-place factorization */
139b54502bSHong Zhang   IS              row,col;          /* index sets used for reordering */
149b54502bSHong Zhang   MatOrderingType ordering;         /* matrix ordering */
159b54502bSHong Zhang   PetscTruth      reuseordering;    /* reuses previous reordering computed */
169b54502bSHong Zhang   PetscTruth      reusefill;        /* reuse fill from previous Cholesky */
179b54502bSHong Zhang   MatFactorInfo   info;
189b54502bSHong Zhang } PC_Cholesky;
199b54502bSHong Zhang 
209b54502bSHong Zhang EXTERN_C_BEGIN
219b54502bSHong Zhang #undef __FUNCT__
229b54502bSHong Zhang #define __FUNCT__ "PCCholeskySetReuseOrdering_Cholesky"
239b54502bSHong Zhang PetscErrorCode PCCholeskySetReuseOrdering_Cholesky(PC pc,PetscTruth flag)
249b54502bSHong Zhang {
259b54502bSHong Zhang   PC_Cholesky *lu;
269b54502bSHong Zhang 
279b54502bSHong Zhang   PetscFunctionBegin;
289b54502bSHong Zhang   lu               = (PC_Cholesky*)pc->data;
299b54502bSHong Zhang   lu->reuseordering = flag;
309b54502bSHong Zhang   PetscFunctionReturn(0);
319b54502bSHong Zhang }
329b54502bSHong Zhang EXTERN_C_END
339b54502bSHong Zhang 
349b54502bSHong Zhang EXTERN_C_BEGIN
359b54502bSHong Zhang #undef __FUNCT__
369b54502bSHong Zhang #define __FUNCT__ "PCCholeskySetReuseFill_Cholesky"
379b54502bSHong Zhang PetscErrorCode PCCholeskySetReuseFill_Cholesky(PC pc,PetscTruth flag)
389b54502bSHong Zhang {
399b54502bSHong Zhang   PC_Cholesky *lu;
409b54502bSHong Zhang 
419b54502bSHong Zhang   PetscFunctionBegin;
429b54502bSHong Zhang   lu = (PC_Cholesky*)pc->data;
439b54502bSHong Zhang   lu->reusefill = flag;
449b54502bSHong Zhang   PetscFunctionReturn(0);
459b54502bSHong Zhang }
469b54502bSHong Zhang EXTERN_C_END
479b54502bSHong Zhang 
489b54502bSHong Zhang #undef __FUNCT__
499b54502bSHong Zhang #define __FUNCT__ "PCSetFromOptions_Cholesky"
509b54502bSHong Zhang static PetscErrorCode PCSetFromOptions_Cholesky(PC pc)
519b54502bSHong Zhang {
529b54502bSHong Zhang   PC_Cholesky    *lu = (PC_Cholesky*)pc->data;
539b54502bSHong Zhang   PetscErrorCode ierr;
549b54502bSHong Zhang   PetscTruth     flg;
559b54502bSHong Zhang   char           tname[256];
569b54502bSHong Zhang   PetscFList     ordlist;
579b54502bSHong Zhang 
589b54502bSHong Zhang   PetscFunctionBegin;
599b54502bSHong Zhang   ierr = MatOrderingRegisterAll(PETSC_NULL);CHKERRQ(ierr);
609b54502bSHong Zhang   ierr = PetscOptionsHead("Cholesky options");CHKERRQ(ierr);
619b54502bSHong Zhang   ierr = PetscOptionsName("-pc_cholesky_in_place","Form Cholesky in the same memory as the matrix","PCCholeskySetUseInPlace",&flg);CHKERRQ(ierr);
629b54502bSHong Zhang   if (flg) {
639b54502bSHong Zhang     ierr = PCCholeskySetUseInPlace(pc);CHKERRQ(ierr);
649b54502bSHong Zhang   }
659b54502bSHong 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);
669b54502bSHong Zhang 
679b54502bSHong Zhang   ierr = PetscOptionsName("-pc_cholesky_reuse_fill","Use fill from previous factorization","PCCholeskySetReuseFill",&flg);CHKERRQ(ierr);
689b54502bSHong Zhang   if (flg) {
699b54502bSHong Zhang     ierr = PCCholeskySetReuseFill(pc,PETSC_TRUE);CHKERRQ(ierr);
709b54502bSHong Zhang   }
719b54502bSHong Zhang   ierr = PetscOptionsName("-pc_cholesky_reuse_ordering","Reuse ordering from previous factorization","PCCholeskySetReuseOrdering",&flg);CHKERRQ(ierr);
729b54502bSHong Zhang   if (flg) {
739b54502bSHong Zhang     ierr = PCCholeskySetReuseOrdering(pc,PETSC_TRUE);CHKERRQ(ierr);
749b54502bSHong Zhang   }
759b54502bSHong Zhang 
769b54502bSHong Zhang   ierr = MatGetOrderingList(&ordlist);CHKERRQ(ierr);
779b54502bSHong Zhang   ierr = PetscOptionsList("-pc_cholesky_mat_ordering_type","Reordering to reduce nonzeros in Cholesky","PCCholeskySetMatOrdering",ordlist,lu->ordering,tname,256,&flg);CHKERRQ(ierr);
789b54502bSHong Zhang   if (flg) {
799b54502bSHong Zhang     ierr = PCCholeskySetMatOrdering(pc,tname);CHKERRQ(ierr);
809b54502bSHong Zhang   }
81*0a29876aSHong Zhang   ierr = PetscOptionsName("-pc_factor_shiftnonzero","Shift added to diagonal","PCFactorSetShiftNonzero",&flg);CHKERRQ(ierr);
829b54502bSHong Zhang   if (flg) {
83*0a29876aSHong Zhang     ierr = PCFactorSetShiftNonzero((PetscReal) PETSC_DECIDE,&lu->info);CHKERRQ(ierr);
849b54502bSHong Zhang   }
85*0a29876aSHong Zhang   ierr = PetscOptionsReal("-pc_factor_shiftnonzero","Shift added to diagonal","PCFactorSetShiftNonzero",lu->info.shiftnz,&lu->info.shiftnz,0);CHKERRQ(ierr);
86*0a29876aSHong Zhang   ierr = PetscOptionsName("-pc_factor_shiftpd","Manteuffel shift applied to diagonal","PCFactorSetShiftPd",&flg);CHKERRQ(ierr);
879b54502bSHong Zhang   if (flg) {
889b54502bSHong Zhang     ierr = PCCholeskySetShift(pc,PETSC_TRUE);CHKERRQ(ierr);
899b54502bSHong Zhang   }
909b54502bSHong Zhang 
919b54502bSHong Zhang   ierr = PetscOptionsTail();CHKERRQ(ierr);
929b54502bSHong Zhang   PetscFunctionReturn(0);
939b54502bSHong Zhang }
949b54502bSHong Zhang 
959b54502bSHong Zhang #undef __FUNCT__
969b54502bSHong Zhang #define __FUNCT__ "PCView_Cholesky"
979b54502bSHong Zhang static PetscErrorCode PCView_Cholesky(PC pc,PetscViewer viewer)
989b54502bSHong Zhang {
999b54502bSHong Zhang   PC_Cholesky    *lu = (PC_Cholesky*)pc->data;
1009b54502bSHong Zhang   PetscErrorCode ierr;
1019b54502bSHong Zhang   PetscTruth     iascii,isstring;
1029b54502bSHong Zhang 
1039b54502bSHong Zhang   PetscFunctionBegin;
1049b54502bSHong Zhang   ierr = PetscTypeCompare((PetscObject)viewer,PETSC_VIEWER_ASCII,&iascii);CHKERRQ(ierr);
1059b54502bSHong Zhang   ierr = PetscTypeCompare((PetscObject)viewer,PETSC_VIEWER_STRING,&isstring);CHKERRQ(ierr);
1069b54502bSHong Zhang   if (iascii) {
1079b54502bSHong Zhang     MatInfo info;
1089b54502bSHong Zhang 
1099b54502bSHong Zhang     if (lu->inplace) {ierr = PetscViewerASCIIPrintf(viewer,"  Cholesky: in-place factorization\n");CHKERRQ(ierr);}
1109b54502bSHong Zhang     else             {ierr = PetscViewerASCIIPrintf(viewer,"  Cholesky: out-of-place factorization\n");CHKERRQ(ierr);}
1119b54502bSHong Zhang     ierr = PetscViewerASCIIPrintf(viewer,"    matrix ordering: %s\n",lu->ordering);CHKERRQ(ierr);
1129b54502bSHong Zhang     if (lu->fact) {
1139b54502bSHong Zhang       ierr = MatGetInfo(lu->fact,MAT_LOCAL,&info);CHKERRQ(ierr);
1149b54502bSHong Zhang       ierr = PetscViewerASCIIPrintf(viewer,"    Cholesky nonzeros %g\n",info.nz_used);CHKERRQ(ierr);
1159b54502bSHong Zhang       ierr = PetscViewerPushFormat(viewer,PETSC_VIEWER_ASCII_FACTOR_INFO);CHKERRQ(ierr);
1169b54502bSHong Zhang       ierr = MatView(lu->fact,viewer);CHKERRQ(ierr);
1179b54502bSHong Zhang       ierr = PetscViewerPopFormat(viewer);CHKERRQ(ierr);
1189b54502bSHong Zhang     }
1199b54502bSHong Zhang     if (lu->reusefill)    {ierr = PetscViewerASCIIPrintf(viewer,"       Reusing fill from past factorization\n");CHKERRQ(ierr);}
1209b54502bSHong Zhang     if (lu->reuseordering) {ierr = PetscViewerASCIIPrintf(viewer,"       Reusing reordering from past factorization\n");CHKERRQ(ierr);}
1219b54502bSHong Zhang   } else if (isstring) {
1229b54502bSHong Zhang     ierr = PetscViewerStringSPrintf(viewer," order=%s",lu->ordering);CHKERRQ(ierr);CHKERRQ(ierr);
1239b54502bSHong Zhang   } else {
1249b54502bSHong Zhang     SETERRQ1(PETSC_ERR_SUP,"Viewer type %s not supported for PCCholesky",((PetscObject)viewer)->type_name);
1259b54502bSHong Zhang   }
1269b54502bSHong Zhang   PetscFunctionReturn(0);
1279b54502bSHong Zhang }
1289b54502bSHong Zhang 
1299b54502bSHong Zhang #undef __FUNCT__
1309b54502bSHong Zhang #define __FUNCT__ "PCGetFactoredMatrix_Cholesky"
1319b54502bSHong Zhang static PetscErrorCode PCGetFactoredMatrix_Cholesky(PC pc,Mat *mat)
1329b54502bSHong Zhang {
1339b54502bSHong Zhang   PC_Cholesky *dir = (PC_Cholesky*)pc->data;
1349b54502bSHong Zhang 
1359b54502bSHong Zhang   PetscFunctionBegin;
1369b54502bSHong Zhang   if (!dir->fact) SETERRQ(PETSC_ERR_ORDER,"Matrix not yet factored; call after KSPSetUp() or PCSetUp()");
1379b54502bSHong Zhang   *mat = dir->fact;
1389b54502bSHong Zhang   PetscFunctionReturn(0);
1399b54502bSHong Zhang }
1409b54502bSHong Zhang 
1419b54502bSHong Zhang #undef __FUNCT__
1429b54502bSHong Zhang #define __FUNCT__ "PCSetUp_Cholesky"
1439b54502bSHong Zhang static PetscErrorCode PCSetUp_Cholesky(PC pc)
1449b54502bSHong Zhang {
1459b54502bSHong Zhang   PetscErrorCode ierr;
1469b54502bSHong Zhang   PetscTruth     flg;
1479b54502bSHong Zhang   PC_Cholesky    *dir = (PC_Cholesky*)pc->data;
1489b54502bSHong Zhang 
1499b54502bSHong Zhang   PetscFunctionBegin;
1509b54502bSHong Zhang   if (dir->reusefill && pc->setupcalled) dir->info.fill = dir->actualfill;
1519b54502bSHong Zhang 
1529b54502bSHong Zhang   if (dir->inplace) {
1539b54502bSHong Zhang     if (dir->row && dir->col && (dir->row != dir->col)) {
1549b54502bSHong Zhang       ierr = ISDestroy(dir->row);CHKERRQ(ierr);
1559b54502bSHong Zhang       dir->row = 0;
1569b54502bSHong Zhang     }
1579b54502bSHong Zhang     if (dir->col) {
1589b54502bSHong Zhang       ierr = ISDestroy(dir->col);CHKERRQ(ierr);
1599b54502bSHong Zhang       dir->col = 0;
1609b54502bSHong Zhang     }
1619b54502bSHong Zhang     ierr = MatGetOrdering(pc->pmat,dir->ordering,&dir->row,&dir->col);CHKERRQ(ierr);
1629b54502bSHong Zhang     if (dir->col && (dir->row != dir->col)) {  /* only use row ordering for SBAIJ */
1639b54502bSHong Zhang       ierr = ISDestroy(dir->col);CHKERRQ(ierr);
1649b54502bSHong Zhang       dir->col=0;
1659b54502bSHong Zhang     }
1669b54502bSHong Zhang     if (dir->row) {PetscLogObjectParent(pc,dir->row);}
1679b54502bSHong Zhang     ierr = MatCholeskyFactor(pc->pmat,dir->row,&dir->info);CHKERRQ(ierr);
1689b54502bSHong Zhang     dir->fact = pc->pmat;
1699b54502bSHong Zhang   } else {
1709b54502bSHong Zhang     MatInfo info;
1719b54502bSHong Zhang     if (!pc->setupcalled) {
1729b54502bSHong Zhang       ierr = MatGetOrdering(pc->pmat,dir->ordering,&dir->row,&dir->col);CHKERRQ(ierr);
1739b54502bSHong Zhang       if (dir->col && (dir->row != dir->col)) {  /* only use row ordering for SBAIJ */
1749b54502bSHong Zhang         ierr = ISDestroy(dir->col);CHKERRQ(ierr);
1759b54502bSHong Zhang         dir->col=0;
1769b54502bSHong Zhang       }
1779b54502bSHong Zhang       ierr = PetscOptionsHasName(pc->prefix,"-pc_cholesky_nonzeros_along_diagonal",&flg);CHKERRQ(ierr);
1789b54502bSHong Zhang       if (flg) {
1799b54502bSHong Zhang         PetscReal tol = 1.e-10;
1809b54502bSHong Zhang         ierr = PetscOptionsGetReal(pc->prefix,"-pc_cholesky_nonzeros_along_diagonal",&tol,PETSC_NULL);CHKERRQ(ierr);
1819b54502bSHong Zhang         ierr = MatReorderForNonzeroDiagonal(pc->pmat,tol,dir->row,dir->row);CHKERRQ(ierr);
1829b54502bSHong Zhang       }
1839b54502bSHong Zhang       if (dir->row) {PetscLogObjectParent(pc,dir->row);}
1849b54502bSHong Zhang       ierr = MatCholeskyFactorSymbolic(pc->pmat,dir->row,&dir->info,&dir->fact);CHKERRQ(ierr);
1859b54502bSHong Zhang       ierr = MatGetInfo(dir->fact,MAT_LOCAL,&info);CHKERRQ(ierr);
1869b54502bSHong Zhang       dir->actualfill = info.fill_ratio_needed;
1879b54502bSHong Zhang       PetscLogObjectParent(pc,dir->fact);
1889b54502bSHong Zhang     } else if (pc->flag != SAME_NONZERO_PATTERN) {
1899b54502bSHong Zhang       if (!dir->reuseordering) {
1909b54502bSHong Zhang         if (dir->row && dir->col && (dir->row != dir->col)) {
1919b54502bSHong Zhang           ierr = ISDestroy(dir->row);CHKERRQ(ierr);
1929b54502bSHong Zhang           dir->row = 0;
1939b54502bSHong Zhang         }
1949b54502bSHong Zhang         if (dir->col) {
1959b54502bSHong Zhang           ierr = ISDestroy(dir->col);CHKERRQ(ierr);
1969b54502bSHong Zhang           dir->col =0;
1979b54502bSHong Zhang         }
1989b54502bSHong Zhang         ierr = MatGetOrdering(pc->pmat,dir->ordering,&dir->row,&dir->col);CHKERRQ(ierr);
1999b54502bSHong Zhang         if (dir->col && (dir->row != dir->col)) {  /* only use row ordering for SBAIJ */
2009b54502bSHong Zhang           ierr = ISDestroy(dir->col);CHKERRQ(ierr);
2019b54502bSHong Zhang           dir->col=0;
2029b54502bSHong Zhang         }
2039b54502bSHong Zhang         ierr = PetscOptionsHasName(pc->prefix,"-pc_cholesky_nonzeros_along_diagonal",&flg);CHKERRQ(ierr);
2049b54502bSHong Zhang         if (flg) {
2059b54502bSHong Zhang           PetscReal tol = 1.e-10;
2069b54502bSHong Zhang           ierr = PetscOptionsGetReal(pc->prefix,"-pc_cholesky_nonzeros_along_diagonal",&tol,PETSC_NULL);CHKERRQ(ierr);
2079b54502bSHong Zhang           ierr = MatReorderForNonzeroDiagonal(pc->pmat,tol,dir->row,dir->row);CHKERRQ(ierr);
2089b54502bSHong Zhang         }
2099b54502bSHong Zhang         if (dir->row) {PetscLogObjectParent(pc,dir->row);}
2109b54502bSHong Zhang       }
2119b54502bSHong Zhang       ierr = MatDestroy(dir->fact);CHKERRQ(ierr);
2129b54502bSHong Zhang       ierr = MatCholeskyFactorSymbolic(pc->pmat,dir->row,&dir->info,&dir->fact);CHKERRQ(ierr);
2139b54502bSHong Zhang       ierr = MatGetInfo(dir->fact,MAT_LOCAL,&info);CHKERRQ(ierr);
2149b54502bSHong Zhang       dir->actualfill = info.fill_ratio_needed;
2159b54502bSHong Zhang       PetscLogObjectParent(pc,dir->fact);
2169b54502bSHong Zhang     }
2179b54502bSHong Zhang     ierr = MatCholeskyFactorNumeric(pc->pmat,&dir->info,&dir->fact);CHKERRQ(ierr);
2189b54502bSHong Zhang   }
2199b54502bSHong Zhang   PetscFunctionReturn(0);
2209b54502bSHong Zhang }
2219b54502bSHong Zhang 
2229b54502bSHong Zhang #undef __FUNCT__
2239b54502bSHong Zhang #define __FUNCT__ "PCDestroy_Cholesky"
2249b54502bSHong Zhang static PetscErrorCode PCDestroy_Cholesky(PC pc)
2259b54502bSHong Zhang {
2269b54502bSHong Zhang   PC_Cholesky    *dir = (PC_Cholesky*)pc->data;
2279b54502bSHong Zhang   PetscErrorCode ierr;
2289b54502bSHong Zhang 
2299b54502bSHong Zhang   PetscFunctionBegin;
2309b54502bSHong Zhang   if (!dir->inplace && dir->fact) {ierr = MatDestroy(dir->fact);CHKERRQ(ierr);}
2319b54502bSHong Zhang   if (dir->row) {ierr = ISDestroy(dir->row);CHKERRQ(ierr);}
2329b54502bSHong Zhang   if (dir->col) {ierr = ISDestroy(dir->col);CHKERRQ(ierr);}
2339b54502bSHong Zhang   ierr = PetscStrfree(dir->ordering);CHKERRQ(ierr);
2349b54502bSHong Zhang   ierr = PetscFree(dir);CHKERRQ(ierr);
2359b54502bSHong Zhang   PetscFunctionReturn(0);
2369b54502bSHong Zhang }
2379b54502bSHong Zhang 
2389b54502bSHong Zhang #undef __FUNCT__
2399b54502bSHong Zhang #define __FUNCT__ "PCApply_Cholesky"
2409b54502bSHong Zhang static PetscErrorCode PCApply_Cholesky(PC pc,Vec x,Vec y)
2419b54502bSHong Zhang {
2429b54502bSHong Zhang   PC_Cholesky    *dir = (PC_Cholesky*)pc->data;
2439b54502bSHong Zhang   PetscErrorCode ierr;
2449b54502bSHong Zhang 
2459b54502bSHong Zhang   PetscFunctionBegin;
2469b54502bSHong Zhang   if (dir->inplace) {ierr = MatSolve(pc->pmat,x,y);CHKERRQ(ierr);}
2479b54502bSHong Zhang   else              {ierr = MatSolve(dir->fact,x,y);CHKERRQ(ierr);}
2489b54502bSHong Zhang   PetscFunctionReturn(0);
2499b54502bSHong Zhang }
2509b54502bSHong Zhang 
2519b54502bSHong Zhang #undef __FUNCT__
2529b54502bSHong Zhang #define __FUNCT__ "PCApplyTranspose_Cholesky"
2539b54502bSHong Zhang static PetscErrorCode PCApplyTranspose_Cholesky(PC pc,Vec x,Vec y)
2549b54502bSHong Zhang {
2559b54502bSHong Zhang   PC_Cholesky    *dir = (PC_Cholesky*)pc->data;
2569b54502bSHong Zhang   PetscErrorCode ierr;
2579b54502bSHong Zhang 
2589b54502bSHong Zhang   PetscFunctionBegin;
2599b54502bSHong Zhang   if (dir->inplace) {ierr = MatSolveTranspose(pc->pmat,x,y);CHKERRQ(ierr);}
2609b54502bSHong Zhang   else              {ierr = MatSolveTranspose(dir->fact,x,y);CHKERRQ(ierr);}
2619b54502bSHong Zhang   PetscFunctionReturn(0);
2629b54502bSHong Zhang }
2639b54502bSHong Zhang 
2649b54502bSHong Zhang /* -----------------------------------------------------------------------------------*/
2659b54502bSHong Zhang 
2669b54502bSHong Zhang EXTERN_C_BEGIN
2679b54502bSHong Zhang #undef __FUNCT__
2689b54502bSHong Zhang #define __FUNCT__ "PCCholeskySetFill_Cholesky"
2699b54502bSHong Zhang PetscErrorCode PCCholeskySetFill_Cholesky(PC pc,PetscReal fill)
2709b54502bSHong Zhang {
2719b54502bSHong Zhang   PC_Cholesky *dir;
2729b54502bSHong Zhang 
2739b54502bSHong Zhang   PetscFunctionBegin;
2749b54502bSHong Zhang   dir = (PC_Cholesky*)pc->data;
2759b54502bSHong Zhang   dir->info.fill = fill;
2769b54502bSHong Zhang   PetscFunctionReturn(0);
2779b54502bSHong Zhang }
2789b54502bSHong Zhang EXTERN_C_END
2799b54502bSHong Zhang 
2809b54502bSHong Zhang EXTERN_C_BEGIN
2819b54502bSHong Zhang #undef __FUNCT__
2829b54502bSHong Zhang #define __FUNCT__ "PCCholeskySetDamping_Cholesky"
2839b54502bSHong Zhang PetscErrorCode PCCholeskySetDamping_Cholesky(PC pc,PetscReal damping)
2849b54502bSHong Zhang {
2859b54502bSHong Zhang   PC_Cholesky *dir;
2869b54502bSHong Zhang 
2879b54502bSHong Zhang   PetscFunctionBegin;
2889b54502bSHong Zhang   dir = (PC_Cholesky*)pc->data;
2899b54502bSHong Zhang   if (damping == (PetscReal) PETSC_DECIDE) {
290*0a29876aSHong Zhang     dir->info.shiftnz = 1.e-12;
2919b54502bSHong Zhang   } else {
292*0a29876aSHong Zhang     dir->info.shiftnz = damping;
2939b54502bSHong Zhang   }
2949b54502bSHong Zhang   PetscFunctionReturn(0);
2959b54502bSHong Zhang }
2969b54502bSHong Zhang EXTERN_C_END
2979b54502bSHong Zhang 
2989b54502bSHong Zhang EXTERN_C_BEGIN
2999b54502bSHong Zhang #undef __FUNCT__
3009b54502bSHong Zhang #define __FUNCT__ "PCCholeskySetShift_Cholesky"
3019b54502bSHong Zhang PetscErrorCode PCCholeskySetShift_Cholesky(PC pc,PetscTruth shift)
3029b54502bSHong Zhang {
3039b54502bSHong Zhang   PC_Cholesky *dir;
3049b54502bSHong Zhang 
3059b54502bSHong Zhang   PetscFunctionBegin;
3069b54502bSHong Zhang   dir = (PC_Cholesky*)pc->data;
307*0a29876aSHong Zhang   dir->info.shiftpd = shift;
3089b54502bSHong Zhang   if (shift) dir->info.shift_fraction = 0.0;
3099b54502bSHong Zhang   PetscFunctionReturn(0);
3109b54502bSHong Zhang }
3119b54502bSHong Zhang EXTERN_C_END
3129b54502bSHong Zhang 
3139b54502bSHong Zhang EXTERN_C_BEGIN
3149b54502bSHong Zhang #undef __FUNCT__
3159b54502bSHong Zhang #define __FUNCT__ "PCCholeskySetUseInPlace_Cholesky"
3169b54502bSHong Zhang PetscErrorCode PCCholeskySetUseInPlace_Cholesky(PC pc)
3179b54502bSHong Zhang {
3189b54502bSHong Zhang   PC_Cholesky *dir;
3199b54502bSHong Zhang 
3209b54502bSHong Zhang   PetscFunctionBegin;
3219b54502bSHong Zhang   dir = (PC_Cholesky*)pc->data;
3229b54502bSHong Zhang   dir->inplace = PETSC_TRUE;
3239b54502bSHong Zhang   PetscFunctionReturn(0);
3249b54502bSHong Zhang }
3259b54502bSHong Zhang EXTERN_C_END
3269b54502bSHong Zhang 
3279b54502bSHong Zhang EXTERN_C_BEGIN
3289b54502bSHong Zhang #undef __FUNCT__
3299b54502bSHong Zhang #define __FUNCT__ "PCCholeskySetMatOrdering_Cholesky"
3309b54502bSHong Zhang PetscErrorCode PCCholeskySetMatOrdering_Cholesky(PC pc,MatOrderingType ordering)
3319b54502bSHong Zhang {
3329b54502bSHong Zhang   PC_Cholesky    *dir = (PC_Cholesky*)pc->data;
3339b54502bSHong Zhang   PetscErrorCode ierr;
3349b54502bSHong Zhang 
3359b54502bSHong Zhang   PetscFunctionBegin;
3369b54502bSHong Zhang   ierr = PetscStrfree(dir->ordering);CHKERRQ(ierr);
3379b54502bSHong Zhang   ierr = PetscStrallocpy(ordering,&dir->ordering);CHKERRQ(ierr);
3389b54502bSHong Zhang   PetscFunctionReturn(0);
3399b54502bSHong Zhang }
3409b54502bSHong Zhang EXTERN_C_END
3419b54502bSHong Zhang 
3429b54502bSHong Zhang /* -----------------------------------------------------------------------------------*/
3439b54502bSHong Zhang 
3449b54502bSHong Zhang #undef __FUNCT__
3459b54502bSHong Zhang #define __FUNCT__ "PCCholeskySetReuseOrdering"
3469b54502bSHong Zhang /*@
3479b54502bSHong Zhang    PCCholeskySetReuseOrdering - When similar matrices are factored, this
3489b54502bSHong Zhang    causes the ordering computed in the first factor to be used for all
3499b54502bSHong Zhang    following factors.
3509b54502bSHong Zhang 
3519b54502bSHong Zhang    Collective on PC
3529b54502bSHong Zhang 
3539b54502bSHong Zhang    Input Parameters:
3549b54502bSHong Zhang +  pc - the preconditioner context
3559b54502bSHong Zhang -  flag - PETSC_TRUE to reuse else PETSC_FALSE
3569b54502bSHong Zhang 
3579b54502bSHong Zhang    Options Database Key:
3589b54502bSHong Zhang .  -pc_cholesky_reuse_ordering - Activate PCCholeskySetReuseOrdering()
3599b54502bSHong Zhang 
3609b54502bSHong Zhang    Level: intermediate
3619b54502bSHong Zhang 
3629b54502bSHong Zhang .keywords: PC, levels, reordering, factorization, incomplete, LU
3639b54502bSHong Zhang 
3649b54502bSHong Zhang .seealso: PCCholeskySetReuseFill(), PCICholeskySetReuseOrdering(), PCICholeskyDTSetReuseFill()
3659b54502bSHong Zhang @*/
3669b54502bSHong Zhang PetscErrorCode PCCholeskySetReuseOrdering(PC pc,PetscTruth flag)
3679b54502bSHong Zhang {
3689b54502bSHong Zhang   PetscErrorCode ierr,(*f)(PC,PetscTruth);
3699b54502bSHong Zhang 
3709b54502bSHong Zhang   PetscFunctionBegin;
3719b54502bSHong Zhang   PetscValidHeaderSpecific(pc,PC_COOKIE,1);
3729b54502bSHong Zhang   ierr = PetscObjectQueryFunction((PetscObject)pc,"PCCholeskySetReuseOrdering_C",(void (**)(void))&f);CHKERRQ(ierr);
3739b54502bSHong Zhang   if (f) {
3749b54502bSHong Zhang     ierr = (*f)(pc,flag);CHKERRQ(ierr);
3759b54502bSHong Zhang   }
3769b54502bSHong Zhang   PetscFunctionReturn(0);
3779b54502bSHong Zhang }
3789b54502bSHong Zhang 
3799b54502bSHong Zhang #undef __FUNCT__
3809b54502bSHong Zhang #define __FUNCT__ "PCCholeskySetReuseFill"
3819b54502bSHong Zhang /*@
3829b54502bSHong Zhang    PCCholeskySetReuseFill - When matrices with same nonzero structure are Cholesky factored,
3839b54502bSHong Zhang    this causes later ones to use the fill computed in the initial factorization.
3849b54502bSHong Zhang 
3859b54502bSHong Zhang    Collective on PC
3869b54502bSHong Zhang 
3879b54502bSHong Zhang    Input Parameters:
3889b54502bSHong Zhang +  pc - the preconditioner context
3899b54502bSHong Zhang -  flag - PETSC_TRUE to reuse else PETSC_FALSE
3909b54502bSHong Zhang 
3919b54502bSHong Zhang    Options Database Key:
3929b54502bSHong Zhang .  -pc_cholesky_reuse_fill - Activates PCCholeskySetReuseFill()
3939b54502bSHong Zhang 
3949b54502bSHong Zhang    Level: intermediate
3959b54502bSHong Zhang 
3969b54502bSHong Zhang .keywords: PC, levels, reordering, factorization, incomplete, Cholesky
3979b54502bSHong Zhang 
3989b54502bSHong Zhang .seealso: PCICholeskySetReuseOrdering(), PCCholeskySetReuseOrdering(), PCICholeskyDTSetReuseFill()
3999b54502bSHong Zhang @*/
4009b54502bSHong Zhang PetscErrorCode PCCholeskySetReuseFill(PC pc,PetscTruth flag)
4019b54502bSHong Zhang {
4029b54502bSHong Zhang   PetscErrorCode ierr,(*f)(PC,PetscTruth);
4039b54502bSHong Zhang 
4049b54502bSHong Zhang   PetscFunctionBegin;
4059b54502bSHong Zhang   PetscValidHeaderSpecific(pc,PC_COOKIE,2);
4069b54502bSHong Zhang   ierr = PetscObjectQueryFunction((PetscObject)pc,"PCCholeskySetReuseFill_C",(void (**)(void))&f);CHKERRQ(ierr);
4079b54502bSHong Zhang   if (f) {
4089b54502bSHong Zhang     ierr = (*f)(pc,flag);CHKERRQ(ierr);
4099b54502bSHong Zhang   }
4109b54502bSHong Zhang   PetscFunctionReturn(0);
4119b54502bSHong Zhang }
4129b54502bSHong Zhang 
4139b54502bSHong Zhang #undef __FUNCT__
4149b54502bSHong Zhang #define __FUNCT__ "PCCholeskySetFill"
4159b54502bSHong Zhang /*@
4169b54502bSHong Zhang    PCCholeskySetFill - Indicates the amount of fill you expect in the factored matrix,
4179b54502bSHong Zhang    fill = number nonzeros in factor/number nonzeros in original matrix.
4189b54502bSHong Zhang 
4199b54502bSHong Zhang    Collective on PC
4209b54502bSHong Zhang 
4219b54502bSHong Zhang    Input Parameters:
4229b54502bSHong Zhang +  pc - the preconditioner context
4239b54502bSHong Zhang -  fill - amount of expected fill
4249b54502bSHong Zhang 
4259b54502bSHong Zhang    Options Database Key:
4269b54502bSHong Zhang .  -pc_cholesky_fill <fill> - Sets fill amount
4279b54502bSHong Zhang 
4289b54502bSHong Zhang    Level: intermediate
4299b54502bSHong Zhang 
4309b54502bSHong Zhang    Note:
4319b54502bSHong Zhang    For sparse matrix factorizations it is difficult to predict how much
4329b54502bSHong Zhang    fill to expect. By running with the option -log_info PETSc will print the
4339b54502bSHong Zhang    actual amount of fill used; allowing you to set the value accurately for
4349b54502bSHong Zhang    future runs. Default PETSc uses a value of 5.0
4359b54502bSHong Zhang 
4369b54502bSHong Zhang .keywords: PC, set, factorization, direct, fill
4379b54502bSHong Zhang 
4389b54502bSHong Zhang .seealso: PCILUSetFill()
4399b54502bSHong Zhang @*/
4409b54502bSHong Zhang PetscErrorCode PCCholeskySetFill(PC pc,PetscReal fill)
4419b54502bSHong Zhang {
4429b54502bSHong Zhang   PetscErrorCode ierr,(*f)(PC,PetscReal);
4439b54502bSHong Zhang 
4449b54502bSHong Zhang   PetscFunctionBegin;
4459b54502bSHong Zhang   PetscValidHeaderSpecific(pc,PC_COOKIE,1);
4469b54502bSHong Zhang   if (fill < 1.0) SETERRQ(PETSC_ERR_ARG_OUTOFRANGE,"Fill factor cannot be less then 1.0");
4479b54502bSHong Zhang   ierr = PetscObjectQueryFunction((PetscObject)pc,"PCCholeskySetFill_C",(void (**)(void))&f);CHKERRQ(ierr);
4489b54502bSHong Zhang   if (f) {
4499b54502bSHong Zhang     ierr = (*f)(pc,fill);CHKERRQ(ierr);
4509b54502bSHong Zhang   }
4519b54502bSHong Zhang   PetscFunctionReturn(0);
4529b54502bSHong Zhang }
4539b54502bSHong Zhang 
4549b54502bSHong Zhang #undef __FUNCT__
4559b54502bSHong Zhang #define __FUNCT__ "PCCholeskySetDamping"
4569b54502bSHong Zhang /*@
4579b54502bSHong Zhang    PCCholeskySetDamping - Adds this quantity to the diagonal of the matrix during the
4589b54502bSHong Zhang    Cholesky numerical factorization.
4599b54502bSHong Zhang 
4609b54502bSHong Zhang    Collective on PC
4619b54502bSHong Zhang 
4629b54502bSHong Zhang    Input Parameters:
4639b54502bSHong Zhang +  pc - the preconditioner context
4649b54502bSHong Zhang -  damping - amount of damping
4659b54502bSHong Zhang 
4669b54502bSHong Zhang    Options Database Key:
4679b54502bSHong Zhang .  -pc_cholesky_damping <damping> - Sets damping amount
4689b54502bSHong Zhang 
4699b54502bSHong Zhang    Level: intermediate
4709b54502bSHong Zhang 
4719b54502bSHong Zhang .keywords: PC, set, factorization, direct, fill
4729b54502bSHong Zhang 
4739b54502bSHong Zhang .seealso: PCCholeskySetFill(), PCILUSetDamping()
4749b54502bSHong Zhang @*/
4759b54502bSHong Zhang PetscErrorCode PCCholeskySetDamping(PC pc,PetscReal damping)
4769b54502bSHong Zhang {
4779b54502bSHong Zhang   PetscErrorCode ierr,(*f)(PC,PetscReal);
4789b54502bSHong Zhang 
4799b54502bSHong Zhang   PetscFunctionBegin;
4809b54502bSHong Zhang   PetscValidHeaderSpecific(pc,PC_COOKIE,1);
4819b54502bSHong Zhang   ierr = PetscObjectQueryFunction((PetscObject)pc,"PCCholeskySetDamping_C",(void (**)(void))&f);CHKERRQ(ierr);
4829b54502bSHong Zhang   if (f) {
4839b54502bSHong Zhang     ierr = (*f)(pc,damping);CHKERRQ(ierr);
4849b54502bSHong Zhang   }
4859b54502bSHong Zhang   PetscFunctionReturn(0);
4869b54502bSHong Zhang }
4879b54502bSHong Zhang 
4889b54502bSHong Zhang #undef __FUNCT__
4899b54502bSHong Zhang #define __FUNCT__ "PCCholeskySetShift"
4909b54502bSHong Zhang /*@
4919b54502bSHong Zhang    PCCholeskySetShift - specify whether to use Manteuffel shifting of Cholesky.
4929b54502bSHong Zhang    If an Cholesky factorisation breaks down because of nonpositive pivots,
4939b54502bSHong Zhang    adding sufficient identity to the diagonal will remedy this.
4949b54502bSHong Zhang    Setting this causes a bisection method to find the minimum shift that
4959b54502bSHong Zhang    will lead to a well-defined Cholesky.
4969b54502bSHong Zhang 
4979b54502bSHong Zhang    Input parameters:
4989b54502bSHong Zhang +  pc - the preconditioner context
4999b54502bSHong Zhang -  shifting - PETSC_TRUE to set shift else PETSC_FALSE
5009b54502bSHong Zhang 
5019b54502bSHong Zhang    Options Database Key:
5029b54502bSHong Zhang .  -pc_ilu_shift - Activate PCCholeskySetShift()
5039b54502bSHong Zhang 
5049b54502bSHong Zhang    Level: intermediate
5059b54502bSHong Zhang 
5069b54502bSHong Zhang .keywords: PC, indefinite, factorization, incomplete, Cholesky
5079b54502bSHong Zhang 
5089b54502bSHong Zhang .seealso: PCILUSetShift()
5099b54502bSHong Zhang @*/
5109b54502bSHong Zhang PetscErrorCode PCCholeskySetShift(PC pc,PetscTruth shift)
5119b54502bSHong Zhang {
5129b54502bSHong Zhang   PetscErrorCode ierr,(*f)(PC,PetscTruth);
5139b54502bSHong Zhang 
5149b54502bSHong Zhang   PetscFunctionBegin;
5159b54502bSHong Zhang   PetscValidHeaderSpecific(pc,PC_COOKIE,1);
5169b54502bSHong Zhang   ierr = PetscObjectQueryFunction((PetscObject)pc,"PCCholeskySetShift_C",(void (**)(void))&f);CHKERRQ(ierr);
5179b54502bSHong Zhang   if (f) {
5189b54502bSHong Zhang     ierr = (*f)(pc,shift);CHKERRQ(ierr);
5199b54502bSHong Zhang   }
5209b54502bSHong Zhang   PetscFunctionReturn(0);
5219b54502bSHong Zhang }
5229b54502bSHong Zhang 
5239b54502bSHong Zhang #undef __FUNCT__
5249b54502bSHong Zhang #define __FUNCT__ "PCCholeskySetUseInPlace"
5259b54502bSHong Zhang /*@
5269b54502bSHong Zhang    PCCholeskySetUseInPlace - Tells the system to do an in-place factorization.
5279b54502bSHong Zhang    For dense matrices, this enables the solution of much larger problems.
5289b54502bSHong Zhang    For sparse matrices the factorization cannot be done truly in-place
5299b54502bSHong Zhang    so this does not save memory during the factorization, but after the matrix
5309b54502bSHong Zhang    is factored, the original unfactored matrix is freed, thus recovering that
5319b54502bSHong Zhang    space.
5329b54502bSHong Zhang 
5339b54502bSHong Zhang    Collective on PC
5349b54502bSHong Zhang 
5359b54502bSHong Zhang    Input Parameters:
5369b54502bSHong Zhang .  pc - the preconditioner context
5379b54502bSHong Zhang 
5389b54502bSHong Zhang    Options Database Key:
5399b54502bSHong Zhang .  -pc_cholesky_in_place - Activates in-place factorization
5409b54502bSHong Zhang 
5419b54502bSHong Zhang    Notes:
5429b54502bSHong Zhang    PCCholeskySetUseInplace() can only be used with the KSP method KSPPREONLY or when
5439b54502bSHong Zhang    a different matrix is provided for the multiply and the preconditioner in
5449b54502bSHong Zhang    a call to KSPSetOperators().
5459b54502bSHong Zhang    This is because the Krylov space methods require an application of the
5469b54502bSHong Zhang    matrix multiplication, which is not possible here because the matrix has
5479b54502bSHong Zhang    been factored in-place, replacing the original matrix.
5489b54502bSHong Zhang 
5499b54502bSHong Zhang    Level: intermediate
5509b54502bSHong Zhang 
5519b54502bSHong Zhang .keywords: PC, set, factorization, direct, inplace, in-place, Cholesky
5529b54502bSHong Zhang 
5539b54502bSHong Zhang .seealso: PCICholeskySetUseInPlace()
5549b54502bSHong Zhang @*/
5559b54502bSHong Zhang PetscErrorCode PCCholeskySetUseInPlace(PC pc)
5569b54502bSHong Zhang {
5579b54502bSHong Zhang   PetscErrorCode ierr,(*f)(PC);
5589b54502bSHong Zhang 
5599b54502bSHong Zhang   PetscFunctionBegin;
5609b54502bSHong Zhang   PetscValidHeaderSpecific(pc,PC_COOKIE,1);
5619b54502bSHong Zhang   ierr = PetscObjectQueryFunction((PetscObject)pc,"PCCholeskySetUseInPlace_C",(void (**)(void))&f);CHKERRQ(ierr);
5629b54502bSHong Zhang   if (f) {
5639b54502bSHong Zhang     ierr = (*f)(pc);CHKERRQ(ierr);
5649b54502bSHong Zhang   }
5659b54502bSHong Zhang   PetscFunctionReturn(0);
5669b54502bSHong Zhang }
5679b54502bSHong Zhang 
5689b54502bSHong Zhang #undef __FUNCT__
5699b54502bSHong Zhang #define __FUNCT__ "PCCholeskySetMatOrdering"
5709b54502bSHong Zhang /*@
5719b54502bSHong Zhang     PCCholeskySetMatOrdering - Sets the ordering routine (to reduce fill) to
5729b54502bSHong Zhang     be used it the Cholesky factorization.
5739b54502bSHong Zhang 
5749b54502bSHong Zhang     Collective on PC
5759b54502bSHong Zhang 
5769b54502bSHong Zhang     Input Parameters:
5779b54502bSHong Zhang +   pc - the preconditioner context
5789b54502bSHong Zhang -   ordering - the matrix ordering name, for example, MATORDERING_ND or MATORDERING_RCM
5799b54502bSHong Zhang 
5809b54502bSHong Zhang     Options Database Key:
5819b54502bSHong Zhang .   -pc_cholesky_mat_ordering_type <nd,rcm,...> - Sets ordering routine
5829b54502bSHong Zhang 
5839b54502bSHong Zhang     Level: intermediate
5849b54502bSHong Zhang 
5859b54502bSHong Zhang .seealso: PCICholeskySetMatOrdering()
5869b54502bSHong Zhang @*/
5879b54502bSHong Zhang PetscErrorCode PCCholeskySetMatOrdering(PC pc,MatOrderingType ordering)
5889b54502bSHong Zhang {
5899b54502bSHong Zhang   PetscErrorCode ierr,(*f)(PC,MatOrderingType);
5909b54502bSHong Zhang 
5919b54502bSHong Zhang   PetscFunctionBegin;
5929b54502bSHong Zhang   ierr = PetscObjectQueryFunction((PetscObject)pc,"PCCholeskySetMatOrdering_C",(void (**)(void))&f);CHKERRQ(ierr);
5939b54502bSHong Zhang   if (f) {
5949b54502bSHong Zhang     ierr = (*f)(pc,ordering);CHKERRQ(ierr);
5959b54502bSHong Zhang   }
5969b54502bSHong Zhang   PetscFunctionReturn(0);
5979b54502bSHong Zhang }
5989b54502bSHong Zhang 
5999b54502bSHong Zhang /*MC
6009b54502bSHong Zhang    PCCholesky - Uses a direct solver, based on Cholesky factorization, as a preconditioner
6019b54502bSHong Zhang 
6029b54502bSHong Zhang    Options Database Keys:
6039b54502bSHong Zhang +  -pc_cholesky_reuse_ordering - Activate PCLUSetReuseOrdering()
6049b54502bSHong Zhang .  -pc_cholesky_reuse_fill - Activates PCLUSetReuseFill()
6059b54502bSHong Zhang .  -pc_cholesky_fill <fill> - Sets fill amount
6069b54502bSHong Zhang .  -pc_cholesky_damping <damping> - Sets damping amount
6079b54502bSHong Zhang .  -pc_cholesky_shift - Activates Manteuffel shift
6089b54502bSHong Zhang .  -pc_cholesky_in_place - Activates in-place factorization
6099b54502bSHong Zhang -  -pc_cholesky_mat_ordering_type <nd,rcm,...> - Sets ordering routine
6109b54502bSHong Zhang 
6119b54502bSHong Zhang    Notes: Not all options work for all matrix formats
6129b54502bSHong Zhang 
6139b54502bSHong Zhang    Level: beginner
6149b54502bSHong Zhang 
6159b54502bSHong Zhang    Concepts: Cholesky factorization, direct solver
6169b54502bSHong Zhang 
6179b54502bSHong Zhang    Notes: Usually this will compute an "exact" solution in one iteration and does
6189b54502bSHong Zhang           not need a Krylov method (i.e. you can use -ksp_type preonly, or
6199b54502bSHong Zhang           KSPSetType(ksp,KSPPREONLY) for the Krylov method
6209b54502bSHong Zhang 
6219b54502bSHong Zhang .seealso:  PCCreate(), PCSetType(), PCType (for list of available types), PC,
6229b54502bSHong Zhang            PCILU, PCLU, PCICC, PCCholeskySetReuseOrdering(), PCCholeskySetReuseFill(), PCGetFactoredMatrix(),
6239b54502bSHong Zhang            PCCholeskySetFill(), PCCholeskySetDamping(), PCCholeskySetShift(),
6249b54502bSHong Zhang 	   PCCholeskySetUseInPlace(), PCCholeskySetMatOrdering()
6259b54502bSHong Zhang 
6269b54502bSHong Zhang M*/
6279b54502bSHong Zhang 
6289b54502bSHong Zhang EXTERN_C_BEGIN
6299b54502bSHong Zhang #undef __FUNCT__
6309b54502bSHong Zhang #define __FUNCT__ "PCCreate_Cholesky"
6319b54502bSHong Zhang PetscErrorCode PCCreate_Cholesky(PC pc)
6329b54502bSHong Zhang {
6339b54502bSHong Zhang   PetscErrorCode ierr;
6349b54502bSHong Zhang   PC_Cholesky    *dir;
6359b54502bSHong Zhang 
6369b54502bSHong Zhang   PetscFunctionBegin;
6379b54502bSHong Zhang   ierr = PetscNew(PC_Cholesky,&dir);CHKERRQ(ierr);
6389b54502bSHong Zhang   PetscLogObjectMemory(pc,sizeof(PC_Cholesky));
6399b54502bSHong Zhang 
6409b54502bSHong Zhang   dir->fact                   = 0;
6419b54502bSHong Zhang   dir->inplace                = PETSC_FALSE;
6429b54502bSHong Zhang   ierr = MatFactorInfoInitialize(&dir->info);CHKERRQ(ierr);
6439b54502bSHong Zhang   dir->info.fill              = 5.0;
644*0a29876aSHong Zhang   dir->info.shiftnz           = 0.0;
645*0a29876aSHong Zhang   dir->info.shiftpd           = PETSC_FALSE;
6469b54502bSHong Zhang   dir->info.shift_fraction    = 0.0;
6479b54502bSHong Zhang   dir->info.pivotinblocks     = 1.0;
6489b54502bSHong Zhang   dir->col                    = 0;
6499b54502bSHong Zhang   dir->row                    = 0;
6509b54502bSHong Zhang   ierr = PetscStrallocpy(MATORDERING_NATURAL,&dir->ordering);CHKERRQ(ierr);
6519b54502bSHong Zhang   dir->reusefill        = PETSC_FALSE;
6529b54502bSHong Zhang   dir->reuseordering    = PETSC_FALSE;
6539b54502bSHong Zhang   pc->data              = (void*)dir;
6549b54502bSHong Zhang 
6559b54502bSHong Zhang   pc->ops->destroy           = PCDestroy_Cholesky;
6569b54502bSHong Zhang   pc->ops->apply             = PCApply_Cholesky;
6579b54502bSHong Zhang   pc->ops->applytranspose    = PCApplyTranspose_Cholesky;
6589b54502bSHong Zhang   pc->ops->setup             = PCSetUp_Cholesky;
6599b54502bSHong Zhang   pc->ops->setfromoptions    = PCSetFromOptions_Cholesky;
6609b54502bSHong Zhang   pc->ops->view              = PCView_Cholesky;
6619b54502bSHong Zhang   pc->ops->applyrichardson   = 0;
6629b54502bSHong Zhang   pc->ops->getfactoredmatrix = PCGetFactoredMatrix_Cholesky;
6639b54502bSHong Zhang 
6649b54502bSHong Zhang   ierr = PetscObjectComposeFunctionDynamic((PetscObject)pc,"PCCholeskySetFill_C","PCCholeskySetFill_Cholesky",
6659b54502bSHong Zhang                     PCCholeskySetFill_Cholesky);CHKERRQ(ierr);
6669b54502bSHong Zhang   ierr = PetscObjectComposeFunctionDynamic((PetscObject)pc,"PCCholeskySetDamping_C","PCCholeskySetDamping_Cholesky",
6679b54502bSHong Zhang                     PCCholeskySetDamping_Cholesky);CHKERRQ(ierr);
6689b54502bSHong Zhang   ierr = PetscObjectComposeFunctionDynamic((PetscObject)pc,"PCCholeskySetShift_C","PCCholeskySetShift_Cholesky",
6699b54502bSHong Zhang                     PCCholeskySetShift_Cholesky);CHKERRQ(ierr);
6709b54502bSHong Zhang   ierr = PetscObjectComposeFunctionDynamic((PetscObject)pc,"PCCholeskySetUseInPlace_C","PCCholeskySetUseInPlace_Cholesky",
6719b54502bSHong Zhang                     PCCholeskySetUseInPlace_Cholesky);CHKERRQ(ierr);
6729b54502bSHong Zhang   ierr = PetscObjectComposeFunctionDynamic((PetscObject)pc,"PCCholeskySetMatOrdering_C","PCCholeskySetMatOrdering_Cholesky",
6739b54502bSHong Zhang                     PCCholeskySetMatOrdering_Cholesky);CHKERRQ(ierr);
6749b54502bSHong Zhang   ierr = PetscObjectComposeFunctionDynamic((PetscObject)pc,"PCCholeskySetReuseOrdering_C","PCCholeskySetReuseOrdering_Cholesky",
6759b54502bSHong Zhang                     PCCholeskySetReuseOrdering_Cholesky);CHKERRQ(ierr);
6769b54502bSHong Zhang   ierr = PetscObjectComposeFunctionDynamic((PetscObject)pc,"PCCholeskySetReuseFill_C","PCCholeskySetReuseFill_Cholesky",
6779b54502bSHong Zhang                     PCCholeskySetReuseFill_Cholesky);CHKERRQ(ierr);
6789b54502bSHong Zhang   PetscFunctionReturn(0);
6799b54502bSHong Zhang }
6809b54502bSHong Zhang EXTERN_C_END
681