# ArmstrongFrederick

Armstrong-Frederick Steel Model

## References

1. [10.1016/S0749-6419(01)00049-3](https://doi.org/10.1016/S0749-6419\(01\)00049-3)
2. [10.1115/1.3264257](https://doi.org/10.1115/1.3264257)
3. [10.1179/096034007X207589](https://doi.org/10.1179/096034007X207589)

## Theory

Implementation can be found in a separate [document](https://github.com/TLCFEM/suanPan-manual/blob/dev/docs/Library/Material/Material3D/vonMises/ArmstrongFrederick.pdf).

A von Mises type yield function is used. The associated plasticity is assumed. Both isotropic and kinematic hardening rules are employed.

Although the plastic flow is associative, the hardening rules are not. As the result, the consistent tangent modulus is not symmetric.

### Isotropic Hardening

An exponential function is added to the linear hardening law.

$$
k=\sigma\_y+k\_s(1-e^{-mp})+k\_lp,
$$

where $$\sigma\_y$$ is the initial elastic limit (yielding stress), $$k\_s$$ is the saturation stress, $$k\_l$$ is the linear hardening modulus, $$m$$ is a constant that controls the speed of hardening, $$\mathrm{d}p=\sqrt{\dfrac{2}{3}\mathrm{d}\varepsilon^p:\mathrm{d}\varepsilon^p}$$ is the rate of accumulated plastic strain $$p$$.

### Kinematic Hardening

The Armstrong-Frederick type rule is used. Multiple back stresses are defined,

$$
\beta=\sum\beta^i
$$

in which

$$
\mathrm{d}\beta^i=\sqrt{\dfrac{2}{3}}a^i\~\mathrm{d}\varepsilon^p-b^i\beta\~\mathrm{d}p,
$$

where $$a^i$$ and $$b^i$$ are material constants. Note here a slightly different definition is adopted as in the original literature $$\dfrac{2}{3}$$ is used instead of $$\sqrt{\dfrac{2}{3}}$$. This is purely for a slightly more tidy derivation and does not affect anything.

## Syntax

The following applies to `v3.6` and later. Check the older syntax in the older version of the documentation.

```
material ArmstrongFrederick (1) (2) (3) (4) (5) (6) (7) [(8) (9)...] [10]
# (1) int, unique material tag
# (2) double, elastic modulus
# (3) double, poissons ratio
# (4) double, yield stress
# (5) double, linear hardening modulus
# (6) double, saturation stress
# (7) double, m, saturation rate
# (8) double, a, kinematic hardening parameter
# (9) double, b, kinematic hardening parameter
# [10] double, density, default: 0.0
```

## History Layout

| location                | parameter                                                         |
| ----------------------- | ----------------------------------------------------------------- |
| `initial_history(0)`    | accumulated plastic strain                                        |
| `initial_history(1-6)`  | back stress for the first pair of $$a^1$$ and $$b^1$$             |
| `initial_history(7-12)` | back stress for the second pair of $$a^2$$ and $$b^2$$ if defined |
| ...                     | more back stresses                                                |

## Example

Here a few examples are shown.

### Isotropic Hardening Only

There is no difference between the classic J2 plasticity model and this AF steel model if only isotropic hardening is defined.

```
material ArmstrongFrederick 1 2E2 .2 .1 1. .05 1000.
```

![Example 1](https://4006314410-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2F-MQ5rMqEBbzA9NgGETGX%2Fuploads%2Fgit-blob-53fe7b82f5901ba4cd6608db9a30f1c9ac74caf1%2FArmstrongFrederick.EX1.svg?alt=media)

### Kinematic Hardening Only

If $$a\neq0$$ and $$b=0$$, there is no difference between the classic J2 plasticity model and this AF steel model. A linear kinematic hardening rule is implied. Normally at least one set of $$a^1$$ and $$b^1$$ is defined.

```
material ArmstrongFrederick 1 2E2 .2 .1 0. 0. 0. 50. 500.
```

![Example 2](https://4006314410-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2F-MQ5rMqEBbzA9NgGETGX%2Fuploads%2Fgit-blob-36a429c976de93e518cb178c17f113e3c71b6304%2FArmstrongFrederick.EX2.svg?alt=media)

By definition, if one set of $$a^1$$ and $$b^1$$ is defined, then the maximum stress can be computed as

$$
\sigma\_{max}=\sigma\_y+\sqrt{\dfrac{3}{2}}\dfrac{a^1}{b^1}.
$$

In this case, it is

$$
\sigma\_{max}=0.1\~\mathrm{GPa}+\sqrt{\dfrac{3}{2}}\dfrac{50}{500}~~\mathrm{GPa}=222.47~~\mathrm{MPa}.
$$

The cyclic response is shown as follows.

![Example 3](https://4006314410-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2F-MQ5rMqEBbzA9NgGETGX%2Fuploads%2Fgit-blob-b07db88492b06b91f713805ab8ccb263edf037fa%2FArmstrongFrederick.EX3.svg?alt=media)

Of course, multiple sets of $$a^i$$ and $$b^i$$ can be defined.

```
material ArmstrongFrederick 1 2E2 .2 .1 0. 0. 0. 50. 500. 100. 600.
```

Accordingly, the maximum stress is

$$
\sigma\_{max}=\sigma\_y+\sqrt{\dfrac{3}{2}}\sum\dfrac{a^i}{b^i}=0.1+\sqrt{\dfrac{3}{2}}\left(
\dfrac{50}{500}+\dfrac{100}{600}\right)=426.60\~\mathrm{MPa}.
$$

![Example 3](https://4006314410-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2F-MQ5rMqEBbzA9NgGETGX%2Fuploads%2Fgit-blob-a8618503bbd3d6a4dd159ff65b0f1e7df810182d%2FArmstrongFrederick.EX4.svg?alt=media)

The cyclic response is shown as follows.

![Example 5](https://4006314410-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2F-MQ5rMqEBbzA9NgGETGX%2Fuploads%2Fgit-blob-29824e20f88acbf5fdff8aa64476ba7c7744133d%2FArmstrongFrederick.EX5.svg?alt=media)

### Zero Elastic Range

It is possible to define a zero plastic range response, although the initial stiffness cannot be explicitly assigned.

```
material ArmstrongFrederick 1 2E2 .2 0. 0. 0. 0. 40.82482305 500.
```

The corresponding maximum stress is $$100\~\mathrm{MPa}$$.

![Example 6](https://4006314410-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2F-MQ5rMqEBbzA9NgGETGX%2Fuploads%2Fgit-blob-745dcd247c678781e6ff72773bd2c484dee9967d%2FArmstrongFrederick.EX6.svg?alt=media)

With some linear isotropic hardening,

```
material ArmstrongFrederick 1 2E2 .2 0. .1 0. 0. 40.82482305 500.
```

![Example 7](https://4006314410-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2F-MQ5rMqEBbzA9NgGETGX%2Fuploads%2Fgit-blob-2693921ce078e8343b2eef7120c7df6c3f2c115d%2FArmstrongFrederick.EX7.svg?alt=media)

## Iso-error Map

The following example iso-error maps are obtained via the following script.

```py
from plugins import ErrorMap
# note: the dependency `ErrorMap` can be found in the following link
# https://github.com/TLCFEM/suanPan-manual/blob/dev/plugins/scripts/ErrorMap.py

young_modulus = 2e2
yield_stress = 0.2
hardening_ratio = 0.01

with ErrorMap(
    f"material ArmstrongFrederick 1 {young_modulus} .2 0. {hardening_ratio * young_modulus} 0. 0. 40.82482305 500.",
    ref_strain=yield_stress / young_modulus,
    ref_stress=yield_stress,
    contour_samples=30,
) as error_map:
    error_map.contour("af.uniaxial", center=(-5, 0), size=3, type={"rel", "abs"})
    error_map.contour("af.biaxial", center=(-5, -5), size=3, type={"rel", "abs"})
```

![absolute error uniaxial](https://4006314410-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2F-MQ5rMqEBbzA9NgGETGX%2Fuploads%2Fgit-blob-b98707fa1b5f99b1f26cebf24ce2054851cb6b65%2Faf.uniaxial.abs.error.svg?alt=media) ![absolute error biaxial](https://4006314410-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2F-MQ5rMqEBbzA9NgGETGX%2Fuploads%2Fgit-blob-fad1a794adfd1543b84225b86a83110c3b804fa7%2Faf.biaxial.abs.error.svg?alt=media) ![relative error uniaxial](https://4006314410-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2F-MQ5rMqEBbzA9NgGETGX%2Fuploads%2Fgit-blob-19f0d1ee86682dd995edb22c237a542dbeda1a62%2Faf.uniaxial.rel.error.svg?alt=media) ![relative error biaxial](https://4006314410-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2F-MQ5rMqEBbzA9NgGETGX%2Fuploads%2Fgit-blob-21537e79e125c6c2a4aad3d92599fa5a26510015%2Faf.biaxial.rel.error.svg?alt=media)
