PDDO-MultiPhysics Examples Solid mechanics

Stress concentration at a hole

A steel plate with a hole, imported from STEP and pulled at one end. The point cloud is refined locally around the hole, where the stress concentrates.

plate_hole_tension.yaml 49,124 nodes backward-euler, 78 min

1The Problem

The plate is 100×100×20 mm with a 25 mm hole through its centre. One end is clamped and the other carries a uniform traction of 100 MPa. The stress peaks at the sides of the hole, and capturing that peak needs a fine discretization there, but not across the whole plate.

$$\nabla\cdot\boldsymbol{\sigma} = \mathbf{0}, \qquad \boldsymbol{\sigma} = \lambda\,\mathrm{tr}(\boldsymbol{\varepsilon})\,\mathbf{I} + 2G\,\boldsymbol{\varepsilon}$$
$$\mathbf{u} = \mathbf{0} \text{ on the clamped end}, \qquad \boldsymbol{\sigma}\mathbf{n} = (p, 0, 0) \text{ on the loaded end}, \qquad \boldsymbol{\sigma}\mathbf{n} = \mathbf{0} \text{ elsewhere}$$

2The Problem File

The base spacing is 2.5 mm. A refine entry asks for 0.625 mm nodes within 1 mm of the face named hole; the spacing grades smoothly between the two. The rest is linear elasticity with the stress component sxx = sigma[0, 0] and the von Mises stress as relations for output.

The complete problem file, examples/geometry/plate_hole_tension.yaml
# Stress concentration at a hole: steel plate 100 x 100 x 20 mm with a 25 mm hole, clamped on
# one end and pulled with 100 MPa on the other. Local refinement: 2.5 mm nodes in the plate,
# 0.625 mm nodes around the hole (graded in between) – a fraction of the nodes of a uniform
# 0.625 mm cloud. Compare the peak stress at the hole with `--set domain.refine=[]`.
"k">name: plate_hole_tension
"k">domain:
  "k">type: geometry
  "k">geometry:
    "k">step: plate_hole.step
    "k">names: {face_7: hole, x-: clamped, x+: loaded}
  "k">spacing: 0.0025
  "k">refine:
    - "k">faces: [hole]
      "k">spacing: 0.000625
      "k">distance: 0.001
"k">parameters:
  "k">E: 210.0e9
  "k">nu: 0.3
  "k">p: 100.0e6
  "k">lambda: "E*nu/((1 + nu)*(1 - 2*nu))"
  "k">G: "E/(2*(1 + nu))"
"k">fields:
  "k">u: vector
"k">relations:
  "k">eps: "sym(grad(u))"
  "k">sigma: "lambda*tr(eps)*I + 2*G*eps"
  "k">sxx: "sigma[0, 0]"
  "k">von_mises: "sqrt(3/2*ddot(dev(sigma), dev(sigma)))"
"k">equations:
  "k">u: "div(sigma) = 0"
"k">boundary_conditions:
  - "k">faces: [clamped]
    "k">u: {dirichlet: [0, 0, 0]}
  - "k">faces: [loaded]
    "k">u: {equation: "dot(sigma, n) = [p, 0, 0]"}
  - "k">faces: all
    "k">u: {equation: "dot(sigma, n) = [0, 0, 0]"}
"k">time:
  "k">end: 1.0
  "k">dt: 1.0
  "k">scheme: backward-euler
"k">output:
  "k">every: 1
  "k">fields: [u, sxx, von_mises]
"k">monitors:
  "k">sxx_max: "max(sxx)"
  "k">vm_max: "max(von_mises)"
  "k">u_max: "max(sqrt(dot(u, u)))"
The model in the GUI: the Model Builder tree on the left, the settings of the selected node in the middle, the graphics window on the right.
Figure 1. The model in the GUI: the Model Builder tree on the left, the settings of the selected node in the middle, the graphics window on the right.
The imported plate and its named faces.
Figure 2. The imported plate and its named faces.
The loaded end: a traction written as an equation in the stress and the outward normal.
Figure 3. The loaded end: a traction written as an equation in the stress and the outward normal.

3Discretization

The refined cloud has 49,124 nodes, a fraction of what a uniform 0.625 mm cloud would need. The refinement region is drawn in the node view.

It is still the heaviest example here: the 147,000-unknown system of the order-2 stencil has 86 million nonzeros, too many to factorize, so the solver uses ILU-preconditioned GMRES (838 iterations). Most of the run time goes to that single linear solve.

The point cloud, graded from 2.5 mm in the plate to 0.625 mm at the hole.
Figure 4. The point cloud, graded from 2.5 mm in the plate to 0.625 mm at the hole.

4Results

Nodes
49,124 (point cloud)
PDDO order
2, horizon 2.015 Δx
Time scheme
backward-euler
Steps
1 × Δt = 1
Newton iterations
1
Factorizations
0
Run time
78 min

The largest axial stress is 379 MPa, 3.79 times the applied traction, at the sides of the hole. The largest von Mises stress is 372 MPa and the largest displacement 121 µm. Running the same file with --set domain.refine=[] shows how much of the peak a uniform 2.5 mm cloud misses.

Axial stress σxx, viewed along z: the concentration at the sides of the hole.
Figure 5. Axial stress σxx, viewed along z: the concentration at the sides of the hole.
Von Mises stress on the deformed plate.
Figure 6. Von Mises stress on the deformed plate.
A probe line from the centre of the hole to the plate's edge: σxx peaks at the hole and decays across the ligament.
Figure 7. A probe line from the centre of the hole to the plate's edge: σxx peaks at the hole and decays across the ligament.

5Run It Yourself

The problem file ships with PDDO-MultiPhysics. Open it in the graphical interface and press Compute, or run it from the command line:

python -m pddo_mp gui examples/geometry/plate_hole_tension.yaml
python -m pddo_mp run examples/geometry/plate_hole_tension.yaml

Results go to results/plate_hole_tension/ next to the problem file: a ParaView time series (.pvd), the monitors as CSV, and the final state. Any entry can be changed on the command line, for example --set domain.spacing=0.005 for a coarser, faster run. The user manual describes every part of the problem file and of the interface.

Have a coupled problem of your own?

Send us the physics and the geometry — we will write the problem file with you, or build the model you need.