198 lines
7.4 KiB
JSON
198 lines
7.4 KiB
JSON
{
|
||
"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"}
|
||
]
|
||
}
|
||
}
|