Balance of Linear Momentum

Overview

The stress-divergence kernels enforce the balance of linear momentum: they solve for the displacement field that puts the body in mechanical equilibrium under the applied loads. The module provides two equivalent formulations of this balance Hu and Messner (2025):

  • the total Lagrangian formulation, which enforces equilibrium on the reference configuration using the first Piola-Kirchhoff stress ; and

  • the updated Lagrangian formulation, which enforces equilibrium on the current configuration using the Cauchy stress .

Both consume the deformation measures produced by the kinematics calculator and the stress produced by a constitutive model. This page describes the governing equations and the relationship between the two formulations; the detailed residual, Jacobian, and stabilization terms for each kernel are given on the linked source pages.

Strong and Weak Form

For large deformation kinematics the total Lagrangian formulation solves where is the first Piola-Kirchhoff stress, the body force, the reference-configuration normal, the prescribed traction, and the prescribed displacement. The updated Lagrangian formulation solves the equivalent problem on the current configuration with the Cauchy stress and the current-configuration normal.

Multiplying the strong form by a test function and integrating by parts gives the weak form. The stress-divergence kernels provide the stress term of the residual, for the total Lagrangian formulation, and the analogous integral of the Cauchy stress over the current configuration for the updated Lagrangian formulation; body forces and tractions are contributed by separate kernels and boundary conditions. Solving the residual with Newton's method requires its Jacobian, the derivative of the stress term with respect to the displacement, which is built from the constitutive tangent supplied by the material model. The exact residual and Jacobian for each kernel, including the stabilization terms, are given on the total Lagrangian and updated Lagrangian source pages.

Total vs. Updated Lagrangian

The two formulations are related through with the volume change. If the boundary conditions, body force, and constitutive model are the same, the total and updated Lagrangian formulations produce exactly the same result; the choice between them is one of convenience. It is most natural to define a constitutive model that returns the first Piola-Kirchhoff stress as a function of the deformation gradient, , for the total Lagrangian kernel, and the Cauchy stress for the updated Lagrangian kernel. The material system converts between the Cauchy and first Piola-Kirchhoff stress automatically (see ComputeLagrangianStressCauchy and ComputeLagrangianStressPK1), so a model written for either measure can be used with either kernel.

One case does favor a specific formulation: the homogenization system works only with the total Lagrangian kernel, because of the difficulty of including the extra macroscopic gradient in the current-configuration kinematics.

Small Deformation

Under small deformation kinematics the reference and current configurations coincide and both formulations degenerate to the same problem where is the small (engineering) stress and there is no distinction between the current and reference configurations. Both kernels support both small and large deformation theory. The kinematic theory is selected once, on the strain calculator, through the large_kinematics option (see The large_kinematics Option); the kernels derive their kinematic theory from the strain calculator automatically.

The use_displaced_mesh Flag

In MOOSE the use_displaced_mesh flag selects whether test-function gradients and integrals are taken with respect to the current (true) or reference (false) configuration. In the Lagrangian system the only object that requires use_displaced_mesh = true is the updated Lagrangian kernel when large_kinematics = true, because it enforces equilibrium on the current configuration; the kernel checks this condition and errors if it is not met. Every other object in the system uses use_displaced_mesh = false.

The SolidMechanics/QuasiStatic action sets this flag correctly for the chosen formulation, and using it is the recommended way to keep the configuration on which equilibrium is enforced consistent with the stress measure.

Coupling to the Kernels

Objects that need the stress computed by the stress-divergence kernels should couple to the cauchy_stress or pk1_stress material property, as appropriate.

Implementation

The balance of linear momentum is enforced by the following kernels:

ObjectUse
TotalLagrangianStressDivergencereference-configuration (PK1) equilibrium, 3D and 2D Cartesian
TotalLagrangianStressDivergenceAxisymmetricCylindricaltotal Lagrangian, 2D axisymmetric cylindrical
TotalLagrangianStressDivergenceCentrosymmetricSphericaltotal Lagrangian, 1D centrosymmetric spherical
TotalLagrangianWeakPlaneStresstotal Lagrangian weak plane stress
HomogenizedTotalLagrangianStressDivergencetotal Lagrangian with the homogenization system
UpdatedLagrangianStressDivergencecurrent-configuration (Cauchy) equilibrium, Cartesian

Each kernel provides the residual for one displacement component, so one kernel per coordinate direction is required. In most cases the kernels are added automatically by the SolidMechanics/QuasiStatic action. They can also be added directly:

[Kernels<<<{"href": "../../syntax/Kernels/index.html"}>>>]
  [sdx]
    type = TotalLagrangianStressDivergence<<<{"description": "Enforce equilibrium with a total Lagrangian formulation in Cartesian coordinates.", "href": "../../source/kernels/lagrangian/TotalLagrangianStressDivergence.html"}>>>
    variable<<<{"description": "The name of the variable that this residual object operates on"}>>> = disp_x
    component<<<{"description": "Which direction this kernel acts in"}>>> = 0
  []
  [sdy]
    type = TotalLagrangianStressDivergence<<<{"description": "Enforce equilibrium with a total Lagrangian formulation in Cartesian coordinates.", "href": "../../source/kernels/lagrangian/TotalLagrangianStressDivergence.html"}>>>
    variable<<<{"description": "The name of the variable that this residual object operates on"}>>> = disp_y
    component<<<{"description": "Which direction this kernel acts in"}>>> = 1
  []
  [sdz]
    type = TotalLagrangianStressDivergence<<<{"description": "Enforce equilibrium with a total Lagrangian formulation in Cartesian coordinates.", "href": "../../source/kernels/lagrangian/TotalLagrangianStressDivergence.html"}>>>
    variable<<<{"description": "The name of the variable that this residual object operates on"}>>> = disp_z
    component<<<{"description": "Which direction this kernel acts in"}>>> = 2
  []
[]
(moose/modules/solid_mechanics/test/tests/lagrangian/cartesian/total/patch/large_patch.i)

References

  1. Tianchen Hu and Mark C. Messner. A simple, scalable large deformation solid mechanics implementation in the moose framework. ACM Trans. Math. Softw., April 2025. URL: https://doi.org/10.1145/3716308, doi:10.1145/3716308.[Export]