UpdatedLagrangianStressDivergence

Enforce equilibrium with an updated Lagrangian formulation in Cartesian coordinates.

Description

The UpdatedLagrangianStressDivergence kernel calculates the stress equilibrium residual in the current configuration using the cauchy_stress (the Cauchy stress). This kernel provides the residual for Cartesian coordinates and the user needs to add one kernel for each dimension of the problem. Alternatively, the TensorMechanics/MasterAction simplifies the process of adding the required kernels and setting up the input parameters.

Residual, Jacobian, and stabilization

For large deformation kinematics the kernel applies the residual with the corresponding Jacobian where is the Cauchy stress, with the incremental spatial velocity gradient, are the test function gradients (with respect to the current coordinates) and with the discrete (nodal) displacements. For the unstabilized case with the trial function gradients with respect to the current coordinates.

The residual and Jacobian degenerate to and for the small deformation case, with the small stress, with the small strain and for the unstabilized case. The large_kinematics flag controls the kinematic theory. For this kernel use_displaced_mesh must be set to true if large_kinematics is true so that the volume integrals and gradients are with respect to the current coordinates.

For the Jacobian the small deformation term and the large deformation term are identical (assuming the incremental deformation gradient is the identity and the deformation gradient degenerates to the small strain for the small deformation case) and involve the constitutive model. These are then called the "material" part of the Jacobian. The remaining large deformation term involves the current stress and the updated geometry and so it is called the "geometric" part of the Jacobian.

The constitutive model needs to provide the Cauchy stress and the derivative of that stress with respect to the increment in the spatial velocity gradient. However, the material system provides a common interface to define the constitutive model with any stress and strain measures that are convient, translating the user-defined stress and Jacobian to the correct form automatically. Note that if the model is rotationally invariant then where is the increment in the material deformation rate, equal to the increment in the logarthmic strain Freed (2014).

The kernel is compatible with the modification of the strains to stabilize the problem for incompressible or nearly incompressible deformation. This form of stabilization does not modify the residual equation, though the modified strain does change the constitutive model stress update. The strain modification does affect the Jacobian by altering the definition of the gradient tensors. With the modified strains applied these become for small deformations with and for large deformations with and the average deformation gradient, defined in the stabilization system documentation. Note this is a somewhat unusual integral for an updated Lagrangian model, but it follows to keep the derivative term consistent with the modification to the strains. The stabilize_strain flag controls if the kernel modifies the Jacobian to account for the stabilized strains.

use_displaced_mesh

The UpdatedLagrangianStressDiverence kernel is the only object in the new, Lagrangian Tensor Mechanics system that requires use_displaced_mesh to be set. The use_displaced_mesh flag should be set to true if and only if large_kinematics is also true. The kernel enforces this condition with an error.

Example Input File Syntax

The following illustrates manually including 3D stress equilibrium with the total Lagrangian formulation, using large deformation kinematics.

[Kernels]
  [sdx]
    type = UpdatedLagrangianStressDivergence
    variable = disp_x
    displacements = 'disp_x disp_y disp_z'
    component = 0
    use_displaced_mesh = true
    large_kinematics = true
  []
  [sdy]
    type = UpdatedLagrangianStressDivergence
    variable = disp_y
    displacements = 'disp_x disp_y disp_z'
    component = 1
    use_displaced_mesh = true
    large_kinematics = true
  []
  [sdz]
    type = UpdatedLagrangianStressDivergence
    variable = disp_z
    displacements = 'disp_x disp_y disp_z'
    component = 2
    use_displaced_mesh = true
    large_kinematics = true
  []
[]
(../moose/modules/tensor_mechanics/test/tests/lagrangian/cartesian/updated/patch/large_patch.i)

Input Parameters

  • componentWhich direction this kernel acts in

    C++ Type:unsigned int

    Controllable:No

    Description:Which direction this kernel acts in

  • displacementsThe displacement components

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

    Controllable:No

    Description:The displacement components

  • variableThe name of the variable that this residual object operates on

    C++ Type:NonlinearVariableName

    Controllable:No

    Description:The name of the variable that this residual object operates on

Required Parameters

  • base_nameMaterial property base name

    C++ Type:std::string

    Controllable:No

    Description:Material property base name

  • 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

  • eigenstrain_namesList of eigenstrains used in the strain calculation. Used for computing their derivatives for off-diagonal Jacobian terms.

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

    Controllable:No

    Description:List of eigenstrains used in the strain calculation. Used for computing their derivatives for off-diagonal Jacobian terms.

  • large_kinematicsFalseUse large displacement kinematics

    Default:False

    C++ Type:bool

    Controllable:No

    Description:Use large displacement kinematics

  • out_of_plane_strainThe out-of-plane strain variable for weak plane stress formulation.

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

    Controllable:No

    Description:The out-of-plane strain variable for weak plane stress formulation.

  • 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

    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.

  • stabilize_strainFalseAverage the volumetric strains

    Default:False

    C++ Type:bool

    Controllable:No

    Description:Average the volumetric strains

  • temperatureThe name of the temperature variable used in the ComputeThermalExpansionEigenstrain. (Not required for simulations without temperature coupling.)

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

    Controllable:No

    Description:The name of the temperature variable used in the ComputeThermalExpansionEigenstrain. (Not required for simulations without temperature coupling.)

Optional Parameters

  • absolute_value_vector_tagsThe tags for the vectors this residual object should fill with the absolute value of the residual contribution

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

    Controllable:No

    Description:The tags for the vectors this residual object should fill with the absolute value of the residual contribution

  • extra_matrix_tagsThe extra tags for the matrices this Kernel should fill

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

    Controllable:No

    Description:The extra tags for the matrices this Kernel should fill

  • extra_vector_tagsThe extra tags for the vectors this Kernel should fill

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

    Controllable:No

    Description:The extra tags for the vectors this Kernel should fill

  • matrix_tagssystemThe tag for the matrices this Kernel should fill

    Default:system

    C++ Type:MultiMooseEnum

    Options:nontime, system

    Controllable:No

    Description:The tag for the matrices this Kernel should fill

  • vector_tagsnontimeThe tag for the vectors this Kernel should fill

    Default:nontime

    C++ Type:MultiMooseEnum

    Options:nontime, time

    Controllable:No

    Description:The tag for the vectors this Kernel should fill

Tagging 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.

  • diag_save_inThe name of auxiliary variables to save this Kernel's diagonal Jacobian contributions to. Everything about that variable must match everything about this variable (the type, what blocks it's on, etc.)

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

    Controllable:No

    Description:The name of auxiliary variables to save this Kernel's diagonal Jacobian contributions to. Everything about that variable must match everything about this variable (the type, what blocks it's on, etc.)

  • enableTrueSet the enabled status of the MooseObject.

    Default:True

    C++ Type:bool

    Controllable:Yes

    Description:Set the enabled status of the MooseObject.

  • implicitTrueDetermines whether this object is calculated using an implicit or explicit form

    Default:True

    C++ Type:bool

    Controllable:No

    Description:Determines whether this object is calculated using an implicit or explicit form

  • save_inThe name of auxiliary variables to save this Kernel's residual contributions to. Everything about that variable must match everything about this variable (the type, what blocks it's on, etc.)

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

    Controllable:No

    Description:The name of auxiliary variables to save this Kernel's residual contributions to. Everything about that variable must match everything about this variable (the type, what blocks it's on, etc.)

  • 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

References

  1. AD Freed. Hencky strain and logarithmic rates in lagrangian analysis. International Journal of Engineering Science, 81:135–145, 2014.[BibTeX]