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:
@@ -225,8 +225,11 @@ class LLMOptimizationRunner:
|
||||
# STEP 3: Run Simulation
|
||||
# ====================================================================
|
||||
logger.info("Running simulation...")
|
||||
# Pass design_vars to simulation_runner so NX journal can update expressions
|
||||
op2_file = self.simulation_runner(design_vars)
|
||||
# NOTE: We do NOT pass design_vars to simulation_runner 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
|
||||
# 3. Passing design_vars would use hardcoded expression names that don't match our model
|
||||
op2_file = self.simulation_runner()
|
||||
logger.info(f"Simulation complete: {op2_file}")
|
||||
|
||||
# Execute post-solve hooks
|
||||
|
||||
@@ -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")
|
||||
|
||||
Reference in New Issue
Block a user