Two-dimensional spherical indenter (mortar)
A two-dimensional problem with RZ symmetry is used to model the penetration of a spherical indenter into an inelastic base material.
Background
Indentation tests are often used to characterize the behavior of materials at small scales. In this example, we use a spherical indenter driven by a prescribed displacement as a boundary condition. Frictionless contact with a lower-dimensional enforcement (mortar) formulation is employed to drive base material deformation. As a result, a load displacement curve can be obtained.
Creating contact input
Mechanical contact can be enforced on lower-dimensional domains in a weak sense. This type of approach is usually referred to as mortar. To employ this approach, the user can manually build the lower-dimensional subdomains. primary
and secondary
subdomains are created from mesh sidesets.
[Mesh<<<{"href": "../../syntax/Mesh/index.html"}>>>]
patch_update_strategy = auto
patch_size = 2
partitioner = centroid
centroid_partitioner_direction = y
[simple_mesh]
type = FileMeshGenerator<<<{"description": "Read a mesh from a file.", "href": "../../source/meshgenerators/FileMeshGenerator.html"}>>>
file<<<{"description": "The filename to read."}>>> = indenter_rz_fine_bigsideset.e
[]
# For NodalVariableValue to work with distributed mesh
allow_renumbering = false
[]
[Functions<<<{"href": "../../syntax/Functions/index.html"}>>>]
[disp_y]
type = PiecewiseLinear<<<{"description": "Linearly interpolates between pairs of x-y data", "href": "../../source/functions/PiecewiseLinear.html"}>>>
x<<<{"description": "The abscissa values"}>>> = '0. 1.0 2.0 2.6 3.0'
y<<<{"description": "The ordinate values"}>>> = '0. -4.5 -5.7 -5.7 -4.0'
[]
[]
[Variables<<<{"href": "../../syntax/Variables/index.html"}>>>]
[disp_x]
order<<<{"description": "Specifies the order of the FE shape function to use for this variable (additional orders not listed are allowed)"}>>> = FIRST
family<<<{"description": "Specifies the family of FE shape functions to use for this variable"}>>> = LAGRANGE
block = '1 2'
[]
[disp_y]
order<<<{"description": "Specifies the order of the FE shape function to use for this variable (additional orders not listed are allowed)"}>>> = FIRST
family<<<{"description": "Specifies the family of FE shape functions to use for this variable"}>>> = LAGRANGE
block = '1 2'
[]
[]
[AuxVariables<<<{"href": "../../syntax/AuxVariables/index.html"}>>>]
[saved_x]
[]
[saved_y]
[]
[]
[Physics<<<{"href": "../../syntax/Physics/index.html"}>>>/SolidMechanics<<<{"href": "../../syntax/Physics/SolidMechanics/index.html"}>>>/QuasiStatic<<<{"href": "../../syntax/Physics/SolidMechanics/QuasiStatic/index.html"}>>>]
[all]
strain<<<{"description": "Strain formulation"}>>> = FINITE
block<<<{"description": "The list of ids of the blocks (subdomain) that the stress divergence kernels will be applied to"}>>> = '1 2'
use_automatic_differentiation<<<{"description": "Flag to use automatic differentiation (AD) objects when possible"}>>> = false
generate_output<<<{"description": "Add scalar quantity output for stress and/or strain"}>>> = 'stress_xx stress_xy stress_xz stress_yy stress_zz'
save_in<<<{"description": "The displacement residuals"}>>> = 'saved_x saved_y'
[]
[]
[BCs<<<{"href": "../../syntax/BCs/index.html"}>>>]
# Symmetries of the Problem
[symm_x_indenter]
type = DirichletBC<<<{"description": "Imposes the essential boundary condition $u=g$, where $g$ is a constant, controllable value.", "href": "../../source/bcs/DirichletBC.html"}>>>
variable<<<{"description": "The name of the variable that this residual object operates on"}>>> = disp_x
boundary<<<{"description": "The list of boundary IDs from the mesh where this object applies"}>>> = 5
value<<<{"description": "Value of the BC"}>>> = 0.0
[]
[symm_x_material]
type = DirichletBC<<<{"description": "Imposes the essential boundary condition $u=g$, where $g$ is a constant, controllable value.", "href": "../../source/bcs/DirichletBC.html"}>>>
variable<<<{"description": "The name of the variable that this residual object operates on"}>>> = disp_x
boundary<<<{"description": "The list of boundary IDs from the mesh where this object applies"}>>> = 9
value<<<{"description": "Value of the BC"}>>> = 0.0
[]
# Material should not fly away
[material_base_y]
type = DirichletBC<<<{"description": "Imposes the essential boundary condition $u=g$, where $g$ is a constant, controllable value.", "href": "../../source/bcs/DirichletBC.html"}>>>
variable<<<{"description": "The name of the variable that this residual object operates on"}>>> = disp_y
boundary<<<{"description": "The list of boundary IDs from the mesh where this object applies"}>>> = 8
value<<<{"description": "Value of the BC"}>>> = 0.0
[]
# Drive indenter motion
[disp_y]
type = FunctionDirichletBC<<<{"description": "Imposes the essential boundary condition $u=g(t,\\vec{x})$, where $g$ is a (possibly) time and space-dependent MOOSE Function.", "href": "../../source/bcs/FunctionDirichletBC.html"}>>>
variable<<<{"description": "The name of the variable that this residual object operates on"}>>> = disp_y
boundary<<<{"description": "The list of boundary IDs from the mesh where this object applies"}>>> = 1
function<<<{"description": "The forcing function."}>>> = disp_y
[]
[]
[Contact<<<{"href": "../../syntax/Contact/index.html"}>>>]
[contact]
secondary<<<{"description": "The list of boundary IDs referring to secondary sidesets"}>>> = 4
primary<<<{"description": "The list of boundary IDs referring to primary sidesets"}>>> = 6
model<<<{"description": "The contact model to use"}>>> = frictionless
# Investigate von Mises stress at the edge
correct_edge_dropping<<<{"description": "Whether to enable correct edge dropping treatment for mortar constraints. When disabled any Lagrange Multiplier degree of freedom on a secondary element without full primary contributions will be set (strongly) to 0."}>>> = true
formulation<<<{"description": "The contact formulation"}>>> = mortar
c_normal<<<{"description": "Parameter for balancing the size of the gap and contact pressure for a mortar formulation. This purely numerical parameter affects convergence behavior and, in general, should be larger for stiffer materials. It is recommended that the user tries out various orders of magnitude for this parameter if the default value generates poor contact convergence."}>>> = 1e+2
[]
[]
[UserObjects<<<{"href": "../../syntax/UserObjects/index.html"}>>>]
[slip_rate_gss]
type = CrystalPlasticitySlipRateGSS<<<{"description": "Phenomenological constitutive model slip rate class. Override the virtual functions in your class", "href": "../../source/userobjects/CrystalPlasticitySlipRateGSS.html"}>>>
variable_size<<<{"description": "The userobject's variable size."}>>> = 48
slip_sys_file_name<<<{"description": "Name of the file containing the slip system"}>>> = input_slip_sys_bcc48.txt
num_slip_sys_flowrate_props<<<{"description": "Number of flow rate properties for a slip system"}>>> = 2
flowprops<<<{"description": "Parameters used in slip rate equations"}>>> = '1 48 0.0001 0.01'
uo_state_var_name<<<{"description": "Name of state variable property: Same as state variable user object specified in input file."}>>> = state_var_gss
slip_incr_tol<<<{"description": "Maximum allowable slip in an increment"}>>> = 10.0
block<<<{"description": "The list of blocks (ids or names) that this object will be applied"}>>> = 2
[]
[slip_resistance_gss]
type = CrystalPlasticitySlipResistanceGSS<<<{"description": "Phenomenological constitutive models' slip resistance base class. Override the virtual functions in your class", "href": "../../source/userobjects/CrystalPlasticitySlipResistanceGSS.html"}>>>
variable_size<<<{"description": "The userobject's variable size."}>>> = 48
uo_state_var_name<<<{"description": "Name of state variable property: Same as state variable user object specified in input file."}>>> = state_var_gss
block<<<{"description": "The list of blocks (ids or names) that this object will be applied"}>>> = 2
[]
[state_var_gss]
type = CrystalPlasticityStateVariable<<<{"description": "Crystal plasticity state variable class. Override the virtual functions in your class", "href": "../../source/userobjects/CrystalPlasticityStateVariable.html"}>>>
variable_size<<<{"description": "The userobject's variable size."}>>> = 48
groups<<<{"description": "To group the initial values on different slip systems 'format: [start end)', i.e.'0 4 8 11' groups 0-3, 4-7 and 8-11 "}>>> = '0 24 48'
group_values<<<{"description": "The initial values corresponding to each group, i.e. '0.0 1.0 2.0' means 0-4 = 0.0, 4-8 = 1.0 and 8-12 = 2.0 "}>>> = '900 1000' #120
uo_state_var_evol_rate_comp_name<<<{"description": "Name of state variable evolution rate component property: Same as state variable evolution rate component user object specified in input file."}>>> = state_var_evol_rate_comp_gss
scale_factor<<<{"description": "Scale factor of individual component."}>>> = 1.0
block<<<{"description": "The list of blocks (ids or names) that this object will be applied"}>>> = 2
[]
[state_var_evol_rate_comp_gss]
type = CrystalPlasticityStateVarRateComponentGSS<<<{"description": "Phenomenological constitutive model state variable evolution rate component base class. Override the virtual functions in your class", "href": "../../source/userobjects/CrystalPlasticityStateVarRateComponentGSS.html"}>>>
variable_size<<<{"description": "The userobject's variable size."}>>> = 48
hprops<<<{"description": "Hardening properties"}>>> = '1.4 1000 1200 2.5'
uo_slip_rate_name<<<{"description": "Name of slip rate property: Same as slip rate user object specified in input file."}>>> = slip_rate_gss
uo_state_var_name<<<{"description": "Name of state variable property: Same as state variable user object specified in input file."}>>> = state_var_gss
block<<<{"description": "The list of blocks (ids or names) that this object will be applied"}>>> = 2
[]
[]
[Materials<<<{"href": "../../syntax/Materials/index.html"}>>>]
[tensor]
type = ComputeIsotropicElasticityTensor<<<{"description": "Compute a constant isotropic elasticity tensor.", "href": "../../source/materials/ComputeIsotropicElasticityTensor.html"}>>>
block<<<{"description": "The list of blocks (ids or names) that this object will be applied"}>>> = '1'
youngs_modulus<<<{"description": "Young's modulus of the material."}>>> = 1.0e7
poissons_ratio<<<{"description": "Poisson's ratio for the material."}>>> = 0.25
[]
[stress]
type = ComputeFiniteStrainElasticStress<<<{"description": "Compute stress using elasticity for finite strains", "href": "../../source/materials/ComputeFiniteStrainElasticStress.html"}>>>
block<<<{"description": "The list of blocks (ids or names) that this object will be applied"}>>> = '1'
[]
[crysp]
type = FiniteStrainUObasedCP<<<{"description": "UserObject based Crystal Plasticity system.", "href": "../../source/materials/crystal_plasticity/FiniteStrainUObasedCP.html"}>>>
block<<<{"description": "The list of blocks (ids or names) that this object will be applied"}>>> = 2
stol<<<{"description": "Constitutive slip system resistance relative residual tolerance"}>>> = 1e-2
tan_mod_type<<<{"description": "Type of tangent moduli for preconditioner: default elastic"}>>> = exact
uo_slip_rates<<<{"description": "List of names of user objects that define the slip rates for this material."}>>> = 'slip_rate_gss'
uo_slip_resistances<<<{"description": "List of names of user objects that define the slip resistances for this material."}>>> = 'slip_resistance_gss'
uo_state_vars<<<{"description": "List of names of user objects that define the state variable for this material."}>>> = 'state_var_gss'
uo_state_var_evol_rate_comps<<<{"description": "List of names of user objects that define the state variable evolution rate components for this material."}>>> = 'state_var_evol_rate_comp_gss'
maximum_substep_iteration<<<{"description": "Maximum number of substep iteration"}>>> = 20
[]
[elasticity_tensor]
type = ComputeElasticityTensorCP<<<{"description": "Compute an elasticity tensor for crystal plasticity.", "href": "../../source/materials/crystal_plasticity/ComputeElasticityTensorCP.html"}>>>
block<<<{"description": "The list of blocks (ids or names) that this object will be applied"}>>> = 2
C_ijkl<<<{"description": "Stiffness tensor for material"}>>> = '265190 113650 113650 265190 113650 265190 75769 75769 75760'
fill_method<<<{"description": "The fill method"}>>> = symmetric9
[]
[]
[Preconditioning<<<{"href": "../../syntax/Preconditioning/index.html"}>>>]
[SMP]
type = SMP<<<{"description": "Single matrix preconditioner (SMP) builds a preconditioner using user defined off-diagonal parts of the Jacobian.", "href": "../../source/preconditioners/SingleMatrixPreconditioner.html"}>>>
full<<<{"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."}>>> = true
[]
[]
[Executioner<<<{"href": "../../syntax/Executioner/index.html"}>>>]
type = Transient
solve_type = 'PJFNK'
petsc_options = '-snes_ksp_ew'
petsc_options_iname = '-pc_type -snes_linesearch_type -pc_factor_shift_type '
'-pc_factor_shift_amount'
petsc_options_value = 'lu basic NONZERO 1e-15'
line_search = 'none'
automatic_scaling = true
nl_abs_tol = 2.0e-07
nl_rel_tol = 2.0e-07
l_max_its = 40
l_abs_tol = 1e-08
l_tol = 1e-08
start_time = 0.0
dt = 0.01
end_time = 3.0 # Executioner
[]
[Postprocessors<<<{"href": "../../syntax/Postprocessors/index.html"}>>>]
[maxdisp]
type = NodalVariableValue<<<{"description": "Outputs values of a nodal variable at a particular location", "href": "../../source/postprocessors/NodalVariableValue.html"}>>>
nodeid<<<{"description": "The ID of the node where we monitor"}>>> = 39
variable<<<{"description": "The variable to be monitored"}>>> = disp_y
[]
[resid_y]
type = NodalSum<<<{"description": "Computes the sum of all of the nodal values of the specified variable. Note: This object sets the default \"unique_node_execute\" flag to true to avoid double counting nodes between shared blocks.", "href": "../../source/postprocessors/NodalSum.html"}>>>
variable<<<{"description": "The name of the variable that this postprocessor operates on"}>>> = saved_y
boundary<<<{"description": "The list of boundaries (ids or names) from the mesh where this object applies"}>>> = 1
[]
[]
[Outputs<<<{"href": "../../syntax/Outputs/index.html"}>>>]
[out]
type = Exodus<<<{"description": "Object for output data in the Exodus format", "href": "../../source/outputs/Exodus.html"}>>>
elemental_as_nodal<<<{"description": "Output elemental nonlinear variables as nodal"}>>> = true
[]
perf_graph<<<{"description": "Enable printing of the performance graph to the screen (Console)"}>>> = true
csv<<<{"description": "Output the scalar variable and postprocessors to a *.csv file using the default CSV output."}>>> = true
[]
(modules/contact/examples/2d_indenter/indenter_rz_fine.i)Mortar-based mechanical contact can be defined through the contact action. Here, a more manual, user-driven definition is used.
Fig. 1: Spherical indenter.
For frictionless contact in two dimensions, three blocks need to be defined. First, the NormalNodalLMMechanicalContact
constraint is used to enforce the Karush-Kuhn-Tucker contact conditions. Then, NormalMortarMechanicalContact
enforces contact constraints in an integral or weak sense in both problem dimensions.
[GlobalParams<<<{"href": "../../syntax/GlobalParams/index.html"}>>>]
volumetric_locking_correction = true
displacements = 'disp_x disp_y'
[]
[Problem<<<{"href": "../../syntax/Problem/index.html"}>>>]
coord_type = RZ
type = ReferenceResidualProblem
reference_vector = 'ref'
extra_tag_vectors = 'ref'
[]
[Mesh<<<{"href": "../../syntax/Mesh/index.html"}>>>]
patch_update_strategy = auto
patch_size = 2
partitioner = centroid
centroid_partitioner_direction = y
[simple_mesh]
type = FileMeshGenerator<<<{"description": "Read a mesh from a file.", "href": "../../source/meshgenerators/FileMeshGenerator.html"}>>>
file<<<{"description": "The filename to read."}>>> = indenter_rz_fine_bigsideset.e
[]
# For NodalVariableValue to work with distributed mesh
allow_renumbering = false
[]
[Functions<<<{"href": "../../syntax/Functions/index.html"}>>>]
[disp_y]
type = PiecewiseLinear<<<{"description": "Linearly interpolates between pairs of x-y data", "href": "../../source/functions/PiecewiseLinear.html"}>>>
x<<<{"description": "The abscissa values"}>>> = '0. 1.0 2.0 2.6 3.0'
y<<<{"description": "The ordinate values"}>>> = '0. -4.5 -5.7 -5.7 -4.0'
[]
[]
[Variables<<<{"href": "../../syntax/Variables/index.html"}>>>]
[disp_x]
order<<<{"description": "Specifies the order of the FE shape function to use for this variable (additional orders not listed are allowed)"}>>> = FIRST
family<<<{"description": "Specifies the family of FE shape functions to use for this variable"}>>> = LAGRANGE
block = '1 2'
[]
[disp_y]
order<<<{"description": "Specifies the order of the FE shape function to use for this variable (additional orders not listed are allowed)"}>>> = FIRST
family<<<{"description": "Specifies the family of FE shape functions to use for this variable"}>>> = LAGRANGE
block = '1 2'
[]
[]
[AuxVariables<<<{"href": "../../syntax/AuxVariables/index.html"}>>>]
[saved_x]
[]
[saved_y]
[]
[]
[Physics<<<{"href": "../../syntax/Physics/index.html"}>>>/SolidMechanics<<<{"href": "../../syntax/Physics/SolidMechanics/index.html"}>>>/QuasiStatic<<<{"href": "../../syntax/Physics/SolidMechanics/QuasiStatic/index.html"}>>>]
[all]
strain<<<{"description": "Strain formulation"}>>> = FINITE
block<<<{"description": "The list of ids of the blocks (subdomain) that the stress divergence kernels will be applied to"}>>> = '1 2'
use_automatic_differentiation<<<{"description": "Flag to use automatic differentiation (AD) objects when possible"}>>> = false
generate_output<<<{"description": "Add scalar quantity output for stress and/or strain"}>>> = 'stress_xx stress_xy stress_xz stress_yy stress_zz'
save_in<<<{"description": "The displacement residuals"}>>> = 'saved_x saved_y'
[]
[]
[BCs<<<{"href": "../../syntax/BCs/index.html"}>>>]
# Symmetries of the Problem
[symm_x_indenter]
type = DirichletBC<<<{"description": "Imposes the essential boundary condition $u=g$, where $g$ is a constant, controllable value.", "href": "../../source/bcs/DirichletBC.html"}>>>
variable<<<{"description": "The name of the variable that this residual object operates on"}>>> = disp_x
boundary<<<{"description": "The list of boundary IDs from the mesh where this object applies"}>>> = 5
value<<<{"description": "Value of the BC"}>>> = 0.0
[]
[symm_x_material]
type = DirichletBC<<<{"description": "Imposes the essential boundary condition $u=g$, where $g$ is a constant, controllable value.", "href": "../../source/bcs/DirichletBC.html"}>>>
variable<<<{"description": "The name of the variable that this residual object operates on"}>>> = disp_x
boundary<<<{"description": "The list of boundary IDs from the mesh where this object applies"}>>> = 9
value<<<{"description": "Value of the BC"}>>> = 0.0
[]
# Material should not fly away
[material_base_y]
type = DirichletBC<<<{"description": "Imposes the essential boundary condition $u=g$, where $g$ is a constant, controllable value.", "href": "../../source/bcs/DirichletBC.html"}>>>
variable<<<{"description": "The name of the variable that this residual object operates on"}>>> = disp_y
boundary<<<{"description": "The list of boundary IDs from the mesh where this object applies"}>>> = 8
value<<<{"description": "Value of the BC"}>>> = 0.0
[]
# Drive indenter motion
[disp_y]
type = FunctionDirichletBC<<<{"description": "Imposes the essential boundary condition $u=g(t,\\vec{x})$, where $g$ is a (possibly) time and space-dependent MOOSE Function.", "href": "../../source/bcs/FunctionDirichletBC.html"}>>>
variable<<<{"description": "The name of the variable that this residual object operates on"}>>> = disp_y
boundary<<<{"description": "The list of boundary IDs from the mesh where this object applies"}>>> = 1
function<<<{"description": "The forcing function."}>>> = disp_y
[]
[]
[Contact<<<{"href": "../../syntax/Contact/index.html"}>>>]
[contact]
secondary<<<{"description": "The list of boundary IDs referring to secondary sidesets"}>>> = 4
primary<<<{"description": "The list of boundary IDs referring to primary sidesets"}>>> = 6
model<<<{"description": "The contact model to use"}>>> = frictionless
# Investigate von Mises stress at the edge
correct_edge_dropping<<<{"description": "Whether to enable correct edge dropping treatment for mortar constraints. When disabled any Lagrange Multiplier degree of freedom on a secondary element without full primary contributions will be set (strongly) to 0."}>>> = true
formulation<<<{"description": "The contact formulation"}>>> = mortar
c_normal<<<{"description": "Parameter for balancing the size of the gap and contact pressure for a mortar formulation. This purely numerical parameter affects convergence behavior and, in general, should be larger for stiffer materials. It is recommended that the user tries out various orders of magnitude for this parameter if the default value generates poor contact convergence."}>>> = 1e+2
[]
[]
[UserObjects<<<{"href": "../../syntax/UserObjects/index.html"}>>>]
[slip_rate_gss]
type = CrystalPlasticitySlipRateGSS<<<{"description": "Phenomenological constitutive model slip rate class. Override the virtual functions in your class", "href": "../../source/userobjects/CrystalPlasticitySlipRateGSS.html"}>>>
variable_size<<<{"description": "The userobject's variable size."}>>> = 48
slip_sys_file_name<<<{"description": "Name of the file containing the slip system"}>>> = input_slip_sys_bcc48.txt
num_slip_sys_flowrate_props<<<{"description": "Number of flow rate properties for a slip system"}>>> = 2
flowprops<<<{"description": "Parameters used in slip rate equations"}>>> = '1 48 0.0001 0.01'
uo_state_var_name<<<{"description": "Name of state variable property: Same as state variable user object specified in input file."}>>> = state_var_gss
slip_incr_tol<<<{"description": "Maximum allowable slip in an increment"}>>> = 10.0
block<<<{"description": "The list of blocks (ids or names) that this object will be applied"}>>> = 2
[]
[slip_resistance_gss]
type = CrystalPlasticitySlipResistanceGSS<<<{"description": "Phenomenological constitutive models' slip resistance base class. Override the virtual functions in your class", "href": "../../source/userobjects/CrystalPlasticitySlipResistanceGSS.html"}>>>
variable_size<<<{"description": "The userobject's variable size."}>>> = 48
uo_state_var_name<<<{"description": "Name of state variable property: Same as state variable user object specified in input file."}>>> = state_var_gss
block<<<{"description": "The list of blocks (ids or names) that this object will be applied"}>>> = 2
[]
[state_var_gss]
type = CrystalPlasticityStateVariable<<<{"description": "Crystal plasticity state variable class. Override the virtual functions in your class", "href": "../../source/userobjects/CrystalPlasticityStateVariable.html"}>>>
variable_size<<<{"description": "The userobject's variable size."}>>> = 48
groups<<<{"description": "To group the initial values on different slip systems 'format: [start end)', i.e.'0 4 8 11' groups 0-3, 4-7 and 8-11 "}>>> = '0 24 48'
group_values<<<{"description": "The initial values corresponding to each group, i.e. '0.0 1.0 2.0' means 0-4 = 0.0, 4-8 = 1.0 and 8-12 = 2.0 "}>>> = '900 1000' #120
uo_state_var_evol_rate_comp_name<<<{"description": "Name of state variable evolution rate component property: Same as state variable evolution rate component user object specified in input file."}>>> = state_var_evol_rate_comp_gss
scale_factor<<<{"description": "Scale factor of individual component."}>>> = 1.0
block<<<{"description": "The list of blocks (ids or names) that this object will be applied"}>>> = 2
[]
[state_var_evol_rate_comp_gss]
type = CrystalPlasticityStateVarRateComponentGSS<<<{"description": "Phenomenological constitutive model state variable evolution rate component base class. Override the virtual functions in your class", "href": "../../source/userobjects/CrystalPlasticityStateVarRateComponentGSS.html"}>>>
variable_size<<<{"description": "The userobject's variable size."}>>> = 48
hprops<<<{"description": "Hardening properties"}>>> = '1.4 1000 1200 2.5'
uo_slip_rate_name<<<{"description": "Name of slip rate property: Same as slip rate user object specified in input file."}>>> = slip_rate_gss
uo_state_var_name<<<{"description": "Name of state variable property: Same as state variable user object specified in input file."}>>> = state_var_gss
block<<<{"description": "The list of blocks (ids or names) that this object will be applied"}>>> = 2
[]
[]
[Materials<<<{"href": "../../syntax/Materials/index.html"}>>>]
[tensor]
type = ComputeIsotropicElasticityTensor<<<{"description": "Compute a constant isotropic elasticity tensor.", "href": "../../source/materials/ComputeIsotropicElasticityTensor.html"}>>>
block<<<{"description": "The list of blocks (ids or names) that this object will be applied"}>>> = '1'
youngs_modulus<<<{"description": "Young's modulus of the material."}>>> = 1.0e7
poissons_ratio<<<{"description": "Poisson's ratio for the material."}>>> = 0.25
[]
[stress]
type = ComputeFiniteStrainElasticStress<<<{"description": "Compute stress using elasticity for finite strains", "href": "../../source/materials/ComputeFiniteStrainElasticStress.html"}>>>
block<<<{"description": "The list of blocks (ids or names) that this object will be applied"}>>> = '1'
[]
[crysp]
type = FiniteStrainUObasedCP<<<{"description": "UserObject based Crystal Plasticity system.", "href": "../../source/materials/crystal_plasticity/FiniteStrainUObasedCP.html"}>>>
block<<<{"description": "The list of blocks (ids or names) that this object will be applied"}>>> = 2
stol<<<{"description": "Constitutive slip system resistance relative residual tolerance"}>>> = 1e-2
tan_mod_type<<<{"description": "Type of tangent moduli for preconditioner: default elastic"}>>> = exact
uo_slip_rates<<<{"description": "List of names of user objects that define the slip rates for this material."}>>> = 'slip_rate_gss'
uo_slip_resistances<<<{"description": "List of names of user objects that define the slip resistances for this material."}>>> = 'slip_resistance_gss'
uo_state_vars<<<{"description": "List of names of user objects that define the state variable for this material."}>>> = 'state_var_gss'
uo_state_var_evol_rate_comps<<<{"description": "List of names of user objects that define the state variable evolution rate components for this material."}>>> = 'state_var_evol_rate_comp_gss'
maximum_substep_iteration<<<{"description": "Maximum number of substep iteration"}>>> = 20
[]
[elasticity_tensor]
type = ComputeElasticityTensorCP<<<{"description": "Compute an elasticity tensor for crystal plasticity.", "href": "../../source/materials/crystal_plasticity/ComputeElasticityTensorCP.html"}>>>
block<<<{"description": "The list of blocks (ids or names) that this object will be applied"}>>> = 2
C_ijkl<<<{"description": "Stiffness tensor for material"}>>> = '265190 113650 113650 265190 113650 265190 75769 75769 75760'
fill_method<<<{"description": "The fill method"}>>> = symmetric9
[]
[]
[Preconditioning<<<{"href": "../../syntax/Preconditioning/index.html"}>>>]
[SMP]
type = SMP<<<{"description": "Single matrix preconditioner (SMP) builds a preconditioner using user defined off-diagonal parts of the Jacobian.", "href": "../../source/preconditioners/SingleMatrixPreconditioner.html"}>>>
full<<<{"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."}>>> = true
[]
[]
[Executioner<<<{"href": "../../syntax/Executioner/index.html"}>>>]
type = Transient
solve_type = 'PJFNK'
petsc_options = '-snes_ksp_ew'
petsc_options_iname = '-pc_type -snes_linesearch_type -pc_factor_shift_type '
'-pc_factor_shift_amount'
petsc_options_value = 'lu basic NONZERO 1e-15'
line_search = 'none'
automatic_scaling = true
nl_abs_tol = 2.0e-07
nl_rel_tol = 2.0e-07
l_max_its = 40
l_abs_tol = 1e-08
l_tol = 1e-08
start_time = 0.0
dt = 0.01
end_time = 3.0 # Executioner
[]
[Postprocessors<<<{"href": "../../syntax/Postprocessors/index.html"}>>>]
[maxdisp]
type = NodalVariableValue<<<{"description": "Outputs values of a nodal variable at a particular location", "href": "../../source/postprocessors/NodalVariableValue.html"}>>>
nodeid<<<{"description": "The ID of the node where we monitor"}>>> = 39
variable<<<{"description": "The variable to be monitored"}>>> = disp_y
[]
[resid_y]
type = NodalSum<<<{"description": "Computes the sum of all of the nodal values of the specified variable. Note: This object sets the default \"unique_node_execute\" flag to true to avoid double counting nodes between shared blocks.", "href": "../../source/postprocessors/NodalSum.html"}>>>
variable<<<{"description": "The name of the variable that this postprocessor operates on"}>>> = saved_y
boundary<<<{"description": "The list of boundaries (ids or names) from the mesh where this object applies"}>>> = 1
[]
[]
[Outputs<<<{"href": "../../syntax/Outputs/index.html"}>>>]
[out]
type = Exodus<<<{"description": "Object for output data in the Exodus format", "href": "../../source/outputs/Exodus.html"}>>>
elemental_as_nodal<<<{"description": "Output elemental nonlinear variables as nodal"}>>> = true
[]
perf_graph<<<{"description": "Enable printing of the performance graph to the screen (Console)"}>>> = true
csv<<<{"description": "Output the scalar variable and postprocessors to a *.csv file using the default CSV output."}>>> = true
[]
(modules/contact/examples/2d_indenter/indenter_rz_fine.i)Note that the subdomain blocks had been created in the mesh input using LowerDBlockFromSidesetGenerator
.
Mortar enforcement is only available for two-dimensional contact.
Other input
The problem is axisymmetric Compute Axisymmetric RZ Finite Strain and symmetric boundary conditions are used.
Numerical results
The resulting force exerted as material resistance on the indenter may be plotted against the vertical displacement. In this problem, the base material is a monocrystal with body-centered cubic (bcc) unit cell with arbitrary parameters. Plastic deformation causes the piling up of the base material's contact surface, as shown in the animation in Fig. 1.

Fig. 2: Load-displacement curve.
Crystal plasticity parameters can be calibrated to match a given experimental nano-indentation test. For this example, the load-displacement curve is shown in Fig. 2.
Notes:
Friction may alter results
Indenter geometry does not reproduce that of a real problem's. Its geometry can be modified in the journal file.
Element distortions may become large