FEA Mesh Quality: When Your Simulation Lies to You

I’ve seen FEA models that show a stress concentration at a bolt hole. The engineer read the peak stress as 450 MPa and flagged the part for failure. But the peak was at the center of a single element, 5 mm from the actual hole edge. The mesh was too coarse. The real stress was 180 MPa. The part was fine. This is how I check whether an FEA result is trustworthy before I act on it.

The peak stress is always at the worst node

FEA solvers report the stress at every node. The peak is the highest number. That number is always at the sharpest corner or the smallest element — the place where the mesh is least accurate. If you trust the peak without checking the mesh, you’ll over-design every part. The question isn’t “what’s the peak?” It’s “does this peak survive a mesh refinement?”

The three checks I run

1. Mesh convergence study. I run the model with a coarse mesh (5 mm elements), then a fine mesh (2 mm), then a very fine mesh (1 mm). If the peak stress drops by 30% from coarse to fine, the coarse result was wrong. If the stress converges (changes less than 5%) between fine and very fine, the result is trustworthy. I don’t trust a result that hasn’t been convergence-tested.

2. Stress gradient plot. I look at the contour plot, not the number. If the stress jumps from 100 MPa to 450 MPa across one element, that’s a numerical artifact. If the stress ramps smoothly from 100 to 200 across several elements, that’s real. Real stress gradients are smooth. Sharp peaks in single elements are mesh errors.

3. Element quality metrics. The FEA software reports element quality: aspect ratio, skewness, jacobian. If elements near the stress concentration have aspect ratios over 5:1 or skewness over 0.8, the result is unreliable. I remesh those regions. A 5 mm element at a hole edge gives a 5 mm hole — that’s not modeling the hole, it’s modeling a big blunt feature.

The singularity problem

A sharp re-entrant corner (inside a notch, at a bolt hole edge) creates a mathematical singularity. The stress goes to infinity as the mesh gets finer. No mesh converges — the stress keeps rising. This isn’t physical. Real parts have a radius at every corner (even 0.1 mm). If your CAD model has a sharp corner, the FEA will show infinite stress. You need to add the actual fillet radius to the model. Without it, the singularity is just telling you the corner is sharp — not that the part will break.

What I do in practice

I run the model with a reasonable mesh (2-3 mm at critical regions). I look at the stress distribution, not the peak. If the stress in the bulk of the part is under 150 MPa (steel, yield 250), and the peak is at a corner, I check the corner radius. If there’s a real fillet, I mesh it fine. If the stress converges to 200 MPa, that’s the number I use. If it’s a sharp corner, I add a 0.5 mm radius (which the shop will produce anyway) and re-run.

I never use a single peak number from a coarse mesh to reject a design. The peak is a starting point for refinement, not a design specification.

The boundary conditions matter more than the mesh

A perfect mesh on a wrong model is worthless. If I’ve fixed a face that should be pinned at a point, or applied a load as a pressure instead of a distributed force, the stress will be wrong regardless of mesh quality. I check the boundary conditions first: are the supports realistic? Is the load applied where it actually goes? A cantilever model with the load at the tip and fixed at the root will always show a root moment — but if the real part is bolted to a flexible frame, the root isn’t fixed. The FEA assumes rigid supports; the real world doesn’t.

The number I trust: the stress that converges under mesh refinement, in a region with realistic geometry (real fillets, not sharp corners), under realistic boundary conditions. The peak stress in a coarse mesh at a sharp corner is a numerical artifact, not a design value. If you can’t afford to mesh-fine everywhere, at least refine the regions where the stress is highest and watch the trend. FEA is a tool, not an oracle.