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