The header `TFEL/Material/Hosford1972YieldCriterion.hxx`

introduces three functions which are meant to compute the Hosford equivalent stress and its first and second derivatives. *This header is automatically included by MFront*

The Hosford equivalent stress is defined by: \[ \sigma_{\mathrm{eq}}^{H}=\sqrt[a]{\displaystyle\frac{\displaystyle 1}{\displaystyle 2}\left({\left|\sigma_{1}-\sigma_{2}\right|}^{a}+{\left|\sigma_{1}-\sigma_{3}\right|}^{a}+{\left|\sigma_{2}-\sigma_{3}\right|}^{a}\right)} \] where \(s_{1}\), \(s_{2}\) and \(s_{3}\) are the eigenvalues of the stress.

Therefore, when \(a\) goes to infinity, the Hosford stress reduces to the Tresca stress. When \(n = 2\) the Hosford stress reduces to the von Mises stress.

The following functions has been implemented:

`computeHosfordStress`

: return the Hosford equivalent stress`computeHosfordStressNormal`

: return a tuple containing the Hosford equivalent stress and its first derivative (the normal)`computeHosfordStressSecondDerivative`

: return a tuple containing the Hosford equivalent stress, its first derivative (the normal) and the second derivative.

The following example computes the Hosford equivalent stress, its normal and second derivative:

```
stress seq;
Stensor n;
Stensor4 dn;std::tie(seq,n,dn) = computeHosfordStressSecondDerivative(s,a,seps);
```

In this example, `s`

is the stress tensor, `a`

is the Hosford exponent, `seps`

is a numerical parameter used to detect when two eigenvalues are equal.

If `C++-17`

is available, the previous code can be made much more readable:

`const auto [seq,n,dn] = computeHosfordStressSecondDerivative(s,a,seps);`

The header `TFEL/Material/Barlat2004YieldCriterion.hxx`

introduces various functions which are meant to compute the Barlat equivalent stress and its first and second derivatives. *This header is automatically included by MFront* for orthotropic behaviours.

