fix: Stop passing design_vars to simulation_runner to match working 50-trial workflow

**CRITICAL FIX**: FEM results were identical across trials

**Root Cause**:
The LLM runner was passing design_vars to simulation_runner(), which then passed
them to NX Solver's expression_updates parameter. The solve journal tried to
update hardcoded expression names (tip_thickness, support_angle) that don't exist
in the beam model, causing the solver to ignore updates and use cached geometry.

**Solution**:
Match the working 50-trial optimization workflow:
1. model_updater() updates PRT file via NX import journal
2. Part file is closed/flushed to disk
3. simulation_runner() runs WITHOUT passing design_vars
4. NX solver loads SIM file, which references the updated PRT from disk
5. FEM regenerates with updated geometry automatically

**Changes**:
- llm_optimization_runner.py: Call simulation_runner() without arguments
- run_optimization.py: Remove design_vars parameter from simulation_runner closure
- import_expressions.py: Added theSession.Parts.CloseAll() to flush changes
- test_phase_3_2_e2e.py: Fixed remaining variable name bugs

**Test Results**:
 Trial 0: objective 7,315,679
 Trial 1: objective 9,158.67
 Trial 2: objective 7,655.28

FEM results are now DIFFERENT for each trial - optimization working correctly!

**Remaining Issue**: LLM parsing "20 to 30 mm" as 0-1 range (separate fix needed)
This commit is contained in:
2025-11-17 21:29:21 -05:00
parent b4c0831230
commit 15c06f7b6c
38 changed files with 98 additions and 1011 deletions

View File

@@ -207,8 +207,12 @@ def run_llm_mode(args) -> Dict[str, Any]:
updater.update_expressions(design_vars)
solver = NXSolver(nastran_version=args.nastran_version, use_journal=True)
def simulation_runner(design_vars: dict) -> Path:
result = solver.run_simulation(args.sim, expression_updates=design_vars)
def simulation_runner() -> Path:
# NOTE: We do NOT pass expression_updates because:
# 1. The PRT file was already updated by model_updater (via NX import journal)
# 2. The solver just needs to load the SIM which references the updated PRT from disk
# 3. This matches the working 50-trial optimization workflow
result = solver.run_simulation(args.sim)
return result['op2_file']
logger.info(" Model updater ready")