feat: Add substudy system with live history tracking and workflow fixes
Major Features: - Hierarchical substudy system (like NX Solutions/Subcases) * Shared model files across all substudies * Independent configuration per substudy * Continuation support from previous substudies * Real-time incremental history updates - Live history tracking with optimization_history_incremental.json - Complete bracket_displacement_maximizing study with substudy examples Core Fixes: - Fixed expression update workflow to pass design_vars through simulation_runner * Restored working NX journal expression update mechanism * OP2 timestamp verification instead of file deletion * Resolved issue where all trials returned identical objective values - Fixed LLMOptimizationRunner to pass design variables to simulation runner - Enhanced NXSolver with timestamp-based file regeneration verification New Components: - optimization_engine/llm_optimization_runner.py - LLM-driven optimization runner - optimization_engine/optimization_setup_wizard.py - Phase 3.3 setup wizard - studies/bracket_displacement_maximizing/ - Complete substudy example * run_substudy.py - Substudy runner with continuation * run_optimization.py - Standalone optimization runner * config/substudy_template.json - Template for new substudies * substudies/coarse_exploration/ - 20-trial coarse search * substudies/fine_tuning/ - 50-trial refinement (continuation example) * SUBSTUDIES_README.md - Complete substudy documentation Technical Improvements: - Incremental history saving after each trial (optimization_history_incremental.json) - Expression update workflow: .prt update → NX journal receives values → geometry update → FEM update → solve - Trial indexing fix in substudy result saving - Updated README with substudy system documentation Testing: - Successfully ran 20-trial coarse_exploration substudy - Verified different objective values across trials (workflow fix validated) - Confirmed live history updates in real-time - Tested shared model file usage across substudies 🤖 Generated with [Claude Code](https://claude.com/claude-code) Co-Authored-By: Claude <noreply@anthropic.com>
This commit is contained in:
@@ -0,0 +1,81 @@
|
||||
{
|
||||
"study_name": "bracket_displacement_maximizing",
|
||||
"study_description": "Maximize displacement of bracket under load while maintaining safety factor >= 4.0",
|
||||
"created_date": "2025-11-16",
|
||||
"model": {
|
||||
"part_file": "model/Bracket.prt",
|
||||
"fem_file": "model/Bracket_fem1.fem",
|
||||
"sim_file": "model/Bracket_sim1.sim",
|
||||
"element_types": ["CHEXA", "CPENTA"],
|
||||
"nodes": 585,
|
||||
"elements": 316
|
||||
},
|
||||
"optimization": {
|
||||
"objective": "Maximize displacement (minimize negative displacement)",
|
||||
"direction": "minimize",
|
||||
"algorithm": "TPE",
|
||||
"n_trials": 20,
|
||||
"design_variables": [
|
||||
{
|
||||
"name": "tip_thickness",
|
||||
"type": "continuous",
|
||||
"min": 15.0,
|
||||
"max": 25.0,
|
||||
"units": "mm",
|
||||
"baseline": 17.0
|
||||
},
|
||||
{
|
||||
"name": "support_angle",
|
||||
"type": "continuous",
|
||||
"min": 20.0,
|
||||
"max": 40.0,
|
||||
"units": "degrees",
|
||||
"baseline": 38.0
|
||||
}
|
||||
],
|
||||
"constraints": [
|
||||
{
|
||||
"name": "safety_factor",
|
||||
"type": ">=",
|
||||
"value": 4.0,
|
||||
"description": "Minimum safety factor constraint"
|
||||
}
|
||||
]
|
||||
},
|
||||
"material": {
|
||||
"name": "Aluminum 6061-T6",
|
||||
"yield_strength": 276.0,
|
||||
"yield_strength_units": "MPa",
|
||||
"allowable_stress": 69.0,
|
||||
"allowable_stress_units": "MPa"
|
||||
},
|
||||
"workflow": {
|
||||
"phase": "3.3",
|
||||
"wizard_validation": true,
|
||||
"auto_element_detection": true,
|
||||
"extractors": [
|
||||
{
|
||||
"action": "extract_displacement",
|
||||
"result_type": "displacement"
|
||||
},
|
||||
{
|
||||
"action": "extract_solid_stress",
|
||||
"result_type": "stress",
|
||||
"element_type": "auto-detected"
|
||||
}
|
||||
],
|
||||
"inline_calculations": [
|
||||
{
|
||||
"action": "calculate_safety_factor",
|
||||
"formula": "276.0 / max_von_mises"
|
||||
},
|
||||
{
|
||||
"action": "negate_displacement",
|
||||
"formula": "-max_displacement"
|
||||
}
|
||||
],
|
||||
"hooks": [
|
||||
"safety_factor_constraint"
|
||||
]
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,44 @@
|
||||
{
|
||||
"substudy_name": "coarse_exploration",
|
||||
"description": "Fast coarse exploration with wide parameter bounds",
|
||||
"parent_study": "bracket_displacement_maximizing",
|
||||
"created_date": "2025-11-16",
|
||||
|
||||
"optimization": {
|
||||
"algorithm": "TPE",
|
||||
"direction": "minimize",
|
||||
"n_trials": 20,
|
||||
"n_startup_trials": 10,
|
||||
"design_variables": [
|
||||
{
|
||||
"parameter": "tip_thickness",
|
||||
"type": "continuous",
|
||||
"min": 15.0,
|
||||
"max": 25.0,
|
||||
"units": "mm"
|
||||
},
|
||||
{
|
||||
"parameter": "support_angle",
|
||||
"type": "continuous",
|
||||
"min": 20.0,
|
||||
"max": 40.0,
|
||||
"units": "degrees"
|
||||
}
|
||||
]
|
||||
},
|
||||
|
||||
"continuation": {
|
||||
"enabled": false,
|
||||
"from_substudy": null,
|
||||
"resume_from_trial": null,
|
||||
"inherit_best_params": false
|
||||
},
|
||||
|
||||
"solver": {
|
||||
"nastran_version": "2412",
|
||||
"use_journal": true,
|
||||
"timeout": 300
|
||||
},
|
||||
|
||||
"notes": "Template for creating new substudies"
|
||||
}
|
||||
Reference in New Issue
Block a user