{ "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\\DesigncenterNX2512", "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"} ] } }