diff --git a/projects/gigabit-m1-frame-stiffness/README.md b/projects/gigabit-m1-frame-stiffness/README.md new file mode 100644 index 00000000..d3db7b3a --- /dev/null +++ b/projects/gigabit-m1-frame-stiffness/README.md @@ -0,0 +1,72 @@ +# GigaBIT M1 — Reference Frame Stiffness Characterization + +**Client:** StarSpec +**Project:** P04-GigaBIT-M1 +**Created:** 2026-03-04 +**Status:** Active — Model Setup + +--- + +## Objective + +Determine minimum stiffness requirements for StarSpec's reference frame at 5 mirror support interface points. Quantify WFE sensitivity to frame compliance so StarSpec can design their frame to spec. + +## Approach + +**Hybrid B+D method** (war-room validated): + +1. **Method D (Sensitivity):** Prescribed unit displacements at each unique interface point, extract Zernike WFE sensitivity coefficients (nm/μm per DOF per point) +2. **Method B (Stiffness Sweep):** CBUSH spring-to-ground at 5 interface points, sweep K to find knee points +3. **Robustness:** One-soft-point, combined compliance, correlated displacement tests + +## Key Numbers + +| Metric | Value | +|--------|-------| +| Baseline WFE @ 40° | ~7.0 nm RMS (J5+ filtered) | +| Baseline WFE @ 60° | ~13.0 nm RMS (J5+ filtered) | +| ΔWFE budget (frame) | ≤ 1.0 nm RMS | +| System allocation | ≤ 22 nm RMS (contract) | +| Mechanical target | < 14 nm RMS | +| Total runs | ~42 | + +## Interface Points (5 total) + +| Label | Type | Symmetry | +|-------|------|----------| +| V_top | Vertical support | Unique (on Y-Z symmetry axis) | +| V_left | Vertical support | = V_right mirrored | +| V_right | Vertical support | = V_left mirrored | +| L_left | Lateral support | = L_right mirrored | +| L_right | Lateral support | = L_left mirrored | + +**Unique points to test:** 3 (V_top, V_side, L_side) + +## Model + +- **Solver:** NX Nastran SOL 101 (linear static) +- **Coordinate system:** Global (Z = optical axis) +- **Zernike extractor:** Annular OPD, 50 modes, J5+ filtered RMS +- **Reference subcase:** 20° elevation +- **Test subcases:** 40° and 60° elevation +- **Inner radius:** 135.75 mm (central hole) +- **Outer radius:** 500.0 mm + +## Project Structure + +``` +gigabit-m1-frame-stiffness/ +├── README.md ← You are here +├── models/ # NX model files (drop .prt and .sim here) +├── studies/ +│ ├── 01_sensitivity_method_d/ # Unit displacement sensitivity (9+3 runs) +│ ├── 02_stiffness_sweep_method_b/ # K sweep campaigns (20 runs) +│ └── 03_robustness/ # One-soft-point, combined, correlated (8 runs) +├── deliverables/ # StarSpec requirement document (Rev A) +├── kb/ # Knowledge base notes +└── images/ # Plots, screenshots +``` + +## PKM Reference + +Full documentation: `obsidian-vault/2-Projects/P04-GigaBIT-M1/03-studies/Reference-Frame-Stiffness-Characterization/` diff --git a/projects/gigabit-m1-frame-stiffness/studies/01_sensitivity_method_d/README.md b/projects/gigabit-m1-frame-stiffness/studies/01_sensitivity_method_d/README.md new file mode 100644 index 00000000..deeec075 --- /dev/null +++ b/projects/gigabit-m1-frame-stiffness/studies/01_sensitivity_method_d/README.md @@ -0,0 +1,28 @@ +# Study 01 — Sensitivity Map (Method D) + +**Type:** Parametric — Prescribed Unit Displacements +**Runs:** 12 (9 unique @ 60° + 1 baseline + 2 spot checks @ 40°) +**Model:** Enforced displacement BCs with expression control + +## What This Does + +Applies +1 μm displacement at each unique interface point in each global DOF direction, one at a time. Measures ΔWFE to build a sensitivity matrix: **nm WFE per μm displacement per DOF per point.** + +This is the PRIMARY deliverable for StarSpec. + +## .sim Setup Required + +1. Create 9 NX expressions: `dV1_X, dV1_Y, dV1_Z, dV2_X, dV2_Y, dV2_Z, dL1_X, dL1_Y, dL1_Z` (all default = 0) +2. Apply enforced displacement BCs on all 5 support nodes referencing these expressions +3. Symmetry ties: V_right X = −dV2_X, L_right X = −dL1_X; Y/Z same sign as left counterpart +4. Gravity load at target elevation (60° or 40°) + +## Extractor + +Zernike annular OPD: 50 modes, J5+ filtered, inner_radius = 135.75 mm, reference subcase = 20° elevation. + +**Also extract individually:** J9, J10 (trefoil) and J11 (spherical) for secondary reporting. + +## Output + +Sensitivity matrix → feed into displacement limits and StarSpec deliverable. diff --git a/projects/gigabit-m1-frame-stiffness/studies/01_sensitivity_method_d/atomizer_spec.json b/projects/gigabit-m1-frame-stiffness/studies/01_sensitivity_method_d/atomizer_spec.json new file mode 100644 index 00000000..2eb7246b --- /dev/null +++ b/projects/gigabit-m1-frame-stiffness/studies/01_sensitivity_method_d/atomizer_spec.json @@ -0,0 +1,197 @@ +{ + "meta": { + "version": "2.0", + "created": "2026-03-04T12:00:00Z", + "modified": "2026-03-04T12:00:00Z", + "created_by": "mario", + "modified_by": "mario", + "study_name": "01_sensitivity_method_d", + "description": "Method D — Unit displacement sensitivity map. Apply +1 μm prescribed displacement at each unique interface point (3 points × 3 DOF = 9 runs), extract Zernike WFE sensitivity coefficients. Uses symmetry: V_left≡V_right, L_left≡L_right.", + "tags": ["mirror", "zernike", "sensitivity", "frame-stiffness", "parametric"] + }, + "model": { + "sim": { + "path": "ASSY_M1_assyfem1_sim1.sim", + "solver": "nastran", + "_note": "UPDATE: Set correct .sim filename after model drop" + }, + "nx_settings": { + "nx_install_path": "C:\\Program Files\\Siemens\\NX2506", + "simulation_timeout_s": 600, + "_note": "UPDATE: Adjust NX path for your machine if different" + } + }, + "design_variables": [ + { + "id": "dv_001", + "name": "dV1_X", + "expression_name": "dV1_X", + "type": "continuous", + "bounds": {"min": 0.0, "max": 0.001}, + "baseline": 0.0, + "units": "mm", + "enabled": true, + "description": "V_top displacement in global X (0 = fixed, 0.001 = +1 μm)" + }, + { + "id": "dv_002", + "name": "dV1_Y", + "expression_name": "dV1_Y", + "type": "continuous", + "bounds": {"min": 0.0, "max": 0.001}, + "baseline": 0.0, + "units": "mm", + "enabled": true, + "description": "V_top displacement in global Y" + }, + { + "id": "dv_003", + "name": "dV1_Z", + "expression_name": "dV1_Z", + "type": "continuous", + "bounds": {"min": 0.0, "max": 0.001}, + "baseline": 0.0, + "units": "mm", + "enabled": true, + "description": "V_top displacement in global Z (optical axis)" + }, + { + "id": "dv_004", + "name": "dV2_X", + "expression_name": "dV2_X", + "type": "continuous", + "bounds": {"min": 0.0, "max": 0.001}, + "baseline": 0.0, + "units": "mm", + "enabled": true, + "description": "V_side (left) displacement in global X" + }, + { + "id": "dv_005", + "name": "dV2_Y", + "expression_name": "dV2_Y", + "type": "continuous", + "bounds": {"min": 0.0, "max": 0.001}, + "baseline": 0.0, + "units": "mm", + "enabled": true, + "description": "V_side (left) displacement in global Y" + }, + { + "id": "dv_006", + "name": "dV2_Z", + "expression_name": "dV2_Z", + "type": "continuous", + "bounds": {"min": 0.0, "max": 0.001}, + "baseline": 0.0, + "units": "mm", + "enabled": true, + "description": "V_side (left) displacement in global Z" + }, + { + "id": "dv_007", + "name": "dL1_X", + "expression_name": "dL1_X", + "type": "continuous", + "bounds": {"min": 0.0, "max": 0.001}, + "baseline": 0.0, + "units": "mm", + "enabled": true, + "description": "L_side (left) displacement in global X" + }, + { + "id": "dv_008", + "name": "dL1_Y", + "expression_name": "dL1_Y", + "type": "continuous", + "bounds": {"min": 0.0, "max": 0.001}, + "baseline": 0.0, + "units": "mm", + "enabled": true, + "description": "L_side (left) displacement in global Y" + }, + { + "id": "dv_009", + "name": "dL1_Z", + "expression_name": "dL1_Z", + "type": "continuous", + "bounds": {"min": 0.0, "max": 0.001}, + "baseline": 0.0, + "units": "mm", + "enabled": true, + "description": "L_side (left) displacement in global Z" + } + ], + "extractors": [ + { + "id": "ext_001", + "name": "Zernike Annular OPD — WFE Sensitivity", + "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, + "_note": "J5+ filtered RMS. reference_subcase=2 is 20° elevation. Check subcase numbering in your model." + }, + "outputs": [ + { + "name": "rel_filtered_rms_40_vs_20", + "metric": "filtered_rms_nm" + }, + { + "name": "rel_filtered_rms_60_vs_20", + "metric": "filtered_rms_nm" + } + ] + } + ], + "objectives": [ + { + "id": "obj_001", + "name": "ΔWFE at 60° (primary — worst case)", + "direction": "minimize", + "weight": 1.0, + "source": { + "extractor_id": "ext_001", + "output_name": "rel_filtered_rms_60_vs_20" + }, + "target": 1.0, + "units": "nm", + "_note": "This is a parametric study, not optimization. Objective is for tracking only." + } + ], + "constraints": [], + "optimization": { + "algorithm": { + "type": "GridSampler", + "config": { + "_note": "GridSampler for deterministic parametric sweep. Each run is a specific point in the design matrix." + } + }, + "budget": { + "max_trials": 12 + }, + "_run_matrix_note": "Override with explicit trial list below. Each trial activates exactly ONE displacement expression = 0.001, rest = 0." + }, + "run_matrix": { + "_description": "Explicit trial definitions for Method D. Each row is one FEA run. Atomizer sets these expression values before solving.", + "trials": [ + {"trial": 0, "label": "baseline_all_fixed", "dV1_X": 0, "dV1_Y": 0, "dV1_Z": 0, "dV2_X": 0, "dV2_Y": 0, "dV2_Z": 0, "dL1_X": 0, "dL1_Y": 0, "dL1_Z": 0, "elevation": "60"}, + {"trial": 1, "label": "V_top_Z", "dV1_X": 0, "dV1_Y": 0, "dV1_Z": 0.001, "dV2_X": 0, "dV2_Y": 0, "dV2_Z": 0, "dL1_X": 0, "dL1_Y": 0, "dL1_Z": 0, "elevation": "60"}, + {"trial": 2, "label": "V_top_X", "dV1_X": 0.001, "dV1_Y": 0, "dV1_Z": 0, "dV2_X": 0, "dV2_Y": 0, "dV2_Z": 0, "dL1_X": 0, "dL1_Y": 0, "dL1_Z": 0, "elevation": "60"}, + {"trial": 3, "label": "V_top_Y", "dV1_X": 0, "dV1_Y": 0.001, "dV1_Z": 0, "dV2_X": 0, "dV2_Y": 0, "dV2_Z": 0, "dL1_X": 0, "dL1_Y": 0, "dL1_Z": 0, "elevation": "60"}, + {"trial": 4, "label": "V_side_Z", "dV1_X": 0, "dV1_Y": 0, "dV1_Z": 0, "dV2_X": 0, "dV2_Y": 0, "dV2_Z": 0.001, "dL1_X": 0, "dL1_Y": 0, "dL1_Z": 0, "elevation": "60"}, + {"trial": 5, "label": "V_side_X", "dV1_X": 0, "dV1_Y": 0, "dV1_Z": 0, "dV2_X": 0.001, "dV2_Y": 0, "dV2_Z": 0, "dL1_X": 0, "dL1_Y": 0, "dL1_Z": 0, "elevation": "60"}, + {"trial": 6, "label": "V_side_Y", "dV1_X": 0, "dV1_Y": 0, "dV1_Z": 0, "dV2_X": 0, "dV2_Y": 0.001, "dV2_Z": 0, "dL1_X": 0, "dL1_Y": 0, "dL1_Z": 0, "elevation": "60"}, + {"trial": 7, "label": "L_side_Z", "dV1_X": 0, "dV1_Y": 0, "dV1_Z": 0, "dV2_X": 0, "dV2_Y": 0, "dV2_Z": 0, "dL1_X": 0, "dL1_Y": 0, "dL1_Z": 0.001, "elevation": "60"}, + {"trial": 8, "label": "L_side_X", "dV1_X": 0, "dV1_Y": 0, "dV1_Z": 0, "dV2_X": 0, "dV2_Y": 0, "dV2_Z": 0, "dL1_X": 0.001, "dL1_Y": 0, "dL1_Z": 0, "elevation": "60"}, + {"trial": 9, "label": "L_side_Y", "dV1_X": 0, "dV1_Y": 0, "dV1_Z": 0, "dV2_X": 0, "dV2_Y": 0, "dV2_Z": 0, "dL1_X": 0, "dL1_Y": 0.001, "dL1_Z": 0, "elevation": "60"}, + {"trial": 10, "label": "spot_check_40_top1", "dV1_X": 0, "dV1_Y": 0, "dV1_Z": 0.001, "dV2_X": 0, "dV2_Y": 0, "dV2_Z": 0, "dL1_X": 0, "dL1_Y": 0, "dL1_Z": 0, "elevation": "40", "_note": "Repeat top sensitive DOF at 40° — UPDATE label after ranking"}, + {"trial": 11, "label": "spot_check_40_top2", "dV1_X": 0, "dV1_Y": 0, "dV1_Z": 0, "dV2_X": 0, "dV2_Y": 0, "dV2_Z": 0.001, "dL1_X": 0, "dL1_Y": 0, "dL1_Z": 0, "elevation": "40", "_note": "UPDATE after ranking"} + ] + } +} diff --git a/projects/gigabit-m1-frame-stiffness/studies/02_stiffness_sweep_method_b/README.md b/projects/gigabit-m1-frame-stiffness/studies/02_stiffness_sweep_method_b/README.md new file mode 100644 index 00000000..dcb3af6f --- /dev/null +++ b/projects/gigabit-m1-frame-stiffness/studies/02_stiffness_sweep_method_b/README.md @@ -0,0 +1,30 @@ +# Study 02 — Stiffness Sweep (Method B) + +**Type:** Parametric — CBUSH Spring-to-Ground Sweep +**Runs:** 22 (2 validation + 10 K_vert sweep + 10 K_lat sweep) +**Model:** CBUSH elements at 5 interface points, offset ground nodes (−10mm Z) + +## What This Does + +Replaces fixed BCs with CBUSH springs. Sweeps translational stiffness from 1e4 → 1e10 N/m on log scale. Two independent campaigns: +- Campaign 1: Sweep K_vert (laterals rigid) +- Campaign 2: Sweep K_lat (verticals rigid) + +Finds the **knee point** where ΔWFE crosses the 1.0 nm budget. + +## .sim Setup Required + +1. Create 5 ground nodes (offset −10mm in −Z from each support node) +2. SPC 123456 on all ground nodes +3. Remove existing SPCs on 5 support nodes +4. Create 5 CBUSH elements (support → ground, global coords) +5. Create 2 PBUSH properties: 8001 (vertical, K=$K_vert) and 8002 (lateral, K=$K_lat) +6. Create 2 NX expressions: `K_vert`, `K_lat` (default = 1e12) + +## Extractor + +Same as Study 01: Zernike annular OPD, 50 modes, J5+ filtered, annular aperture. + +## Output + +ΔWFE vs K curves → knee points → recommended minimum stiffness for StarSpec. diff --git a/projects/gigabit-m1-frame-stiffness/studies/02_stiffness_sweep_method_b/atomizer_spec.json b/projects/gigabit-m1-frame-stiffness/studies/02_stiffness_sweep_method_b/atomizer_spec.json new file mode 100644 index 00000000..ef68fd86 --- /dev/null +++ b/projects/gigabit-m1-frame-stiffness/studies/02_stiffness_sweep_method_b/atomizer_spec.json @@ -0,0 +1,126 @@ +{ + "meta": { + "version": "2.0", + "created": "2026-03-04T12:00:00Z", + "modified": "2026-03-04T12:00:00Z", + "created_by": "mario", + "modified_by": "mario", + "study_name": "02_stiffness_sweep_method_b", + "description": "Method B — CBUSH spring-to-ground stiffness sweep. 5 CBUSH elements at interface points (offset 10mm in -Z). Sweep K_vertical (3 vertical CBUSHes) and K_lateral (2 lateral CBUSHes) independently to find knee points where ΔWFE exceeds 1.0 nm budget.", + "tags": ["mirror", "zernike", "stiffness", "frame-stiffness", "parametric", "cbush"] + }, + "model": { + "sim": { + "path": "ASSY_M1_assyfem1_sim1.sim", + "solver": "nastran", + "_note": "UPDATE: This uses the CBUSH model variant (.sim with CBUSH elements + offset ground nodes). Different from Study 01." + }, + "nx_settings": { + "nx_install_path": "C:\\Program Files\\Siemens\\NX2506", + "simulation_timeout_s": 600 + } + }, + "design_variables": [ + { + "id": "dv_001", + "name": "K_vert", + "expression_name": "K_vert", + "type": "continuous", + "bounds": {"min": 1e4, "max": 1e12}, + "baseline": 1e12, + "units": "N/m", + "enabled": true, + "description": "Translational stiffness for all 3 vertical support CBUSHes (K1=K2=K3=K_vert). Rotational K4=K5=K6 held at 1e12." + }, + { + "id": "dv_002", + "name": "K_lat", + "expression_name": "K_lat", + "type": "continuous", + "bounds": {"min": 1e4, "max": 1e12}, + "baseline": 1e12, + "units": "N/m", + "enabled": true, + "description": "Translational stiffness for all 2 lateral support CBUSHes (K1=K2=K3=K_lat). Rotational K4=K5=K6 held at 1e12." + } + ], + "extractors": [ + { + "id": "ext_001", + "name": "Zernike Annular OPD — Stiffness Sweep", + "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": "rel_filtered_rms_40_vs_20", + "metric": "filtered_rms_nm" + }, + { + "name": "rel_filtered_rms_60_vs_20", + "metric": "filtered_rms_nm" + } + ] + } + ], + "objectives": [ + { + "id": "obj_001", + "name": "ΔWFE at 60° — stiffness sweep tracking", + "direction": "minimize", + "weight": 1.0, + "source": { + "extractor_id": "ext_001", + "output_name": "rel_filtered_rms_60_vs_20" + }, + "target": 1.0, + "units": "nm" + } + ], + "constraints": [], + "optimization": { + "algorithm": { + "type": "GridSampler", + "config": {} + }, + "budget": { + "max_trials": 22 + } + }, + "run_matrix": { + "_description": "Campaign 1: Sweep K_vert (K_lat=1e12). Campaign 2: Sweep K_lat (K_vert=1e12). All at 60° elevation.", + "trials": [ + {"trial": 0, "label": "baseline_rigid", "K_vert": 1e12, "K_lat": 1e12, "elevation": "60", "_note": "Validation: should match fixed-BC baseline"}, + {"trial": 1, "label": "baseline_rigid_40", "K_vert": 1e12, "K_lat": 1e12, "elevation": "40", "_note": "Validation at 40°"}, + + {"trial": 2, "label": "Kv_1e4", "K_vert": 1e4, "K_lat": 1e12, "elevation": "60"}, + {"trial": 3, "label": "Kv_1e5", "K_vert": 1e5, "K_lat": 1e12, "elevation": "60"}, + {"trial": 4, "label": "Kv_3e5", "K_vert": 3e5, "K_lat": 1e12, "elevation": "60"}, + {"trial": 5, "label": "Kv_1e6", "K_vert": 1e6, "K_lat": 1e12, "elevation": "60"}, + {"trial": 6, "label": "Kv_3e6", "K_vert": 3e6, "K_lat": 1e12, "elevation": "60"}, + {"trial": 7, "label": "Kv_1e7", "K_vert": 1e7, "K_lat": 1e12, "elevation": "60"}, + {"trial": 8, "label": "Kv_3e7", "K_vert": 3e7, "K_lat": 1e12, "elevation": "60"}, + {"trial": 9, "label": "Kv_1e8", "K_vert": 1e8, "K_lat": 1e12, "elevation": "60"}, + {"trial": 10, "label": "Kv_1e9", "K_vert": 1e9, "K_lat": 1e12, "elevation": "60"}, + {"trial": 11, "label": "Kv_1e10", "K_vert": 1e10, "K_lat": 1e12, "elevation": "60"}, + + {"trial": 12, "label": "Kl_1e4", "K_vert": 1e12, "K_lat": 1e4, "elevation": "60"}, + {"trial": 13, "label": "Kl_1e5", "K_vert": 1e12, "K_lat": 1e5, "elevation": "60"}, + {"trial": 14, "label": "Kl_3e5", "K_vert": 1e12, "K_lat": 3e5, "elevation": "60"}, + {"trial": 15, "label": "Kl_1e6", "K_vert": 1e12, "K_lat": 1e6, "elevation": "60"}, + {"trial": 16, "label": "Kl_3e6", "K_vert": 1e12, "K_lat": 3e6, "elevation": "60"}, + {"trial": 17, "label": "Kl_1e7", "K_vert": 1e12, "K_lat": 1e7, "elevation": "60"}, + {"trial": 18, "label": "Kl_3e7", "K_vert": 1e12, "K_lat": 3e7, "elevation": "60"}, + {"trial": 19, "label": "Kl_1e8", "K_vert": 1e12, "K_lat": 1e8, "elevation": "60"}, + {"trial": 20, "label": "Kl_1e9", "K_vert": 1e12, "K_lat": 1e9, "elevation": "60"}, + {"trial": 21, "label": "Kl_1e10", "K_vert": 1e12, "K_lat": 1e10, "elevation": "60"} + ] + } +} diff --git a/projects/gigabit-m1-frame-stiffness/studies/03_robustness/README.md b/projects/gigabit-m1-frame-stiffness/studies/03_robustness/README.md new file mode 100644 index 00000000..583b05e9 --- /dev/null +++ b/projects/gigabit-m1-frame-stiffness/studies/03_robustness/README.md @@ -0,0 +1,26 @@ +# Study 03 — Robustness Checks + +**Type:** Parametric — Specific Scenarios +**Runs:** 8 +**Model:** Uses both .sim setups (CBUSH for K tests, displacement for correlated tests) +**Prerequisite:** Complete Studies 01 and 02 first (needs knee values) + +## What This Does + +Tests scenarios that the simple sweeps can't capture: + +1. **One-soft-point (3 runs):** What if one support is 10× softer than the rest? +2. **Combined compliance (3 runs):** Both vertical and lateral at knee values simultaneously +3. **Correlated displacement (2 runs):** All verticals move together (frame bending mode simulation) + +## Before Running + +Update `atomizer_spec.json` with actual knee values from Study 02: +- Replace `KNEE` placeholders with K_vert_knee and K_lat_knee values +- Replace `KNEE/10` with knee/10, `KNEE/2` with knee/2 + +## Output + +- Interaction factor: is combined ΔWFE > sum of individual? +- Worst-case single soft point identification +- Correlated vs independent displacement comparison diff --git a/projects/gigabit-m1-frame-stiffness/studies/03_robustness/atomizer_spec.json b/projects/gigabit-m1-frame-stiffness/studies/03_robustness/atomizer_spec.json new file mode 100644 index 00000000..a709ad38 --- /dev/null +++ b/projects/gigabit-m1-frame-stiffness/studies/03_robustness/atomizer_spec.json @@ -0,0 +1,123 @@ +{ + "meta": { + "version": "2.0", + "created": "2026-03-04T12:00:00Z", + "modified": "2026-03-04T12:00:00Z", + "created_by": "mario", + "modified_by": "mario", + "study_name": "03_robustness", + "description": "Robustness checks: one-soft-point tests, combined compliance, and correlated displacement patterns. Run AFTER Studies 01 and 02 — uses knee values from Study 02.", + "tags": ["mirror", "zernike", "robustness", "frame-stiffness"] + }, + "model": { + "sim": { + "path": "ASSY_M1_assyfem1_sim1.sim", + "solver": "nastran", + "_note": "Uses same CBUSH model variant as Study 02" + }, + "nx_settings": { + "nx_install_path": "C:\\Program Files\\Siemens\\NX2506", + "simulation_timeout_s": 600 + } + }, + "design_variables": [ + { + "id": "dv_001", + "name": "K_V_top", + "expression_name": "K_V_top", + "type": "continuous", + "bounds": {"min": 1e4, "max": 1e12}, + "baseline": 1e12, + "units": "N/m", + "enabled": true, + "description": "Stiffness for V_top CBUSH only (for one-soft-point tests)" + }, + { + "id": "dv_002", + "name": "K_V_side", + "expression_name": "K_V_side", + "type": "continuous", + "bounds": {"min": 1e4, "max": 1e12}, + "baseline": 1e12, + "units": "N/m", + "enabled": true, + "description": "Stiffness for V_left + V_right CBUSHes (symmetric pair)" + }, + { + "id": "dv_003", + "name": "K_L_side", + "expression_name": "K_L_side", + "type": "continuous", + "bounds": {"min": 1e4, "max": 1e12}, + "baseline": 1e12, + "units": "N/m", + "enabled": true, + "description": "Stiffness for L_left + L_right CBUSHes (symmetric pair)" + } + ], + "extractors": [ + { + "id": "ext_001", + "name": "Zernike Annular OPD — Robustness", + "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": "rel_filtered_rms_40_vs_20", + "metric": "filtered_rms_nm" + }, + { + "name": "rel_filtered_rms_60_vs_20", + "metric": "filtered_rms_nm" + } + ] + } + ], + "objectives": [ + { + "id": "obj_001", + "name": "ΔWFE at 60° — robustness tracking", + "direction": "minimize", + "weight": 1.0, + "source": { + "extractor_id": "ext_001", + "output_name": "rel_filtered_rms_60_vs_20" + }, + "target": 1.0, + "units": "nm" + } + ], + "constraints": [], + "optimization": { + "algorithm": { + "type": "GridSampler", + "config": {} + }, + "budget": { + "max_trials": 8 + } + }, + "run_matrix": { + "_description": "UPDATE K_knee values after Study 02 completes. Replace 'KNEE' placeholders with actual values.", + "_K_vert_knee": "UPDATE_FROM_STUDY_02", + "_K_lat_knee": "UPDATE_FROM_STUDY_02", + "trials": [ + {"trial": 0, "label": "one_soft_V_top", "K_V_top": "KNEE/10", "K_V_side": 1e12, "K_L_side": 1e12, "elevation": "60", "_note": "V_top 10× below knee, rest rigid"}, + {"trial": 1, "label": "one_soft_V_side", "K_V_top": 1e12, "K_V_side": "KNEE/10", "K_L_side": 1e12, "elevation": "60", "_note": "V_side 10× below knee, rest rigid"}, + {"trial": 2, "label": "one_soft_L_side", "K_V_top": 1e12, "K_V_side": 1e12, "K_L_side": "KNEE/10", "elevation": "60", "_note": "L_side 10× below knee, rest rigid"}, + {"trial": 3, "label": "combined_knee_60", "K_V_top": "KNEE", "K_V_side": "KNEE", "K_L_side": "KNEE", "elevation": "60", "_note": "All at knee values"}, + {"trial": 4, "label": "combined_knee_40", "K_V_top": "KNEE", "K_V_side": "KNEE", "K_L_side": "KNEE", "elevation": "40", "_note": "All at knee @ 40°"}, + {"trial": 5, "label": "combined_half_60", "K_V_top": "KNEE/2", "K_V_side": "KNEE/2", "K_L_side": "KNEE/2", "elevation": "60", "_note": "All at half knee"}, + {"trial": 6, "label": "corr_sag_all_V_down", "_type": "method_d", "_note": "USE Study 01 setup: dV1_Z=dV2_Z=0.001 simultaneously (all 3 vertical +1μm Z). Tests correlated frame sag."}, + {"trial": 7, "label": "corr_twist_V_split", "_type": "method_d", "_note": "USE Study 01 setup: dV1_Z=+0.001, dV2_Z=-0.001 (V_top up, V_sides down). Tests frame twist."} + ] + } +}