15e8efad8SHong Zhang 25e8efad8SHong Zhang #include "src/ksp/pc/pcimpl.h" /*I "petscpc.h" I*/ 35e8efad8SHong Zhang 4*ee45ca4aSHong Zhang /* Options Database Keys: ??? 5*ee45ca4aSHong Zhang . -pc_ilu_damping - add damping to diagonal to prevent zero (or very small) pivots 6*ee45ca4aSHong Zhang . -pc_ilu_shift - apply Manteuffel shift to diagonal to force positive definite preconditioner 7*ee45ca4aSHong Zhang . -pc_ilu_zeropivot <tol> - set tolerance for what is considered a zero pivot 8*ee45ca4aSHong Zhang */ 9*ee45ca4aSHong Zhang 10*ee45ca4aSHong Zhang #undef __FUNCT__ 11*ee45ca4aSHong Zhang #define __FUNCT__ "PCFactorSetZeroPivot" 12*ee45ca4aSHong Zhang /*@ 13*ee45ca4aSHong Zhang PCFactorSetZeroPivot - Sets the size at which smaller pivots are declared to be zero 14*ee45ca4aSHong Zhang 15*ee45ca4aSHong Zhang Collective on PC 16*ee45ca4aSHong Zhang 17*ee45ca4aSHong Zhang Input Parameters: 18*ee45ca4aSHong Zhang + zero - all pivots smaller than this will be considered zero 19*ee45ca4aSHong Zhang - info - options for factorization 20*ee45ca4aSHong Zhang 21*ee45ca4aSHong Zhang Options Database Key: 22*ee45ca4aSHong Zhang . -pc_factor_zeropivot <zero> - Sets tolerance for what is considered a zero pivot 23*ee45ca4aSHong Zhang 24*ee45ca4aSHong Zhang Level: intermediate 25*ee45ca4aSHong Zhang 26*ee45ca4aSHong Zhang .keywords: PC, set, factorization, direct, fill 27*ee45ca4aSHong Zhang 28*ee45ca4aSHong Zhang .seealso: PCFactorSetShiftNonzero(), PCFactorSetShiftPd() 29*ee45ca4aSHong Zhang @*/ 30*ee45ca4aSHong Zhang PetscErrorCode PCFactorSetZeroPivot(PetscReal zero,MatFactorInfo *info) 31*ee45ca4aSHong Zhang { 32*ee45ca4aSHong Zhang PetscFunctionBegin; 33*ee45ca4aSHong Zhang info->zeropivot = zero; 34*ee45ca4aSHong Zhang PetscFunctionReturn(0); 35*ee45ca4aSHong Zhang } 36*ee45ca4aSHong Zhang 375e8efad8SHong Zhang #undef __FUNCT__ 385e8efad8SHong Zhang #define __FUNCT__ "PCFactorSetShiftNonzero" 395e8efad8SHong Zhang /*@ 405e8efad8SHong Zhang PCFactorSetShiftNonzero - adds this quantity to the diagonal of the matrix during 415e8efad8SHong Zhang numerical factorization, thus the matrix has nonzero pivots 425e8efad8SHong Zhang 435e8efad8SHong Zhang Collective on PC 445e8efad8SHong Zhang 455e8efad8SHong Zhang Input Parameters: 465e8efad8SHong Zhang + shift - amount of shift 470a29876aSHong Zhang - info - options for factorization 485e8efad8SHong Zhang 495e8efad8SHong Zhang Options Database Key: 505e8efad8SHong Zhang . -pc_factor_shiftnonzero <shift> - Sets shift amount or PETSC_DECIDE for the default 515e8efad8SHong Zhang 525e8efad8SHong Zhang Note: If 0.0 is given, then no shift is used. If a diagonal element is classified as a zero 535e8efad8SHong Zhang pivot, then the shift is doubled until this is alleviated. 545e8efad8SHong Zhang 555e8efad8SHong Zhang Level: intermediate 565e8efad8SHong Zhang 575e8efad8SHong Zhang .keywords: PC, set, factorization, direct, fill 585e8efad8SHong Zhang 59*ee45ca4aSHong Zhang .seealso: PCFactorSetZeroPivot(), PCFactorSetShiftPd() 605e8efad8SHong Zhang @*/ 615e8efad8SHong Zhang PetscErrorCode PCFactorSetShiftNonzero(PetscReal shift,MatFactorInfo *info) 625e8efad8SHong Zhang { 635e8efad8SHong Zhang PetscFunctionBegin; 645e8efad8SHong Zhang if (shift == (PetscReal) PETSC_DECIDE) { 650a29876aSHong Zhang info->shiftnz = 1.e-12; 665e8efad8SHong Zhang } else { 670a29876aSHong Zhang info->shiftnz = shift; 685e8efad8SHong Zhang } 695e8efad8SHong Zhang PetscFunctionReturn(0); 705e8efad8SHong Zhang } 710a29876aSHong Zhang 720a29876aSHong Zhang #undef __FUNCT__ 730a29876aSHong Zhang #define __FUNCT__ "PCFactorSetShiftPd" 740a29876aSHong Zhang /*@ 750a29876aSHong Zhang PCFactorSetShiftPd - specify whether to use Manteuffel shifting. 760a29876aSHong Zhang If a matrix factorisation breaks down because of nonpositive pivots, 770a29876aSHong Zhang adding sufficient identity to the diagonal will remedy this. 780a29876aSHong Zhang Setting this causes a bisection method to find the minimum shift that 790a29876aSHong Zhang will lead to a well-defined matrix factor. 800a29876aSHong Zhang 810a29876aSHong Zhang Collective on PC 820a29876aSHong Zhang 830a29876aSHong Zhang Input parameters: 840a29876aSHong Zhang + shifting - PETSC_TRUE to set shift else PETSC_FALSE 850a29876aSHong Zhang - info - options for factorization 860a29876aSHong Zhang 870a29876aSHong Zhang Options Database Key: 88*ee45ca4aSHong Zhang . -pc_factor_shiftpd [1/0] - Activate/Deactivate PCFactorSetShiftPd(); the value 890a29876aSHong Zhang is optional with 1 being the default 900a29876aSHong Zhang 910a29876aSHong Zhang Level: intermediate 920a29876aSHong Zhang 930a29876aSHong Zhang .keywords: PC, indefinite, factorization 940a29876aSHong Zhang 95*ee45ca4aSHong Zhang .seealso: PCFactorSetZeroPivot(), PCFactorSetShiftNonzero() 960a29876aSHong Zhang @*/ 970a29876aSHong Zhang PetscErrorCode PCFactorSetShiftPd(PetscTruth shifting,MatFactorInfo *info) 980a29876aSHong Zhang { 990a29876aSHong Zhang PetscFunctionBegin; 1000a29876aSHong Zhang info->shiftpd = shifting; 1010a29876aSHong Zhang PetscFunctionReturn(0); 1020a29876aSHong Zhang } 1030a29876aSHong Zhang 1040a29876aSHong Zhang 105