- topsplitEntrance to splits, the top split will specify how splits will go.
C++ Type:std::vector<std::string>
Controllable:No
Description:Entrance to splits, the top split will specify how splits will go.
FSP
Preconditioner designed to map onto PETSc's PCFieldSplit.
Overview
The FieldSplitPreconditioner
allows for custom preconditioning for each nonlinear variable in the numerical system. One or more variables may be targeted in a subsolve that will only consider part of the numerical system. The preconditioning defined for these subsolves is used for the relevant block(s) in the global numerical system.
A FSP
may for example be used for block-diagonal preconditioning by setting full=false
and no off-diagonal variable couplings. Numerical systems considering only a single variable are then preconditioned individually. This is the default preconditioner for the PJFNK
solves. See the Executioner documentation for more information on the default preconditioner.
More information about field split preconditioning may be found in the PETSc manual.
Example input syntax
In this example, the preconditioning is performed by solving individual problems for each variables, as described in the comments in the snippet. The solution for these subsolves is used to perform the Schur decomposition preconditioning of the main numerical system.
[Preconditioning]
active = 'FSP'
[./FSP]
type = FSP
# It is the starting point of splitting
topsplit = 'uv' # 'uv' should match the following block name
[./uv]
splitting = 'u v' # 'u' and 'v' are the names of subsolvers
# Generally speaking, there are four types of splitting we could choose
# <additive,multiplicative,symmetric_multiplicative,schur>
splitting_type = additive
# An approximate solution to the original system
# | A_uu A_uv | | u | _ |f_u|
# | 0 A_vv | | v | - |f_v|
# is obtained by solving the following subsystems
# A_uu u = f_u and A_vv v = f_v
# If splitting type is specified as schur, we may also want to set more options to
# control how schur works using PETSc options
# petsc_options_iname = '-pc_fieldsplit_schur_fact_type -pc_fieldsplit_schur_precondition'
# petsc_options_value = 'full selfp'
[../]
[./u]
vars = 'u'
# PETSc options for this subsolver
# A prefix will be applied, so just put the options for this subsolver only
petsc_options_iname = '-pc_type -ksp_type'
petsc_options_value = ' hypre preonly'
[../]
[./v]
vars = 'v'
# PETSc options for this subsolver
petsc_options_iname = '-pc_type -ksp_type'
petsc_options_value = ' hypre preonly'
[../]
[../]
[]
(test/tests/preconditioners/fsp/fsp_test.i)An example of setting the "off_diag_row" and "off_diag_column" parameters to create a custom coupling matrix may be found in the PBP documentation.
Input Parameters
- fullTrueSet 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:True
C++ Type:bool
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
Options:none, preconditioned, unpreconditioned, natural, default
Controllable:No
Description:Sets the norm that is used for convergence testing
- 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>
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>
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
Options:left, right, symmetric, default
Controllable:No
Description:Preconditioning side
Optional Parameters
- control_tagsAdds user-defined labels for accessing object parameters via control logic.
C++ Type:std::vector<std::string>
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
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
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
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
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>
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
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
Input Files
- (python/peacock/tests/common/fsp_test.i)
- (modules/navier_stokes/test/tests/finite_volume/ins/channel-flow/2d-rc-no-slip.i)
- (test/tests/preconditioners/fsp/fsp_test_image.i)
- (test/tests/mortar/periodic_segmental_constraint/penalty_periodic_split.i)
- (test/tests/preconditioners/fsp/fsp_test.i)
- (modules/contact/test/tests/fieldsplit/frictional_mortar_FS.i)
- (modules/contact/test/tests/fieldsplit/frictionless_mortar_FS.i)
- (python/peacock/tests/input_tab/InputFileEditor/gold/fsp_test.i)
- (test/tests/preconditioners/fsp/vector-test.i)
- (test/tests/preconditioners/fsp/missing-var-in-split.i)
- (test/tests/preconditioners/fsp/array-test.i)
- (modules/navier_stokes/test/tests/finite_element/ins/pressure_channel/open_bc_pressure_BC_fieldSplit.i)
- (modules/contact/test/tests/fieldsplit/2blocks3d.i)
- (python/peacock/tests/input_tab/InputTree/gold/fsp_test.i)
(test/tests/preconditioners/fsp/fsp_test.i)
[Mesh]
[./square]
type = GeneratedMeshGenerator
nx = 2
ny = 2
dim = 2
[../]
[]
[Variables]
active = 'u v'
[./u]
order = FIRST
family = LAGRANGE
[../]
[./v]
order = FIRST
family = LAGRANGE
[../]
[]
[Kernels]
active = 'diff_u conv_v diff_v'
[./diff_u]
type = Diffusion
variable = u
[../]
[./conv_v]
type = CoupledForce
variable = v
v = u
[../]
[./diff_v]
type = Diffusion
variable = v
[../]
[]
[BCs]
active = 'left_u right_u left_v'
[./left_u]
type = DirichletBC
variable = u
boundary = 3
value = 0
[../]
[./right_u]
type = DirichletBC
variable = u
boundary = 1
value = 100
[../]
[./left_v]
type = DirichletBC
variable = v
boundary = 3
value = 0
[../]
[./right_v]
type = DirichletBC
variable = v
boundary = 1
value = 0
[../]
[]
[Executioner]
type = Steady
# This is setup automatically in MOOSE (SetupPBPAction.C)
# petsc_options = '-snes_mf_operator'
# petsc_options_iname = '-pc_type'
# petsc_options_value = 'asm'
[]
[Preconditioning]
active = 'FSP'
[./FSP]
type = FSP
# It is the starting point of splitting
topsplit = 'uv' # 'uv' should match the following block name
[./uv]
splitting = 'u v' # 'u' and 'v' are the names of subsolvers
# Generally speaking, there are four types of splitting we could choose
# <additive,multiplicative,symmetric_multiplicative,schur>
splitting_type = additive
# An approximate solution to the original system
# | A_uu A_uv | | u | _ |f_u|
# | 0 A_vv | | v | - |f_v|
# is obtained by solving the following subsystems
# A_uu u = f_u and A_vv v = f_v
# If splitting type is specified as schur, we may also want to set more options to
# control how schur works using PETSc options
# petsc_options_iname = '-pc_fieldsplit_schur_fact_type -pc_fieldsplit_schur_precondition'
# petsc_options_value = 'full selfp'
[../]
[./u]
vars = 'u'
# PETSc options for this subsolver
# A prefix will be applied, so just put the options for this subsolver only
petsc_options_iname = '-pc_type -ksp_type'
petsc_options_value = ' hypre preonly'
[../]
[./v]
vars = 'v'
# PETSc options for this subsolver
petsc_options_iname = '-pc_type -ksp_type'
petsc_options_value = ' hypre preonly'
[../]
[../]
[]
[Outputs]
file_base = out
exodus = true
[]
off_diag_row
C++ Type:std::vector<NonlinearVariableName>
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.
off_diag_column
C++ Type:std::vector<NonlinearVariableName>
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.
(python/peacock/tests/common/fsp_test.i)
[Mesh]
type = GeneratedMesh
dim = 2
nx = 2
ny = 2
[]
[Variables]
active = 'u v'
[./u]
order = FIRST
family = LAGRANGE
[../]
[./v]
order = FIRST
family = LAGRANGE
[../]
[]
[Kernels]
active = 'diff_u conv_v diff_v'
[./diff_u]
type = Diffusion
variable = u
[../]
[./conv_v]
type = CoupledForce
variable = v
v = u
[../]
[./diff_v]
type = Diffusion
variable = v
[../]
[]
[BCs]
active = 'left_u right_u left_v'
[./left_u]
type = DirichletBC
variable = u
boundary = 1
value = 0
[../]
[./right_u]
type = DirichletBC
variable = u
boundary = 2
value = 100
[../]
[./left_v]
type = DirichletBC
variable = v
boundary = 1
value = 0
[../]
[./right_v]
type = DirichletBC
variable = v
boundary = 2
value = 0
[../]
[]
[Executioner]
type = Steady
# This is setup automatically in MOOSE (SetupPBPAction.C)
# petsc_options = '-snes_mf_operator'
# petsc_options_iname = '-pc_type'
# petsc_options_value = 'asm'
[]
[Preconditioning]
active = 'FSP'
[./FSP]
type = FSP
# It is the starting point of splitting
topsplit = 'uv' # uv should match the following block name
[./uv]
splitting = 'u v' # u and v are the names of subsolvers
# Generally speaking, there are four types of splitting we could choose
# <additive,multiplicative,symmetric_multiplicative,schur>
splitting_type = additive
# An approximate solution to the original system
# | A_uu A_uv | | u | _ |f_u|
# | 0 A_vv | | v | - |f_v|
# is obtained by solving the following subsystems
# A_uu u = f_u and A_vv v = f_v
# If splitting type is specified as schur, we may also want to set more options to
# control how schur works using PETSc options
# petsc_options_iname = '-pc_fieldsplit_schur_fact_type -pc_fieldsplit_schur_precondition'
# petsc_options_value = 'full selfp'
[../]
[./u]
vars = 'u'
# PETSc options for this subsolver
# A prefix will be applied, so just put the options for this subsolver only
petsc_options_iname = '-pc_type -ksp_type'
petsc_options_value = ' hypre preonly'
[../]
[./v]
vars = 'v'
# PETSc options for this subsolver
petsc_options_iname = '-pc_type -ksp_type'
petsc_options_value = ' hypre preonly'
[../]
[../]
[]
[Outputs]
file_base = out
exodus = true
[]
(modules/navier_stokes/test/tests/finite_volume/ins/channel-flow/2d-rc-no-slip.i)
mu = 1.1
rho = 1.1
l = 2
U = 1
advected_interp_method = 'average'
velocity_interp_method = 'rc'
[GlobalParams]
rhie_chow_user_object = 'rc'
[]
[UserObjects]
[rc]
type = INSFVRhieChowInterpolator
u = vel_x
v = vel_y
pressure = pressure
[]
[]
[Mesh]
[gen]
type = GeneratedMeshGenerator
dim = 2
xmin = 0
xmax = 10
ymin = ${fparse -l / 2}
ymax = ${fparse l / 2}
nx = 100
ny = 20
[]
uniform_refine = 0
[]
[Variables]
[vel_x]
type = INSFVVelocityVariable
initial_condition = 1
[]
[vel_y]
type = INSFVVelocityVariable
initial_condition = 1
[]
[pressure]
type = INSFVPressureVariable
[]
[]
[FVKernels]
[mass]
type = INSFVMassAdvection
variable = pressure
advected_interp_method = ${advected_interp_method}
velocity_interp_method = ${velocity_interp_method}
rho = ${rho}
[]
[u_advection]
type = INSFVMomentumAdvection
variable = vel_x
advected_interp_method = ${advected_interp_method}
velocity_interp_method = ${velocity_interp_method}
rho = ${rho}
momentum_component = 'x'
[]
[u_viscosity]
type = INSFVMomentumDiffusion
variable = vel_x
mu = ${mu}
momentum_component = 'x'
[]
[u_pressure]
type = INSFVMomentumPressure
variable = vel_x
momentum_component = 'x'
pressure = pressure
[]
[v_advection]
type = INSFVMomentumAdvection
variable = vel_y
advected_interp_method = ${advected_interp_method}
velocity_interp_method = ${velocity_interp_method}
rho = ${rho}
momentum_component = 'y'
[]
[v_viscosity]
type = INSFVMomentumDiffusion
variable = vel_y
mu = ${mu}
momentum_component = 'y'
[]
[v_pressure]
type = INSFVMomentumPressure
variable = vel_y
momentum_component = 'y'
pressure = pressure
[]
[]
[FVBCs]
[inlet-u]
type = INSFVInletVelocityBC
boundary = 'left'
variable = vel_x
function = '${U}'
[]
[inlet-v]
type = INSFVInletVelocityBC
boundary = 'left'
variable = vel_y
function = '0'
[]
[walls-u]
type = INSFVNoSlipWallBC
boundary = 'top bottom'
variable = vel_x
function = 0
[]
[walls-v]
type = INSFVNoSlipWallBC
boundary = 'top bottom'
variable = vel_y
function = 0
[]
[outlet_p]
type = INSFVOutletPressureBC
boundary = 'right'
variable = pressure
function = '0'
[]
[]
[Executioner]
type = Steady
solve_type = 'NEWTON'
nl_rel_tol = 1e-12
[]
[Preconditioning]
active = FSP
[FSP]
type = FSP
# It is the starting point of splitting
topsplit = 'up' # 'up' should match the following block name
[up]
splitting = 'u p' # 'u' and 'p' are the names of subsolvers
splitting_type = schur
# Splitting type is set as schur, because the pressure part of Stokes-like systems
# is not diagonally dominant. CAN NOT use additive, multiplicative and etc.
#
# Original system:
#
# | Auu Aup | | u | = | f_u |
# | Apu 0 | | p | | f_p |
#
# is factorized into
#
# |I 0 | | Auu 0| | I Auu^{-1}*Aup | | u | = | f_u |
# |Apu*Auu^{-1} I | | 0 -S| | 0 I | | p | | f_p |
#
# where
#
# S = Apu*Auu^{-1}*Aup
#
# The preconditioning is accomplished via the following steps
#
# (1) p* = f_p - Apu*Auu^{-1}f_u,
# (2) p = (-S)^{-1} p*
# (3) u = Auu^{-1}(f_u-Aup*p)
petsc_options_iname = '-pc_fieldsplit_schur_fact_type -pc_fieldsplit_schur_precondition -ksp_gmres_restart -ksp_rtol -ksp_type'
petsc_options_value = 'full selfp 300 1e-4 fgmres'
[]
[u]
vars = 'vel_x vel_y'
petsc_options_iname = '-pc_type -pc_hypre_type -ksp_type -ksp_rtol -ksp_gmres_restart -ksp_pc_side'
petsc_options_value = 'hypre boomeramg gmres 5e-1 300 right'
[]
[p]
vars = 'pressure'
petsc_options_iname = '-ksp_type -ksp_gmres_restart -ksp_rtol -pc_type -ksp_pc_side'
petsc_options_value = 'gmres 300 5e-1 jacobi right'
[]
[]
[SMP]
type = SMP
full = true
petsc_options_iname = '-pc_type -pc_factor_shift_type'
petsc_options_value = 'lu NONZERO'
[]
[]
[Outputs]
print_linear_residuals = true
print_nonlinear_residuals = true
[out]
type = Exodus
hide = 'Re lin cum_lin'
[]
[perf]
type = PerfGraphOutput
[]
[]
[Postprocessors]
[Re]
type = ParsedPostprocessor
function = '${rho} * ${l} * ${U}'
pp_names = ''
[]
[lin]
type = NumLinearIterations
[]
[cum_lin]
type = CumulativeValuePostprocessor
postprocessor = lin
[]
[]
(test/tests/preconditioners/fsp/fsp_test_image.i)
[Mesh]
[gen]
type = GeneratedMeshGenerator
dim = 2
nx = 41
ny = 41
[]
[./image]
input = gen
type = ImageSubdomainGenerator
file = kitten.png
threshold = 100
[../]
[]
[Variables]
[./u]
order = FIRST
family = LAGRANGE
block = 1
[../]
[./v]
order = FIRST
family = LAGRANGE
block = 1
[../]
[]
[Kernels]
[./diff_u]
type = Diffusion
variable = u
[../]
[./conv_v]
type = CoupledForce
variable = v
v = u
[../]
[./diff_v]
type = Diffusion
variable = v
[../]
[]
[BCs]
active = 'left_u left_v right_u'
[./left_u]
type = DirichletBC
variable = u
boundary = left
value = 0
[../]
[./right_u]
type = DirichletBC
variable = u
boundary = right
value = 100
[../]
[./left_v]
type = DirichletBC
variable = v
boundary = left
value = 0
[../]
[./right_v]
type = DirichletBC
variable = v
boundary = right
value = 0
[../]
[]
[Problem]
type = FEProblem
material_coverage_check = false
kernel_coverage_check = false
[]
[Executioner]
# This is setup automatically in MOOSE (SetupPBPAction.C)
# petsc_options = '-snes_mf_operator'
# petsc_options_iname = '-pc_type'
# petsc_options_value = 'asm'
type = Steady
[]
[Preconditioning]
[./FSP]
# It is the starting point of splitting
type = FSP
topsplit = 'uv' # 'uv'
[./uv]
# Generally speaking, there are four types of splitting we could choose
# <additive,multiplicative,symmetric_multiplicative,schur>
# An approximate solution to the original system
# | A_uu A_uv | | u | _ |f_u|
# | 0 A_vv | | v | - |f_v|
# is obtained by solving the following subsystems
# A_uu u = f_u and A_vv v = f_v
# If splitting type is specified as schur, we may also want to set more options to
# control how schur works using PETSc options
# petsc_options_iname = '-pc_fieldsplit_schur_fact_type -pc_fieldsplit_schur_precondition'
# petsc_options_value = 'full selfp'
splitting = 'u v' # 'u' and 'v'
splitting_type = additive
[../]
[./u]
# PETSc options for this subsolver
# A prefix will be applied, so just put the options for this subsolver only
vars = u
petsc_options_iname = '-pc_type -ksp_type'
petsc_options_value = ' hypre preonly'
[../]
[./v]
# PETSc options for this subsolver
vars = v
petsc_options_iname = '-pc_type -ksp_type'
petsc_options_value = ' hypre preonly'
[../]
[../]
[]
[Outputs]
file_base = kitten_out
exodus = true
[]
(test/tests/mortar/periodic_segmental_constraint/penalty_periodic_split.i)
[Mesh]
[left_block]
type = GeneratedMeshGenerator
dim = 3
xmin = -3.0
xmax = 3.0
ymin = -3.0
ymax = 3.0
zmin = -3.0
zmax = 3.0
nx = 3
ny = 3
nz = 3
elem_type = HEX8
[]
[left_block_sidesets]
type = RenameBoundaryGenerator
input = left_block
old_boundary = '0 1 2 3 4 5'
new_boundary = '10 11 12 13 14 15'
[]
[left_block_id]
type = SubdomainIDGenerator
input = left_block_sidesets
subdomain_id = 1
[]
[left]
type = LowerDBlockFromSidesetGenerator
input = left_block_id
sidesets = '14'
new_block_id = '10004'
new_block_name = 'secondary_left'
[]
[right]
type = LowerDBlockFromSidesetGenerator
input = left
sidesets = '12'
new_block_id = '10002'
new_block_name = 'primary_right'
[]
[bottom]
type = LowerDBlockFromSidesetGenerator
input = right
sidesets = '10'
new_block_id = '10000'
new_block_name = 'secondary_bottom'
[]
[top]
type = LowerDBlockFromSidesetGenerator
input = bottom
sidesets = '15'
new_block_id = '10005'
new_block_name = 'primary_top'
[]
[back]
type = LowerDBlockFromSidesetGenerator
input = top
sidesets = '11'
new_block_id = '10001'
new_block_name = 'secondary_back'
[]
[front]
type = LowerDBlockFromSidesetGenerator
input = back
sidesets = '13'
new_block_id = '10003'
new_block_name = 'primary_front'
[]
[corner_node]
type = ExtraNodesetGenerator
new_boundary = 'pinned_node'
nodes = '0'
input = front
[]
[]
[Variables]
[u]
order = FIRST
family = LAGRANGE
[]
[epsilon]
order = THIRD
family = SCALAR
[]
[]
[AuxVariables]
[sigma]
order = THIRD
family = SCALAR
[]
[]
[AuxScalarKernels]
[sigma]
type = FunctionScalarAux
variable = sigma
function = '1 2 3'
execute_on = initial #timestep_end
[]
[]
[Kernels]
[diff1]
type = Diffusion
variable = u
block = 1
[]
[]
[Problem]
kernel_coverage_check = false
error_on_jacobian_nonzero_reallocation = true
[]
[BCs]
[fix_right]
type = DirichletBC
variable = u
boundary = pinned_node
value = 0
[]
[]
[Constraints]
[mortarlr]
type = PenaltyEqualValueConstraint
primary_boundary = '12'
secondary_boundary = '14'
primary_subdomain = 'primary_right'
secondary_subdomain = 'secondary_left'
secondary_variable = u
correct_edge_dropping = true
penalty_value = 1.e2
[]
[periodiclr]
type = PenaltyPeriodicSegmentalConstraint
primary_boundary = '12'
secondary_boundary = '14'
primary_subdomain = 'primary_right'
secondary_subdomain = 'secondary_left'
secondary_variable = u
epsilon = epsilon
sigma = sigma
correct_edge_dropping = true
penalty_value = 1.e2
[]
[mortarbt]
type = PenaltyEqualValueConstraint
primary_boundary = '15'
secondary_boundary = '10'
primary_subdomain = 'primary_top'
secondary_subdomain = 'secondary_bottom'
secondary_variable = u
correct_edge_dropping = true
penalty_value = 1.e2
[]
[periodicbt]
type = PenaltyPeriodicSegmentalConstraint
primary_boundary = '15'
secondary_boundary = '10'
primary_subdomain = 'primary_top'
secondary_subdomain = 'secondary_bottom'
secondary_variable = u
epsilon = epsilon
sigma = sigma
correct_edge_dropping = true
penalty_value = 1.e2
[]
[mortarbf]
type = PenaltyEqualValueConstraint
primary_boundary = '13'
secondary_boundary = '11'
primary_subdomain = 'primary_front'
secondary_subdomain = 'secondary_back'
secondary_variable = u
correct_edge_dropping = true
penalty_value = 1.e2
[]
[periodicbf]
type = PenaltyPeriodicSegmentalConstraint
primary_boundary = '13'
secondary_boundary = '11'
primary_subdomain = 'primary_front'
secondary_subdomain = 'secondary_back'
secondary_variable = u
epsilon = epsilon
sigma = sigma
correct_edge_dropping = true
penalty_value = 1.e2
[]
[]
[Preconditioning]
[FSP]
type = FSP
topsplit = 'uv' # 'uv' should match the following block name
[uv]
splitting = 'u v' # 'u' and 'v' are the names of subsolvers
splitting_type = additive
[]
[u]
vars = 'u'
petsc_options_iname = '-ksp_gmres_restart -pc_type -pc_hypre_type -pc_hypre_boomeramg_max_iter'
petsc_options_value = ' 201 hypre boomeramg 10'
[]
[v]
vars = 'epsilon'
petsc_options_iname = '-ksp_type -pc_type -pc_hypre_type -pc_hypre_boomeramg_max_iter'
petsc_options_value = ' preonly hypre boomeramg 10'
[]
[]
[]
[Executioner]
type = Steady
solve_type = NEWTON
[]
[Outputs]
csv = true
[]
(test/tests/preconditioners/fsp/fsp_test.i)
[Mesh]
[./square]
type = GeneratedMeshGenerator
nx = 2
ny = 2
dim = 2
[../]
[]
[Variables]
active = 'u v'
[./u]
order = FIRST
family = LAGRANGE
[../]
[./v]
order = FIRST
family = LAGRANGE
[../]
[]
[Kernels]
active = 'diff_u conv_v diff_v'
[./diff_u]
type = Diffusion
variable = u
[../]
[./conv_v]
type = CoupledForce
variable = v
v = u
[../]
[./diff_v]
type = Diffusion
variable = v
[../]
[]
[BCs]
active = 'left_u right_u left_v'
[./left_u]
type = DirichletBC
variable = u
boundary = 3
value = 0
[../]
[./right_u]
type = DirichletBC
variable = u
boundary = 1
value = 100
[../]
[./left_v]
type = DirichletBC
variable = v
boundary = 3
value = 0
[../]
[./right_v]
type = DirichletBC
variable = v
boundary = 1
value = 0
[../]
[]
[Executioner]
type = Steady
# This is setup automatically in MOOSE (SetupPBPAction.C)
# petsc_options = '-snes_mf_operator'
# petsc_options_iname = '-pc_type'
# petsc_options_value = 'asm'
[]
[Preconditioning]
active = 'FSP'
[./FSP]
type = FSP
# It is the starting point of splitting
topsplit = 'uv' # 'uv' should match the following block name
[./uv]
splitting = 'u v' # 'u' and 'v' are the names of subsolvers
# Generally speaking, there are four types of splitting we could choose
# <additive,multiplicative,symmetric_multiplicative,schur>
splitting_type = additive
# An approximate solution to the original system
# | A_uu A_uv | | u | _ |f_u|
# | 0 A_vv | | v | - |f_v|
# is obtained by solving the following subsystems
# A_uu u = f_u and A_vv v = f_v
# If splitting type is specified as schur, we may also want to set more options to
# control how schur works using PETSc options
# petsc_options_iname = '-pc_fieldsplit_schur_fact_type -pc_fieldsplit_schur_precondition'
# petsc_options_value = 'full selfp'
[../]
[./u]
vars = 'u'
# PETSc options for this subsolver
# A prefix will be applied, so just put the options for this subsolver only
petsc_options_iname = '-pc_type -ksp_type'
petsc_options_value = ' hypre preonly'
[../]
[./v]
vars = 'v'
# PETSc options for this subsolver
petsc_options_iname = '-pc_type -ksp_type'
petsc_options_value = ' hypre preonly'
[../]
[../]
[]
[Outputs]
file_base = out
exodus = true
[]
(modules/contact/test/tests/fieldsplit/frictional_mortar_FS.i)
offset = 0.021
vy = 0.15
vx = 0.04
refine = 1
[GlobalParams]
displacements = 'disp_x disp_y'
volumetric_locking_correction = true
[]
[Mesh]
[original_file_mesh]
type = FileMeshGenerator
file = long_short_blocks.e
[]
uniform_refine = ${refine}
[]
[Modules/TensorMechanics/Master]
[all]
strain = FINITE
incremental = true
add_variables = true
block = '1 2'
use_automatic_differentiation = true
[]
[]
[Functions]
[horizontal_movement]
type = ParsedFunction
expression = 'if(t<0.5,${vx}*t-${offset},${vx}-${offset})'
[]
[vertical_movement]
type = ParsedFunction
expression = 'if(t<0.5,${offset},${vy}*(t-0.5)+${offset})'
[]
[]
[BCs]
[push_left_x]
type = FunctionDirichletBC
variable = disp_x
boundary = 30
function = horizontal_movement
preset = false
[]
[fix_right_x]
type = DirichletBC
variable = disp_x
boundary = 40
value = 0.0
[]
[fix_right_y]
type = DirichletBC
variable = disp_y
boundary = '40'
value = 0.0
[]
[push_left_y]
type = FunctionDirichletBC
variable = disp_y
boundary = '30'
function = vertical_movement
preset = false
[]
[]
[Materials]
[elasticity_tensor_left]
type = ADComputeIsotropicElasticityTensor
block = 1
youngs_modulus = 1.0e6
poissons_ratio = 0.3
[]
[stress_left]
type = ADComputeFiniteStrainElasticStress
block = 1
[]
[elasticity_tensor_right]
type = ADComputeIsotropicElasticityTensor
block = 2
youngs_modulus = 1.0e6
poissons_ratio = 0.3
[]
[stress_right]
type = ADComputeFiniteStrainElasticStress
block = 2
[]
[]
[Contact]
[leftright]
secondary = 10
primary = 20
model = coulomb
friction_coefficient = 0.2
formulation = mortar
c_normal = 1e5
c_tangential = 1e4
[]
[]
[ICs]
[disp_y]
block = 1
variable = disp_y
value = ${offset}
type = ConstantIC
[]
[disp_x]
block = 1
variable = disp_x
value = -${offset}
type = ConstantIC
[]
[]
[Preconditioning]
[FSP]
type = FSP
topsplit = 'contact_interior'
[contact_interior]
splitting = 'interior contact'
splitting_type = schur
petsc_options = '-snes_ksp_ew'
petsc_options_iname = '-ksp_gmres_restart -pc_fieldsplit_schur_fact_type -mat_mffd_err'
petsc_options_value = '200 full 1e-5'
schur_pre = 'S'
[]
[interior]
vars = 'disp_x disp_y'
petsc_options_iname = '-ksp_type -pc_type -pc_hypre_type '
petsc_options_value = 'gmres hypre boomeramg'
[]
[contact]
vars = 'leftright_normal_lm leftright_tangential_lm'
[]
[]
[]
[Executioner]
type = Transient
solve_type = 'PJFNK'
dt = 0.1
end_time = 1
abort_on_solve_fail = true
l_max_its = 200
nl_abs_tol = 1e-8
line_search = 'none'
nl_max_its = 20
[]
[Outputs]
exodus = true
[]
(modules/contact/test/tests/fieldsplit/frictionless_mortar_FS.i)
offset = 0.021
vy = 0.15
vx = 0.04
refine = 1
[GlobalParams]
displacements = 'disp_x disp_y'
volumetric_locking_correction = true
[]
[Mesh]
[original_file_mesh]
type = FileMeshGenerator
file = long_short_blocks.e
[]
uniform_refine = ${refine}
[]
[Modules/TensorMechanics/Master]
[all]
strain = FINITE
incremental = true
add_variables = true
block = '1 2'
use_automatic_differentiation = true
[]
[]
[Functions]
[horizontal_movement]
type = ParsedFunction
value = 'if(t<0.5,${vx}*t-${offset},${vx}-${offset})'
[]
[vertical_movement]
type = ParsedFunction
value = 'if(t<0.5,${offset},${vy}*(t-0.5)+${offset})'
[]
[]
[BCs]
[push_left_x]
type = FunctionDirichletBC
variable = disp_x
boundary = 30
function = horizontal_movement
preset = false
[]
[fix_right_x]
type = DirichletBC
variable = disp_x
boundary = 40
value = 0.0
[]
[fix_right_y]
type = DirichletBC
variable = disp_y
boundary = '40'
value = 0.0
[]
[push_left_y]
type = FunctionDirichletBC
variable = disp_y
boundary = '30'
function = vertical_movement
preset = false
[]
[]
[Materials]
[elasticity_tensor_left]
type = ADComputeIsotropicElasticityTensor
block = 1
youngs_modulus = 1.0e6
poissons_ratio = 0.3
[]
[stress_left]
type = ADComputeFiniteStrainElasticStress
block = 1
[]
[elasticity_tensor_right]
type = ADComputeIsotropicElasticityTensor
block = 2
youngs_modulus = 1.0e6
poissons_ratio = 0.3
[]
[stress_right]
type = ADComputeFiniteStrainElasticStress
block = 2
[]
[]
[Contact]
[leftright]
secondary = 10
primary = 20
model = frictionless
formulation = mortar
c_normal = 1e6
[]
[]
[ICs]
[disp_y]
block = 1
variable = disp_y
value = ${offset}
type = ConstantIC
[]
[disp_x]
block = 1
variable = disp_x
value = -${offset}
type = ConstantIC
[]
[]
[Preconditioning]
[FSP]
type = FSP
topsplit = 'contact_interior'
[contact_interior]
splitting = 'interior contact'
splitting_type = schur
petsc_options = '-snes_ksp_ew'
petsc_options_iname = '-ksp_gmres_restart -pc_fieldsplit_schur_fact_type -mat_mffd_err'
petsc_options_value = '200 full 1e-5'
schur_pre = 'S'
[]
[interior]
vars = 'disp_x disp_y'
petsc_options_iname = '-ksp_type -pc_type -pc_hypre_type '
petsc_options_value = 'gmres hypre boomeramg'
[]
[contact]
vars = 'leftright_normal_lm'
[]
[]
[]
[Executioner]
type = Transient
solve_type = 'PJFNK'
dt = 0.1
end_time = 1
abort_on_solve_fail = true
l_max_its = 200
nl_abs_tol = 1e-8
line_search = 'none'
nl_max_its = 20
[]
[Outputs]
exodus = true
[]
[Postprocessors]
[lin]
type = NumLinearIterations
outputs = 'console'
[]
[cum]
type = CumulativeValuePostprocessor
postprocessor = 'lin'
outputs = 'console'
[]
[]
(python/peacock/tests/input_tab/InputFileEditor/gold/fsp_test.i)
[Mesh]
type = GeneratedMesh
dim = 2
nx = 2
ny = 2
[]
[Variables]
[u]
order = FIRST
family = LAGRANGE
[]
[v]
order = FIRST
family = LAGRANGE
[]
[]
[Kernels]
[diff_u]
type = Diffusion
variable = u
[]
[conv_v]
type = CoupledForce
variable = v
v = 'u'
[]
[diff_v]
type = Diffusion
variable = v
[]
[]
[BCs]
inactive = 'right_v'
[left_u]
type = DirichletBC
variable = u
boundary = '1'
value = 0
[]
[right_u]
type = DirichletBC
variable = u
boundary = '2'
value = 100
[]
[left_v]
type = DirichletBC
variable = v
boundary = '1'
value = 0
[]
[right_v]
type = DirichletBC
variable = v
boundary = '2'
value = 0
[]
[]
[Executioner]
# This is setup automatically in MOOSE (SetupPBPAction.C)
# petsc_options = '-snes_mf_operator'
# petsc_options_iname = '-pc_type'
# petsc_options_value = 'asm'
type = Steady
[]
[Preconditioning]
[FSP]
# It is the starting point of splitting
type = FSP
topsplit = 'uv' # uv should match the following block name
[uv]
# Generally speaking, there are four types of splitting we could choose
# <additive,multiplicative,symmetric_multiplicative,schur>
# An approximate solution to the original system
# | A_uu A_uv | | u | _ |f_u|
# | 0 A_vv | | v | - |f_v|
# is obtained by solving the following subsystems
# A_uu u = f_u and A_vv v = f_v
# If splitting type is specified as schur, we may also want to set more options to
# control how schur works using PETSc options
# petsc_options_iname = '-pc_fieldsplit_schur_fact_type -pc_fieldsplit_schur_precondition'
# petsc_options_value = 'full selfp'
splitting = 'u v' # u and v are the names of subsolvers
splitting_type = additive
[]
[u]
# PETSc options for this subsolver
# A prefix will be applied, so just put the options for this subsolver only
vars = 'u'
petsc_options_iname = '-pc_type -ksp_type'
petsc_options_value = ' hypre preonly'
[]
[v]
# PETSc options for this subsolver
vars = 'v'
petsc_options_iname = '-pc_type -ksp_type'
petsc_options_value = ' hypre preonly'
[]
[]
[]
[Outputs]
file_base = out
exodus = true
[]
(test/tests/preconditioners/fsp/vector-test.i)
[Mesh]
type = GeneratedMesh
nx = 5
ny = 5
dim = 2
[]
[Variables]
[u]
family = LAGRANGE_VEC
[]
[v]
family = LAGRANGE_VEC
[]
[]
[Kernels]
[time_u]
type = VectorTimeDerivative
variable = u
[]
[fn_u]
type = VectorBodyForce
variable = u
function_x = 1
function_y = 1
[]
[time_v]
type = VectorCoupledTimeDerivative
variable = v
v = u
[]
[diff_v]
type = VectorDiffusion
variable = v
[]
[]
[BCs]
[left]
type = VectorDirichletBC
variable = v
boundary = 'left'
values = '0 0 0'
[]
[right]
type = VectorDirichletBC
variable = v
boundary = 'right'
values = '1 1 0'
[]
[]
[Preconditioning]
[FSP]
type = FSP
topsplit = 'uv'
[uv]
splitting = 'u v'
# Generally speaking, there are four types of splitting we could choose
# <additive,multiplicative,symmetric_multiplicative,schur>
splitting_type = symmetric_multiplicative
[]
[u]
vars = 'u'
petsc_options_iname = '-pc_type -ksp_type'
petsc_options_value = ' hypre preonly'
[]
[v]
vars = 'v'
petsc_options_iname = '-pc_type -ksp_type'
petsc_options_value = ' hypre preonly'
[]
[]
[]
[Executioner]
type = Transient
num_steps = 1
solve_type = 'NEWTON'
[]
[Outputs]
exodus = true
[]
(test/tests/preconditioners/fsp/missing-var-in-split.i)
[Mesh]
[square]
type = GeneratedMeshGenerator
nx = 2
ny = 2
dim = 2
[]
[]
[Variables]
[u][]
[v][]
[w][]
[]
[Kernels]
[diff_u]
type = Diffusion
variable = u
[]
[diff_v]
type = Diffusion
variable = v
[]
[diff_w]
type = Diffusion
variable = w
[]
[]
[BCs]
[left_u]
type = DirichletBC
variable = u
boundary = 3
value = 0
[]
[right_u]
type = DirichletBC
variable = u
boundary = 1
value = 100
[]
[left_v]
type = DirichletBC
variable = v
boundary = 3
value = 0
[]
[right_v]
type = DirichletBC
variable = v
boundary = 1
value = 0
[]
[left_w]
type = DirichletBC
variable = w
boundary = 3
value = 0
[]
[right_w]
type = DirichletBC
variable = w
boundary = 1
value = 0
[]
[]
[Executioner]
type = Steady
[]
[Preconditioning]
[FSP]
type = FSP
topsplit = 'uv'
[uv]
splitting = 'u v'
splitting_type = additive
[]
[u]
vars = 'u'
petsc_options_iname = '-pc_type -ksp_type'
petsc_options_value = ' hypre preonly'
[]
[v]
vars = 'v'
petsc_options_iname = '-pc_type -ksp_type'
petsc_options_value = ' hypre preonly'
[]
[]
[]
(test/tests/preconditioners/fsp/array-test.i)
[Mesh]
type = GeneratedMesh
dim = 2
nx = 4
ny = 4
[]
[Variables]
[u]
order = FIRST
family = LAGRANGE
components = 2
[]
[v]
[]
[]
[Kernels]
[diff]
type = ArrayDiffusion
variable = u
diffusion_coefficient = dc
[]
[reaction]
type = ArrayReaction
variable = u
reaction_coefficient = rc
[]
[diffv]
type = Diffusion
variable = v
[]
[vu]
type = ArrayCoupledForce
variable = u
v = v
coef = '0 0.5'
[]
[]
[BCs]
[left]
type = ArrayDirichletBC
variable = u
boundary = 1
values = '0 0'
[]
[right]
type = ArrayDirichletBC
variable = u
boundary = 2
values = '1 2'
[]
[leftv]
type = DirichletBC
variable = v
boundary = 1
value = 0
[]
[rightv]
type = DirichletBC
variable = v
boundary = 2
value = 2
[]
[]
[Materials]
[dc]
type = GenericConstantArray
prop_name = dc
prop_value = '1 1'
[]
[rc]
type = GenericConstant2DArray
prop_name = rc
prop_value = '1 0; -0.1 1'
[]
[]
[Preconditioning]
[FSP]
type = FSP
topsplit = 'uv'
[uv]
splitting = 'u v'
# Generally speaking, there are four types of splitting we could choose
# <additive,multiplicative,symmetric_multiplicative,schur>
splitting_type = symmetric_multiplicative
[]
[u]
vars = 'u'
petsc_options_iname = '-pc_type -ksp_type'
petsc_options_value = ' hypre preonly'
[]
[v]
vars = 'v'
petsc_options_iname = '-pc_type -ksp_type'
petsc_options_value = ' hypre preonly'
[]
[]
[]
[Postprocessors]
[intu0]
type = ElementIntegralArrayVariablePostprocessor
variable = u
component = 0
[]
[intu1]
type = ElementIntegralArrayVariablePostprocessor
variable = u
component = 1
[]
[intv]
type = ElementIntegralVariablePostprocessor
variable = v
[]
[]
[Executioner]
type = Steady
solve_type = 'NEWTON'
[]
[Outputs]
exodus = true
[]
(modules/navier_stokes/test/tests/finite_element/ins/pressure_channel/open_bc_pressure_BC_fieldSplit.i)
# This input file tests Dirichlet pressure in/outflow boundary conditions for the incompressible NS equations.
[GlobalParams]
gravity = '0 0 0'
[]
[Mesh]
type = GeneratedMesh
dim = 2
xmin = 0
xmax = 3.0
ymin = 0
ymax = 1.0
nx = 30
ny = 10
elem_type = QUAD9
[]
[Variables]
[./vel_x]
order = SECOND
family = LAGRANGE
[../]
[./vel_y]
order = SECOND
family = LAGRANGE
[../]
[./p]
order = FIRST
family = LAGRANGE
[../]
[]
[Kernels]
[./mass]
type = INSMass
variable = p
u = vel_x
v = vel_y
pressure = p
[../]
[./x_momentum_space]
type = INSMomentumLaplaceForm
variable = vel_x
u = vel_x
v = vel_y
pressure = p
component = 0
integrate_p_by_parts = false
[../]
[./y_momentum_space]
type = INSMomentumLaplaceForm
variable = vel_y
u = vel_x
v = vel_y
pressure = p
component = 1
integrate_p_by_parts = false
[../]
[]
[BCs]
[./x_no_slip]
type = DirichletBC
variable = vel_x
boundary = 'top bottom'
value = 0.0
[../]
[./y_no_slip]
type = DirichletBC
variable = vel_y
boundary = 'left top bottom'
value = 0.0
[../]
[./inlet_p]
type = DirichletBC
variable = p
boundary = left
value = 1.0
[../]
[./outlet_p]
type = DirichletBC
variable = p
boundary = right
value = 0.0
[../]
[]
[Materials]
[./const]
type = GenericConstantMaterial
block = 0
prop_names = 'rho mu'
prop_values = '1 1'
[../]
[]
[Preconditioning]
active = FSP
[./FSP]
type = FSP
# It is the starting point of splitting
topsplit = 'up' # 'up' should match the following block name
[./up]
splitting = 'u p' # 'u' and 'p' are the names of subsolvers
splitting_type = schur
# Splitting type is set as schur, because the pressure part of Stokes-like systems
# is not diagonally dominant. CAN NOT use additive, multiplicative and etc.
# Original system:
# | A B | | u | = | f_u |
# | C 0 | | p | | f_v |
# is factorized into
# |I 0 | | A 0| | I A^{-1}B | | u | = | f_u |
# |CA^{-1} I | | 0 -S| | 0 I | | p | | f_v |
# S = CA^{-1}B
# The preconditioning is accomplished via the following steps
# (1) p^{(0)} = f_v - CA^{-1}f_u,
# (2) pressure = (-S)^{-1} p^{(0)}
# (3) u = A^{-1}(f_u-Bp)
petsc_options_iname = '-pc_fieldsplit_schur_fact_type -pc_fieldsplit_schur_precondition'
petsc_options_value = 'full selfp'
# Factorization type here is full, which means we approximate the original system
# exactly. There are three other options:
# diag:
# | A 0|
# | 0 -S|
# lower:
# |I 0 |
# |CA^{-1} -S |
# upper:
# | I A^{-1}B |
# | 0 -S |
# The preconditioning matrix is set as selfp, which means we explicitly form a
# matrix \hat{S} = C(diag(A))^{-1}B. We do not compute the inverse of A, but instead, we compute
# the inverse of diag(A).
[../]
[./u]
vars = 'vel_x vel_y'
# PETSc options for this subsolver
# A prefix will be applied, so just put the options for this subsolver only
petsc_options_iname = '-pc_type -ksp_type -ksp_rtol'
petsc_options_value = ' hypre gmres 1e-4'
# Specify options to solve A^{-1} in the steps (1), (2) and (3).
# Solvers for A^{-1} could be different in different steps. We could
# choose in the following pressure block.
[../]
[./p]
vars = 'p'
# PETSc options for this subsolver in the step (2)
petsc_options_iname = '-pc_type -ksp_type -ksp_rtol'
petsc_options_value = ' jacobi gmres 1e-4'
# Use -inner_ksp_type and -inner_pc_type to override A^{-1} in the step (2)
# Use -lower_ksp_type and -lower_pc_type to override A^{-1} in the step (1)
[../]
[../]
[]
[Executioner]
type = Steady
solve_type = PJFNK
nl_rel_tol = 1e-12
nl_max_its = 6
l_tol = 1e-6
l_max_its = 300
[]
[Outputs]
file_base = open_bc_out_pressure_BC_fieldSplit
exodus = true
[]
(modules/contact/test/tests/fieldsplit/2blocks3d.i)
[GlobalParams]
displacements = 'disp_x disp_y disp_z'
volumetric_locking_correction = true
[]
[Mesh]
file = 2blocks3d.e
patch_size = 5
[]
[Problem]
error_on_jacobian_nonzero_reallocation = true
[]
[Modules/TensorMechanics/Master]
[./all]
strain = FINITE
incremental = true
add_variables = true
[../]
[]
[AuxVariables]
[./penetration]
order = FIRST
family = LAGRANGE
[../]
[]
[Functions]
[./horizontal_movement]
type = ParsedFunction
expression = t/10.0
[../]
[]
[AuxKernels]
[./penetration]
type = PenetrationAux
variable = penetration
boundary = 2
paired_boundary = 3
order = FIRST
[../]
[]
[BCs]
[./push_x]
type = FunctionDirichletBC
variable = disp_x
boundary = 1
function = horizontal_movement
[../]
[./fix_x]
type = DirichletBC
variable = disp_x
boundary = 4
value = 0.0
[../]
[./fix_y]
type = DirichletBC
variable = disp_y
boundary = '1 4'
value = 0.0
[../]
[./fix_z]
type = DirichletBC
variable = disp_z
boundary = '1 4'
value = 0.0
[../]
[]
[Materials]
[./elasticity_tensor_left]
type = ComputeIsotropicElasticityTensor
block = 1
youngs_modulus = 1.0e6
poissons_ratio = 0.3
[../]
[./stress_left]
type = ComputeFiniteStrainElasticStress
block = 1
[../]
[./elasticity_tensor_right]
type = ComputeIsotropicElasticityTensor
block = 2
youngs_modulus = 1.0e6
poissons_ratio = 0.3
[../]
[./stress_right]
type = ComputeFiniteStrainElasticStress
block = 2
[../]
[]
[Contact]
[./leftright]
secondary = 2
primary = 3
model = frictionless
penalty = 1e+6
normalize_penalty = true
formulation = kinematic
normal_smoothing_distance = 0.1
[../]
[]
[Preconditioning]
[./FSP]
type = FSP
# It is the starting point of splitting
topsplit = 'contact_interior' # 'contact_interior' should match the following block name
[./contact_interior]
splitting = 'contact interior'
splitting_type = multiplicative
[../]
[./interior]
type = ContactSplit
vars = 'disp_x disp_y disp_z'
uncontact_primary = '3'
uncontact_secondary = '2'
uncontact_displaced = '1'
blocks = '1 2'
include_all_contact_nodes = 1
petsc_options_iname = '-ksp_type -pc_type -pc_hypre_type -pc_hypre_boomeramg_max_iter -pc_hypre_boomeramg_strong_threshold'
petsc_options_value = 'preonly hypre boomeramg 1 0.25'
[../]
[./contact]
type = ContactSplit
vars = 'disp_x disp_y disp_z'
contact_primary = '3'
contact_secondary = '2'
contact_displaced = '1'
include_all_contact_nodes = 1
petsc_options_iname = '-ksp_type -pc_type -pc_asm_overlap -sub_pc_type'
petsc_options_value = 'preonly asm 1 lu'
[../]
[../]
[]
[Executioner]
type = Transient
solve_type = 'PJFNK'
dt = 0.1
dtmin = 0.1
end_time = 0.1
l_tol = 1e-4
l_max_its = 100
nl_rel_tol = 1e-10
nl_abs_tol = 1e-6
nl_max_its = 100
[]
[Outputs]
file_base = 2blocks3d_out
[./exodus]
type = Exodus
[../]
[./console]
type = Console
max_rows = 5
[../]
[]
(python/peacock/tests/input_tab/InputTree/gold/fsp_test.i)
[Mesh]
type = GeneratedMesh
dim = 2
nx = 2
ny = 2
[]
[Variables]
[u]
order = FIRST
family = LAGRANGE
[]
[v]
order = FIRST
family = LAGRANGE
[]
[]
[Kernels]
[diff_u]
type = Diffusion
variable = u
[]
[conv_v]
type = CoupledForce
variable = v
v = 'u'
[]
[diff_v]
type = Diffusion
variable = v
[]
[]
[BCs]
inactive = 'right_v'
[left_u]
type = DirichletBC
variable = u
boundary = '1'
value = 0
[]
[right_u]
type = DirichletBC
variable = u
boundary = '2'
value = 100
[]
[left_v]
type = DirichletBC
variable = v
boundary = '1'
value = 0
[]
[right_v]
type = DirichletBC
variable = v
boundary = '2'
value = 0
[]
[]
[Executioner]
# This is setup automatically in MOOSE (SetupPBPAction.C)
# petsc_options = '-snes_mf_operator'
# petsc_options_iname = '-pc_type'
# petsc_options_value = 'asm'
type = Steady
[]
[Preconditioning]
[FSP]
# It is the starting point of splitting
type = FSP
topsplit = 'uv' # uv should match the following block name
[uv]
# Generally speaking, there are four types of splitting we could choose
# <additive,multiplicative,symmetric_multiplicative,schur>
# An approximate solution to the original system
# | A_uu A_uv | | u | _ |f_u|
# | 0 A_vv | | v | - |f_v|
# is obtained by solving the following subsystems
# A_uu u = f_u and A_vv v = f_v
# If splitting type is specified as schur, we may also want to set more options to
# control how schur works using PETSc options
# petsc_options_iname = '-pc_fieldsplit_schur_fact_type -pc_fieldsplit_schur_precondition'
# petsc_options_value = 'full selfp'
splitting = 'u v' # u and v are the names of subsolvers
splitting_type = additive
[]
[u]
# PETSc options for this subsolver
# A prefix will be applied, so just put the options for this subsolver only
symbol_names = 'u'
petsc_options_iname = '-pc_type -ksp_type'
petsc_options_value = ' hypre preonly'
[]
[v]
# PETSc options for this subsolver
symbol_names = 'v'
petsc_options_iname = '-pc_type -ksp_type'
petsc_options_value = ' hypre preonly'
[]
[]
[]
[Outputs]
file_base = out
exodus = true
[]