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>
65 lines
1.9 KiB
Python
65 lines
1.9 KiB
Python
"""
|
|
Extract von Mises stress from CHEXA elements
|
|
Auto-generated by Atomizer Phase 3 - pyNastran Research Agent
|
|
|
|
Pattern: solid_stress
|
|
Element Type: CTETRA
|
|
Result Type: stress
|
|
API: model.ctetra_stress[subcase] or model.chexa_stress[subcase]
|
|
"""
|
|
|
|
from pathlib import Path
|
|
from typing import Dict, Any
|
|
import numpy as np
|
|
from pyNastran.op2.op2 import OP2
|
|
|
|
|
|
def extract_solid_stress(op2_file: Path, subcase: int = 1, element_type: str = 'ctetra'):
|
|
"""Extract stress from solid elements."""
|
|
from pyNastran.op2.op2 import OP2
|
|
import numpy as np
|
|
|
|
model = OP2()
|
|
model.read_op2(str(op2_file))
|
|
|
|
# Get stress object for element type
|
|
# In pyNastran, stress is stored in model.op2_results.stress
|
|
stress_attr = f"{element_type}_stress"
|
|
|
|
if not hasattr(model, 'op2_results') or not hasattr(model.op2_results, 'stress'):
|
|
raise ValueError(f"No stress results in OP2")
|
|
|
|
stress_obj = model.op2_results.stress
|
|
if not hasattr(stress_obj, stress_attr):
|
|
raise ValueError(f"No {element_type} stress results in OP2")
|
|
|
|
stress = getattr(stress_obj, stress_attr)[subcase]
|
|
itime = 0
|
|
|
|
# Extract von Mises if available
|
|
if stress.is_von_mises: # Property, not method
|
|
von_mises = stress.data[itime, :, 9] # Column 9 is von Mises
|
|
max_stress = float(np.max(von_mises))
|
|
|
|
# Get element info
|
|
element_ids = [eid for (eid, node) in stress.element_node]
|
|
max_stress_elem = element_ids[np.argmax(von_mises)]
|
|
|
|
return {
|
|
'max_von_mises': max_stress,
|
|
'max_stress_element': int(max_stress_elem)
|
|
}
|
|
else:
|
|
raise ValueError("von Mises stress not available")
|
|
|
|
|
|
if __name__ == '__main__':
|
|
# Example usage
|
|
import sys
|
|
if len(sys.argv) > 1:
|
|
op2_file = Path(sys.argv[1])
|
|
result = extract_solid_stress(op2_file)
|
|
print(f"Extraction result: {result}")
|
|
else:
|
|
print("Usage: python {sys.argv[0]} <op2_file>")
|