PDDO-MultiPhysics Examples Heat transfer and thermo-mechanics

Thermal stress in an aluminium bracket

An aluminium L-bracket imported from a STEP file and heated through its bolt hole. Boundary conditions act on the named CAD faces with their true normals.

bracket_thermoelastic.yaml 17,054 nodes bdf2, 14 min

1The Problem

The bracket's back face is bolted to a wall at room temperature and clamped. A bolt through the hole in its base heats up to 150 °C over 20 seconds; every other face loses heat by natural convection and is traction free. The question is the temperature field after a minute and the thermal stress it causes in the constrained part.

$$\rho c_p\,\frac{\partial T}{\partial t} = \nabla\cdot(k\,\nabla T), \qquad \nabla\cdot\boldsymbol{\sigma} = \mathbf{0}$$
$$\boldsymbol{\sigma} = \lambda\,\mathrm{tr}(\boldsymbol{\varepsilon})\,\mathbf{I} + 2G\,\boldsymbol{\varepsilon} - (3\lambda + 2G)\,\alpha\,(T - T_0)\,\mathbf{I}$$

2The Problem File

The domain is the STEP file itself. Each STEP face is a boundary patch; the problem file renames the ones it needs (face_9: hole, x-: back, and so on), and the conditions refer to these names. The last condition, on all, applies to every face not claimed by an earlier one. The physics is the same as for the thermoelastic block, in aluminium.

The complete problem file, examples/geometry/bracket_thermoelastic.yaml
# Thermo-mechanics on a CAD part (STEP): aluminium L-bracket heated through its bolt hole.
#   rho*cp*dt(T) = div(k grad T)        quasi-static thermoelasticity, small strain
# The back face is clamped; the bolt hole is heated (temperature ramp); all other faces lose
# heat by convection and are traction free. Boundary conditions act on the true CAD faces
# with their true normals (surface-conforming PDDO point cloud).
"k">name: bracket_thermoelastic
"k">domain:
  "k">type: geometry
  "k">geometry:
    "k">step: l_bracket.step
    "k">names: {x-: back, face_9: hole, face_7: base_top, face_8: upright_inner,
            "k">x+: base_end, y+: upright_top, y-: base_bottom, z-: side_front, z+: side_back}
  "k">spacing: 0.00125
"k">parameters:
  "k">E: 70.0e9
  "k">nu: 0.33
  "k">alpha: 23.0e-6
  "k">k: 160.0
  "k">rho_cp: 2.4e6
  "k">h_conv: 15.0
  "k">T0: 20.0
  "k">T_bolt: 150.0
  "k">t_ramp: 20.0
  "k">lambda: "E*nu/((1 + nu)*(1 - 2*nu))"
  "k">G: "E/(2*(1 + nu))"
"k">fields:
  "k">T: scalar
  "k">u: vector
"k">relations:
  "k">eps: "sym(grad(u))"
  "k">sigma: "lambda*tr(eps)*I + 2*G*eps - (3*lambda + 2*G)*alpha*(T - T0)*I"
  "k">q: "-k*grad(T)"
  "k">von_mises: "sqrt(3/2*ddot(dev(sigma), dev(sigma)))"
"k">equations:
  "k">T: "rho_cp*dt(T) = -div(q)"
  "k">u: "div(sigma) = 0"
"k">boundary_conditions:
  - "k">faces: [back]
    "k">T: {equation: "dot(q, n) = h_conv*(T - T0)"}
    "k">u: {dirichlet: [0, 0, 0]}
  - "k">faces: [hole]
    "k">T: {dirichlet: "T0 + (T_bolt - T0)*min(t/t_ramp, 1)"}
    "k">u: {equation: "dot(sigma, n) = [0, 0, 0]"}
  - "k">faces: all
    "k">T: {equation: "dot(q, n) = h_conv*(T - T0)"}
    "k">u: {equation: "dot(sigma, n) = [0, 0, 0]"}
"k">initial_conditions:
  "k">T: "T0"
"k">time:
  "k">end: 60.0
  "k">dt: 1.0
  "k">scheme: bdf2
"k">output:
  "k">every: 10
  "k">fields: [T, u, von_mises]
"k">monitors:
  "k">T_max: "max(T)"
  "k">T_mean: "mean(T)"
  "k">u_max: "max(sqrt(dot(u, u)))"
  "k">vm_max: "max(von_mises)"
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 STEP part with its boundary patches; patches are renamed in the table, and giving several the same name groups them into one boundary.
Figure 2. The imported STEP part with its boundary patches; patches are renamed in the table, and giving several the same name groups them into one boundary.
The bolt-hole condition. The selected face is highlighted, and faces can be picked with the mouse.
Figure 3. The bolt-hole condition. The selected face is highlighted, and faces can be picked with the mouse.
The same equations as on a box: the geometry changes nothing in the physics.
Figure 4. The same equations as on a box: the geometry changes nothing in the physics.

3Discretization

At a spacing of 1.25 mm the part is filled with 17,054 nodes: a regular grid inside, nodes on the faces and on the sharp edges, so every boundary condition acts on the exact CAD surface. Families near the surface are one-sided and grown until they are well conditioned.

The point cloud, coloured by node type: interior, surface, edge and concave-edge nodes.
Figure 5. The point cloud, coloured by node type: interior, surface, edge and concave-edge nodes.

4Results

Nodes
17,054 (point cloud)
PDDO order
2, horizon 2.015 Δx
Time scheme
bdf2
Steps
60 × Δt = 1
Newton iterations
61
Factorizations
3
Run time
14 min

After 60 seconds the hottest point is the bolt hole at 150 °C and the mean temperature of the bracket is 130 °C. The largest displacement is 191 µm. The thermal stress concentrates at the clamped back face, where the expansion of the hot base is held: 99 % of the part is below 405 MPa von Mises. The single largest value, 1494 MPa, is on the edges of the clamped face, a stress singularity of the clamped linear-elastic model; an assessment would use the stress a short distance away, or model the bolted joint.

Temperature on the part's surface at t = 60 s, interpolated from the surface nodes.
Figure 6. Temperature on the part's surface at t = 60 s, interpolated from the surface nodes.
Von Mises stress on the deformed part, seen from the clamped back face (colour range limited to the 95th percentile).
Figure 7. Von Mises stress on the deformed part, seen from the clamped back face (colour range limited to the 95th percentile).
Largest and mean temperature against time.
Figure 8. Largest and mean temperature against time.
Largest von Mises stress against time.
Figure 9. Largest von Mises stress against time.

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/bracket_thermoelastic.yaml
python -m pddo_mp run examples/geometry/bracket_thermoelastic.yaml

Results go to results/bracket_thermoelastic/ 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 time.end=30 for a run to half the end time. 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.