SMP

Single matrix preconditioner (SMP) builds a preconditioner using user defined off-diagonal parts of the Jacobian.

Overview

The Single Matrix Preconditioner (SMP) builds one matrix for preconditioning. As an example, consider the system:

Users can then specify which off-diagonal blocks of the matrix to use like


off_diag_row    = 's'
off_diag_column = 'T'

Which would produce a preconditioning matrix like this:

In order for this to work, the computeQpOffDiagJacobian() function must be provided in the kernels that computes the required partial derivatives. To use all off diagonal blocks, you can use the following input file syntax:


full = true

Example Input File Syntax

[Preconditioning]
  active = 'SMP_jfnk'

  [./SMP_jfnk]
    type = SMP

    off_diag_row = 'forced'
    off_diag_column = 'diffused'

    #Preconditioned JFNK (default)
    solve_type = 'PJFNK'

    petsc_options_iname = '-pc_type'
    petsc_options_value = 'lu'
  [../]

  [./SMP_jfnk_full]
    type = SMP

    full = true

    #Preconditioned JFNK (default)
    solve_type = 'PJFNK'

    petsc_options_iname = '-pc_type'
    petsc_options_value = 'lu'
  [../]

  [./SMP_n]
    type = SMP

    off_diag_row = 'forced'
    off_diag_column = 'diffused'

    solve_type = 'NEWTON'

    petsc_options_iname = '-pc_type'
    petsc_options_value = 'lu'
  [../]
[]
(moose/examples/ex11_prec/smp.i)

Input Parameters

  • coupled_groupsList multiple space separated groups of comma separated variables. Off-diagonal jacobians will be generated for all pairs within a group.

    C++ Type:std::vector<NonlinearVariableName>

    Unit:(no unit assumed)

    Controllable:No

    Description:List multiple space separated groups of comma separated variables. Off-diagonal jacobians will be generated for all pairs within a group.

  • fullFalseSet to true if you want the full set of couplings between variables simply for convenience so you don't have to set every off_diag_row and off_diag_column combination.

    Default:False

    C++ Type:bool

    Unit:(no unit assumed)

    Controllable:No

    Description:Set to true if you want the full set of couplings between variables simply for convenience so you don't have to set every off_diag_row and off_diag_column combination.

  • ksp_normunpreconditionedSets the norm that is used for convergence testing

    Default:unpreconditioned

    C++ Type:MooseEnum

    Unit:(no unit assumed)

    Options:none, preconditioned, unpreconditioned, natural, default

    Controllable:No

    Description:Sets the norm that is used for convergence testing

  • nl_sysThe nonlinear system whose linearization this preconditioner should be applied to.

    C++ Type:NonlinearSystemName

    Unit:(no unit assumed)

    Controllable:No

    Description:The nonlinear system whose linearization this preconditioner should be applied to.

  • off_diag_columnThe variable names for the off-diagonal columns you want to add into the matrix; they will be associated with an off-diagonal row from the same position in off_diag_row.

    C++ Type:std::vector<NonlinearVariableName>

    Unit:(no unit assumed)

    Controllable:No

    Description:The variable names for the off-diagonal columns you want to add into the matrix; they will be associated with an off-diagonal row from the same position in off_diag_row.

  • off_diag_rowThe variable names for the off-diagonal rows you want to add into the matrix; they will be associated with an off-diagonal column from the same position in off_diag_column.

    C++ Type:std::vector<NonlinearVariableName>

    Unit:(no unit assumed)

    Controllable:No

    Description:The variable names for the off-diagonal rows you want to add into the matrix; they will be associated with an off-diagonal column from the same position in off_diag_column.

  • pc_sidedefaultPreconditioning side

    Default:default

    C++ Type:MooseEnum

    Unit:(no unit assumed)

    Options:left, right, symmetric, default

    Controllable:No

    Description:Preconditioning side

  • trust_my_couplingFalseWhether to trust my coupling even if the framework wants to be paranoid and create a full coupling matrix, which can happen when using global AD indexing for example.

    Default:False

    C++ Type:bool

    Unit:(no unit assumed)

    Controllable:No

    Description:Whether to trust my coupling even if the framework wants to be paranoid and create a full coupling matrix, which can happen when using global AD indexing for example.

Optional Parameters

  • control_tagsAdds user-defined labels for accessing object parameters via control logic.

    C++ Type:std::vector<std::string>

    Unit:(no unit assumed)

    Controllable:No

    Description:Adds user-defined labels for accessing object parameters via control logic.

  • enableTrueSet the enabled status of the MooseObject.

    Default:True

    C++ Type:bool

    Unit:(no unit assumed)

    Controllable:No

    Description:Set the enabled status of the MooseObject.

Advanced Parameters

  • mffd_typewpSpecifies the finite differencing type for Jacobian-free solve types. Note that the default is wp (for Walker and Pernice).

    Default:wp

    C++ Type:MooseEnum

    Unit:(no unit assumed)

    Options:wp, ds

    Controllable:No

    Description:Specifies the finite differencing type for Jacobian-free solve types. Note that the default is wp (for Walker and Pernice).

  • petsc_optionsSingleton PETSc options

    C++ Type:MultiMooseEnum

    Unit:(no unit assumed)

    Options:-dm_moose_print_embedding, -dm_view, -ksp_converged_reason, -ksp_gmres_modifiedgramschmidt, -ksp_monitor, -ksp_monitor_snes_lg-snes_ksp_ew, -ksp_snes_ew, -snes_converged_reason, -snes_ksp, -snes_ksp_ew, -snes_linesearch_monitor, -snes_mf, -snes_mf_operator, -snes_monitor, -snes_test_display, -snes_view

    Controllable:No

    Description:Singleton PETSc options

  • petsc_options_inameNames of PETSc name/value pairs

    C++ Type:MultiMooseEnum

    Unit:(no unit assumed)

    Options:-ksp_atol, -ksp_gmres_restart, -ksp_max_it, -ksp_pc_side, -ksp_rtol, -ksp_type, -mat_fd_coloring_err, -mat_fd_type, -mat_mffd_type, -pc_asm_overlap, -pc_factor_levels, -pc_factor_mat_ordering_type, -pc_hypre_boomeramg_grid_sweeps_all, -pc_hypre_boomeramg_max_iter, -pc_hypre_boomeramg_strong_threshold, -pc_hypre_type, -pc_type, -snes_atol, -snes_linesearch_type, -snes_ls, -snes_max_it, -snes_rtol, -snes_divergence_tolerance, -snes_type, -sub_ksp_type, -sub_pc_type

    Controllable:No

    Description:Names of PETSc name/value pairs

  • petsc_options_valueValues of PETSc name/value pairs (must correspond with "petsc_options_iname"

    C++ Type:std::vector<std::string>

    Unit:(no unit assumed)

    Controllable:No

    Description:Values of PETSc name/value pairs (must correspond with "petsc_options_iname"

  • solve_typePJFNK: Preconditioned Jacobian-Free Newton Krylov JFNK: Jacobian-Free Newton Krylov NEWTON: Full Newton Solve FD: Use finite differences to compute Jacobian LINEAR: Solving a linear problem

    C++ Type:MooseEnum

    Unit:(no unit assumed)

    Options:PJFNK, JFNK, NEWTON, FD, LINEAR

    Controllable:No

    Description:PJFNK: Preconditioned Jacobian-Free Newton Krylov JFNK: Jacobian-Free Newton Krylov NEWTON: Full Newton Solve FD: Use finite differences to compute Jacobian LINEAR: Solving a linear problem

Petsc Parameters