# Linear elasticity

`LINEAR_ELASTICITY` solves the small displacements, stresses and strains of a linear elastic solid, in 3D under a solid frame and on a planar section, in plane stress or plane strain, under a [Cartesian 2D](<https://docs.femforge.io/user-guide/frames/cartesian-2d/index.md>) frame. See [Conditions and physics](<https://docs.femforge.io/user-guide/conditions/index.md>) for how conditions attach and where they land.

| Frame | Solves as | Solver stack |
| --- | --- | --- |
| [Solid](<https://docs.femforge.io/user-guide/frames/solid/index.md>) | `LINEAR_ELASTICITY` | StressSolver, ResultOutputSolver |
| [Axisymmetric](<https://docs.femforge.io/user-guide/frames/axisymmetric/index.md>) | no form |  |
| [Cartesian2D](<https://docs.femforge.io/user-guide/frames/cartesian-2d/index.md>) | `LINEAR_ELASTICITY` | StressSolver, ResultOutputSolver |

`LINEAR_ELASTICITY` reads `Youngs Modulus` and `Poisson Ratio` from every body, so leave air bodies out of an elasticity model. The run writes the displacement, the stress and strain components, the von Mises stress and the principal stresses; `Run.strain_energy()` integrates the strain energy femforge derives from the stress and strain. See [Results](<https://docs.femforge.io/user-guide/results/index.md>).

## Clamp one end and load the other

Tag the two end faces of a beam as [named faces](<https://docs.femforge.io/user-guide/conditions/#named-faces>), clamp one and load the other:

```python
import build123d as b3d

import femforge as ff

box = b3d.Box(100, 10, 10)
beam = ff.TaggedPart([box], tags={ff.TagKey.MATERIAL: "Steel316"}, name="Beam")
x_faces = box.faces().filter_by(b3d.Axis.X).sort_by(b3d.Axis.X)
model = ff.TaggedCompound(children=[beam, ff.TaggedFace(x_faces[0], name="Root"), ff.TaggedFace(x_faces[-1], name="Tip")])

clamp = ff.EntityTag(selector={ff.TagKey.NAME: "Root"}, conditions=[ff.FixedDisplacement()])
load = ff.EntityTag(selector={ff.TagKey.NAME: "Tip"}, conditions=[ff.SurfaceForce(force=ff.quantity(ff.Vec3(0, 0, -100), "N"))])

domain = ff.DomainConfig(materials=[ff.materials.Steel_316()], tags=[clamp, load])
physics = ff.PhysicsSelection(selected=ff.Physics.LINEAR_ELASTICITY)
```

## Boundary conditions

| Condition | Target | Sets | Frames |
| --- | --- | --- | --- |
| [`FixedDisplacement`](<https://docs.femforge.io/user-guide/conditions/linear-elasticity/#fixeddisplacement>) | boundary | `x` \[m\], `y` \[m\], `z` \[m\] | [Solid](<https://docs.femforge.io/user-guide/frames/solid/index.md>), [Cartesian2D](<https://docs.femforge.io/user-guide/frames/cartesian-2d/index.md>) |
| [`SurfaceForce`](<https://docs.femforge.io/user-guide/conditions/linear-elasticity/#surfaceforce>) | boundary | `force` \[N\] | [Solid](<https://docs.femforge.io/user-guide/frames/solid/index.md>), [Cartesian2D](<https://docs.femforge.io/user-guide/frames/cartesian-2d/index.md>) |

### FixedDisplacement

**Physics** `LINEAR_ELASTICITY` · **Target** boundary · **Section** Boundary Condition · **Kind** `fixed_displacement` · **API** FixedDisplacement

A prescribed displacement on a boundary, clamped to zero in every direction by default.

| Field | Symbol | Unit | Meaning | Sif keyword | Default |
| --- | --- | --- | --- | --- | --- |
| `x` | `u_x` | m | Prescribed x displacement; None leaves x free. | `Displacement 1` | `0.0 m` |
| `y` | `u_y` | m | Prescribed y displacement; None leaves y free. | `Displacement 2` | `0.0 m` |
| `z` | `u_z` | m | Prescribed z displacement; None leaves z free. | `Displacement 3` | `0.0 m` |

Writes: The `Displacement i` keywords of the components the frame of `site` solves; a zero component along a 2D normal is dropped.

Set a component to None to leave it free, as in `FixedDisplacement(z=None)` for a roller. A frame rejects a nonzero component along a direction it has no solve coordinate for, and a Cartesian 2D frame drops a zero one along its normal.

### SurfaceForce

**Physics** `LINEAR_ELASTICITY` · **Target** boundary · **Section** Boundary Condition · **Kind** `surface_force` · **API** SurfaceForce

A total force spread uniformly over a named face as a traction.

| Field | Symbol | Unit | Meaning | Sif keyword | Default |
| --- | --- | --- | --- | --- | --- |
| `force` | `F⃗` | N | Total force spread uniformly over the face, in the authored frame. |  | required |

Writes: The `Force i` traction components, the solve-frame force share over the measured area of `site`.

The traction is the force over the face's measured area, so `SurfaceForce` needs a named face; on a body's tag it raises.
