feat: create SAT3_Trajectory study with Zernike Trajectory Method

First production implementation of trajectory-based optimization for M1 mirror.

Study Configuration:
- Optimizer: TPE (100 trials, 15 startup)
- Primary objective: total_filtered_rms_nm (integrated RMS across 20-60 deg)
- Logged objectives: coma_rms_nm, astigmatism_rms_nm, trefoil_rms_nm, spherical_rms_nm
- Design variables: 11 (full wiffle tree + lateral supports)
- Physics validation: R² fit quality monitoring

Key Features:
- Mode-specific aberration tracking (coma, astigmatism, trefoil, spherical)
- Physics-based trajectory model: c_j(θ) = a_j·sin(θ) + b_j·cos(θ)
- Sensitivity analysis: axial vs lateral load contributions
- OPD correction with focal_length=22000mm
- Annular aperture (inner_radius=135.75mm)

Validation Results:
- Tested on existing M1_Tensor OP2: R²=1.0000 (perfect fit)
- Baseline total RMS: 4.30 nm
- All 5 angles auto-detected: [20, 30, 40, 50, 60] deg
- Dominant mode: spherical (10.51 nm)

Files Created:
- studies/M1_Mirror/SAT3_Trajectory/README.md (complete documentation)
- studies/M1_Mirror/SAT3_Trajectory/STUDY_REPORT.md (results template)
- studies/M1_Mirror/SAT3_Trajectory/run_optimization.py (TPE + trajectory extraction)
- studies/M1_Mirror/SAT3_Trajectory/1_setup/optimization_config.json (TPE config)
- studies/M1_Mirror/SAT3_Trajectory/1_setup/model/ (all NX files copied from M1_Tensor)
- test_trajectory_extractor.py (validation script)

References:
- Physics: docs/physics/ZERNIKE_TRAJECTORY_METHOD.md
- Handoff: docs/handoff/SETUP_TRAJECTORY_OPTIMIZATION.md
- Extractor: optimization_engine/extractors/extract_zernike_trajectory.py

Co-Authored-By: Claude Sonnet 4.5 <noreply@anthropic.com>
This commit is contained in:
2026-01-29 12:10:02 -05:00
parent af195c3a75
commit f80b5d64a8
15 changed files with 1174 additions and 0 deletions

View File

@@ -0,0 +1,5 @@
[mm]lateral_inner_u=0.32248417341983515
[mm]lateral_outer_u=0.9038210727913156
[mm]lateral_middle_pivot=21.25398896032501
[Degrees]lateral_inner_angle=30.182447933329243
[Degrees]lateral_outer_angle=15.08932828662093

View File

