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)
commentnote

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.

commentnote

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