Simple motions
Material Point Simulation and Analytic Motions
One of the primary goals of ConstitutiveModels.jl is to make the development and verification of constitutive models as straightforward as possible. Before integrating a constitutive model into a finite element code, it is often desirable to evaluate its response at a single material point subjected to prescribed deformation histories.
To support this workflow, ConstitutiveModels.jl provides
- a general material point simulator,
- a hierarchy of prescribed kinematic motions,
- constrained loading paths,
- automatic history storage,
- optional temperature and temperature gradient histories.
Together these utilities provide a lightweight "virtual material testing machine" for evaluating constitutive behavior under a variety of loading conditions.
Overview
The simulation framework consists of four primary components.
| Component | Purpose |
|---|---|
AbstractMotion | Represents a prescribed loading path |
simulate_material_point | Advances the constitutive model through time |
MaterialHistory | Stores the complete simulation history |
| Motion implementations | Define common analytical deformation histories |
The general workflow is
Motion
↓
Kinematics
↓
Constitutive Model
↓
Material Response
↓
MaterialHistoryThe same simulation driver can be used for nearly every constitutive model in the package.
Motion Interface
Every loading path derives from
abstract type AbstractMotion endwhich represents a time-dependent deformation history.
Two specialized subclasses are provided.
AbstractSimpleMotiondescribes motions whose kinematics are prescribed analytically.
Examples include
- uniaxial strain,
- simple shear,
- biaxial stretch,
- pure shear.
These motions require no iterative solution.
AbstractConstrainedMotionrepresents loading paths in which one or more kinematic quantities must be determined implicitly by satisfying mechanical constraints.
For example,
- uniaxial stress,
- plane stress,
- traction-free lateral boundaries.
These motions generally require a nonlinear solve at every time increment.
Kinematic Quantities
Different constitutive models operate on different kinematic measures.
The simulation framework automatically computes the required quantity.
Depending on the constitutive model, this may be
- displacement gradient
\[\nabla\mathbf{u},\]
- deformation gradient
\[\mathbf{F},\]
- velocity gradient
\[\mathbf{L},\]
- infinitesimal strain
\[\boldsymbol{\varepsilon}.\]
The helper function
_kinematics(...)selects the appropriate measure based on the constitutive model.
This allows the same motion definition to be used for
- finite strain hyperelasticity,
- infinitesimal elasticity,
- hypoelasticity,
- elastoplasticity,
- viscoelasticity,
without modification.
Material Point Simulation
The primary user interface is
simulate_material_point(...)which integrates a constitutive model over a prescribed loading history.
The simulator
- initializes material properties,
- initializes internal variables,
- advances time,
- evaluates the constitutive response,
- updates history variables,
- stores the results.
The result is a vector of MaterialHistory objects that completely describe the evolution of the material point.
Hyperelastic Models
For hyperelastic constitutive models, the simulator evaluates constitutive quantities directly from the current deformation.
Each time increment performs
time
↓
temperature
↓
kinematics
↓
constitutive model
↓
state update
↓
history outputInternal state variables are updated after every increment before advancing to the next load step.
Hypoelastic Models
Hypoelastic constitutive models differ slightly because the constitutive response depends on the previous stress state.
Consequently, the simulator additionally stores
\[\boldsymbol{\sigma}_n\]
and updates
\[\boldsymbol{\sigma}_{n+1}\]
after each increment.
Apart from this difference, both simulation drivers expose the same interface to the user.
Material History
Simulation results are stored in
MaterialHistorywhich records the complete state of the material point at every time step.
Each history entry contains
| Quantity | Description |
|---|---|
| Time | Current simulation time |
| Kinematics | Deformation measure supplied to the constitutive model |
| Material output | Quantity returned by the requested constitutive function |
| State variables | Internal variables after the update |
| Temperature | Current temperature |
| Temperature gradient | Current temperature gradient |
The returned history vector may be postprocessed to generate stress-strain curves, internal variable evolution, energy histories, or other constitutive responses.
Temperature Histories
The simulator optionally accepts prescribed thermal loading.
Temperature is specified by
temp_func(t)while the temperature gradient is prescribed through
temp_grad_func(t)For purely mechanical simulations, both default to zero.
Thermomechanical constitutive models can therefore be exercised using exactly the same simulation framework as isothermal models.
Analytical Motion Definitions
ConstitutiveModels.jl provides several commonly used analytical loading paths.
These are intended primarily for
- constitutive model verification,
- regression testing,
- parameter calibration,
- visualization,
- comparison with analytical solutions.
Uniaxial Strain
The uniaxial strain motion prescribes
\[\mathbf{F} = \begin{bmatrix} \lambda(t) & 0 & 0\\ 0 & 1 & 0\\ 0 & 0 & 1 \end{bmatrix}.\]
Only the stretch history
\[\lambda(t)\]
must be provided.
This loading path is commonly used for
- tensile testing,
- compression,
- elastoplastic verification.
Example
motion = UniaxialStrain(t -> 1 + 0.2t)Biaxial Strain
Biaxial strain independently stretches two principal directions.
\[\mathbf{F} = \begin{bmatrix} \lambda_1(t) & 0 & 0\\ 0 & \lambda_2(t) & 0\\ 0 & 0 & 1 \end{bmatrix}.\]
This loading path is useful for
- rubber elasticity,
- membrane materials,
- anisotropic constitutive models.
Example
motion = BiaxialStrain(
t -> 1 + 0.2t,
t -> 1 + 0.1t
)Isochoric Uniaxial Stress
This motion preserves volume while stretching one principal direction.
The deformation gradient is
\[\mathbf{F} = \begin{bmatrix} \lambda & 0 & 0\\ 0 & \lambda^{-1/2} & 0\\ 0 & 0 & \lambda^{-1/2} \end{bmatrix},\]
which satisfies
\[\det(\mathbf{F})=1.\]
Isochoric loading is frequently used when testing nearly incompressible constitutive models.
Pure Shear
Pure shear is represented by
\[\mathbf{F} = \frac12 \begin{bmatrix} \lambda+\lambda^{-1} & \lambda-\lambda^{-1} & 0\\ \lambda-\lambda^{-1} & \lambda+\lambda^{-1} & 0\\ 0&0&2 \end{bmatrix}.\]
Unlike simple shear, this loading path consists entirely of principal stretches with no rigid-body rotation.
It is widely used in nonlinear elasticity.
Simple Shear
Simple shear prescribes
\[\mathbf{F} = \begin{bmatrix} 1&\gamma(t)&0\\ 0&1&0\\ 0&0&1 \end{bmatrix}.\]
where
\[\gamma(t)\]
is the prescribed engineering shear.
Simple shear is one of the standard benchmark problems for
- finite deformation elasticity,
- viscoelasticity,
- crystal plasticity,
- large-strain plasticity.
Example
motion = SimpleShear(t -> 0.5t)Velocity Gradient
Every analytical motion also provides its associated velocity gradient
\[\mathbf{L} = \dot{\mathbf{F}}\mathbf{F}^{-1},\]
computed automatically through automatic differentiation using ForwardDiff.jl.
Consequently, the user only specifies the deformation history, while the corresponding velocity gradient is generated automatically.
This allows the same motion to drive both
- finite deformation formulations using the deformation gradient, and
- rate-based constitutive models requiring the velocity gradient.
Constrained Motions
Not every experimental loading condition can be prescribed analytically.
For example, a uniaxial tensile test is typically performed under
\[\sigma_{22}=\sigma_{33}=0,\]
rather than prescribing the lateral stretches.
The class
AbstractConstrainedMotionsupports these situations.
Uniaxial Stress Displacement Control
The current implementation provides
UniaxialStressDisplacementControlwhich prescribes the axial displacement while solving for the unknown lateral strains.
At each time increment, a nonlinear system is solved such that
\[\sigma_{22}=0,\]
\[\sigma_{33}=0.\]
The unknown lateral deformation is determined using a Newton iteration based on automatic differentiation.
This makes the loading path applicable to arbitrary nonlinear constitutive models without requiring analytical tangent expressions.
Newton Solver
Constrained motions rely on an internal Newton solver.
Given a nonlinear residual
\[\mathbf{r}(\mathbf{x}),\]
the update is computed as
\[\Delta\mathbf{x} = -\mathbf{J}^{-1}\mathbf{r},\]
where
\[\mathbf{J} = \frac{\partial\mathbf{r}}{\partial\mathbf{x}}\]
is evaluated automatically using ForwardDiff.jl.
Iterations continue until both the residual and solution updates satisfy the prescribed convergence tolerances.
Although this solver is primarily an implementation detail, it enables constrained loading paths to remain independent of any particular constitutive model.
Design Philosophy
The material point simulator is intended to provide a common testing environment for every constitutive model in ConstitutiveModels.jl.
By separating
- constitutive behavior,
- kinematic loading paths,
- state evolution,
- temperature histories,
- and result storage,
the same simulation framework can be reused across a wide range of material models with minimal code duplication.
This modular design also makes it straightforward to add new analytical motions, constrained loading conditions, or constitutive models without modifying the simulation driver itself, providing a flexible foundation for the multiphysics capabilities of ConstitutiveModels.jl.
ConstitutiveModels.AbstractConstrainedMotion — Type
abstract type AbstractConstrainedMotion{DGT, VGT} <: ConstitutiveModels.AbstractMotion{DGT, VGT}ConstitutiveModels.AbstractSimpleMotion — Type
abstract type AbstractSimpleMotion{DGT, VGT} <: ConstitutiveModels.AbstractMotion{DGT, VGT}ConstitutiveModels.BiaxialStrain — Type
Provides an analytic motion for biaxial strain
This is
\[\mathbf{F} = \begin{bmatrix} \lambda_1(t) & 0 & 0 \\ 0 & \lambda_2(t) & 0 \\ 0 & 0 & 1 \end{bmatrix}\]
ConstitutiveModels.IsochoricUniaxialStress — Type
Provides an analytic motion for isochoric uniaxial stress
This is
\[\mathbf{F} = \begin{bmatrix} \lambda(t) & 0 & 0 \\ 0 & \frac{1}{\lambda}(t) & 0 \\ 0 & 0 & \frac{1}{\lambda}(t) \end{bmatrix}\]
ConstitutiveModels.PureShearStrain — Type
Provides an analytic motion for pure shear strain
This is
\[\mathbf{F} = \frac{1}{2}\begin{bmatrix} \left(\lambda + \lambda^{-1}\right) & \left(\lambda - \lambda^{-1}\right) & 0 \\ \left(\lambda - \lambda^{-1}\right) & \left(\lambda + \lambda^{-1}\right) & 0 \\ 0 & 0 & 2 \end{bmatrix}\]
ConstitutiveModels.SimpleShear — Type
Provides an analytic motion for simple shear.
This is
\[\mathbf{F} = \begin{bmatrix} 1 & \gamma & 0 \\ 0 & 1 & 0 \\ 0 & 0 & 1 \end{bmatrix}\]
ConstitutiveModels.UniaxialStrain — Type
Provides an analytic motion for uniaxial strain
This is
\[\mathbf{F} = \begin{bmatrix} \lambda(t) & 0 & 0 \\ 0 & 1 & 0 \\ 0 & 0 & 1 \end{bmatrix}\]
user needs to provide function \lambda(t)
ConstitutiveModels.displacement_gradient — Method
displacement_gradient(
motion::ConstitutiveModels.AbstractSimpleMotion,
t,
args...
) -> Any
ConstitutiveModels.linear_strain — Method
linear_strain(
motion::ConstitutiveModels.AbstractMotion,
t,
args...
) -> Tensors.SymmetricTensor{2, 3, _A, 6} where _A