Mesh Error Resolution — FEA & CFD
Mesh quality problems silently corrupt your results or crash your solver before you even finish preprocessing. This guide covers every major mesh error type across FEA and CFD: what each metric means, how to detect bad elements, and exactly how to fix them — from negative Jacobians to OpenFOAM non-orthogonality to LS-DYNA hourglassing.
Element Quality Metrics — Reference Table
Before diving into specific errors, here's a reference for the key quality metrics used by the major solvers. Understanding what each metric measures helps you interpret warnings correctly.
| Metric | Definition | Good | Warning | Critical |
|---|---|---|---|---|
| Aspect Ratio | Ratio of longest to shortest edge (or equivalent for quads/hexes) | < 5 | 5 – 20 | > 20 |
| Jacobian Ratio (FEA) | Max/min Jacobian determinant at integration points — measures element distortion from ideal shape | < 3 | 3 – 10 | > 30 |
| Warpage Angle | For quad elements: deviation of nodes from coplanarity (0° = perfect quad, 90° = complete fold) | < 5° | 5° – 15° | > 30° |
| Skewness (CFD) | Deviation of cell from optimal shape: 0 = perfect, 1 = completely degenerate | < 0.5 | 0.5 – 0.85 | > 0.85 |
| Non-Orthogonality (CFD) | Angle between the cell-center vector and the face normal. Affects discretization accuracy of gradient terms. | < 40° | 40° – 70° | > 70° |
| Parallel Deviation | For hex elements: deviation of opposite face normals from parallelism. Large values indicate twisted cells. | < 10° | 10° – 45° | > 60° |
Part 1 — Negative Jacobian Elements
What This Means
The Jacobian matrix \(\mathbf{J}\) maps the element's parent (isoparametric) coordinate system to the physical coordinate system. Its determinant \(\det(\mathbf{J})\) represents the local volume ratio. When \(\det(\mathbf{J}) < 0\), the element is inverted — physically inside-out. The solver cannot compute meaningful stiffness or mass matrices for inverted elements.
How to Detect
Fix — Step by Step
I have 12 negative Jacobian elements in my ANSYS model, all in a hexahedral mesh around a fillet radius. The fillet is quite tight — about 2mm radius, and my element size is 1.5mm. Could the element size be too large relative to the curvature?
Exactly right — that's the cause. With quadratic hex elements (SOLID186 in ANSYS), the midside nodes are automatically projected onto the curved fillet surface during meshing. When the element is 1.5mm and the fillet radius is 2mm, the midside node projection can place it so far from the element edge midpoint that it creates a negative Jacobian at the element corner integration points.
The practical rule of thumb: for hexahedral elements on curved surfaces, you want at least 3–4 elements spanning the curvature arc to avoid this problem. For your 2mm radius fillet, try reducing element size to 0.5–0.6mm in that region using a local mesh sizing control.
Alternatively, switch to tetrahedral meshing for this part. Tet10 elements (quadratic tetrahedra) handle tight curvature much better than hex20 because the meshing algorithm is less constrained in how it can place elements around curved geometry. For stress analysis around fillets, Tet10 with a fine enough mesh is perfectly accurate and much easier to generate cleanly.
Part 2 — Free Edge / Free Surface Detection
What This Means
In a solid or shell mesh, every interior edge (or face for 3D) should be shared by exactly two elements. A free edge is an edge belonging to only one element at what should be an interior location — indicating an unintended gap or crack in the mesh. Free edges at the intended external boundary are normal; free edges inside the model indicate a connectivity problem.
How to Detect
Root Causes
- Import from CAD with small gap tolerances — adjacent surfaces meshed independently with non-matching nodes at the shared edge
- Boolean operation in CAD failed, leaving a sliver face that wasn't recognized as shared
- Multiple mesh regions merged by proximity tolerance but with some nodes slightly outside tolerance
- Manually deleted elements leaving dangling nodes and edges
Fix — Step by Step
My Abaqus analysis converges and gives results, but the stress in one region seems way too high — like 10x higher than expected. Could free edges be the cause even if the solver doesn't crash?
This is one of the most dangerous types of mesh errors precisely because it doesn't crash the solver — it just gives you wrong results that might look plausible if you don't know what to expect. Yes, a free edge in the interior of a structural model is essentially a crack. Abaqus has no way to transfer stress across a free edge — the two elements on either side are mechanically disconnected even though they look connected visually.
What you'll see: the elements on one side of the free edge experience the full applied load with no structural support from the other side. This creates enormous artificial stress concentrations at the free edge tip — sometimes 10× or 100× higher than the true stress. The elements on the other side are essentially floating and will show very low or zero stress.
This is why you should always run the free edge check before submitting any analysis — not just when you see suspicious results. A systematic mesh quality check takes 30 seconds and can save days of re-analysis. The Abaqus warning "N free surfaces detected" in the preprocessing output is easy to overlook but critical to address.
Part 3 — OpenFOAM checkMesh Failures
What This Means
Non-orthogonality is the angle \(\phi\) between the vector connecting two adjacent cell centers (\(\mathbf{d}\)) and the face normal (\(\hat{\mathbf{n}}\)): $$\phi = \arccos\left(\frac{\mathbf{d} \cdot \hat{\mathbf{n}}}{|\mathbf{d}|}\right)$$ When \(\phi\) is large, the explicit surface gradient correction (non-orthogonal correction) used in the Gauss divergence theorem discretization becomes large relative to the implicit term. At \(\phi > 70°\), the correction is larger than the implicit term — the discretization becomes unstable without corrector iterations. At \(\phi > 85°\), no amount of correctors can stabilize it.
Typical checkMesh Output to Interpret
Mesh non-orthogonality Max: 83.2 average: 12.5 **** WARNING: 234 highly non-orthogonal faces (out of 1234567) Maximum skewness = 0.92 OK. Minimum cell volumes = 2.1e-12 OK. **FAILED 1 mesh checks**
How to Detect Problem Cells
checkMesh -allGeometry -allTopology
Visualize in ParaView: cellFields → nonOrth / skewness
Fix — Step by Step
writeCellCentres utility or the checkMesh -writeAllFields option to write non-orthogonality as a field. Visualize in ParaView to locate the regions above 70°.addLayersControls section of snappyHexMeshDict. Reduce expansionRatio from 1.3 to 1.1–1.15. High expansion ratios create highly compressed cells at the wall that become non-orthogonal. Also reduce nSurfaceLayers if needed.nNonOrthogonalCorrectors to 3–5 in fvSolution. This applies multiple pressure-correction sweeps per outer iteration, partially compensating for non-orthogonality. Required when max non-orthogonality is in the 70–85° range.My snappyHexMesh ran successfully and checkMesh shows max non-orthogonality of 65°, average 8°. That's below 70°, so it passed. But my simpleFoam solution still diverges on pressure. Could 65° still be a problem?
65° is technically "acceptable" by checkMesh standards, but it's still quite high for practical solver stability — especially with turbulence models. The 70° threshold is not a sharp cliff; it's a rough guideline. At 65°, you should use at least 2 non-orthogonal correctors, and 3 is safer.
But the fact that the average is only 8° tells you something important: the 65° cells are isolated problem spots — probably a few cells at a re-entrant corner or a sharp geometric feature. These isolated bad cells can trigger localized pressure divergence that propagates throughout the domain.
Find those cells and look at the geometry. Are they at a sharp edge in your STL geometry? If so, you can often fix them by applying surface feature edge refinement in snappyHexMesh: add the feature edge to the features list in snappyHexMeshDict with a refinement level of 2–3. This puts finer hex cells around the sharp feature, which resolves the non-orthogonality. Also check: does your STL have any self-intersections or near-degenerate triangles? These cause snappyHexMesh to generate confused cell layers that produce non-orthogonal faces.
Part 4 — LS-DYNA Hourglassing in Under-Integrated Elements
What This Means
Single-point (reduced) integration elements — the default in LS-DYNA for efficiency — use only one integration point at the element center to compute stiffness. This prevents the stiffness from resisting certain zero-energy deformation modes called hourglass modes — deformation patterns that produce no work at the integration point and therefore experience no restoring force. Left unchecked, these modes grow without bound and corrupt the solution.
The hourglass energy ratio is:
How to Detect
Root Causes
- Uniform pressure loading (bending loads in a single-layer hex mesh are particularly bad)
- Mesh too coarse to resolve bending — using one element through thickness in a bending-dominated region
- Soft materials (foam, rubber) with low stiffness — hourglass damping is too small relative to material response
- Default hourglass control coefficient too small (default IHQ=1, QH=0.1 is often insufficient)
Fix — Step by Step
*DATABASE_MATSUM. Identify which part(s) are contributing most to hourglass energy — don't just look at the global total.*SECTION_SOLID (for solids) or *SECTION_SHELL (for shells):
- Type 4 (Flanagan-Belytschko, stiffness form): good for metal forming
- Type 5 (Flanagan-Belytschko, viscous form): better for high-velocity impact
- Type 6 (Belytschko-Bindeman, fully integrated assumed strain): best quality, more expensive
ELFORM=2(fully integrated hex): eliminates hourglass completely, 8× more expensive per element
ELFORM=2) on the problematic part only. Compare results — if they match the reduced-integration solution, hourglass was controlled adequately. If they differ significantly, your original results are invalid and you need mesh refinement or a better hourglass control.I switched to fully integrated elements (ELFORM=2) to eliminate hourglass but now my simulation runs 10x slower. Is there a middle ground that gives good accuracy without the full cost penalty?
Yes — this is exactly the trade-off that LS-DYNA engineers deal with all the time. The recommended middle ground is ELFORM=−1 or ELFORM=−2 in recent LS-DYNA versions, which use the Assumed Strain formulation. These are single-point elements with enhanced strain modes that provide much better bending accuracy than standard Type 1 without the 8× cost of full integration. Typical cost is 1.5–2× a standard ELFORM=1 element.
Another practical approach: use fully integrated elements (ELFORM=2) only in the regions you care about most — the plastic deformation zones, the areas of high stress, the crush initiators — and use reduced integration elsewhere. In LS-DYNA this is done by assigning different *SECTION_SOLID cards to different parts. This targeted approach gives you accuracy where it matters without paying the full cost penalty everywhere.
For shell elements specifically, ELFORM=16 (fully integrated quadratic shell) gives excellent accuracy for bending and springback in stamping at only about 1.3× the cost of the standard Type 2 shell. Most automotive OEM crash simulations now use this for structural panels.
Part 5 — Abaqus: Elements Have Missing Property Definitions
What This Means
One or more elements in the model have no section (property) assignment. In Abaqus, every element must belong to an element set that has a section assignment defining the element type, material, and geometry (thickness for shells, cross-section for beams, etc.). Without this, Abaqus cannot assemble the stiffness matrix for those elements.
Root Causes
- Elements created by mesh refinement, partition, or import that fall outside any existing element set
- Section assignment made to a named element set that was later deleted or renamed
- Parts imported from external mesh files (Nastran, IGES mesh) without automatic section creation
- Assembly operations that created new element regions not covered by existing section assignments
- Orphan mesh parts that were never assigned to the assembly geometry
How to Detect
Fix — Step by Step
grep -c "SOLID SECTION\|SHELL SECTION\|BEAM SECTION" job.inp counts section definitions; grep -c "^\*ELEMENT" job.inp counts element blocks. Every element block should be captured by a section definition. If counts don't match, find the gap manually.I assigned sections to all my parts in Abaqus/CAE but I still get "Elements have missing property definitions" when I submit the job. How can elements be missing sections if I assigned them in CAE?
This happens most often with orphan mesh parts and virtual topology. If you imported a mesh from an external file (Nastran, IGES, or a previous Abaqus result) into the Assembly as an Orphan Mesh Part, section assignments work differently — you must assign sections directly to element sets in the Mesh module using Mesh → Create Mesh Part and then assign sections in the Property module, not through the Part Manager.
Another common cause: you made mesh changes after assigning sections. If you re-meshed a part or added mesh refinement after completing the property assignment step, the new elements are not included in the element sets that were used for the section assignment. The section was valid when you made it, but the mesh changed out from under it.
The quickest diagnostic: write the input file from CAE (Job → Write Input), then open it in a text editor and search for all *ELEMENT blocks. Each block should have an ELSET= parameter. Then search for *SOLID SECTION / *SHELL SECTION and check that every ELSET referenced in the element blocks appears in a section definition. Any ELSET that appears in *ELEMENT but not in a section definition is your problem.
Found it — I had an element set called "ELEM_SOLID" in the element definition but the section was assigned to "Elem_Solid" (different capitalization). Is Abaqus case-sensitive for element set names?
Yes — Abaqus is case-insensitive for keywords (like *SOLID SECTION), but case-sensitive for set names and part instance names in the .inp file. "ELEM_SOLID" and "Elem_Solid" are treated as two different element sets. This is a classic trap, especially when mixing CAE-generated input with manually edited .inp files, or when importing meshes that were generated with different naming conventions.
The fix is easy now that you've found it — just make the names match exactly, uppercase throughout is the safest convention since Abaqus internally converts CAE-generated names to uppercase. Going forward, when editing .inp files by hand, always use all-uppercase for set names to avoid this kind of mismatch.
Part 6 — Warpage and Parallel Deviation in Shell Meshes
My shell mesh for a curved sheet metal part has lots of high warpage angle warnings — some elements showing 25–30°. The preprocessor says this is acceptable, but my colleague says it will hurt accuracy. Who's right?
Your colleague is right for anything above about 15° warpage. Here's why: a warped quad element is a non-planar quadrilateral. When the mesh quality tool "accepts" 25–30°, it means the solver won't crash — but the accuracy of the bending stiffness matrix is compromised because the flat-plate assumption built into most shell element formulations (like S4R or SHELL181) requires the element to be planar or nearly so.
For in-plane membrane behavior, warpage has little effect. But for bending — which is the primary behavior of sheet metal parts under load — a 25° warped quad can have bending stiffness errors of 15–25%. For a fatigue or springback analysis, that's significant.
The fix: on curved surfaces, use more elements to reduce the faceting error. A good target is that adjacent element normals differ by less than 10°. For a surface with radius R, the element size L should satisfy L/R < 0.17 (approximately). If your part has a 50mm radius and your elements are 10mm, the faceting angle per element is about 11° — right at the edge of acceptable. Going to 6mm elements will bring you well under 10°.
For unavoidable warped regions (compound curvature, double-curved surfaces), consider using triangular elements (S3R in Abaqus) in those zones — triangular shell elements are inherently planar by definition (three points define a plane) and have zero warpage.