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