15e8efad8SHong Zhang 25e8efad8SHong Zhang #include "src/ksp/pc/pcimpl.h" /*I "petscpc.h" I*/ 35e8efad8SHong Zhang 4ee45ca4aSHong Zhang /* Options Database Keys: ??? 5ee45ca4aSHong Zhang . -pc_ilu_damping - add damping to diagonal to prevent zero (or very small) pivots 6ee45ca4aSHong Zhang . -pc_ilu_shift - apply Manteuffel shift to diagonal to force positive definite preconditioner 7ee45ca4aSHong Zhang . -pc_ilu_zeropivot <tol> - set tolerance for what is considered a zero pivot 8ee45ca4aSHong Zhang */ 9ee45ca4aSHong Zhang 10ee45ca4aSHong Zhang #undef __FUNCT__ 11ee45ca4aSHong Zhang #define __FUNCT__ "PCFactorSetZeroPivot" 12ee45ca4aSHong Zhang /*@ 13ee45ca4aSHong Zhang PCFactorSetZeroPivot - Sets the size at which smaller pivots are declared to be zero 14ee45ca4aSHong Zhang 15ee45ca4aSHong Zhang Collective on PC 16ee45ca4aSHong Zhang 17ee45ca4aSHong Zhang Input Parameters: 18*afaefe49SHong Zhang + pc - the preconditioner context 19*afaefe49SHong Zhang - zero - all pivots smaller than this will be considered zero 20ee45ca4aSHong Zhang 21ee45ca4aSHong Zhang Options Database Key: 22ee45ca4aSHong Zhang . -pc_factor_zeropivot <zero> - Sets tolerance for what is considered a zero pivot 23ee45ca4aSHong Zhang 24ee45ca4aSHong Zhang Level: intermediate 25ee45ca4aSHong Zhang 26ee45ca4aSHong Zhang .keywords: PC, set, factorization, direct, fill 27ee45ca4aSHong Zhang 28ee45ca4aSHong Zhang .seealso: PCFactorSetShiftNonzero(), PCFactorSetShiftPd() 29ee45ca4aSHong Zhang @*/ 30*afaefe49SHong Zhang PetscErrorCode PCFactorSetZeroPivot(PC pc,PetscReal zero) 31ee45ca4aSHong Zhang { 32*afaefe49SHong Zhang PetscErrorCode ierr,(*f)(PC,PetscReal); 33*afaefe49SHong Zhang 34ee45ca4aSHong Zhang PetscFunctionBegin; 35*afaefe49SHong Zhang PetscValidHeaderSpecific(pc,PC_COOKIE,1); 36*afaefe49SHong Zhang ierr = PetscObjectQueryFunction((PetscObject)pc,"PCFactorSetZeroPivot_C",(void (**)(void))&f);CHKERRQ(ierr); 37*afaefe49SHong Zhang if (f) { 38*afaefe49SHong Zhang ierr = (*f)(pc,zero);CHKERRQ(ierr); 39*afaefe49SHong Zhang } 40ee45ca4aSHong Zhang PetscFunctionReturn(0); 41ee45ca4aSHong Zhang } 42ee45ca4aSHong Zhang 435e8efad8SHong Zhang #undef __FUNCT__ 445e8efad8SHong Zhang #define __FUNCT__ "PCFactorSetShiftNonzero" 455e8efad8SHong Zhang /*@ 465e8efad8SHong Zhang PCFactorSetShiftNonzero - adds this quantity to the diagonal of the matrix during 475e8efad8SHong Zhang numerical factorization, thus the matrix has nonzero pivots 485e8efad8SHong Zhang 495e8efad8SHong Zhang Collective on PC 505e8efad8SHong Zhang 515e8efad8SHong Zhang Input Parameters: 52*afaefe49SHong Zhang + pc - the preconditioner context 53*afaefe49SHong Zhang - shift - amount of shift 545e8efad8SHong Zhang 555e8efad8SHong Zhang Options Database Key: 565e8efad8SHong Zhang . -pc_factor_shiftnonzero <shift> - Sets shift amount or PETSC_DECIDE for the default 575e8efad8SHong Zhang 585e8efad8SHong Zhang Note: If 0.0 is given, then no shift is used. If a diagonal element is classified as a zero 595e8efad8SHong Zhang pivot, then the shift is doubled until this is alleviated. 605e8efad8SHong Zhang 615e8efad8SHong Zhang Level: intermediate 625e8efad8SHong Zhang 635e8efad8SHong Zhang .keywords: PC, set, factorization, direct, fill 645e8efad8SHong Zhang 65ee45ca4aSHong Zhang .seealso: PCFactorSetZeroPivot(), PCFactorSetShiftPd() 665e8efad8SHong Zhang @*/ 67*afaefe49SHong Zhang PetscErrorCode PCFactorSetShiftNonzero(PC pc,PetscReal shift) 685e8efad8SHong Zhang { 69*afaefe49SHong Zhang PetscErrorCode ierr,(*f)(PC,PetscReal); 70*afaefe49SHong Zhang 715e8efad8SHong Zhang PetscFunctionBegin; 72*afaefe49SHong Zhang PetscValidHeaderSpecific(pc,PC_COOKIE,1); 73*afaefe49SHong Zhang ierr = PetscObjectQueryFunction((PetscObject)pc,"PCFactorSetShiftNonzero_C",(void (**)(void))&f);CHKERRQ(ierr); 74*afaefe49SHong Zhang if (f) { 75*afaefe49SHong Zhang ierr = (*f)(pc,shift);CHKERRQ(ierr); 765e8efad8SHong Zhang } 775e8efad8SHong Zhang PetscFunctionReturn(0); 785e8efad8SHong Zhang } 790a29876aSHong Zhang 800a29876aSHong Zhang #undef __FUNCT__ 810a29876aSHong Zhang #define __FUNCT__ "PCFactorSetShiftPd" 820a29876aSHong Zhang /*@ 830a29876aSHong Zhang PCFactorSetShiftPd - specify whether to use Manteuffel shifting. 840a29876aSHong Zhang If a matrix factorisation breaks down because of nonpositive pivots, 850a29876aSHong Zhang adding sufficient identity to the diagonal will remedy this. 860a29876aSHong Zhang Setting this causes a bisection method to find the minimum shift that 870a29876aSHong Zhang will lead to a well-defined matrix factor. 880a29876aSHong Zhang 890a29876aSHong Zhang Collective on PC 900a29876aSHong Zhang 910a29876aSHong Zhang Input parameters: 92*afaefe49SHong Zhang + pc - the preconditioner context 93*afaefe49SHong Zhang - shifting - PETSC_TRUE to set shift else PETSC_FALSE 940a29876aSHong Zhang 950a29876aSHong Zhang Options Database Key: 96ee45ca4aSHong Zhang . -pc_factor_shiftpd [1/0] - Activate/Deactivate PCFactorSetShiftPd(); the value 970a29876aSHong Zhang is optional with 1 being the default 980a29876aSHong Zhang 990a29876aSHong Zhang Level: intermediate 1000a29876aSHong Zhang 1010a29876aSHong Zhang .keywords: PC, indefinite, factorization 1020a29876aSHong Zhang 103ee45ca4aSHong Zhang .seealso: PCFactorSetZeroPivot(), PCFactorSetShiftNonzero() 1040a29876aSHong Zhang @*/ 105*afaefe49SHong Zhang PetscErrorCode PCFactorSetShiftPd(PC pc,PetscTruth shift) 1060a29876aSHong Zhang { 107*afaefe49SHong Zhang PetscErrorCode ierr,(*f)(PC,PetscTruth); 108*afaefe49SHong Zhang 1090a29876aSHong Zhang PetscFunctionBegin; 110*afaefe49SHong Zhang PetscValidHeaderSpecific(pc,PC_COOKIE,1); 111*afaefe49SHong Zhang ierr = PetscObjectQueryFunction((PetscObject)pc,"PCFactorSetShiftPd_C",(void (**)(void))&f);CHKERRQ(ierr); 112*afaefe49SHong Zhang if (f) { 113*afaefe49SHong Zhang ierr = (*f)(pc,shift);CHKERRQ(ierr); 114*afaefe49SHong Zhang } 1150a29876aSHong Zhang PetscFunctionReturn(0); 1160a29876aSHong Zhang } 117