Files
Atomizer/optimization_engine/result_extractors/generated/extract_solid_stress.py

59 lines
1.6 KiB
Python
Raw Normal View History

feat: Complete Phase 3.1 - Extractor Orchestration & End-to-End Automation Phase 3.1 completes the ZERO-MANUAL-CODING automation pipeline by integrating all phases into a seamless workflow from natural language request to final objective value. Key Features: - ExtractorOrchestrator integrates Phase 2.7 LLM + Phase 3.0 Research Agent - Automatic extractor generation from LLM workflow output - Dynamic loading and execution on real OP2 files - Smart parameter filtering per extraction pattern type - Multi-extractor support in single workflow - Complete end-to-end test passed on real bracket OP2 Complete Automation Pipeline: User Natural Language Request ↓ Phase 2.7 LLM Analysis ↓ Phase 3.1 Orchestrator ↓ Phase 3.0 Research Agent (auto OP2 code gen) ↓ Generated Extractor Modules ↓ Dynamic Execution on Real OP2 ↓ Phase 2.8 Inline Calculations ↓ Phase 2.9 Post-Processing Hooks ↓ Final Objective → Optuna Test Results: - Generated displacement extractor: PASSED - Executed on bracket OP2: PASSED - Extracted max_displacement: 0.361783mm at node 91 - Calculated normalized objective: 0.072357 - Multi-extractor generation: PASSED New Files: - optimization_engine/extractor_orchestrator.py (380+ lines) - tests/test_phase_3_1_integration.py (200+ lines) - docs/SESSION_SUMMARY_PHASE_3_1.md (comprehensive documentation) - optimization_engine/result_extractors/generated/ (auto-generated extractors) Modified Files: - README.md - Added Phase 3.1 completion status ZERO MANUAL CODING - Complete automation achieved! Generated with Claude Code Co-Authored-By: Claude <noreply@anthropic.com>
2025-11-16 19:39:04 -05:00
"""
Extract von Mises stress from solid 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
stress_attr = f"{element_type}_stress"
if not hasattr(model, stress_attr):
raise ValueError(f"No {element_type} stress results in OP2")
stress = getattr(model, stress_attr)[subcase]
itime = 0
# Extract von Mises if available
if stress.is_von_mises():
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>")