Files
Atomizer/atomizer-field/UNIT_INVESTIGATION_SUMMARY.md
Antoine d5ffba099e feat: Merge Atomizer-Field neural network module into main repository
Permanently integrates the Atomizer-Field GNN surrogate system:
- neural_models/: Graph Neural Network for FEA field prediction
- batch_parser.py: Parse training data from FEA exports
- train.py: Neural network training pipeline
- predict.py: Inference engine for fast predictions

This enables 600x-2200x speedup over traditional FEA by replacing
expensive simulations with millisecond neural network predictions.

🤖 Generated with [Claude Code](https://claude.com/claude-code)

Co-Authored-By: Claude <noreply@anthropic.com>
2025-11-26 15:31:33 -05:00

4.2 KiB
Raw Blame History

Unit Investigation Summary

Your Question

"Force and stresses seems to be 1000 too much, how do you check units and validate values?"

Answer

You were absolutely correct! The stresses ARE 1000× too large, but the forces are actually correct (just mislabeled).


Root Cause Found

Your BDF file contains: PARAM UNITSYS MN-MM

This tells Nastran to use the MegaNewton-Millimeter unit system:

  • Length: mm ✓
  • Force: MN (MegaNewton) = 1,000,000 N
  • Stress: Pa (Pascal), NOT MPa!
  • Mass: tonne (1000 kg)

What This Means

pyNastran correctly reads the OP2 file in these units, but my parser incorrectly assumed:

  • Force in N (actually MN)
  • Stress in MPa (actually Pa)

Actual Values

Stress (The 1000× Error You Found)

What Report Shows Actual Unit Correct Value
117,000 MPa 117,000 Pa 117 MPa
46,000 MPa (mean) 46,000 Pa 46 MPa

Your stresses are 1000× too high because Pa should be divided by 1000 to get kPa, or by 1,000,000 to get MPa.

Forces (Correctly Stored, Mislabeled)

What Report Shows Actual Unit Interpretation
2.73 MN MN ✓ 2,730,000 N
150 MN MN ✓ 150,000,000 N

Forces are actually correct! They're in MegaNewtons, which is perfectly fine for a large beam structure.


How I Validated This

1. Checked the BDF File

Found PARAM UNITSYS MN-MM which defines the unit system.

2. Checked Material Properties

Young's modulus E = 200,000,000

  • If this were MPa → E = 200 GPa ✓ (correct for steel)
  • This confirms stress is in Pa (base SI unit)

3. Direct OP2 Reading

Created check_op2_units.py to directly read the OP2 file with pyNastran:

  • Confirmed pyNastran doesn't specify units
  • Confirmed stress values: min=1.87e+03, max=1.17e+05
  • These are clearly in Pa, not MPa!

4. Sanity Check

A 117 GPa von Mises stress would instantly destroy any material (even diamond is ~130 GPa). 117 MPa is reasonable for a loaded steel beam ✓


The Fix

What Needs to Change

In neural_field_parser.py:

  1. Detect UNITSYS parameter from BDF
  2. Convert stress: Pa → MPa (divide by 1e6)
  3. Update force labels: MN → N (or keep as MN with correct label)
  4. Add validation checks to catch unrealistic values

Conversion Factors

# If UNITSYS is MN-MM:
stress_MPa = stress_Pa / 1e6
force_N = force_MN * 1e6
mass_kg = mass_tonne * 1000

Expected Values After Fix

Property Current (Wrong) After Fix Reasonable?
Max von Mises 117,000 MPa 117 MPa ✓ Yes (steel ~250 MPa yield)
Mean von Mises 46,000 MPa 46 MPa ✓ Yes
Max displacement 19.5 mm 19.5 mm ✓ Yes
Applied forces 2.73 MN 2.73 MN ✓ Yes (large beam)
Young's modulus 200 GPa 200 GPa ✓ Yes (steel)

Files Created for Investigation

  1. check_units.py - Analyzes parsed data for unit consistency
  2. check_op2_units.py - Directly reads OP2/BDF to verify units
  3. UNIT_CONVERSION_REPORT.md - Complete analysis and fix plan

Next Steps

Option 1: I Fix It Now

I can update the parser to:

  1. Detect UNITSYS parameter
  2. Convert Pa → MPa for stress
  3. Add unit validation
  4. Re-run test and regenerate report

Time: 15-20 minutes Risk: Low (just scaling factors)

Option 2: You Review First

You can review the UNIT_CONVERSION_REPORT.md for the detailed fix plan, then I implement.

Advantage: You understand the changes before they're made


Bottom Line

Your intuition was spot-on! The stresses displayed are 1000× too high.

Root cause: Nastran uses Pa (not MPa) in the MN-MM unit system, and my parser mislabeled them.

Fix: Simple scaling factors (divide by 1e6) and correct labels.

After fix: All values will be realistic and match engineering expectations! ✓


What would you like me to do next?

  1. Implement the unit conversion fix?
  2. Answer any questions about the analysis?
  3. Something else?