From cb6b1309084f1b15fcca152265dd35529004aef9 Mon Sep 17 00:00:00 2001 From: Anto01 Date: Tue, 20 Jan 2026 13:11:23 -0500 Subject: [PATCH] feat(config): Add AtomizerSpec v2.0 schema and migrate all studies Added JSON Schema: - optimization_engine/schemas/atomizer_spec_v2.json Migrated 28 studies to AtomizerSpec v2.0 format: - Drone_Gimbal studies (1) - M1_Mirror studies (21) - M2_Mirror studies (2) - SheetMetal_Bracket studies (4) Each atomizer_spec.json is the unified configuration containing: - Design variables with bounds and expressions - Extractors (standard and custom) - Objectives and constraints - Optimization algorithm settings - Canvas layout information --- .../schemas/atomizer_spec_v2.json | 800 ++++++++++++++++++ .../atomizer_spec.json | 287 +++++++ .../m1_mirror_adaptive_V11/atomizer_spec.json | 406 +++++++++ .../m1_mirror_adaptive_V12/atomizer_spec.json | 454 ++++++++++ .../m1_mirror_adaptive_V13/atomizer_spec.json | 406 +++++++++ .../m1_mirror_adaptive_V14/atomizer_spec.json | 406 +++++++++ .../m1_mirror_adaptive_V15/atomizer_spec.json | 407 +++++++++ .../atomizer_spec.json | 435 ++++++++++ .../atomizer_spec.json | 528 ++++++++++++ .../atomizer_spec.json | 528 ++++++++++++ .../atomizer_spec.json | 528 ++++++++++++ .../atomizer_spec.json | 560 ++++++++++++ .../atomizer_spec.json | 527 ++++++++++++ .../atomizer_spec.json | 582 +++++++++++++ .../atomizer_spec.json | 582 +++++++++++++ .../atomizer_spec.json | 400 +++++++++ .../atomizer_spec.json | 259 ++++++ .../atomizer_spec.json | 325 +++++++ .../atomizer_spec.json | 461 ++++++++++ .../m1_mirror_turbo_V1/atomizer_spec.json | 462 ++++++++++ .../m1_mirror_turbo_V2/atomizer_spec.json | 462 ++++++++++ .../atomizer_spec.json | 435 ++++++++++ .../bracket_pareto_3obj/atomizer_spec.json | 213 +++++ .../atomizer_spec.json | 225 +++++ .../atomizer_spec.json | 225 +++++ .../atomizer_spec.json | 225 +++++ .../atomizer_spec.json | 209 +++++ .../atomizer_spec.json | 287 +++++++ .../uav_arm_optimization/atomizer_spec.json | 287 +++++++ .../atomizer_spec.json | 287 +++++++ studies/support_mass_v1/atomizer_spec.json | 83 ++ 31 files changed, 12281 insertions(+) create mode 100644 optimization_engine/schemas/atomizer_spec_v2.json create mode 100644 studies/Drone_Gimbal/drone_gimbal_arm_optimization/atomizer_spec.json create mode 100644 studies/M1_Mirror/m1_mirror_adaptive_V11/atomizer_spec.json create mode 100644 studies/M1_Mirror/m1_mirror_adaptive_V12/atomizer_spec.json create mode 100644 studies/M1_Mirror/m1_mirror_adaptive_V13/atomizer_spec.json create mode 100644 studies/M1_Mirror/m1_mirror_adaptive_V14/atomizer_spec.json create mode 100644 studies/M1_Mirror/m1_mirror_adaptive_V15/atomizer_spec.json create mode 100644 studies/M1_Mirror/m1_mirror_cost_reduction/atomizer_spec.json create mode 100644 studies/M1_Mirror/m1_mirror_cost_reduction_V10/atomizer_spec.json create mode 100644 studies/M1_Mirror/m1_mirror_cost_reduction_V11/atomizer_spec.json create mode 100644 studies/M1_Mirror/m1_mirror_cost_reduction_V12/atomizer_spec.json create mode 100644 studies/M1_Mirror/m1_mirror_cost_reduction_V13/atomizer_spec.json create mode 100644 studies/M1_Mirror/m1_mirror_cost_reduction_V9/atomizer_spec.json create mode 100644 studies/M1_Mirror/m1_mirror_cost_reduction_flat_back_V10/atomizer_spec.json create mode 100644 studies/M1_Mirror/m1_mirror_cost_reduction_flat_back_V9/atomizer_spec.json create mode 100644 studies/M1_Mirror/m1_mirror_cost_reduction_lateral/atomizer_spec.json create mode 100644 studies/M1_Mirror/m1_mirror_flat_back_final/atomizer_spec.json create mode 100644 studies/M1_Mirror/m1_mirror_flatback_lateral/atomizer_spec.json create mode 100644 studies/M1_Mirror/m1_mirror_surrogate_turbo/atomizer_spec.json create mode 100644 studies/M1_Mirror/m1_mirror_turbo_V1/atomizer_spec.json create mode 100644 studies/M1_Mirror/m1_mirror_turbo_V2/atomizer_spec.json create mode 100644 studies/M1_Mirror/m1_mirror_zernike_optimization/atomizer_spec.json create mode 100644 studies/Simple_Bracket/bracket_pareto_3obj/atomizer_spec.json create mode 100644 studies/Simple_Bracket/bracket_stiffness_optimization/atomizer_spec.json create mode 100644 studies/Simple_Bracket/bracket_stiffness_optimization_V2/atomizer_spec.json create mode 100644 studies/Simple_Bracket/bracket_stiffness_optimization_V3/atomizer_spec.json create mode 100644 studies/Simple_Bracket/bracket_stiffness_optimization_atomizerfield/atomizer_spec.json create mode 100644 studies/UAV_Arm/uav_arm_atomizerfield_test/atomizer_spec.json create mode 100644 studies/UAV_Arm/uav_arm_optimization/atomizer_spec.json create mode 100644 studies/UAV_Arm/uav_arm_optimization_V2/atomizer_spec.json create mode 100644 studies/support_mass_v1/atomizer_spec.json diff --git a/optimization_engine/schemas/atomizer_spec_v2.json b/optimization_engine/schemas/atomizer_spec_v2.json new file mode 100644 index 00000000..f1c74e2d --- /dev/null +++ b/optimization_engine/schemas/atomizer_spec_v2.json @@ -0,0 +1,800 @@ +{ + "$schema": "http://json-schema.org/draft-07/schema#", + "$id": "https://atomizer.io/schemas/atomizer_spec_v2.json", + "title": "AtomizerSpec v2.0", + "description": "Unified configuration schema for Atomizer optimization studies. This is the single source of truth used by Canvas, Backend, Claude, and the Optimization Engine.", + "type": "object", + "required": ["meta", "model", "design_variables", "extractors", "objectives", "optimization"], + + "properties": { + "meta": { + "$ref": "#/definitions/meta" + }, + "model": { + "$ref": "#/definitions/model" + }, + "design_variables": { + "type": "array", + "description": "Design variables (NX expressions) to optimize", + "minItems": 1, + "maxItems": 50, + "items": { + "$ref": "#/definitions/design_variable" + } + }, + "extractors": { + "type": "array", + "description": "Physics extractors that compute outputs from FEA results", + "minItems": 1, + "items": { + "$ref": "#/definitions/extractor" + } + }, + "objectives": { + "type": "array", + "description": "Optimization objectives (minimize/maximize)", + "minItems": 1, + "maxItems": 5, + "items": { + "$ref": "#/definitions/objective" + } + }, + "constraints": { + "type": "array", + "description": "Hard and soft constraints", + "items": { + "$ref": "#/definitions/constraint" + } + }, + "optimization": { + "$ref": "#/definitions/optimization" + }, + "workflow": { + "$ref": "#/definitions/workflow" + }, + "reporting": { + "$ref": "#/definitions/reporting" + }, + "canvas": { + "$ref": "#/definitions/canvas" + } + }, + + "definitions": { + "meta": { + "type": "object", + "description": "Metadata about the spec", + "required": ["version", "study_name"], + "properties": { + "version": { + "type": "string", + "description": "Schema version", + "pattern": "^2\\.\\d+$", + "examples": ["2.0", "2.1"] + }, + "created": { + "type": "string", + "format": "date-time", + "description": "When the spec was created" + }, + "modified": { + "type": "string", + "format": "date-time", + "description": "When the spec was last modified" + }, + "created_by": { + "type": "string", + "description": "Who/what created the spec", + "enum": ["canvas", "claude", "api", "migration", "manual"] + }, + "modified_by": { + "type": "string", + "description": "Who/what last modified the spec" + }, + "study_name": { + "type": "string", + "description": "Unique study identifier (snake_case)", + "pattern": "^[a-z0-9_]+$", + "minLength": 3, + "maxLength": 100 + }, + "description": { + "type": "string", + "description": "Human-readable description of the study", + "maxLength": 1000 + }, + "tags": { + "type": "array", + "description": "Tags for categorization", + "items": { + "type": "string", + "maxLength": 50 + } + }, + "engineering_context": { + "type": "string", + "description": "Real-world engineering scenario" + } + } + }, + + "model": { + "type": "object", + "description": "NX model files and configuration", + "required": ["sim"], + "properties": { + "nx_part": { + "type": "object", + "description": "NX geometry part file", + "properties": { + "path": { + "type": "string", + "description": "Path to .prt file" + }, + "hash": { + "type": "string", + "description": "File hash for change detection" + }, + "idealized_part": { + "type": "string", + "description": "Idealized part filename (_i.prt)" + } + } + }, + "fem": { + "type": "object", + "description": "FEM mesh file", + "properties": { + "path": { + "type": "string", + "description": "Path to .fem file" + }, + "element_count": { + "type": "integer", + "description": "Number of elements" + }, + "node_count": { + "type": "integer", + "description": "Number of nodes" + } + } + }, + "sim": { + "type": "object", + "description": "Simulation file", + "required": ["path", "solver"], + "properties": { + "path": { + "type": "string", + "description": "Path to .sim file" + }, + "solver": { + "type": "string", + "description": "Solver type", + "enum": ["nastran", "NX_Nastran", "abaqus"] + }, + "solution_type": { + "type": "string", + "description": "Solution type (e.g., SOL101)", + "pattern": "^SOL\\d+$" + }, + "subcases": { + "type": "array", + "description": "Defined subcases", + "items": { + "type": "object", + "properties": { + "id": { + "type": "integer" + }, + "name": { + "type": "string" + }, + "type": { + "type": "string", + "enum": ["static", "modal", "thermal", "buckling"] + } + } + } + } + } + }, + "nx_settings": { + "type": "object", + "description": "NX runtime settings", + "properties": { + "nx_install_path": { + "type": "string" + }, + "simulation_timeout_s": { + "type": "integer", + "minimum": 60, + "maximum": 7200 + }, + "auto_start_nx": { + "type": "boolean" + } + } + } + } + }, + + "design_variable": { + "type": "object", + "description": "A design variable to optimize", + "required": ["id", "name", "expression_name", "type", "bounds"], + "properties": { + "id": { + "type": "string", + "description": "Unique identifier", + "pattern": "^dv_\\d{3}$" + }, + "name": { + "type": "string", + "description": "Human-readable name" + }, + "expression_name": { + "type": "string", + "description": "NX expression name (must match model)", + "pattern": "^[a-zA-Z_][a-zA-Z0-9_]*$" + }, + "type": { + "type": "string", + "description": "Variable type", + "enum": ["continuous", "integer", "categorical"] + }, + "bounds": { + "type": "object", + "description": "Value bounds", + "required": ["min", "max"], + "properties": { + "min": { + "type": "number" + }, + "max": { + "type": "number" + } + } + }, + "baseline": { + "type": "number", + "description": "Current/initial value" + }, + "units": { + "type": "string", + "description": "Physical units (mm, deg, etc.)" + }, + "step": { + "type": "number", + "description": "Step size for integer/discrete" + }, + "enabled": { + "type": "boolean", + "description": "Whether to include in optimization", + "default": true + }, + "description": { + "type": "string" + }, + "canvas_position": { + "$ref": "#/definitions/position" + } + } + }, + + "extractor": { + "type": "object", + "description": "Physics extractor that computes outputs from FEA", + "required": ["id", "name", "type", "outputs"], + "properties": { + "id": { + "type": "string", + "description": "Unique identifier", + "pattern": "^ext_\\d{3}$" + }, + "name": { + "type": "string", + "description": "Human-readable name" + }, + "type": { + "type": "string", + "description": "Extractor type", + "enum": [ + "displacement", + "frequency", + "stress", + "mass", + "mass_expression", + "zernike_opd", + "zernike_csv", + "temperature", + "custom_function" + ] + }, + "builtin": { + "type": "boolean", + "description": "Whether this is a built-in extractor", + "default": true + }, + "config": { + "type": "object", + "description": "Type-specific configuration", + "properties": { + "inner_radius_mm": { + "type": "number" + }, + "outer_radius_mm": { + "type": "number" + }, + "n_modes": { + "type": "integer" + }, + "filter_low_orders": { + "type": "integer" + }, + "displacement_unit": { + "type": "string" + }, + "reference_subcase": { + "type": "integer" + }, + "expression_name": { + "type": "string" + }, + "mode_number": { + "type": "integer" + }, + "element_type": { + "type": "string" + }, + "result_type": { + "type": "string" + }, + "metric": { + "type": "string" + } + } + }, + "function": { + "type": "object", + "description": "Custom function definition (for custom_function type)", + "properties": { + "name": { + "type": "string", + "description": "Function name" + }, + "module": { + "type": "string", + "description": "Python module path" + }, + "signature": { + "type": "string", + "description": "Function signature" + }, + "source_code": { + "type": "string", + "description": "Python source code" + } + } + }, + "outputs": { + "type": "array", + "description": "Output values this extractor produces", + "minItems": 1, + "items": { + "type": "object", + "required": ["name"], + "properties": { + "name": { + "type": "string", + "description": "Output name (used by objectives/constraints)" + }, + "metric": { + "type": "string", + "description": "Specific metric (max, total, rms, etc.)" + }, + "subcase": { + "type": "integer", + "description": "Subcase ID for this output" + }, + "units": { + "type": "string" + } + } + } + }, + "canvas_position": { + "$ref": "#/definitions/position" + } + } + }, + + "objective": { + "type": "object", + "description": "Optimization objective", + "required": ["id", "name", "direction", "source"], + "properties": { + "id": { + "type": "string", + "description": "Unique identifier", + "pattern": "^obj_\\d{3}$" + }, + "name": { + "type": "string", + "description": "Human-readable name" + }, + "direction": { + "type": "string", + "description": "Optimization direction", + "enum": ["minimize", "maximize"] + }, + "weight": { + "type": "number", + "description": "Weight for weighted sum (multi-objective)", + "minimum": 0, + "default": 1.0 + }, + "source": { + "type": "object", + "description": "Where the value comes from", + "required": ["extractor_id", "output_name"], + "properties": { + "extractor_id": { + "type": "string", + "description": "Reference to extractor" + }, + "output_name": { + "type": "string", + "description": "Which output from the extractor" + } + } + }, + "target": { + "type": "number", + "description": "Target value (for goal programming)" + }, + "units": { + "type": "string" + }, + "description": { + "type": "string" + }, + "canvas_position": { + "$ref": "#/definitions/position" + } + } + }, + + "constraint": { + "type": "object", + "description": "Hard or soft constraint", + "required": ["id", "name", "type", "operator", "threshold", "source"], + "properties": { + "id": { + "type": "string", + "description": "Unique identifier", + "pattern": "^con_\\d{3}$" + }, + "name": { + "type": "string" + }, + "type": { + "type": "string", + "description": "Constraint type", + "enum": ["hard", "soft"] + }, + "operator": { + "type": "string", + "description": "Comparison operator", + "enum": ["<=", ">=", "<", ">", "=="] + }, + "threshold": { + "type": "number", + "description": "Constraint threshold value" + }, + "source": { + "type": "object", + "description": "Where the value comes from", + "required": ["extractor_id", "output_name"], + "properties": { + "extractor_id": { + "type": "string" + }, + "output_name": { + "type": "string" + } + } + }, + "penalty_config": { + "type": "object", + "description": "Penalty method configuration", + "properties": { + "method": { + "type": "string", + "enum": ["linear", "quadratic", "exponential"] + }, + "weight": { + "type": "number" + }, + "margin": { + "type": "number", + "description": "Soft margin before penalty kicks in" + } + } + }, + "description": { + "type": "string" + }, + "canvas_position": { + "$ref": "#/definitions/position" + } + } + }, + + "optimization": { + "type": "object", + "description": "Optimization algorithm configuration", + "required": ["algorithm", "budget"], + "properties": { + "algorithm": { + "type": "object", + "required": ["type"], + "properties": { + "type": { + "type": "string", + "description": "Algorithm type", + "enum": ["TPE", "CMA-ES", "NSGA-II", "RandomSearch", "SAT_v3", "GP-BO"] + }, + "config": { + "type": "object", + "description": "Algorithm-specific settings", + "properties": { + "population_size": { + "type": "integer" + }, + "n_generations": { + "type": "integer" + }, + "mutation_prob": { + "type": ["number", "null"] + }, + "crossover_prob": { + "type": "number" + }, + "seed": { + "type": "integer" + }, + "n_startup_trials": { + "type": "integer" + }, + "sigma0": { + "type": "number" + } + } + } + } + }, + "budget": { + "type": "object", + "description": "Computational budget", + "properties": { + "max_trials": { + "type": "integer", + "minimum": 1, + "maximum": 10000 + }, + "max_time_hours": { + "type": "number" + }, + "convergence_patience": { + "type": "integer", + "description": "Stop if no improvement for N trials" + } + } + }, + "surrogate": { + "type": "object", + "description": "Neural surrogate configuration", + "properties": { + "enabled": { + "type": "boolean" + }, + "type": { + "type": "string", + "enum": ["MLP", "GNN", "ensemble"] + }, + "config": { + "type": "object", + "properties": { + "n_models": { + "type": "integer" + }, + "architecture": { + "type": "array", + "items": { + "type": "integer" + } + }, + "train_every_n_trials": { + "type": "integer" + }, + "min_training_samples": { + "type": "integer" + }, + "acquisition_candidates": { + "type": "integer" + }, + "fea_validations_per_round": { + "type": "integer" + } + } + } + } + }, + "canvas_position": { + "$ref": "#/definitions/position" + } + } + }, + + "workflow": { + "type": "object", + "description": "Multi-stage optimization workflow", + "properties": { + "stages": { + "type": "array", + "items": { + "type": "object", + "properties": { + "id": { + "type": "string" + }, + "name": { + "type": "string" + }, + "algorithm": { + "type": "string" + }, + "trials": { + "type": "integer" + }, + "purpose": { + "type": "string" + } + } + } + }, + "transitions": { + "type": "array", + "items": { + "type": "object", + "properties": { + "from": { + "type": "string" + }, + "to": { + "type": "string" + }, + "condition": { + "type": "string" + } + } + } + } + } + }, + + "reporting": { + "type": "object", + "description": "Reporting configuration", + "properties": { + "auto_report": { + "type": "boolean" + }, + "report_triggers": { + "type": "array", + "items": { + "type": "string" + } + }, + "insights": { + "type": "array", + "items": { + "type": "object", + "properties": { + "type": { + "type": "string" + }, + "for_trials": { + "type": "string" + }, + "config": { + "type": "object" + } + } + } + } + } + }, + + "canvas": { + "type": "object", + "description": "Canvas UI state (persisted for reconstruction)", + "properties": { + "layout_version": { + "type": "string" + }, + "viewport": { + "type": "object", + "properties": { + "x": { + "type": "number" + }, + "y": { + "type": "number" + }, + "zoom": { + "type": "number" + } + } + }, + "edges": { + "type": "array", + "description": "Connections between nodes", + "items": { + "type": "object", + "required": ["source", "target"], + "properties": { + "source": { + "type": "string" + }, + "target": { + "type": "string" + }, + "sourceHandle": { + "type": "string" + }, + "targetHandle": { + "type": "string" + } + } + } + }, + "groups": { + "type": "array", + "description": "Node groupings for organization", + "items": { + "type": "object", + "properties": { + "id": { + "type": "string" + }, + "name": { + "type": "string" + }, + "node_ids": { + "type": "array", + "items": { + "type": "string" + } + } + } + } + } + } + }, + + "position": { + "type": "object", + "description": "Canvas position", + "properties": { + "x": { + "type": "number" + }, + "y": { + "type": "number" + } + } + } + } +} diff --git a/studies/Drone_Gimbal/drone_gimbal_arm_optimization/atomizer_spec.json b/studies/Drone_Gimbal/drone_gimbal_arm_optimization/atomizer_spec.json new file mode 100644 index 00000000..cc199240 --- /dev/null +++ b/studies/Drone_Gimbal/drone_gimbal_arm_optimization/atomizer_spec.json @@ -0,0 +1,287 @@ +{ + "meta": { + "version": "2.0", + "created": "2026-01-17T15:35:12.010333Z", + "modified": "2026-01-17T15:35:12.010333Z", + "created_by": "migration", + "modified_by": "migration", + "study_name": "drone_gimbal_arm_optimization", + "description": "Drone Camera Gimbal Support Arm - Multi-Objective Lightweight Design", + "tags": [] + }, + "model": { + "sim": { + "path": "1_setup\\model\\Beam_sim1.sim", + "solver": "nastran" + } + }, + "design_variables": [ + { + "id": "dv_001", + "name": "param_1", + "expression_name": "beam_half_core_thickness", + "type": "continuous", + "bounds": { + "min": 5, + "max": 10 + }, + "baseline": null, + "units": "", + "enabled": true, + "description": "Half thickness of beam core (mm) - affects weight and stiffness", + "canvas_position": { + "x": 50, + "y": 100 + } + }, + { + "id": "dv_002", + "name": "param_2", + "expression_name": "beam_face_thickness", + "type": "continuous", + "bounds": { + "min": 1, + "max": 3 + }, + "baseline": null, + "units": "", + "enabled": true, + "description": "Thickness of beam face sheets (mm) - bending resistance", + "canvas_position": { + "x": 50, + "y": 180 + } + }, + { + "id": "dv_003", + "name": "param_3", + "expression_name": "holes_diameter", + "type": "continuous", + "bounds": { + "min": 10, + "max": 50 + }, + "baseline": null, + "units": "", + "enabled": true, + "description": "Diameter of lightening holes (mm) - weight reduction", + "canvas_position": { + "x": 50, + "y": 260 + } + }, + { + "id": "dv_004", + "name": "param_4", + "expression_name": "hole_count", + "type": "continuous", + "bounds": { + "min": 8, + "max": 14 + }, + "baseline": null, + "units": "", + "enabled": true, + "description": "Number of lightening holes - balance weight vs strength", + "canvas_position": { + "x": 50, + "y": 340 + } + } + ], + "extractors": [ + { + "id": "ext_001", + "name": "Mass Extractor", + "type": "mass", + "builtin": true, + "outputs": [ + { + "name": "mass", + "metric": "total" + } + ], + "canvas_position": { + "x": 740, + "y": 100 + } + } + ], + "objectives": [ + { + "id": "obj_001", + "name": "Total mass (grams) - minimize for longer flight time", + "direction": "minimize", + "weight": 1.0, + "source": { + "extractor_id": "ext_001", + "output_name": "mass" + }, + "target": 4000, + "units": "", + "canvas_position": { + "x": 1020, + "y": 100 + } + }, + { + "id": "obj_002", + "name": "First natural frequency (Hz) - avoid rotor resonance", + "direction": "maximize", + "weight": 1.0, + "source": { + "extractor_id": "ext_001", + "output_name": "fundamental_frequency" + }, + "target": 150, + "units": "", + "canvas_position": { + "x": 1020, + "y": 200 + } + } + ], + "constraints": [ + { + "id": "con_001", + "name": "Maximum tip displacement under 850g camera load < 1.5mm for image stabilization", + "type": "hard", + "operator": "<", + "threshold": 1.5, + "source": { + "extractor_id": "ext_001", + "output_name": "mass" + }, + "penalty_config": { + "method": "quadratic", + "weight": 1000.0 + }, + "canvas_position": { + "x": 1020, + "y": 400 + } + }, + { + "id": "con_002", + "name": "Maximum von Mises stress < 120 MPa (Al 6061-T6, SF=2.3)", + "type": "hard", + "operator": "<", + "threshold": 120, + "source": { + "extractor_id": "ext_001", + "output_name": "mass" + }, + "penalty_config": { + "method": "quadratic", + "weight": 1000.0 + }, + "canvas_position": { + "x": 1020, + "y": 500 + } + }, + { + "id": "con_003", + "name": "Natural frequency > 150 Hz to avoid rotor frequencies (80-120 Hz safety margin)", + "type": "hard", + "operator": ">", + "threshold": 150, + "source": { + "extractor_id": "ext_001", + "output_name": "mass" + }, + "penalty_config": { + "method": "quadratic", + "weight": 1000.0 + }, + "canvas_position": { + "x": 1020, + "y": 600 + } + } + ], + "optimization": { + "algorithm": { + "type": "TPE", + "config": { + "n_startup_trials": 10 + } + }, + "budget": { + "max_trials": 30 + }, + "canvas_position": { + "x": 1300, + "y": 150 + } + }, + "canvas": { + "edges": [ + { + "source": "dv_001", + "target": "model" + }, + { + "source": "dv_002", + "target": "model" + }, + { + "source": "dv_003", + "target": "model" + }, + { + "source": "dv_004", + "target": "model" + }, + { + "source": "model", + "target": "solver" + }, + { + "source": "solver", + "target": "ext_001" + }, + { + "source": "ext_001", + "target": "obj_001" + }, + { + "source": "ext_001", + "target": "obj_002" + }, + { + "source": "ext_001", + "target": "con_001" + }, + { + "source": "ext_001", + "target": "con_002" + }, + { + "source": "ext_001", + "target": "con_003" + }, + { + "source": "obj_001", + "target": "optimization" + }, + { + "source": "obj_002", + "target": "optimization" + }, + { + "source": "con_001", + "target": "optimization" + }, + { + "source": "con_002", + "target": "optimization" + }, + { + "source": "con_003", + "target": "optimization" + } + ], + "layout_version": "2.0" + } +} \ No newline at end of file diff --git a/studies/M1_Mirror/m1_mirror_adaptive_V11/atomizer_spec.json b/studies/M1_Mirror/m1_mirror_adaptive_V11/atomizer_spec.json new file mode 100644 index 00000000..005638a4 --- /dev/null +++ b/studies/M1_Mirror/m1_mirror_adaptive_V11/atomizer_spec.json @@ -0,0 +1,406 @@ +{ + "meta": { + "version": "2.0", + "created": "2026-01-17T15:35:12.012625Z", + "modified": "2026-01-17T15:35:12.012625Z", + "created_by": "migration", + "modified_by": "migration", + "study_name": "m1_mirror_adaptive_v11", + "description": "V11 - Adaptive surrogate optimization with real FEA validation. Cross-links V10 training data. NN/FEA trial differentiation for dashboard.", + "tags": [ + "mirror", + "zernike" + ] + }, + "model": { + "sim": { + "path": "ASSY_M1_assyfem1_sim1.sim", + "solver": "nastran" + }, + "nx_settings": { + "nx_install_path": "C:\\Program Files\\Siemens\\NX2506", + "simulation_timeout_s": 600 + } + }, + "design_variables": [ + { + "id": "dv_001", + "name": "lateral_inner_angle", + "expression_name": "lateral_inner_angle", + "type": "continuous", + "bounds": { + "min": 25.0, + "max": 28.5 + }, + "baseline": 26.79, + "units": "degrees", + "enabled": true, + "description": "", + "canvas_position": { + "x": 50, + "y": 100 + } + }, + { + "id": "dv_002", + "name": "lateral_outer_angle", + "expression_name": "lateral_outer_angle", + "type": "continuous", + "bounds": { + "min": 13.0, + "max": 17.0 + }, + "baseline": 14.64, + "units": "degrees", + "enabled": true, + "description": "", + "canvas_position": { + "x": 50, + "y": 180 + } + }, + { + "id": "dv_003", + "name": "lateral_outer_pivot", + "expression_name": "lateral_outer_pivot", + "type": "continuous", + "bounds": { + "min": 9.0, + "max": 12.0 + }, + "baseline": 10.4, + "units": "mm", + "enabled": true, + "description": "", + "canvas_position": { + "x": 50, + "y": 260 + } + }, + { + "id": "dv_004", + "name": "lateral_inner_pivot", + "expression_name": "lateral_inner_pivot", + "type": "continuous", + "bounds": { + "min": 9.0, + "max": 12.0 + }, + "baseline": 10.07, + "units": "mm", + "enabled": true, + "description": "", + "canvas_position": { + "x": 50, + "y": 340 + } + }, + { + "id": "dv_005", + "name": "lateral_middle_pivot", + "expression_name": "lateral_middle_pivot", + "type": "continuous", + "bounds": { + "min": 18.0, + "max": 23.0 + }, + "baseline": 20.73, + "units": "mm", + "enabled": true, + "description": "", + "canvas_position": { + "x": 50, + "y": 420 + } + }, + { + "id": "dv_006", + "name": "lateral_closeness", + "expression_name": "lateral_closeness", + "type": "continuous", + "bounds": { + "min": 9.5, + "max": 12.5 + }, + "baseline": 11.02, + "units": "mm", + "enabled": true, + "description": "", + "canvas_position": { + "x": 50, + "y": 500 + } + }, + { + "id": "dv_007", + "name": "whiffle_min", + "expression_name": "whiffle_min", + "type": "continuous", + "bounds": { + "min": 35.0, + "max": 55.0 + }, + "baseline": 40.55, + "units": "mm", + "enabled": true, + "description": "", + "canvas_position": { + "x": 50, + "y": 580 + } + }, + { + "id": "dv_008", + "name": "whiffle_outer_to_vertical", + "expression_name": "whiffle_outer_to_vertical", + "type": "continuous", + "bounds": { + "min": 68.0, + "max": 80.0 + }, + "baseline": 75.67, + "units": "degrees", + "enabled": true, + "description": "", + "canvas_position": { + "x": 50, + "y": 660 + } + }, + { + "id": "dv_009", + "name": "whiffle_triangle_closeness", + "expression_name": "whiffle_triangle_closeness", + "type": "continuous", + "bounds": { + "min": 50.0, + "max": 65.0 + }, + "baseline": 60.0, + "units": "mm", + "enabled": true, + "description": "", + "canvas_position": { + "x": 50, + "y": 740 + } + }, + { + "id": "dv_010", + "name": "blank_backface_angle", + "expression_name": "blank_backface_angle", + "type": "continuous", + "bounds": { + "min": 4, + "max": 5.0 + }, + "baseline": 4.23, + "units": "degrees", + "enabled": true, + "description": "", + "canvas_position": { + "x": 50, + "y": 820 + } + }, + { + "id": "dv_011", + "name": "inner_circular_rib_dia", + "expression_name": "inner_circular_rib_dia", + "type": "continuous", + "bounds": { + "min": 480.0, + "max": 620.0 + }, + "baseline": 534.0, + "units": "mm", + "enabled": true, + "description": "", + "canvas_position": { + "x": 50, + "y": 900 + } + } + ], + "extractors": [ + { + "id": "ext_001", + "name": "Zernike WFE Extractor", + "type": "zernike_opd", + "builtin": true, + "config": { + "inner_radius_mm": 0, + "outer_radius_mm": 500.0, + "n_modes": 50, + "filter_low_orders": 4, + "displacement_unit": "mm", + "reference_subcase": 2 + }, + "outputs": [ + { + "name": "rel_filtered_rms_40_vs_20", + "metric": "filtered_rms_nm" + }, + { + "name": "rel_filtered_rms_60_vs_20", + "metric": "filtered_rms_nm" + }, + { + "name": "mfg_90_optician_workload", + "metric": "filtered_rms_nm" + } + ], + "canvas_position": { + "x": 740, + "y": 100 + } + } + ], + "objectives": [ + { + "id": "obj_001", + "name": "Filtered RMS WFE at 40 deg relative to 20 deg reference (operational tracking)", + "direction": "minimize", + "weight": 5.0, + "source": { + "extractor_id": "ext_001", + "output_name": "rel_filtered_rms_40_vs_20" + }, + "target": 4.0, + "units": "nm", + "canvas_position": { + "x": 1020, + "y": 100 + } + }, + { + "id": "obj_002", + "name": "Filtered RMS WFE at 60 deg relative to 20 deg reference (operational tracking)", + "direction": "minimize", + "weight": 5.0, + "source": { + "extractor_id": "ext_001", + "output_name": "rel_filtered_rms_60_vs_20" + }, + "target": 10.0, + "units": "nm", + "canvas_position": { + "x": 1020, + "y": 200 + } + }, + { + "id": "obj_003", + "name": "Manufacturing deformation at 90 deg polishing (J1-J3 filtered RMS)", + "direction": "minimize", + "weight": 1.0, + "source": { + "extractor_id": "ext_001", + "output_name": "mfg_90_optician_workload" + }, + "target": 20.0, + "units": "nm", + "canvas_position": { + "x": 1020, + "y": 300 + } + } + ], + "constraints": [], + "optimization": { + "algorithm": { + "type": "TPE", + "config": { + "n_startup_trials": 10 + } + }, + "budget": { + "max_trials": 100 + }, + "canvas_position": { + "x": 1300, + "y": 150 + } + }, + "canvas": { + "edges": [ + { + "source": "dv_001", + "target": "model" + }, + { + "source": "dv_002", + "target": "model" + }, + { + "source": "dv_003", + "target": "model" + }, + { + "source": "dv_004", + "target": "model" + }, + { + "source": "dv_005", + "target": "model" + }, + { + "source": "dv_006", + "target": "model" + }, + { + "source": "dv_007", + "target": "model" + }, + { + "source": "dv_008", + "target": "model" + }, + { + "source": "dv_009", + "target": "model" + }, + { + "source": "dv_010", + "target": "model" + }, + { + "source": "dv_011", + "target": "model" + }, + { + "source": "model", + "target": "solver" + }, + { + "source": "solver", + "target": "ext_001" + }, + { + "source": "ext_001", + "target": "obj_001" + }, + { + "source": "ext_001", + "target": "obj_002" + }, + { + "source": "ext_001", + "target": "obj_003" + }, + { + "source": "obj_001", + "target": "optimization" + }, + { + "source": "obj_002", + "target": "optimization" + }, + { + "source": "obj_003", + "target": "optimization" + } + ], + "layout_version": "2.0" + } +} \ No newline at end of file diff --git a/studies/M1_Mirror/m1_mirror_adaptive_V12/atomizer_spec.json b/studies/M1_Mirror/m1_mirror_adaptive_V12/atomizer_spec.json new file mode 100644 index 00000000..39c4b2ad --- /dev/null +++ b/studies/M1_Mirror/m1_mirror_adaptive_V12/atomizer_spec.json @@ -0,0 +1,454 @@ +{ + "meta": { + "version": "2.0", + "created": "2026-01-17T15:35:12.013676Z", + "modified": "2026-01-17T15:35:12.013676Z", + "created_by": "migration", + "modified_by": "migration", + "study_name": "m1_mirror_adaptive_v12", + "description": "V12 - Adaptive optimization with tuned hyperparameters, ensemble surrogate, and mass constraint (<99kg).", + "tags": [ + "mirror", + "zernike" + ] + }, + "model": { + "sim": { + "path": "ASSY_M1_assyfem1_sim1.sim", + "solver": "nastran" + }, + "nx_settings": { + "nx_install_path": "C:\\Program Files\\Siemens\\NX2506", + "simulation_timeout_s": 900 + } + }, + "design_variables": [ + { + "id": "dv_001", + "name": "lateral_inner_angle", + "expression_name": "lateral_inner_angle", + "type": "continuous", + "bounds": { + "min": 25.0, + "max": 28.5 + }, + "baseline": 26.79, + "units": "degrees", + "enabled": true, + "description": "", + "canvas_position": { + "x": 50, + "y": 100 + } + }, + { + "id": "dv_002", + "name": "lateral_outer_angle", + "expression_name": "lateral_outer_angle", + "type": "continuous", + "bounds": { + "min": 13.0, + "max": 17.0 + }, + "baseline": 14.64, + "units": "degrees", + "enabled": true, + "description": "", + "canvas_position": { + "x": 50, + "y": 180 + } + }, + { + "id": "dv_003", + "name": "lateral_outer_pivot", + "expression_name": "lateral_outer_pivot", + "type": "continuous", + "bounds": { + "min": 9.0, + "max": 12.0 + }, + "baseline": 10.4, + "units": "mm", + "enabled": true, + "description": "", + "canvas_position": { + "x": 50, + "y": 260 + } + }, + { + "id": "dv_004", + "name": "lateral_inner_pivot", + "expression_name": "lateral_inner_pivot", + "type": "continuous", + "bounds": { + "min": 9.0, + "max": 12.0 + }, + "baseline": 10.07, + "units": "mm", + "enabled": true, + "description": "", + "canvas_position": { + "x": 50, + "y": 340 + } + }, + { + "id": "dv_005", + "name": "lateral_middle_pivot", + "expression_name": "lateral_middle_pivot", + "type": "continuous", + "bounds": { + "min": 18.0, + "max": 23.0 + }, + "baseline": 20.73, + "units": "mm", + "enabled": true, + "description": "", + "canvas_position": { + "x": 50, + "y": 420 + } + }, + { + "id": "dv_006", + "name": "lateral_closeness", + "expression_name": "lateral_closeness", + "type": "continuous", + "bounds": { + "min": 9.5, + "max": 12.5 + }, + "baseline": 11.02, + "units": "mm", + "enabled": true, + "description": "", + "canvas_position": { + "x": 50, + "y": 500 + } + }, + { + "id": "dv_007", + "name": "whiffle_min", + "expression_name": "whiffle_min", + "type": "continuous", + "bounds": { + "min": 35.0, + "max": 55.0 + }, + "baseline": 40.55, + "units": "mm", + "enabled": true, + "description": "", + "canvas_position": { + "x": 50, + "y": 580 + } + }, + { + "id": "dv_008", + "name": "whiffle_outer_to_vertical", + "expression_name": "whiffle_outer_to_vertical", + "type": "continuous", + "bounds": { + "min": 68.0, + "max": 80.0 + }, + "baseline": 75.67, + "units": "degrees", + "enabled": true, + "description": "", + "canvas_position": { + "x": 50, + "y": 660 + } + }, + { + "id": "dv_009", + "name": "whiffle_triangle_closeness", + "expression_name": "whiffle_triangle_closeness", + "type": "continuous", + "bounds": { + "min": 50.0, + "max": 65.0 + }, + "baseline": 60.0, + "units": "mm", + "enabled": true, + "description": "", + "canvas_position": { + "x": 50, + "y": 740 + } + }, + { + "id": "dv_010", + "name": "blank_backface_angle", + "expression_name": "blank_backface_angle", + "type": "continuous", + "bounds": { + "min": 4, + "max": 5.0 + }, + "baseline": 4.23, + "units": "degrees", + "enabled": true, + "description": "", + "canvas_position": { + "x": 50, + "y": 820 + } + }, + { + "id": "dv_011", + "name": "inner_circular_rib_dia", + "expression_name": "inner_circular_rib_dia", + "type": "continuous", + "bounds": { + "min": 480.0, + "max": 620.0 + }, + "baseline": 534.0, + "units": "mm", + "enabled": true, + "description": "", + "canvas_position": { + "x": 50, + "y": 900 + } + } + ], + "extractors": [ + { + "id": "ext_001", + "name": "Zernike WFE Extractor", + "type": "zernike_opd", + "builtin": true, + "config": { + "inner_radius_mm": 0, + "outer_radius_mm": 500.0, + "n_modes": 50, + "filter_low_orders": 4, + "displacement_unit": "mm", + "reference_subcase": 2 + }, + "outputs": [ + { + "name": "rel_filtered_rms_40_vs_20", + "metric": "filtered_rms_nm" + }, + { + "name": "rel_filtered_rms_60_vs_20", + "metric": "filtered_rms_nm" + }, + { + "name": "mfg_90_optician_workload", + "metric": "filtered_rms_nm" + } + ], + "canvas_position": { + "x": 740, + "y": 100 + } + }, + { + "id": "ext_002", + "name": "Mass Extractor", + "type": "mass", + "builtin": true, + "outputs": [ + { + "name": "mass_kg", + "metric": "total" + } + ], + "canvas_position": { + "x": 740, + "y": 250 + } + } + ], + "objectives": [ + { + "id": "obj_001", + "name": "Filtered RMS WFE at 40 deg relative to 20 deg reference (operational tracking)", + "direction": "minimize", + "weight": 5.0, + "source": { + "extractor_id": "ext_001", + "output_name": "rel_filtered_rms_40_vs_20" + }, + "target": 4.0, + "units": "nm", + "canvas_position": { + "x": 1020, + "y": 100 + } + }, + { + "id": "obj_002", + "name": "Filtered RMS WFE at 60 deg relative to 20 deg reference (operational tracking)", + "direction": "minimize", + "weight": 5.0, + "source": { + "extractor_id": "ext_001", + "output_name": "rel_filtered_rms_60_vs_20" + }, + "target": 10.0, + "units": "nm", + "canvas_position": { + "x": 1020, + "y": 200 + } + }, + { + "id": "obj_003", + "name": "Manufacturing deformation at 90 deg polishing (J1-J3 filtered RMS)", + "direction": "minimize", + "weight": 1.0, + "source": { + "extractor_id": "ext_001", + "output_name": "mfg_90_optician_workload" + }, + "target": 20.0, + "units": "nm", + "canvas_position": { + "x": 1020, + "y": 300 + } + } + ], + "constraints": [ + { + "id": "con_001", + "name": "Mirror assembly mass must be under 99kg", + "type": "hard", + "operator": "<=", + "threshold": 0, + "source": { + "extractor_id": "ext_002", + "output_name": "mass_kg" + }, + "penalty_config": { + "method": "quadratic", + "weight": 100.0 + }, + "canvas_position": { + "x": 1020, + "y": 400 + } + } + ], + "optimization": { + "algorithm": { + "type": "TPE", + "config": { + "n_startup_trials": 10 + } + }, + "budget": { + "max_trials": 100 + }, + "canvas_position": { + "x": 1300, + "y": 150 + } + }, + "canvas": { + "edges": [ + { + "source": "dv_001", + "target": "model" + }, + { + "source": "dv_002", + "target": "model" + }, + { + "source": "dv_003", + "target": "model" + }, + { + "source": "dv_004", + "target": "model" + }, + { + "source": "dv_005", + "target": "model" + }, + { + "source": "dv_006", + "target": "model" + }, + { + "source": "dv_007", + "target": "model" + }, + { + "source": "dv_008", + "target": "model" + }, + { + "source": "dv_009", + "target": "model" + }, + { + "source": "dv_010", + "target": "model" + }, + { + "source": "dv_011", + "target": "model" + }, + { + "source": "model", + "target": "solver" + }, + { + "source": "solver", + "target": "ext_001" + }, + { + "source": "solver", + "target": "ext_002" + }, + { + "source": "ext_001", + "target": "obj_001" + }, + { + "source": "ext_001", + "target": "obj_002" + }, + { + "source": "ext_001", + "target": "obj_003" + }, + { + "source": "ext_002", + "target": "con_001" + }, + { + "source": "obj_001", + "target": "optimization" + }, + { + "source": "obj_002", + "target": "optimization" + }, + { + "source": "obj_003", + "target": "optimization" + }, + { + "source": "con_001", + "target": "optimization" + } + ], + "layout_version": "2.0" + } +} \ No newline at end of file diff --git a/studies/M1_Mirror/m1_mirror_adaptive_V13/atomizer_spec.json b/studies/M1_Mirror/m1_mirror_adaptive_V13/atomizer_spec.json new file mode 100644 index 00000000..630950ae --- /dev/null +++ b/studies/M1_Mirror/m1_mirror_adaptive_V13/atomizer_spec.json @@ -0,0 +1,406 @@ +{ + "meta": { + "version": "2.0", + "created": "2026-01-17T15:35:12.015282Z", + "modified": "2026-01-17T15:35:12.015282Z", + "created_by": "migration", + "modified_by": "migration", + "study_name": "m1_mirror_adaptive_v13", + "description": "V13 - Pure NSGA-II multi-objective optimization with FEA only. No surrogate. Seeds from V11+V12 FEA data.", + "tags": [ + "mirror", + "zernike" + ] + }, + "model": { + "sim": { + "path": "ASSY_M1_assyfem1_sim1.sim", + "solver": "nastran" + }, + "nx_settings": { + "nx_install_path": "C:\\Program Files\\Siemens\\NX2506", + "simulation_timeout_s": 600 + } + }, + "design_variables": [ + { + "id": "dv_001", + "name": "lateral_inner_angle", + "expression_name": "lateral_inner_angle", + "type": "continuous", + "bounds": { + "min": 25.0, + "max": 28.5 + }, + "baseline": 26.79, + "units": "degrees", + "enabled": true, + "description": "", + "canvas_position": { + "x": 50, + "y": 100 + } + }, + { + "id": "dv_002", + "name": "lateral_outer_angle", + "expression_name": "lateral_outer_angle", + "type": "continuous", + "bounds": { + "min": 13.0, + "max": 17.0 + }, + "baseline": 14.64, + "units": "degrees", + "enabled": true, + "description": "", + "canvas_position": { + "x": 50, + "y": 180 + } + }, + { + "id": "dv_003", + "name": "lateral_outer_pivot", + "expression_name": "lateral_outer_pivot", + "type": "continuous", + "bounds": { + "min": 9.0, + "max": 12.0 + }, + "baseline": 10.4, + "units": "mm", + "enabled": true, + "description": "", + "canvas_position": { + "x": 50, + "y": 260 + } + }, + { + "id": "dv_004", + "name": "lateral_inner_pivot", + "expression_name": "lateral_inner_pivot", + "type": "continuous", + "bounds": { + "min": 9.0, + "max": 12.0 + }, + "baseline": 10.07, + "units": "mm", + "enabled": true, + "description": "", + "canvas_position": { + "x": 50, + "y": 340 + } + }, + { + "id": "dv_005", + "name": "lateral_middle_pivot", + "expression_name": "lateral_middle_pivot", + "type": "continuous", + "bounds": { + "min": 18.0, + "max": 23.0 + }, + "baseline": 20.73, + "units": "mm", + "enabled": true, + "description": "", + "canvas_position": { + "x": 50, + "y": 420 + } + }, + { + "id": "dv_006", + "name": "lateral_closeness", + "expression_name": "lateral_closeness", + "type": "continuous", + "bounds": { + "min": 9.5, + "max": 12.5 + }, + "baseline": 11.02, + "units": "mm", + "enabled": true, + "description": "", + "canvas_position": { + "x": 50, + "y": 500 + } + }, + { + "id": "dv_007", + "name": "whiffle_min", + "expression_name": "whiffle_min", + "type": "continuous", + "bounds": { + "min": 35.0, + "max": 55.0 + }, + "baseline": 40.55, + "units": "mm", + "enabled": true, + "description": "", + "canvas_position": { + "x": 50, + "y": 580 + } + }, + { + "id": "dv_008", + "name": "whiffle_outer_to_vertical", + "expression_name": "whiffle_outer_to_vertical", + "type": "continuous", + "bounds": { + "min": 68.0, + "max": 80.0 + }, + "baseline": 75.67, + "units": "degrees", + "enabled": true, + "description": "", + "canvas_position": { + "x": 50, + "y": 660 + } + }, + { + "id": "dv_009", + "name": "whiffle_triangle_closeness", + "expression_name": "whiffle_triangle_closeness", + "type": "continuous", + "bounds": { + "min": 50.0, + "max": 65.0 + }, + "baseline": 60.0, + "units": "mm", + "enabled": true, + "description": "", + "canvas_position": { + "x": 50, + "y": 740 + } + }, + { + "id": "dv_010", + "name": "blank_backface_angle", + "expression_name": "blank_backface_angle", + "type": "continuous", + "bounds": { + "min": 4, + "max": 5.0 + }, + "baseline": 4.23, + "units": "degrees", + "enabled": true, + "description": "", + "canvas_position": { + "x": 50, + "y": 820 + } + }, + { + "id": "dv_011", + "name": "inner_circular_rib_dia", + "expression_name": "inner_circular_rib_dia", + "type": "continuous", + "bounds": { + "min": 480.0, + "max": 620.0 + }, + "baseline": 534.0, + "units": "mm", + "enabled": true, + "description": "", + "canvas_position": { + "x": 50, + "y": 900 + } + } + ], + "extractors": [ + { + "id": "ext_001", + "name": "Zernike WFE Extractor", + "type": "zernike_opd", + "builtin": true, + "config": { + "inner_radius_mm": 0, + "outer_radius_mm": 500.0, + "n_modes": 50, + "filter_low_orders": 4, + "displacement_unit": "mm", + "reference_subcase": 2 + }, + "outputs": [ + { + "name": "rel_filtered_rms_40_vs_20", + "metric": "filtered_rms_nm" + }, + { + "name": "rel_filtered_rms_60_vs_20", + "metric": "filtered_rms_nm" + }, + { + "name": "mfg_90_optician_workload", + "metric": "filtered_rms_nm" + } + ], + "canvas_position": { + "x": 740, + "y": 100 + } + } + ], + "objectives": [ + { + "id": "obj_001", + "name": "Filtered RMS WFE at 40 deg relative to 20 deg reference (operational tracking)", + "direction": "minimize", + "weight": 5.0, + "source": { + "extractor_id": "ext_001", + "output_name": "rel_filtered_rms_40_vs_20" + }, + "target": 4.0, + "units": "nm", + "canvas_position": { + "x": 1020, + "y": 100 + } + }, + { + "id": "obj_002", + "name": "Filtered RMS WFE at 60 deg relative to 20 deg reference (operational tracking)", + "direction": "minimize", + "weight": 5.0, + "source": { + "extractor_id": "ext_001", + "output_name": "rel_filtered_rms_60_vs_20" + }, + "target": 10.0, + "units": "nm", + "canvas_position": { + "x": 1020, + "y": 200 + } + }, + { + "id": "obj_003", + "name": "Manufacturing deformation at 90 deg polishing (J1-J3 filtered RMS)", + "direction": "minimize", + "weight": 1.0, + "source": { + "extractor_id": "ext_001", + "output_name": "mfg_90_optician_workload" + }, + "target": 20.0, + "units": "nm", + "canvas_position": { + "x": 1020, + "y": 300 + } + } + ], + "constraints": [], + "optimization": { + "algorithm": { + "type": "TPE", + "config": { + "n_startup_trials": 10 + } + }, + "budget": { + "max_trials": 100 + }, + "canvas_position": { + "x": 1300, + "y": 150 + } + }, + "canvas": { + "edges": [ + { + "source": "dv_001", + "target": "model" + }, + { + "source": "dv_002", + "target": "model" + }, + { + "source": "dv_003", + "target": "model" + }, + { + "source": "dv_004", + "target": "model" + }, + { + "source": "dv_005", + "target": "model" + }, + { + "source": "dv_006", + "target": "model" + }, + { + "source": "dv_007", + "target": "model" + }, + { + "source": "dv_008", + "target": "model" + }, + { + "source": "dv_009", + "target": "model" + }, + { + "source": "dv_010", + "target": "model" + }, + { + "source": "dv_011", + "target": "model" + }, + { + "source": "model", + "target": "solver" + }, + { + "source": "solver", + "target": "ext_001" + }, + { + "source": "ext_001", + "target": "obj_001" + }, + { + "source": "ext_001", + "target": "obj_002" + }, + { + "source": "ext_001", + "target": "obj_003" + }, + { + "source": "obj_001", + "target": "optimization" + }, + { + "source": "obj_002", + "target": "optimization" + }, + { + "source": "obj_003", + "target": "optimization" + } + ], + "layout_version": "2.0" + } +} \ No newline at end of file diff --git a/studies/M1_Mirror/m1_mirror_adaptive_V14/atomizer_spec.json b/studies/M1_Mirror/m1_mirror_adaptive_V14/atomizer_spec.json new file mode 100644 index 00000000..2260a55d --- /dev/null +++ b/studies/M1_Mirror/m1_mirror_adaptive_V14/atomizer_spec.json @@ -0,0 +1,406 @@ +{ + "meta": { + "version": "2.0", + "created": "2026-01-17T15:35:12.016335Z", + "modified": "2026-01-17T15:35:12.016335Z", + "created_by": "migration", + "modified_by": "migration", + "study_name": "m1_mirror_adaptive_v14", + "description": "V14 continuation - TPE with expanded bounds based on V14 analysis. 4 params were at bounds: lateral_middle_pivot (99.4%), whiffle_min (96.3%), lateral_outer_angle (4.7%), lateral_inner_pivot (8.1%).", + "tags": [ + "mirror", + "zernike" + ] + }, + "model": { + "sim": { + "path": "ASSY_M1_assyfem1_sim1.sim", + "solver": "nastran" + }, + "nx_settings": { + "nx_install_path": "C:\\Program Files\\Siemens\\NX2506", + "simulation_timeout_s": 600 + } + }, + "design_variables": [ + { + "id": "dv_001", + "name": "lateral_inner_angle", + "expression_name": "lateral_inner_angle", + "type": "continuous", + "bounds": { + "min": 25.0, + "max": 30.0 + }, + "baseline": 26.79, + "units": "degrees", + "enabled": true, + "description": "", + "canvas_position": { + "x": 50, + "y": 100 + } + }, + { + "id": "dv_002", + "name": "lateral_outer_angle", + "expression_name": "lateral_outer_angle", + "type": "continuous", + "bounds": { + "min": 11.0, + "max": 17.0 + }, + "baseline": 14.64, + "units": "degrees", + "enabled": true, + "description": "", + "canvas_position": { + "x": 50, + "y": 180 + } + }, + { + "id": "dv_003", + "name": "lateral_outer_pivot", + "expression_name": "lateral_outer_pivot", + "type": "continuous", + "bounds": { + "min": 9.0, + "max": 12.0 + }, + "baseline": 10.4, + "units": "mm", + "enabled": true, + "description": "", + "canvas_position": { + "x": 50, + "y": 260 + } + }, + { + "id": "dv_004", + "name": "lateral_inner_pivot", + "expression_name": "lateral_inner_pivot", + "type": "continuous", + "bounds": { + "min": 5.0, + "max": 12.0 + }, + "baseline": 10.07, + "units": "mm", + "enabled": true, + "description": "", + "canvas_position": { + "x": 50, + "y": 340 + } + }, + { + "id": "dv_005", + "name": "lateral_middle_pivot", + "expression_name": "lateral_middle_pivot", + "type": "continuous", + "bounds": { + "min": 15.0, + "max": 27.0 + }, + "baseline": 20.73, + "units": "mm", + "enabled": true, + "description": "", + "canvas_position": { + "x": 50, + "y": 420 + } + }, + { + "id": "dv_006", + "name": "lateral_closeness", + "expression_name": "lateral_closeness", + "type": "continuous", + "bounds": { + "min": 9.5, + "max": 12.5 + }, + "baseline": 11.02, + "units": "mm", + "enabled": true, + "description": "", + "canvas_position": { + "x": 50, + "y": 500 + } + }, + { + "id": "dv_007", + "name": "whiffle_min", + "expression_name": "whiffle_min", + "type": "continuous", + "bounds": { + "min": 30.0, + "max": 72.0 + }, + "baseline": 40.55, + "units": "mm", + "enabled": true, + "description": "", + "canvas_position": { + "x": 50, + "y": 580 + } + }, + { + "id": "dv_008", + "name": "whiffle_outer_to_vertical", + "expression_name": "whiffle_outer_to_vertical", + "type": "continuous", + "bounds": { + "min": 60.0, + "max": 80.0 + }, + "baseline": 75.67, + "units": "degrees", + "enabled": true, + "description": "", + "canvas_position": { + "x": 50, + "y": 660 + } + }, + { + "id": "dv_009", + "name": "whiffle_triangle_closeness", + "expression_name": "whiffle_triangle_closeness", + "type": "continuous", + "bounds": { + "min": 50.0, + "max": 80.0 + }, + "baseline": 60.0, + "units": "mm", + "enabled": true, + "description": "", + "canvas_position": { + "x": 50, + "y": 740 + } + }, + { + "id": "dv_010", + "name": "blank_backface_angle", + "expression_name": "blank_backface_angle", + "type": "continuous", + "bounds": { + "min": 4.1, + "max": 4.5 + }, + "baseline": 4.15, + "units": "degrees", + "enabled": true, + "description": "", + "canvas_position": { + "x": 50, + "y": 820 + } + }, + { + "id": "dv_011", + "name": "inner_circular_rib_dia", + "expression_name": "inner_circular_rib_dia", + "type": "continuous", + "bounds": { + "min": 480.0, + "max": 620.0 + }, + "baseline": 534.0, + "units": "mm", + "enabled": true, + "description": "", + "canvas_position": { + "x": 50, + "y": 900 + } + } + ], + "extractors": [ + { + "id": "ext_001", + "name": "Zernike WFE Extractor", + "type": "zernike_opd", + "builtin": true, + "config": { + "inner_radius_mm": 0, + "outer_radius_mm": 500.0, + "n_modes": 50, + "filter_low_orders": 4, + "displacement_unit": "mm", + "reference_subcase": 2 + }, + "outputs": [ + { + "name": "rel_filtered_rms_40_vs_20", + "metric": "filtered_rms_nm" + }, + { + "name": "rel_filtered_rms_60_vs_20", + "metric": "filtered_rms_nm" + }, + { + "name": "mfg_90_optician_workload", + "metric": "filtered_rms_nm" + } + ], + "canvas_position": { + "x": 740, + "y": 100 + } + } + ], + "objectives": [ + { + "id": "obj_001", + "name": "Filtered RMS WFE at 40 deg relative to 20 deg reference (operational tracking)", + "direction": "minimize", + "weight": 5.0, + "source": { + "extractor_id": "ext_001", + "output_name": "rel_filtered_rms_40_vs_20" + }, + "target": 4.0, + "units": "nm", + "canvas_position": { + "x": 1020, + "y": 100 + } + }, + { + "id": "obj_002", + "name": "Filtered RMS WFE at 60 deg relative to 20 deg reference (operational tracking)", + "direction": "minimize", + "weight": 5.0, + "source": { + "extractor_id": "ext_001", + "output_name": "rel_filtered_rms_60_vs_20" + }, + "target": 10.0, + "units": "nm", + "canvas_position": { + "x": 1020, + "y": 200 + } + }, + { + "id": "obj_003", + "name": "Manufacturing deformation at 90 deg polishing (J1-J3 filtered RMS)", + "direction": "minimize", + "weight": 1.0, + "source": { + "extractor_id": "ext_001", + "output_name": "mfg_90_optician_workload" + }, + "target": 20.0, + "units": "nm", + "canvas_position": { + "x": 1020, + "y": 300 + } + } + ], + "constraints": [], + "optimization": { + "algorithm": { + "type": "TPE", + "config": { + "n_startup_trials": 10 + } + }, + "budget": { + "max_trials": 100 + }, + "canvas_position": { + "x": 1300, + "y": 150 + } + }, + "canvas": { + "edges": [ + { + "source": "dv_001", + "target": "model" + }, + { + "source": "dv_002", + "target": "model" + }, + { + "source": "dv_003", + "target": "model" + }, + { + "source": "dv_004", + "target": "model" + }, + { + "source": "dv_005", + "target": "model" + }, + { + "source": "dv_006", + "target": "model" + }, + { + "source": "dv_007", + "target": "model" + }, + { + "source": "dv_008", + "target": "model" + }, + { + "source": "dv_009", + "target": "model" + }, + { + "source": "dv_010", + "target": "model" + }, + { + "source": "dv_011", + "target": "model" + }, + { + "source": "model", + "target": "solver" + }, + { + "source": "solver", + "target": "ext_001" + }, + { + "source": "ext_001", + "target": "obj_001" + }, + { + "source": "ext_001", + "target": "obj_002" + }, + { + "source": "ext_001", + "target": "obj_003" + }, + { + "source": "obj_001", + "target": "optimization" + }, + { + "source": "obj_002", + "target": "optimization" + }, + { + "source": "obj_003", + "target": "optimization" + } + ], + "layout_version": "2.0" + } +} \ No newline at end of file diff --git a/studies/M1_Mirror/m1_mirror_adaptive_V15/atomizer_spec.json b/studies/M1_Mirror/m1_mirror_adaptive_V15/atomizer_spec.json new file mode 100644 index 00000000..c360c5c8 --- /dev/null +++ b/studies/M1_Mirror/m1_mirror_adaptive_V15/atomizer_spec.json @@ -0,0 +1,407 @@ +{ + "meta": { + "version": "2.0", + "created": "2026-01-17T15:35:12.017994Z", + "modified": "2026-01-17T15:35:12.017994Z", + "created_by": "migration", + "modified_by": "migration", + "study_name": "m1_mirror_adaptive_v15", + "description": "V15 NSGA-II multi-objective optimization. Seeds from 785 V14 trials. Explores Pareto trade-offs between 40deg tracking, 60deg tracking, and manufacturing workload.", + "tags": [ + "mirror", + "zernike" + ] + }, + "model": { + "sim": { + "path": "ASSY_M1_assyfem1_sim1.sim", + "solver": "nastran" + }, + "nx_settings": { + "nx_install_path": "C:\\Program Files\\Siemens\\DesigncenterNX2512", + "simulation_timeout_s": 600 + } + }, + "design_variables": [ + { + "id": "dv_001", + "name": "lateral_inner_angle", + "expression_name": "lateral_inner_angle", + "type": "continuous", + "bounds": { + "min": 25.0, + "max": 30.0 + }, + "baseline": 26.79, + "units": "degrees", + "enabled": true, + "description": "", + "canvas_position": { + "x": 50, + "y": 100 + } + }, + { + "id": "dv_002", + "name": "lateral_outer_angle", + "expression_name": "lateral_outer_angle", + "type": "continuous", + "bounds": { + "min": 11.0, + "max": 17.0 + }, + "baseline": 14.64, + "units": "degrees", + "enabled": true, + "description": "", + "canvas_position": { + "x": 50, + "y": 180 + } + }, + { + "id": "dv_003", + "name": "lateral_outer_pivot", + "expression_name": "lateral_outer_pivot", + "type": "continuous", + "bounds": { + "min": 9.0, + "max": 12.0 + }, + "baseline": 10.4, + "units": "mm", + "enabled": true, + "description": "", + "canvas_position": { + "x": 50, + "y": 260 + } + }, + { + "id": "dv_004", + "name": "lateral_inner_pivot", + "expression_name": "lateral_inner_pivot", + "type": "continuous", + "bounds": { + "min": 5.0, + "max": 12.0 + }, + "baseline": 10.07, + "units": "mm", + "enabled": true, + "description": "", + "canvas_position": { + "x": 50, + "y": 340 + } + }, + { + "id": "dv_005", + "name": "lateral_middle_pivot", + "expression_name": "lateral_middle_pivot", + "type": "continuous", + "bounds": { + "min": 15.0, + "max": 27.0 + }, + "baseline": 20.73, + "units": "mm", + "enabled": true, + "description": "", + "canvas_position": { + "x": 50, + "y": 420 + } + }, + { + "id": "dv_006", + "name": "lateral_closeness", + "expression_name": "lateral_closeness", + "type": "continuous", + "bounds": { + "min": 9.5, + "max": 12.5 + }, + "baseline": 11.02, + "units": "mm", + "enabled": true, + "description": "", + "canvas_position": { + "x": 50, + "y": 500 + } + }, + { + "id": "dv_007", + "name": "whiffle_min", + "expression_name": "whiffle_min", + "type": "continuous", + "bounds": { + "min": 30.0, + "max": 72.0 + }, + "baseline": 40.55, + "units": "mm", + "enabled": true, + "description": "", + "canvas_position": { + "x": 50, + "y": 580 + } + }, + { + "id": "dv_008", + "name": "whiffle_outer_to_vertical", + "expression_name": "whiffle_outer_to_vertical", + "type": "continuous", + "bounds": { + "min": 60.0, + "max": 80.0 + }, + "baseline": 75.67, + "units": "degrees", + "enabled": true, + "description": "", + "canvas_position": { + "x": 50, + "y": 660 + } + }, + { + "id": "dv_009", + "name": "whiffle_triangle_closeness", + "expression_name": "whiffle_triangle_closeness", + "type": "continuous", + "bounds": { + "min": 50.0, + "max": 80.0 + }, + "baseline": 60.0, + "units": "mm", + "enabled": true, + "description": "", + "canvas_position": { + "x": 50, + "y": 740 + } + }, + { + "id": "dv_010", + "name": "blank_backface_angle", + "expression_name": "blank_backface_angle", + "type": "continuous", + "bounds": { + "min": 4.1, + "max": 4.5 + }, + "baseline": 4.15, + "units": "degrees", + "enabled": true, + "description": "", + "canvas_position": { + "x": 50, + "y": 820 + } + }, + { + "id": "dv_011", + "name": "inner_circular_rib_dia", + "expression_name": "inner_circular_rib_dia", + "type": "continuous", + "bounds": { + "min": 480.0, + "max": 620.0 + }, + "baseline": 534.0, + "units": "mm", + "enabled": true, + "description": "", + "canvas_position": { + "x": 50, + "y": 900 + } + } + ], + "extractors": [ + { + "id": "ext_001", + "name": "Zernike WFE Extractor", + "type": "zernike_opd", + "builtin": true, + "config": { + "inner_radius_mm": 0, + "outer_radius_mm": 500.0, + "n_modes": 50, + "filter_low_orders": 4, + "displacement_unit": "mm", + "reference_subcase": 2 + }, + "outputs": [ + { + "name": "rel_filtered_rms_40_vs_20", + "metric": "filtered_rms_nm" + }, + { + "name": "rel_filtered_rms_60_vs_20", + "metric": "filtered_rms_nm" + }, + { + "name": "mfg_90_optician_workload", + "metric": "filtered_rms_nm" + } + ], + "canvas_position": { + "x": 740, + "y": 100 + } + } + ], + "objectives": [ + { + "id": "obj_001", + "name": "Filtered RMS WFE at 40 deg relative to 20 deg reference (operational tracking)", + "direction": "minimize", + "weight": 1.0, + "source": { + "extractor_id": "ext_001", + "output_name": "rel_filtered_rms_40_vs_20" + }, + "target": 4.0, + "units": "nm", + "canvas_position": { + "x": 1020, + "y": 100 + } + }, + { + "id": "obj_002", + "name": "Filtered RMS WFE at 60 deg relative to 20 deg reference (operational tracking)", + "direction": "minimize", + "weight": 1.0, + "source": { + "extractor_id": "ext_001", + "output_name": "rel_filtered_rms_60_vs_20" + }, + "target": 10.0, + "units": "nm", + "canvas_position": { + "x": 1020, + "y": 200 + } + }, + { + "id": "obj_003", + "name": "Manufacturing deformation at 90 deg polishing (J1-J3 filtered RMS)", + "direction": "minimize", + "weight": 1.0, + "source": { + "extractor_id": "ext_001", + "output_name": "mfg_90_optician_workload" + }, + "target": 20.0, + "units": "nm", + "canvas_position": { + "x": 1020, + "y": 300 + } + } + ], + "constraints": [], + "optimization": { + "algorithm": { + "type": "NSGA-II", + "config": { + "population_size": 50, + "seed": 42 + } + }, + "budget": { + "max_trials": 100 + }, + "canvas_position": { + "x": 1300, + "y": 150 + } + }, + "canvas": { + "edges": [ + { + "source": "dv_001", + "target": "model" + }, + { + "source": "dv_002", + "target": "model" + }, + { + "source": "dv_003", + "target": "model" + }, + { + "source": "dv_004", + "target": "model" + }, + { + "source": "dv_005", + "target": "model" + }, + { + "source": "dv_006", + "target": "model" + }, + { + "source": "dv_007", + "target": "model" + }, + { + "source": "dv_008", + "target": "model" + }, + { + "source": "dv_009", + "target": "model" + }, + { + "source": "dv_010", + "target": "model" + }, + { + "source": "dv_011", + "target": "model" + }, + { + "source": "model", + "target": "solver" + }, + { + "source": "solver", + "target": "ext_001" + }, + { + "source": "ext_001", + "target": "obj_001" + }, + { + "source": "ext_001", + "target": "obj_002" + }, + { + "source": "ext_001", + "target": "obj_003" + }, + { + "source": "obj_001", + "target": "optimization" + }, + { + "source": "obj_002", + "target": "optimization" + }, + { + "source": "obj_003", + "target": "optimization" + } + ], + "layout_version": "2.0" + } +} \ No newline at end of file diff --git a/studies/M1_Mirror/m1_mirror_cost_reduction/atomizer_spec.json b/studies/M1_Mirror/m1_mirror_cost_reduction/atomizer_spec.json new file mode 100644 index 00000000..80826b77 --- /dev/null +++ b/studies/M1_Mirror/m1_mirror_cost_reduction/atomizer_spec.json @@ -0,0 +1,435 @@ +{ + "meta": { + "version": "2.0", + "created": "2026-01-17T15:35:12.019028Z", + "modified": "2026-01-17T15:35:12.019028Z", + "created_by": "migration", + "modified_by": "migration", + "study_name": "m1_mirror_cost_reduction", + "description": "TPE optimization for M1 mirror cost reduction. Starting from best V11-V15 design (Trial #725, WS=121.72). New geometry with modified behavior.", + "tags": [ + "mirror", + "zernike" + ] + }, + "model": { + "sim": { + "path": "ASSY_M1_assyfem1_sim1.sim", + "solver": "nastran" + }, + "nx_settings": { + "nx_install_path": "C:\\Program Files\\Siemens\\DesigncenterNX2512", + "simulation_timeout_s": 600 + } + }, + "design_variables": [ + { + "id": "dv_001", + "name": "lateral_inner_angle", + "expression_name": "lateral_inner_angle", + "type": "continuous", + "bounds": { + "min": 25.0, + "max": 30.0 + }, + "baseline": 27.7, + "units": "degrees", + "enabled": false, + "description": "", + "canvas_position": { + "x": 50, + "y": 100 + } + }, + { + "id": "dv_002", + "name": "lateral_outer_angle", + "expression_name": "lateral_outer_angle", + "type": "continuous", + "bounds": { + "min": 11.0, + "max": 17.0 + }, + "baseline": 13.03, + "units": "degrees", + "enabled": false, + "description": "", + "canvas_position": { + "x": 50, + "y": 180 + } + }, + { + "id": "dv_003", + "name": "lateral_outer_pivot", + "expression_name": "lateral_outer_pivot", + "type": "continuous", + "bounds": { + "min": 9.0, + "max": 12.0 + }, + "baseline": 11.24, + "units": "mm", + "enabled": false, + "description": "", + "canvas_position": { + "x": 50, + "y": 260 + } + }, + { + "id": "dv_004", + "name": "lateral_inner_pivot", + "expression_name": "lateral_inner_pivot", + "type": "continuous", + "bounds": { + "min": 5.0, + "max": 12.0 + }, + "baseline": 8.16, + "units": "mm", + "enabled": false, + "description": "", + "canvas_position": { + "x": 50, + "y": 340 + } + }, + { + "id": "dv_005", + "name": "lateral_middle_pivot", + "expression_name": "lateral_middle_pivot", + "type": "continuous", + "bounds": { + "min": 15.0, + "max": 27.0 + }, + "baseline": 22.88, + "units": "mm", + "enabled": false, + "description": "", + "canvas_position": { + "x": 50, + "y": 420 + } + }, + { + "id": "dv_006", + "name": "lateral_closeness", + "expression_name": "lateral_closeness", + "type": "continuous", + "bounds": { + "min": 9.5, + "max": 12.5 + }, + "baseline": 9.84, + "units": "mm", + "enabled": false, + "description": "", + "canvas_position": { + "x": 50, + "y": 500 + } + }, + { + "id": "dv_007", + "name": "whiffle_min", + "expression_name": "whiffle_min", + "type": "continuous", + "bounds": { + "min": 30.0, + "max": 72.0 + }, + "baseline": 58.63, + "units": "mm", + "enabled": true, + "description": "", + "canvas_position": { + "x": 50, + "y": 580 + } + }, + { + "id": "dv_008", + "name": "whiffle_outer_to_vertical", + "expression_name": "whiffle_outer_to_vertical", + "type": "continuous", + "bounds": { + "min": 60.0, + "max": 80.0 + }, + "baseline": 77.96, + "units": "degrees", + "enabled": true, + "description": "", + "canvas_position": { + "x": 50, + "y": 660 + } + }, + { + "id": "dv_009", + "name": "whiffle_triangle_closeness", + "expression_name": "whiffle_triangle_closeness", + "type": "continuous", + "bounds": { + "min": 65, + "max": 80.0 + }, + "baseline": 67.33, + "units": "mm", + "enabled": true, + "description": "", + "canvas_position": { + "x": 50, + "y": 740 + } + }, + { + "id": "dv_010", + "name": "blank_backface_angle", + "expression_name": "blank_backface_angle", + "type": "continuous", + "bounds": { + "min": 4.5, + "max": 5 + }, + "baseline": 4.5, + "units": "degrees", + "enabled": true, + "description": "", + "canvas_position": { + "x": 50, + "y": 820 + } + }, + { + "id": "dv_011", + "name": "inner_circular_rib_dia", + "expression_name": "inner_circular_rib_dia", + "type": "continuous", + "bounds": { + "min": 480.0, + "max": 620.0 + }, + "baseline": 537.86, + "units": "mm", + "enabled": true, + "description": "", + "canvas_position": { + "x": 50, + "y": 900 + } + } + ], + "extractors": [ + { + "id": "ext_001", + "name": "Zernike WFE Extractor", + "type": "zernike_opd", + "builtin": true, + "config": { + "inner_radius_mm": 0, + "outer_radius_mm": 500.0, + "n_modes": 50, + "filter_low_orders": 4, + "displacement_unit": "mm", + "reference_subcase": 2 + }, + "outputs": [ + { + "name": "rel_filtered_rms_40_vs_20", + "metric": "filtered_rms_nm" + }, + { + "name": "rel_filtered_rms_60_vs_20", + "metric": "filtered_rms_nm" + }, + { + "name": "mfg_90_optician_workload", + "metric": "filtered_rms_nm" + }, + { + "name": "mass_kg", + "metric": "filtered_rms_nm" + } + ], + "canvas_position": { + "x": 740, + "y": 100 + } + } + ], + "objectives": [ + { + "id": "obj_001", + "name": "Filtered RMS WFE at 40 deg relative to 20 deg reference (operational tracking)", + "direction": "minimize", + "weight": 5.0, + "source": { + "extractor_id": "ext_001", + "output_name": "rel_filtered_rms_40_vs_20" + }, + "target": 4.0, + "units": "nm", + "canvas_position": { + "x": 1020, + "y": 100 + } + }, + { + "id": "obj_002", + "name": "Filtered RMS WFE at 60 deg relative to 20 deg reference (operational tracking)", + "direction": "minimize", + "weight": 5.0, + "source": { + "extractor_id": "ext_001", + "output_name": "rel_filtered_rms_60_vs_20" + }, + "target": 10.0, + "units": "nm", + "canvas_position": { + "x": 1020, + "y": 200 + } + }, + { + "id": "obj_003", + "name": "Manufacturing deformation at 90 deg polishing (J1-J3 filtered RMS)", + "direction": "minimize", + "weight": 2.0, + "source": { + "extractor_id": "ext_001", + "output_name": "mfg_90_optician_workload" + }, + "target": 20.0, + "units": "nm", + "canvas_position": { + "x": 1020, + "y": 300 + } + }, + { + "id": "obj_004", + "name": "Total mass of M1_Blank part extracted via NX MeasureManager", + "direction": "minimize", + "weight": 1.0, + "source": { + "extractor_id": "ext_001", + "output_name": "mass_kg" + }, + "target": null, + "units": "kg", + "canvas_position": { + "x": 1020, + "y": 400 + } + } + ], + "constraints": [], + "optimization": { + "algorithm": { + "type": "TPE", + "config": { + "n_startup_trials": 15, + "seed": 42 + } + }, + "budget": { + "max_trials": 100 + }, + "canvas_position": { + "x": 1300, + "y": 150 + } + }, + "canvas": { + "edges": [ + { + "source": "dv_001", + "target": "model" + }, + { + "source": "dv_002", + "target": "model" + }, + { + "source": "dv_003", + "target": "model" + }, + { + "source": "dv_004", + "target": "model" + }, + { + "source": "dv_005", + "target": "model" + }, + { + "source": "dv_006", + "target": "model" + }, + { + "source": "dv_007", + "target": "model" + }, + { + "source": "dv_008", + "target": "model" + }, + { + "source": "dv_009", + "target": "model" + }, + { + "source": "dv_010", + "target": "model" + }, + { + "source": "dv_011", + "target": "model" + }, + { + "source": "model", + "target": "solver" + }, + { + "source": "solver", + "target": "ext_001" + }, + { + "source": "ext_001", + "target": "obj_001" + }, + { + "source": "ext_001", + "target": "obj_002" + }, + { + "source": "ext_001", + "target": "obj_003" + }, + { + "source": "ext_001", + "target": "obj_004" + }, + { + "source": "obj_001", + "target": "optimization" + }, + { + "source": "obj_002", + "target": "optimization" + }, + { + "source": "obj_003", + "target": "optimization" + }, + { + "source": "obj_004", + "target": "optimization" + } + ], + "layout_version": "2.0" + } +} \ No newline at end of file diff --git a/studies/M1_Mirror/m1_mirror_cost_reduction_V10/atomizer_spec.json b/studies/M1_Mirror/m1_mirror_cost_reduction_V10/atomizer_spec.json new file mode 100644 index 00000000..ff3daec2 --- /dev/null +++ b/studies/M1_Mirror/m1_mirror_cost_reduction_V10/atomizer_spec.json @@ -0,0 +1,528 @@ +{ + "meta": { + "version": "2.0", + "created": "2026-01-17T15:35:12.025507Z", + "modified": "2026-01-17T15:35:12.025507Z", + "created_by": "migration", + "modified_by": "migration", + "study_name": "m1_mirror_cost_reduction_v10", + "description": "CMA-ES lateral optimization with RIGOROUS ZernikeFigure extraction. Uses actual figure geometry to compute OPD with XY lateral displacement correction. Replaces V8 which used Z-only Zernike extraction. 6 active lateral variables.", + "tags": [ + "mirror", + "zernike", + "opd" + ] + }, + "model": { + "sim": { + "path": "ASSY_M1_assyfem1_sim1.sim", + "solver": "nastran" + }, + "nx_settings": { + "nx_install_path": "C:\\Program Files\\Siemens\\DesigncenterNX2512", + "simulation_timeout_s": 600 + } + }, + "design_variables": [ + { + "id": "dv_001", + "name": "whiffle_min", + "expression_name": "whiffle_min", + "type": "continuous", + "bounds": { + "min": 30.0, + "max": 72.0 + }, + "baseline": 61.9189, + "units": "mm", + "enabled": false, + "description": "FIXED at V7 best value", + "canvas_position": { + "x": 50, + "y": 100 + } + }, + { + "id": "dv_002", + "name": "whiffle_outer_to_vertical", + "expression_name": "whiffle_outer_to_vertical", + "type": "continuous", + "bounds": { + "min": 70.0, + "max": 85.0 + }, + "baseline": 81.7479, + "units": "mm", + "enabled": false, + "description": "FIXED at V7 best value", + "canvas_position": { + "x": 50, + "y": 180 + } + }, + { + "id": "dv_003", + "name": "whiffle_triangle_closeness", + "expression_name": "whiffle_triangle_closeness", + "type": "continuous", + "bounds": { + "min": 65.0, + "max": 120.0 + }, + "baseline": 65.5418, + "units": "mm", + "enabled": false, + "description": "FIXED at V7 best value", + "canvas_position": { + "x": 50, + "y": 260 + } + }, + { + "id": "dv_004", + "name": "blank_backface_angle", + "expression_name": "blank_backface_angle", + "type": "continuous", + "bounds": { + "min": 4.2, + "max": 4.5 + }, + "baseline": 4.4158, + "units": "degrees", + "enabled": false, + "description": "FIXED at V7 best value", + "canvas_position": { + "x": 50, + "y": 340 + } + }, + { + "id": "dv_005", + "name": "Pocket_Radius", + "expression_name": "Pocket_Radius", + "type": "continuous", + "bounds": { + "min": 9.0, + "max": 12.0 + }, + "baseline": 10.05, + "units": "mm", + "enabled": false, + "description": "FIXED at 10.05mm (pushed to model each iteration)", + "canvas_position": { + "x": 50, + "y": 420 + } + }, + { + "id": "dv_006", + "name": "lateral_inner_angle", + "expression_name": "lateral_inner_angle", + "type": "continuous", + "bounds": { + "min": 25.0, + "max": 30.0 + }, + "baseline": 27.7, + "units": "degrees", + "enabled": true, + "description": "ACTIVE for V10. Angle of inner lateral support constraint.", + "canvas_position": { + "x": 50, + "y": 500 + } + }, + { + "id": "dv_007", + "name": "lateral_outer_angle", + "expression_name": "lateral_outer_angle", + "type": "continuous", + "bounds": { + "min": 11.0, + "max": 17.0 + }, + "baseline": 13.03, + "units": "degrees", + "enabled": true, + "description": "ACTIVE for V10. Angle of outer lateral support constraint.", + "canvas_position": { + "x": 50, + "y": 580 + } + }, + { + "id": "dv_008", + "name": "lateral_outer_pivot", + "expression_name": "lateral_outer_pivot", + "type": "continuous", + "bounds": { + "min": 7, + "max": 12.0 + }, + "baseline": 10.0, + "units": "degrees", + "enabled": true, + "description": "ACTIVE for V10. Pivot position for outer lateral. Max constrained to 11.", + "canvas_position": { + "x": 50, + "y": 660 + } + }, + { + "id": "dv_009", + "name": "lateral_inner_pivot", + "expression_name": "lateral_inner_pivot", + "type": "continuous", + "bounds": { + "min": 5.0, + "max": 12.0 + }, + "baseline": 8.16, + "units": "degrees", + "enabled": true, + "description": "ACTIVE for V10. Pivot position for inner lateral.", + "canvas_position": { + "x": 50, + "y": 740 + } + }, + { + "id": "dv_010", + "name": "lateral_middle_pivot", + "expression_name": "lateral_middle_pivot", + "type": "continuous", + "bounds": { + "min": 15.0, + "max": 27.0 + }, + "baseline": 22.88, + "units": "degrees", + "enabled": true, + "description": "ACTIVE for V10. Pivot position for middle lateral.", + "canvas_position": { + "x": 50, + "y": 820 + } + }, + { + "id": "dv_011", + "name": "lateral_closeness", + "expression_name": "lateral_closeness", + "type": "continuous", + "bounds": { + "min": 7.0, + "max": 12.0 + }, + "baseline": 9.84, + "units": "degrees", + "enabled": true, + "description": "ACTIVE for V10. Closeness factor for lateral supports.", + "canvas_position": { + "x": 50, + "y": 900 + } + }, + { + "id": "dv_012", + "name": "inner_circular_rib_dia", + "expression_name": "inner_circular_rib_dia", + "type": "continuous", + "bounds": { + "min": 480.0, + "max": 620.0 + }, + "baseline": 537.86, + "units": "mm", + "enabled": false, + "description": "DISABLED. Fixed structural parameter.", + "canvas_position": { + "x": 50, + "y": 980 + } + }, + { + "id": "dv_013", + "name": "center_thickness", + "expression_name": "center_thickness", + "type": "continuous", + "bounds": { + "min": 60.0, + "max": 85.0 + }, + "baseline": 85.0, + "units": "mm", + "enabled": false, + "description": "DISABLED. Fixed at 85mm per sensitivity analysis.", + "canvas_position": { + "x": 50, + "y": 1060 + } + } + ], + "extractors": [ + { + "id": "ext_001", + "name": "Zernike WFE Extractor", + "type": "zernike_opd", + "builtin": true, + "config": { + "inner_radius_mm": 0, + "outer_radius_mm": 500.0, + "n_modes": 50, + "filter_low_orders": 4, + "displacement_unit": "mm", + "reference_subcase": 2 + }, + "outputs": [ + { + "name": "rel_filtered_rms_40_vs_20", + "metric": "filtered_rms_nm" + }, + { + "name": "rel_filtered_rms_60_vs_20", + "metric": "filtered_rms_nm" + }, + { + "name": "mfg_90_optician_workload", + "metric": "filtered_rms_nm" + }, + { + "name": "mass_kg", + "metric": "filtered_rms_nm" + } + ], + "canvas_position": { + "x": 740, + "y": 100 + } + }, + { + "id": "ext_002", + "name": "Mass Extractor", + "type": "mass", + "builtin": true, + "outputs": [ + { + "name": "mass_kg", + "metric": "total" + } + ], + "canvas_position": { + "x": 740, + "y": 250 + } + } + ], + "objectives": [ + { + "id": "obj_001", + "name": "Filtered RMS WFE at 40 deg relative to 20 deg reference (ZernikeOPD)", + "direction": "minimize", + "weight": 5.0, + "source": { + "extractor_id": "ext_001", + "output_name": "rel_filtered_rms_40_vs_20" + }, + "target": 4.0, + "units": "nm", + "canvas_position": { + "x": 1020, + "y": 100 + } + }, + { + "id": "obj_002", + "name": "Filtered RMS WFE at 60 deg relative to 20 deg reference (ZernikeOPD)", + "direction": "minimize", + "weight": 5.0, + "source": { + "extractor_id": "ext_001", + "output_name": "rel_filtered_rms_60_vs_20" + }, + "target": 10.0, + "units": "nm", + "canvas_position": { + "x": 1020, + "y": 200 + } + }, + { + "id": "obj_003", + "name": "Manufacturing deformation at 90 deg polishing (J1-J3 filtered RMS, ZernikeOPD)", + "direction": "minimize", + "weight": 3.0, + "source": { + "extractor_id": "ext_001", + "output_name": "mfg_90_optician_workload" + }, + "target": 20.0, + "units": "nm", + "canvas_position": { + "x": 1020, + "y": 300 + } + }, + { + "id": "obj_004", + "name": "Total mass of M1_Blank part extracted via NX MeasureManager", + "direction": "minimize", + "weight": 1.0, + "source": { + "extractor_id": "ext_001", + "output_name": "mass_kg" + }, + "target": null, + "units": "kg", + "canvas_position": { + "x": 1020, + "y": 400 + } + } + ], + "constraints": [ + { + "id": "con_001", + "name": "Maximum blank mass constraint: must be <= 105 kg", + "type": "hard", + "operator": "<=", + "threshold": 105.0, + "source": { + "extractor_id": "ext_002", + "output_name": "mass_kg" + }, + "penalty_config": { + "method": "quadratic", + "weight": 1000.0 + }, + "canvas_position": { + "x": 1020, + "y": 400 + } + } + ], + "optimization": { + "algorithm": { + "type": "CMA-ES", + "config": { + "sigma0": 0.3, + "seed": 42 + } + }, + "budget": { + "max_trials": 200 + }, + "canvas_position": { + "x": 1300, + "y": 150 + } + }, + "canvas": { + "edges": [ + { + "source": "dv_001", + "target": "model" + }, + { + "source": "dv_002", + "target": "model" + }, + { + "source": "dv_003", + "target": "model" + }, + { + "source": "dv_004", + "target": "model" + }, + { + "source": "dv_005", + "target": "model" + }, + { + "source": "dv_006", + "target": "model" + }, + { + "source": "dv_007", + "target": "model" + }, + { + "source": "dv_008", + "target": "model" + }, + { + "source": "dv_009", + "target": "model" + }, + { + "source": "dv_010", + "target": "model" + }, + { + "source": "dv_011", + "target": "model" + }, + { + "source": "dv_012", + "target": "model" + }, + { + "source": "dv_013", + "target": "model" + }, + { + "source": "model", + "target": "solver" + }, + { + "source": "solver", + "target": "ext_001" + }, + { + "source": "solver", + "target": "ext_002" + }, + { + "source": "ext_001", + "target": "obj_001" + }, + { + "source": "ext_001", + "target": "obj_002" + }, + { + "source": "ext_001", + "target": "obj_003" + }, + { + "source": "ext_001", + "target": "obj_004" + }, + { + "source": "ext_002", + "target": "con_001" + }, + { + "source": "obj_001", + "target": "optimization" + }, + { + "source": "obj_002", + "target": "optimization" + }, + { + "source": "obj_003", + "target": "optimization" + }, + { + "source": "obj_004", + "target": "optimization" + }, + { + "source": "con_001", + "target": "optimization" + } + ], + "layout_version": "2.0" + } +} \ No newline at end of file diff --git a/studies/M1_Mirror/m1_mirror_cost_reduction_V11/atomizer_spec.json b/studies/M1_Mirror/m1_mirror_cost_reduction_V11/atomizer_spec.json new file mode 100644 index 00000000..5d86ad62 --- /dev/null +++ b/studies/M1_Mirror/m1_mirror_cost_reduction_V11/atomizer_spec.json @@ -0,0 +1,528 @@ +{ + "meta": { + "version": "2.0", + "created": "2026-01-17T15:35:12.027110Z", + "modified": "2026-01-17T15:35:12.027110Z", + "created_by": "migration", + "modified_by": "migration", + "study_name": "m1_mirror_cost_reduction_v11", + "description": "CMA-ES lateral optimization with CORRECT ZernikeOPD extraction using extract_relative() method. Uses actual figure geometry to compute OPD with XY lateral displacement correction. Clean restart from V10 (which had corrupted iterations).", + "tags": [ + "mirror", + "zernike", + "opd" + ] + }, + "model": { + "sim": { + "path": "ASSY_M1_assyfem1_sim1.sim", + "solver": "nastran" + }, + "nx_settings": { + "nx_install_path": "C:\\Program Files\\Siemens\\DesigncenterNX2512", + "simulation_timeout_s": 600 + } + }, + "design_variables": [ + { + "id": "dv_001", + "name": "whiffle_min", + "expression_name": "whiffle_min", + "type": "continuous", + "bounds": { + "min": 30.0, + "max": 72.0 + }, + "baseline": 61.9189, + "units": "mm", + "enabled": false, + "description": "FIXED at V7 best value", + "canvas_position": { + "x": 50, + "y": 100 + } + }, + { + "id": "dv_002", + "name": "whiffle_outer_to_vertical", + "expression_name": "whiffle_outer_to_vertical", + "type": "continuous", + "bounds": { + "min": 70.0, + "max": 85.0 + }, + "baseline": 81.7479, + "units": "mm", + "enabled": false, + "description": "FIXED at V7 best value", + "canvas_position": { + "x": 50, + "y": 180 + } + }, + { + "id": "dv_003", + "name": "whiffle_triangle_closeness", + "expression_name": "whiffle_triangle_closeness", + "type": "continuous", + "bounds": { + "min": 65.0, + "max": 120.0 + }, + "baseline": 65.5418, + "units": "mm", + "enabled": false, + "description": "FIXED at V7 best value", + "canvas_position": { + "x": 50, + "y": 260 + } + }, + { + "id": "dv_004", + "name": "blank_backface_angle", + "expression_name": "blank_backface_angle", + "type": "continuous", + "bounds": { + "min": 4.2, + "max": 4.5 + }, + "baseline": 4.4158, + "units": "degrees", + "enabled": false, + "description": "FIXED at V7 best value", + "canvas_position": { + "x": 50, + "y": 340 + } + }, + { + "id": "dv_005", + "name": "Pocket_Radius", + "expression_name": "Pocket_Radius", + "type": "continuous", + "bounds": { + "min": 9.0, + "max": 12.0 + }, + "baseline": 10.05, + "units": "mm", + "enabled": false, + "description": "FIXED at 10.05mm (pushed to model each iteration)", + "canvas_position": { + "x": 50, + "y": 420 + } + }, + { + "id": "dv_006", + "name": "lateral_inner_angle", + "expression_name": "lateral_inner_angle", + "type": "continuous", + "bounds": { + "min": 25.0, + "max": 30.0 + }, + "baseline": 27.7, + "units": "degrees", + "enabled": true, + "description": "ACTIVE for V11. Angle of inner lateral support constraint.", + "canvas_position": { + "x": 50, + "y": 500 + } + }, + { + "id": "dv_007", + "name": "lateral_outer_angle", + "expression_name": "lateral_outer_angle", + "type": "continuous", + "bounds": { + "min": 11.0, + "max": 17.0 + }, + "baseline": 13.03, + "units": "degrees", + "enabled": true, + "description": "ACTIVE for V11. Angle of outer lateral support constraint.", + "canvas_position": { + "x": 50, + "y": 580 + } + }, + { + "id": "dv_008", + "name": "lateral_outer_pivot", + "expression_name": "lateral_outer_pivot", + "type": "continuous", + "bounds": { + "min": 7, + "max": 12.0 + }, + "baseline": 10.0, + "units": "degrees", + "enabled": true, + "description": "ACTIVE for V11. Pivot position for outer lateral.", + "canvas_position": { + "x": 50, + "y": 660 + } + }, + { + "id": "dv_009", + "name": "lateral_inner_pivot", + "expression_name": "lateral_inner_pivot", + "type": "continuous", + "bounds": { + "min": 5.0, + "max": 12.0 + }, + "baseline": 8.16, + "units": "degrees", + "enabled": true, + "description": "ACTIVE for V11. Pivot position for inner lateral.", + "canvas_position": { + "x": 50, + "y": 740 + } + }, + { + "id": "dv_010", + "name": "lateral_middle_pivot", + "expression_name": "lateral_middle_pivot", + "type": "continuous", + "bounds": { + "min": 15.0, + "max": 27.0 + }, + "baseline": 22.88, + "units": "degrees", + "enabled": true, + "description": "ACTIVE for V11. Pivot position for middle lateral.", + "canvas_position": { + "x": 50, + "y": 820 + } + }, + { + "id": "dv_011", + "name": "lateral_closeness", + "expression_name": "lateral_closeness", + "type": "continuous", + "bounds": { + "min": 7.0, + "max": 12.0 + }, + "baseline": 9.84, + "units": "degrees", + "enabled": true, + "description": "ACTIVE for V11. Closeness factor for lateral supports.", + "canvas_position": { + "x": 50, + "y": 900 + } + }, + { + "id": "dv_012", + "name": "inner_circular_rib_dia", + "expression_name": "inner_circular_rib_dia", + "type": "continuous", + "bounds": { + "min": 480.0, + "max": 620.0 + }, + "baseline": 537.86, + "units": "mm", + "enabled": false, + "description": "DISABLED. Fixed structural parameter.", + "canvas_position": { + "x": 50, + "y": 980 + } + }, + { + "id": "dv_013", + "name": "center_thickness", + "expression_name": "center_thickness", + "type": "continuous", + "bounds": { + "min": 60.0, + "max": 85.0 + }, + "baseline": 85.0, + "units": "mm", + "enabled": false, + "description": "DISABLED. Fixed at 85mm per sensitivity analysis.", + "canvas_position": { + "x": 50, + "y": 1060 + } + } + ], + "extractors": [ + { + "id": "ext_001", + "name": "Zernike WFE Extractor", + "type": "zernike_opd", + "builtin": true, + "config": { + "inner_radius_mm": 0, + "outer_radius_mm": 500.0, + "n_modes": 50, + "filter_low_orders": 4, + "displacement_unit": "mm", + "reference_subcase": 2 + }, + "outputs": [ + { + "name": "rel_filtered_rms_40_vs_20", + "metric": "filtered_rms_nm" + }, + { + "name": "rel_filtered_rms_60_vs_20", + "metric": "filtered_rms_nm" + }, + { + "name": "mfg_90_optician_workload", + "metric": "filtered_rms_nm" + }, + { + "name": "mass_kg", + "metric": "filtered_rms_nm" + } + ], + "canvas_position": { + "x": 740, + "y": 100 + } + }, + { + "id": "ext_002", + "name": "Mass Extractor", + "type": "mass", + "builtin": true, + "outputs": [ + { + "name": "mass_kg", + "metric": "total" + } + ], + "canvas_position": { + "x": 740, + "y": 250 + } + } + ], + "objectives": [ + { + "id": "obj_001", + "name": "Filtered RMS WFE at 40 deg relative to 20 deg reference (ZernikeOPD)", + "direction": "minimize", + "weight": 5.0, + "source": { + "extractor_id": "ext_001", + "output_name": "rel_filtered_rms_40_vs_20" + }, + "target": 4.0, + "units": "nm", + "canvas_position": { + "x": 1020, + "y": 100 + } + }, + { + "id": "obj_002", + "name": "Filtered RMS WFE at 60 deg relative to 20 deg reference (ZernikeOPD)", + "direction": "minimize", + "weight": 5.0, + "source": { + "extractor_id": "ext_001", + "output_name": "rel_filtered_rms_60_vs_20" + }, + "target": 10.0, + "units": "nm", + "canvas_position": { + "x": 1020, + "y": 200 + } + }, + { + "id": "obj_003", + "name": "Manufacturing deformation at 90 deg polishing (J1-J3 filtered RMS, ZernikeOPD)", + "direction": "minimize", + "weight": 3.0, + "source": { + "extractor_id": "ext_001", + "output_name": "mfg_90_optician_workload" + }, + "target": 20.0, + "units": "nm", + "canvas_position": { + "x": 1020, + "y": 300 + } + }, + { + "id": "obj_004", + "name": "Total mass of M1_Blank part extracted via NX MeasureManager", + "direction": "minimize", + "weight": 1.0, + "source": { + "extractor_id": "ext_001", + "output_name": "mass_kg" + }, + "target": null, + "units": "kg", + "canvas_position": { + "x": 1020, + "y": 400 + } + } + ], + "constraints": [ + { + "id": "con_001", + "name": "Maximum blank mass constraint: must be <= 105 kg", + "type": "hard", + "operator": "<=", + "threshold": 105.0, + "source": { + "extractor_id": "ext_002", + "output_name": "mass_kg" + }, + "penalty_config": { + "method": "quadratic", + "weight": 1000.0 + }, + "canvas_position": { + "x": 1020, + "y": 400 + } + } + ], + "optimization": { + "algorithm": { + "type": "CMA-ES", + "config": { + "sigma0": 0.3, + "seed": 42 + } + }, + "budget": { + "max_trials": 200 + }, + "canvas_position": { + "x": 1300, + "y": 150 + } + }, + "canvas": { + "edges": [ + { + "source": "dv_001", + "target": "model" + }, + { + "source": "dv_002", + "target": "model" + }, + { + "source": "dv_003", + "target": "model" + }, + { + "source": "dv_004", + "target": "model" + }, + { + "source": "dv_005", + "target": "model" + }, + { + "source": "dv_006", + "target": "model" + }, + { + "source": "dv_007", + "target": "model" + }, + { + "source": "dv_008", + "target": "model" + }, + { + "source": "dv_009", + "target": "model" + }, + { + "source": "dv_010", + "target": "model" + }, + { + "source": "dv_011", + "target": "model" + }, + { + "source": "dv_012", + "target": "model" + }, + { + "source": "dv_013", + "target": "model" + }, + { + "source": "model", + "target": "solver" + }, + { + "source": "solver", + "target": "ext_001" + }, + { + "source": "solver", + "target": "ext_002" + }, + { + "source": "ext_001", + "target": "obj_001" + }, + { + "source": "ext_001", + "target": "obj_002" + }, + { + "source": "ext_001", + "target": "obj_003" + }, + { + "source": "ext_001", + "target": "obj_004" + }, + { + "source": "ext_002", + "target": "con_001" + }, + { + "source": "obj_001", + "target": "optimization" + }, + { + "source": "obj_002", + "target": "optimization" + }, + { + "source": "obj_003", + "target": "optimization" + }, + { + "source": "obj_004", + "target": "optimization" + }, + { + "source": "con_001", + "target": "optimization" + } + ], + "layout_version": "2.0" + } +} \ No newline at end of file diff --git a/studies/M1_Mirror/m1_mirror_cost_reduction_V12/atomizer_spec.json b/studies/M1_Mirror/m1_mirror_cost_reduction_V12/atomizer_spec.json new file mode 100644 index 00000000..0e996e1d --- /dev/null +++ b/studies/M1_Mirror/m1_mirror_cost_reduction_V12/atomizer_spec.json @@ -0,0 +1,528 @@ +{ + "meta": { + "version": "2.0", + "created": "2026-01-17T15:35:12.028161Z", + "modified": "2026-01-17T15:35:12.028161Z", + "created_by": "migration", + "modified_by": "migration", + "study_name": "m1_mirror_cost_reduction_v12", + "description": "CMA-ES combined Whiffle + Lateral optimization with ZernikeOPD extraction using extract_relative() method. All 10 design variables enabled for full fine-tuning. Starting from V11 best (trial 190, WS=284.19).", + "tags": [ + "mirror", + "zernike", + "opd" + ] + }, + "model": { + "sim": { + "path": "ASSY_M1_assyfem1_sim1.sim", + "solver": "nastran" + }, + "nx_settings": { + "nx_install_path": "C:\\Program Files\\Siemens\\DesigncenterNX2512", + "simulation_timeout_s": 600 + } + }, + "design_variables": [ + { + "id": "dv_001", + "name": "whiffle_min", + "expression_name": "whiffle_min", + "type": "continuous", + "bounds": { + "min": 30.0, + "max": 72.0 + }, + "baseline": 61.9189, + "units": "mm", + "enabled": true, + "description": "ACTIVE for V12. Inner whiffle tree contact radius. V7 optimum.", + "canvas_position": { + "x": 50, + "y": 100 + } + }, + { + "id": "dv_002", + "name": "whiffle_outer_to_vertical", + "expression_name": "whiffle_outer_to_vertical", + "type": "continuous", + "bounds": { + "min": 70.0, + "max": 85.0 + }, + "baseline": 81.7479, + "units": "mm", + "enabled": true, + "description": "ACTIVE for V12. Outer whiffle arm length. V7 optimum.", + "canvas_position": { + "x": 50, + "y": 180 + } + }, + { + "id": "dv_003", + "name": "whiffle_triangle_closeness", + "expression_name": "whiffle_triangle_closeness", + "type": "continuous", + "bounds": { + "min": 65.0, + "max": 120.0 + }, + "baseline": 65.5418, + "units": "mm", + "enabled": true, + "description": "ACTIVE for V12. Whiffle triangle geometry. V7 optimum.", + "canvas_position": { + "x": 50, + "y": 260 + } + }, + { + "id": "dv_004", + "name": "blank_backface_angle", + "expression_name": "blank_backface_angle", + "type": "continuous", + "bounds": { + "min": 4.2, + "max": 4.5 + }, + "baseline": 4.4158, + "units": "degrees", + "enabled": true, + "description": "ACTIVE for V12. Back face taper angle (affects mass). V7 optimum.", + "canvas_position": { + "x": 50, + "y": 340 + } + }, + { + "id": "dv_005", + "name": "Pocket_Radius", + "expression_name": "Pocket_Radius", + "type": "continuous", + "bounds": { + "min": 9.0, + "max": 12.0 + }, + "baseline": 10.05, + "units": "mm", + "enabled": false, + "description": "FIXED at 10.05mm (pushed to model each iteration)", + "canvas_position": { + "x": 50, + "y": 420 + } + }, + { + "id": "dv_006", + "name": "lateral_inner_angle", + "expression_name": "lateral_inner_angle", + "type": "continuous", + "bounds": { + "min": 25.0, + "max": 30.0 + }, + "baseline": 29.9005, + "units": "degrees", + "enabled": true, + "description": "ACTIVE for V12. V11 best value. Angle of inner lateral support constraint.", + "canvas_position": { + "x": 50, + "y": 500 + } + }, + { + "id": "dv_007", + "name": "lateral_outer_angle", + "expression_name": "lateral_outer_angle", + "type": "continuous", + "bounds": { + "min": 11.0, + "max": 17.0 + }, + "baseline": 11.759, + "units": "degrees", + "enabled": true, + "description": "ACTIVE for V12. V11 best value. Angle of outer lateral support constraint.", + "canvas_position": { + "x": 50, + "y": 580 + } + }, + { + "id": "dv_008", + "name": "lateral_outer_pivot", + "expression_name": "lateral_outer_pivot", + "type": "continuous", + "bounds": { + "min": 7.0, + "max": 12.0 + }, + "baseline": 11.1336, + "units": "degrees", + "enabled": true, + "description": "ACTIVE for V12. V11 best value. Pivot position for outer lateral.", + "canvas_position": { + "x": 50, + "y": 660 + } + }, + { + "id": "dv_009", + "name": "lateral_inner_pivot", + "expression_name": "lateral_inner_pivot", + "type": "continuous", + "bounds": { + "min": 5.0, + "max": 12.0 + }, + "baseline": 6.5186, + "units": "degrees", + "enabled": true, + "description": "ACTIVE for V12. V11 best value. Pivot position for inner lateral.", + "canvas_position": { + "x": 50, + "y": 740 + } + }, + { + "id": "dv_010", + "name": "lateral_middle_pivot", + "expression_name": "lateral_middle_pivot", + "type": "continuous", + "bounds": { + "min": 15.0, + "max": 27.0 + }, + "baseline": 22.3907, + "units": "degrees", + "enabled": true, + "description": "ACTIVE for V12. V11 best value. Pivot position for middle lateral.", + "canvas_position": { + "x": 50, + "y": 820 + } + }, + { + "id": "dv_011", + "name": "lateral_closeness", + "expression_name": "lateral_closeness", + "type": "continuous", + "bounds": { + "min": 7.0, + "max": 12.0 + }, + "baseline": 8.685, + "units": "degrees", + "enabled": true, + "description": "ACTIVE for V12. V11 best value. Closeness factor for lateral supports.", + "canvas_position": { + "x": 50, + "y": 900 + } + }, + { + "id": "dv_012", + "name": "inner_circular_rib_dia", + "expression_name": "inner_circular_rib_dia", + "type": "continuous", + "bounds": { + "min": 480.0, + "max": 620.0 + }, + "baseline": 537.86, + "units": "mm", + "enabled": false, + "description": "DISABLED. Fixed structural parameter.", + "canvas_position": { + "x": 50, + "y": 980 + } + }, + { + "id": "dv_013", + "name": "center_thickness", + "expression_name": "center_thickness", + "type": "continuous", + "bounds": { + "min": 60.0, + "max": 85.0 + }, + "baseline": 85.0, + "units": "mm", + "enabled": false, + "description": "DISABLED. Fixed at 85mm per sensitivity analysis.", + "canvas_position": { + "x": 50, + "y": 1060 + } + } + ], + "extractors": [ + { + "id": "ext_001", + "name": "Zernike WFE Extractor", + "type": "zernike_opd", + "builtin": true, + "config": { + "inner_radius_mm": 0, + "outer_radius_mm": 500.0, + "n_modes": 50, + "filter_low_orders": 4, + "displacement_unit": "mm", + "reference_subcase": 2 + }, + "outputs": [ + { + "name": "rel_filtered_rms_40_vs_20", + "metric": "filtered_rms_nm" + }, + { + "name": "rel_filtered_rms_60_vs_20", + "metric": "filtered_rms_nm" + }, + { + "name": "mfg_90_optician_workload", + "metric": "filtered_rms_nm" + }, + { + "name": "mass_kg", + "metric": "filtered_rms_nm" + } + ], + "canvas_position": { + "x": 740, + "y": 100 + } + }, + { + "id": "ext_002", + "name": "Mass Extractor", + "type": "mass", + "builtin": true, + "outputs": [ + { + "name": "mass_kg", + "metric": "total" + } + ], + "canvas_position": { + "x": 740, + "y": 250 + } + } + ], + "objectives": [ + { + "id": "obj_001", + "name": "Filtered RMS WFE at 40 deg relative to 20 deg reference (ZernikeOPD)", + "direction": "minimize", + "weight": 5.0, + "source": { + "extractor_id": "ext_001", + "output_name": "rel_filtered_rms_40_vs_20" + }, + "target": 4.0, + "units": "nm", + "canvas_position": { + "x": 1020, + "y": 100 + } + }, + { + "id": "obj_002", + "name": "Filtered RMS WFE at 60 deg relative to 20 deg reference (ZernikeOPD)", + "direction": "minimize", + "weight": 5.0, + "source": { + "extractor_id": "ext_001", + "output_name": "rel_filtered_rms_60_vs_20" + }, + "target": 10.0, + "units": "nm", + "canvas_position": { + "x": 1020, + "y": 200 + } + }, + { + "id": "obj_003", + "name": "Manufacturing deformation at 90 deg polishing (J1-J3 filtered RMS, ZernikeOPD)", + "direction": "minimize", + "weight": 3.0, + "source": { + "extractor_id": "ext_001", + "output_name": "mfg_90_optician_workload" + }, + "target": 20.0, + "units": "nm", + "canvas_position": { + "x": 1020, + "y": 300 + } + }, + { + "id": "obj_004", + "name": "Total mass of M1_Blank part extracted via NX MeasureManager", + "direction": "minimize", + "weight": 1.0, + "source": { + "extractor_id": "ext_001", + "output_name": "mass_kg" + }, + "target": null, + "units": "kg", + "canvas_position": { + "x": 1020, + "y": 400 + } + } + ], + "constraints": [ + { + "id": "con_001", + "name": "Maximum blank mass constraint: must be <= 105 kg", + "type": "hard", + "operator": "<=", + "threshold": 105.0, + "source": { + "extractor_id": "ext_002", + "output_name": "mass_kg" + }, + "penalty_config": { + "method": "quadratic", + "weight": 1000.0 + }, + "canvas_position": { + "x": 1020, + "y": 400 + } + } + ], + "optimization": { + "algorithm": { + "type": "CMA-ES", + "config": { + "sigma0": 0.15, + "seed": 42 + } + }, + "budget": { + "max_trials": 200 + }, + "canvas_position": { + "x": 1300, + "y": 150 + } + }, + "canvas": { + "edges": [ + { + "source": "dv_001", + "target": "model" + }, + { + "source": "dv_002", + "target": "model" + }, + { + "source": "dv_003", + "target": "model" + }, + { + "source": "dv_004", + "target": "model" + }, + { + "source": "dv_005", + "target": "model" + }, + { + "source": "dv_006", + "target": "model" + }, + { + "source": "dv_007", + "target": "model" + }, + { + "source": "dv_008", + "target": "model" + }, + { + "source": "dv_009", + "target": "model" + }, + { + "source": "dv_010", + "target": "model" + }, + { + "source": "dv_011", + "target": "model" + }, + { + "source": "dv_012", + "target": "model" + }, + { + "source": "dv_013", + "target": "model" + }, + { + "source": "model", + "target": "solver" + }, + { + "source": "solver", + "target": "ext_001" + }, + { + "source": "solver", + "target": "ext_002" + }, + { + "source": "ext_001", + "target": "obj_001" + }, + { + "source": "ext_001", + "target": "obj_002" + }, + { + "source": "ext_001", + "target": "obj_003" + }, + { + "source": "ext_001", + "target": "obj_004" + }, + { + "source": "ext_002", + "target": "con_001" + }, + { + "source": "obj_001", + "target": "optimization" + }, + { + "source": "obj_002", + "target": "optimization" + }, + { + "source": "obj_003", + "target": "optimization" + }, + { + "source": "obj_004", + "target": "optimization" + }, + { + "source": "con_001", + "target": "optimization" + } + ], + "layout_version": "2.0" + } +} \ No newline at end of file diff --git a/studies/M1_Mirror/m1_mirror_cost_reduction_V13/atomizer_spec.json b/studies/M1_Mirror/m1_mirror_cost_reduction_V13/atomizer_spec.json new file mode 100644 index 00000000..6e4bbb40 --- /dev/null +++ b/studies/M1_Mirror/m1_mirror_cost_reduction_V13/atomizer_spec.json @@ -0,0 +1,560 @@ +{ + "meta": { + "version": "2.0", + "created": "2026-01-17T15:35:12.029754Z", + "modified": "2026-01-17T15:35:12.029754Z", + "created_by": "migration", + "modified_by": "migration", + "study_name": "m1_mirror_cost_reduction_v13", + "description": "SAT v3 with conical backface (4-5 deg), stricter 100kg mass constraint, same cost function as flat_back (6*wfe_40 + 5*wfe_60 + 3*mfg). Uses all V6-V12 training data (1200+ samples).", + "tags": [ + "SAT-v3-conical", + "mirror", + "zernike", + "opd" + ], + "engineering_context": "Cost reduction with conical backface design" + }, + "model": { + "sim": { + "path": "ASSY_M1_assyfem1_sim1.sim", + "solver": "nastran" + }, + "nx_settings": { + "nx_install_path": "C:\\Program Files\\Siemens\\DesigncenterNX2512", + "simulation_timeout_s": 600 + } + }, + "design_variables": [ + { + "id": "dv_001", + "name": "whiffle_min", + "expression_name": "whiffle_min", + "type": "continuous", + "bounds": { + "min": 30.0, + "max": 72.0 + }, + "baseline": 56.54, + "units": "mm", + "enabled": true, + "description": "Inner whiffle tree contact radius - V12 range", + "canvas_position": { + "x": 50, + "y": 100 + } + }, + { + "id": "dv_002", + "name": "whiffle_outer_to_vertical", + "expression_name": "whiffle_outer_to_vertical", + "type": "continuous", + "bounds": { + "min": 70.0, + "max": 85.0 + }, + "baseline": 82.28, + "units": "degrees", + "enabled": true, + "description": "Outer whiffle arm length - V12 range", + "canvas_position": { + "x": 50, + "y": 180 + } + }, + { + "id": "dv_003", + "name": "whiffle_triangle_closeness", + "expression_name": "whiffle_triangle_closeness", + "type": "continuous", + "bounds": { + "min": 65.0, + "max": 95.0 + }, + "baseline": 65.69, + "units": "mm", + "enabled": true, + "description": "CAD constraint - tightened from 120 to 95 based on failure analysis", + "canvas_position": { + "x": 50, + "y": 260 + } + }, + { + "id": "dv_004", + "name": "lateral_inner_angle", + "expression_name": "lateral_inner_angle", + "type": "continuous", + "bounds": { + "min": 25.0, + "max": 32.0 + }, + "baseline": 29.14, + "units": "degrees", + "enabled": true, + "description": "Inner lateral support angle - V12 range", + "canvas_position": { + "x": 50, + "y": 340 + } + }, + { + "id": "dv_005", + "name": "lateral_outer_angle", + "expression_name": "lateral_outer_angle", + "type": "continuous", + "bounds": { + "min": 9.0, + "max": 15.0 + }, + "baseline": 12.57, + "units": "degrees", + "enabled": true, + "description": "Outer lateral support angle - V12 range", + "canvas_position": { + "x": 50, + "y": 420 + } + }, + { + "id": "dv_006", + "name": "lateral_outer_pivot", + "expression_name": "lateral_outer_pivot", + "type": "continuous", + "bounds": { + "min": 7.0, + "max": 12.0 + }, + "baseline": 11.3, + "units": "mm", + "enabled": true, + "description": "CAD constraint", + "canvas_position": { + "x": 50, + "y": 500 + } + }, + { + "id": "dv_007", + "name": "lateral_inner_pivot", + "expression_name": "lateral_inner_pivot", + "type": "continuous", + "bounds": { + "min": 5.0, + "max": 12.0 + }, + "baseline": 9.48, + "units": "mm", + "enabled": true, + "description": "Inner lateral pivot position", + "canvas_position": { + "x": 50, + "y": 580 + } + }, + { + "id": "dv_008", + "name": "lateral_middle_pivot", + "expression_name": "lateral_middle_pivot", + "type": "continuous", + "bounds": { + "min": 15.0, + "max": 24.0 + }, + "baseline": 20.09, + "units": "mm", + "enabled": true, + "description": "Middle lateral pivot position - tightened from 27 to 24", + "canvas_position": { + "x": 50, + "y": 660 + } + }, + { + "id": "dv_009", + "name": "lateral_closeness", + "expression_name": "lateral_closeness", + "type": "continuous", + "bounds": { + "min": 7.0, + "max": 11.0 + }, + "baseline": 9.03, + "units": "mm", + "enabled": true, + "description": "Lateral closeness factor - tightened from 12 to 11", + "canvas_position": { + "x": 50, + "y": 740 + } + }, + { + "id": "dv_010", + "name": "rib_thickness", + "expression_name": "rib_thickness", + "type": "continuous", + "bounds": { + "min": 6.0, + "max": 9.0 + }, + "baseline": 8.0, + "units": "mm", + "enabled": true, + "description": "Radial rib thickness - CAD constraint max 9mm (failures above 9.0)", + "canvas_position": { + "x": 50, + "y": 820 + } + }, + { + "id": "dv_011", + "name": "ribs_circular_thk", + "expression_name": "ribs_circular_thk", + "type": "continuous", + "bounds": { + "min": 5.0, + "max": 10.0 + }, + "baseline": 7.0, + "units": "mm", + "enabled": true, + "description": "Circular rib thickness", + "canvas_position": { + "x": 50, + "y": 900 + } + }, + { + "id": "dv_012", + "name": "rib_thickness_lateral_truss", + "expression_name": "rib_thickness_lateral_truss", + "type": "continuous", + "bounds": { + "min": 8.0, + "max": 14.0 + }, + "baseline": 11.0, + "units": "mm", + "enabled": true, + "description": "Lateral truss rib thickness", + "canvas_position": { + "x": 50, + "y": 980 + } + }, + { + "id": "dv_013", + "name": "center_thickness", + "expression_name": "center_thickness", + "type": "continuous", + "bounds": { + "min": 60.0, + "max": 85.0 + }, + "baseline": 85.0, + "units": "mm", + "enabled": true, + "description": "Center section thickness - from V12 at 85mm, can explore thinner", + "canvas_position": { + "x": 50, + "y": 1060 + } + }, + { + "id": "dv_014", + "name": "blank_backface_angle", + "expression_name": "blank_backface_angle", + "type": "continuous", + "bounds": { + "min": 4.0, + "max": 5.0 + }, + "baseline": 4.47, + "units": "degrees", + "enabled": true, + "description": "Backface taper angle (conical, not flat) - V12 best was 4.47", + "canvas_position": { + "x": 50, + "y": 1140 + } + } + ], + "extractors": [ + { + "id": "ext_001", + "name": "Zernike WFE Extractor", + "type": "zernike_opd", + "builtin": true, + "config": { + "inner_radius_mm": 0, + "outer_radius_mm": 500.0, + "n_modes": 50, + "filter_low_orders": 4, + "displacement_unit": "mm", + "reference_subcase": 2 + }, + "outputs": [ + { + "name": "wfe_40_20", + "metric": "filtered_rms_nm" + }, + { + "name": "wfe_60_20", + "metric": "filtered_rms_nm" + }, + { + "name": "mfg_90", + "metric": "filtered_rms_nm" + } + ], + "canvas_position": { + "x": 740, + "y": 100 + } + }, + { + "id": "ext_002", + "name": "Mass Extractor", + "type": "mass", + "builtin": true, + "outputs": [ + { + "name": "mass_kg", + "metric": "total" + } + ], + "canvas_position": { + "x": 740, + "y": 250 + } + } + ], + "objectives": [ + { + "id": "obj_001", + "name": "Filtered RMS WFE at 40 deg relative to 20 deg", + "direction": "minimize", + "weight": 6.0, + "source": { + "extractor_id": "ext_001", + "output_name": "wfe_40_20" + }, + "target": 4.0, + "units": "nm", + "canvas_position": { + "x": 1020, + "y": 100 + } + }, + { + "id": "obj_002", + "name": "Filtered RMS WFE at 60 deg relative to 20 deg", + "direction": "minimize", + "weight": 5.0, + "source": { + "extractor_id": "ext_001", + "output_name": "wfe_60_20" + }, + "target": 10.0, + "units": "nm", + "canvas_position": { + "x": 1020, + "y": 200 + } + }, + { + "id": "obj_003", + "name": "Manufacturing deformation at 90 deg polishing", + "direction": "minimize", + "weight": 3.0, + "source": { + "extractor_id": "ext_001", + "output_name": "mfg_90" + }, + "target": 20.0, + "units": "nm", + "canvas_position": { + "x": 1020, + "y": 300 + } + } + ], + "constraints": [ + { + "id": "con_001", + "name": "Maximum blank mass constraint - 100kg strict limit", + "type": "hard", + "operator": "<=", + "threshold": 100.0, + "source": { + "extractor_id": "ext_002", + "output_name": "mass_kg" + }, + "penalty_config": { + "method": "quadratic", + "weight": 1000.0 + }, + "canvas_position": { + "x": 1020, + "y": 400 + } + } + ], + "optimization": { + "algorithm": { + "type": "SAT_v3", + "config": {} + }, + "budget": { + "max_trials": 300 + }, + "canvas_position": { + "x": 1300, + "y": 150 + }, + "surrogate": { + "enabled": true, + "type": "ensemble", + "config": { + "n_models": 5, + "architecture": [ + 128, + 64, + 32 + ], + "train_every_n_trials": 20, + "min_training_samples": 30 + } + } + }, + "canvas": { + "edges": [ + { + "source": "dv_001", + "target": "model" + }, + { + "source": "dv_002", + "target": "model" + }, + { + "source": "dv_003", + "target": "model" + }, + { + "source": "dv_004", + "target": "model" + }, + { + "source": "dv_005", + "target": "model" + }, + { + "source": "dv_006", + "target": "model" + }, + { + "source": "dv_007", + "target": "model" + }, + { + "source": "dv_008", + "target": "model" + }, + { + "source": "dv_009", + "target": "model" + }, + { + "source": "dv_010", + "target": "model" + }, + { + "source": "dv_011", + "target": "model" + }, + { + "source": "dv_012", + "target": "model" + }, + { + "source": "dv_013", + "target": "model" + }, + { + "source": "dv_014", + "target": "model" + }, + { + "source": "model", + "target": "solver" + }, + { + "source": "solver", + "target": "ext_001" + }, + { + "source": "solver", + "target": "ext_002" + }, + { + "source": "ext_001", + "target": "obj_001" + }, + { + "source": "ext_001", + "target": "obj_002" + }, + { + "source": "ext_001", + "target": "obj_003" + }, + { + "source": "ext_002", + "target": "con_001" + }, + { + "source": "obj_001", + "target": "optimization" + }, + { + "source": "obj_002", + "target": "optimization" + }, + { + "source": "obj_003", + "target": "optimization" + }, + { + "source": "con_001", + "target": "optimization" + } + ], + "layout_version": "2.0" + }, + "workflow": { + "stages": [ + { + "id": "stage_exploration", + "name": "Design Space Exploration", + "algorithm": "RandomSearch", + "trials": 30, + "purpose": "Build initial training data for surrogate" + }, + { + "id": "stage_optimization", + "name": "Surrogate-Assisted Optimization", + "algorithm": "SAT_v3", + "trials": 270, + "purpose": "Neural-accelerated optimization" + } + ], + "transitions": [ + { + "from": "stage_exploration", + "to": "stage_optimization", + "condition": "trial_count >= 30" + } + ] + } +} \ No newline at end of file diff --git a/studies/M1_Mirror/m1_mirror_cost_reduction_V9/atomizer_spec.json b/studies/M1_Mirror/m1_mirror_cost_reduction_V9/atomizer_spec.json new file mode 100644 index 00000000..17bac4c2 --- /dev/null +++ b/studies/M1_Mirror/m1_mirror_cost_reduction_V9/atomizer_spec.json @@ -0,0 +1,527 @@ +{ + "meta": { + "version": "2.0", + "created": "2026-01-17T15:35:12.031312Z", + "modified": "2026-01-17T15:35:12.031312Z", + "created_by": "migration", + "modified_by": "migration", + "study_name": "m1_mirror_cost_reduction_v9", + "description": "CMA-ES combined fine-tuning of all 10 parameters. Phase 3 of sequential optimization: V7 (whiffle) + V8 (lateral) results combined. Lower sigma for final polish around best known design.", + "tags": [ + "mirror", + "zernike" + ] + }, + "model": { + "sim": { + "path": "ASSY_M1_assyfem1_sim1.sim", + "solver": "nastran" + }, + "nx_settings": { + "nx_install_path": "C:\\Program Files\\Siemens\\DesigncenterNX2512", + "simulation_timeout_s": 600 + } + }, + "design_variables": [ + { + "id": "dv_001", + "name": "whiffle_min", + "expression_name": "whiffle_min", + "type": "continuous", + "bounds": { + "min": 30.0, + "max": 72.0 + }, + "baseline": 61.9189, + "units": "mm", + "enabled": true, + "description": "ACTIVE for V9. Value from V7 best (unchanged in V8).", + "canvas_position": { + "x": 50, + "y": 100 + } + }, + { + "id": "dv_002", + "name": "whiffle_outer_to_vertical", + "expression_name": "whiffle_outer_to_vertical", + "type": "continuous", + "bounds": { + "min": 70.0, + "max": 85.0 + }, + "baseline": 81.7479, + "units": "mm", + "enabled": true, + "description": "ACTIVE for V9. Value from V7 best (unchanged in V8).", + "canvas_position": { + "x": 50, + "y": 180 + } + }, + { + "id": "dv_003", + "name": "whiffle_triangle_closeness", + "expression_name": "whiffle_triangle_closeness", + "type": "continuous", + "bounds": { + "min": 65.0, + "max": 120.0 + }, + "baseline": 65.5418, + "units": "mm", + "enabled": true, + "description": "ACTIVE for V9. Value from V7 best (unchanged in V8).", + "canvas_position": { + "x": 50, + "y": 260 + } + }, + { + "id": "dv_004", + "name": "blank_backface_angle", + "expression_name": "blank_backface_angle", + "type": "continuous", + "bounds": { + "min": 4.2, + "max": 4.5 + }, + "baseline": 4.42, + "units": "degrees", + "enabled": false, + "description": "ACTIVE for V9. Value from V7 best (unchanged in V8).", + "canvas_position": { + "x": 50, + "y": 340 + } + }, + { + "id": "dv_005", + "name": "Pocket_Radius", + "expression_name": "Pocket_Radius", + "type": "continuous", + "bounds": { + "min": 9.0, + "max": 12.0 + }, + "baseline": 10.05, + "units": "mm", + "enabled": false, + "description": "FIXED at 10.05mm (pushed to model each iteration)", + "canvas_position": { + "x": 50, + "y": 420 + } + }, + { + "id": "dv_006", + "name": "lateral_inner_angle", + "expression_name": "lateral_inner_angle", + "type": "continuous", + "bounds": { + "min": 25.0, + "max": 32.0 + }, + "baseline": 29.827, + "units": "degrees", + "enabled": true, + "description": "ACTIVE for V9. Value from V8 best trial 189.", + "canvas_position": { + "x": 50, + "y": 500 + } + }, + { + "id": "dv_007", + "name": "lateral_outer_angle", + "expression_name": "lateral_outer_angle", + "type": "continuous", + "bounds": { + "min": 9, + "max": 15.0 + }, + "baseline": 11.206, + "units": "degrees", + "enabled": true, + "description": "ACTIVE for V9. Value from V8 best trial 189.", + "canvas_position": { + "x": 50, + "y": 580 + } + }, + { + "id": "dv_008", + "name": "lateral_outer_pivot", + "expression_name": "lateral_outer_pivot", + "type": "continuous", + "bounds": { + "min": 9.0, + "max": 11.0 + }, + "baseline": 10.828, + "units": "degrees", + "enabled": true, + "description": "ACTIVE for V9. Value from V8 best trial 189. Max constrained to 11.", + "canvas_position": { + "x": 50, + "y": 660 + } + }, + { + "id": "dv_009", + "name": "lateral_inner_pivot", + "expression_name": "lateral_inner_pivot", + "type": "continuous", + "bounds": { + "min": 5.0, + "max": 12.0 + }, + "baseline": 9.048, + "units": "degrees", + "enabled": true, + "description": "ACTIVE for V9. Value from V8 best trial 189.", + "canvas_position": { + "x": 50, + "y": 740 + } + }, + { + "id": "dv_010", + "name": "lateral_middle_pivot", + "expression_name": "lateral_middle_pivot", + "type": "continuous", + "bounds": { + "min": 18.0, + "max": 25.0 + }, + "baseline": 21.491, + "units": "degrees", + "enabled": true, + "description": "ACTIVE for V9. Value from V8 best trial 189.", + "canvas_position": { + "x": 50, + "y": 820 + } + }, + { + "id": "dv_011", + "name": "lateral_closeness", + "expression_name": "lateral_closeness", + "type": "continuous", + "bounds": { + "min": 7.0, + "max": 12.0 + }, + "baseline": 9.398, + "units": "degrees", + "enabled": true, + "description": "ACTIVE for V9. Value from V8 best trial 189.", + "canvas_position": { + "x": 50, + "y": 900 + } + }, + { + "id": "dv_012", + "name": "inner_circular_rib_dia", + "expression_name": "inner_circular_rib_dia", + "type": "continuous", + "bounds": { + "min": 480.0, + "max": 620.0 + }, + "baseline": 537.86, + "units": "mm", + "enabled": false, + "description": "DISABLED. Fixed structural parameter.", + "canvas_position": { + "x": 50, + "y": 980 + } + }, + { + "id": "dv_013", + "name": "center_thickness", + "expression_name": "center_thickness", + "type": "continuous", + "bounds": { + "min": 60.0, + "max": 85.0 + }, + "baseline": 85.0, + "units": "mm", + "enabled": false, + "description": "DISABLED. Fixed at 85mm per sensitivity analysis.", + "canvas_position": { + "x": 50, + "y": 1060 + } + } + ], + "extractors": [ + { + "id": "ext_001", + "name": "Zernike WFE Extractor", + "type": "zernike_opd", + "builtin": true, + "config": { + "inner_radius_mm": 0, + "outer_radius_mm": 500.0, + "n_modes": 50, + "filter_low_orders": 4, + "displacement_unit": "mm", + "reference_subcase": 2 + }, + "outputs": [ + { + "name": "rel_filtered_rms_40_vs_20", + "metric": "filtered_rms_nm" + }, + { + "name": "rel_filtered_rms_60_vs_20", + "metric": "filtered_rms_nm" + }, + { + "name": "mfg_90_optician_workload", + "metric": "filtered_rms_nm" + }, + { + "name": "mass_kg", + "metric": "filtered_rms_nm" + } + ], + "canvas_position": { + "x": 740, + "y": 100 + } + }, + { + "id": "ext_002", + "name": "Mass Extractor", + "type": "mass", + "builtin": true, + "outputs": [ + { + "name": "mass_kg", + "metric": "total" + } + ], + "canvas_position": { + "x": 740, + "y": 250 + } + } + ], + "objectives": [ + { + "id": "obj_001", + "name": "Filtered RMS WFE at 40 deg relative to 20 deg reference (operational tracking)", + "direction": "minimize", + "weight": 5.0, + "source": { + "extractor_id": "ext_001", + "output_name": "rel_filtered_rms_40_vs_20" + }, + "target": 4.0, + "units": "nm", + "canvas_position": { + "x": 1020, + "y": 100 + } + }, + { + "id": "obj_002", + "name": "Filtered RMS WFE at 60 deg relative to 20 deg reference (operational tracking)", + "direction": "minimize", + "weight": 5.0, + "source": { + "extractor_id": "ext_001", + "output_name": "rel_filtered_rms_60_vs_20" + }, + "target": 10.0, + "units": "nm", + "canvas_position": { + "x": 1020, + "y": 200 + } + }, + { + "id": "obj_003", + "name": "Manufacturing deformation at 90 deg polishing (J1-J3 filtered RMS)", + "direction": "minimize", + "weight": 3.0, + "source": { + "extractor_id": "ext_001", + "output_name": "mfg_90_optician_workload" + }, + "target": 20.0, + "units": "nm", + "canvas_position": { + "x": 1020, + "y": 300 + } + }, + { + "id": "obj_004", + "name": "Total mass of M1_Blank part extracted via NX MeasureManager", + "direction": "minimize", + "weight": 1.0, + "source": { + "extractor_id": "ext_001", + "output_name": "mass_kg" + }, + "target": null, + "units": "kg", + "canvas_position": { + "x": 1020, + "y": 400 + } + } + ], + "constraints": [ + { + "id": "con_001", + "name": "Maximum blank mass constraint: must be <= 105 kg", + "type": "hard", + "operator": "<=", + "threshold": 105.0, + "source": { + "extractor_id": "ext_002", + "output_name": "mass_kg" + }, + "penalty_config": { + "method": "quadratic", + "weight": 1000.0 + }, + "canvas_position": { + "x": 1020, + "y": 400 + } + } + ], + "optimization": { + "algorithm": { + "type": "CMA-ES", + "config": { + "sigma0": 0.15, + "seed": 42 + } + }, + "budget": { + "max_trials": 200 + }, + "canvas_position": { + "x": 1300, + "y": 150 + } + }, + "canvas": { + "edges": [ + { + "source": "dv_001", + "target": "model" + }, + { + "source": "dv_002", + "target": "model" + }, + { + "source": "dv_003", + "target": "model" + }, + { + "source": "dv_004", + "target": "model" + }, + { + "source": "dv_005", + "target": "model" + }, + { + "source": "dv_006", + "target": "model" + }, + { + "source": "dv_007", + "target": "model" + }, + { + "source": "dv_008", + "target": "model" + }, + { + "source": "dv_009", + "target": "model" + }, + { + "source": "dv_010", + "target": "model" + }, + { + "source": "dv_011", + "target": "model" + }, + { + "source": "dv_012", + "target": "model" + }, + { + "source": "dv_013", + "target": "model" + }, + { + "source": "model", + "target": "solver" + }, + { + "source": "solver", + "target": "ext_001" + }, + { + "source": "solver", + "target": "ext_002" + }, + { + "source": "ext_001", + "target": "obj_001" + }, + { + "source": "ext_001", + "target": "obj_002" + }, + { + "source": "ext_001", + "target": "obj_003" + }, + { + "source": "ext_001", + "target": "obj_004" + }, + { + "source": "ext_002", + "target": "con_001" + }, + { + "source": "obj_001", + "target": "optimization" + }, + { + "source": "obj_002", + "target": "optimization" + }, + { + "source": "obj_003", + "target": "optimization" + }, + { + "source": "obj_004", + "target": "optimization" + }, + { + "source": "con_001", + "target": "optimization" + } + ], + "layout_version": "2.0" + } +} \ No newline at end of file diff --git a/studies/M1_Mirror/m1_mirror_cost_reduction_flat_back_V10/atomizer_spec.json b/studies/M1_Mirror/m1_mirror_cost_reduction_flat_back_V10/atomizer_spec.json new file mode 100644 index 00000000..3770934f --- /dev/null +++ b/studies/M1_Mirror/m1_mirror_cost_reduction_flat_back_V10/atomizer_spec.json @@ -0,0 +1,582 @@ +{ + "meta": { + "version": "2.0", + "created": "2026-01-17T15:35:12.020603Z", + "modified": "2026-01-17T15:35:12.020603Z", + "created_by": "migration", + "modified_by": "migration", + "study_name": "m1_mirror_cost_reduction_flat_back_v10", + "description": "SAT v3 with expanded bounds: center_thickness=60-75mm, thinner mirror face, expanded lateral angles. Uses all V5-V9 training data (800+ samples).", + "tags": [ + "SAT-v3-300-thin", + "mirror", + "zernike", + "opd" + ], + "engineering_context": "Cost reduction option C for Schott Quote revisions" + }, + "model": { + "sim": { + "path": "ASSY_M1_assyfem1_sim1.sim", + "solver": "nastran" + }, + "nx_settings": { + "nx_install_path": "C:\\Program Files\\Siemens\\DesigncenterNX2512", + "simulation_timeout_s": 600 + } + }, + "design_variables": [ + { + "id": "dv_001", + "name": "whiffle_min", + "expression_name": "whiffle_min", + "type": "continuous", + "bounds": { + "min": 60.0, + "max": 80.0 + }, + "baseline": 72.0, + "units": "mm", + "enabled": true, + "description": "Expanded range - top designs at 72mm", + "canvas_position": { + "x": 50, + "y": 100 + } + }, + { + "id": "dv_002", + "name": "whiffle_outer_to_vertical", + "expression_name": "whiffle_outer_to_vertical", + "type": "continuous", + "bounds": { + "min": 70.0, + "max": 88.0 + }, + "baseline": 83.0, + "units": "degrees", + "enabled": true, + "description": "Slightly expanded upper bound", + "canvas_position": { + "x": 50, + "y": 180 + } + }, + { + "id": "dv_003", + "name": "whiffle_triangle_closeness", + "expression_name": "whiffle_triangle_closeness", + "type": "continuous", + "bounds": { + "min": 65.0, + "max": 120.0 + }, + "baseline": 65.0, + "units": "mm", + "enabled": true, + "description": "Keep V9 bounds - CAD constraint", + "canvas_position": { + "x": 50, + "y": 260 + } + }, + { + "id": "dv_004", + "name": "lateral_inner_angle", + "expression_name": "lateral_inner_angle", + "type": "continuous", + "bounds": { + "min": 28.0, + "max": 35.0 + }, + "baseline": 30.0, + "units": "degrees", + "enabled": true, + "description": "Expanded upper - top designs at 30 deg", + "canvas_position": { + "x": 50, + "y": 340 + } + }, + { + "id": "dv_005", + "name": "lateral_outer_angle", + "expression_name": "lateral_outer_angle", + "type": "continuous", + "bounds": { + "min": 8.0, + "max": 14.0 + }, + "baseline": 11.0, + "units": "degrees", + "enabled": true, + "description": "Lowered min - top designs at 11 deg", + "canvas_position": { + "x": 50, + "y": 420 + } + }, + { + "id": "dv_006", + "name": "lateral_outer_pivot", + "expression_name": "lateral_outer_pivot", + "type": "continuous", + "bounds": { + "min": 7.0, + "max": 12.0 + }, + "baseline": 11.9, + "units": "mm", + "enabled": true, + "description": "Keep V9 bounds - CAD constraint", + "canvas_position": { + "x": 50, + "y": 500 + } + }, + { + "id": "dv_007", + "name": "lateral_inner_pivot", + "expression_name": "lateral_inner_pivot", + "type": "continuous", + "bounds": { + "min": 5.0, + "max": 12.0 + }, + "baseline": 11.0, + "units": "mm", + "enabled": true, + "description": "Keep V9 bounds", + "canvas_position": { + "x": 50, + "y": 580 + } + }, + { + "id": "dv_008", + "name": "lateral_middle_pivot", + "expression_name": "lateral_middle_pivot", + "type": "continuous", + "bounds": { + "min": 15.0, + "max": 27.0 + }, + "baseline": 22.0, + "units": "mm", + "enabled": true, + "description": "", + "canvas_position": { + "x": 50, + "y": 660 + } + }, + { + "id": "dv_009", + "name": "lateral_closeness", + "expression_name": "lateral_closeness", + "type": "continuous", + "bounds": { + "min": 7.0, + "max": 12.0 + }, + "baseline": 11.5, + "units": "mm", + "enabled": true, + "description": "", + "canvas_position": { + "x": 50, + "y": 740 + } + }, + { + "id": "dv_010", + "name": "rib_thickness", + "expression_name": "rib_thickness", + "type": "continuous", + "bounds": { + "min": 8.0, + "max": 12.0 + }, + "baseline": 10.0, + "units": "mm", + "enabled": true, + "description": "", + "canvas_position": { + "x": 50, + "y": 820 + } + }, + { + "id": "dv_011", + "name": "ribs_circular_thk", + "expression_name": "ribs_circular_thk", + "type": "continuous", + "bounds": { + "min": 5.0, + "max": 10.0 + }, + "baseline": 7.0, + "units": "mm", + "enabled": true, + "description": "Reduced min to 5mm - top designs at 7-8mm", + "canvas_position": { + "x": 50, + "y": 900 + } + }, + { + "id": "dv_012", + "name": "rib_thickness_lateral_truss", + "expression_name": "rib_thickness_lateral_truss", + "type": "continuous", + "bounds": { + "min": 8.0, + "max": 14.0 + }, + "baseline": 11.0, + "units": "mm", + "enabled": true, + "description": "", + "canvas_position": { + "x": 50, + "y": 980 + } + }, + { + "id": "dv_013", + "name": "mirror_face_thickness", + "expression_name": "mirror_face_thickness", + "type": "continuous", + "bounds": { + "min": 15.0, + "max": 20.0 + }, + "baseline": 15.0, + "units": "mm", + "enabled": true, + "description": "Keep V9 bounds - CAD constraint", + "canvas_position": { + "x": 50, + "y": 1060 + } + }, + { + "id": "dv_014", + "name": "center_thickness", + "expression_name": "center_thickness", + "type": "continuous", + "bounds": { + "min": 60.0, + "max": 75.0 + }, + "baseline": 67.5, + "units": "mm", + "enabled": true, + "description": "REDUCED from 75-85 to 60-75 per user request", + "canvas_position": { + "x": 50, + "y": 1140 + } + }, + { + "id": "dv_015", + "name": "blank_backface_angle", + "expression_name": "blank_backface_angle", + "type": "continuous", + "bounds": { + "min": -0.001, + "max": 0.001 + }, + "baseline": 0.0, + "units": "degrees", + "enabled": false, + "description": "FIXED at 0 for flat backface", + "canvas_position": { + "x": 50, + "y": 1220 + } + } + ], + "extractors": [ + { + "id": "ext_001", + "name": "Zernike WFE Extractor", + "type": "zernike_opd", + "builtin": true, + "config": { + "inner_radius_mm": 0, + "outer_radius_mm": 500.0, + "n_modes": 50, + "filter_low_orders": 4, + "displacement_unit": "mm", + "reference_subcase": 2 + }, + "outputs": [ + { + "name": "wfe_40_20", + "metric": "filtered_rms_nm" + }, + { + "name": "wfe_60_20", + "metric": "filtered_rms_nm" + }, + { + "name": "mfg_90", + "metric": "filtered_rms_nm" + } + ], + "canvas_position": { + "x": 740, + "y": 100 + } + }, + { + "id": "ext_002", + "name": "Mass Extractor", + "type": "mass", + "builtin": true, + "outputs": [ + { + "name": "mass_kg", + "metric": "total" + } + ], + "canvas_position": { + "x": 740, + "y": 250 + } + } + ], + "objectives": [ + { + "id": "obj_001", + "name": "Filtered RMS WFE at 40 deg relative to 20 deg", + "direction": "minimize", + "weight": 6.0, + "source": { + "extractor_id": "ext_001", + "output_name": "wfe_40_20" + }, + "target": 4.0, + "units": "nm", + "canvas_position": { + "x": 1020, + "y": 100 + } + }, + { + "id": "obj_002", + "name": "Filtered RMS WFE at 60 deg relative to 20 deg", + "direction": "minimize", + "weight": 5.0, + "source": { + "extractor_id": "ext_001", + "output_name": "wfe_60_20" + }, + "target": 10.0, + "units": "nm", + "canvas_position": { + "x": 1020, + "y": 200 + } + }, + { + "id": "obj_003", + "name": "Manufacturing deformation at 90 deg polishing", + "direction": "minimize", + "weight": 3.0, + "source": { + "extractor_id": "ext_001", + "output_name": "mfg_90" + }, + "target": 20.0, + "units": "nm", + "canvas_position": { + "x": 1020, + "y": 300 + } + } + ], + "constraints": [ + { + "id": "con_001", + "name": "Maximum blank mass constraint", + "type": "hard", + "operator": "<=", + "threshold": 120.0, + "source": { + "extractor_id": "ext_002", + "output_name": "mass_kg" + }, + "penalty_config": { + "method": "quadratic", + "weight": 1000.0 + }, + "canvas_position": { + "x": 1020, + "y": 400 + } + } + ], + "optimization": { + "algorithm": { + "type": "SAT_v3", + "config": {} + }, + "budget": { + "max_trials": 300 + }, + "canvas_position": { + "x": 1300, + "y": 150 + }, + "surrogate": { + "enabled": true, + "type": "ensemble", + "config": { + "n_models": 5, + "architecture": [ + 128, + 64, + 32 + ], + "train_every_n_trials": 20, + "min_training_samples": 30 + } + } + }, + "canvas": { + "edges": [ + { + "source": "dv_001", + "target": "model" + }, + { + "source": "dv_002", + "target": "model" + }, + { + "source": "dv_003", + "target": "model" + }, + { + "source": "dv_004", + "target": "model" + }, + { + "source": "dv_005", + "target": "model" + }, + { + "source": "dv_006", + "target": "model" + }, + { + "source": "dv_007", + "target": "model" + }, + { + "source": "dv_008", + "target": "model" + }, + { + "source": "dv_009", + "target": "model" + }, + { + "source": "dv_010", + "target": "model" + }, + { + "source": "dv_011", + "target": "model" + }, + { + "source": "dv_012", + "target": "model" + }, + { + "source": "dv_013", + "target": "model" + }, + { + "source": "dv_014", + "target": "model" + }, + { + "source": "dv_015", + "target": "model" + }, + { + "source": "model", + "target": "solver" + }, + { + "source": "solver", + "target": "ext_001" + }, + { + "source": "solver", + "target": "ext_002" + }, + { + "source": "ext_001", + "target": "obj_001" + }, + { + "source": "ext_001", + "target": "obj_002" + }, + { + "source": "ext_001", + "target": "obj_003" + }, + { + "source": "ext_002", + "target": "con_001" + }, + { + "source": "obj_001", + "target": "optimization" + }, + { + "source": "obj_002", + "target": "optimization" + }, + { + "source": "obj_003", + "target": "optimization" + }, + { + "source": "con_001", + "target": "optimization" + } + ], + "layout_version": "2.0" + }, + "workflow": { + "stages": [ + { + "id": "stage_exploration", + "name": "Design Space Exploration", + "algorithm": "RandomSearch", + "trials": 30, + "purpose": "Build initial training data for surrogate" + }, + { + "id": "stage_optimization", + "name": "Surrogate-Assisted Optimization", + "algorithm": "SAT_v3", + "trials": 270, + "purpose": "Neural-accelerated optimization" + } + ], + "transitions": [ + { + "from": "stage_exploration", + "to": "stage_optimization", + "condition": "trial_count >= 30" + } + ] + } +} \ No newline at end of file diff --git a/studies/M1_Mirror/m1_mirror_cost_reduction_flat_back_V9/atomizer_spec.json b/studies/M1_Mirror/m1_mirror_cost_reduction_flat_back_V9/atomizer_spec.json new file mode 100644 index 00000000..1b8fa75e --- /dev/null +++ b/studies/M1_Mirror/m1_mirror_cost_reduction_flat_back_V9/atomizer_spec.json @@ -0,0 +1,582 @@ +{ + "meta": { + "version": "2.0", + "created": "2026-01-17T15:35:12.022867Z", + "modified": "2026-01-17T15:35:12.022867Z", + "created_by": "migration", + "modified_by": "migration", + "study_name": "m1_mirror_cost_reduction_flat_back_v9", + "description": "Self-Aware Turbo v3 with ALL campaign data (601 samples), adaptive exploration schedule, optimal mass region targeting (115-120 kg), and L-BFGS polish phase.", + "tags": [ + "SAT-v3-200", + "mirror", + "zernike", + "opd" + ], + "engineering_context": "Cost reduction option C for Schott Quote revisions" + }, + "model": { + "sim": { + "path": "ASSY_M1_assyfem1_sim1.sim", + "solver": "nastran" + }, + "nx_settings": { + "nx_install_path": "C:\\Program Files\\Siemens\\DesigncenterNX2512", + "simulation_timeout_s": 600 + } + }, + "design_variables": [ + { + "id": "dv_001", + "name": "whiffle_min", + "expression_name": "whiffle_min", + "type": "continuous", + "bounds": { + "min": 30.0, + "max": 72.0 + }, + "baseline": 51.0, + "units": "mm", + "enabled": true, + "description": "", + "canvas_position": { + "x": 50, + "y": 100 + } + }, + { + "id": "dv_002", + "name": "whiffle_outer_to_vertical", + "expression_name": "whiffle_outer_to_vertical", + "type": "continuous", + "bounds": { + "min": 70.0, + "max": 85.0 + }, + "baseline": 77.5, + "units": "degrees", + "enabled": true, + "description": "", + "canvas_position": { + "x": 50, + "y": 180 + } + }, + { + "id": "dv_003", + "name": "whiffle_triangle_closeness", + "expression_name": "whiffle_triangle_closeness", + "type": "continuous", + "bounds": { + "min": 65.0, + "max": 120.0 + }, + "baseline": 92.5, + "units": "mm", + "enabled": true, + "description": "", + "canvas_position": { + "x": 50, + "y": 260 + } + }, + { + "id": "dv_004", + "name": "lateral_inner_angle", + "expression_name": "lateral_inner_angle", + "type": "continuous", + "bounds": { + "min": 25.0, + "max": 30.0 + }, + "baseline": 27.5, + "units": "degrees", + "enabled": true, + "description": "", + "canvas_position": { + "x": 50, + "y": 340 + } + }, + { + "id": "dv_005", + "name": "lateral_outer_angle", + "expression_name": "lateral_outer_angle", + "type": "continuous", + "bounds": { + "min": 11.0, + "max": 17.0 + }, + "baseline": 14.0, + "units": "degrees", + "enabled": true, + "description": "", + "canvas_position": { + "x": 50, + "y": 420 + } + }, + { + "id": "dv_006", + "name": "lateral_outer_pivot", + "expression_name": "lateral_outer_pivot", + "type": "continuous", + "bounds": { + "min": 7.0, + "max": 12.0 + }, + "baseline": 9.5, + "units": "mm", + "enabled": true, + "description": "", + "canvas_position": { + "x": 50, + "y": 500 + } + }, + { + "id": "dv_007", + "name": "lateral_inner_pivot", + "expression_name": "lateral_inner_pivot", + "type": "continuous", + "bounds": { + "min": 5.0, + "max": 12.0 + }, + "baseline": 8.5, + "units": "mm", + "enabled": true, + "description": "", + "canvas_position": { + "x": 50, + "y": 580 + } + }, + { + "id": "dv_008", + "name": "lateral_middle_pivot", + "expression_name": "lateral_middle_pivot", + "type": "continuous", + "bounds": { + "min": 15.0, + "max": 27.0 + }, + "baseline": 21.0, + "units": "mm", + "enabled": true, + "description": "", + "canvas_position": { + "x": 50, + "y": 660 + } + }, + { + "id": "dv_009", + "name": "lateral_closeness", + "expression_name": "lateral_closeness", + "type": "continuous", + "bounds": { + "min": 7.0, + "max": 12.0 + }, + "baseline": 9.5, + "units": "mm", + "enabled": true, + "description": "", + "canvas_position": { + "x": 50, + "y": 740 + } + }, + { + "id": "dv_010", + "name": "rib_thickness", + "expression_name": "rib_thickness", + "type": "continuous", + "bounds": { + "min": 8.0, + "max": 12.0 + }, + "baseline": 10.0, + "units": "mm", + "enabled": true, + "description": "", + "canvas_position": { + "x": 50, + "y": 820 + } + }, + { + "id": "dv_011", + "name": "ribs_circular_thk", + "expression_name": "ribs_circular_thk", + "type": "continuous", + "bounds": { + "min": 7.0, + "max": 12.0 + }, + "baseline": 9.5, + "units": "mm", + "enabled": true, + "description": "", + "canvas_position": { + "x": 50, + "y": 900 + } + }, + { + "id": "dv_012", + "name": "rib_thickness_lateral_truss", + "expression_name": "rib_thickness_lateral_truss", + "type": "continuous", + "bounds": { + "min": 8.0, + "max": 14.0 + }, + "baseline": 12.0, + "units": "mm", + "enabled": true, + "description": "", + "canvas_position": { + "x": 50, + "y": 980 + } + }, + { + "id": "dv_013", + "name": "mirror_face_thickness", + "expression_name": "mirror_face_thickness", + "type": "continuous", + "bounds": { + "min": 15.0, + "max": 20.0 + }, + "baseline": 17.5, + "units": "mm", + "enabled": true, + "description": "", + "canvas_position": { + "x": 50, + "y": 1060 + } + }, + { + "id": "dv_014", + "name": "center_thickness", + "expression_name": "center_thickness", + "type": "continuous", + "bounds": { + "min": 75.0, + "max": 85.0 + }, + "baseline": 80.0, + "units": "mm", + "enabled": true, + "description": "", + "canvas_position": { + "x": 50, + "y": 1140 + } + }, + { + "id": "dv_015", + "name": "blank_backface_angle", + "expression_name": "blank_backface_angle", + "type": "continuous", + "bounds": { + "min": -0.001, + "max": 0.001 + }, + "baseline": 0.0, + "units": "degrees", + "enabled": false, + "description": "FIXED at 0 for flat backface", + "canvas_position": { + "x": 50, + "y": 1220 + } + } + ], + "extractors": [ + { + "id": "ext_001", + "name": "Zernike WFE Extractor", + "type": "zernike_opd", + "builtin": true, + "config": { + "inner_radius_mm": 0, + "outer_radius_mm": 500.0, + "n_modes": 50, + "filter_low_orders": 4, + "displacement_unit": "mm", + "reference_subcase": 2 + }, + "outputs": [ + { + "name": "wfe_40_20", + "metric": "filtered_rms_nm" + }, + { + "name": "wfe_60_20", + "metric": "filtered_rms_nm" + }, + { + "name": "mfg_90", + "metric": "filtered_rms_nm" + } + ], + "canvas_position": { + "x": 740, + "y": 100 + } + }, + { + "id": "ext_002", + "name": "Mass Extractor", + "type": "mass", + "builtin": true, + "outputs": [ + { + "name": "mass_kg", + "metric": "total" + } + ], + "canvas_position": { + "x": 740, + "y": 250 + } + } + ], + "objectives": [ + { + "id": "obj_001", + "name": "Filtered RMS WFE at 40 deg relative to 20 deg", + "direction": "minimize", + "weight": 6.0, + "source": { + "extractor_id": "ext_001", + "output_name": "wfe_40_20" + }, + "target": 4.0, + "units": "nm", + "canvas_position": { + "x": 1020, + "y": 100 + } + }, + { + "id": "obj_002", + "name": "Filtered RMS WFE at 60 deg relative to 20 deg", + "direction": "minimize", + "weight": 5.0, + "source": { + "extractor_id": "ext_001", + "output_name": "wfe_60_20" + }, + "target": 10.0, + "units": "nm", + "canvas_position": { + "x": 1020, + "y": 200 + } + }, + { + "id": "obj_003", + "name": "Manufacturing deformation at 90 deg polishing", + "direction": "minimize", + "weight": 3.0, + "source": { + "extractor_id": "ext_001", + "output_name": "mfg_90" + }, + "target": 20.0, + "units": "nm", + "canvas_position": { + "x": 1020, + "y": 300 + } + } + ], + "constraints": [ + { + "id": "con_001", + "name": "Maximum blank mass constraint", + "type": "hard", + "operator": "<=", + "threshold": 120.0, + "source": { + "extractor_id": "ext_002", + "output_name": "mass_kg" + }, + "penalty_config": { + "method": "quadratic", + "weight": 1000.0 + }, + "canvas_position": { + "x": 1020, + "y": 400 + } + } + ], + "optimization": { + "algorithm": { + "type": "SAT_v3", + "config": {} + }, + "budget": { + "max_trials": 200 + }, + "canvas_position": { + "x": 1300, + "y": 150 + }, + "surrogate": { + "enabled": true, + "type": "ensemble", + "config": { + "n_models": 5, + "architecture": [ + 128, + 64, + 32 + ], + "train_every_n_trials": 20, + "min_training_samples": 30 + } + } + }, + "canvas": { + "edges": [ + { + "source": "dv_001", + "target": "model" + }, + { + "source": "dv_002", + "target": "model" + }, + { + "source": "dv_003", + "target": "model" + }, + { + "source": "dv_004", + "target": "model" + }, + { + "source": "dv_005", + "target": "model" + }, + { + "source": "dv_006", + "target": "model" + }, + { + "source": "dv_007", + "target": "model" + }, + { + "source": "dv_008", + "target": "model" + }, + { + "source": "dv_009", + "target": "model" + }, + { + "source": "dv_010", + "target": "model" + }, + { + "source": "dv_011", + "target": "model" + }, + { + "source": "dv_012", + "target": "model" + }, + { + "source": "dv_013", + "target": "model" + }, + { + "source": "dv_014", + "target": "model" + }, + { + "source": "dv_015", + "target": "model" + }, + { + "source": "model", + "target": "solver" + }, + { + "source": "solver", + "target": "ext_001" + }, + { + "source": "solver", + "target": "ext_002" + }, + { + "source": "ext_001", + "target": "obj_001" + }, + { + "source": "ext_001", + "target": "obj_002" + }, + { + "source": "ext_001", + "target": "obj_003" + }, + { + "source": "ext_002", + "target": "con_001" + }, + { + "source": "obj_001", + "target": "optimization" + }, + { + "source": "obj_002", + "target": "optimization" + }, + { + "source": "obj_003", + "target": "optimization" + }, + { + "source": "con_001", + "target": "optimization" + } + ], + "layout_version": "2.0" + }, + "workflow": { + "stages": [ + { + "id": "stage_exploration", + "name": "Design Space Exploration", + "algorithm": "RandomSearch", + "trials": 30, + "purpose": "Build initial training data for surrogate" + }, + { + "id": "stage_optimization", + "name": "Surrogate-Assisted Optimization", + "algorithm": "SAT_v3", + "trials": 170, + "purpose": "Neural-accelerated optimization" + } + ], + "transitions": [ + { + "from": "stage_exploration", + "to": "stage_optimization", + "condition": "trial_count >= 30" + } + ] + } +} \ No newline at end of file diff --git a/studies/M1_Mirror/m1_mirror_cost_reduction_lateral/atomizer_spec.json b/studies/M1_Mirror/m1_mirror_cost_reduction_lateral/atomizer_spec.json new file mode 100644 index 00000000..d7d327b8 --- /dev/null +++ b/studies/M1_Mirror/m1_mirror_cost_reduction_lateral/atomizer_spec.json @@ -0,0 +1,400 @@ +{ + "meta": { + "version": "2.0", + "created": "2026-01-17T15:35:12.024432Z", + "modified": "2026-01-17T16:33:51.000000Z", + "created_by": "migration", + "modified_by": "claude", + "study_name": "m1_mirror_cost_reduction_lateral", + "description": "Lateral support optimization with new U-joint expressions (lateral_inner_u, lateral_outer_u) for cost reduction model. Focus on WFE and MFG only - no mass objective.", + "tags": [ + "CMA-ES-100", + "mirror", + "zernike", + "opd" + ], + "engineering_context": "Optimize lateral support geometry using new U-joint parameterization on cost reduction model" + }, + "model": { + "sim": { + "path": "ASSY_M1_assyfem1_sim1.sim", + "solver": "nastran" + }, + "nx_settings": { + "nx_install_path": "C:\\Program Files\\Siemens\\DesigncenterNX2512", + "simulation_timeout_s": 600 + } + }, + "design_variables": [ + { + "id": "dv_001", + "name": "lateral_inner_u", + "expression_name": "lateral_inner_u", + "type": "continuous", + "bounds": { + "min": 0.2, + "max": 0.95 + }, + "baseline": 0.3, + "units": "unitless", + "enabled": true, + "description": "U-joint ratio for inner lateral support (replaces lateral_inner_pivot)", + "canvas_position": { + "x": 50, + "y": 100 + } + }, + { + "id": "dv_002", + "name": "lateral_outer_u", + "expression_name": "lateral_outer_u", + "type": "continuous", + "bounds": { + "min": 0.2, + "max": 0.95 + }, + "baseline": 0.8, + "units": "unitless", + "enabled": true, + "description": "U-joint ratio for outer lateral support (replaces lateral_outer_pivot)", + "canvas_position": { + "x": 50, + "y": 180 + } + }, + { + "id": "dv_003", + "name": "lateral_middle_pivot", + "expression_name": "lateral_middle_pivot", + "type": "continuous", + "bounds": { + "min": 15.0, + "max": 27.0 + }, + "baseline": 21.07, + "units": "mm", + "enabled": true, + "description": "Middle pivot position on lateral support", + "canvas_position": { + "x": 50, + "y": 260 + } + }, + { + "id": "dv_004", + "name": "lateral_inner_angle", + "expression_name": "lateral_inner_angle", + "type": "continuous", + "bounds": { + "min": 25.0, + "max": 35.0 + }, + "baseline": 31.93, + "units": "degrees", + "enabled": true, + "description": "Inner lateral support angle", + "canvas_position": { + "x": 50, + "y": 340 + } + }, + { + "id": "dv_005", + "name": "lateral_outer_angle", + "expression_name": "lateral_outer_angle", + "type": "continuous", + "bounds": { + "min": 8.0, + "max": 17.0 + }, + "baseline": 10.77, + "units": "degrees", + "enabled": true, + "description": "Outer lateral support angle", + "canvas_position": { + "x": 50, + "y": 420 + } + }, + { + "id": "dv_006", + "name": "hole_dia1", + "expression_name": "hole_dia1", + "type": "continuous", + "bounds": { + "min": 5.0, + "max": 25.0 + }, + "baseline": 15.0, + "units": "mm", + "enabled": true, + "description": "Diameter of hole pattern 1", + "canvas_position": { + "x": 50, + "y": 500 + } + }, + { + "id": "dv_007", + "name": "hole_dia2", + "expression_name": "hole_dia2", + "type": "continuous", + "bounds": { + "min": 5.0, + "max": 25.0 + }, + "baseline": 15.0, + "units": "mm", + "enabled": true, + "description": "Diameter of hole pattern 2", + "canvas_position": { + "x": 50, + "y": 580 + } + } + ], + "extractors": [ + { + "id": "ext_001", + "name": "Zernike WFE Extractor", + "type": "zernike_opd", + "builtin": true, + "config": { + "inner_radius_mm": 135.75, + "outer_radius_mm": 500.0, + "n_modes": 50, + "filter_low_orders": 4, + "displacement_unit": "mm", + "reference_subcase": 2 + }, + "outputs": [ + { + "name": "wfe_40_20", + "metric": "filtered_rms_nm" + }, + { + "name": "wfe_60_20", + "metric": "filtered_rms_nm" + }, + { + "name": "mfg_90", + "metric": "filtered_rms_nm" + } + ], + "canvas_position": { + "x": 740, + "y": 100 + } + }, + { + "id": "ext_002", + "name": "Mass Extractor", + "type": "mass", + "builtin": true, + "outputs": [ + { + "name": "mass_kg", + "metric": "total" + } + ], + "canvas_position": { + "x": 740, + "y": 250 + } + }, + { + "id": "ext_003", + "name": "Volume Extractor", + "type": "custom", + "builtin": false, + "config": { + "density_kg_m3": 2530.0 + }, + "custom_function": { + "name": "extract_volume", + "code": "def extract_volume(trial_dir, config, context):\n \"\"\"\n Extract volume from mass using material density.\n Volume = Mass / Density\n \n For Zerodur glass-ceramic: density ~ 2530 kg/m³\n \"\"\"\n import json\n from pathlib import Path\n \n # Get mass from the mass extractor results\n results_file = Path(trial_dir) / 'results.json'\n if results_file.exists():\n with open(results_file) as f:\n results = json.load(f)\n mass_kg = results.get('mass_kg', 0)\n else:\n # If no results yet, try to get from context\n mass_kg = context.get('mass_kg', 0)\n \n density = config.get('density_kg_m3', 2530.0) # Zerodur default\n \n # Volume in m³\n volume_m3 = mass_kg / density if density > 0 else 0\n \n # Also calculate in liters for convenience (1 m³ = 1000 L)\n volume_liters = volume_m3 * 1000\n \n return {\n 'volume_m3': volume_m3,\n 'volume_liters': volume_liters\n }\n" + }, + "outputs": [ + { + "name": "volume_m3", + "metric": "total" + }, + { + "name": "volume_liters", + "metric": "total" + } + ], + "canvas_position": { + "x": 740, + "y": 400 + } + } + ], + "objectives": [ + { + "id": "obj_001", + "name": "Filtered RMS WFE at 40 deg relative to 20 deg (annular)", + "direction": "minimize", + "weight": 6.0, + "source": { + "extractor_id": "ext_001", + "output_name": "wfe_40_20" + }, + "target": 4.0, + "units": "nm", + "canvas_position": { + "x": 1020, + "y": 100 + } + }, + { + "id": "obj_002", + "name": "Filtered RMS WFE at 60 deg relative to 20 deg (annular)", + "direction": "minimize", + "weight": 5.0, + "source": { + "extractor_id": "ext_001", + "output_name": "wfe_60_20" + }, + "target": 10.0, + "units": "nm", + "canvas_position": { + "x": 1020, + "y": 200 + } + }, + { + "id": "obj_003", + "name": "Manufacturing deformation at 90 deg polishing (J1-J3 filtered, annular)", + "direction": "minimize", + "weight": 3.0, + "source": { + "extractor_id": "ext_001", + "output_name": "mfg_90" + }, + "target": 20.0, + "units": "nm", + "canvas_position": { + "x": 1020, + "y": 300 + } + } + ], + "constraints": [ + { + "id": "con_001", + "name": "Maximum blank mass constraint (still enforced even though mass not optimized)", + "type": "hard", + "operator": "<=", + "threshold": 120.0, + "source": { + "extractor_id": "ext_002", + "output_name": "mass_kg" + }, + "penalty_config": { + "method": "quadratic", + "weight": 1000.0 + }, + "canvas_position": { + "x": 1020, + "y": 400 + } + } + ], + "optimization": { + "algorithm": { + "type": "CMA-ES", + "config": { + "sigma0": 0.3 + } + }, + "budget": { + "max_trials": 100 + }, + "canvas_position": { + "x": 1300, + "y": 150 + } + }, + "canvas": { + "edges": [ + { + "source": "dv_001", + "target": "model" + }, + { + "source": "dv_002", + "target": "model" + }, + { + "source": "dv_003", + "target": "model" + }, + { + "source": "dv_004", + "target": "model" + }, + { + "source": "dv_005", + "target": "model" + }, + { + "source": "dv_006", + "target": "model" + }, + { + "source": "dv_007", + "target": "model" + }, + { + "source": "model", + "target": "solver" + }, + { + "source": "solver", + "target": "ext_001" + }, + { + "source": "solver", + "target": "ext_002" + }, + { + "source": "solver", + "target": "ext_003" + }, + { + "source": "ext_001", + "target": "obj_001" + }, + { + "source": "ext_001", + "target": "obj_002" + }, + { + "source": "ext_001", + "target": "obj_003" + }, + { + "source": "ext_002", + "target": "con_001" + }, + { + "source": "obj_001", + "target": "optimization" + }, + { + "source": "obj_002", + "target": "optimization" + }, + { + "source": "obj_003", + "target": "optimization" + }, + { + "source": "con_001", + "target": "optimization" + } + ], + "layout_version": "2.0" + } +} \ No newline at end of file diff --git a/studies/M1_Mirror/m1_mirror_flat_back_final/atomizer_spec.json b/studies/M1_Mirror/m1_mirror_flat_back_final/atomizer_spec.json new file mode 100644 index 00000000..47b8144b --- /dev/null +++ b/studies/M1_Mirror/m1_mirror_flat_back_final/atomizer_spec.json @@ -0,0 +1,259 @@ +{ + "meta": { + "version": "2.0", + "created": "2026-01-17T15:35:12.032823Z", + "modified": "2026-01-17T15:35:12.032823Z", + "created_by": "migration", + "modified_by": "migration", + "study_name": "m1_mirror_flat_back_final", + "description": "Final whiffle refinement starting from V10 iter123 (best mass design). Only 2 variables: whiffle_min and whiffle_triangle_closeness. Uses CMA-ES for efficient 2D optimization.", + "tags": [ + "CMA-ES-60", + "mirror", + "zernike", + "opd" + ], + "engineering_context": "Final optimization of whiffle parameters for flat back design" + }, + "model": { + "sim": { + "path": "ASSY_M1_assyfem1_sim1.sim", + "solver": "nastran" + }, + "nx_settings": { + "nx_install_path": "C:\\Program Files\\Siemens\\DesigncenterNX2512", + "simulation_timeout_s": 600 + } + }, + "design_variables": [ + { + "id": "dv_001", + "name": "whiffle_min", + "expression_name": "whiffle_min", + "type": "continuous", + "bounds": { + "min": 35.0, + "max": 85.0 + }, + "baseline": 70.77, + "units": "mm", + "enabled": true, + "description": "Minimum whiffle tree arm length - affects support stiffness distribution", + "canvas_position": { + "x": 50, + "y": 100 + } + }, + { + "id": "dv_002", + "name": "whiffle_triangle_closeness", + "expression_name": "whiffle_triangle_closeness", + "type": "continuous", + "bounds": { + "min": 55.0, + "max": 110.0 + }, + "baseline": 69.02, + "units": "mm", + "enabled": true, + "description": "Closeness of whiffle triangle vertices - affects load distribution geometry", + "canvas_position": { + "x": 50, + "y": 180 + } + } + ], + "extractors": [ + { + "id": "ext_001", + "name": "Zernike WFE Extractor", + "type": "zernike_opd", + "builtin": true, + "config": { + "inner_radius_mm": 135.75, + "outer_radius_mm": 500.0, + "n_modes": 50, + "filter_low_orders": 4, + "displacement_unit": "mm", + "reference_subcase": 2 + }, + "outputs": [ + { + "name": "wfe_40_20", + "metric": "filtered_rms_nm" + }, + { + "name": "wfe_60_20", + "metric": "filtered_rms_nm" + }, + { + "name": "mfg_90", + "metric": "filtered_rms_nm" + } + ], + "canvas_position": { + "x": 740, + "y": 100 + } + }, + { + "id": "ext_002", + "name": "Mass Extractor", + "type": "mass", + "builtin": true, + "outputs": [ + { + "name": "mass_kg", + "metric": "total" + } + ], + "canvas_position": { + "x": 740, + "y": 250 + } + } + ], + "objectives": [ + { + "id": "obj_001", + "name": "Filtered RMS WFE at 40 deg relative to 20 deg (annular)", + "direction": "minimize", + "weight": 6.0, + "source": { + "extractor_id": "ext_001", + "output_name": "wfe_40_20" + }, + "target": 4.0, + "units": "nm", + "canvas_position": { + "x": 1020, + "y": 100 + } + }, + { + "id": "obj_002", + "name": "Filtered RMS WFE at 60 deg relative to 20 deg (annular)", + "direction": "minimize", + "weight": 5.0, + "source": { + "extractor_id": "ext_001", + "output_name": "wfe_60_20" + }, + "target": 10.0, + "units": "nm", + "canvas_position": { + "x": 1020, + "y": 200 + } + }, + { + "id": "obj_003", + "name": "Manufacturing deformation at 90 deg polishing (J1-J3 filtered, annular)", + "direction": "minimize", + "weight": 3.0, + "source": { + "extractor_id": "ext_001", + "output_name": "mfg_90" + }, + "target": 20.0, + "units": "nm", + "canvas_position": { + "x": 1020, + "y": 300 + } + } + ], + "constraints": [ + { + "id": "con_001", + "name": "Maximum blank mass constraint", + "type": "hard", + "operator": "<=", + "threshold": 120.0, + "source": { + "extractor_id": "ext_002", + "output_name": "mass_kg" + }, + "penalty_config": { + "method": "quadratic", + "weight": 1000.0 + }, + "canvas_position": { + "x": 1020, + "y": 400 + } + } + ], + "optimization": { + "algorithm": { + "type": "CMA-ES", + "config": { + "sigma0": 0.3 + } + }, + "budget": { + "max_trials": 60 + }, + "canvas_position": { + "x": 1300, + "y": 150 + } + }, + "canvas": { + "edges": [ + { + "source": "dv_001", + "target": "model" + }, + { + "source": "dv_002", + "target": "model" + }, + { + "source": "model", + "target": "solver" + }, + { + "source": "solver", + "target": "ext_001" + }, + { + "source": "solver", + "target": "ext_002" + }, + { + "source": "ext_001", + "target": "obj_001" + }, + { + "source": "ext_001", + "target": "obj_002" + }, + { + "source": "ext_001", + "target": "obj_003" + }, + { + "source": "ext_002", + "target": "con_001" + }, + { + "source": "obj_001", + "target": "optimization" + }, + { + "source": "obj_002", + "target": "optimization" + }, + { + "source": "obj_003", + "target": "optimization" + }, + { + "source": "con_001", + "target": "optimization" + } + ], + "layout_version": "2.0" + } +} \ No newline at end of file diff --git a/studies/M1_Mirror/m1_mirror_flatback_lateral/atomizer_spec.json b/studies/M1_Mirror/m1_mirror_flatback_lateral/atomizer_spec.json new file mode 100644 index 00000000..28ce5b26 --- /dev/null +++ b/studies/M1_Mirror/m1_mirror_flatback_lateral/atomizer_spec.json @@ -0,0 +1,325 @@ +{ + "meta": { + "version": "2.0", + "created": "2026-01-17T15:35:12.034330Z", + "modified": "2026-01-17T15:35:12.034330Z", + "created_by": "migration", + "modified_by": "migration", + "study_name": "m1_mirror_flatback_lateral", + "description": "Lateral support optimization with new U-joint expressions (lateral_inner_u, lateral_outer_u). Focus on WFE and MFG only - no mass objective.", + "tags": [ + "CMA-ES-100", + "mirror", + "zernike", + "opd" + ], + "engineering_context": "Optimize lateral support geometry using new U-joint parameterization" + }, + "model": { + "sim": { + "path": "ASSY_M1_assyfem1_sim1.sim", + "solver": "nastran" + }, + "nx_settings": { + "nx_install_path": "C:\\Program Files\\Siemens\\DesigncenterNX2512", + "simulation_timeout_s": 600 + } + }, + "design_variables": [ + { + "id": "dv_001", + "name": "lateral_inner_u", + "expression_name": "lateral_inner_u", + "type": "continuous", + "bounds": { + "min": 0.2, + "max": 0.95 + }, + "baseline": 0.4, + "units": "unitless", + "enabled": true, + "description": "U-joint ratio for inner lateral support (replaces lateral_inner_pivot)", + "canvas_position": { + "x": 50, + "y": 100 + } + }, + { + "id": "dv_002", + "name": "lateral_outer_u", + "expression_name": "lateral_outer_u", + "type": "continuous", + "bounds": { + "min": 0.2, + "max": 0.95 + }, + "baseline": 0.4, + "units": "unitless", + "enabled": true, + "description": "U-joint ratio for outer lateral support (replaces lateral_outer_pivot)", + "canvas_position": { + "x": 50, + "y": 180 + } + }, + { + "id": "dv_003", + "name": "lateral_middle_pivot", + "expression_name": "lateral_middle_pivot", + "type": "continuous", + "bounds": { + "min": 15.0, + "max": 27.0 + }, + "baseline": 22.42, + "units": "mm", + "enabled": true, + "description": "Middle pivot position on lateral support", + "canvas_position": { + "x": 50, + "y": 260 + } + }, + { + "id": "dv_004", + "name": "lateral_inner_angle", + "expression_name": "lateral_inner_angle", + "type": "continuous", + "bounds": { + "min": 25.0, + "max": 35.0 + }, + "baseline": 31.96, + "units": "degrees", + "enabled": true, + "description": "Inner lateral support angle", + "canvas_position": { + "x": 50, + "y": 340 + } + }, + { + "id": "dv_005", + "name": "lateral_outer_angle", + "expression_name": "lateral_outer_angle", + "type": "continuous", + "bounds": { + "min": 8.0, + "max": 17.0 + }, + "baseline": 9.08, + "units": "degrees", + "enabled": true, + "description": "Outer lateral support angle", + "canvas_position": { + "x": 50, + "y": 420 + } + } + ], + "extractors": [ + { + "id": "ext_001", + "name": "Zernike WFE Extractor", + "type": "zernike_opd", + "builtin": true, + "config": { + "inner_radius_mm": 135.75, + "outer_radius_mm": 500.0, + "n_modes": 50, + "filter_low_orders": 4, + "displacement_unit": "mm", + "reference_subcase": 2 + }, + "outputs": [ + { + "name": "wfe_40_20", + "metric": "filtered_rms_nm" + }, + { + "name": "wfe_60_20", + "metric": "filtered_rms_nm" + }, + { + "name": "mfg_90", + "metric": "filtered_rms_nm" + } + ], + "canvas_position": { + "x": 740, + "y": 100 + } + }, + { + "id": "ext_002", + "name": "Mass Extractor", + "type": "mass", + "builtin": true, + "outputs": [ + { + "name": "mass_kg", + "metric": "total" + } + ], + "canvas_position": { + "x": 740, + "y": 250 + } + } + ], + "objectives": [ + { + "id": "obj_001", + "name": "Filtered RMS WFE at 40 deg relative to 20 deg (annular)", + "direction": "minimize", + "weight": 6.0, + "source": { + "extractor_id": "ext_001", + "output_name": "wfe_40_20" + }, + "target": 4.0, + "units": "nm", + "canvas_position": { + "x": 1020, + "y": 100 + } + }, + { + "id": "obj_002", + "name": "Filtered RMS WFE at 60 deg relative to 20 deg (annular)", + "direction": "minimize", + "weight": 5.0, + "source": { + "extractor_id": "ext_001", + "output_name": "wfe_60_20" + }, + "target": 10.0, + "units": "nm", + "canvas_position": { + "x": 1020, + "y": 200 + } + }, + { + "id": "obj_003", + "name": "Manufacturing deformation at 90 deg polishing (J1-J3 filtered, annular)", + "direction": "minimize", + "weight": 3.0, + "source": { + "extractor_id": "ext_001", + "output_name": "mfg_90" + }, + "target": 20.0, + "units": "nm", + "canvas_position": { + "x": 1020, + "y": 300 + } + } + ], + "constraints": [ + { + "id": "con_001", + "name": "Maximum blank mass constraint (still enforced even though mass not optimized)", + "type": "hard", + "operator": "<=", + "threshold": 120.0, + "source": { + "extractor_id": "ext_002", + "output_name": "mass_kg" + }, + "penalty_config": { + "method": "quadratic", + "weight": 1000.0 + }, + "canvas_position": { + "x": 1020, + "y": 400 + } + } + ], + "optimization": { + "algorithm": { + "type": "CMA-ES", + "config": { + "sigma0": 0.3 + } + }, + "budget": { + "max_trials": 100 + }, + "canvas_position": { + "x": 1300, + "y": 150 + } + }, + "canvas": { + "edges": [ + { + "source": "dv_001", + "target": "model" + }, + { + "source": "dv_002", + "target": "model" + }, + { + "source": "dv_003", + "target": "model" + }, + { + "source": "dv_004", + "target": "model" + }, + { + "source": "dv_005", + "target": "model" + }, + { + "source": "model", + "target": "solver" + }, + { + "source": "solver", + "target": "ext_001" + }, + { + "source": "solver", + "target": "ext_002" + }, + { + "source": "ext_001", + "target": "obj_001" + }, + { + "source": "ext_001", + "target": "obj_002" + }, + { + "source": "ext_001", + "target": "obj_003" + }, + { + "source": "ext_002", + "target": "con_001" + }, + { + "source": "obj_001", + "target": "optimization" + }, + { + "source": "obj_002", + "target": "optimization" + }, + { + "source": "obj_003", + "target": "optimization" + }, + { + "source": "con_001", + "target": "optimization" + } + ], + "layout_version": "2.0" + } +} \ No newline at end of file diff --git a/studies/M1_Mirror/m1_mirror_surrogate_turbo/atomizer_spec.json b/studies/M1_Mirror/m1_mirror_surrogate_turbo/atomizer_spec.json new file mode 100644 index 00000000..6df0fab1 --- /dev/null +++ b/studies/M1_Mirror/m1_mirror_surrogate_turbo/atomizer_spec.json @@ -0,0 +1,461 @@ +{ + "meta": { + "version": "2.0", + "created": "2026-01-17T15:35:12.035839Z", + "modified": "2026-01-17T15:35:12.035839Z", + "created_by": "migration", + "modified_by": "migration", + "study_name": "m1_mirror_surrogate_turbo", + "description": "GNN surrogate turbo optimization trained on ~1000 FEA trials from V6-V9 (re-extracted) + V11-V12. Iterative refinement with 5 FEA validations per turbo cycle.", + "tags": [ + "mirror", + "zernike", + "opd" + ] + }, + "model": { + "sim": { + "path": "ASSY_M1_assyfem1_sim1.sim", + "solver": "nastran" + }, + "nx_settings": { + "nx_install_path": "C:\\Program Files\\Siemens\\DesigncenterNX2512", + "simulation_timeout_s": 600 + } + }, + "design_variables": [ + { + "id": "dv_001", + "name": "whiffle_min", + "expression_name": "whiffle_min", + "type": "continuous", + "bounds": { + "min": 30.0, + "max": 72.0 + }, + "baseline": 61.9189, + "units": "mm", + "enabled": true, + "description": "Inner whiffle tree contact radius", + "canvas_position": { + "x": 50, + "y": 100 + } + }, + { + "id": "dv_002", + "name": "whiffle_outer_to_vertical", + "expression_name": "whiffle_outer_to_vertical", + "type": "continuous", + "bounds": { + "min": 70.0, + "max": 85.0 + }, + "baseline": 81.7479, + "units": "mm", + "enabled": true, + "description": "Outer whiffle arm length", + "canvas_position": { + "x": 50, + "y": 180 + } + }, + { + "id": "dv_003", + "name": "whiffle_triangle_closeness", + "expression_name": "whiffle_triangle_closeness", + "type": "continuous", + "bounds": { + "min": 65.0, + "max": 120.0 + }, + "baseline": 65.5418, + "units": "mm", + "enabled": true, + "description": "Whiffle triangle geometry", + "canvas_position": { + "x": 50, + "y": 260 + } + }, + { + "id": "dv_004", + "name": "blank_backface_angle", + "expression_name": "blank_backface_angle", + "type": "continuous", + "bounds": { + "min": 4.2, + "max": 4.5 + }, + "baseline": 4.4158, + "units": "degrees", + "enabled": true, + "description": "Back face taper angle (affects mass)", + "canvas_position": { + "x": 50, + "y": 340 + } + }, + { + "id": "dv_005", + "name": "lateral_inner_angle", + "expression_name": "lateral_inner_angle", + "type": "continuous", + "bounds": { + "min": 25.0, + "max": 30.0 + }, + "baseline": 29.9005, + "units": "degrees", + "enabled": true, + "description": "Angle of inner lateral support constraint", + "canvas_position": { + "x": 50, + "y": 420 + } + }, + { + "id": "dv_006", + "name": "lateral_outer_angle", + "expression_name": "lateral_outer_angle", + "type": "continuous", + "bounds": { + "min": 11.0, + "max": 17.0 + }, + "baseline": 11.759, + "units": "degrees", + "enabled": true, + "description": "Angle of outer lateral support constraint", + "canvas_position": { + "x": 50, + "y": 500 + } + }, + { + "id": "dv_007", + "name": "lateral_outer_pivot", + "expression_name": "lateral_outer_pivot", + "type": "continuous", + "bounds": { + "min": 7.0, + "max": 12.0 + }, + "baseline": 11.1336, + "units": "degrees", + "enabled": true, + "description": "Pivot position for outer lateral", + "canvas_position": { + "x": 50, + "y": 580 + } + }, + { + "id": "dv_008", + "name": "lateral_inner_pivot", + "expression_name": "lateral_inner_pivot", + "type": "continuous", + "bounds": { + "min": 5.0, + "max": 12.0 + }, + "baseline": 6.5186, + "units": "degrees", + "enabled": true, + "description": "Pivot position for inner lateral", + "canvas_position": { + "x": 50, + "y": 660 + } + }, + { + "id": "dv_009", + "name": "lateral_middle_pivot", + "expression_name": "lateral_middle_pivot", + "type": "continuous", + "bounds": { + "min": 15.0, + "max": 27.0 + }, + "baseline": 22.3907, + "units": "degrees", + "enabled": true, + "description": "Pivot position for middle lateral", + "canvas_position": { + "x": 50, + "y": 740 + } + }, + { + "id": "dv_010", + "name": "lateral_closeness", + "expression_name": "lateral_closeness", + "type": "continuous", + "bounds": { + "min": 7.0, + "max": 12.0 + }, + "baseline": 8.685, + "units": "degrees", + "enabled": true, + "description": "Closeness factor for lateral supports", + "canvas_position": { + "x": 50, + "y": 820 + } + } + ], + "extractors": [ + { + "id": "ext_001", + "name": "Zernike WFE Extractor", + "type": "zernike_opd", + "builtin": true, + "config": { + "inner_radius_mm": 0, + "outer_radius_mm": 500.0, + "n_modes": 50, + "filter_low_orders": 4, + "displacement_unit": "mm", + "reference_subcase": 2 + }, + "outputs": [ + { + "name": "rel_filtered_rms_40_vs_20", + "metric": "filtered_rms_nm" + }, + { + "name": "rel_filtered_rms_60_vs_20", + "metric": "filtered_rms_nm" + }, + { + "name": "mfg_90_optician_workload", + "metric": "filtered_rms_nm" + }, + { + "name": "mass_kg", + "metric": "filtered_rms_nm" + } + ], + "canvas_position": { + "x": 740, + "y": 100 + } + }, + { + "id": "ext_002", + "name": "Mass Extractor", + "type": "mass", + "builtin": true, + "outputs": [ + { + "name": "mass_kg", + "metric": "total" + } + ], + "canvas_position": { + "x": 740, + "y": 250 + } + } + ], + "objectives": [ + { + "id": "obj_001", + "name": "Filtered RMS WFE at 40 deg relative to 20 deg reference (ZernikeOPD)", + "direction": "minimize", + "weight": 5.0, + "source": { + "extractor_id": "ext_001", + "output_name": "rel_filtered_rms_40_vs_20" + }, + "target": 4.0, + "units": "nm", + "canvas_position": { + "x": 1020, + "y": 100 + } + }, + { + "id": "obj_002", + "name": "Filtered RMS WFE at 60 deg relative to 20 deg reference (ZernikeOPD)", + "direction": "minimize", + "weight": 5.0, + "source": { + "extractor_id": "ext_001", + "output_name": "rel_filtered_rms_60_vs_20" + }, + "target": 10.0, + "units": "nm", + "canvas_position": { + "x": 1020, + "y": 200 + } + }, + { + "id": "obj_003", + "name": "Manufacturing deformation at 90 deg polishing (J1-J3 filtered RMS, ZernikeOPD)", + "direction": "minimize", + "weight": 3.0, + "source": { + "extractor_id": "ext_001", + "output_name": "mfg_90_optician_workload" + }, + "target": 20.0, + "units": "nm", + "canvas_position": { + "x": 1020, + "y": 300 + } + }, + { + "id": "obj_004", + "name": "Total mass of M1_Blank part", + "direction": "minimize", + "weight": 1.0, + "source": { + "extractor_id": "ext_001", + "output_name": "mass_kg" + }, + "target": null, + "units": "kg", + "canvas_position": { + "x": 1020, + "y": 400 + } + } + ], + "constraints": [ + { + "id": "con_001", + "name": "Maximum blank mass constraint: must be <= 105 kg", + "type": "hard", + "operator": "<=", + "threshold": 105.0, + "source": { + "extractor_id": "ext_002", + "output_name": "mass_kg" + }, + "penalty_config": { + "method": "quadratic", + "weight": 1000.0 + }, + "canvas_position": { + "x": 1020, + "y": 400 + } + } + ], + "optimization": { + "algorithm": { + "type": "TPE", + "config": { + "n_startup_trials": 10 + } + }, + "budget": { + "max_trials": 100 + }, + "canvas_position": { + "x": 1300, + "y": 150 + } + }, + "canvas": { + "edges": [ + { + "source": "dv_001", + "target": "model" + }, + { + "source": "dv_002", + "target": "model" + }, + { + "source": "dv_003", + "target": "model" + }, + { + "source": "dv_004", + "target": "model" + }, + { + "source": "dv_005", + "target": "model" + }, + { + "source": "dv_006", + "target": "model" + }, + { + "source": "dv_007", + "target": "model" + }, + { + "source": "dv_008", + "target": "model" + }, + { + "source": "dv_009", + "target": "model" + }, + { + "source": "dv_010", + "target": "model" + }, + { + "source": "model", + "target": "solver" + }, + { + "source": "solver", + "target": "ext_001" + }, + { + "source": "solver", + "target": "ext_002" + }, + { + "source": "ext_001", + "target": "obj_001" + }, + { + "source": "ext_001", + "target": "obj_002" + }, + { + "source": "ext_001", + "target": "obj_003" + }, + { + "source": "ext_001", + "target": "obj_004" + }, + { + "source": "ext_002", + "target": "con_001" + }, + { + "source": "obj_001", + "target": "optimization" + }, + { + "source": "obj_002", + "target": "optimization" + }, + { + "source": "obj_003", + "target": "optimization" + }, + { + "source": "obj_004", + "target": "optimization" + }, + { + "source": "con_001", + "target": "optimization" + } + ], + "layout_version": "2.0" + } +} \ No newline at end of file diff --git a/studies/M1_Mirror/m1_mirror_turbo_V1/atomizer_spec.json b/studies/M1_Mirror/m1_mirror_turbo_V1/atomizer_spec.json new file mode 100644 index 00000000..58ad79f6 --- /dev/null +++ b/studies/M1_Mirror/m1_mirror_turbo_V1/atomizer_spec.json @@ -0,0 +1,462 @@ +{ + "meta": { + "version": "2.0", + "created": "2026-01-17T15:35:12.036882Z", + "modified": "2026-01-17T15:35:12.036882Z", + "created_by": "migration", + "modified_by": "migration", + "study_name": "m1_mirror_turbo_v1", + "description": "Self-improving turbo optimization: MLP surrogate explores design space, top candidates validated by FEA, surrogate retrains on new FEA data. Dashboard shows only FEA-validated iterations.", + "tags": [ + "Surrogate", + "mirror", + "zernike", + "opd" + ] + }, + "model": { + "sim": { + "path": "ASSY_M1_assyfem1_sim1.sim", + "solver": "nastran" + }, + "nx_settings": { + "nx_install_path": "C:\\Program Files\\Siemens\\DesigncenterNX2512", + "simulation_timeout_s": 600 + } + }, + "design_variables": [ + { + "id": "dv_001", + "name": "whiffle_min", + "expression_name": "whiffle_min", + "type": "continuous", + "bounds": { + "min": 30.0, + "max": 72.0 + }, + "baseline": 61.9189, + "units": "mm", + "enabled": true, + "description": "Inner whiffle tree contact radius", + "canvas_position": { + "x": 50, + "y": 100 + } + }, + { + "id": "dv_002", + "name": "whiffle_outer_to_vertical", + "expression_name": "whiffle_outer_to_vertical", + "type": "continuous", + "bounds": { + "min": 70.0, + "max": 85.0 + }, + "baseline": 81.7479, + "units": "mm", + "enabled": true, + "description": "Outer whiffle arm length", + "canvas_position": { + "x": 50, + "y": 180 + } + }, + { + "id": "dv_003", + "name": "whiffle_triangle_closeness", + "expression_name": "whiffle_triangle_closeness", + "type": "continuous", + "bounds": { + "min": 65.0, + "max": 120.0 + }, + "baseline": 65.5418, + "units": "mm", + "enabled": true, + "description": "Whiffle triangle geometry", + "canvas_position": { + "x": 50, + "y": 260 + } + }, + { + "id": "dv_004", + "name": "blank_backface_angle", + "expression_name": "blank_backface_angle", + "type": "continuous", + "bounds": { + "min": 4.2, + "max": 4.5 + }, + "baseline": 4.4158, + "units": "degrees", + "enabled": true, + "description": "Back face taper angle (affects mass)", + "canvas_position": { + "x": 50, + "y": 340 + } + }, + { + "id": "dv_005", + "name": "lateral_inner_angle", + "expression_name": "lateral_inner_angle", + "type": "continuous", + "bounds": { + "min": 25.0, + "max": 30.0 + }, + "baseline": 29.9005, + "units": "degrees", + "enabled": true, + "description": "Angle of inner lateral support constraint", + "canvas_position": { + "x": 50, + "y": 420 + } + }, + { + "id": "dv_006", + "name": "lateral_outer_angle", + "expression_name": "lateral_outer_angle", + "type": "continuous", + "bounds": { + "min": 11.0, + "max": 17.0 + }, + "baseline": 11.759, + "units": "degrees", + "enabled": true, + "description": "Angle of outer lateral support constraint", + "canvas_position": { + "x": 50, + "y": 500 + } + }, + { + "id": "dv_007", + "name": "lateral_outer_pivot", + "expression_name": "lateral_outer_pivot", + "type": "continuous", + "bounds": { + "min": 7.0, + "max": 12.0 + }, + "baseline": 11.1336, + "units": "degrees", + "enabled": true, + "description": "Pivot position for outer lateral", + "canvas_position": { + "x": 50, + "y": 580 + } + }, + { + "id": "dv_008", + "name": "lateral_inner_pivot", + "expression_name": "lateral_inner_pivot", + "type": "continuous", + "bounds": { + "min": 5.0, + "max": 12.0 + }, + "baseline": 6.5186, + "units": "degrees", + "enabled": true, + "description": "Pivot position for inner lateral", + "canvas_position": { + "x": 50, + "y": 660 + } + }, + { + "id": "dv_009", + "name": "lateral_middle_pivot", + "expression_name": "lateral_middle_pivot", + "type": "continuous", + "bounds": { + "min": 15.0, + "max": 27.0 + }, + "baseline": 22.3907, + "units": "degrees", + "enabled": true, + "description": "Pivot position for middle lateral", + "canvas_position": { + "x": 50, + "y": 740 + } + }, + { + "id": "dv_010", + "name": "lateral_closeness", + "expression_name": "lateral_closeness", + "type": "continuous", + "bounds": { + "min": 7.0, + "max": 12.0 + }, + "baseline": 8.685, + "units": "degrees", + "enabled": true, + "description": "Closeness factor for lateral supports", + "canvas_position": { + "x": 50, + "y": 820 + } + } + ], + "extractors": [ + { + "id": "ext_001", + "name": "Zernike WFE Extractor", + "type": "zernike_opd", + "builtin": true, + "config": { + "inner_radius_mm": 0, + "outer_radius_mm": 500.0, + "n_modes": 50, + "filter_low_orders": 4, + "displacement_unit": "mm", + "reference_subcase": 2 + }, + "outputs": [ + { + "name": "rel_filtered_rms_40_vs_20", + "metric": "filtered_rms_nm" + }, + { + "name": "rel_filtered_rms_60_vs_20", + "metric": "filtered_rms_nm" + }, + { + "name": "mfg_90_optician_workload", + "metric": "filtered_rms_nm" + }, + { + "name": "mass_kg", + "metric": "filtered_rms_nm" + } + ], + "canvas_position": { + "x": 740, + "y": 100 + } + }, + { + "id": "ext_002", + "name": "Mass Extractor", + "type": "mass", + "builtin": true, + "outputs": [ + { + "name": "mass_kg", + "metric": "total" + } + ], + "canvas_position": { + "x": 740, + "y": 250 + } + } + ], + "objectives": [ + { + "id": "obj_001", + "name": "Filtered RMS WFE at 40 deg relative to 20 deg reference (ZernikeOPD)", + "direction": "minimize", + "weight": 5.0, + "source": { + "extractor_id": "ext_001", + "output_name": "rel_filtered_rms_40_vs_20" + }, + "target": 4.0, + "units": "nm", + "canvas_position": { + "x": 1020, + "y": 100 + } + }, + { + "id": "obj_002", + "name": "Filtered RMS WFE at 60 deg relative to 20 deg reference (ZernikeOPD)", + "direction": "minimize", + "weight": 5.0, + "source": { + "extractor_id": "ext_001", + "output_name": "rel_filtered_rms_60_vs_20" + }, + "target": 10.0, + "units": "nm", + "canvas_position": { + "x": 1020, + "y": 200 + } + }, + { + "id": "obj_003", + "name": "Manufacturing deformation at 90 deg polishing (J1-J3 filtered RMS, ZernikeOPD)", + "direction": "minimize", + "weight": 3.0, + "source": { + "extractor_id": "ext_001", + "output_name": "mfg_90_optician_workload" + }, + "target": 20.0, + "units": "nm", + "canvas_position": { + "x": 1020, + "y": 300 + } + }, + { + "id": "obj_004", + "name": "Total mass of M1_Blank part", + "direction": "minimize", + "weight": 1.0, + "source": { + "extractor_id": "ext_001", + "output_name": "mass_kg" + }, + "target": null, + "units": "kg", + "canvas_position": { + "x": 1020, + "y": 400 + } + } + ], + "constraints": [ + { + "id": "con_001", + "name": "Maximum blank mass constraint: must be <= 105 kg", + "type": "hard", + "operator": "<=", + "threshold": 105.0, + "source": { + "extractor_id": "ext_002", + "output_name": "mass_kg" + }, + "penalty_config": { + "method": "quadratic", + "weight": 1000.0 + }, + "canvas_position": { + "x": 1020, + "y": 400 + } + } + ], + "optimization": { + "algorithm": { + "type": "TPE", + "config": { + "n_startup_trials": 10 + } + }, + "budget": { + "max_trials": 100 + }, + "canvas_position": { + "x": 1300, + "y": 150 + } + }, + "canvas": { + "edges": [ + { + "source": "dv_001", + "target": "model" + }, + { + "source": "dv_002", + "target": "model" + }, + { + "source": "dv_003", + "target": "model" + }, + { + "source": "dv_004", + "target": "model" + }, + { + "source": "dv_005", + "target": "model" + }, + { + "source": "dv_006", + "target": "model" + }, + { + "source": "dv_007", + "target": "model" + }, + { + "source": "dv_008", + "target": "model" + }, + { + "source": "dv_009", + "target": "model" + }, + { + "source": "dv_010", + "target": "model" + }, + { + "source": "model", + "target": "solver" + }, + { + "source": "solver", + "target": "ext_001" + }, + { + "source": "solver", + "target": "ext_002" + }, + { + "source": "ext_001", + "target": "obj_001" + }, + { + "source": "ext_001", + "target": "obj_002" + }, + { + "source": "ext_001", + "target": "obj_003" + }, + { + "source": "ext_001", + "target": "obj_004" + }, + { + "source": "ext_002", + "target": "con_001" + }, + { + "source": "obj_001", + "target": "optimization" + }, + { + "source": "obj_002", + "target": "optimization" + }, + { + "source": "obj_003", + "target": "optimization" + }, + { + "source": "obj_004", + "target": "optimization" + }, + { + "source": "con_001", + "target": "optimization" + } + ], + "layout_version": "2.0" + } +} \ No newline at end of file diff --git a/studies/M1_Mirror/m1_mirror_turbo_V2/atomizer_spec.json b/studies/M1_Mirror/m1_mirror_turbo_V2/atomizer_spec.json new file mode 100644 index 00000000..7ef7a148 --- /dev/null +++ b/studies/M1_Mirror/m1_mirror_turbo_V2/atomizer_spec.json @@ -0,0 +1,462 @@ +{ + "meta": { + "version": "2.0", + "created": "2026-01-17T15:35:12.037953Z", + "modified": "2026-01-17T15:35:12.037953Z", + "created_by": "migration", + "modified_by": "migration", + "study_name": "m1_mirror_turbo_v2", + "description": "Turbo V2: Higher weight on 40-20 WFE (6.0 vs 5.0), mass objective disabled (weight 0). Uses pre-trained surrogate from V1 (45 FEA samples).", + "tags": [ + "Surrogate", + "mirror", + "zernike", + "opd" + ] + }, + "model": { + "sim": { + "path": "ASSY_M1_assyfem1_sim1.sim", + "solver": "nastran" + }, + "nx_settings": { + "nx_install_path": "C:\\Program Files\\Siemens\\DesigncenterNX2512", + "simulation_timeout_s": 600 + } + }, + "design_variables": [ + { + "id": "dv_001", + "name": "whiffle_min", + "expression_name": "whiffle_min", + "type": "continuous", + "bounds": { + "min": 30.0, + "max": 72.0 + }, + "baseline": 58.8, + "units": "mm", + "enabled": true, + "description": "Inner whiffle tree contact radius (V1 best value)", + "canvas_position": { + "x": 50, + "y": 100 + } + }, + { + "id": "dv_002", + "name": "whiffle_outer_to_vertical", + "expression_name": "whiffle_outer_to_vertical", + "type": "continuous", + "bounds": { + "min": 70.0, + "max": 85.0 + }, + "baseline": 82.8, + "units": "mm", + "enabled": true, + "description": "Outer whiffle arm length (V1 best value)", + "canvas_position": { + "x": 50, + "y": 180 + } + }, + { + "id": "dv_003", + "name": "whiffle_triangle_closeness", + "expression_name": "whiffle_triangle_closeness", + "type": "continuous", + "bounds": { + "min": 65.0, + "max": 120.0 + }, + "baseline": 66.1, + "units": "mm", + "enabled": true, + "description": "Whiffle triangle geometry (V1 best value)", + "canvas_position": { + "x": 50, + "y": 260 + } + }, + { + "id": "dv_004", + "name": "blank_backface_angle", + "expression_name": "blank_backface_angle", + "type": "continuous", + "bounds": { + "min": 4.2, + "max": 4.5 + }, + "baseline": 4.41, + "units": "degrees", + "enabled": true, + "description": "Back face taper angle (V1 best value)", + "canvas_position": { + "x": 50, + "y": 340 + } + }, + { + "id": "dv_005", + "name": "lateral_inner_angle", + "expression_name": "lateral_inner_angle", + "type": "continuous", + "bounds": { + "min": 25.0, + "max": 30.0 + }, + "baseline": 30.0, + "units": "degrees", + "enabled": true, + "description": "Angle of inner lateral support constraint (V1 best value)", + "canvas_position": { + "x": 50, + "y": 420 + } + }, + { + "id": "dv_006", + "name": "lateral_outer_angle", + "expression_name": "lateral_outer_angle", + "type": "continuous", + "bounds": { + "min": 11.0, + "max": 17.0 + }, + "baseline": 11.7, + "units": "degrees", + "enabled": true, + "description": "Angle of outer lateral support constraint (V1 best value)", + "canvas_position": { + "x": 50, + "y": 500 + } + }, + { + "id": "dv_007", + "name": "lateral_outer_pivot", + "expression_name": "lateral_outer_pivot", + "type": "continuous", + "bounds": { + "min": 7.0, + "max": 12.0 + }, + "baseline": 11.7, + "units": "degrees", + "enabled": true, + "description": "Pivot position for outer lateral (V1 best value)", + "canvas_position": { + "x": 50, + "y": 580 + } + }, + { + "id": "dv_008", + "name": "lateral_inner_pivot", + "expression_name": "lateral_inner_pivot", + "type": "continuous", + "bounds": { + "min": 5.0, + "max": 12.0 + }, + "baseline": 7.7, + "units": "degrees", + "enabled": true, + "description": "Pivot position for inner lateral (V1 best value)", + "canvas_position": { + "x": 50, + "y": 660 + } + }, + { + "id": "dv_009", + "name": "lateral_middle_pivot", + "expression_name": "lateral_middle_pivot", + "type": "continuous", + "bounds": { + "min": 15.0, + "max": 27.0 + }, + "baseline": 22.5, + "units": "degrees", + "enabled": true, + "description": "Pivot position for middle lateral (V1 best value)", + "canvas_position": { + "x": 50, + "y": 740 + } + }, + { + "id": "dv_010", + "name": "lateral_closeness", + "expression_name": "lateral_closeness", + "type": "continuous", + "bounds": { + "min": 7.0, + "max": 12.0 + }, + "baseline": 9.1, + "units": "degrees", + "enabled": true, + "description": "Closeness factor for lateral supports (V1 best value)", + "canvas_position": { + "x": 50, + "y": 820 + } + } + ], + "extractors": [ + { + "id": "ext_001", + "name": "Zernike WFE Extractor", + "type": "zernike_opd", + "builtin": true, + "config": { + "inner_radius_mm": 0, + "outer_radius_mm": 500.0, + "n_modes": 50, + "filter_low_orders": 4, + "displacement_unit": "mm", + "reference_subcase": 2 + }, + "outputs": [ + { + "name": "rel_filtered_rms_40_vs_20", + "metric": "filtered_rms_nm" + }, + { + "name": "rel_filtered_rms_60_vs_20", + "metric": "filtered_rms_nm" + }, + { + "name": "mfg_90_optician_workload", + "metric": "filtered_rms_nm" + }, + { + "name": "mass_kg", + "metric": "filtered_rms_nm" + } + ], + "canvas_position": { + "x": 740, + "y": 100 + } + }, + { + "id": "ext_002", + "name": "Mass Extractor", + "type": "mass", + "builtin": true, + "outputs": [ + { + "name": "mass_kg", + "metric": "total" + } + ], + "canvas_position": { + "x": 740, + "y": 250 + } + } + ], + "objectives": [ + { + "id": "obj_001", + "name": "Filtered RMS WFE at 40 deg relative to 20 deg reference (ZernikeOPD)", + "direction": "minimize", + "weight": 6.0, + "source": { + "extractor_id": "ext_001", + "output_name": "rel_filtered_rms_40_vs_20" + }, + "target": 4.0, + "units": "nm", + "canvas_position": { + "x": 1020, + "y": 100 + } + }, + { + "id": "obj_002", + "name": "Filtered RMS WFE at 60 deg relative to 20 deg reference (ZernikeOPD)", + "direction": "minimize", + "weight": 5.0, + "source": { + "extractor_id": "ext_001", + "output_name": "rel_filtered_rms_60_vs_20" + }, + "target": 10.0, + "units": "nm", + "canvas_position": { + "x": 1020, + "y": 200 + } + }, + { + "id": "obj_003", + "name": "Manufacturing deformation at 90 deg polishing (J1-J3 filtered RMS, ZernikeOPD)", + "direction": "minimize", + "weight": 3.0, + "source": { + "extractor_id": "ext_001", + "output_name": "mfg_90_optician_workload" + }, + "target": 20.0, + "units": "nm", + "canvas_position": { + "x": 1020, + "y": 300 + } + }, + { + "id": "obj_004", + "name": "Total mass of M1_Blank part", + "direction": "minimize", + "weight": 0.0, + "source": { + "extractor_id": "ext_001", + "output_name": "mass_kg" + }, + "target": null, + "units": "kg", + "canvas_position": { + "x": 1020, + "y": 400 + } + } + ], + "constraints": [ + { + "id": "con_001", + "name": "Maximum blank mass constraint: must be <= 105 kg", + "type": "hard", + "operator": "<=", + "threshold": 105.0, + "source": { + "extractor_id": "ext_002", + "output_name": "mass_kg" + }, + "penalty_config": { + "method": "quadratic", + "weight": 1000.0 + }, + "canvas_position": { + "x": 1020, + "y": 400 + } + } + ], + "optimization": { + "algorithm": { + "type": "CMA-ES", + "config": { + "sigma0": 0.3 + } + }, + "budget": { + "max_trials": 100 + }, + "canvas_position": { + "x": 1300, + "y": 150 + } + }, + "canvas": { + "edges": [ + { + "source": "dv_001", + "target": "model" + }, + { + "source": "dv_002", + "target": "model" + }, + { + "source": "dv_003", + "target": "model" + }, + { + "source": "dv_004", + "target": "model" + }, + { + "source": "dv_005", + "target": "model" + }, + { + "source": "dv_006", + "target": "model" + }, + { + "source": "dv_007", + "target": "model" + }, + { + "source": "dv_008", + "target": "model" + }, + { + "source": "dv_009", + "target": "model" + }, + { + "source": "dv_010", + "target": "model" + }, + { + "source": "model", + "target": "solver" + }, + { + "source": "solver", + "target": "ext_001" + }, + { + "source": "solver", + "target": "ext_002" + }, + { + "source": "ext_001", + "target": "obj_001" + }, + { + "source": "ext_001", + "target": "obj_002" + }, + { + "source": "ext_001", + "target": "obj_003" + }, + { + "source": "ext_001", + "target": "obj_004" + }, + { + "source": "ext_002", + "target": "con_001" + }, + { + "source": "obj_001", + "target": "optimization" + }, + { + "source": "obj_002", + "target": "optimization" + }, + { + "source": "obj_003", + "target": "optimization" + }, + { + "source": "obj_004", + "target": "optimization" + }, + { + "source": "con_001", + "target": "optimization" + } + ], + "layout_version": "2.0" + } +} \ No newline at end of file diff --git a/studies/M1_Mirror/m1_mirror_zernike_optimization/atomizer_spec.json b/studies/M1_Mirror/m1_mirror_zernike_optimization/atomizer_spec.json new file mode 100644 index 00000000..84684192 --- /dev/null +++ b/studies/M1_Mirror/m1_mirror_zernike_optimization/atomizer_spec.json @@ -0,0 +1,435 @@ +{ + "meta": { + "version": "2.0", + "created": "2026-01-17T15:35:12.038964Z", + "modified": "2026-01-17T15:35:12.038964Z", + "created_by": "migration", + "modified_by": "migration", + "study_name": "m1_mirror_zernike_optimization", + "description": "Telescope primary mirror support structure optimization using Zernike wavefront error metrics with neural acceleration", + "tags": [ + "mirror", + "zernike" + ] + }, + "model": { + "sim": { + "path": "ASSY_M1_assyfem1_sim1.sim", + "solver": "nastran" + }, + "nx_settings": { + "nx_install_path": "C:\\Program Files\\Siemens\\NX2506", + "simulation_timeout_s": 600 + } + }, + "design_variables": [ + { + "id": "dv_001", + "name": "lateral_inner_angle", + "expression_name": "lateral_inner_angle", + "type": "continuous", + "bounds": { + "min": 25.0, + "max": 28.5 + }, + "baseline": 26.79, + "units": "degrees", + "enabled": false, + "description": "Lateral support inner angle", + "canvas_position": { + "x": 50, + "y": 100 + } + }, + { + "id": "dv_002", + "name": "lateral_outer_angle", + "expression_name": "lateral_outer_angle", + "type": "continuous", + "bounds": { + "min": 13.0, + "max": 17.0 + }, + "baseline": 14.64, + "units": "degrees", + "enabled": false, + "description": "Lateral support outer angle", + "canvas_position": { + "x": 50, + "y": 180 + } + }, + { + "id": "dv_003", + "name": "lateral_outer_pivot", + "expression_name": "lateral_outer_pivot", + "type": "continuous", + "bounds": { + "min": 9.0, + "max": 12.0 + }, + "baseline": 10.4, + "units": "mm", + "enabled": false, + "description": "Lateral outer pivot position", + "canvas_position": { + "x": 50, + "y": 260 + } + }, + { + "id": "dv_004", + "name": "lateral_inner_pivot", + "expression_name": "lateral_inner_pivot", + "type": "continuous", + "bounds": { + "min": 9.0, + "max": 12.0 + }, + "baseline": 10.07, + "units": "mm", + "enabled": false, + "description": "Lateral inner pivot position", + "canvas_position": { + "x": 50, + "y": 340 + } + }, + { + "id": "dv_005", + "name": "lateral_middle_pivot", + "expression_name": "lateral_middle_pivot", + "type": "continuous", + "bounds": { + "min": 18.0, + "max": 23.0 + }, + "baseline": 20.73, + "units": "mm", + "enabled": false, + "description": "Lateral middle pivot position", + "canvas_position": { + "x": 50, + "y": 420 + } + }, + { + "id": "dv_006", + "name": "lateral_closeness", + "expression_name": "lateral_closeness", + "type": "continuous", + "bounds": { + "min": 9.5, + "max": 12.5 + }, + "baseline": 11.02, + "units": "mm", + "enabled": false, + "description": "Lateral support closeness parameter", + "canvas_position": { + "x": 50, + "y": 500 + } + }, + { + "id": "dv_007", + "name": "whiffle_min", + "expression_name": "whiffle_min", + "type": "continuous", + "bounds": { + "min": 35.0, + "max": 55.0 + }, + "baseline": 40.55, + "units": "mm", + "enabled": true, + "description": "Whiffle tree minimum parameter", + "canvas_position": { + "x": 50, + "y": 580 + } + }, + { + "id": "dv_008", + "name": "whiffle_outer_to_vertical", + "expression_name": "whiffle_outer_to_vertical", + "type": "continuous", + "bounds": { + "min": 68.0, + "max": 80.0 + }, + "baseline": 75.67, + "units": "degrees", + "enabled": true, + "description": "Whiffle tree outer to vertical angle", + "canvas_position": { + "x": 50, + "y": 660 + } + }, + { + "id": "dv_009", + "name": "whiffle_triangle_closeness", + "expression_name": "whiffle_triangle_closeness", + "type": "continuous", + "bounds": { + "min": 50.0, + "max": 65.0 + }, + "baseline": 60.0, + "units": "mm", + "enabled": false, + "description": "Whiffle tree triangle closeness", + "canvas_position": { + "x": 50, + "y": 740 + } + }, + { + "id": "dv_010", + "name": "blank_backface_angle", + "expression_name": "blank_backface_angle", + "type": "continuous", + "bounds": { + "min": 3.5, + "max": 5.0 + }, + "baseline": 4.23, + "units": "degrees", + "enabled": false, + "description": "Mirror blank backface angle", + "canvas_position": { + "x": 50, + "y": 820 + } + }, + { + "id": "dv_011", + "name": "inner_circular_rib_dia", + "expression_name": "inner_circular_rib_dia", + "type": "continuous", + "bounds": { + "min": 480.0, + "max": 620.0 + }, + "baseline": 534.0, + "units": "mm", + "enabled": true, + "description": "Inner circular rib diameter", + "canvas_position": { + "x": 50, + "y": 900 + } + } + ], + "extractors": [ + { + "id": "ext_001", + "name": "Zernike WFE Extractor", + "type": "zernike_opd", + "builtin": true, + "config": { + "inner_radius_mm": 0, + "outer_radius_mm": 500.0, + "n_modes": 50, + "filter_low_orders": 4, + "displacement_unit": "mm", + "reference_subcase": 2 + }, + "outputs": [ + { + "name": "rel_filtered_rms_40_vs_20", + "metric": "filtered_rms_nm" + }, + { + "name": "rel_filtered_rms_60_vs_20", + "metric": "filtered_rms_nm" + }, + { + "name": "mfg_90_optician_workload", + "metric": "filtered_rms_nm" + } + ], + "canvas_position": { + "x": 740, + "y": 100 + } + } + ], + "objectives": [ + { + "id": "obj_001", + "name": "Filtered RMS WFE at 40 deg relative to 20 deg reference", + "direction": "minimize", + "weight": 5.0, + "source": { + "extractor_id": "ext_001", + "output_name": "rel_filtered_rms_40_vs_20" + }, + "target": 4.0, + "units": "nm", + "canvas_position": { + "x": 1020, + "y": 100 + } + }, + { + "id": "obj_002", + "name": "Filtered RMS WFE at 60 deg relative to 20 deg reference", + "direction": "minimize", + "weight": 5.0, + "source": { + "extractor_id": "ext_001", + "output_name": "rel_filtered_rms_60_vs_20" + }, + "target": 10.0, + "units": "nm", + "canvas_position": { + "x": 1020, + "y": 200 + } + }, + { + "id": "obj_003", + "name": "Optician workload at 90 deg polishing orientation (filtered RMS with J1-J3)", + "direction": "minimize", + "weight": 1.0, + "source": { + "extractor_id": "ext_001", + "output_name": "mfg_90_optician_workload" + }, + "target": 20.0, + "units": "nm", + "canvas_position": { + "x": 1020, + "y": 300 + } + } + ], + "constraints": [ + { + "id": "con_001", + "name": "Maximum von Mises stress in mirror assembly", + "type": "hard", + "operator": "<=", + "threshold": 10.0, + "source": { + "extractor_id": "ext_001", + "output_name": "rel_filtered_rms_40_vs_20" + }, + "penalty_config": { + "method": "quadratic", + "weight": 1000.0 + }, + "canvas_position": { + "x": 1020, + "y": 400 + } + } + ], + "optimization": { + "algorithm": { + "type": "TPE", + "config": { + "n_startup_trials": 15, + "seed": 42 + } + }, + "budget": { + "max_trials": 100 + }, + "canvas_position": { + "x": 1300, + "y": 150 + } + }, + "canvas": { + "edges": [ + { + "source": "dv_001", + "target": "model" + }, + { + "source": "dv_002", + "target": "model" + }, + { + "source": "dv_003", + "target": "model" + }, + { + "source": "dv_004", + "target": "model" + }, + { + "source": "dv_005", + "target": "model" + }, + { + "source": "dv_006", + "target": "model" + }, + { + "source": "dv_007", + "target": "model" + }, + { + "source": "dv_008", + "target": "model" + }, + { + "source": "dv_009", + "target": "model" + }, + { + "source": "dv_010", + "target": "model" + }, + { + "source": "dv_011", + "target": "model" + }, + { + "source": "model", + "target": "solver" + }, + { + "source": "solver", + "target": "ext_001" + }, + { + "source": "ext_001", + "target": "obj_001" + }, + { + "source": "ext_001", + "target": "obj_002" + }, + { + "source": "ext_001", + "target": "obj_003" + }, + { + "source": "ext_001", + "target": "con_001" + }, + { + "source": "obj_001", + "target": "optimization" + }, + { + "source": "obj_002", + "target": "optimization" + }, + { + "source": "obj_003", + "target": "optimization" + }, + { + "source": "con_001", + "target": "optimization" + } + ], + "layout_version": "2.0" + } +} \ No newline at end of file diff --git a/studies/Simple_Bracket/bracket_pareto_3obj/atomizer_spec.json b/studies/Simple_Bracket/bracket_pareto_3obj/atomizer_spec.json new file mode 100644 index 00000000..875a4eb5 --- /dev/null +++ b/studies/Simple_Bracket/bracket_pareto_3obj/atomizer_spec.json @@ -0,0 +1,213 @@ +{ + "meta": { + "version": "2.0", + "created": "2026-01-17T15:35:12.039975Z", + "modified": "2026-01-17T15:35:12.039975Z", + "created_by": "migration", + "modified_by": "migration", + "study_name": "bracket_pareto_3obj", + "description": "Three-objective Pareto optimization: minimize mass, minimize stress, maximize stiffness", + "tags": [] + }, + "model": { + "sim": { + "path": "1_setup\\model\\Bracket_sim1.sim", + "solver": "nastran" + } + }, + "design_variables": [ + { + "id": "dv_001", + "name": "param_1", + "expression_name": "support_angle", + "type": "continuous", + "bounds": { + "min": 20, + "max": 70 + }, + "baseline": null, + "units": "degrees", + "enabled": true, + "description": "Angle of support arm relative to base", + "canvas_position": { + "x": 50, + "y": 100 + } + }, + { + "id": "dv_002", + "name": "param_2", + "expression_name": "tip_thickness", + "type": "continuous", + "bounds": { + "min": 30, + "max": 60 + }, + "baseline": null, + "units": "mm", + "enabled": true, + "description": "Thickness at bracket tip where load is applied", + "canvas_position": { + "x": 50, + "y": 180 + } + } + ], + "extractors": [ + { + "id": "ext_001", + "name": "Mass Extractor", + "type": "mass", + "builtin": true, + "outputs": [ + { + "name": "mass", + "metric": "total" + } + ], + "canvas_position": { + "x": 740, + "y": 100 + } + } + ], + "objectives": [ + { + "id": "obj_001", + "name": "Total bracket mass (kg)", + "direction": "minimize", + "weight": 1.0, + "source": { + "extractor_id": "ext_001", + "output_name": "mass" + }, + "target": null, + "units": "", + "canvas_position": { + "x": 1020, + "y": 100 + } + }, + { + "id": "obj_002", + "name": "Maximum von Mises stress (MPa)", + "direction": "minimize", + "weight": 1.0, + "source": { + "extractor_id": "ext_001", + "output_name": "stress" + }, + "target": null, + "units": "", + "canvas_position": { + "x": 1020, + "y": 200 + } + }, + { + "id": "obj_003", + "name": "Structural stiffness = Force/Displacement (N/mm)", + "direction": "maximize", + "weight": 1.0, + "source": { + "extractor_id": "ext_001", + "output_name": "stiffness" + }, + "target": null, + "units": "", + "canvas_position": { + "x": 1020, + "y": 300 + } + } + ], + "constraints": [ + { + "id": "con_001", + "name": "Keep stress below 300 MPa for safety margin", + "type": "hard", + "operator": "<", + "threshold": 300, + "source": { + "extractor_id": "ext_001", + "output_name": "mass" + }, + "penalty_config": { + "method": "quadratic", + "weight": 1000.0 + }, + "canvas_position": { + "x": 1020, + "y": 400 + } + } + ], + "optimization": { + "algorithm": { + "type": "TPE", + "config": { + "n_startup_trials": 10 + } + }, + "budget": { + "max_trials": 100 + }, + "canvas_position": { + "x": 1300, + "y": 150 + } + }, + "canvas": { + "edges": [ + { + "source": "dv_001", + "target": "model" + }, + { + "source": "dv_002", + "target": "model" + }, + { + "source": "model", + "target": "solver" + }, + { + "source": "solver", + "target": "ext_001" + }, + { + "source": "ext_001", + "target": "obj_001" + }, + { + "source": "ext_001", + "target": "obj_002" + }, + { + "source": "ext_001", + "target": "obj_003" + }, + { + "source": "ext_001", + "target": "con_001" + }, + { + "source": "obj_001", + "target": "optimization" + }, + { + "source": "obj_002", + "target": "optimization" + }, + { + "source": "obj_003", + "target": "optimization" + }, + { + "source": "con_001", + "target": "optimization" + } + ], + "layout_version": "2.0" + } +} \ No newline at end of file diff --git a/studies/Simple_Bracket/bracket_stiffness_optimization/atomizer_spec.json b/studies/Simple_Bracket/bracket_stiffness_optimization/atomizer_spec.json new file mode 100644 index 00000000..ff8ec1b9 --- /dev/null +++ b/studies/Simple_Bracket/bracket_stiffness_optimization/atomizer_spec.json @@ -0,0 +1,225 @@ +{ + "meta": { + "version": "2.0", + "created": "2026-01-17T15:35:12.041483Z", + "modified": "2026-01-17T15:35:12.041483Z", + "created_by": "migration", + "modified_by": "migration", + "study_name": "bracket_stiffness_optimization", + "description": "Maximize bracket stiffness while minimizing mass (constraint: mass ≤ 0.2 kg)", + "tags": [] + }, + "model": { + "sim": { + "path": "1_setup/model/Bracket_sim1.sim", + "solver": "NX_Nastran", + "solution_type": "SOL101" + }, + "nx_part": { + "path": "1_setup/model/Bracket.prt" + }, + "fem": { + "path": "1_setup/model/Bracket_fem1.fem" + } + }, + "design_variables": [ + { + "id": "dv_001", + "name": "support_angle", + "expression_name": "support_angle", + "type": "continuous", + "bounds": { + "min": 20.0, + "max": 70.0 + }, + "baseline": 60.0, + "units": "degrees", + "enabled": true, + "description": "Angle of support arm relative to base", + "canvas_position": { + "x": 50, + "y": 100 + } + }, + { + "id": "dv_002", + "name": "tip_thickness", + "expression_name": "tip_thickness", + "type": "continuous", + "bounds": { + "min": 30.0, + "max": 60.0 + }, + "baseline": 30.0, + "units": "mm", + "enabled": true, + "description": "Thickness of bracket tip where load is applied", + "canvas_position": { + "x": 50, + "y": 180 + } + } + ], + "extractors": [ + { + "id": "ext_001", + "name": "BracketStiffnessExtractor Extractor", + "type": "displacement", + "builtin": true, + "config": { + "result_type": "z", + "metric": "max_abs" + }, + "outputs": [ + { + "name": "stiffness", + "metric": "max_abs" + }, + { + "name": "mass", + "metric": "max_abs" + } + ], + "canvas_position": { + "x": 740, + "y": 100 + } + }, + { + "id": "ext_002", + "name": "Mass Extractor", + "type": "mass", + "builtin": true, + "outputs": [ + { + "name": "mass_kg", + "metric": "total" + } + ], + "canvas_position": { + "x": 740, + "y": 250 + } + } + ], + "objectives": [ + { + "id": "obj_001", + "name": "Structural stiffness (N/mm) calculated as Force/Displacement", + "direction": "maximize", + "weight": 1.0, + "source": { + "extractor_id": "ext_001", + "output_name": "stiffness" + }, + "target": null, + "units": "", + "canvas_position": { + "x": 1020, + "y": 100 + } + }, + { + "id": "obj_002", + "name": "Total mass (kg) - secondary objective with hard constraint", + "direction": "minimize", + "weight": 0.1, + "source": { + "extractor_id": "ext_001", + "output_name": "mass" + }, + "target": null, + "units": "", + "canvas_position": { + "x": 1020, + "y": 200 + } + } + ], + "constraints": [ + { + "id": "con_001", + "name": "Maximum allowable mass: 200 grams", + "type": "hard", + "operator": "<", + "threshold": 0.2, + "source": { + "extractor_id": "ext_002", + "output_name": "mass_kg" + }, + "penalty_config": { + "method": "quadratic", + "weight": 1000.0 + }, + "canvas_position": { + "x": 1020, + "y": 400 + } + } + ], + "optimization": { + "algorithm": { + "type": "NSGA-II", + "config": { + "population_size": 50, + "seed": 42 + } + }, + "budget": { + "max_trials": 50 + }, + "canvas_position": { + "x": 1300, + "y": 150 + } + }, + "canvas": { + "edges": [ + { + "source": "dv_001", + "target": "model" + }, + { + "source": "dv_002", + "target": "model" + }, + { + "source": "model", + "target": "solver" + }, + { + "source": "solver", + "target": "ext_001" + }, + { + "source": "solver", + "target": "ext_002" + }, + { + "source": "ext_001", + "target": "obj_001" + }, + { + "source": "ext_001", + "target": "obj_002" + }, + { + "source": "ext_002", + "target": "con_001" + }, + { + "source": "obj_001", + "target": "optimization" + }, + { + "source": "obj_002", + "target": "optimization" + }, + { + "source": "con_001", + "target": "optimization" + } + ], + "layout_version": "2.0" + } +} \ No newline at end of file diff --git a/studies/Simple_Bracket/bracket_stiffness_optimization_V2/atomizer_spec.json b/studies/Simple_Bracket/bracket_stiffness_optimization_V2/atomizer_spec.json new file mode 100644 index 00000000..61659bd1 --- /dev/null +++ b/studies/Simple_Bracket/bracket_stiffness_optimization_V2/atomizer_spec.json @@ -0,0 +1,225 @@ +{ + "meta": { + "version": "2.0", + "created": "2026-01-17T15:35:12.043512Z", + "modified": "2026-01-17T15:35:12.043512Z", + "created_by": "migration", + "modified_by": "migration", + "study_name": "bracket_stiffness_optimization_v2", + "description": "Maximize bracket stiffness while minimizing mass (constraint: mass ≤ 0.2 kg)", + "tags": [] + }, + "model": { + "sim": { + "path": "1_setup/model/Bracket_sim1.sim", + "solver": "NX_Nastran", + "solution_type": "SOL101" + }, + "nx_part": { + "path": "1_setup/model/Bracket.prt" + }, + "fem": { + "path": "1_setup/model/Bracket_fem1.fem" + } + }, + "design_variables": [ + { + "id": "dv_001", + "name": "support_angle", + "expression_name": "support_angle", + "type": "continuous", + "bounds": { + "min": 20.0, + "max": 70.0 + }, + "baseline": 60.0, + "units": "degrees", + "enabled": true, + "description": "Angle of support arm relative to base", + "canvas_position": { + "x": 50, + "y": 100 + } + }, + { + "id": "dv_002", + "name": "tip_thickness", + "expression_name": "tip_thickness", + "type": "continuous", + "bounds": { + "min": 30.0, + "max": 60.0 + }, + "baseline": 30.0, + "units": "mm", + "enabled": true, + "description": "Thickness of bracket tip where load is applied", + "canvas_position": { + "x": 50, + "y": 180 + } + } + ], + "extractors": [ + { + "id": "ext_001", + "name": "BracketStiffnessExtractor Extractor", + "type": "displacement", + "builtin": true, + "config": { + "result_type": "z", + "metric": "max_abs" + }, + "outputs": [ + { + "name": "stiffness", + "metric": "max_abs" + }, + { + "name": "mass", + "metric": "max_abs" + } + ], + "canvas_position": { + "x": 740, + "y": 100 + } + }, + { + "id": "ext_002", + "name": "Mass Extractor", + "type": "mass", + "builtin": true, + "outputs": [ + { + "name": "mass_kg", + "metric": "total" + } + ], + "canvas_position": { + "x": 740, + "y": 250 + } + } + ], + "objectives": [ + { + "id": "obj_001", + "name": "Structural stiffness (N/mm) calculated as Force/Displacement", + "direction": "maximize", + "weight": 1.0, + "source": { + "extractor_id": "ext_001", + "output_name": "stiffness" + }, + "target": null, + "units": "", + "canvas_position": { + "x": 1020, + "y": 100 + } + }, + { + "id": "obj_002", + "name": "Total mass (kg) - secondary objective with hard constraint", + "direction": "minimize", + "weight": 0.1, + "source": { + "extractor_id": "ext_001", + "output_name": "mass" + }, + "target": null, + "units": "", + "canvas_position": { + "x": 1020, + "y": 200 + } + } + ], + "constraints": [ + { + "id": "con_001", + "name": "Maximum allowable mass: 200 grams", + "type": "hard", + "operator": "<", + "threshold": 0.2, + "source": { + "extractor_id": "ext_002", + "output_name": "mass_kg" + }, + "penalty_config": { + "method": "quadratic", + "weight": 1000.0 + }, + "canvas_position": { + "x": 1020, + "y": 400 + } + } + ], + "optimization": { + "algorithm": { + "type": "NSGA-II", + "config": { + "population_size": 50, + "seed": 42 + } + }, + "budget": { + "max_trials": 50 + }, + "canvas_position": { + "x": 1300, + "y": 150 + } + }, + "canvas": { + "edges": [ + { + "source": "dv_001", + "target": "model" + }, + { + "source": "dv_002", + "target": "model" + }, + { + "source": "model", + "target": "solver" + }, + { + "source": "solver", + "target": "ext_001" + }, + { + "source": "solver", + "target": "ext_002" + }, + { + "source": "ext_001", + "target": "obj_001" + }, + { + "source": "ext_001", + "target": "obj_002" + }, + { + "source": "ext_002", + "target": "con_001" + }, + { + "source": "obj_001", + "target": "optimization" + }, + { + "source": "obj_002", + "target": "optimization" + }, + { + "source": "con_001", + "target": "optimization" + } + ], + "layout_version": "2.0" + } +} \ No newline at end of file diff --git a/studies/Simple_Bracket/bracket_stiffness_optimization_V3/atomizer_spec.json b/studies/Simple_Bracket/bracket_stiffness_optimization_V3/atomizer_spec.json new file mode 100644 index 00000000..778fcb47 --- /dev/null +++ b/studies/Simple_Bracket/bracket_stiffness_optimization_V3/atomizer_spec.json @@ -0,0 +1,225 @@ +{ + "meta": { + "version": "2.0", + "created": "2026-01-17T15:35:12.044509Z", + "modified": "2026-01-17T15:35:12.044509Z", + "created_by": "migration", + "modified_by": "migration", + "study_name": "bracket_stiffness_optimization_v3", + "description": "Maximize bracket stiffness while minimizing mass (constraint: mass ≤ 0.2 kg)", + "tags": [] + }, + "model": { + "sim": { + "path": "1_setup/model/Bracket_sim1.sim", + "solver": "NX_Nastran", + "solution_type": "SOL101" + }, + "nx_part": { + "path": "1_setup/model/Bracket.prt" + }, + "fem": { + "path": "1_setup/model/Bracket_fem1.fem" + } + }, + "design_variables": [ + { + "id": "dv_001", + "name": "support_angle", + "expression_name": "support_angle", + "type": "continuous", + "bounds": { + "min": 20.0, + "max": 70.0 + }, + "baseline": 60.0, + "units": "degrees", + "enabled": true, + "description": "Angle of support arm relative to base", + "canvas_position": { + "x": 50, + "y": 100 + } + }, + { + "id": "dv_002", + "name": "tip_thickness", + "expression_name": "tip_thickness", + "type": "continuous", + "bounds": { + "min": 30.0, + "max": 60.0 + }, + "baseline": 30.0, + "units": "mm", + "enabled": true, + "description": "Thickness of bracket tip where load is applied", + "canvas_position": { + "x": 50, + "y": 180 + } + } + ], + "extractors": [ + { + "id": "ext_001", + "name": "BracketStiffnessExtractor Extractor", + "type": "displacement", + "builtin": true, + "config": { + "result_type": "z", + "metric": "max_abs" + }, + "outputs": [ + { + "name": "stiffness", + "metric": "max_abs" + }, + { + "name": "mass", + "metric": "max_abs" + } + ], + "canvas_position": { + "x": 740, + "y": 100 + } + }, + { + "id": "ext_002", + "name": "Mass Extractor", + "type": "mass", + "builtin": true, + "outputs": [ + { + "name": "mass_kg", + "metric": "total" + } + ], + "canvas_position": { + "x": 740, + "y": 250 + } + } + ], + "objectives": [ + { + "id": "obj_001", + "name": "Structural stiffness (N/mm) calculated as Force/Displacement", + "direction": "maximize", + "weight": 1.0, + "source": { + "extractor_id": "ext_001", + "output_name": "stiffness" + }, + "target": null, + "units": "", + "canvas_position": { + "x": 1020, + "y": 100 + } + }, + { + "id": "obj_002", + "name": "Total mass (kg) - secondary objective with hard constraint", + "direction": "minimize", + "weight": 0.1, + "source": { + "extractor_id": "ext_001", + "output_name": "mass" + }, + "target": null, + "units": "", + "canvas_position": { + "x": 1020, + "y": 200 + } + } + ], + "constraints": [ + { + "id": "con_001", + "name": "Maximum allowable mass: 200 grams", + "type": "hard", + "operator": "<", + "threshold": 0.2, + "source": { + "extractor_id": "ext_002", + "output_name": "mass_kg" + }, + "penalty_config": { + "method": "quadratic", + "weight": 1000.0 + }, + "canvas_position": { + "x": 1020, + "y": 400 + } + } + ], + "optimization": { + "algorithm": { + "type": "NSGA-II", + "config": { + "population_size": 50, + "seed": 42 + } + }, + "budget": { + "max_trials": 50 + }, + "canvas_position": { + "x": 1300, + "y": 150 + } + }, + "canvas": { + "edges": [ + { + "source": "dv_001", + "target": "model" + }, + { + "source": "dv_002", + "target": "model" + }, + { + "source": "model", + "target": "solver" + }, + { + "source": "solver", + "target": "ext_001" + }, + { + "source": "solver", + "target": "ext_002" + }, + { + "source": "ext_001", + "target": "obj_001" + }, + { + "source": "ext_001", + "target": "obj_002" + }, + { + "source": "ext_002", + "target": "con_001" + }, + { + "source": "obj_001", + "target": "optimization" + }, + { + "source": "obj_002", + "target": "optimization" + }, + { + "source": "con_001", + "target": "optimization" + } + ], + "layout_version": "2.0" + } +} \ No newline at end of file diff --git a/studies/Simple_Bracket/bracket_stiffness_optimization_atomizerfield/atomizer_spec.json b/studies/Simple_Bracket/bracket_stiffness_optimization_atomizerfield/atomizer_spec.json new file mode 100644 index 00000000..6cf766a3 --- /dev/null +++ b/studies/Simple_Bracket/bracket_stiffness_optimization_atomizerfield/atomizer_spec.json @@ -0,0 +1,209 @@ +{ + "meta": { + "version": "2.0", + "created": "2026-01-17T15:35:12.042505Z", + "modified": "2026-01-17T15:35:12.042505Z", + "created_by": "migration", + "modified_by": "migration", + "study_name": "bracket_stiffness_optimization_atomizerfield", + "description": "Bracket Stiffness Optimization with AtomizerField Neural Acceleration - Multi-objective optimization of bracket geometry for maximum stiffness and minimum mass", + "tags": [] + }, + "model": { + "sim": { + "path": "1_setup\\model\\Bracket_sim1.sim", + "solver": "nastran" + } + }, + "design_variables": [ + { + "id": "dv_001", + "name": "param_1", + "expression_name": "support_angle", + "type": "continuous", + "bounds": { + "min": 20, + "max": 70 + }, + "baseline": null, + "units": "degrees", + "enabled": true, + "description": "Angle of the support arm (degrees)", + "canvas_position": { + "x": 50, + "y": 100 + } + }, + { + "id": "dv_002", + "name": "param_2", + "expression_name": "tip_thickness", + "type": "continuous", + "bounds": { + "min": 30, + "max": 60 + }, + "baseline": null, + "units": "mm", + "enabled": true, + "description": "Thickness at the bracket tip (mm)", + "canvas_position": { + "x": 50, + "y": 180 + } + } + ], + "extractors": [ + { + "id": "ext_001", + "name": "Displacement Extractor", + "type": "displacement", + "builtin": true, + "outputs": [ + { + "name": "stiffness", + "metric": "total" + } + ], + "canvas_position": { + "x": 740, + "y": 100 + } + }, + { + "id": "ext_002", + "name": "Mass Extractor", + "type": "mass", + "builtin": true, + "outputs": [ + { + "name": "mass_kg", + "metric": "total" + } + ], + "canvas_position": { + "x": 740, + "y": 250 + } + } + ], + "objectives": [ + { + "id": "obj_001", + "name": "Structural stiffness (inverse of max displacement)", + "direction": "maximize", + "weight": 1.0, + "source": { + "extractor_id": "ext_001", + "output_name": "stiffness" + }, + "target": null, + "units": "", + "canvas_position": { + "x": 1020, + "y": 100 + } + }, + { + "id": "obj_002", + "name": "Total bracket mass (kg)", + "direction": "minimize", + "weight": 0.1, + "source": { + "extractor_id": "ext_001", + "output_name": "mass" + }, + "target": null, + "units": "", + "canvas_position": { + "x": 1020, + "y": 200 + } + } + ], + "constraints": [ + { + "id": "con_001", + "name": "Maximum mass constraint (kg)", + "type": "hard", + "operator": "<", + "threshold": 0.2, + "source": { + "extractor_id": "ext_002", + "output_name": "mass_kg" + }, + "penalty_config": { + "method": "quadratic", + "weight": 1000.0 + }, + "canvas_position": { + "x": 1020, + "y": 400 + } + } + ], + "optimization": { + "algorithm": { + "type": "TPE", + "config": { + "n_startup_trials": 10 + } + }, + "budget": { + "max_trials": 100 + }, + "canvas_position": { + "x": 1300, + "y": 150 + } + }, + "canvas": { + "edges": [ + { + "source": "dv_001", + "target": "model" + }, + { + "source": "dv_002", + "target": "model" + }, + { + "source": "model", + "target": "solver" + }, + { + "source": "solver", + "target": "ext_001" + }, + { + "source": "solver", + "target": "ext_002" + }, + { + "source": "ext_001", + "target": "obj_001" + }, + { + "source": "ext_001", + "target": "obj_002" + }, + { + "source": "ext_002", + "target": "con_001" + }, + { + "source": "obj_001", + "target": "optimization" + }, + { + "source": "obj_002", + "target": "optimization" + }, + { + "source": "con_001", + "target": "optimization" + } + ], + "layout_version": "2.0" + } +} \ No newline at end of file diff --git a/studies/UAV_Arm/uav_arm_atomizerfield_test/atomizer_spec.json b/studies/UAV_Arm/uav_arm_atomizerfield_test/atomizer_spec.json new file mode 100644 index 00000000..56ab8c56 --- /dev/null +++ b/studies/UAV_Arm/uav_arm_atomizerfield_test/atomizer_spec.json @@ -0,0 +1,287 @@ +{ + "meta": { + "version": "2.0", + "created": "2026-01-17T15:35:12.045018Z", + "modified": "2026-01-17T15:35:12.045018Z", + "created_by": "migration", + "modified_by": "migration", + "study_name": "uav_arm_atomizerfield_test", + "description": "UAV Camera Support Arm - AtomizerField Neural Surrogate Integration Test", + "tags": [] + }, + "model": { + "sim": { + "path": "1_setup\\model\\Beam_sim1.sim", + "solver": "nastran" + } + }, + "design_variables": [ + { + "id": "dv_001", + "name": "param_1", + "expression_name": "beam_half_core_thickness", + "type": "continuous", + "bounds": { + "min": 5, + "max": 10 + }, + "baseline": null, + "units": "", + "enabled": true, + "description": "Half thickness of beam core (mm) - affects weight and stiffness", + "canvas_position": { + "x": 50, + "y": 100 + } + }, + { + "id": "dv_002", + "name": "param_2", + "expression_name": "beam_face_thickness", + "type": "continuous", + "bounds": { + "min": 1, + "max": 3 + }, + "baseline": null, + "units": "", + "enabled": true, + "description": "Thickness of beam face sheets (mm) - bending resistance", + "canvas_position": { + "x": 50, + "y": 180 + } + }, + { + "id": "dv_003", + "name": "param_3", + "expression_name": "holes_diameter", + "type": "continuous", + "bounds": { + "min": 10, + "max": 50 + }, + "baseline": null, + "units": "", + "enabled": true, + "description": "Diameter of lightening holes (mm) - weight reduction", + "canvas_position": { + "x": 50, + "y": 260 + } + }, + { + "id": "dv_004", + "name": "param_4", + "expression_name": "hole_count", + "type": "continuous", + "bounds": { + "min": 8, + "max": 14 + }, + "baseline": null, + "units": "", + "enabled": true, + "description": "Number of lightening holes - balance weight vs strength", + "canvas_position": { + "x": 50, + "y": 340 + } + } + ], + "extractors": [ + { + "id": "ext_001", + "name": "Mass Extractor", + "type": "mass", + "builtin": true, + "outputs": [ + { + "name": "mass", + "metric": "total" + } + ], + "canvas_position": { + "x": 740, + "y": 100 + } + } + ], + "objectives": [ + { + "id": "obj_001", + "name": "Total mass (grams) - minimize for longer flight time", + "direction": "minimize", + "weight": 1.0, + "source": { + "extractor_id": "ext_001", + "output_name": "mass" + }, + "target": 4000, + "units": "", + "canvas_position": { + "x": 1020, + "y": 100 + } + }, + { + "id": "obj_002", + "name": "First natural frequency (Hz) - avoid rotor resonance", + "direction": "maximize", + "weight": 1.0, + "source": { + "extractor_id": "ext_001", + "output_name": "fundamental_frequency" + }, + "target": 150, + "units": "", + "canvas_position": { + "x": 1020, + "y": 200 + } + } + ], + "constraints": [ + { + "id": "con_001", + "name": "Maximum tip displacement under 850g camera load < 1.5mm for image stabilization", + "type": "hard", + "operator": "<", + "threshold": 1.5, + "source": { + "extractor_id": "ext_001", + "output_name": "mass" + }, + "penalty_config": { + "method": "quadratic", + "weight": 1000.0 + }, + "canvas_position": { + "x": 1020, + "y": 400 + } + }, + { + "id": "con_002", + "name": "Maximum von Mises stress < 120 MPa (Al 6061-T6, SF=2.3)", + "type": "hard", + "operator": "<", + "threshold": 120, + "source": { + "extractor_id": "ext_001", + "output_name": "mass" + }, + "penalty_config": { + "method": "quadratic", + "weight": 1000.0 + }, + "canvas_position": { + "x": 1020, + "y": 500 + } + }, + { + "id": "con_003", + "name": "Natural frequency > 150 Hz to avoid rotor frequencies (80-120 Hz safety margin)", + "type": "hard", + "operator": ">", + "threshold": 150, + "source": { + "extractor_id": "ext_001", + "output_name": "mass" + }, + "penalty_config": { + "method": "quadratic", + "weight": 1000.0 + }, + "canvas_position": { + "x": 1020, + "y": 600 + } + } + ], + "optimization": { + "algorithm": { + "type": "TPE", + "config": { + "n_startup_trials": 10 + } + }, + "budget": { + "max_trials": 200 + }, + "canvas_position": { + "x": 1300, + "y": 150 + } + }, + "canvas": { + "edges": [ + { + "source": "dv_001", + "target": "model" + }, + { + "source": "dv_002", + "target": "model" + }, + { + "source": "dv_003", + "target": "model" + }, + { + "source": "dv_004", + "target": "model" + }, + { + "source": "model", + "target": "solver" + }, + { + "source": "solver", + "target": "ext_001" + }, + { + "source": "ext_001", + "target": "obj_001" + }, + { + "source": "ext_001", + "target": "obj_002" + }, + { + "source": "ext_001", + "target": "con_001" + }, + { + "source": "ext_001", + "target": "con_002" + }, + { + "source": "ext_001", + "target": "con_003" + }, + { + "source": "obj_001", + "target": "optimization" + }, + { + "source": "obj_002", + "target": "optimization" + }, + { + "source": "con_001", + "target": "optimization" + }, + { + "source": "con_002", + "target": "optimization" + }, + { + "source": "con_003", + "target": "optimization" + } + ], + "layout_version": "2.0" + } +} \ No newline at end of file diff --git a/studies/UAV_Arm/uav_arm_optimization/atomizer_spec.json b/studies/UAV_Arm/uav_arm_optimization/atomizer_spec.json new file mode 100644 index 00000000..45993e45 --- /dev/null +++ b/studies/UAV_Arm/uav_arm_optimization/atomizer_spec.json @@ -0,0 +1,287 @@ +{ + "meta": { + "version": "2.0", + "created": "2026-01-17T15:35:12.046025Z", + "modified": "2026-01-17T15:35:12.046025Z", + "created_by": "migration", + "modified_by": "migration", + "study_name": "uav_arm_optimization", + "description": "UAV Camera Support Arm - Multi-Objective Lightweight Design", + "tags": [] + }, + "model": { + "sim": { + "path": "1_setup\\model\\Beam_sim1.sim", + "solver": "nastran" + } + }, + "design_variables": [ + { + "id": "dv_001", + "name": "param_1", + "expression_name": "beam_half_core_thickness", + "type": "continuous", + "bounds": { + "min": 5, + "max": 10 + }, + "baseline": null, + "units": "", + "enabled": true, + "description": "Half thickness of beam core (mm) - affects weight and stiffness", + "canvas_position": { + "x": 50, + "y": 100 + } + }, + { + "id": "dv_002", + "name": "param_2", + "expression_name": "beam_face_thickness", + "type": "continuous", + "bounds": { + "min": 1, + "max": 3 + }, + "baseline": null, + "units": "", + "enabled": true, + "description": "Thickness of beam face sheets (mm) - bending resistance", + "canvas_position": { + "x": 50, + "y": 180 + } + }, + { + "id": "dv_003", + "name": "param_3", + "expression_name": "holes_diameter", + "type": "continuous", + "bounds": { + "min": 10, + "max": 50 + }, + "baseline": null, + "units": "", + "enabled": true, + "description": "Diameter of lightening holes (mm) - weight reduction", + "canvas_position": { + "x": 50, + "y": 260 + } + }, + { + "id": "dv_004", + "name": "param_4", + "expression_name": "hole_count", + "type": "continuous", + "bounds": { + "min": 8, + "max": 14 + }, + "baseline": null, + "units": "", + "enabled": true, + "description": "Number of lightening holes - balance weight vs strength", + "canvas_position": { + "x": 50, + "y": 340 + } + } + ], + "extractors": [ + { + "id": "ext_001", + "name": "Mass Extractor", + "type": "mass", + "builtin": true, + "outputs": [ + { + "name": "mass", + "metric": "total" + } + ], + "canvas_position": { + "x": 740, + "y": 100 + } + } + ], + "objectives": [ + { + "id": "obj_001", + "name": "Total mass (grams) - minimize for longer flight time", + "direction": "minimize", + "weight": 1.0, + "source": { + "extractor_id": "ext_001", + "output_name": "mass" + }, + "target": 4000, + "units": "", + "canvas_position": { + "x": 1020, + "y": 100 + } + }, + { + "id": "obj_002", + "name": "First natural frequency (Hz) - avoid rotor resonance", + "direction": "maximize", + "weight": 1.0, + "source": { + "extractor_id": "ext_001", + "output_name": "fundamental_frequency" + }, + "target": 150, + "units": "", + "canvas_position": { + "x": 1020, + "y": 200 + } + } + ], + "constraints": [ + { + "id": "con_001", + "name": "Maximum tip displacement under 850g camera load < 1.5mm for image stabilization", + "type": "hard", + "operator": "<", + "threshold": 1.5, + "source": { + "extractor_id": "ext_001", + "output_name": "mass" + }, + "penalty_config": { + "method": "quadratic", + "weight": 1000.0 + }, + "canvas_position": { + "x": 1020, + "y": 400 + } + }, + { + "id": "con_002", + "name": "Maximum von Mises stress < 120 MPa (Al 6061-T6, SF=2.3)", + "type": "hard", + "operator": "<", + "threshold": 120, + "source": { + "extractor_id": "ext_001", + "output_name": "mass" + }, + "penalty_config": { + "method": "quadratic", + "weight": 1000.0 + }, + "canvas_position": { + "x": 1020, + "y": 500 + } + }, + { + "id": "con_003", + "name": "Natural frequency > 150 Hz to avoid rotor frequencies (80-120 Hz safety margin)", + "type": "hard", + "operator": ">", + "threshold": 150, + "source": { + "extractor_id": "ext_001", + "output_name": "mass" + }, + "penalty_config": { + "method": "quadratic", + "weight": 1000.0 + }, + "canvas_position": { + "x": 1020, + "y": 600 + } + } + ], + "optimization": { + "algorithm": { + "type": "TPE", + "config": { + "n_startup_trials": 10 + } + }, + "budget": { + "max_trials": 30 + }, + "canvas_position": { + "x": 1300, + "y": 150 + } + }, + "canvas": { + "edges": [ + { + "source": "dv_001", + "target": "model" + }, + { + "source": "dv_002", + "target": "model" + }, + { + "source": "dv_003", + "target": "model" + }, + { + "source": "dv_004", + "target": "model" + }, + { + "source": "model", + "target": "solver" + }, + { + "source": "solver", + "target": "ext_001" + }, + { + "source": "ext_001", + "target": "obj_001" + }, + { + "source": "ext_001", + "target": "obj_002" + }, + { + "source": "ext_001", + "target": "con_001" + }, + { + "source": "ext_001", + "target": "con_002" + }, + { + "source": "ext_001", + "target": "con_003" + }, + { + "source": "obj_001", + "target": "optimization" + }, + { + "source": "obj_002", + "target": "optimization" + }, + { + "source": "con_001", + "target": "optimization" + }, + { + "source": "con_002", + "target": "optimization" + }, + { + "source": "con_003", + "target": "optimization" + } + ], + "layout_version": "2.0" + } +} \ No newline at end of file diff --git a/studies/UAV_Arm/uav_arm_optimization_V2/atomizer_spec.json b/studies/UAV_Arm/uav_arm_optimization_V2/atomizer_spec.json new file mode 100644 index 00000000..10e98f81 --- /dev/null +++ b/studies/UAV_Arm/uav_arm_optimization_V2/atomizer_spec.json @@ -0,0 +1,287 @@ +{ + "meta": { + "version": "2.0", + "created": "2026-01-17T15:35:12.047031Z", + "modified": "2026-01-17T15:35:12.047031Z", + "created_by": "migration", + "modified_by": "migration", + "study_name": "uav_arm_optimization_v2", + "description": "UAV Camera Support Arm V2 - Testing Solution Monitor Control", + "tags": [] + }, + "model": { + "sim": { + "path": "1_setup\\model\\Beam_sim1.sim", + "solver": "nastran" + } + }, + "design_variables": [ + { + "id": "dv_001", + "name": "param_1", + "expression_name": "beam_half_core_thickness", + "type": "continuous", + "bounds": { + "min": 5, + "max": 10 + }, + "baseline": null, + "units": "", + "enabled": true, + "description": "Half thickness of beam core (mm) - affects weight and stiffness", + "canvas_position": { + "x": 50, + "y": 100 + } + }, + { + "id": "dv_002", + "name": "param_2", + "expression_name": "beam_face_thickness", + "type": "continuous", + "bounds": { + "min": 1, + "max": 3 + }, + "baseline": null, + "units": "", + "enabled": true, + "description": "Thickness of beam face sheets (mm) - bending resistance", + "canvas_position": { + "x": 50, + "y": 180 + } + }, + { + "id": "dv_003", + "name": "param_3", + "expression_name": "holes_diameter", + "type": "continuous", + "bounds": { + "min": 10, + "max": 50 + }, + "baseline": null, + "units": "", + "enabled": true, + "description": "Diameter of lightening holes (mm) - weight reduction", + "canvas_position": { + "x": 50, + "y": 260 + } + }, + { + "id": "dv_004", + "name": "param_4", + "expression_name": "hole_count", + "type": "continuous", + "bounds": { + "min": 8, + "max": 14 + }, + "baseline": null, + "units": "", + "enabled": true, + "description": "Number of lightening holes - balance weight vs strength", + "canvas_position": { + "x": 50, + "y": 340 + } + } + ], + "extractors": [ + { + "id": "ext_001", + "name": "Mass Extractor", + "type": "mass", + "builtin": true, + "outputs": [ + { + "name": "mass", + "metric": "total" + } + ], + "canvas_position": { + "x": 740, + "y": 100 + } + } + ], + "objectives": [ + { + "id": "obj_001", + "name": "Total mass (grams) - minimize for longer flight time", + "direction": "minimize", + "weight": 1.0, + "source": { + "extractor_id": "ext_001", + "output_name": "mass" + }, + "target": 4000, + "units": "", + "canvas_position": { + "x": 1020, + "y": 100 + } + }, + { + "id": "obj_002", + "name": "First natural frequency (Hz) - avoid rotor resonance", + "direction": "maximize", + "weight": 1.0, + "source": { + "extractor_id": "ext_001", + "output_name": "fundamental_frequency" + }, + "target": 150, + "units": "", + "canvas_position": { + "x": 1020, + "y": 200 + } + } + ], + "constraints": [ + { + "id": "con_001", + "name": "Maximum tip displacement under 850g camera load < 1.5mm for image stabilization", + "type": "hard", + "operator": "<", + "threshold": 1.5, + "source": { + "extractor_id": "ext_001", + "output_name": "mass" + }, + "penalty_config": { + "method": "quadratic", + "weight": 1000.0 + }, + "canvas_position": { + "x": 1020, + "y": 400 + } + }, + { + "id": "con_002", + "name": "Maximum von Mises stress < 120 MPa (Al 6061-T6, SF=2.3)", + "type": "hard", + "operator": "<", + "threshold": 120, + "source": { + "extractor_id": "ext_001", + "output_name": "mass" + }, + "penalty_config": { + "method": "quadratic", + "weight": 1000.0 + }, + "canvas_position": { + "x": 1020, + "y": 500 + } + }, + { + "id": "con_003", + "name": "Natural frequency > 150 Hz to avoid rotor frequencies (80-120 Hz safety margin)", + "type": "hard", + "operator": ">", + "threshold": 150, + "source": { + "extractor_id": "ext_001", + "output_name": "mass" + }, + "penalty_config": { + "method": "quadratic", + "weight": 1000.0 + }, + "canvas_position": { + "x": 1020, + "y": 600 + } + } + ], + "optimization": { + "algorithm": { + "type": "TPE", + "config": { + "n_startup_trials": 10 + } + }, + "budget": { + "max_trials": 10 + }, + "canvas_position": { + "x": 1300, + "y": 150 + } + }, + "canvas": { + "edges": [ + { + "source": "dv_001", + "target": "model" + }, + { + "source": "dv_002", + "target": "model" + }, + { + "source": "dv_003", + "target": "model" + }, + { + "source": "dv_004", + "target": "model" + }, + { + "source": "model", + "target": "solver" + }, + { + "source": "solver", + "target": "ext_001" + }, + { + "source": "ext_001", + "target": "obj_001" + }, + { + "source": "ext_001", + "target": "obj_002" + }, + { + "source": "ext_001", + "target": "con_001" + }, + { + "source": "ext_001", + "target": "con_002" + }, + { + "source": "ext_001", + "target": "con_003" + }, + { + "source": "obj_001", + "target": "optimization" + }, + { + "source": "obj_002", + "target": "optimization" + }, + { + "source": "con_001", + "target": "optimization" + }, + { + "source": "con_002", + "target": "optimization" + }, + { + "source": "con_003", + "target": "optimization" + } + ], + "layout_version": "2.0" + } +} \ No newline at end of file diff --git a/studies/support_mass_v1/atomizer_spec.json b/studies/support_mass_v1/atomizer_spec.json new file mode 100644 index 00000000..b24c936e --- /dev/null +++ b/studies/support_mass_v1/atomizer_spec.json @@ -0,0 +1,83 @@ +{ + "meta": { + "version": "2.0", + "study_name": "support_mass_v1", + "description": "Minimize mass of structural support", + "created_by": "claude", + "created_at": "2026-01-18", + "modified_by": "claude", + "modified_at": "2026-01-18" + }, + "model": { + "sim": { + "path": "", + "solver": "nastran", + "description": "Structural support model - to be configured in Canvas" + } + }, + "design_variables": [], + "extractors": [ + { + "id": "ext_001", + "name": "mass", + "type": "mass_bdf", + "description": "Total structural mass from BDF", + "config": { + "unit": "kg" + }, + "enabled": true, + "canvas_position": { + "x": 400, + "y": 200 + } + } + ], + "objectives": [ + { + "id": "obj_001", + "name": "minimize_mass", + "direction": "minimize", + "weight": 1.0, + "extractor_id": "ext_001", + "enabled": true, + "canvas_position": { + "x": 600, + "y": 200 + } + } + ], + "constraints": [], + "optimization": { + "algorithm": { + "type": "TPE", + "config": { + "n_startup_trials": 10, + "multivariate": true + } + }, + "budget": { + "max_trials": 100, + "timeout_hours": null + }, + "convergence": { + "enable_early_stopping": true, + "patience": 15, + "min_improvement": 0.001 + } + }, + "canvas": { + "edges": [ + { + "id": "edge_001", + "source": "model", + "target": "ext_001" + }, + { + "id": "edge_002", + "source": "ext_001", + "target": "obj_001" + } + ], + "layout_version": "2.0" + } +}