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:
BIN
studies/M1_Mirror/SAT3_Trajectory/1_setup/model/ASSY_M1.prt
Normal file
BIN
studies/M1_Mirror/SAT3_Trajectory/1_setup/model/ASSY_M1.prt
Normal file
Binary file not shown.
Binary file not shown.
Binary file not shown.
BIN
studies/M1_Mirror/SAT3_Trajectory/1_setup/model/M1_Blank.prt
Normal file
BIN
studies/M1_Mirror/SAT3_Trajectory/1_setup/model/M1_Blank.prt
Normal file
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
@@ -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
|
||||
@@ -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"
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user