Files
Atomizer/optimization_engine
Antoine 6f3325d86f fix: mass extraction NaN in Hydrotech Beam DOE — two bugs
Bug 1 — Journal (solve_simulation.py simple workflow):
  Expression lookup for p173 fails silently for derived/measurement
  expressions, so _temp_mass.txt was never written. Added MeasureManager
  fallback via extract_part_mass() (already used in assembly workflow).

Bug 2 — Extractor (extract_mass_from_expression.py):
  Journal writes 'p173=<value>' format but extractor tried float() on
  the whole content including 'p173='. Added key=value parsing.

Defense in depth — nx_interface.py:
  Added stdout parsing fallback: if _temp_mass.txt still missing, parse
  mass from journal output captured via solver.py stdout passthrough.

Files changed:
  - optimization_engine/nx/solve_simulation.py — MeasureManager fallback
  - optimization_engine/extractors/extract_mass_from_expression.py — key=value parse
  - optimization_engine/nx/solver.py — include stdout in result dict
  - projects/hydrotech-beam/studies/01_doe_landscape/nx_interface.py — stdout fallback

Tags: hydrotech-beam, mass-extraction
2026-02-11 19:02:43 +00:00
..

Optimization Engine

Core optimization engine for Atomizer structural optimization projects.

Overview

The optimization engine provides NX Nastran integration, result extraction, and optimization orchestration. Originally developed for the SAT3 mirror project, now generalized for multiple projects including Hydrotech Beam.

NX Integration (nx/)

Supported NX Versions

Version Status Notes
NX 2412 ⚠️ Legacy Original development version
DesigncenterNX 2512 Current Siemens rebranded NX to "DesigncenterNX". Install path: C:\Program Files\Siemens\DesigncenterNX2512

Important: Siemens rebranded NX to "DesigncenterNX" starting with version 2512. The install directory, executable paths, and search paths all use the new name. Solver configuration must specify 2512 and include DesigncenterNX in search paths.

Key Files

File Purpose
solver.py NX solver interface — manages NX session, expression updates, solve execution
solve_simulation.py NX journal script — runs inside NXOpen Python, handles simple + assembly workflows
solve_simulation_simple.py Simplified journal for single-part (simple) workflow
updater.py Expression updater — writes .exp files, handles unit types
export_expressions.py Export expressions from NX model
import_expressions.py Import expressions into NX model
session_manager.py NX session lifecycle management
model_cleanup.py Model cleanup utilities
mesh_converter.py Mesh format conversion

Path Resolution — CRITICAL on Windows

Path.absolute() on Windows does NOT resolve .. components. Use Path.resolve() everywhere.

# WRONG — NX cannot follow ".." in paths
path = Path("../../models/Beam_sim1.sim").absolute()
# → C:\...\studies\01_doe_landscape\..\..\models\Beam_sim1.sim  ← BROKEN

# CORRECT — fully resolved path
path = Path("../../models/Beam_sim1.sim").resolve()
# → C:\...\projects\hydrotech-beam\models\Beam_sim1.sim  ← WORKS

This applies to ALL paths passed to NX journals, including:

  • .sim file path
  • .exp file path
  • Model directory path
  • Output file paths

NX File References — In-Place Solving Required

NX .sim files store absolute internal references to .fem and .prt files. Copying model files to different directories breaks these references (Parts.Open returns None).

Solution: Always solve on master model files in-place. Use backup/restore for isolation between optimization trials:

  1. Backup master model files before trial
  2. Write expressions, rebuild, solve in original location
  3. Archive outputs (OP2, F06) to trial-specific folder
  4. Restore master from backup

Expression Units

When writing .exp files for NX:

  • Length design variables: unit = MilliMeter
  • Integer expressions (e.g., hole_count): unit = Constant
  • Critical: Using wrong unit silently corrupts the model

Workflow Types

Simple workflow (single-part, e.g., Hydrotech Beam):

Beam.prt → Beam_fem1_i.prt → Beam_fem1.fem → Beam_sim1.sim

Assembly FEM workflow (multi-part, e.g., SAT3 mirror):

Multiple .prt → .afm → .sim (node merge, label conflicts)

The journal auto-detects workflow type by checking for .afm files.

Result Extraction

pyNastran Compatibility

pyNastran warns "nx version 2512 not supported" but reads OP2 files correctly. Safe to ignore the warning.

Unit note: pyNastran returns stress in kPa for NX models using kg-mm-s unit system. Divide by 1000 for MPa.

Mass Extraction

Mass is extracted via NX expression p173 (or project-specific expression). The journal writes the value to a temp file (_temp_mass.txt) after solve, which Python reads.

Dependencies

  • Python 3.10+
  • pyNastran (OP2 parsing)
  • NXOpen Python API (on Windows solver node)
  • Optuna (optimization orchestration)
  • scipy, numpy, pandas

Projects Using This Engine

Project Status NX Version Workflow
Hydrotech Beam Active (DOE Phase 1) DesigncenterNX 2512 Simple
SAT3 Mirror Legacy reference NX 2412 Assembly FEM

Last updated: 2026-02-11