示例#1
0
    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])
示例#2
0
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]))
示例#3
0
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")
示例#4
0
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")
示例#5
0
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