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