- Add ATOMIZER_PODCAST_BRIEFING.md with complete technical overview - Covers all 12 sections: architecture, optimization, neural acceleration - Includes impressive statistics and metrics for podcast generation - Update LAC failure insights from recent sessions - Add M1_Mirror studies README 🤖 Generated with [Claude Code](https://claude.com/claude-code) Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
335 lines
13 KiB
Markdown
335 lines
13 KiB
Markdown
# 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:
|
||
|
||
```python
|
||
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](m1_mirror_adaptive_V11/) | Initial GNN + TuRBO | GNN+TuRBO | 107 | 129.33 | Complete |
|
||
| [m1_mirror_adaptive_V12](m1_mirror_adaptive_V12/) | Extended surrogate | GNN+TuRBO | ~5000 | 129.33 | Complete |
|
||
| [m1_mirror_adaptive_V13](m1_mirror_adaptive_V13/) | TPE validation | TPE | 291 | 129.33 | Complete |
|
||
| [m1_mirror_adaptive_V14](m1_mirror_adaptive_V14/) | Intensive TPE | TPE | 785 | **121.72** | Complete |
|
||
| [m1_mirror_adaptive_V15](m1_mirror_adaptive_V15/) | NSGA-II Pareto | NSGA-II | 126 | 121.72 | Complete |
|
||
| [m1_mirror_cost_reduction](m1_mirror_cost_reduction/) | Mass reduction baseline | TPE | 150 | - | Complete |
|
||
| [m1_mirror_cost_reduction_V7](m1_mirror_cost_reduction_V7/) | Whiffle refinement | CMA-ES | 200 | 268.75 | Complete |
|
||
| [m1_mirror_cost_reduction_V8](m1_mirror_cost_reduction_V8/) | Lateral optimization (Z-only) | CMA-ES | 200 | 266.02 | Complete |
|
||
| [m1_mirror_cost_reduction_V9](m1_mirror_cost_reduction_V9/) | Combined fine-tuning | CMA-ES | 200 | - | Complete |
|
||
| [m1_mirror_cost_reduction_V10](m1_mirror_cost_reduction_V10/) | Lateral + OPD (corrupted) | CMA-ES | - | - | Abandoned |
|
||
| [m1_mirror_cost_reduction_V11](m1_mirror_cost_reduction_V11/) | Lateral + OPD + extract_relative | CMA-ES | 200 | 284.19 | Complete |
|
||
| [m1_mirror_cost_reduction_V12](m1_mirror_cost_reduction_V12/) | Combined Whiffle + Lateral (10 vars) | CMA-ES | 200 | TBD | **Active** |
|
||
| [m1_mirror_surrogate_turbo](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](m1_mirror_cost_reduction_flat_back_V3/) | Initial exploration | TPE | ~297 | - | Complete |
|
||
| [m1_mirror_cost_reduction_flat_back_V4](m1_mirror_cost_reduction_flat_back_V4/) | Continued exploration | TPE | ~19 | - | Complete |
|
||
| [m1_mirror_cost_reduction_flat_back_V5](m1_mirror_cost_reduction_flat_back_V5/) | MLP Surrogate + L-BFGS | Surrogate | 45 | 290.18 | Complete (Failed) |
|
||
| [m1_mirror_cost_reduction_flat_back_V6](m1_mirror_cost_reduction_flat_back_V6/) | Pure TPE baseline | TPE | 196 | **225.41** | Complete |
|
||
| [m1_mirror_cost_reduction_flat_back_V7](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:
|
||
1. Compute WFE at each node for both subcases
|
||
2. Compute node-by-node difference: `WFE_rel[i] = WFE_target[i] - WFE_ref[i]`
|
||
3. Fit Zernike to the **difference field**
|
||
4. Compute RMS of filtered difference
|
||
|
||
> **Important**: `abs(RMS_target - RMS_ref)` is WRONG. Always use `extract_relative()` for relative metrics.
|
||
|
||
See: [docs/06_PHYSICS/ZERNIKE_OPD_METHOD.md](../../docs/06_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
|
||
|
||
```bash
|
||
cd studies/M1_Mirror/m1_mirror_cost_reduction_V9
|
||
conda activate atomizer
|
||
python run_optimization.py --start
|
||
```
|
||
|
||
### Check Progress
|
||
|
||
```bash
|
||
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
|
||
|
||
```bash
|
||
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](m1_mirror_adaptive_V15/M1_MIRROR_CAMPAIGN_SUMMARY.md) | V11-V15 campaign analysis |
|
||
| [docs/06_PHYSICS/ZERNIKE_FUNDAMENTALS.md](../../docs/06_PHYSICS/ZERNIKE_FUNDAMENTALS.md) | Zernike analysis basics |
|
||
| [docs/06_PHYSICS/ZERNIKE_OPD_METHOD.md](../../docs/06_PHYSICS/ZERNIKE_OPD_METHOD.md) | OPD method for lateral supports |
|
||
| [.claude/skills/modules/extractors-catalog.md](../../.claude/skills/modules/extractors-catalog.md) | Extractor quick reference |
|
||
|
||
---
|
||
|
||
*M1 Mirror Optimization Project*
|
||
*Atomizer Framework*
|
||
*Last Updated: 2025-12-23*
|