Simulation Case study
Suspension upright: one design, every load case
A part optimized for a single load case looks efficient, then turns out weak when the load changes direction. Here is the same solver, the same mass, two answers.
2D plane-stress simulation of a synthetic part. Not a physical test. 3D solves are in development. Density maps are the solver's own output fields, rendered without retouching.
Problem
A suspension upright sees a 3g bump, hard braking and cornering. A part optimized only for the bump looks efficient but is weak in the other cases.
Setup
- 260 × 260 mm design space, 40 mm thick, 4140 steel
- hub bore and upper/lower arm mounts as hard points
- 35% material fraction, 120 × 120 plane-stress elements
- three load cases: bump 3g, braking, cornering
- SIMP with optimality-criteria updates, density filter, p-norm min-max over the load cases
- about one minute per solve
Result, same mass (8.69 kg)
8.69 kg is 59% lighter than a solid block of the same envelope (21.2 kg).
| Load case | Peak von Mises, baseline (MPa) | Peak von Mises, all cases (MPa) | Compliance, baseline | Compliance, all cases |
|---|---|---|---|---|
| bump 3g | 32.6 | 50.9 | 530 | 779 |
| braking | 27.4 | 29.2 | 244 | 274 |
| cornering | 58.9 | 31.5 | 1454 | 1032 |
The baseline wins on the bump case it was built for and loses badly on cornering. The all-cases part gives up a little bump stiffness to cut the worst case. Lower compliance is stiffer.
The spec that drove it
This is the contract format: you own it, the solver works only inside it. Coordinates are fractions of the envelope. The load values are synthetic.
{
"name": "Demo upright, front-left (synthetic)",
"note": "Design-domain spec: the CLIENT supplies this. Engine optimizes inside it. Coords are fractions (0..1) of the bounding envelope; a real frame maps hard-point mm -> fractions.",
"units": "mm_N_MPa",
"domain": { "width": 260, "height": 260, "thickness": 40, "nelx": 120, "nely": 120 },
"material": { "name": "4140 steel", "E": 205000, "nu": 0.29, "rho_kg_mm3": 7.85e-6, "sigma_endurance": 250 },
"optimization": { "volfrac": 0.35, "penal": 3.0, "rmin": 3.5, "maxiter": 60, "p_norm": 8.0 },
"hard_points": [
{ "id": "hub", "type": "bore", "cx": 0.60, "cy": 0.50, "r_inner": 0.17, "r_outer": 0.235, "role": "load_surface" },
{ "id": "uca", "type": "pad", "box": [0.10, 0.30, 0.84, 0.98], "role": "anchor" },
{ "id": "lca", "type": "pad", "box": [0.10, 0.30, 0.02, 0.16], "role": "anchor" }
],
"keep_out": [],
"load_cases": [
{ "label": "bump 3g", "at": "hub", "Fx": 0, "Fy": 45000, "M": 0 },
{ "label": "braking", "at": "hub", "Fx": -25000, "Fy": 20000, "M": 0 },
{ "label": "cornering", "at": "hub", "Fx": 0, "Fy": 15000, "M": 7.0e6 }
]
}
Send us a spec.
Envelope, mounting points, keep-outs, material and the loads it has to survive. A sketch and a few numbers are enough to start. We reply with what we can solve, what we need, and a first scope.
Send a specEvery job is scoped to the part.