xref: /petsc/src/ksp/pc/impls/factor/factor.c (revision ee45ca4afdde1af4d1deda7cd4dc1a4a63a3ea97)
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