def test_region_layers(self): cell = Cell("test_device") wg1 = Waveguide([0, 0], 0, 1) wg1.add_straight_segment(10) wg1_shapely = wg1.get_shapely_object() cell.add_to_layer(1, wg1) wg2 = Waveguide([40, 0], 0, 1) wg2.add_straight_segment(10) wg2_shapely = wg2.get_shapely_object() cell.add_to_layer(2, wg2) cell.add_region_layer(100) cell.add_region_layer(101, [1]) cell.add_region_layer(102, [1, 2]) self.assertTrue(100 in cell.layer_dict) self.assertTrue(cell.layer_dict[100][0].contains(wg1_shapely)) self.assertTrue(cell.layer_dict[100][0].contains(wg2_shapely)) self.assertTrue(101 in cell.layer_dict) self.assertTrue(cell.layer_dict[101][0].contains(wg1_shapely)) self.assertFalse(cell.layer_dict[101][0].contains(wg2_shapely)) self.assertTrue(102 in cell.layer_dict) self.assertTrue(cell.layer_dict[102][0].contains(wg1_shapely)) self.assertTrue(cell.layer_dict[102][0].contains(wg2_shapely))
def test_waveguide_multiple_widths(self): widths = [1, 2, 1] wg = Waveguide([0, 0], 0, widths) wg.add_straight_segment(100) wg.add_parameterized_path(lambda t: [10 * t, t]) wg.get_shapely_object()
def test_export_import(self): waveguide = Waveguide([0, 0], 0, 1) for i_bend in range(9): waveguide.add_bend(angle=np.pi, radius=60 + i_bend * 40) offset = (10, 10) angle = np.pi cell = Cell('test') cell.add_to_layer(1, waveguide) sub_cell = Cell('sub_cell') sub_cell.add_to_layer(2, waveguide) cell.add_cell(sub_cell, origin=(0, 0), angle=0) sub_cell2 = Cell('sub_cell2') sub_cell2.add_to_layer(3, waveguide) cell.add_cell(sub_cell2, origin=offset, angle=angle) cell.save(grid_steps_per_micron=10000) def assert_almost_equal_shapely(a, b, tolerance=2e-4): self.assertTrue(a.buffer(tolerance).contains(b)) self.assertTrue(b.buffer(tolerance).contains(a)) assert_almost_equal_shapely( waveguide.get_shapely_object(), GDSIIImport('test.gds', 'test', 1).get_shapely_object()) assert_almost_equal_shapely( waveguide.get_shapely_object(), GDSIIImport('test.gds', 'test', 2).get_shapely_object()) assert_almost_equal_shapely( translate(rotate(waveguide.get_shapely_object(), angle, use_radians=True, origin=(0, 0)), *offset), GDSIIImport('test.gds', 'test', 3).get_shapely_object()) self.assertTrue(GDSIIImport('test.gds', 'test', 1, 2).get_shapely_object().is_empty)
def test_positive_resist(self): distance = 1e-3 waveguide = Waveguide([0, 0], 0, 1) for i_bend in range(9): waveguide.add_bend(angle=np.pi, radius=60 + i_bend * 40) waveguide_positive = convert_to_positive_resist(waveguide, 1) self.assertFalse(waveguide.get_shapely_object().buffer( -distance).intersects(waveguide_positive)) self.assertTrue(waveguide.get_shapely_object().buffer( distance).intersects(waveguide_positive)) self.assertTrue( waveguide_positive.convex_hull.contains( waveguide.get_shapely_object()))
def example_cavity_harminv(): from gdshelpers.parts.waveguide import Waveguide from shapely.geometry import Point wg = Waveguide((-6, 0), 0, 1.2) start_port = wg.current_port wg.add_straight_segment(6) center_port = wg.current_port wg.add_straight_segment(6) wgs = [Waveguide.make_at_port(port).add_straight_segment(4) for port in [start_port.inverted_direction, wg.current_port]] holes = geometric_union( [Point(x * sign, 0).buffer(.36) for x in [1.4 / 2 + x * 1 for x in range(3)] for sign in [-1, 1]]) sim = Simulation(resolution=20, reduce_to_2d=True, padding=2, pml_thickness=1) sim.add_structure([wg.get_shapely_object().difference(holes)], wgs, mp.Medium(epsilon=13), z_min=0, z_max=.33) sim.add_source(mp.GaussianSource(wavelength=1 / .25, fwidth=.2), mp.Hz, center_port, z=0) sim.init_sim() sim.plot(fields=mp.Hz) mp.simulation.display_run_data = lambda *args, **kwargs: None harminv = mp.Harminv(mp.Hz, mp.Vector3(), .25, .2) sim.run(mp.after_sources(harminv._collect_harminv()(harminv.c, harminv.pt)), until_after_sources=300) sim.plot(fields=mp.Hz) print(harminv._analyze_harminv(sim.sim, 100))
def example_cavity(): from gdshelpers.parts.waveguide import Waveguide from shapely.geometry import Point wg = Waveguide((-6, 0), 0, 1.2) start_port = wg.current_port wg.add_straight_segment(12) wgs = [Waveguide.make_at_port(port).add_straight_segment(4) for port in [start_port.inverted_direction, wg.current_port]] holes = geometric_union( [Point(x * sign, 0).buffer(.36) for x in [1.4 / 2 + x * 1 for x in range(3)] for sign in [-1, 1]]) sim = Simulation(resolution=20, reduce_to_2d=True, padding=2) sim.add_structure([wg.get_shapely_object().difference(holes)], wgs, mp.Medium(epsilon=13), z_min=0, z_max=.33) sim.add_eigenmode_source(mp.GaussianSource(wavelength=1 / .25, fwidth=.35), start_port, z=0.33 / 2, height=1, eig_band=2) sim.init_sim() monitors_out = [sim.add_eigenmode_monitor(port.longitudinal_offset(1), 1 / .25, .2, 500, z=0.33 / 2, height=1) for port in [start_port, wg.current_port.inverted_direction]] sim.plot(mp.Hz) sim.run(until=1500) sim.plot(mp.Hz) frequencies = np.array(mp.get_eigenmode_freqs(monitors_out[0])) transmissions = [np.abs(sim.get_eigenmode_coefficients(monitors_out[i], [2]).alpha[0, :, 0]) ** 2 for i in range(2)] plt.plot(frequencies, transmissions[1] / transmissions[0]) plt.show()
def test_export_import(self): waveguide = Waveguide([0, 0], 0, 1) for i_bend in range(9): waveguide.add_bend(angle=np.pi, radius=60 + i_bend * 40) offset = (10, 10) angle = np.pi cell = Cell('test') cell.add_to_layer(1, waveguide) sub_cell = Cell('sub_cell') sub_cell.add_to_layer(2, waveguide) cell.add_cell(sub_cell, origin=(0, 0), angle=0) sub_cell2 = Cell('sub_cell2') sub_cell2.add_to_layer(3, waveguide) cell.add_cell(sub_cell2, origin=offset, angle=angle) cell.save(library='gdshelpers', grid_steps_per_micron=10000) self.assertTrue(waveguide.get_shapely_object().almost_equals( GDSIIImport('test.gds', 'test', 1).get_shapely_object(), decimal=3)) self.assertTrue(waveguide.get_shapely_object().almost_equals( GDSIIImport('test.gds', 'test', 2).get_shapely_object(), decimal=3)) self.assertTrue( translate( rotate(waveguide.get_shapely_object(), angle, use_radians=True, origin=(0, 0)), *offset).almost_equals(GDSIIImport('test.gds', 'test', 3).get_shapely_object(), decimal=3)) self.assertTrue( GDSIIImport('test.gds', 'test', 1, 2).get_shapely_object().is_empty)