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
M1 Mirror - Telescope Primary Mirror Optimization
Project Type: Telescope Primary Mirror Support Structure Optimization Material: Zerodur Class 2 Glass Ceramic Analysis: NX Nastran SOL 101 (Linear Static, 4 Subcases) Status: Active Optimization Campaign
1. Project Overview
The M1 Mirror project optimizes the support structure of a telescope primary mirror to minimize wavefront error (WFE) across operational elevation angles while managing mass and manufacturing constraints.
1.1 What We're Optimizing
The mirror itself is a fixed optical prescription. We optimize how it's supported:
- Whiffle-tree axial support (18 contact points) - distributes gravity load evenly
- Lateral support (3 contact points) - prevents sideways motion at different elevations
- Mirror blank geometry - backface angle, rib structure affecting mass
1.2 Why This Matters
At different telescope elevation angles, gravity acts on the mirror differently:
- 90° (zenith): Gravity purely axial - whiffle-tree handles load
- 20-60° (operational): Mixed axial + lateral gravity component
- Polishing (horizontal): Different deformation than operational use
Poor support design causes:
- Tracking errors (WFE change between elevations)
- Manufacturing difficulty (optician must polish out gravity sag)
- Excessive mass (over-designed structure)
2. Optical Prescription
Source: Validated optical design specification (2025-12-22)
| Parameter | Value | Tolerance | Units |
|---|---|---|---|
| Radius of Curvature (R) | 2890 | ± 3 | mm |
| Conic Constant (K) | -0.987 | ± 0.001 | - |
| Clear Aperture (Ø) | 1202.00 | - | mm |
| Central Bore (Ø) | 271.56 | - | mm |
| Focal Length | 1445 | - | mm |
| f-number (f/D) | f/1.20 | - | - |
| Surface Type | Near-Parabolic | - | - |
Notes:
- Surface is concave (front surface)
- Conic constant K = -0.987 indicates near-parabolic (K = -1 is pure parabola)
- Focal length derived: f = R/2 = 1445 mm
- FEA mesh (1300 mm) includes lateral support nodes beyond the 1202 mm optical clear aperture
2.1 Usage in OPD Extractor
For rigorous WFE analysis (especially lateral support optimization), use explicit focal length:
from optimization_engine.extractors import ZernikeOPDExtractor
extractor = ZernikeOPDExtractor(
op2_file,
focal_length=1445.0, # mm - from optical prescription R/2
concave=True
)
2.2 Mesh vs Optical Aperture
| Geometry | Mesh Value | Optical Value | Reason |
|---|---|---|---|
| Diameter | 1300 mm | 1202 mm | Mesh includes lateral support structure |
| Central hole | 135 mm | 271.56 mm | Mesh underestimates bore size |
When analyzing WFE, filter nodes to clear aperture (r < 601 mm) or use the optical aperture radius in post-processing.
3. Physical System
3.1 Mirror Blank
| Property | Value | Notes |
|---|---|---|
| Material | Zerodur Class 2 | E=91 GPa, ρ=2.53 g/cm³, CTE≈0 |
| Mass Target | < 105 kg | Hard constraint |
| Current Best | ~94-95 kg | Achieved in V8/V9 |
3.2 Support Structure
| System | Points | Purpose |
|---|---|---|
| Whiffle-tree (axial) | 18 | Distribute gravity load uniformly |
| Lateral supports | 3 | Prevent lateral motion at elevation |
| Vertical support skeleton | - | Structural frame |
3.3 Loading
| Subcase | Elevation | Gravity Direction | Purpose |
|---|---|---|---|
| 1 | 90° | Pure -Z (axial) | Manufacturing/polishing reference |
| 2 | 20° | Mixed | Reference for tracking |
| 3 | 40° | Mixed | Operational tracking |
| 4 | 60° | Mixed | Operational tracking |
4. Optimization Objectives
4.1 WFE Metrics (Zernike-based)
| Objective | Formula | Weight | Target | Description |
|---|---|---|---|---|
| 40-20 Tracking | RMS_filt(Z₄₀ - Z₂₀) | 5.0 | 4 nm | WFE change from 20° to 40° |
| 60-20 Tracking | RMS_filt(Z₆₀ - Z₂₀) | 5.0 | 10 nm | WFE change from 20° to 60° |
| Manufacturing | RMS_J1-J3(Z₉₀ - Z₂₀) | 3.0 | 20 nm | Optician workload |
Where:
RMS_filt= RMS after removing J1-J4 (piston, tip, tilt, defocus)RMS_J1-J3= RMS after removing only J1-J3 (keeps defocus for optician)
4.2 Mass
| Objective | Weight | Target |
|---|---|---|
| M1_Blank mass | 1.0 | Minimize (< 105 kg hard limit) |
4.3 Weighted Sum Formula
WS = 5×(40-20 nm) + 5×(60-20 nm) + 3×(MFG nm) + 1×(mass kg)
5. Design Variables
5.1 Whiffle Tree Parameters
| Variable | Range | Units | Description |
|---|---|---|---|
whiffle_min |
30-72 | mm | Minimum whiffle extent |
whiffle_outer_to_vertical |
70-85 | deg | Outer arm to vertical angle |
whiffle_triangle_closeness |
65-120 | mm | Triangle spacing |
blank_backface_angle |
4.2-4.5 | deg | Mirror blank taper (affects mass) |
5.2 Lateral Support Parameters
| Variable | Range | Units | Description |
|---|---|---|---|
lateral_inner_angle |
25-32 | deg | Inner lateral angle |
lateral_outer_angle |
9-17 | deg | Outer lateral angle |
lateral_outer_pivot |
9-12 | deg | Outer pivot position |
lateral_inner_pivot |
5-12 | deg | Inner pivot position |
lateral_middle_pivot |
15-27 | deg | Middle pivot position |
lateral_closeness |
7-12 | deg | Lateral support closeness |
5.3 Structural Parameters
| Variable | Range | Units | Description |
|---|---|---|---|
inner_circular_rib_dia |
480-620 | mm | Inner rib diameter |
Pocket_Radius |
Fixed 10.05 | mm | Lightweighting pocket size |
6. Optimization Campaign History
6.1 Campaign Phases
Phase 1: Initial Exploration (V11-V15)
─────────────────────────────────────
V11 (GNN + TuRBO) → V12 (GNN extended) → V13 (TPE validation)
107 trials ~5000 surrogate 291 trials
WS = 129.33 WS = 129.33 WS = 129.33
↓
V14 (TPE intensive) → V15 (NSGA-II)
785 trials 126 trials
WS = 121.72 ✓ WS = 121.72 (confirmed)
Phase 2: Cost Reduction (V6-V9)
─────────────────────────────────
V6 (TPE) → V7 (CMA-ES whiffle) → V8 (CMA-ES lateral) → V9 (CMA-ES combined)
281.82 268.75 (-4.6%) 266.02 (-5.6%) In progress
6.2 Best Results Summary
| Campaign | Best WS | 40-20 nm | 60-20 nm | MFG nm | Mass kg |
|---|---|---|---|---|---|
| V11-V15 (adaptive) | 121.72 | 5.99 | 13.10 | 26.28 | 91.02 |
| V6-V9 (cost reduction) | 266.02* | 6.03 | 12.81 | 25.73 | 94.66 |
*Different weighting scheme - not directly comparable
7. Sub-Studies Index
| Study | Focus | Algorithm | Trials | Best WS | Status |
|---|---|---|---|---|---|
| m1_mirror_adaptive_V11 | Initial GNN + TuRBO | GNN+TuRBO | 107 | 129.33 | Complete |
| m1_mirror_adaptive_V12 | Extended surrogate | GNN+TuRBO | ~5000 | 129.33 | Complete |
| m1_mirror_adaptive_V13 | TPE validation | TPE | 291 | 129.33 | Complete |
| m1_mirror_adaptive_V14 | Intensive TPE | TPE | 785 | 121.72 | Complete |
| m1_mirror_adaptive_V15 | NSGA-II Pareto | NSGA-II | 126 | 121.72 | Complete |
| m1_mirror_cost_reduction | Mass reduction baseline | TPE | 150 | - | Complete |
| m1_mirror_cost_reduction_V7 | Whiffle refinement | CMA-ES | 200 | 268.75 | Complete |
| m1_mirror_cost_reduction_V8 | Lateral optimization (Z-only) | CMA-ES | 200 | 266.02 | Complete |
| m1_mirror_cost_reduction_V9 | Combined fine-tuning | CMA-ES | 200 | - | Complete |
| m1_mirror_cost_reduction_V10 | Lateral + OPD (corrupted) | CMA-ES | - | - | Abandoned |
| m1_mirror_cost_reduction_V11 | Lateral + OPD + extract_relative | CMA-ES | 200 | 284.19 | Complete |
| m1_mirror_cost_reduction_V12 | Combined Whiffle + Lateral (10 vars) | CMA-ES | 200 | TBD | Active |
| m1_mirror_surrogate_turbo | GNN surrogate + turbo optimization | GNN+FEA | ~1000 | TBD | Setup Complete |
Flat Back Studies (Cost Reduction Option C)
| Study | Focus | Algorithm | Trials | Best WS | Status |
|---|---|---|---|---|---|
| m1_mirror_cost_reduction_flat_back_V3 | Initial exploration | TPE | ~297 | - | Complete |
| m1_mirror_cost_reduction_flat_back_V4 | Continued exploration | TPE | ~19 | - | Complete |
| m1_mirror_cost_reduction_flat_back_V5 | MLP Surrogate + L-BFGS | Surrogate | 45 | 290.18 | Complete (Failed) |
| m1_mirror_cost_reduction_flat_back_V6 | Pure TPE baseline | TPE | 196 | 225.41 | Complete |
| m1_mirror_cost_reduction_flat_back_V7 | Self-Aware Turbo | SAT | 200 | TBD | Ready |
Flat Back Notes:
blank_backface_angle = 0(flat backface eliminates custom jig during machining)- Mass constraint: ≤ 120 kg
- Weighted sum:
6*wfe_40_20 + 5*wfe_60_20 + 3*mfg_90 - V5 failure: MLP surrogate led L-BFGS to "fake optima" (OOD extrapolation)
- V7 fix: EnsembleSurrogate with uncertainty quantification + OOD detection
8. Technical Notes
8.1 Zernike Analysis
- Standard method: Uses Z-displacement only at original (x,y) coordinates
- OPD method: Accounts for lateral (X,Y) displacement - critical for lateral support optimization
extract_relative()method (V11+): Correct relative WFE computation:- Compute WFE at each node for both subcases
- Compute node-by-node difference:
WFE_rel[i] = WFE_target[i] - WFE_ref[i] - Fit Zernike to the difference field
- Compute RMS of filtered difference
Important
:
abs(RMS_target - RMS_ref)is WRONG. Always useextract_relative()for relative metrics.
See: docs/physics/ZERNIKE_OPD_METHOD.md
8.2 WFE Convention
WFE = 2 × surface_error (reflection doubles path length)
All WFE values in nanometers (nm).
8.3 Coordinate System
- Z-axis: Optical axis (positive toward sky)
- Origin: Mirror vertex
- Concave mirror: Surface curves toward -Z
9. File Structure
studies/M1_Mirror/
├── README.md # This file (master documentation)
├── m1_mirror_adaptive_V11/ # Sub-studies...
├── m1_mirror_adaptive_V12/
├── ...
├── m1_mirror_cost_reduction_V9/
│ ├── 1_setup/
│ │ ├── optimization_config.json # Study configuration
│ │ └── model/ # NX model files
│ ├── 2_iterations/ # FEA iteration folders
│ ├── 3_results/ # Optuna DB, logs, archives
│ ├── run_optimization.py # Main entry point
│ └── README.md # Study-specific docs
10. Quick Reference
Run Optimization
cd studies/M1_Mirror/m1_mirror_cost_reduction_V9
conda activate atomizer
python run_optimization.py --start
Check Progress
python -c "
import optuna
study = optuna.load_study(study_name='m1_mirror_cost_reduction_V9',
storage='sqlite:///3_results/study.db')
print(f'Trials: {len(study.trials)}')
print(f'Best: {study.best_value:.2f}')
"
Generate Insights
python -m optimization_engine.insights generate . --type zernike_wfe
python -m optimization_engine.insights generate . --type zernike_opd_comparison
11. Related Documentation
| Document | Description |
|---|---|
| M1_MIRROR_CAMPAIGN_SUMMARY.md | V11-V15 campaign analysis |
| docs/physics/ZERNIKE_FUNDAMENTALS.md | Zernike analysis basics |
| docs/physics/ZERNIKE_OPD_METHOD.md | OPD method for lateral supports |
| .claude/skills/modules/extractors-catalog.md | Extractor quick reference |
M1 Mirror Optimization Project Atomizer Framework Last Updated: 2026-01-20