{ "workflow_name": "bracket_stiffness_workflow", "description": "End-to-end workflow for bracket stiffness optimization", "version": "1.0", "workflow_steps": [ { "step": 1, "name": "update_design_variables", "description": "Update NX model expressions with trial parameters", "action": "nx_update_expressions", "inputs": { "model_file": "1_setup/model/Bracket.prt", "expressions": { "support_angle": "{{support_angle}}", "tip_thickness": "{{tip_thickness}}" } }, "outputs": ["updated_model"], "on_failure": "abort_trial" }, { "step": 2, "name": "solve_simulation", "description": "Run NX Nastran SOL 101 linear static analysis", "action": "nx_solve", "inputs": { "sim_file": "1_setup/model/Bracket_sim1.sim", "solver": "NX_Nastran", "solution": "SOL101" }, "outputs": ["op2_file", "f06_file"], "on_failure": "abort_trial", "timeout": 600 }, { "step": 3, "name": "export_displacement_field", "description": "Export z-displacement field from results", "action": "nx_journal", "inputs": { "journal_file": "1_setup/model/export_displacement_field.py", "sim_file": "1_setup/model/Bracket_sim1.sim" }, "outputs": ["field_file"], "on_failure": "abort_trial" }, { "step": 4, "name": "extract_results", "description": "Extract stiffness and mass from FEA results", "action": "python_extractor", "inputs": { "extractor_script": "bracket_stiffness_extractor.py", "field_file": "1_setup/model/export_field_dz.fld", "op2_file": "1_setup/model/Bracket_sim1.op2" }, "outputs": { "stiffness": "objectives.stiffness", "mass": "objectives.mass", "displacement": "displacement", "force": "force" }, "on_failure": "abort_trial" }, { "step": 5, "name": "evaluate_constraints", "description": "Check mass constraint (≤ 0.2 kg) - mark as infeasible but keep for surrogate", "action": "constraint_check", "inputs": { "mass": "{{mass}}", "max_mass": 0.2 }, "outputs": ["constraint_satisfied"], "on_failure": "continue" }, { "step": 6, "name": "report_results", "description": "Send results to optimization engine and dashboard", "action": "report", "inputs": { "trial_number": "{{trial_number}}", "objectives": { "stiffness": "{{stiffness}}", "mass": "{{mass}}" }, "design_variables": { "support_angle": "{{support_angle}}", "tip_thickness": "{{tip_thickness}}" }, "metadata": { "displacement": "{{displacement}}", "force": "{{force}}" } }, "outputs": ["trial_complete"], "on_failure": "log_error" } ], "error_handling": { "max_retries": 2, "retry_delay": 5, "fallback_action": "skip_trial", "log_errors": true, "error_log_file": "2_results/errors.log" }, "cleanup": { "delete_intermediate_files": false, "archive_results": true, "compress_op2": false }, "logging": { "level": "INFO", "log_file": "2_results/workflow.log", "console_output": true, "log_rotation": { "max_size_mb": 50, "backup_count": 3 } } }