7171
7272IS_3D = False
7373
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
7580
7681LX = 0.5 * WVL if IS_3D else 0.0
7782PML_X = True if IS_3D else False
7883
79-
8084# shape of the custom medium
8185DA_SHAPE_X = 1 if IS_3D else 1
8286DA_SHAPE = (DA_SHAPE_X , 1_000 , 1_000 ) if TEST_CUSTOM_MEDIUM_SPEED else (DA_SHAPE_X , 12 , 12 )
114118 td .Structure (
115119 geometry = td .Box (
116120 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 ),
119125 medium = td .Medium (permittivity = 2.0 ),
120126 )
121127 ],
@@ -433,12 +439,13 @@ def make_structures(params: anp.ndarray) -> dict[str, td.Structure]:
433439def make_monitors () -> dict [str , tuple [td .Monitor , typing .Callable [[td .SimulationData ], float ]]]:
434440 """Make a dictionary of all the possible monitors in the simulation."""
435441
436- X = 0.75
437-
438442 mode_mnt = td .ModeMonitor (
439443 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+ ),
442449 freqs = [FREQ0 ],
443450 name = "mode" ,
444451 )
@@ -459,7 +466,7 @@ def diff_postprocess_fn(sim_data, mnt_data):
459466
460467 field_vol = td .FieldMonitor (
461468 size = (1 , 1 , 0 ),
462- center = (0 , 0 , + LZ / 2 - X * WVL ),
469+ center = (0 , 0 , + LZ / 2 - MODE_FIELD_SPC ),
463470 freqs = [FREQ0 ],
464471 name = "field_vol" ,
465472 )
0 commit comments