Files
Atomizer/studies/simple_beam_optimization/substudies/benchmarking/BENCHMARK_REPORT.md
Anto01 8b14f6e800 feat: Add robust NX expression import system for all expression types
Major Enhancement:
- Implemented .exp file-based expression updates via NX journal scripts
- Fixes critical issue with feature-linked expressions (e.g., hole_count)
- Supports ALL NX expression types including binary-stored ones
- Full 4D design space validation completed successfully

New Components:
1. import_expressions.py - NX journal for .exp file import
   - Uses NXOpen.ExpressionCollection.ImportFromFile()
   - Replace mode overwrites existing values
   - Automatic model update and save
   - Comprehensive error handling

2. export_expressions.py - NX journal for .exp file export
   - Exports all expressions to text format
   - Used for unit detection and verification

3. Enhanced nx_updater.py
   - New update_expressions_via_import() method
   - Automatic unit detection from .exp export
   - Creates study-variable-only .exp files
   - Replaces fragile binary .prt editing

Technical Details:
- .exp Format: [Units]name=value (e.g., [MilliMeter]beam_length=5000)
- Unitless expressions: name=value (e.g., hole_count=10)
- Robustness: Native NX functionality, no regex failures
- Performance: < 1 second per update operation

Validation:
- Simple Beam Optimization study (4D design space)
  * beam_half_core_thickness: 10-40 mm
  * beam_face_thickness: 10-40 mm
  * holes_diameter: 150-450 mm
  * hole_count: 5-15 (integer)

Results:
 3-trial validation completed successfully
 All 4 variables update correctly in all trials
 Mesh adaptation verified (hole_count: 6, 15, 11 → different mesh sizes)
 Trial 0: 5373 CQUAD4 elements (6 holes)
 Trial 1: 5158 CQUAD4 + 1 CTRIA3 (15 holes)
 Trial 2: 5318 CQUAD4 (11 holes)

Problem Solved:
- hole_count expression was not updating with binary .prt editing
- Expression stored in feature parameter, not accessible via text regex
- Binary format prevented reliable text-based updates

Solution:
- Use NX native expression import/export
- Works for ALL expressions (text and binary-stored)
- Automatic unit handling
- Model update integrated in journal

Documentation:
- New: docs/NX_EXPRESSION_IMPORT_SYSTEM.md (comprehensive guide)
- Updated: CHANGELOG.md with Phase 3.2 progress
- Study: studies/simple_beam_optimization/ (complete example)

Files Added:
- optimization_engine/import_expressions.py
- optimization_engine/export_expressions.py
- docs/NX_EXPRESSION_IMPORT_SYSTEM.md
- studies/simple_beam_optimization/ (full study)

Files Modified:
- optimization_engine/nx_updater.py
- CHANGELOG.md

Compatibility:
- NX 2412 tested and verified
- Python 3.10+
- Works with all NX expression types

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

Co-Authored-By: Claude <noreply@anthropic.com>
2025-11-17 12:34:06 -05:00

2.9 KiB

Benchmarking Report

Study: simple_beam_optimization Date: 2025-11-17T11:18:28.329069 Validation: PASSED

Model Introspection

Expressions Found: 30

Expression Value Units
Pattern_p7 None
Pattern_p8 444.444444444444 MilliMeter
Pattern_p9 None MilliMeter
Pattern_p10 1.0
Pattern_p11 10.0 MilliMeter
Pattern_p12 0.0 MilliMeter
beam_face_thickness 20.0 MilliMeter
beam_half_core_thickness 20.0 MilliMeter
beam_half_height 250.0 MilliMeter
beam_half_width 150.0 MilliMeter
beam_lenght 5000.0 MilliMeter
hole_count 10.0
holes_diameter 300.0 MilliMeter
p4 None MilliMeter
p5 0.0 MilliMeter
p6 4000.0 MilliMeter
p13 0.0 Degrees
p19 4000.0 MilliMeter
p34 4000.0 MilliMeter
p50 4000.0 MilliMeter
p119 4000.0 MilliMeter
p130 10.0
p132 444.444444444444 MilliMeter
p134 4000.0 MilliMeter
p135 4000.0 MilliMeter
p137 1.0
p139 10.0 MilliMeter
p141 0.0 MilliMeter
p143 0.0 Degrees
p173 973.968443678471 Kilogram

OP2 Analysis

  • Element Types: CQUAD4
  • Result Types: displacement, stress
  • Subcases: [1]
  • Nodes: 0
  • Elements: 0

Baseline Performance

No baseline results extracted

Configuration Proposals

Proposed Design Variables

  • Pattern_p7: ±20% of None
  • Pattern_p8: ±20% of 444.444444444444 MilliMeter
  • Pattern_p9: ±20% of None MilliMeter
  • Pattern_p10: ±20% of 1.0
  • Pattern_p11: ±20% of 10.0 MilliMeter
  • Pattern_p12: ±20% of 0.0 MilliMeter
  • beam_face_thickness: ±20% of 20.0 MilliMeter
  • beam_half_core_thickness: ±20% of 20.0 MilliMeter
  • beam_half_height: ±20% of 250.0 MilliMeter
  • beam_half_width: ±20% of 150.0 MilliMeter
  • beam_lenght: ±20% of 5000.0 MilliMeter
  • hole_count: ±20% of 10.0
  • holes_diameter: ±20% of 300.0 MilliMeter
  • p4: ±20% of None MilliMeter
  • p5: ±20% of 0.0 MilliMeter
  • p6: ±20% of 4000.0 MilliMeter
  • p13: ±20% of 0.0 Degrees
  • p19: ±20% of 4000.0 MilliMeter
  • p34: ±20% of 4000.0 MilliMeter
  • p50: ±20% of 4000.0 MilliMeter
  • p119: ±20% of 4000.0 MilliMeter
  • p130: ±20% of 10.0
  • p132: ±20% of 444.444444444444 MilliMeter
  • p134: ±20% of 4000.0 MilliMeter
  • p135: ±20% of 4000.0 MilliMeter
  • p137: ±20% of 1.0
  • p139: ±20% of 10.0 MilliMeter
  • p141: ±20% of 0.0 MilliMeter
  • p143: ±20% of 0.0 Degrees
  • p173: ±20% of 973.968443678471 Kilogram

Proposed Extractors

  • extract_displacement: Extract displacement results from OP2 file
  • extract_solid_stress: Extract stress from CQUAD4 elements

Proposed Objectives

  • max_displacement (minimize or maximize)
  • max_von_mises (minimize for safety)