71
71
72
72
IS_3D = False
73
73
74
- # TODO: test 2D and 3D parameterized
74
+ # angle of the measurement waveguide
75
+ ROT_ANGLE_WG = 0 * np .pi / 4
76
+
77
+ # position of output mode monitor
78
+ MODE_FIELD_SPC = 0.75
79
+ MODE_FLD_MNT_SPC = MODE_FIELD_SPC * WVL
75
80
76
81
LX = 0.5 * WVL if IS_3D else 0.0
77
82
PML_X = True if IS_3D else False
78
83
79
-
80
84
# shape of the custom medium
81
85
DA_SHAPE_X = 1 if IS_3D else 1
82
86
DA_SHAPE = (DA_SHAPE_X , 1_000 , 1_000 ) if TEST_CUSTOM_MEDIUM_SPEED else (DA_SHAPE_X , 12 , 12 )
114
118
td .Structure (
115
119
geometry = td .Box (
116
120
size = (0.5 , 0.5 , LZ / 2 ),
117
- center = (0 , 0 , LZ / 2 ),
118
- ),
121
+ center = (0 , 0 , 0 ),
122
+ )
123
+ .rotated (ROT_ANGLE_WG , axis = 0 )
124
+ .translated (x = 0 , y = - np .tan (ROT_ANGLE_WG ) * MODE_FIELD_SPC , z = LZ / 2 ),
119
125
medium = td .Medium (permittivity = 2.0 ),
120
126
)
121
127
],
@@ -433,12 +439,13 @@ def make_structures(params: anp.ndarray) -> dict[str, td.Structure]:
433
439
def make_monitors () -> dict [str , tuple [td .Monitor , typing .Callable [[td .SimulationData ], float ]]]:
434
440
"""Make a dictionary of all the possible monitors in the simulation."""
435
441
436
- X = 0.75
437
-
438
442
mode_mnt = td .ModeMonitor (
439
443
size = (2 , 2 , 0 ),
440
- center = (0 , 0 , + LZ / 2 - X * WVL ),
441
- mode_spec = td .ModeSpec (),
444
+ center = (0 , 0 , + LZ / 2 - MODE_FIELD_SPC ),
445
+ mode_spec = td .ModeSpec (
446
+ angle_theta = ROT_ANGLE_WG ,
447
+ angle_phi = 3 * np .pi / 2 ,
448
+ ),
442
449
freqs = [FREQ0 ],
443
450
name = "mode" ,
444
451
)
@@ -459,7 +466,7 @@ def diff_postprocess_fn(sim_data, mnt_data):
459
466
460
467
field_vol = td .FieldMonitor (
461
468
size = (1 , 1 , 0 ),
462
- center = (0 , 0 , + LZ / 2 - X * WVL ),
469
+ center = (0 , 0 , + LZ / 2 - MODE_FIELD_SPC ),
463
470
freqs = [FREQ0 ],
464
471
name = "field_vol" ,
465
472
)
0 commit comments