Major additions: - Training data export system for AtomizerField neural network training - Bracket stiffness optimization study with 50+ training samples - Intelligent NX model discovery (auto-detect solutions, expressions, mesh) - Result extractors module for displacement, stress, frequency, mass - User-generated NX journals for advanced workflows - Archive structure for legacy scripts and test outputs - Protocol documentation and dashboard launcher 🤖 Generated with [Claude Code](https://claude.com/claude-code) Co-Authored-By: Claude <noreply@anthropic.com>
90 lines
2.7 KiB
Python
90 lines
2.7 KiB
Python
"""
|
|
Create circular_plate_frequency_tuning_V2 study with ALL fixes applied.
|
|
|
|
Improvements:
|
|
- Proper study naming
|
|
- Reports go to 3_reports/ folder
|
|
- Reports discuss actual goal (115 Hz target)
|
|
- Fixed objective function
|
|
"""
|
|
|
|
from pathlib import Path
|
|
import sys
|
|
import argparse
|
|
sys.path.insert(0, str(Path(__file__).parent))
|
|
|
|
from optimization_engine.hybrid_study_creator import HybridStudyCreator
|
|
|
|
|
|
def main():
|
|
parser = argparse.ArgumentParser(description='Create circular plate frequency tuning study')
|
|
parser.add_argument('--study-name', default='circular_plate_frequency_tuning_V2',
|
|
help='Name of the study folder')
|
|
args = parser.parse_args()
|
|
|
|
study_name = args.study_name
|
|
|
|
creator = HybridStudyCreator()
|
|
|
|
# Create workflow JSON
|
|
import json
|
|
import tempfile
|
|
workflow = {
|
|
"study_name": study_name,
|
|
"optimization_request": "Tune the first natural frequency mode to exactly 115 Hz (within 0.1 Hz tolerance)",
|
|
"design_variables": [
|
|
{"parameter": "inner_diameter", "bounds": [50, 150]},
|
|
{"parameter": "plate_thickness", "bounds": [2, 10]}
|
|
],
|
|
"objectives": [{
|
|
"name": "frequency_error",
|
|
"goal": "minimize",
|
|
"extraction": {
|
|
"action": "extract_first_natural_frequency",
|
|
"params": {"mode_number": 1, "target_frequency": 115.0}
|
|
}
|
|
}],
|
|
"constraints": [{
|
|
"name": "frequency_tolerance",
|
|
"type": "less_than",
|
|
"threshold": 0.1
|
|
}]
|
|
}
|
|
|
|
# Write to temp file
|
|
temp_workflow = Path(tempfile.gettempdir()) / f"{study_name}_workflow.json"
|
|
with open(temp_workflow, 'w') as f:
|
|
json.dump(workflow, f, indent=2)
|
|
|
|
# Create study
|
|
study_dir = creator.create_from_workflow(
|
|
workflow_json_path=temp_workflow,
|
|
model_files={
|
|
'prt': Path("examples/Models/Circular Plate/Circular_Plate.prt"),
|
|
'sim': Path("examples/Models/Circular Plate/Circular_Plate_sim1.sim"),
|
|
'fem': Path("examples/Models/Circular Plate/Circular_Plate_fem1.fem"),
|
|
'fem_i': Path("examples/Models/Circular Plate/Circular_Plate_fem1_i.prt")
|
|
},
|
|
study_name=study_name
|
|
)
|
|
|
|
print()
|
|
print("=" * 80)
|
|
print(f"[OK] Study created: {study_name}")
|
|
print("=" * 80)
|
|
print()
|
|
print(f"Location: {study_dir}")
|
|
print()
|
|
print("Structure:")
|
|
print(" - 1_setup/: Model files and configuration")
|
|
print(" - 2_results/: Optimization history and database")
|
|
print(" - 3_reports/: Human-readable reports with graphs")
|
|
print()
|
|
print("To run optimization:")
|
|
print(f" python {study_dir}/run_optimization.py")
|
|
print()
|
|
|
|
|
|
if __name__ == "__main__":
|
|
main()
|