def get_shapely_object(self): splitter1 = MMI(origin=self.origin, angle=self.angle, wg_width=self.width, length=self.splitter_length, width=self.splitter_width, num_inputs=1, num_outputs=2) print(splitter1.output_ports) upper_wg = Waveguide.make_at_port(splitter1.left_branch_port) upper_wg.add_bend(np.deg2rad(90), self.bend_radius) upper_wg.add_straight_segment(self.upper_vertical_length) upper_wg.add_bend(np.deg2rad(-90), self.bend_radius) upper_wg.add_straight_segment(self.horizontal_length) upper_wg.add_bend(np.deg2rad(-90), self.bend_radius) upper_wg.add_straight_segment(self.upper_vertical_length) upper_wg.add_bend(np.deg2rad(90), self.bend_radius) lower_wg = Waveguide.make_at_port(splitter1.right_branch_port) lower_wg.add_bend(np.deg2rad(-90), self.bend_radius) lower_wg.add_straight_segment(self.lower_vertical_length) lower_wg.add_bend(np.deg2rad(90), self.bend_radius) lower_wg.add_straight_segment(self.horizontal_length) lower_wg.add_bend(np.deg2rad(90), self.bend_radius) lower_wg.add_straight_segment(self.lower_vertical_length) lower_wg.add_bend(np.deg2rad(-90), self.bend_radius) splitter2 = MMI(origin=[self.origin[0] + self.dev_width, self.origin[1]], angle=self.angle + np.pi, wg_width=self.width, length=self.splitter_length, width=self.splitter_width, num_inputs=1, num_outputs=2) print(splitter2.input_ports) return geometric_union([splitter1, splitter2, upper_wg, lower_wg])
def example_mmi(): from gdshelpers.parts.splitter import MMI from gdshelpers.parts.waveguide import Waveguide # mp.quiet(True) mmi = MMI((0, 0), 0, 1.3, length=42, width=7.7, num_inputs=2, num_outputs=2) # , taper_width=3) # mmi = Splitter((0, 0), 0, wg_width_root=1.15, sep=5, total_length=40) mmi.input_ports = [mmi.input_ports[0]] mmi.output_ports = [mmi.left_branch_port, mmi.right_branch_port] wgs = [Waveguide.make_at_port(port).add_straight_segment(4) for port in [mmi.input_ports[0]] + mmi.output_ports] sim = Simulation(resolution=15, reduce_to_2d=True) sim.add_structure([mmi], wgs, mp.Medium(index=1.666), z_min=0, z_max=.33) source = sim.add_eigenmode_source(mp.GaussianSource(wavelength=1.55, width=2), mmi.input_ports[0].longitudinal_offset(1), z=0.33 / 2, height=1, eig_band=2) sim.init_sim() # plt.imshow(sim.sim.get_epsilon().T) # plt.show() # sim.sim.plot3D() monitors_out = [ sim.add_eigenmode_monitor(mmi.output_ports[i].longitudinal_offset(1), 1.55, 2, 1, z=0.33 / 2, height=1) for i in range(2)] sim.plot(mp.Hz) sim.run(until=150) # plt.imshow(sim.sim.get_epsilon().T) # plt.imshow(sim.sim.get_tot_pwr().T, alpha=.5) # plt.show() sim.plot(mp.Hz) phase_difference = np.angle(sim.get_eigenmode_coefficients(monitors_out[0], [2]).alpha[0, 0, 0] / sim.get_eigenmode_coefficients(monitors_out[1], [2]).alpha[0, 0, 0]) / np.pi transmissions = [ np.abs(sim.get_eigenmode_coefficients(monitors_out[i], [2]).alpha[0, 0, 0]) ** 2 / source.eig_power(1 / 1.55) for i in range(2)] print('phase difference between outputs: {:.3f}π'.format(phase_difference)) print('transmission to monitor 1: {:.3f}'.format(transmissions[0])) print('transmission to monitor 2: {:.3f}'.format(transmissions[1]))
def _example_i(): from gdshelpers.parts.splitter import MMI mmi1 = MMI((0, 0), 0, 1, 42, 7.7, 2, 2) mmi2 = MMI((0, 10), 0, 1, 42, 7.7, 2, 2) mmi3 = MMI((0, -10), 0, 1, 42, 7.7, 2, 2) shapely_objects = [] s3d1 = Shapely3d(mmi1.get_shapely_object(), 0.0, 0.7, (0, 0, 0)) s3d2 = Shapely3d(mmi2.get_shapely_object(), 0.0, 0.7, (0, 255, 0)) s3d3 = Shapely3d(mmi3.get_shapely_object(), 0.0, 0.7, (255, 0, 0)) shapely_objects.append(s3d1) shapely_objects.append(s3d2) shapely_objects.append(s3d3) render_image_and_save_as_blend(shapely_objects, "mmi1")
def _example_ii(): from gdshelpers.parts.splitter import MMI from gdshelpers.geometry import geometric_union mmi1 = MMI((0, 0), 0, 1, 42, 7.7, 2, 2) mmi2 = MMI((0, 10), 0, 1, 42, 7.7, 2, 2) mmi3 = MMI((0, -10), 0, 1, 42, 7.7, 2, 2) mmi4 = MMI((0, -20), 0, 1, 42, 7.7, 2, 2) mmi5 = MMI((0, -30), 0, 1, 42, 7.7, 2, 2) shapely_objects = [] s3d1 = Shapely3d( geometric_union([ mmi1.get_shapely_object(), mmi2.get_shapely_object(), mmi3.get_shapely_object() ]), 0.0, 0.7, (255, 0, 0)) s3d2 = Shapely3d( geometric_union([mmi4.get_shapely_object(), mmi5.get_shapely_object()]), 0.0, 0.7, (0, 255, 0)) shapely_objects.append(s3d1) shapely_objects.append(s3d2) render_image_and_save_as_blend(shapely_objects, "mmi2")
def IL_mmi(origin=(0, 0), len_in=500, radius=10, num_roundtrip=3, len_deltaL=250, w_etch=3): """ total delta L = 4*len_delta_L * num_rountrip """ # coupler_params = { # 'width': 0.45, # 'full_opening_angle': np.deg2rad(40), # 'grating_period': 0.64, # 'grating_ff': 0.546875, # 'n_gratings': 20, # 'taper_length': 16, # } mmi_params = { 'length': 31.37, 'width': 6, 'taper_width': 2.9, 'taper_length': 20, } # gc_start # gc_start = GratingCoupler.make_traditional_coupler(origin, angle=-np.pi, **coupler_params) # staright wg wg_start = Waveguide(origin, angle=0, width=0.5) wg_start.add_straight_segment(10) # mmi_in mmi_in = MMI.make_at_port(wg_start.port, num_inputs=1, num_outputs=2, **mmi_params) # mmi_in. # len_in is the length of the input straight wg # len_out is the length of the out straight wg # # len_in = 500 len_out = len_in # len_deltaL = 400 # radius = 10 gap = 10 # num_roundtrip = 3 # port 1 wg1 = Waveguide.make_at_port(mmi_in.left_branch_port) wg1.add_straight_segment(len_in) i = 0 while i < num_roundtrip: wg1.add_bend(np.pi, radius) wg1.add_straight_segment(len_deltaL) wg1.add_bend(-np.pi, radius) wg1.add_straight_segment(len_deltaL) i += 1 wg1.add_straight_segment(6 * radius + 3 * gap) i = 0 while i < num_roundtrip: wg1.add_straight_segment(len_deltaL) wg1.add_bend(-np.pi, radius) wg1.add_straight_segment(len_deltaL) wg1.add_bend(np.pi, radius) i += 1 wg1.add_straight_segment(len_out) # port 2 wg2 = Waveguide.make_at_port(mmi_in.right_branch_port) wg2.add_straight_segment(len_in + 2 * radius + gap) i = 0 while i < num_roundtrip: wg2.add_bend(np.pi, radius) wg2.add_bend(-np.pi, radius) i += 1 wg2.add_straight_segment(2 * radius + gap) i = 0 while i < num_roundtrip: wg2.add_bend(-np.pi, radius) wg2.add_bend(np.pi, radius) i += 1 wg2.add_straight_segment(len_out + 2 * radius + gap) # mmi_out mmi_out = MMI.make_at_port(wg1.port, num_inputs=2, num_outputs=1, **mmi_params) # straight wg wg_end = Waveguide.make_at_port(mmi_out.right_branch_port) wg_end.add_straight_segment(10) # convert to positive resist layout = positive_resist.convert_to_positive_resist( [mmi_in, mmi_out, wg1, wg2, wg_end, wg_start], w_etch, outer_resolution=1e-3) gap = 10 outer_corners = [ origin, (origin[0], origin[1] + 2 * gap), (origin[0] - 2 * gap, origin[1] + 2 * gap), (origin[0] - 2 * gap, origin[1] - 2 * gap), (origin[0], origin[1] - 2 * gap) ] polygon1 = Polygon(outer_corners) origin = wg_end._current_port.origin print("End Point: ", origin) origin[0] = origin[0] + 2 * gap outer_corners = [ origin, (origin[0], origin[1] + 2 * gap), (origin[0] - 2 * gap, origin[1] + 2 * gap), (origin[0] - 2 * gap, origin[1] - 2 * gap), (origin[0], origin[1] - 2 * gap) ] polygon2 = Polygon(outer_corners) polygon = polygon1.union(polygon2) layout_fixed = layout.difference(polygon) return layout_fixed