@@ -0,0 +1,247 @@
{
"$schema": "Atomizer M1 Mirror Trajectory-Based Optimization - SAT3",
"study_name": "SAT3_Trajectory",
"study_tag": "TPE-100-TrajectoryMethod",
"description": "Trajectory-based optimization using Zernike Trajectory Method. Optimizes integrated RMS across full 20-60 deg operating range with mode-specific tracking.",
"business_context": {
"purpose": "Explore new trajectory optimization method for mode-specific aberration control",
"benefit": "Physics-based optimization with integrated metrics and sensitivity analysis",
"goal": "Minimize total_filtered_rms_nm across operating range while tracking mode-specific contributions"
},
"optimization": {
"algorithm": "TPE",
"n_trials": 100,
"n_startup_trials": 15,
"notes": "TPE recommended for fresh trajectory-based optimization - good for single-objective with logged secondaries"
},
"extraction_method": {
"type": "zernike_trajectory",
"class": "ZernikeTrajectoryExtractor",
"method": "extract_trajectory",
"reference_angle": 20.0,
"focal_length": 22000.0,
"inner_radius": 135.75,
"description": "Trajectory analysis across 5 elevation angles (20, 30, 40, 50, 60 deg) with OPD correction and annular aperture"
},
"design_variables": [
{
"name": "lateral_inner_angle",
"expression_name": "lateral_inner_angle",
"min": 25.0,
"max": 30.0,
"baseline": 26.79,
"units": "degrees",
"enabled": true,
"notes": "Inner lateral support angle"
},
{
"name": "lateral_outer_angle",
"expression_name": "lateral_outer_angle",
"min": 11.0,
"max": 17.0,
"baseline": 14.64,
"units": "degrees",
"enabled": true,
"notes": "Outer lateral support angle"
},
{
"name": "lateral_outer_pivot",
"expression_name": "lateral_outer_pivot",
"min": 9.0,
"max": 12.0,
"baseline": 10.40,
"units": "mm",
"enabled": true,
"notes": "Outer lateral pivot position"
},
{
"name": "lateral_inner_pivot",
"expression_name": "lateral_inner_pivot",
"min": 5.0,
"max": 12.0,
"baseline": 10.07,
"units": "mm",
"enabled": true,
"notes": "Inner lateral pivot position"
},
{
"name": "lateral_middle_pivot",
"expression_name": "lateral_middle_pivot",
"min": 15.0,
"max": 27.0,
"baseline": 20.73,
"units": "mm",
"enabled": true,
"notes": "Middle lateral pivot position"
},
{
"name": "lateral_closeness",
"expression_name": "lateral_closeness",
"min": 9.5,
"max": 12.5,
"baseline": 11.02,
"units": "mm",
"enabled": true,
"notes": "Lateral support closeness parameter"
},
{
"name": "whiffle_min",
"expression_name": "whiffle_min",
"min": 30.0,
"max": 72.0,
"baseline": 40.55,
"units": "mm",
"enabled": true,
"notes": "Whiffle tree minimum radius"
},
{
"name": "whiffle_outer_to_vertical",
"expression_name": "whiffle_outer_to_vertical",
"min": 60.0,
"max": 80.0,
"baseline": 75.67,
"units": "degrees",
"enabled": true,
"notes": "Whiffle tree outer angle to vertical"
},
{
"name": "whiffle_triangle_closeness",
"expression_name": "whiffle_triangle_closeness",
"min": 50.0,
"max": 80.0,
"baseline": 60.00,
"units": "mm",
"enabled": true,
"notes": "Whiffle tree triangle closeness"
},
{
"name": "blank_backface_angle",
"expression_name": "blank_backface_angle",
"min": 4.1,
"max": 4.5,
"baseline": 4.15,
"units": "degrees",
"enabled": true,
"notes": "Blank backface angle"
},
{
"name": "inner_circular_rib_dia",
"expression_name": "inner_circular_rib_dia",
"min": 480.0,
"max": 620.0,
"baseline": 534.00,
"units": "mm",
"enabled": true,
"notes": "Inner circular rib diameter"
}
],
"fixed_parameters": [],
"constraints": [
{
"name": "trajectory_fit_quality",
"type": "soft",
"expression": "linear_fit_r2 >= 0.95",
"description": "Linear trajectory model should fit well (R² ≥ 0.95)",
"penalty_weight": 100.0
},
{
"name": "blank_mass_max",
"type": "hard",
"expression": "mass_kg <= 120.0",
"description": "Maximum blank mass constraint",
"penalty_weight": 1000.0
}
],
"objectives": [
{
"name": "total_filtered_rms_nm",
"description": "Total integrated RMS across full operating range (20-60 deg)",
"direction": "minimize",
"weight": 1.0,
"target": 4.0,
"units": "nm",
"notes": "PRIMARY OBJECTIVE - optimized by TPE"
},
{
"name": "coma_rms_nm",
"description": "Integrated coma RMS (modes Z7,Z8)",
"direction": "minimize",
"weight": 0.0,
"target": 5.0,
"units": "nm",
"notes": "LOGGED ONLY - tracks coma contribution"
},
{
"name": "astigmatism_rms_nm",
"description": "Integrated astigmatism RMS (modes Z5,Z6)",
"direction": "minimize",
"weight": 0.0,
"target": 5.0,
"units": "nm",
"notes": "LOGGED ONLY - tracks astigmatism contribution"
},
{
"name": "trefoil_rms_nm",
"description": "Integrated trefoil RMS (modes Z9,Z10)",
"direction": "minimize",
"weight": 0.0,
"target": 5.0,
"units": "nm",
"notes": "LOGGED ONLY - tracks trefoil contribution"
},
{
"name": "spherical_rms_nm",
"description": "Integrated spherical RMS (mode Z11)",
"direction": "minimize",
"weight": 0.0,
"target": 8.0,
"units": "nm",
"notes": "LOGGED ONLY - tracks spherical aberration"
},
{
"name": "linear_fit_r2",
"description": "Trajectory model fit quality (should be ~1.0)",
"direction": "maximize",
"weight": 0.0,
"target": 0.95,
"units": "unitless",
"notes": "LOGGED ONLY - validates physics model"
}
],
"weighted_sum_formula": "total_filtered_rms_nm (primary) + 0*coma_rms_nm + 0*astigmatism_rms_nm + 0*trefoil_rms_nm + 0*spherical_rms_nm",
"zernike_settings": {
"n_modes": 50,
"filter_low_orders": 4,
"displacement_unit": "mm",
"subcases": ["1", "2", "5", "3", "6", "4"],
"subcase_labels": {
"1": "90deg",
"2": "20deg",
"3": "40deg",
"4": "60deg",
"5": "30deg",
"6": "50deg"
},
"reference_subcase": "2",
"method": "trajectory",
"reference_angle": 20.0,
"focal_length": 22000.0,
"inner_radius": 135.75,
"exclude_angles": [90.0]
},
"nx_settings": {
"nx_install_path": "C:\\Program Files\\Siemens\\DesigncenterNX2512",
"sim_file": "ASSY_M1_assyfem1_sim1.sim",
"solution_name": "Solution 1",
"op2_pattern": "*-solution_1.op2",
"simulation_timeout_s": 600,
"journal_timeout_s": 120,
"op2_timeout_s": 1800,
"auto_start_nx": true
},
"dashboard_settings": {
"trial_source_tag": true,
"fea_marker": "circle",
"fea_color": "#4CAF50"
}
}