148 lines
4.2 KiB
Markdown
148 lines
4.2 KiB
Markdown
|
|
# 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](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](neural_field_parser.py:602-648):**
|
|||
|
|
|
|||
|
|
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
|
|||
|
|
```python
|
|||
|
|
# 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](check_units.py)** - Analyzes parsed data for unit consistency
|
|||
|
|
2. **[check_op2_units.py](check_op2_units.py)** - Directly reads OP2/BDF to verify units
|
|||
|
|
3. **[UNIT_CONVERSION_REPORT.md](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](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?
|