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: 18afaefe49SHong Zhang + pc - the preconditioner context 19afaefe49SHong 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 @*/ 30afaefe49SHong Zhang PetscErrorCode PCFactorSetZeroPivot(PC pc,PetscReal zero) 31ee45ca4aSHong Zhang { 32afaefe49SHong Zhang PetscErrorCode ierr,(*f)(PC,PetscReal); 33afaefe49SHong Zhang 34ee45ca4aSHong Zhang PetscFunctionBegin; 35afaefe49SHong Zhang PetscValidHeaderSpecific(pc,PC_COOKIE,1); 36afaefe49SHong Zhang ierr = PetscObjectQueryFunction((PetscObject)pc,"PCFactorSetZeroPivot_C",(void (**)(void))&f);CHKERRQ(ierr); 37afaefe49SHong Zhang if (f) { 38afaefe49SHong Zhang ierr = (*f)(pc,zero);CHKERRQ(ierr); 39afaefe49SHong 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: 52afaefe49SHong Zhang + pc - the preconditioner context 53afaefe49SHong Zhang - shift - amount of shift 545e8efad8SHong Zhang 555e8efad8SHong Zhang Options Database Key: 56*9f95998fSHong Zhang . -pc_factor_shift_nonzero <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 @*/ 67afaefe49SHong Zhang PetscErrorCode PCFactorSetShiftNonzero(PC pc,PetscReal shift) 685e8efad8SHong Zhang { 69afaefe49SHong Zhang PetscErrorCode ierr,(*f)(PC,PetscReal); 70afaefe49SHong Zhang 715e8efad8SHong Zhang PetscFunctionBegin; 72afaefe49SHong Zhang PetscValidHeaderSpecific(pc,PC_COOKIE,1); 73afaefe49SHong Zhang ierr = PetscObjectQueryFunction((PetscObject)pc,"PCFactorSetShiftNonzero_C",(void (**)(void))&f);CHKERRQ(ierr); 74afaefe49SHong Zhang if (f) { 75afaefe49SHong 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: 92afaefe49SHong Zhang + pc - the preconditioner context 93afaefe49SHong Zhang - shifting - PETSC_TRUE to set shift else PETSC_FALSE 940a29876aSHong Zhang 950a29876aSHong Zhang Options Database Key: 96*9f95998fSHong Zhang . -pc_factor_shift_positive_definite [PETSC_TRUE/PETSC_FALSE] - Activate/Deactivate PCFactorSetShiftPd(); the value 97*9f95998fSHong Zhang is optional with PETSC_TRUE 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 @*/ 105afaefe49SHong Zhang PetscErrorCode PCFactorSetShiftPd(PC pc,PetscTruth shift) 1060a29876aSHong Zhang { 107afaefe49SHong Zhang PetscErrorCode ierr,(*f)(PC,PetscTruth); 108afaefe49SHong Zhang 1090a29876aSHong Zhang PetscFunctionBegin; 110afaefe49SHong Zhang PetscValidHeaderSpecific(pc,PC_COOKIE,1); 111afaefe49SHong Zhang ierr = PetscObjectQueryFunction((PetscObject)pc,"PCFactorSetShiftPd_C",(void (**)(void))&f);CHKERRQ(ierr); 112afaefe49SHong Zhang if (f) { 113afaefe49SHong Zhang ierr = (*f)(pc,shift);CHKERRQ(ierr); 114afaefe49SHong Zhang } 1150a29876aSHong Zhang PetscFunctionReturn(0); 1160a29876aSHong Zhang } 117