The Barlat equivalent stress is defined as follows (see [1]): \[ \sigma_{\mathrm{eq}}^{B}= \sqrt[a]{ \frac{1}{4}\left( \sum_{i=0}^{3} \sum_{j=0}^{3} {\left|s'_{i}-s''_{j}\right|}^{a} \right) } \]

where \(s'_{i}\) and \(s''_{i}\) are the eigenvalues of two transformed stresses \(\underline{s}'\) and \(\underline{s}''\) by two linear transformation \(\underline{\underline{\mathbf{L}}}'\) and \(\underline{\underline{\mathbf{L}}}''\): \[ \left\{ \begin{aligned} \underline{s}' &= \underline{\underline{\mathbf{L'}}} \,\colon\,\underline{\sigma}\\ \underline{s}'' &= \underline{\underline{\mathbf{L''}}}\,\colon\,\underline{\sigma}\\ \end{aligned} \right. \]

The linear transformations \(\underline{\underline{\mathbf{L}}}'\) and \(\underline{\underline{\mathbf{L}}}''\) are defined by \(9\) coefficients (each) which describe the material orthotropy. There are defined through auxiliary linear transformations \(\underline{\underline{\mathbf{C}}}'\) and \(\underline{\underline{\mathbf{C}}}''\) as follows: \[ \begin{aligned} \underline{\underline{\mathbf{L}}}' &=\underline{\underline{\mathbf{C}}}'\,\colon\,\underline{\underline{\mathbf{M}}} \\ \underline{\underline{\mathbf{L}}}''&=\underline{\underline{\mathbf{C}}}''\,\colon\,\underline{\underline{\mathbf{M}}} \end{aligned} \] where \(\underline{\underline{\mathbf{M}}}\) is the transformation of the stress to its deviator: \[ \underline{\underline{\mathbf{M}}}=\underline{\underline{\mathbf{I}}}-\displaystyle\frac{\displaystyle 1}{\displaystyle 3}\underline{I}\,\otimes\,\underline{I} \]

The linear transformations \(\underline{\underline{\mathbf{C}}}'\) and \(\underline{\underline{\mathbf{C}}}''\) of the deviator stress are defined as follows: \[ \underline{\underline{\mathbf{C}}}'= \begin{pmatrix} 0 & -c'_{12} & -c'_{13} & 0 & 0 & 0 \\ -c'_{21} & 0 & -c'_{23} & 0 & 0 & 0 \\ -c'_{31} & -c'_{32} & 0 & 0 & 0 & 0 \\ 0 & 0 & 0 & c'_{44} & 0 & 0 \\ 0 & 0 & 0 & 0 & c'_{55} & 0 \\ 0 & 0 & 0 & 0 & 0 & c'_{66} \\ \end{pmatrix} \quad \text{and} \quad \underline{\underline{\mathbf{C}}}''= \begin{pmatrix} 0 & -c''_{12} & -c''_{13} & 0 & 0 & 0 \\ -c''_{21} & 0 & -c''_{23} & 0 & 0 & 0 \\ -c''_{31} & -c''_{32} & 0 & 0 & 0 & 0 \\ 0 & 0 & 0 & c''_{44} & 0 & 0 \\ 0 & 0 & 0 & 0 & c''_{55} & 0 \\ 0 & 0 & 0 & 0 & 0 & c''_{66} \\ \end{pmatrix} \]

The following functions have been implemented:

`computeBarlatStress`

: return the Barlat equivalent stress`computeBarlatStressNormal`

: return a tuple containing the Barlat equivalent stress and its first derivative (the normal)`computeBarlatStressSecondDerivative`

: return a tuple containing the Barlat equivalent stress, its first derivative (the normal) and the second derivative.

To define the linear transformations, the `makeBarlatLinearTransformation`

function has been introduced. This function takes two template parameter:

- the space dimension (\(1\), \(2\), and \(3\))
- the numeric type used (automatically deduced)

This functions takes the \(9\) coefficients as arguments, as follows:

```
const auto l1 = makeBarlatLinearTransformation<3>(c_12,c_21,c_13,c_31,
c_23,c_32,c_44,c_55,c_66);
```

NoteIn his paper, Barlat and coworkers uses the following convention for storing symmetric tensors:\[ \begin{pmatrix} xx & yy & zz & yz & zx & xy \end{pmatrix} \]

which is not consistent with the

`TFEL`

/`Cast3M`

/`Abaqus`

/`Ansys`

conventions:\[ \begin{pmatrix} xx & yy & zz & xy & xz & yz \end{pmatrix} \]

Therefore, if one wants to uses coeficients \(c^{B}\) given by Barlat, one shall call this function as follows:

`const auto l1 = makeBarlatLinearTransformation<3>(cB_12,cB_21,cB_13,cB_31, cB_23,cB_32,cB_66,cBB_55,cBB_44);`

The `TFEL/Material`

library also provide an overload of the `makeBarlatLinearTransformation`

which template parameters are the modelling hypothesis and the orthotropic axis conventions. The purpose of this overload is to swap appriopriate coefficients to get a consistent definition of the linear transforamtions for all the modelling hypotheses.

The inverse Langevin function is used in many statistically based network behaviours describing rubber-like materials.

The Langevin function \(\mathcal{L}\) is defined as follows: \[ \mathcal{L}\left(x\right)=\displaystyle\frac{\displaystyle 1}{\displaystyle \coth\left(x\right)}-\displaystyle\frac{\displaystyle 1}{\displaystyle x} \]

The complexity of the inverse Langevin function \(\mathcal{L}^{-1}\left(x\right)\) motivated the development of various approximations [2–4].

Figure 1 compares those approximations. The approximations of Bergström and Boyce [3] and Jedynak [4] are undistinguishable. See Jedynak for a quantitative discussion of the error generated by those approximations [4]. It is worth noting that all those approximations mostly differs near the pole of inverse Langevin function \(\mathcal{L}^{-1}\left(x\right)\).

The `InverseLangevinFunctionApproximations`

enumeration lists the approximations that have been implemented and that can be evaluated in a `constexpr`

context:

- The value
`COHEN_1991`

is associated with the approximation proposed by Cohen [2]: \[ \mathcal{L}^{-1}\left(x\right) \approx y\displaystyle\frac{\displaystyle 3-y^{2}}{\displaystyle 1-y^{2}}. \] - The value
`JEDYNAK_2015`

is associated with the approximation proposed by Jedynak [4]: \[ \mathcal{L}^{-1}\left(x\right) \approx y \, \displaystyle\frac{\displaystyle c_{0} + c_{1}\,y + c_{2}\,y^{2}}{\displaystyle 1 + d_{1}\,y + d_{2}\,y^{2}} \] `KUHN_GRUN_1942`

or`MORCH_2022`

are associated with a taylor expansion of \(\mathcal{L}^{-1}\left(x\right)\) at \(0\): \[ \mathcal{L}^{-1}\left(x\right) \approx y\,P\left(y^{2}\right) \quad\text{with}\quad P\left(y^{2}\right)=\sum_{i=0}^{9}c_{i}\,\left(y^{2}\right)^{i} \] where \(P\) is a \(9\)th order polynomial. Hence, the Taylor expression is of order \(19\).

The `computeApproximateInverseLangevinFunction`

computes one approximation of the inverse Langevin function and the `computeApproximateInverseLangevinFunctionAndDerivative`

function computes ne approximation of the inverse Langevin function and its derivative. These functions have two template parameters: the approximation selected and the numeric type to be used. By default, the `JEDYNAK_2015`

approximation is used and the numeric type can be deduced from the type of the argument.

The approximation proposed by Bergström and Boyce [3] is given by the following function: \[ \mathcal{L}^{-1}\left(x\right) \approx \left\{ \begin{aligned} c_{1} \tan\left(c_{2} \, x\right) + c_{3} \, x &\quad\text{if}\quad \left|x\right| \leq c_{0}\\ \displaystyle\frac{\displaystyle 1}{\displaystyle \mathop{sign}\left(x\right)-x}&\quad\text{if}\quad \left|x\right| > c_{0} \end{aligned} \right. \]

The `computeBergstromBoyce1998ApproximateInverseLangevinFunction`

function computes this approximation and the `computeBergstromBoyce1998ApproximateInverseLangevinFunctionAndDerivative`

function computes this function and its derivative. These functions can’t be declared `constexpr`

because of tangent function is not `constexpr`

. These functions have one template parameter, the numeric type to be used. This template parameter can be automatically deduced from the type of the argument.

```
using ApproximationFunctions = InverseLangevinFunctionApproximations;
// compute Cohen's approximation of the inverse Langevin function
const auto v = computeApproximateInverseLangevinFunction<
ApproximationFunctions::COHEN_1991>(y)// compute Jedynak's approximation of the inverse Langevin function and its derivative
const auto [f, df] = computeApproximateInverseLangevinFunctionAndDerivative(y)
```

The \(\pi\)-plane is defined in the space defined by the three eigenvalues \(S_{0}\), \(S_{1}\) and \(S_{2}\) of the stress by the following equations: \[ S_{0}+S_{1}+S_{2}=0 \]

This plane contains deviatoric stress states and is perpendicular to the hydrostatic axis. A basis of this plane is given by the following vectors: \[ \vec{n}_{0}= \frac{1}{\sqrt{2}}\, \begin{pmatrix} 1 \\ -1 \\ 0 \end{pmatrix} \quad\text{and}\quad \vec{n}_{1}= \frac{1}{\sqrt{6}}\, \begin{pmatrix} -1 \\ -1 \\ 2 \end{pmatrix} \]

This plane is used to characterize the iso-values of equivalent stresses which are not sensitive to the hydrostatic pression.

Various functions are available:

`projectOnPiPlane`

: this function projects a stress state on the \(\pi\)-plane.`buildFromPiPlane`

: this function builds a stress state, defined by its three eigenvalues, from its coordinate in the \(\pi\)-plane.

Most finite element solver can’t have a uniq definition of the orthotropic axes for all the modelling hypotheses.

For example, one can define a pipe using the following axes definition:

- \(\left(rr,zz,tt,...\right)\) in \(3D\), \(2D\) axysymmetric, \(1D\) axisymmetric generalised plane strain or generalised plane stress.
- \(\left(rr,tt,zz,...\right)\) in \(2D\) plane stress, strain, generalized plane strain.

With those conventions, the axial direction is either the second or the third material axis, a fact that must be taken into account when defining the stiffness tensor, the Hill tensor(s), the thermal expansion, etc.

If we were to model plates, a appropriate convention is the following:

- The first material axis is the rolling direction
- The second material axis is the in plane direction perpendicular to the rolling direction (transverse direction).
- The third material axis is the normal to the plate.

This convention is only valid for \(3D\), \(2D\) axysymmetric, \(1D\) axisymmetric generalised plane strain or generalised plane stress. - \(\left(rr,tt,zz,...\right)\) in \(2D\) plane stress, strain, generalized plane strain.

With those conventions, the axial direction is either the second or the third material axis, a fact that must be taken into account when defining the stiffness tensor, the Hill tensor(s), the thermal expansion, etc.

If we were to model plates, a appropriate convention is the following:

- The first material axis is the rolling direction
- The second material axis is the in plane direction perpendicular to the rolling direction (transverse direction).
- The third material axis is the normal to the plate.

This convention is only valid for \(3D\), \(2D\) axysymmetric, \(1D\) axisymmetric generalised plane strain or generalised plane stress. - \(\left(rr,tt,zz,...\right)\) in \(2D\) plane stress, strain, generalized plane strain.

With those conventions, the axial direction is either the second or the third material axis, a fact that must be taken into account when defining the stiffness tensor, the Hill tensor(s), the thermal expansion, etc.

If we were to model plates, a appropriate convention is the following:

- The first material axis is the rolling direction
- The second material axis is the in plane direction perpendicular to the rolling direction (transverse direction).
- The third material axis is the normal to the plate.

By definition, this convention is only valid for \(3D\), \(2D\) plane stress, strain and generalized plane strain modelling hypotheses.

1.

Barlat, F., Aretz, H., Yoon, J. W., Karabin, M. E., Brem, J. C. and Dick, R. E. Linear transfomation-based anisotropic yield functions. *International Journal of Plasticity*. 1 May 2005. Vol. 21, no. 5, p. 1009–1039. DOI 10.1016/j.ijplas.2004.06.004. Available from: http://www.sciencedirect.com/science/article/pii/S0749641904001160

2.

Cohen, A. A padé approximant to the inverse langevin function. *Rheologica Acta*. 1 May 1991. Vol. 30, no. 3, p. 270–273. DOI 10.1007/BF00366640. Available from: https://doi.org/10.1007/BF00366640

3.

Bergström, J. S. and Boyce, M. C. Constitutive modeling of the large strain time-dependent behavior of elastomers. *Journal of the Mechanics and Physics of Solids*. 1 May 1998. Vol. 46, no. 5, p. 931–954. DOI 10.1016/S0022-5096(97)00075-6. Available from: https://www.sciencedirect.com/science/article/pii/S0022509697000756

4.

Jedynak, Radosław. Approximation of the inverse langevin function revisited. *Rheologica Acta*. 1 January 2015. Vol. 54, no. 1, p. 29–39. DOI 10.1007/s00397-014-0802-2. Available from: https://doi.org/10.1007/s00397-014-0802-2