feat: Complete Phase 3 - pyNastran Documentation Integration
Phase 3 implements automated OP2 extraction code generation using pyNastran documentation research. This completes the zero-manual-coding pipeline for FEA optimization workflows. Key Features: - PyNastranResearchAgent for automated OP2 code generation - Documentation research via WebFetch integration - 3 core extraction patterns (displacement, stress, force) - Knowledge base architecture for learned patterns - Successfully tested on real OP2 files Phase 2.9 Integration: - Updated HookGenerator with lifecycle hook generation - Added POST_CALCULATION hook point to hooks.py - Created post_calculation/ plugin directory - Generated hooks integrate seamlessly with HookManager New Files: - optimization_engine/pynastran_research_agent.py (600+ lines) - optimization_engine/hook_generator.py (800+ lines) - optimization_engine/inline_code_generator.py - optimization_engine/plugins/post_calculation/ - tests/test_lifecycle_hook_integration.py - docs/SESSION_SUMMARY_PHASE_3.md - docs/SESSION_SUMMARY_PHASE_2_9.md - docs/SESSION_SUMMARY_PHASE_2_8.md - docs/HOOK_ARCHITECTURE.md Modified Files: - README.md - Added Phase 3 completion status - optimization_engine/plugins/hooks.py - Added POST_CALCULATION hook Test Results: - Phase 3 research agent: PASSED - Real OP2 extraction: PASSED (max_disp=0.362mm) - Lifecycle hook integration: PASSED Generated with Claude Code Co-Authored-By: Claude <noreply@anthropic.com>
This commit is contained in:
83
generated_hooks/hook_constraint_yield_constraint.py
Normal file
83
generated_hooks/hook_constraint_yield_constraint.py
Normal file
@@ -0,0 +1,83 @@
|
||||
"""
|
||||
Constraint Check Hook
|
||||
Auto-generated by Atomizer Phase 2.9
|
||||
|
||||
Check if stress is below yield
|
||||
|
||||
Constraint: max_stress / yield_strength
|
||||
Threshold: 1.0
|
||||
"""
|
||||
|
||||
import sys
|
||||
import json
|
||||
from pathlib import Path
|
||||
|
||||
|
||||
def check_yield_constraint(max_stress, yield_strength):
|
||||
"""
|
||||
Check constraint condition.
|
||||
|
||||
Args:
|
||||
max_stress: float
|
||||
yield_strength: float
|
||||
|
||||
Returns:
|
||||
tuple: (satisfied: bool, value: float, violation: float)
|
||||
"""
|
||||
value = max_stress / yield_strength
|
||||
satisfied = value <= 1.0
|
||||
violation = max(0.0, value - 1.0)
|
||||
|
||||
return satisfied, value, violation
|
||||
|
||||
|
||||
def main():
|
||||
"""Main entry point for hook execution."""
|
||||
if len(sys.argv) < 2:
|
||||
print("Usage: python {} <input_file.json>".format(sys.argv[0]))
|
||||
sys.exit(1)
|
||||
|
||||
input_file = Path(sys.argv[1])
|
||||
|
||||
# Read inputs
|
||||
with open(input_file, 'r') as f:
|
||||
inputs = json.load(f)
|
||||
|
||||
# Extract required inputs
|
||||
max_stress = inputs.get("max_stress")
|
||||
if max_stress is None:
|
||||
print(f"Error: Required input 'max_stress' not found")
|
||||
sys.exit(1)
|
||||
yield_strength = inputs.get("yield_strength")
|
||||
if yield_strength is None:
|
||||
print(f"Error: Required input 'yield_strength' not found")
|
||||
sys.exit(1)
|
||||
|
||||
# Check constraint
|
||||
satisfied, value, violation = check_yield_constraint(max_stress, yield_strength)
|
||||
|
||||
# Write output
|
||||
output_file = input_file.parent / "yield_constraint_check.json"
|
||||
output = {
|
||||
"constraint_name": "yield_constraint",
|
||||
"satisfied": satisfied,
|
||||
"value": value,
|
||||
"threshold": 1.0,
|
||||
"violation": violation,
|
||||
"inputs_used": {"max_stress": max_stress, "yield_strength": yield_strength}
|
||||
}
|
||||
|
||||
with open(output_file, 'w') as f:
|
||||
json.dump(output, f, indent=2)
|
||||
|
||||
status = "SATISFIED" if satisfied else "VIOLATED"
|
||||
print(f"Constraint {status}: {value:.6f} (threshold: 1.0)")
|
||||
if not satisfied:
|
||||
print(f"Violation: {violation:.6f}")
|
||||
print(f"Result saved to: {output_file}")
|
||||
|
||||
return value
|
||||
|
||||
|
||||
if __name__ == '__main__':
|
||||
main()
|
||||
Reference in New Issue
Block a user