Material Definition Error Resolution — FEA
Material definition errors are among the most treacherous in FEA — they rarely crash the solver immediately, but instead silently corrupt results. This guide covers the six most common material-related errors, with diagnosis steps, concrete fixes, and the underlying theory you need to understand why each one matters.
My Abaqus job ran to completion — no errors — but the displacements are way larger than I expected for a steel part. Like, off by a factor of a thousand. Where do I even start?
A factor of 1000 off is a classic unit mismatch. My first guess: you entered Young's modulus in MPa but your model uses millimeters and Newtons — which expects MPa by default — but something went wrong. Or the reverse: you entered it in Pa into an SI-meters model. Either way, start at the material card, not the mesh.
Error 1: "Young's Modulus is Negative or Zero"
I got "Young's modulus must be positive" but I'm sure I typed a positive number. Steel is 210 GPa, I put 210 — is there a unit issue?
210 is correct in GPa — but what units is the rest of your model in? If you're using meters and Newtons (SI), you need 210×10⁹ Pa. If you're in the common Abaqus convention of millimeters, Newtons, and MPa, then 210,000 MPa is correct. "210" in an SI-meters model gives a modulus roughly 10⁶ times too small — the solver won't always error out, it'll just give enormous deformations.
Root causes:
- Unit mismatch: The most common cause. FEA solvers do not know your physical units — they operate on raw numbers. Entering 210 when 210,000 or 2.1×10¹¹ is expected causes silent scaling errors.
- Wrong sign: Copy-paste from a script that multiplied by −1 for some transformation.
- Accidental zero: Temperature-dependent table with a zero entry at a row the solver reaches during the analysis.
Consistent unit system — reference table:
| Unit System | Length | Force | Mass | Time | Stress / Modulus | Density |
|---|---|---|---|---|---|---|
| SI (standard) | m | N | kg | s | Pa (N/m²) | kg/m³ |
| mm-N-MPa | mm | N | tonne (Mg) | s | MPa (N/mm²) | tonne/mm³ |
| mm-kN-GPa | mm | kN | Mg | s | GPa | Mg/mm³ |
| CGS | cm | dyn | g | s | dyn/cm² | g/cm³ |
| in-lbf | in | lbf | slug | s | psi | slug/in³ |
Fix
- Decide on one unit system at project start and document it in your model notes.
- For steel in mm-N-MPa: E = 210,000 MPa, ρ = 7.85×10⁻⁹ tonne/mm³.
- Run a single-element test: apply a known load and verify displacement against the analytical result \( \delta = FL/AE \).
- If using Abaqus keywords, add a comment line like
** Units: mm, N, MPa, tonneat the top of your .inp file.
Error 2: "Poisson's Ratio Out of Range"
I'm modeling rubber and I typed ν = 0.5 since rubber is incompressible. But Abaqus gave me a singular stiffness matrix. Isn't 0.5 the right value for rubber?
Thermodynamically, ν = 0.5 exactly means the bulk modulus becomes infinite — \( K = E / 3(1-2\nu) \) blows up. The stiffness matrix becomes singular, which is why it fails. In practice you use ν = 0.499 or 0.4999 to approximate incompressibility — but you also must switch to hybrid (mixed) elements like C3D8H in Abaqus. Standard displacement elements with near-ν = 0.5 lock and give completely wrong results even without crashing.
Why does ν have a lower bound of −1 as well? I didn't know Poisson's ratio could even be negative.
Auxetic materials — like certain foams and lattice structures — actually expand laterally when you pull them. ν can legitimately be negative for those. The thermodynamic constraint is that the strain energy must be positive definite, which gives \( -1 < \nu < 0.5 \). Anything outside that range means the material would spontaneously release energy from a stressed state, which is physically impossible.
The constraint comes from requiring the elastic strain energy density \( W \) to be positive definite:
\[ W = \frac{E}{2(1+\nu)(1-2\nu)} \left[ (1-\nu)(\varepsilon_{xx}^2 + \varepsilon_{yy}^2 + \varepsilon_{zz}^2) + 2\nu(\varepsilon_{xx}\varepsilon_{yy} + \cdots) \right] + \frac{E}{2(1+\nu)}(\gamma_{xy}^2 + \cdots) \]
This requires both \( E > 0 \) and \( -1 < \nu < 0.5 \).
Near-incompressible (rubber) workflow:
- Use a hyperelastic material model (Neo-Hookean, Mooney-Rivlin) instead of linear elasticity where possible — it handles incompressibility natively.
- If you must use linear elasticity: set ν = 0.495–0.499 and use hybrid elements (Abaqus:
C3D8H,C3D10H; ANSYS: mixed-u-P formulation). - Never enter ν = 0.5 exactly in any standard solver.
Fix Summary
- ν = 0.5 → singular bulk modulus. Use ν = 0.499 + hybrid elements.
- ν outside (−1, 0.5) → thermodynamically unstable. Check input for typos (e.g., 5.0 instead of 0.5).
- Abaqus keyword:
*ELASTICfollowed by E, ν on the data line.
Error 3: "Density Is Not Defined / Zero Density in Dynamic Analysis"
I copied a static analysis model and tried to run a modal analysis. Now I'm getting "density must be specified." But it ran fine before as a static model — why does modal suddenly need density?
In a static analysis, \( [K]\{u\} = \{F\} \) — mass doesn't appear anywhere, so density is optional. The moment you go dynamic — modal, harmonic, transient — the equation of motion is \( [M]\{\ddot{u}\} + [C]\{\dot{u}\} + [K]\{u\} = \{F\} \). Without density, \( [M] \) is a zero matrix, and natural frequencies \( \omega = \sqrt{k/m} \) all go to infinity. That's why the solver rejects it.
What about gravity loads — do those need density too even in a static model?
Yes — if you apply a body force via gravity (Abaqus: *DLOAD, GRAV), the solver multiplies density by gravitational acceleration to get the body force. Without density, the gravity load is zero. Surprisingly common mistake when copying models from a benchmark that had no gravity.
Common Scenarios
- Modal analysis converted from static: Add
*DENSITYunder each*MATERIALblock. - Transient (implicit or explicit): Same requirement; explicit time integration is especially sensitive since \( \Delta t_{crit} \propto L/c \) where \( c = \sqrt{E/\rho} \).
- Seismic base excitation: Density errors directly scale the inertia forces — a missing factor of 10⁹ (tonne vs kg in mm units) is catastrophic.
For the mm-N-MPa system: steel density = 7.85×10⁻⁹ tonne/mm³. This number looks strange, but it is correct — if you enter 7850 (kg/m³) directly, your mass will be 10¹² times too large.
Abaqus keyword example
Error 4: Temperature-Dependent Material Data — Interpolation Out of Range
I defined yield strength as a function of temperature from 20°C to 600°C. But in the welding simulation, some elements hit 900°C during the heat cycle. The solver kept running — is that a problem?
Yes, that's a problem. Most solvers linearly extrapolate beyond the last data point. If your yield strength goes from 400 MPa at 20°C down to 50 MPa at 600°C, and the solver extrapolates to 900°C, it will predict −100 MPa yield strength — which is physically nonsense and will produce completely wrong plastic strains. Some solvers clamp at the last value, others extrapolate, and few give you a clear warning. You need to extend your data table to cover the full expected temperature range.
What if I can't find material data above 600°C? I can't just make up values.
A few options. First, if those high-temperature regions are not structurally critical (e.g., a weld pool that will re-solidify), you can add a small near-zero yield strength entry at the max temperature with an anneal flag to reset plastic strain. Second, consult elevated-temperature material databases — NIMS (Japan), ASME Sec. II, or vendor data sheets often go higher. Third, at least add a "floor" entry at your max expected temperature so the solver doesn't extrapolate into negative territory.
Best practices for temperature-dependent tables:
- Always extend the table at least 10–20% beyond the maximum expected temperature in the simulation.
- Add extra data points near sharp transitions (yield onset near room temperature, steep drop at elevated temperature).
- Use Abaqus
*TEMPERATUREoutput to monitor the actual temperature range reached during analysis, then compare to your table bounds. - In Abaqus, the behavior at out-of-range temperatures is controlled by the last data point (constant extrapolation for some quantities, linear for others) — check the Analysis User's Manual for each property type.
Error 5: "Plastic Strain Increment Too Large" in Elastoplastic Materials
I'm doing a forming simulation and I keep getting "equivalent plastic strain increment is too large." The job then cuts the time increment and tries again, but eventually gives up. What's happening mathematically?
Plasticity in FEA is solved by a "return mapping" algorithm. At each increment, the solver makes a trial elastic stress step, checks if the stress is outside the yield surface, and if so, "returns" it back to the yield surface by computing the correct plastic strain. If the time increment is too large, the trial stress lands so far outside the yield surface that the return mapping iteration can't converge — it's like trying to Newton-iterate from a starting point that's way off in the distance. The fix is to take smaller time increments so the stress stays close to the yield surface.
Is there a way to fix it without making every single increment tiny? Some parts of the simulation go fine.
Yes — adaptive time stepping is your friend here. In Abaqus, use *CONTROLS, ANALYSIS=DISCONTINUOUS for highly localized plasticity, or add viscoplastic regularization via *RATE DEPENDENT even with a very small viscosity parameter. Regularization smooths the stress return without changing the physics significantly. Also check your hardening curve — if it has a sharp kink or goes perfectly flat (ideal plasticity), the return mapping has to travel farther at each step.
The von Mises yield condition and associated flow rule give the plastic strain increment as:
\[ \Delta \varepsilon^p = \Delta \bar{\varepsilon}^p \cdot \frac{3}{2} \frac{\mathbf{s}}{\bar{\sigma}} \]
where \( \mathbf{s} \) is the deviatoric stress, \( \bar{\sigma} \) is the von Mises equivalent stress, and \( \Delta \bar{\varepsilon}^p \) is the equivalent plastic strain increment that must be solved iteratively. When this increment grows too large in a single step, local Newton iterations fail.
Fixes (in order of preference)
- Reduce the maximum allowable time increment:
*STEP, INC=1000with a smallerINCMAX. - Add viscoplastic regularization:
*RATE DEPENDENT, TYPE=POWER LAWwith a small reference strain rate. - Smooth the hardening curve — remove kinks, ensure it doesn't drop to zero slope suddenly.
- For explicit (LS-DYNA/Abaqus Explicit): check that the mass scaling factor is not inflating the time step beyond the stability limit for plastic regions.
Error 6: Hyperelastic Material Instability — NLGEOM and Material Incompatibility
I'm simulating a rubber bushing with a Mooney-Rivlin model. It works at small strains but above about 80% strain, the solution blows up with "hyperelastic material is unstable." I don't understand — the real rubber doesn't fail at 80% strain in testing.
This is a Mooney-Rivlin limitation. The 2-parameter Mooney-Rivlin model — \( W = C_{10}(I_1-3) + C_{01}(I_2-3) \) — fits well at moderate strains but its predicted stress can actually decrease with increasing strain at large deformations depending on the C₁₀/C₀₁ ratio. That violates the Drucker stability criterion (stress must increase monotonically with stretch), and Abaqus detects this and aborts. Real rubber stiffens significantly at large strains due to chain alignment — you need a model that captures this.
So should I switch to Neo-Hookean, or is there something better for large strain rubber?
Neo-Hookean is actually simpler and can have similar issues at extreme strains. For large-strain rubber (above 100% engineering strain), the Yeoh model or Ogden model are better choices — they fit the characteristic S-shaped stress-stretch curve of rubber accurately. The key is to fit your model parameters to test data that spans the full strain range you expect in the simulation — uniaxial, biaxial, and planar tension if possible. Abaqus lets you input test data directly with *HYPERELASTIC, TEST DATA and will fit the parameters for you.
Hyperelastic model comparison:
| Model | Strain Energy Function | Best for | Strain Range |
|---|---|---|---|
| Neo-Hookean | \( W = C_{10}(I_1 - 3) \) | Simple rubbers, small-moderate strain | < 50% |
| Mooney-Rivlin (2-param) | \( W = C_{10}(I_1-3)+C_{01}(I_2-3) \) | Moderate strains, well-characterized | < 100% |
| Yeoh | \( W = C_{10}(I_1-3)+C_{20}(I_1-3)^2+C_{30}(I_1-3)^3 \) | Large strain, captures stiffening | Up to 200% |
| Ogden | \( W = \sum_{p} \frac{\mu_p}{\alpha_p}(\lambda_1^{\alpha_p}+\lambda_2^{\alpha_p}+\lambda_3^{\alpha_p}-3) \) | Full range, S-curve, most accurate | Up to 700% |
Using Abaqus Test Data Fitting
Use *HYPERELASTIC, TEST DATA, EVALUATE to have Abaqus plot the Drucker stability check across all deformation modes before committing to a model.
Quick Reference — Material Error Checklist
| Error | Most Likely Cause | First Check | Fix |
|---|---|---|---|
| Negative / zero E | Unit mismatch (Pa vs MPa) | Run single-element test | Consistent unit table |
| Poisson's ratio ≥ 0.5 | Typed 0.5 exactly; rubber | Check material card | ν = 0.499 + hybrid elements |
| Density missing | Converted from static model | Check *DENSITY keyword | Add density, verify units |
| Temp data out of range | Table doesn't cover sim range | Check max temp in field output | Extend table; add floor value |
| Plastic increment too large | Time increment too coarse | Check increment size at failure | Reduce incr.; viscoplastic regularization |
| Hyperelastic instability | Model wrong for large strain | Plot W vs stretch | Switch to Yeoh/Ogden; use test data fit |