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