15e8efad8SHong Zhang 25e8efad8SHong Zhang #include "src/ksp/pc/pcimpl.h" /*I "petscpc.h" I*/ 35e8efad8SHong Zhang 45e8efad8SHong Zhang #undef __FUNCT__ 55e8efad8SHong Zhang #define __FUNCT__ "PCFactorSetShiftNonzero" 65e8efad8SHong Zhang /*@ 75e8efad8SHong Zhang PCFactorSetShiftNonzero - adds this quantity to the diagonal of the matrix during 85e8efad8SHong Zhang numerical factorization, thus the matrix has nonzero pivots 95e8efad8SHong Zhang 105e8efad8SHong Zhang Collective on PC 115e8efad8SHong Zhang 125e8efad8SHong Zhang Input Parameters: 135e8efad8SHong Zhang + shift - amount of shift 14*0a29876aSHong Zhang - info - options for factorization 155e8efad8SHong Zhang 165e8efad8SHong Zhang Options Database Key: 175e8efad8SHong Zhang . -pc_factor_shiftnonzero <shift> - Sets shift amount or PETSC_DECIDE for the default 185e8efad8SHong Zhang 195e8efad8SHong Zhang Note: If 0.0 is given, then no shift is used. If a diagonal element is classified as a zero 205e8efad8SHong Zhang pivot, then the shift is doubled until this is alleviated. 215e8efad8SHong Zhang 225e8efad8SHong Zhang Level: intermediate 235e8efad8SHong Zhang 245e8efad8SHong Zhang .keywords: PC, set, factorization, direct, fill 255e8efad8SHong Zhang 265e8efad8SHong Zhang .seealso: PCFactorSetFill(), PCFactorSetShiftPd() 275e8efad8SHong Zhang @*/ 285e8efad8SHong Zhang PetscErrorCode PCFactorSetShiftNonzero(PetscReal shift,MatFactorInfo *info) 295e8efad8SHong Zhang { 305e8efad8SHong Zhang PetscFunctionBegin; 315e8efad8SHong Zhang if (shift == (PetscReal) PETSC_DECIDE) { 32*0a29876aSHong Zhang info->shiftnz = 1.e-12; 335e8efad8SHong Zhang } else { 34*0a29876aSHong Zhang info->shiftnz = shift; 355e8efad8SHong Zhang } 365e8efad8SHong Zhang PetscFunctionReturn(0); 375e8efad8SHong Zhang } 38*0a29876aSHong Zhang 39*0a29876aSHong Zhang #undef __FUNCT__ 40*0a29876aSHong Zhang #define __FUNCT__ "PCFactorSetShiftPd" 41*0a29876aSHong Zhang /*@ 42*0a29876aSHong Zhang PCFactorSetShiftPd - specify whether to use Manteuffel shifting. 43*0a29876aSHong Zhang If a matrix factorisation breaks down because of nonpositive pivots, 44*0a29876aSHong Zhang adding sufficient identity to the diagonal will remedy this. 45*0a29876aSHong Zhang Setting this causes a bisection method to find the minimum shift that 46*0a29876aSHong Zhang will lead to a well-defined matrix factor. 47*0a29876aSHong Zhang 48*0a29876aSHong Zhang Collective on PC 49*0a29876aSHong Zhang 50*0a29876aSHong Zhang Input parameters: 51*0a29876aSHong Zhang + shifting - PETSC_TRUE to set shift else PETSC_FALSE 52*0a29876aSHong Zhang - info - options for factorization 53*0a29876aSHong Zhang 54*0a29876aSHong Zhang Options Database Key: 55*0a29876aSHong Zhang . -pc_factor_shift [1/0] - Activate/Deactivate PCFactorSetShiftPd(); the value 56*0a29876aSHong Zhang is optional with 1 being the default 57*0a29876aSHong Zhang 58*0a29876aSHong Zhang Level: intermediate 59*0a29876aSHong Zhang 60*0a29876aSHong Zhang .keywords: PC, indefinite, factorization 61*0a29876aSHong Zhang 62*0a29876aSHong Zhang .seealso: PCFactorSetShiftNonzero() 63*0a29876aSHong Zhang @*/ 64*0a29876aSHong Zhang PetscErrorCode PCFactorSetShiftPd(PetscTruth shifting,MatFactorInfo *info) 65*0a29876aSHong Zhang { 66*0a29876aSHong Zhang PetscFunctionBegin; 67*0a29876aSHong Zhang info->shiftpd = shifting; 68*0a29876aSHong Zhang PetscFunctionReturn(0); 69*0a29876aSHong Zhang } 70*0a29876aSHong Zhang 71*0a29876aSHong Zhang 72