Actual source code: factor.c

      1: #define PETSCKSP_DLL

     3:  #include src/ksp/pc/pcimpl.h

      5: /*  Options Database Keys: ???
      6: .  -pc_ilu_damping - add damping to diagonal to prevent zero (or very small) pivots
      7: .  -pc_ilu_shift - apply Manteuffel shift to diagonal to force positive definite preconditioner
      8: .  -pc_ilu_zeropivot <tol> - set tolerance for what is considered a zero pivot
      9:  */

     13: /*@
     14:    PCFactorSetZeroPivot - Sets the size at which smaller pivots are declared to be zero

     16:    Collective on PC
     17:
     18:    Input Parameters:
     19: +  pc - the preconditioner context
     20: -  zero - all pivots smaller than this will be considered zero

     22:    Options Database Key:
     23: .  -pc_factor_zeropivot <zero> - Sets tolerance for what is considered a zero pivot

     25:    Level: intermediate

     27: .keywords: PC, set, factorization, direct, fill

     29: .seealso: PCFactorSetShiftNonzero(), PCFactorSetShiftPd()
     30: @*/
     31: PetscErrorCode PETSCKSP_DLLEXPORT PCFactorSetZeroPivot(PC pc,PetscReal zero)
     32: {
     33:   PetscErrorCode ierr,(*f)(PC,PetscReal);

     37:   PetscObjectQueryFunction((PetscObject)pc,"PCFactorSetZeroPivot_C",(void (**)(void))&f);
     38:   if (f) {
     39:     (*f)(pc,zero);
     40:   }
     41:   return(0);
     42: }

     46: /*@
     47:    PCFactorSetShiftNonzero - adds this quantity to the diagonal of the matrix during
     48:      numerical factorization, thus the matrix has nonzero pivots

     50:    Collective on PC
     51:
     52:    Input Parameters:
     53: +  pc - the preconditioner context
     54: -  shift - amount of shift

     56:    Options Database Key:
     57: .  -pc_factor_shift_nonzero <shift> - Sets shift amount or PETSC_DECIDE for the default

     59:    Note: If 0.0 is given, then no shift is used. If a diagonal element is classified as a zero
     60:          pivot, then the shift is doubled until this is alleviated.

     62:    Level: intermediate

     64: .keywords: PC, set, factorization, direct, fill

     66: .seealso: PCFactorSetZeroPivot(), PCFactorSetShiftPd()
     67: @*/
     68: PetscErrorCode PETSCKSP_DLLEXPORT PCFactorSetShiftNonzero(PC pc,PetscReal shift)
     69: {
     70:   PetscErrorCode ierr,(*f)(PC,PetscReal);

     74:   PetscObjectQueryFunction((PetscObject)pc,"PCFactorSetShiftNonzero_C",(void (**)(void))&f);
     75:   if (f) {
     76:     (*f)(pc,shift);
     77:   }
     78:   return(0);
     79: }

     83: /*@
     84:    PCFactorSetShiftPd - specify whether to use Manteuffel shifting.
     85:    If a matrix factorisation breaks down because of nonpositive pivots,
     86:    adding sufficient identity to the diagonal will remedy this.
     87:    Setting this causes a bisection method to find the minimum shift that
     88:    will lead to a well-defined matrix factor.

     90:    Collective on PC

     92:    Input parameters:
     93: +  pc - the preconditioner context
     94: -  shifting - PETSC_TRUE to set shift else PETSC_FALSE

     96:    Options Database Key:
     97: .  -pc_factor_shift_positive_definite [PETSC_TRUE/PETSC_FALSE] - Activate/Deactivate PCFactorSetShiftPd(); the value
     98:    is optional with PETSC_TRUE being the default

    100:    Level: intermediate

    102: .keywords: PC, indefinite, factorization

    104: .seealso: PCFactorSetZeroPivot(), PCFactorSetShiftNonzero()
    105: @*/
    106: PetscErrorCode PETSCKSP_DLLEXPORT PCFactorSetShiftPd(PC pc,PetscTruth shift)
    107: {
    108:   PetscErrorCode ierr,(*f)(PC,PetscTruth);

    112:   PetscObjectQueryFunction((PetscObject)pc,"PCFactorSetShiftPd_C",(void (**)(void))&f);
    113:   if (f) {
    114:     (*f)(pc,shift);
    115:   }
    116:   return(0);
    117: }