- vThe coupled variable whose components are coupled to AuxVariable
C++ Type:std::vector<VariableName>
Unit:(no unit assumed)
Controllable:No
Description:The coupled variable whose components are coupled to AuxVariable
- variableThe name of the variable that this object applies to
C++ Type:AuxVariableName
Unit:(no unit assumed)
Controllable:No
Description:The name of the variable that this object applies to
- vector_tagName of the vector tag to extract values from
C++ Type:TagName
Controllable:No
Description:Name of the vector tag to extract values from
ReactionForceAux
Save the reaction force corresponding to the variable DOFs into this AuxVariable.
Input Parameters
- blockThe list of blocks (ids or names) that this object will be applied
C++ Type:std::vector<SubdomainName>
Controllable:No
Description:The list of blocks (ids or names) that this object will be applied
- boundaryThe list of boundaries (ids or names) from the mesh where this object applies
C++ Type:std::vector<BoundaryName>
Controllable:No
Description:The list of boundaries (ids or names) from the mesh where this object applies
- check_boundary_restrictedTrueWhether to check for multiple element sides on the boundary in the case of a boundary restricted, element aux variable. Setting this to false will allow contribution to a single element's elemental value(s) from multiple boundary sides on the same element (example: when the restricted boundary exists on two or more sides of an element, such as at a corner of a mesh
Default:True
C++ Type:bool
Controllable:No
Description:Whether to check for multiple element sides on the boundary in the case of a boundary restricted, element aux variable. Setting this to false will allow contribution to a single element's elemental value(s) from multiple boundary sides on the same element (example: when the restricted boundary exists on two or more sides of an element, such as at a corner of a mesh
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:Yes
Description:Set the enabled status of the MooseObject.
- search_methodnearest_node_connected_sidesChoice of search algorithm. All options begin by finding the nearest node in the primary boundary to a query point in the secondary boundary. In the default nearest_node_connected_sides algorithm, primary boundary elements are searched iff that nearest node is one of their nodes. This is fast to determine via a pregenerated node-to-elem map and is robust on conforming meshes. In the optional all_proximate_sides algorithm, primary boundary elements are searched iff they touch that nearest node, even if they are not topologically connected to it. This is more CPU-intensive but is necessary for robustness on any boundary surfaces which has disconnections (such as Flex IGA meshes) or non-conformity (such as hanging nodes in adaptively h-refined meshes).
Default:nearest_node_connected_sides
C++ Type:MooseEnum
Options:nearest_node_connected_sides, all_proximate_sides
Controllable:No
Description:Choice of search algorithm. All options begin by finding the nearest node in the primary boundary to a query point in the secondary boundary. In the default nearest_node_connected_sides algorithm, primary boundary elements are searched iff that nearest node is one of their nodes. This is fast to determine via a pregenerated node-to-elem map and is robust on conforming meshes. In the optional all_proximate_sides algorithm, primary boundary elements are searched iff they touch that nearest node, even if they are not topologically connected to it. This is more CPU-intensive but is necessary for robustness on any boundary surfaces which has disconnections (such as Flex IGA meshes) or non-conformity (such as hanging nodes in adaptively h-refined meshes).
- seed0The seed for the master random number generator
Default:0
C++ Type:unsigned int
Controllable:No
Description:The seed for the master random number generator
- use_displaced_meshFalseWhether or not this object should use the displaced mesh for computation. Note that in the case this is true but no displacements are provided in the Mesh block the undisplaced mesh will still be used.
Default:False
C++ Type:bool
Controllable:No
Description:Whether or not this object should use the displaced mesh for computation. Note that in the case this is true but no displacements are provided in the Mesh block the undisplaced mesh will still be used.
Advanced Parameters
- prop_getter_suffixAn optional suffix parameter that can be appended to any attempt to retrieve/get material properties. The suffix will be prepended with a '_' character.
C++ Type:MaterialPropertyName
Unit:(no unit assumed)
Controllable:No
Description:An optional suffix parameter that can be appended to any attempt to retrieve/get material properties. The suffix will be prepended with a '_' character.
- use_interpolated_stateFalseFor the old and older state use projected material properties interpolated at the quadrature points. To set up projection use the ProjectedStatefulMaterialStorageAction.
Default:False
C++ Type:bool
Controllable:No
Description:For the old and older state use projected material properties interpolated at the quadrature points. To set up projection use the ProjectedStatefulMaterialStorageAction.
Material Property Retrieval Parameters
Usage
First declare a tagged vector to save the residual contribution, i.e.
[Problem<<<{"href": "../../syntax/Problem/index.html"}>>>]
extra_tag_vectors = 'ref'
[](modules/solid_mechanics/test/tests/plane_stress/3D_finite_tension_pull.i)Then, inform the SolidMechanics Physics about the declared vector tag. The Physics will automatically accumulate the residual contribution into the tagged vector. Importantly, this should only be done for the Kernels (which are set up by the SolidMechanics Physics), and not for other objects such as boundary conditions.
[Physics<<<{"href": "../../syntax/Physics/index.html"}>>>]
[SolidMechanics<<<{"href": "../../syntax/Physics/SolidMechanics/index.html"}>>>]
[QuasiStatic<<<{"href": "../../syntax/Physics/SolidMechanics/QuasiStatic/index.html"}>>>]
[plane_stress]
strain<<<{"description": "Strain formulation"}>>> = FINITE
extra_vector_tags<<<{"description": "The tag names for extra vectors that residual data should be saved into"}>>> = 'ref'
generate_output<<<{"description": "Add scalar quantity output for stress and/or strain"}>>> = 'stress_xx stress_xy stress_yy stress_zz strain_xx strain_xy strain_yy strain_zz'
add_variables<<<{"description": "Add the displacement variables"}>>> = true
[]
[]
[]
[](modules/solid_mechanics/test/tests/plane_stress/3D_finite_tension_pull.i)Next, use the ReactionForceAux to read the accumulated residual contribution into an AuxVariable, i.e.
[AuxKernels<<<{"href": "../../syntax/AuxKernels/index.html"}>>>]
[react_x]
type = ReactionForceAux<<<{"description": "Extract the value of the residual from an appropriately formed tag vector and save those values as reaction forces in an AuxVariable", "href": "ReactionForceAux.html"}>>>
vector_tag<<<{"description": "Name of the vector tag to extract values from"}>>> = 'ref'
v<<<{"description": "The coupled variable whose components are coupled to AuxVariable"}>>> = 'disp_x'
variable<<<{"description": "The name of the variable that this object applies to"}>>> = 'react_x'
[]
[](modules/solid_mechanics/test/tests/plane_stress/3D_finite_tension_pull.i)In this example, this would save the residual contribution in the direction into the AuxVariable named "react_x". Upon convergence of each time step, the residual contribution from the kernels will be close to zero (up to the tolerances you set) everywhere in the domain except where constraints or boundary conditions are applied. Examples of these constraints are Dirichlet/Neumann boundary conditions, pressure, applied torque, and contact, etc.. The final, accumulated residual contribution on the constrained degrees of freedom can then be interpreted as the distributed "reaction force".
Finally, if desired, the distributed reaction force can be summed up on a boundary to obtain the total reaction force. In the following example, the distributed reaction force is summed up on the "right" boundary where the displacement control is applied.
[AuxVariables<<<{"href": "../../syntax/AuxVariables/index.html"}>>>]
[react_x]
[]
[](modules/solid_mechanics/test/tests/plane_stress/3D_finite_tension_pull.i)Example input files
Input Files
- (modules/solid_mechanics/test/tests/torque_reaction/torque_reaction_cylinder.i)
- (modules/solid_mechanics/test/tests/free_expansion_abs_ref/free_expansion_abs_ref.i)
- (modules/contact/test/tests/pdass_problems/cylinder_friction_penalty.i)
- (modules/solid_mechanics/test/tests/torque_reaction/torque_reaction_3D.i)
- (modules/solid_mechanics/test/tests/plane_stress/3D_finite_tension_pull.i)
- (modules/solid_mechanics/test/tests/plane_stress/weak_plane_stress_finite_tension_pull.i)
- (modules/combined/test/tests/czm_pressure_sidesets/czm_pressure_sideset_cavity.i)
- (modules/contact/test/tests/verification/patch_tests/mindlin/cylinder_friction_node_face.i)
- (modules/contact/test/tests/pdass_problems/cylinder_friction_penalty_adaptivity.i)
- (modules/solid_mechanics/test/tests/torque_reaction/torque_reaction.i)
- (modules/solid_mechanics/test/tests/generalized_plane_strain/generalized_plane_strain_ref_resid.i)
(modules/solid_mechanics/test/tests/plane_stress/3D_finite_tension_pull.i)
[GlobalParams]
order = FIRST
family = LAGRANGE
displacements = 'disp_x disp_y disp_z'
[]
[Problem]
extra_tag_vectors = 'ref'
[]
[Mesh]
[gmg]
type = GeneratedMeshGenerator
dim = 3
nx = 1
ny = 1
nz = 1
[]
[]
[AuxVariables]
[react_x]
[]
[]
[Postprocessors]
[react_x]
type = NodalSum
variable = 'react_x'
boundary = 'right'
[]
[stress_xx]
type = ElementalVariableValue
variable = 'stress_xx'
elementid = 0
[]
[strain_zz]
type = ElementalVariableValue
variable = 'strain_zz'
elementid = 0
[]
[]
[Physics/SolidMechanics/QuasiStatic]
[plane_stress]
strain = FINITE
extra_vector_tags = 'ref'
generate_output = 'stress_xx stress_xy stress_yy stress_zz strain_xx strain_xy strain_yy strain_zz'
add_variables = true
[]
[]
[AuxKernels]
[react_x]
type = ReactionForceAux
vector_tag = 'ref'
v = 'disp_x'
variable = 'react_x'
[]
[]
[BCs]
[leftx]
type = DirichletBC
boundary = left
variable = disp_x
value = 0.0
[]
[bottomy]
type = DirichletBC
boundary = bottom
variable = disp_y
value = 0.0
[]
[backz]
type = DirichletBC
boundary = back
variable = disp_z
value = 0.0
[]
[rightx]
type = FunctionDirichletBC
boundary = right
variable = disp_x
function = 't'
[]
[]
[Materials]
[elasticity_tensor]
type = ComputeIsotropicElasticityTensor
poissons_ratio = 0.3
youngs_modulus = 1e6
[]
[stress]
type = ComputeFiniteStrainElasticStress
[]
[]
[Executioner]
type = Transient
solve_type = PJFNK
line_search = none
nl_rel_tol = 1e-12
nl_abs_tol = 1e-10
# time control
start_time = 0.0
dt = 0.01
dtmin = 0.01
end_time = 0.2
[]
[Outputs]
csv = true
[]
(modules/solid_mechanics/test/tests/plane_stress/3D_finite_tension_pull.i)
[GlobalParams]
order = FIRST
family = LAGRANGE
displacements = 'disp_x disp_y disp_z'
[]
[Problem]
extra_tag_vectors = 'ref'
[]
[Mesh]
[gmg]
type = GeneratedMeshGenerator
dim = 3
nx = 1
ny = 1
nz = 1
[]
[]
[AuxVariables]
[react_x]
[]
[]
[Postprocessors]
[react_x]
type = NodalSum
variable = 'react_x'
boundary = 'right'
[]
[stress_xx]
type = ElementalVariableValue
variable = 'stress_xx'
elementid = 0
[]
[strain_zz]
type = ElementalVariableValue
variable = 'strain_zz'
elementid = 0
[]
[]
[Physics/SolidMechanics/QuasiStatic]
[plane_stress]
strain = FINITE
extra_vector_tags = 'ref'
generate_output = 'stress_xx stress_xy stress_yy stress_zz strain_xx strain_xy strain_yy strain_zz'
add_variables = true
[]
[]
[AuxKernels]
[react_x]
type = ReactionForceAux
vector_tag = 'ref'
v = 'disp_x'
variable = 'react_x'
[]
[]
[BCs]
[leftx]
type = DirichletBC
boundary = left
variable = disp_x
value = 0.0
[]
[bottomy]
type = DirichletBC
boundary = bottom
variable = disp_y
value = 0.0
[]
[backz]
type = DirichletBC
boundary = back
variable = disp_z
value = 0.0
[]
[rightx]
type = FunctionDirichletBC
boundary = right
variable = disp_x
function = 't'
[]
[]
[Materials]
[elasticity_tensor]
type = ComputeIsotropicElasticityTensor
poissons_ratio = 0.3
youngs_modulus = 1e6
[]
[stress]
type = ComputeFiniteStrainElasticStress
[]
[]
[Executioner]
type = Transient
solve_type = PJFNK
line_search = none
nl_rel_tol = 1e-12
nl_abs_tol = 1e-10
# time control
start_time = 0.0
dt = 0.01
dtmin = 0.01
end_time = 0.2
[]
[Outputs]
csv = true
[]
(modules/solid_mechanics/test/tests/plane_stress/3D_finite_tension_pull.i)
[GlobalParams]
order = FIRST
family = LAGRANGE
displacements = 'disp_x disp_y disp_z'
[]
[Problem]
extra_tag_vectors = 'ref'
[]
[Mesh]
[gmg]
type = GeneratedMeshGenerator
dim = 3
nx = 1
ny = 1
nz = 1
[]
[]
[AuxVariables]
[react_x]
[]
[]
[Postprocessors]
[react_x]
type = NodalSum
variable = 'react_x'
boundary = 'right'
[]
[stress_xx]
type = ElementalVariableValue
variable = 'stress_xx'
elementid = 0
[]
[strain_zz]
type = ElementalVariableValue
variable = 'strain_zz'
elementid = 0
[]
[]
[Physics/SolidMechanics/QuasiStatic]
[plane_stress]
strain = FINITE
extra_vector_tags = 'ref'
generate_output = 'stress_xx stress_xy stress_yy stress_zz strain_xx strain_xy strain_yy strain_zz'
add_variables = true
[]
[]
[AuxKernels]
[react_x]
type = ReactionForceAux
vector_tag = 'ref'
v = 'disp_x'
variable = 'react_x'
[]
[]
[BCs]
[leftx]
type = DirichletBC
boundary = left
variable = disp_x
value = 0.0
[]
[bottomy]
type = DirichletBC
boundary = bottom
variable = disp_y
value = 0.0
[]
[backz]
type = DirichletBC
boundary = back
variable = disp_z
value = 0.0
[]
[rightx]
type = FunctionDirichletBC
boundary = right
variable = disp_x
function = 't'
[]
[]
[Materials]
[elasticity_tensor]
type = ComputeIsotropicElasticityTensor
poissons_ratio = 0.3
youngs_modulus = 1e6
[]
[stress]
type = ComputeFiniteStrainElasticStress
[]
[]
[Executioner]
type = Transient
solve_type = PJFNK
line_search = none
nl_rel_tol = 1e-12
nl_abs_tol = 1e-10
# time control
start_time = 0.0
dt = 0.01
dtmin = 0.01
end_time = 0.2
[]
[Outputs]
csv = true
[]
(modules/solid_mechanics/test/tests/plane_stress/3D_finite_tension_pull.i)
[GlobalParams]
order = FIRST
family = LAGRANGE
displacements = 'disp_x disp_y disp_z'
[]
[Problem]
extra_tag_vectors = 'ref'
[]
[Mesh]
[gmg]
type = GeneratedMeshGenerator
dim = 3
nx = 1
ny = 1
nz = 1
[]
[]
[AuxVariables]
[react_x]
[]
[]
[Postprocessors]
[react_x]
type = NodalSum
variable = 'react_x'
boundary = 'right'
[]
[stress_xx]
type = ElementalVariableValue
variable = 'stress_xx'
elementid = 0
[]
[strain_zz]
type = ElementalVariableValue
variable = 'strain_zz'
elementid = 0
[]
[]
[Physics/SolidMechanics/QuasiStatic]
[plane_stress]
strain = FINITE
extra_vector_tags = 'ref'
generate_output = 'stress_xx stress_xy stress_yy stress_zz strain_xx strain_xy strain_yy strain_zz'
add_variables = true
[]
[]
[AuxKernels]
[react_x]
type = ReactionForceAux
vector_tag = 'ref'
v = 'disp_x'
variable = 'react_x'
[]
[]
[BCs]
[leftx]
type = DirichletBC
boundary = left
variable = disp_x
value = 0.0
[]
[bottomy]
type = DirichletBC
boundary = bottom
variable = disp_y
value = 0.0
[]
[backz]
type = DirichletBC
boundary = back
variable = disp_z
value = 0.0
[]
[rightx]
type = FunctionDirichletBC
boundary = right
variable = disp_x
function = 't'
[]
[]
[Materials]
[elasticity_tensor]
type = ComputeIsotropicElasticityTensor
poissons_ratio = 0.3
youngs_modulus = 1e6
[]
[stress]
type = ComputeFiniteStrainElasticStress
[]
[]
[Executioner]
type = Transient
solve_type = PJFNK
line_search = none
nl_rel_tol = 1e-12
nl_abs_tol = 1e-10
# time control
start_time = 0.0
dt = 0.01
dtmin = 0.01
end_time = 0.2
[]
[Outputs]
csv = true
[]
(modules/solid_mechanics/test/tests/torque_reaction/torque_reaction_cylinder.i)
# This test uses the DisplacementAboutAxis boundary condition to twist the top
# of a cylinder while the bottom face of the cylinder remains fixed. The
# TorqueReaction postprocessor is used to calculate the applied torque acting
# on the cylinder at the top face. This test can be extended, with a new mesh,
# to model a crack in the center of the cylinder face under type III loading.
[GlobalParams]
order = FIRST
family = LAGRANGE
displacements = 'disp_x disp_y disp_z'
[]
[Mesh]
file = cylinder.e
[]
[Problem]
extra_tag_vectors = 'ref'
[]
[GlobalParams]
volumetric_locking_correction = true
[]
[AuxVariables]
[saved_x]
[]
[saved_y]
[]
[saved_z]
[]
[]
[AuxKernels]
[saved_x]
type = ReactionForceAux
vector_tag = 'ref'
v = 'disp_x'
variable = 'saved_x'
[]
[saved_y]
type = ReactionForceAux
vector_tag = 'ref'
v = 'disp_y'
variable = 'saved_y'
[]
[saved_z]
type = ReactionForceAux
vector_tag = 'ref'
v = 'disp_z'
variable = 'saved_z'
[]
[]
[Physics/SolidMechanics/QuasiStatic]
[master]
strain = FINITE
generate_output = 'stress_xx'
add_variables = true
extra_vector_tags = 'ref'
[]
[]
[BCs]
[bottom_x]
type = DirichletBC
variable = disp_x
boundary = 1
value = 0.0
[]
[bottom_y]
type = DirichletBC
variable = disp_y
boundary = 1
value = 0.0
[]
[bottom_z]
type = DirichletBC
variable = disp_z
boundary = 1
value = 0.0
[]
[top_x]
type = DisplacementAboutAxis
boundary = 2
function = '0.1*t'
angle_units = degrees
axis_origin = '10. 10. 10.'
axis_direction = '0 -1.0 1.0'
component = 0
variable = disp_x
[]
[top_y]
type = DisplacementAboutAxis
boundary = 2
function = '0.1*t'
angle_units = degrees
axis_origin = '10. 10. 10.'
axis_direction = '0 -1.0 1.0'
component = 1
variable = disp_y
[]
[top_z]
type = DisplacementAboutAxis
boundary = 2
function = '0.1*t'
angle_units = degrees
axis_origin = '10. 10. 10.'
axis_direction = '0 -1.0 1.0'
component = 2
variable = disp_z
[]
[]
[Materials]
[elasticity_tensor]
type = ComputeIsotropicElasticityTensor
youngs_modulus = 207000
poissons_ratio = 0.3
[]
[elastic_stress]
type = ComputeFiniteStrainElasticStress
[]
[]
[Executioner]
type = Transient
solve_type = 'PJFNK'
petsc_options = '-snes_ksp_ew'
petsc_options_iname = '-ksp_gmres_restart'
petsc_options_value = '101'
line_search = 'none'
l_max_its = 50
nl_max_its = 20
nl_abs_tol = 1e-12
nl_rel_tol = 1e-11
l_tol = 1e-10
start_time = 0.0
dt = 0.25
end_time = 0.5
[]
[Postprocessors]
[torque]
type = TorqueReaction
boundary = 2
reaction_force_variables = 'saved_x saved_y saved_z'
axis_origin = '10. 10. 10.'
direction_vector = '0 -1.0 1.0'
[]
[]
[Outputs]
exodus = true
[]
(modules/solid_mechanics/test/tests/free_expansion_abs_ref/free_expansion_abs_ref.i)
[GlobalParams]
displacements = 'disp_x disp_y'
[]
[Problem]
type = ReferenceResidualProblem
reference_vector = 'ref'
extra_tag_vectors = 'ref'
group_variables = 'disp_x disp_y'
[]
[Mesh]
[square]
type = GeneratedMeshGenerator
dim = 2
nx = 2
ny = 2
[]
[eng1]
type = ExtraNodesetGenerator
input = square
new_boundary = 'lower_left'
coord = '0 0'
[]
[eng2]
type = ExtraNodesetGenerator
input = eng1
new_boundary = 'lower_right'
coord = '1 0'
[]
[]
[AuxVariables]
[temp]
[]
[ref_x]
[]
[ref_y]
[]
[]
[AuxKernels]
[tempfuncaux]
type = FunctionAux
variable = temp
function = '(1-x)*t'
use_displaced_mesh = false
[]
[ref_x]
type = ReactionForceAux
variable = 'ref_x'
vector_tag = 'ref'
v = 'disp_x'
[]
[ref_y]
type = ReactionForceAux
variable = 'ref_y'
vector_tag = 'ref'
v = 'disp_y'
[]
[]
[BCs]
[fix_x]
type = DirichletBC
boundary = 'lower_left'
variable = disp_x
value = 0.0
[]
[fix_y]
type = DirichletBC
boundary = 'lower_left lower_right'
variable = disp_y
value = 0.0
[]
[]
[Physics/SolidMechanics/QuasiStatic]
[all]
strain = SMALL
add_variables = true
temperature = temp
generate_output = 'stress_xx stress_xy stress_yy stress_zz strain_xx strain_xy strain_yy strain_zz'
planar_formulation = PLANE_STRAIN
eigenstrain_names = eigenstrain
absolute_value_vector_tags = 'ref'
[]
[]
[Materials]
[elasticity_tensor]
type = ComputeIsotropicElasticityTensor
youngs_modulus = 1e6
poissons_ratio = 0.3
[]
[elastic_stress]
type = ComputeLinearElasticStress
[]
[thermal_strain]
type = ComputeThermalExpansionEigenstrain
thermal_expansion_coeff = 0.02
temperature = temp
stress_free_temperature = 0.5
eigenstrain_name = eigenstrain
[]
[]
[Executioner]
type = Transient
solve_type = PJFNK
line_search = none
l_max_its = 100
l_tol = 1e-8
nl_max_its = 15
nl_rel_tol = 1e-10
nl_abs_tol = 1e-12
start_time = 0.0
dt = 1.0
dtmin = 1.0
end_time = 2.0
[]
[Outputs]
exodus = true
[]
(modules/contact/test/tests/pdass_problems/cylinder_friction_penalty.i)
[GlobalParams]
volumetric_locking_correction = true
displacements = 'disp_x disp_y'
[]
[Mesh]
[input_file]
type = FileMeshGenerator
file = hertz_cyl_coarser.e
[]
[secondary]
type = LowerDBlockFromSidesetGenerator
new_block_id = 10001
new_block_name = 'secondary_lower'
sidesets = '3'
input = input_file
[]
[primary]
type = LowerDBlockFromSidesetGenerator
new_block_id = 10000
sidesets = '2'
new_block_name = 'primary_lower'
input = secondary
[]
allow_renumbering = false
[]
[Problem]
type = ReferenceResidualProblem
extra_tag_vectors = 'ref'
reference_vector = 'ref'
[]
[Variables]
[disp_x]
[]
[disp_y]
[]
[]
[AuxVariables]
[penalty_normal_pressure]
order = FIRST
family = LAGRANGE
[]
[penalty_frictional_pressure]
order = FIRST
family = LAGRANGE
[]
[accumulated_slip_one]
order = FIRST
family = LAGRANGE
[]
[tangential_vel_one]
order = FIRST
family = LAGRANGE
[]
[weighted_gap]
order = FIRST
family = LAGRANGE
[]
[stress_xx]
order = CONSTANT
family = MONOMIAL
[]
[stress_yy]
order = CONSTANT
family = MONOMIAL
[]
[stress_xy]
order = CONSTANT
family = MONOMIAL
[]
[react_x]
[]
[react_y]
[]
[]
[Functions]
[disp_ramp_vert]
type = PiecewiseLinear
x = '0. 1. 3.5'
y = '0. -0.020 -0.020'
[]
[disp_ramp_horz]
type = PiecewiseLinear
x = '0. 1. 3.5'
y = '0. 0.0 0.015'
[]
[]
[Kernels]
[TensorMechanics]
use_displaced_mesh = true
extra_vector_tags = 'ref'
block = '1 2 3 4 5 6 7'
[]
[]
[AuxKernels]
[penalty_normal_pressure_auxk]
type = MortarUserObjectAux
variable = penalty_normal_pressure
user_object = friction_uo
contact_quantity = normal_pressure
[]
[penalty_frictional_pressure_auxk]
type = MortarUserObjectAux
variable = penalty_frictional_pressure
user_object = friction_uo
contact_quantity = tangential_pressure_one
[]
[penalty_accumulated_slip_auxk]
type = MortarUserObjectAux
variable = accumulated_slip_one
user_object = friction_uo
contact_quantity = accumulated_slip_one
[]
[penalty_tangential_vel_auxk]
type = MortarUserObjectAux
variable = tangential_vel_one
user_object = friction_uo
contact_quantity = tangential_velocity_one
[]
[penalty_weighted_gap_auxk]
type = MortarUserObjectAux
variable = weighted_gap
user_object = friction_uo
contact_quantity = normal_gap
[]
[stress_xx]
type = RankTwoAux
rank_two_tensor = stress
variable = stress_xx
index_i = 0
index_j = 0
execute_on = timestep_end
block = '1 2 3 4 5 6 7'
[]
[stress_yy]
type = RankTwoAux
rank_two_tensor = stress
variable = stress_yy
index_i = 1
index_j = 1
execute_on = timestep_end
block = '1 2 3 4 5 6 7'
[]
[stress_xy]
type = RankTwoAux
rank_two_tensor = stress
variable = stress_xy
index_i = 0
index_j = 1
execute_on = timestep_end
block = '1 2 3 4 5 6 7'
[]
[react_x]
type = ReactionForceAux
vector_tag = 'ref'
v = 'disp_x'
variable = 'react_x'
[]
[react_y]
type = ReactionForceAux
vector_tag = 'ref'
v = 'disp_y'
variable = 'react_y'
[]
[]
[Postprocessors]
[bot_react_x]
type = NodalSum
variable = react_x
boundary = 1
[]
[bot_react_y]
type = NodalSum
variable = react_y
boundary = 1
[]
[top_react_x]
type = NodalSum
variable = react_x
boundary = 4
[]
[top_react_y]
type = NodalSum
variable = react_y
boundary = 4
[]
[]
[BCs]
[side_x]
type = DirichletBC
variable = disp_y
boundary = '1 2'
value = 0.0
[]
[bot_y]
type = DirichletBC
variable = disp_x
boundary = '1 2'
value = 0.0
[]
[top_y_disp]
type = FunctionDirichletBC
variable = disp_y
boundary = 4
function = disp_ramp_vert
[]
[top_x_disp]
type = FunctionDirichletBC
variable = disp_x
boundary = 4
function = disp_ramp_horz
[]
[]
[Materials]
[stuff1_elas_tens]
type = ComputeIsotropicElasticityTensor
block = '1'
youngs_modulus = 1e10
poissons_ratio = 0.0
[]
[stuff1_strain]
type = ComputeFiniteStrain
block = '1'
[]
[stuff1_stress]
type = ComputeFiniteStrainElasticStress
block = '1'
[]
[stuff2_elas_tens]
type = ComputeIsotropicElasticityTensor
block = '2 3 4 5 6 7'
youngs_modulus = 1e6
poissons_ratio = 0.3
[]
[stuff2_strain]
type = ComputeFiniteStrain
block = '2 3 4 5 6 7'
[]
[stuff2_stress]
type = ComputeFiniteStrainElasticStress
block = '2 3 4 5 6 7'
[]
[]
[Executioner]
type = Transient
solve_type = 'PJFNK'
petsc_options = '-snes_ksp_ew'
petsc_options_iname = '-pc_type -pc_factor_mat_solver_type -pc_factor_shift_type -pc_factor_shift_amount -mat_mffd_err'
petsc_options_value = 'lu superlu_dist NONZERO 1e-15 1e-5'
line_search = 'none'
nl_abs_tol = 1e-14
nl_rel_tol = 1e-10
start_time = 0.0
end_time = 0.3 # 3.5
l_tol = 1e-4
dt = 0.1
dtmin = 0.001
[Predictor]
type = SimplePredictor
scale = 1.0
[]
[]
[Preconditioning]
[SMP]
type = SMP
full = true
[]
[]
[VectorPostprocessors]
[x_disp]
type = NodalValueSampler
variable = disp_x
boundary = '3'
sort_by = id
[]
[y_disp]
type = NodalValueSampler
variable = disp_y
boundary = '3'
sort_by = id
[]
[cont_press]
type = NodalValueSampler
variable = penalty_normal_pressure
boundary = '3'
sort_by = id
[]
[friction]
type = NodalValueSampler
variable = penalty_frictional_pressure
boundary = '3'
sort_by = id
[]
[]
[Outputs]
print_linear_residuals = true
perf_graph = true
exodus = true
csv = false
[console]
type = Console
max_rows = 5
[]
[chkfile]
type = CSV
show = 'x_disp y_disp cont_press friction'
file_base = cylinder_friction_penalty_check
create_final_symlink = true
execute_on = 'FINAL'
[]
[]
[UserObjects]
[friction_uo]
type = PenaltyFrictionUserObject
primary_boundary = '2'
secondary_boundary = '3'
primary_subdomain = '10000'
secondary_subdomain = '10001'
disp_x = disp_x
disp_y = disp_y
friction_coefficient = 0.4 # with 2.0 works
secondary_variable = disp_x
penalty = 5e9
penalty_friction = 1e7
[]
[]
[Constraints]
[x]
type = NormalMortarMechanicalContact
primary_boundary = '2'
secondary_boundary = '3'
primary_subdomain = '10000'
secondary_subdomain = '10001'
secondary_variable = disp_x
component = x
use_displaced_mesh = true
compute_lm_residuals = false
weighted_gap_uo = friction_uo
[]
[y]
type = NormalMortarMechanicalContact
primary_boundary = '2'
secondary_boundary = '3'
primary_subdomain = '10000'
secondary_subdomain = '10001'
secondary_variable = disp_y
component = y
use_displaced_mesh = true
compute_lm_residuals = false
weighted_gap_uo = friction_uo
[]
[tangential_x]
type = TangentialMortarMechanicalContact
primary_boundary = 2
secondary_boundary = 3
primary_subdomain = 10000
secondary_subdomain = 10001
secondary_variable = disp_x
component = x
use_displaced_mesh = true
compute_lm_residuals = false
weighted_velocities_uo = friction_uo
[]
[tangential_y]
type = TangentialMortarMechanicalContact
primary_boundary = 2
secondary_boundary = 3
primary_subdomain = 10000
secondary_subdomain = 10001
secondary_variable = disp_y
component = y
use_displaced_mesh = true
compute_lm_residuals = false
weighted_velocities_uo = friction_uo
[]
[]
(modules/solid_mechanics/test/tests/torque_reaction/torque_reaction_3D.i)
# Scalar torque reaction
# This test computes the sum of the torques acting on a single element cube mesh.
# Equal displacements in the x and the z are applied along the cube top to
# create a shear force along the (1, 0, 1) direction. The rotation origin is
# set to the middle of the bottom face of the cube (0.5, 0, 0.5), and the axis of
# rotation direction vector used to compute the torque reaction is set to (-1, 0, 1).
# Torque is calculated for the four nodes on the top of the cube. The projection
# of the node coordinates is zero for nodes 3 and 6, +1 for node 7, and -1 for
# node 2 from the selection of the direction vector and the rotation axis origin.
[GlobalParams]
order = FIRST
family = LAGRANGE
displacements = 'disp_x disp_y disp_z'
[]
[Mesh]
type = GeneratedMesh
dim = 3
nx = 1
ny = 1
nz = 1
[]
[Problem]
extra_tag_vectors = 'ref'
[]
[GlobalParams]
volumetric_locking_correction = true
[]
[AuxVariables]
[saved_x]
[]
[saved_y]
[]
[saved_z]
[]
[]
[AuxKernels]
[saved_x]
type = ReactionForceAux
vector_tag = 'ref'
v = 'disp_x'
variable = 'saved_x'
[]
[saved_y]
type = ReactionForceAux
vector_tag = 'ref'
v = 'disp_y'
variable = 'saved_y'
[]
[saved_z]
type = ReactionForceAux
vector_tag = 'ref'
v = 'disp_z'
variable = 'saved_z'
[]
[]
[Physics/SolidMechanics/QuasiStatic]
[master]
strain = SMALL
generate_output = 'stress_xx stress_yy stress_zz'
add_variables = true
extra_vector_tags = 'ref'
[]
[]
[BCs]
[bottom_x]
type = DirichletBC
variable = disp_x
boundary = bottom
value = 0.0
[]
[bottom_y]
type = DirichletBC
variable = disp_y
boundary = bottom
value = 0.0
[]
[bottom_z]
type = DirichletBC
variable = disp_z
boundary = bottom
value = 0.0
[]
[top_shear_z]
type = FunctionDirichletBC
variable = disp_z
boundary = top
function = '0.01*t'
[]
[top_shear_x]
type = FunctionDirichletBC
variable = disp_x
boundary = top
function = '0.01*t'
[]
[]
[Materials]
[elasticity_tensor]
type = ComputeIsotropicElasticityTensor
youngs_modulus = 207000
poissons_ratio = 0.3
[]
[elastic_stress]
type = ComputeLinearElasticStress
[]
[]
[Executioner]
type = Transient
#Preconditioned JFNK (default)
solve_type = 'PJFNK'
petsc_options = '-snes_ksp_ew'
petsc_options_iname = '-ksp_gmres_restart'
petsc_options_value = '101'
line_search = 'none'
l_max_its = 30
nl_max_its = 20
nl_abs_tol = 1e-14
nl_rel_tol = 1e-12
l_tol = 1e-8
start_time = 0.0
dt = 0.5
end_time = 1
num_steps = 2
[]
[Postprocessors]
[_dt]
type = TimestepSize
[]
[torque]
type = TorqueReaction
boundary = top
reaction_force_variables = 'saved_x saved_y saved_z'
axis_origin = '0.5 0. 0.5'
direction_vector = '-1. 0. 1.'
[]
[]
[Outputs]
exodus = true
[]
(modules/solid_mechanics/test/tests/plane_stress/3D_finite_tension_pull.i)
[GlobalParams]
order = FIRST
family = LAGRANGE
displacements = 'disp_x disp_y disp_z'
[]
[Problem]
extra_tag_vectors = 'ref'
[]
[Mesh]
[gmg]
type = GeneratedMeshGenerator
dim = 3
nx = 1
ny = 1
nz = 1
[]
[]
[AuxVariables]
[react_x]
[]
[]
[Postprocessors]
[react_x]
type = NodalSum
variable = 'react_x'
boundary = 'right'
[]
[stress_xx]
type = ElementalVariableValue
variable = 'stress_xx'
elementid = 0
[]
[strain_zz]
type = ElementalVariableValue
variable = 'strain_zz'
elementid = 0
[]
[]
[Physics/SolidMechanics/QuasiStatic]
[plane_stress]
strain = FINITE
extra_vector_tags = 'ref'
generate_output = 'stress_xx stress_xy stress_yy stress_zz strain_xx strain_xy strain_yy strain_zz'
add_variables = true
[]
[]
[AuxKernels]
[react_x]
type = ReactionForceAux
vector_tag = 'ref'
v = 'disp_x'
variable = 'react_x'
[]
[]
[BCs]
[leftx]
type = DirichletBC
boundary = left
variable = disp_x
value = 0.0
[]
[bottomy]
type = DirichletBC
boundary = bottom
variable = disp_y
value = 0.0
[]
[backz]
type = DirichletBC
boundary = back
variable = disp_z
value = 0.0
[]
[rightx]
type = FunctionDirichletBC
boundary = right
variable = disp_x
function = 't'
[]
[]
[Materials]
[elasticity_tensor]
type = ComputeIsotropicElasticityTensor
poissons_ratio = 0.3
youngs_modulus = 1e6
[]
[stress]
type = ComputeFiniteStrainElasticStress
[]
[]
[Executioner]
type = Transient
solve_type = PJFNK
line_search = none
nl_rel_tol = 1e-12
nl_abs_tol = 1e-10
# time control
start_time = 0.0
dt = 0.01
dtmin = 0.01
end_time = 0.2
[]
[Outputs]
csv = true
[]
(modules/solid_mechanics/test/tests/plane_stress/weak_plane_stress_finite_tension_pull.i)
[GlobalParams]
order = FIRST
family = LAGRANGE
displacements = 'disp_x disp_y'
out_of_plane_strain = strain_zz
[]
[Problem]
extra_tag_vectors = 'ref'
[]
[Mesh]
[gmg]
type = GeneratedMeshGenerator
dim = 2
nx = 1
ny = 1
[]
[]
[Variables]
[disp_x]
[]
[disp_y]
[]
[strain_zz]
[]
[]
[AuxVariables]
[react_x]
[]
[]
[Postprocessors]
[react_x]
type = NodalSum
variable = 'react_x'
boundary = 'right'
[]
[stress_xx]
type = ElementalVariableValue
variable = 'stress_xx'
elementid = 0
[]
[strain_zz]
type = ElementalVariableValue
variable = 'strain_zz'
elementid = 0
[]
[]
[Physics/SolidMechanics/QuasiStatic]
[plane_stress]
strain = FINITE
planar_formulation = WEAK_PLANE_STRESS
extra_vector_tags = 'ref'
generate_output = 'stress_xx stress_xy stress_yy stress_zz strain_xx strain_xy strain_yy'
[]
[]
[AuxKernels]
[react_x]
type = ReactionForceAux
vector_tag = 'ref'
v = 'disp_x'
variable = 'react_x'
[]
[]
[BCs]
[leftx]
type = DirichletBC
boundary = left
variable = disp_x
value = 0.0
[]
[bottomy]
type = DirichletBC
boundary = bottom
variable = disp_y
value = 0.0
[]
[rightx]
type = FunctionDirichletBC
boundary = right
variable = disp_x
function = 't'
[]
[]
[Materials]
[elasticity_tensor]
type = ComputeIsotropicElasticityTensor
poissons_ratio = 0.3
youngs_modulus = 1e6
[]
[stress]
type = ComputeFiniteStrainElasticStress
[]
[]
[Executioner]
type = Transient
solve_type = PJFNK
line_search = none
nl_rel_tol = 1e-12
nl_abs_tol = 1e-10
# time control
start_time = 0.0
dt = 0.01
dtmin = 0.01
end_time = 0.2
[]
[Outputs]
csv = true
[]
(modules/combined/test/tests/czm_pressure_sidesets/czm_pressure_sideset_cavity.i)
# Pressurization of the sidesets built by MortarCZMDebondedBoundaryUpdater. The
# czm_pressure_sideset.i test is repeated here while the upper block also
# slides tangentially, so the faces paired in the undisplaced configuration are no
# longer aligned. Once the whole interface has failed the blocks carry no load, so the void between
# the two sidesets must equal the integral of the prescribed opening, opening * t * (1 - x / 2),
# over x in [0, 1], which is 3 / 4 * opening * t.
#
# The void is a cavity, connected to an unmeshed plenum of volume Vp, whose gas pressure follows
# the ideal gas law, p (V + Vp) = n R T, and acts on both sidesets, which is only possible if the
# pressure boundary condition picks up the faces added during the run. Gas is injected at a constant
# rate from full separation at t = 0.8 until t = 1, so the pressure first rises, and then falls as
# the peel keeps enlarging the void. Each block is in uniaxial compression, sigma_yy = -p, so that
# - the vertical reactions on lower_bottom and upper_top are +p and -p times the interface length;
# - the lower block displaces by u_y = -p / E * (y + 0.5), and the upper block by
# p / E * (0.5 - y) in addition to the imposed peel;
# - the void area is V = V0 + p / E, with V0 = 3 / 4 * opening * t, as each block of height 0.5
# shortens by p / (2 E).
# These fields are linear, so the elements reproduce them exactly. Substituting V into the gas law
# gives p^2 / E + W p - n R T = 0 with W = V0 + Vp, whose positive root is
# p = E / 2 * (sqrt(W^2 + 4 n R T / E) - W).
opening = 0.1
slide = 0.02
youngs_modulus = 1e9
gas_constant = 8.314
gas_temperature = 300
# Plenum volume, of the order of the void area, which keeps the gas volume positive while the void
# is still closed
plenum_volume = 0.05
# Injection rate chosen so that the pressure peaks near 1e7 at t = 1; p / E = 0.01 is large enough
# to see in the displacements
gas_rate = 2700
[Mesh]
# The interface lies on y = 0, so the void integrand -y n_y vanishes on the vertical closing
# segment at the crack front, which belongs to neither sideset.
[lower]
type = GeneratedMeshGenerator
dim = 2
xmax = 1
ymin = -0.5
ymax = 0
nx = 4
ny = 1
boundary_name_prefix = lower
[]
[lower_id]
type = SubdomainIDGenerator
input = lower
subdomain_id = 1
[]
[upper]
type = GeneratedMeshGenerator
dim = 2
xmax = 1
ymin = 0
ymax = 0.5
nx = 3
ny = 1
boundary_name_prefix = upper
boundary_id_offset = 10
[]
[upper_id]
type = SubdomainIDGenerator
input = upper
subdomain_id = 2
[]
[combined]
type = MeshCollectionGenerator
inputs = 'lower_id upper_id'
[]
[secondary]
type = LowerDBlockFromSidesetGenerator
new_block_id = 10001
new_block_name = secondary_lower
sidesets = lower_top
input = combined
[]
[primary]
type = LowerDBlockFromSidesetGenerator
new_block_id = 10000
new_block_name = primary_lower
sidesets = upper_bottom
input = secondary
[]
add_sideset_names = 'czm_pressure_primary czm_pressure_secondary'
add_sideset_ids = '1000 1001'
[]
[GlobalParams]
displacements = 'disp_x disp_y'
[]
[Problem]
extra_tag_vectors = 'ref'
[]
[Physics/SolidMechanics/QuasiStatic/all]
strain = SMALL
add_variables = true
use_automatic_differentiation = true
extra_vector_tags = 'ref'
block = '1 2'
[]
[AuxVariables]
[damage]
[]
[react_y]
block = '1 2'
[]
[]
[AuxKernels]
[damage]
type = CohesiveZoneMortarUserObjectAux
variable = damage
user_object = czm_uo
cohesive_zone_quantity = cohesive_damage
[]
[react_y]
type = ReactionForceAux
vector_tag = 'ref'
v = disp_y
variable = react_y
block = '1 2'
[]
[]
[Functions]
[gas_moles]
type = ParsedFunction
expression = '${gas_rate} * max(min(t, 1) - 0.8, 0)'
[]
[expected_pressure]
type = ParsedFunction
expression = 'W := 0.75 * ${opening} * t + ${plenum_volume};
n := ${gas_rate} * max(min(t, 1) - 0.8, 0);
${youngs_modulus} / 2 * (sqrt(W^2 + 4 * n * ${gas_constant} * ${gas_temperature} / ${youngs_modulus}) - W)'
[]
[]
[BCs]
[fix_x]
type = DirichletBC
boundary = lower_bottom
variable = disp_x
value = 0
[]
[fix_y]
type = DirichletBC
boundary = lower_bottom
variable = disp_y
value = 0
[]
[slide_x]
type = FunctionDirichletBC
boundary = upper_top
variable = disp_x
function = '${slide} * t'
[]
[peel_y]
type = FunctionDirichletBC
boundary = upper_top
variable = disp_y
function = '${opening} * t * (1 - x / 2)'
[]
[CavityPressure]
[void]
boundary = 'czm_pressure_primary czm_pressure_secondary'
R = ${gas_constant}
temperature = gas_temperature
volume = void_area
material_input = gas_moles
additional_volumes = plenum_volume
temperature_of_additional_volumes = gas_temperature
output = cavity_pressure
use_automatic_differentiation = true
# Act on the undisplaced faces so that the load stays purely normal to the interface and the
# solution above is exact
use_displaced_mesh = false
[]
[]
[]
[Materials]
[elasticity_tensor]
type = ADComputeIsotropicElasticityTensor
youngs_modulus = ${youngs_modulus}
poissons_ratio = 0
block = '1 2'
[]
[stress]
type = ADComputeLinearElasticStress
block = '1 2'
[]
[normal_strength]
type = GenericConstantMaterial
prop_names = normal_strength
prop_values = 1e4
[]
[shear_strength]
type = GenericConstantMaterial
prop_names = shear_strength
prop_values = 1e4
[]
[]
[UserObjects]
[czm_uo]
type = BilinearMixedModeCohesiveZoneModel
primary_boundary = upper_bottom
secondary_boundary = lower_top
primary_subdomain = primary_lower
secondary_subdomain = secondary_lower
disp_x = disp_x
disp_y = disp_y
secondary_variable = disp_x
use_physical_gap = true
correct_edge_dropping = true
normal_strength = normal_strength
shear_strength = shear_strength
penalty_stiffness = 1e12
power_law_parameter = 2
# Fully separated (damage = 1) once the opening exceeds 2 GI_c / normal_strength = 4e-2, which
# is much larger than the 1e-5 elastic stretch of the blocks at peak traction, so the response
# does not snap back
GI_c = 200
GII_c = 200
[]
[]
[Constraints]
[x]
type = NormalMortarMechanicalContact
primary_boundary = upper_bottom
secondary_boundary = lower_top
primary_subdomain = primary_lower
secondary_subdomain = secondary_lower
secondary_variable = disp_x
component = x
use_displaced_mesh = true
compute_lm_residuals = false
weighted_gap_uo = czm_uo
[]
[y]
type = NormalMortarMechanicalContact
primary_boundary = upper_bottom
secondary_boundary = lower_top
primary_subdomain = primary_lower
secondary_subdomain = secondary_lower
secondary_variable = disp_y
component = y
use_displaced_mesh = true
compute_lm_residuals = false
weighted_gap_uo = czm_uo
[]
[c_x]
type = MortarGenericTraction
primary_boundary = upper_bottom
secondary_boundary = lower_top
primary_subdomain = primary_lower
secondary_subdomain = secondary_lower
secondary_variable = disp_x
component = x
use_displaced_mesh = true
compute_lm_residuals = false
cohesive_zone_uo = czm_uo
[]
[c_y]
type = MortarGenericTraction
primary_boundary = upper_bottom
secondary_boundary = lower_top
primary_subdomain = primary_lower
secondary_subdomain = secondary_lower
secondary_variable = disp_y
component = y
use_displaced_mesh = true
compute_lm_residuals = false
cohesive_zone_uo = czm_uo
[]
[]
[MeshModifiers]
[pressure_sideset_updater]
type = MortarCZMDebondedBoundaryUpdater
block = secondary_lower
damage_variable = damage
cohesive_zone_userobject = czm_uo
primary_boundary = upper_bottom
secondary_boundary = lower_top
primary_subdomain = primary_lower
secondary_subdomain = secondary_lower
debonded_boundary_primary = czm_pressure_primary
debonded_boundary_secondary = czm_pressure_secondary
execute_on = TIMESTEP_END
# Run before the default group so that the postprocessors see faces promoted this step
execution_order_group = -1
[]
[]
[Postprocessors]
# Undisplaced length and first moment of each sideset
[primary_length]
type = AreaPostprocessor
boundary = czm_pressure_primary
[]
[secondary_length]
type = AreaPostprocessor
boundary = czm_pressure_secondary
[]
[primary_moment]
type = FunctionSideIntegral
boundary = czm_pressure_primary
function = x
[]
[secondary_moment]
type = FunctionSideIntegral
boundary = czm_pressure_secondary
function = x
[]
# Area between the two sidesets in the current configuration, which is the cavity volume
[void_area]
type = InternalVolume
boundary = 'czm_pressure_primary czm_pressure_secondary'
component = 1
execute_on = 'initial linear timestep_end'
[]
[expected_void_area_separated]
type = ParsedPostprocessor
expression = '0.75 * ${opening} * t + expected_pressure / ${youngs_modulus}'
pp_names = 'expected_pressure'
use_t = true
[]
# Cavity inputs
[gas_moles]
type = FunctionValuePostprocessor
function = gas_moles
execute_on = 'initial linear timestep_end'
[]
[gas_temperature]
type = ConstantPostprocessor
value = ${gas_temperature}
execute_on = 'initial linear timestep_end'
[]
[plenum_volume]
type = ConstantPostprocessor
value = ${plenum_volume}
execute_on = 'initial linear timestep_end'
[]
# Pressure checks, valid after full separation
[lower_reaction_y]
type = NodalSum
variable = react_y
boundary = lower_bottom
[]
[upper_reaction_y]
type = NodalSum
variable = react_y
boundary = upper_top
[]
[expected_pressure]
type = FunctionValuePostprocessor
function = expected_pressure
[]
# The lower block moves only because of the pressure
[lower_disp_y]
type = PointValue
variable = disp_y
point = '0.5 -0.25 0'
[]
[expected_lower_disp_y]
type = ParsedPostprocessor
expression = '-expected_pressure / ${youngs_modulus} * 0.25'
pp_names = 'expected_pressure'
[]
[]
[Executioner]
type = Transient
solve_type = NEWTON
petsc_options_iname = '-pc_type -pc_factor_mat_solver_type'
petsc_options_value = 'lu superlu_dist'
nl_rel_tol = 1e-10
nl_abs_tol = 1e-10
dt = 0.1
end_time = 1.2
[]
[Outputs]
csv = true
[]
(modules/contact/test/tests/verification/patch_tests/mindlin/cylinder_friction_node_face.i)
[GlobalParams]
volumetric_locking_correction = true
displacements = 'disp_x disp_y'
[]
[Mesh]
[input_file]
type = FileMeshGenerator
file = hertz_cyl_coarser.e
[]
[]
[Problem]
type = ReferenceResidualProblem
extra_tag_vectors = 'ref'
reference_vector = 'ref'
[]
[Variables]
[disp_x]
[]
[disp_y]
[]
[]
[AuxVariables]
[stress_xx]
order = CONSTANT
family = MONOMIAL
[]
[stress_yy]
order = CONSTANT
family = MONOMIAL
[]
[stress_xy]
order = CONSTANT
family = MONOMIAL
[]
[react_x]
[]
[react_y]
[]
[penetration]
[]
[inc_slip_x]
[]
[inc_slip_y]
[]
[accum_slip_x]
[]
[accum_slip_y]
[]
[]
[Functions]
[disp_ramp_vert]
type = PiecewiseLinear
x = '0. 1. 3.5'
y = '0. -0.020 -0.020'
[]
[disp_ramp_horz]
type = PiecewiseLinear
x = '0. 1. 3.5'
y = '0. 0.0 0.015'
[]
[]
[Kernels]
[TensorMechanics]
use_displaced_mesh = true
extra_vector_tags = 'ref'
block = '1 2 3 4 5 6 7'
[]
[]
[AuxKernels]
[stress_xx]
type = RankTwoAux
rank_two_tensor = stress
variable = stress_xx
index_i = 0
index_j = 0
execute_on = timestep_end
block = '1 2 3 4 5 6 7'
[]
[stress_yy]
type = RankTwoAux
rank_two_tensor = stress
variable = stress_yy
index_i = 1
index_j = 1
execute_on = timestep_end
block = '1 2 3 4 5 6 7'
[]
[stress_xy]
type = RankTwoAux
rank_two_tensor = stress
variable = stress_xy
index_i = 0
index_j = 1
execute_on = timestep_end
block = '1 2 3 4 5 6 7'
[]
[incslip_x]
type = PenetrationAux
variable = inc_slip_x
quantity = incremental_slip_x
boundary = 3
paired_boundary = 2
[]
[incslip_y]
type = PenetrationAux
variable = inc_slip_y
quantity = incremental_slip_y
boundary = 3
paired_boundary = 2
[]
[accum_slip_x]
type = AccumulateAux
variable = accum_slip_x
accumulate_from_variable = inc_slip_x
execute_on = timestep_end
[]
[accum_slip_y]
type = AccumulateAux
variable = accum_slip_y
accumulate_from_variable = inc_slip_y
execute_on = timestep_end
[]
[penetration]
type = PenetrationAux
variable = penetration
boundary = 3
paired_boundary = 2
[]
[react_x]
type = ReactionForceAux
vector_tag = 'ref'
v = 'disp_x'
variable = 'react_x'
[]
[react_y]
type = ReactionForceAux
vector_tag = 'ref'
v = 'disp_y'
variable = 'react_y'
[]
[]
[Postprocessors]
[bot_react_x]
type = NodalSum
variable = react_x
boundary = 1
[]
[bot_react_y]
type = NodalSum
variable = react_y
boundary = 1
[]
[top_react_x]
type = NodalSum
variable = react_x
boundary = 4
[]
[top_react_y]
type = NodalSum
variable = react_y
boundary = 4
[]
[penetration]
type = NodalExtremeValue
variable = penetration
value_type = max
boundary = 3
[]
[inc_slip_x_max]
type = NodalExtremeValue
variable = inc_slip_x
value_type = max
boundary = 3
[]
[inc_slip_x_min]
type = NodalExtremeValue
variable = inc_slip_x
value_type = min
boundary = 3
[]
[inc_slip_y_max]
type = NodalExtremeValue
variable = inc_slip_y
value_type = max
boundary = 3
[]
[inc_slip_y_min]
type = NodalExtremeValue
variable = inc_slip_y
value_type = min
boundary = 3
[]
[accum_slip_x]
type = NodalExtremeValue
variable = accum_slip_x
value_type = max
boundary = 3
[]
[accum_slip_y]
type = NodalExtremeValue
variable = accum_slip_y
value_type = max
boundary = 3
[]
[_dt]
type = TimestepSize
[]
[]
[BCs]
[side_x]
type = DirichletBC
variable = disp_y
boundary = '1 2'
value = 0.0
[]
[bot_y]
type = DirichletBC
variable = disp_x
boundary = '1 2'
value = 0.0
[]
[top_y_disp]
type = FunctionDirichletBC
variable = disp_y
boundary = 4
function = disp_ramp_vert
[]
[top_x_disp]
type = FunctionDirichletBC
variable = disp_x
boundary = 4
function = disp_ramp_horz
[]
[]
[Materials]
[stuff1_elas_tens]
type = ComputeIsotropicElasticityTensor
block = '1'
youngs_modulus = 1e10
poissons_ratio = 0.0
[]
[stuff1_strain]
type = ComputeFiniteStrain
block = '1'
[]
[stuff1_stress]
type = ComputeFiniteStrainElasticStress
block = '1'
[]
[stuff2_elas_tens]
type = ComputeIsotropicElasticityTensor
block = '2 3 4 5 6 7'
youngs_modulus = 1e6
poissons_ratio = 0.3
[]
[stuff2_strain]
type = ComputeFiniteStrain
block = '2 3 4 5 6 7'
[]
[stuff2_stress]
type = ComputeFiniteStrainElasticStress
block = '2 3 4 5 6 7'
[]
[]
[Executioner]
type = Transient
solve_type = 'PJFNK'
petsc_options = '-snes_ksp_ew'
petsc_options_iname = '-pc_type -pc_factor_mat_solver_type -pc_factor_shift_type -pc_factor_shift_amount -mat_mffd_err'
petsc_options_value = 'lu superlu_dist NONZERO 1e-15 1e-5'
line_search = 'none'
nl_abs_tol = 1e-8
start_time = 0.0
end_time = 0.3
l_tol = 1e-4
dt = 0.1
dtmin = 0.1
[]
[Preconditioning]
[SMP]
type = SMP
full = true
[]
[]
[VectorPostprocessors]
[x_disp]
type = NodalValueSampler
variable = disp_x
boundary = '3 4'
sort_by = id
[]
[y_disp]
type = NodalValueSampler
variable = disp_y
boundary = '3 4'
sort_by = id
[]
[]
[Outputs]
print_linear_residuals = true
perf_graph = true
exodus = true
csv = true
[console]
type = Console
max_rows = 5
[]
[chkfile]
type = CSV
show = 'x_disp y_disp'
file_base = cylinder_friction_check
create_final_symlink = true
execute_on = 'FINAL'
[]
[]
[Contact]
[leftright]
primary = 2
secondary = 3
model = coulomb
formulation = penalty
penalty = 5e9
normalize_penalty = true
friction_coefficient = '0.2'
[]
[]
(modules/contact/test/tests/pdass_problems/cylinder_friction_penalty_adaptivity.i)
[GlobalParams]
volumetric_locking_correction = true
displacements = 'disp_x disp_y'
[]
[Mesh]
[input_file]
type = FileMeshGenerator
file = hertz_cyl_coarser.e
[]
[secondary]
type = LowerDBlockFromSidesetGenerator
new_block_id = 10001
new_block_name = 'secondary_lower'
sidesets = '3'
input = input_file
[]
[primary]
type = LowerDBlockFromSidesetGenerator
new_block_id = 10000
sidesets = '2'
new_block_name = 'primary_lower'
input = secondary
[]
allow_renumbering = false
[]
[Problem]
type = ReferenceResidualProblem
extra_tag_vectors = 'ref'
reference_vector = 'ref'
[]
[Variables]
[disp_x]
order = FIRST
family = LAGRANGE
[]
[disp_y]
order = FIRST
family = LAGRANGE
[]
[]
[Physics/SolidMechanics/QuasiStatic/all]
strain = FINITE
extra_vector_tags = 'ref'
block = '1 2 3 4 5 6 7'
generate_output = 'stress_xx stress_yy stress_xy'
[]
[AuxVariables]
[penalty_normal_pressure]
[]
[penalty_frictional_pressure]
[]
[accumulated_slip_one]
[]
[tangential_vel_one]
[]
[normal_gap]
[]
[react_x]
[]
[react_y]
[]
[]
[Functions]
[disp_ramp_vert]
type = PiecewiseLinear
x = '0. 1. 3.5'
y = '0. -0.020 -0.020'
[]
[disp_ramp_horz]
type = PiecewiseLinear
x = '0. 1. 3.5'
y = '0. 0.0 0.015'
[]
[]
[AuxKernels]
[penalty_normal_pressure]
type = MortarUserObjectAux
variable = penalty_normal_pressure
user_object = friction_uo
contact_quantity = normal_pressure
[]
[penalty_frictional_pressure]
type = MortarUserObjectAux
variable = penalty_frictional_pressure
user_object = friction_uo
contact_quantity = tangential_pressure_one
[]
[penalty_accumulated_slip]
type = MortarUserObjectAux
variable = accumulated_slip_one
user_object = friction_uo
contact_quantity = accumulated_slip_one
[]
[penalty_tangential_vel]
type = MortarUserObjectAux
variable = tangential_vel_one
user_object = friction_uo
contact_quantity = tangential_velocity_one
[]
[penalty_gap]
type = MortarUserObjectAux
variable = normal_gap
user_object = friction_uo
contact_quantity = normal_gap
[]
[react_x]
type = ReactionForceAux
vector_tag = 'ref'
v = 'disp_x'
variable = 'react_x'
[]
[react_y]
type = ReactionForceAux
vector_tag = 'ref'
v = 'disp_y'
variable = 'react_y'
[]
[]
[Postprocessors]
[bot_react_x]
type = NodalSum
variable = react_x
boundary = 1
[]
[bot_react_y]
type = NodalSum
variable = react_y
boundary = 1
[]
[top_react_x]
type = NodalSum
variable = react_x
boundary = 4
[]
[top_react_y]
type = NodalSum
variable = react_y
boundary = 4
[]
[_dt]
type = TimestepSize
[]
[num_lin_it]
type = NumLinearIterations
[]
[num_nonlin_it]
type = NumNonlinearIterations
[]
[cumulative]
type = CumulativeValuePostprocessor
postprocessor = num_nonlin_it
[]
[gap]
type = SideExtremeValue
value_type = min
variable = normal_gap
boundary = 3
[]
[num_al]
type = NumAugmentedLagrangeIterations
[]
[]
[BCs]
[side_x]
type = DirichletBC
variable = disp_y
boundary = '1 2'
value = 0.0
[]
[bot_y]
type = DirichletBC
variable = disp_x
boundary = '1 2'
value = 0.0
[]
[top_y_disp]
type = FunctionDirichletBC
variable = disp_y
boundary = 4
function = disp_ramp_vert
[]
[top_x_disp]
type = FunctionDirichletBC
variable = disp_x
boundary = 4
function = disp_ramp_horz
[]
[]
[Materials]
[stuff1_elas_tens]
type = ComputeIsotropicElasticityTensor
block = '1'
youngs_modulus = 1e10
poissons_ratio = 0.0
[]
[stuff1_stress]
type = ComputeFiniteStrainElasticStress
block = '1'
[]
[stuff2_elas_tens]
type = ComputeIsotropicElasticityTensor
block = '2 3 4 5 6 7'
youngs_modulus = 1e6
poissons_ratio = 0.3
[]
[stuff2_stress]
type = ComputeFiniteStrainElasticStress
block = '2 3 4 5 6 7'
[]
[]
[Executioner]
type = Transient
solve_type = 'PJFNK'
petsc_options = '-snes_ksp_ew'
petsc_options_iname = '-pc_type -pc_factor_mat_solver_type -pc_factor_shift_type -pc_factor_shift_amount -mat_mffd_err'
petsc_options_value = 'lu superlu_dist NONZERO 1e-15 1e-5'
line_search = 'none'
nl_abs_tol = 1e-10
start_time = 0.0
end_time = 0.3 # 3.5
l_tol = 1e-4
dt = 0.1
dtmin = 0.001
[Predictor]
type = SimplePredictor
scale = 1.0
[]
[]
[Preconditioning]
[SMP]
type = SMP
full = true
[]
[]
[VectorPostprocessors]
[surface]
type = NodalValueSampler
use_displaced_mesh = false
variable = 'disp_x disp_y penalty_normal_pressure penalty_frictional_pressure normal_gap'
boundary = '3'
sort_by = id
[]
[]
[Outputs]
print_linear_residuals = true
perf_graph = true
exodus = true
csv = false
[console]
type = Console
max_rows = 5
[]
[vectorpp_output]
type = CSV
create_final_symlink = true
file_base = cylinder_friction_penalty_adaptivity
execute_on = 'INITIAL TIMESTEP_END FINAL'
[]
[]
[UserObjects]
[friction_uo]
type = PenaltyFrictionUserObject
primary_boundary = '2'
secondary_boundary = '3'
primary_subdomain = '10000'
secondary_subdomain = '10001'
disp_x = disp_x
disp_y = disp_y
friction_coefficient = 0.4
secondary_variable = disp_x
penalty = 5e7
penalty_friction = 5e8
[]
[geo]
type = GeometrySphere
boundary = 3
center = '0 4 0'
radius = 3
[]
[]
[Adaptivity]
[Markers]
[contact]
type = BoundaryMarker
mark = REFINE
next_to = 3
[]
[]
initial_marker = contact
initial_steps = 2
[]
[Constraints]
[x]
type = NormalMortarMechanicalContact
primary_boundary = '2'
secondary_boundary = '3'
primary_subdomain = '10000'
secondary_subdomain = '10001'
secondary_variable = disp_x
component = x
use_displaced_mesh = true
compute_lm_residuals = false
weighted_gap_uo = friction_uo
[]
[y]
type = NormalMortarMechanicalContact
primary_boundary = '2'
secondary_boundary = '3'
primary_subdomain = '10000'
secondary_subdomain = '10001'
secondary_variable = disp_y
component = y
use_displaced_mesh = true
compute_lm_residuals = false
weighted_gap_uo = friction_uo
[]
[tangential_x]
type = TangentialMortarMechanicalContact
primary_boundary = 2
secondary_boundary = 3
primary_subdomain = 10000
secondary_subdomain = 10001
secondary_variable = disp_x
component = x
use_displaced_mesh = true
compute_lm_residuals = false
weighted_velocities_uo = friction_uo
[]
[tangential_y]
type = TangentialMortarMechanicalContact
primary_boundary = 2
secondary_boundary = 3
primary_subdomain = 10000
secondary_subdomain = 10001
secondary_variable = disp_y
component = y
use_displaced_mesh = true
compute_lm_residuals = false
weighted_velocities_uo = friction_uo
[]
[]
(modules/solid_mechanics/test/tests/torque_reaction/torque_reaction.i)
# Scalar torque reaction
# This test computes the sum of the torques acting on a ten element 2D bar mesh
# and is intended to replicate the classical wrench problem from statics.
# A displacement in the y along the right face is applied to the bar end to create
# a shear force along the bar end. The rotation origin default (the global origin)
# and the axis of rotation direction vector used to compute the torque reaction
# is set to (0, 0, 1) out of the plane.
# Torque is calculated for the two nodes on the left of the bar. For the bottom
# node on the right, the torque/ moment lever is the x coordinate value, and for
# the top node on the right the torque lever is the hypotenuse of the x and y
# coordinates. The expected sum of the torque reaction is just over 37.
[GlobalParams]
order = FIRST
family = LAGRANGE
displacements = 'disp_x disp_y'
[]
[Mesh]
type = GeneratedMesh
dim = 2
nx = 10
ny = 1
[]
[Problem]
extra_tag_vectors = 'ref'
[]
[AuxVariables]
[saved_x]
[]
[saved_y]
[]
[]
[AuxKernels]
[saved_x]
type = ReactionForceAux
vector_tag = 'ref'
v = 'disp_x'
variable = 'saved_x'
[]
[saved_y]
type = ReactionForceAux
vector_tag = 'ref'
v = 'disp_y'
variable = 'saved_y'
[]
[]
[Physics/SolidMechanics/QuasiStatic]
[master]
strain = SMALL
generate_output = 'stress_xx stress_yy'
add_variables = true
extra_vector_tags = 'ref'
[]
[]
[BCs]
[left_x]
type = DirichletBC
variable = disp_x
boundary = left
value = 0.0
[]
[left_y]
type = DirichletBC
variable = disp_y
boundary = left
value = 0.0
[]
[right_shear_y]
type = FunctionDirichletBC
variable = disp_y
boundary = right
function = '0.001*t'
[]
[]
[Materials]
[elasticity_tensor]
type = ComputeIsotropicElasticityTensor
youngs_modulus = 207000
poissons_ratio = 0.3
[]
[elastic_stress]
type = ComputeLinearElasticStress
[]
[]
[Executioner]
type = Transient
line_search = 'none'
l_max_its = 30
nl_max_its = 20
nl_abs_tol = 1e-12
nl_rel_tol = 1e-10
l_tol = 1e-8
start_time = 0.0
dt = 0.5
end_time = 1
num_steps = 2
[]
[Postprocessors]
[_dt]
type = TimestepSize
[]
[torque]
type = TorqueReaction
boundary = right
reaction_force_variables = 'saved_x saved_y'
direction_vector = '0. 0. 1.'
[]
[]
[Outputs]
exodus = true
[]
(modules/solid_mechanics/test/tests/generalized_plane_strain/generalized_plane_strain_ref_resid.i)
[GlobalParams]
displacements = 'disp_x disp_y'
[]
[Mesh]
[square]
type = GeneratedMeshGenerator
dim = 2
nx = 2
ny = 2
[]
[]
[Problem]
type = ReferenceResidualProblem
reference_vector = 'ref'
extra_tag_vectors = 'ref'
group_variables = 'disp_x disp_y'
[]
[Variables]
[scalar_strain_zz]
order = FIRST
family = SCALAR
[]
[]
[AuxVariables]
[temp]
order = FIRST
family = LAGRANGE
[]
[saved_x]
order = FIRST
family = LAGRANGE
[]
[saved_y]
order = FIRST
family = LAGRANGE
[]
[saved_strain_zz]
family = SCALAR
order = FIRST
[]
[]
[Postprocessors]
[react_z]
type = MaterialTensorIntegral
rank_two_tensor = stress
index_i = 2
index_j = 2
[]
[]
[Physics/SolidMechanics/QuasiStatic]
[all]
strain = SMALL
add_variables = true
generate_output = 'stress_xx stress_xy stress_yy stress_zz strain_xx strain_xy strain_yy strain_zz'
planar_formulation = GENERALIZED_PLANE_STRAIN
eigenstrain_names = eigenstrain
scalar_out_of_plane_strain = scalar_strain_zz
temperature = temp
absolute_value_vector_tags = 'ref'
[]
[]
[AuxKernels]
[tempfuncaux]
type = FunctionAux
variable = temp
function = tempfunc
use_displaced_mesh = false
[]
[saved_x]
type = ReactionForceAux
variable = 'saved_x'
vector_tag = 'ref'
v = 'disp_x'
[]
[saved_y]
type = ReactionForceAux
variable = 'saved_y'
vector_tag = 'ref'
v = 'disp_y'
[]
[]
[AuxScalarKernels]
[saved_strain_zz]
type = ScalarTagVectorAux
variable = 'saved_strain_zz'
vector_tag = 'ref'
v = 'scalar_strain_zz'
[]
[]
[Functions]
[tempfunc]
type = ParsedFunction
expression = '(1-x)*t'
[]
[]
[BCs]
[bottomx]
type = DirichletBC
boundary = 0
variable = disp_x
value = 0.0
[]
[bottomy]
type = DirichletBC
boundary = 0
variable = disp_y
value = 0.0
[]
[]
[Materials]
[elastic_tensor]
type = ComputeIsotropicElasticityTensor
poissons_ratio = 0.3
youngs_modulus = 1e6
[]
[thermal_strain]
type = ComputeThermalExpansionEigenstrain
temperature = temp
thermal_expansion_coeff = 0.02
stress_free_temperature = 0.5
eigenstrain_name = eigenstrain
[]
[stress]
type = ComputeLinearElasticStress
[]
[]
[Preconditioning]
[smp]
type = SMP
full = true
[]
[]
[Executioner]
type = Transient
solve_type = PJFNK
line_search = none
petsc_options_iname = '-pc_type -pc_factor_mat_solver_package -ksp_gmres_restart'
petsc_options_value = 'lu superlu_dist 51'
# controls for linear iterations
l_max_its = 100
l_tol = 1e-4
# controls for nonlinear iterations
nl_max_its = 15
nl_rel_tol = 1e-12
nl_abs_tol = 1e-8
# time control
start_time = 0.0
dt = 1.0
dtmin = 1.0
end_time = 2.0
num_steps = 5000
[]
[Outputs]
exodus = true
[]