Materials¶
Material models describe how the stress in a material depends on its deformation. In a general sense, we can formulate this for an isothermal material abstractly as
with a function \(\mathcal{F}\) that maps a deformation gradient \(\mathbf{F}\) and material state vector \(\pmb{\alpha}\) to a stress.
In general, this relation is non-linear and often path-dependent. To solve the global equilibrium equations, the material model must be implemented incrementally. Instead of a total mapping, we evaluate the material response over a discrete load step from time \(t_n\) to \(t_{n+1}\).
The material model is responsible for advancing the material state. Given the state at the beginning of the step (\(\mathbf{F}_n,\mathbf{P}_n, \pmb{\alpha}_n\)) and an increment of deformation \(\Delta \mathbf{H}\), the model must determine the new stress and updated internal variables (\(\mathbf{P}_{n+1}, \pmb{\alpha}_{n+1}\)). In addition, it must provide an algorithmic tangent stiffness
$$
\mathbb{C}_{n+1} = \frac{\partial \Delta \pmb{\sigma}}{\partial \Delta \mathbf{H}}
$$
for convergence speed of the underlying incremental Newton-Raphson solver.
In torch-fem, this logic is encapsulated in the step() method of each material inherited from the abstract Material base class:
torchfem.materials.Material.step(H_inc, F, stress, state, de0, cl, iter)
abstractmethod
¶
Performs an incremental step of the material model.
This function has to update the stress, internal state, and algorithmic tangent stiffness.
Parameters:
-
H_inc(Tensor) –Incremental displacement gradient \(\Delta \mathbf{H}\). Shape:
(..., d, d). -
F(Tensor) –Current deformation gradient \(\mathbf{F}_n\). Shape:
(..., d, d). -
stress(Tensor) –Current stress tensor \(\pmb{\sigma}_n\) or \(\mathbf{P}_n\). Shape:
(..., d, d). -
state(Tensor) –Internal state variables \(\pmb{\alpha}_n\). Shape:
(..., <number of state variables>). -
de0(Tensor) –External strain increment (e.g., thermal). Shape:
(..., d, d). -
cl(Tensor) –Characteristic lengths for regularization. Shape:
(..., 1). -
iter(int) –Current iteration number.
Returns:
-
stress_new(Tensor) –Updated stress tensor \(\pmb{\sigma}_{n+1}\) or \(\mathbf{P}_{n+1}\). Shape:
(..., d, d). -
state_new(Tensor) –Updated internal state \(\pmb{\alpha}_{n+1}\). Shape:
(..., n_state) -
ddsdde(Tensor) –Algorithmic tangent stiffness tensor \(\frac{\partial \Delta \pmb{\sigma}}{\partial \Delta \mathbf{H}}\). Shape:
(..., d, d, d, d).