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>
76 lines
1.6 KiB
Python
76 lines
1.6 KiB
Python
"""
|
|
Comparison Hook
|
|
Auto-generated by Atomizer Phase 2.9
|
|
|
|
Compare min force to average
|
|
|
|
Operation: ratio
|
|
Formula: min_to_avg_ratio = min_force / avg_force
|
|
"""
|
|
|
|
import sys
|
|
import json
|
|
from pathlib import Path
|
|
|
|
|
|
def compare_ratio(min_force, avg_force):
|
|
"""
|
|
Compare values using ratio.
|
|
|
|
Args:
|
|
min_force: float
|
|
avg_force: float
|
|
|
|
Returns:
|
|
float: Comparison result
|
|
"""
|
|
result = min_force / avg_force
|
|
return result
|
|
|
|
|
|
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
|
|
min_force = inputs.get("min_force")
|
|
if min_force is None:
|
|
print(f"Error: Required input 'min_force' not found")
|
|
sys.exit(1)
|
|
avg_force = inputs.get("avg_force")
|
|
if avg_force is None:
|
|
print(f"Error: Required input 'avg_force' not found")
|
|
sys.exit(1)
|
|
|
|
# Calculate comparison
|
|
result = compare_ratio(min_force, avg_force)
|
|
|
|
# Write output
|
|
output_file = input_file.parent / "min_to_avg_ratio.json"
|
|
output = {
|
|
"min_to_avg_ratio": result,
|
|
"operation": "ratio",
|
|
"formula": "min_force / avg_force",
|
|
"inputs_used": {"min_force": min_force, "avg_force": avg_force}
|
|
}
|
|
|
|
with open(output_file, 'w') as f:
|
|
json.dump(output, f, indent=2)
|
|
|
|
print(f"min_to_avg_ratio = {result:.6f}")
|
|
print(f"Result saved to: {output_file}")
|
|
|
|
return result
|
|
|
|
|
|
if __name__ == '__main__':
|
|
main()
|