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