예제 #1
0
def test_render_pixelated_cont_shape():
    with goos.OptimizationPlan() as plan:

        def initializer(size):
            return [[1, 0], [0.5, 0.75], [0, 0.8], [1, 0.8]]

        var, design = goos.pixelated_cont_shape(
            initializer=initializer,
            pos=goos.Constant([200, 0, 0]),
            extents=[1000, 1000, 220],
            material=goos.material.Material(index=2),
            material2=goos.material.Material(index=4),
            pixel_size=[250, 500, 220])

        rect = goos.Cuboid(extents=goos.Constant([1000, 1000, 220]),
                           pos=goos.Constant([200, 0, 0]),
                           material=goos.material.Material(index=2))

        render = maxwell.RenderShape(
            design,
            region=goos.Box3d(center=[0, 0, 0], extents=[1500, 1500, 200]),
            mesh=maxwell.UniformMesh(dx=40),
            background=goos.material.Material(index=1.0),
            wavelength=1550)

        np.testing.assert_almost_equal(
            np.real(render.get().array[2][10:, 8, 3]), [
                1., 8.5, 16., 16., 16., 16., 16., 14.5, 10., 10., 10., 10.,
                10., 10., 4., 4., 4., 4., 4., 4., 13., 16., 16., 16., 16., 16.,
                8.5
            ])
예제 #2
0
def test_render_cylinder():
    with goos.OptimizationPlan() as plan:
        cyl = goos.Cylinder(pos=goos.Constant([0, 0, 0]),
                            radius=goos.Constant(60),
                            height=goos.Constant(60),
                            material=goos.material.Material(index=3.45))
        render = maxwell.RenderShape(
            cyl,
            region=goos.Box3d(center=[0, 0, 0], extents=[200, 200, 40]),
            mesh=maxwell.UniformMesh(dx=40),
            background=goos.material.Material(index=1.0),
            wavelength=1550)

        np.testing.assert_array_almost_equal(
            render.get().array,
            [[[[1.], [1.], [1.], [1.], [1.]],
              [[1.], [2.20393657], [8.15133225], [8.14708434], [2.20801505]],
              [[1.], [4.81696873], [9.176875], [9.176875], [4.81254501]],
              [[1.], [2.20393657], [8.15133225], [8.14708434], [2.20801505]],
              [[1.], [1.], [1.], [1.], [1.]]],
             [[[1.], [1.], [1.], [1.], [1.]],
              [[1.], [2.20452237], [4.81426614], [2.20733312], [1.]],
              [[1.], [8.1503488], [9.176875], [8.14865466], [1.]],
              [[1.], [8.1503488], [9.176875], [8.14865466], [1.]],
              [[1.], [2.20452237], [4.81426614], [2.20733312], [1.]]],
             [[[1.], [1.], [1.], [1.], [1.]],
              [[1.], [1.06734618], [5.08385966], [5.07819579], [1.07209387]],
              [[1.], [5.0825484], [11.9025], [11.9025], [5.08028954]],
              [[1.], [5.0825484], [11.9025], [11.9025], [5.08028954]],
              [[1.], [1.06734618], [5.08385966], [5.07819579], [1.07209387]]]])
예제 #3
0
def test_render_prism():
    with goos.OptimizationPlan() as plan:
        rect = goos.Cuboid(extents=goos.Constant([80, 80, 100]),
                           pos=goos.Constant([0, 0, 0]),
                           material=goos.material.Material(index=3.45))
        render = maxwell.RenderShape(
            rect,
            region=goos.Box3d(center=[0, 0, 0], extents=[160, 200, 40]),
            mesh=maxwell.UniformMesh(dx=40),
            background=goos.material.Material(index=1.0),
            wavelength=1550)

        np.testing.assert_array_almost_equal(
            render.get().array,
            [[[[1.], [1.], [1.], [1.], [1.]],
              [[1.], [1.], [11.9025], [11.9025], [1.]],
              [[1.], [1.], [11.9025], [11.9025], [1.]],
              [[1.], [1.], [1.], [1.], [1.]]],
             [[[1.], [1.], [1.], [1.], [1.]],
              [[1.], [3.725625], [6.45125], [3.725625], [1.]],
              [[1.], [6.45125], [11.9025], [6.45125], [1.]],
              [[1.], [3.725625], [6.45125], [3.725625], [1.]]],
             [[[1.], [1.], [1.], [1.], [1.]],
              [[1.], [1.], [6.45125], [6.45125], [1.]],
              [[1.], [1.], [11.9025], [11.9025], [1.]],
              [[1.], [1.], [6.45125], [6.45125], [1.]]]])
예제 #4
0
def main(save_folder: str,
         min_feature: float = 100,
         sim_3d: bool = False,
         visualize: bool = False) -> None:
    goos.util.setup_logging(save_folder)

    with goos.OptimizationPlan(save_path=save_folder) as plan:
        wg_in = goos.Cuboid(pos=goos.Constant([-2000, 0, 0]),
                            extents=goos.Constant([3000, 400, 220]),
                            material=goos.material.Material(index=3.45))
        wg_out = goos.Cuboid(pos=goos.Constant([0, 2000, 0]),
                             extents=goos.Constant([400, 3000, 220]),
                             material=goos.material.Material(index=3.45))

        def initializer(size):
            return np.random.random(size) * 0.2 + 0.5

        # Continuous optimization.
        var, design = goos.cubic_param_shape(
            initializer=initializer,
            pos=goos.Constant([0, 0, 0]),
            extents=[2000, 2000, 220],
            pixel_spacing=40,
            control_point_spacing=1.5 * min_feature,
            material=goos.material.Material(index=1),
            material2=goos.material.Material(index=3.45),
            var_name="var_cont")

        sigmoid_factor = goos.Variable(4, parameter=True, name="discr_factor")
        design = goos.cast(goos.Sigmoid(sigmoid_factor * (2 * design - 1)),
                           goos.Shape)
        eps = goos.GroupShape([wg_in, wg_out, design])

        # This node is purely for debugging purposes.
        eps_rendered = maxwell.RenderShape(
            design,
            region=goos.Box3d(center=[0, 0, 0], extents=[3000, 3000, 0]),
            mesh=maxwell.UniformMesh(dx=40),
            wavelength=1550,
        )
        if visualize:
            goos.util.visualize_eps(eps_rendered.get().array[2])

        obj, sim = make_objective_fdtd(eps, "cont", sim_3d=sim_3d)

        for factor in [4, 8]:
            sigmoid_factor.set(factor)
            goos.opt.scipy_minimize(
                obj,
                "L-BFGS-B",
                monitor_list=[sim["eps"], sim["field"], sim["overlap"], obj],
                max_iters=6,
                name="opt_cont{}".format(factor))

        plan.save()
        plan.run()

        if visualize:
            goos.util.visualize_eps(eps_rendered.get().array[2])
예제 #5
0
def test_gaussian_source_2d():
    grid = gridlock.Grid(simspace.create_edge_coords(
        goos.Box3d(center=[0, 0, 0], extents=[14000, 40, 3000]), 40),
                         ext_dir=gridlock.Direction.z,
                         initial=1,
                         num_grids=3)
    grid.render()
    eps = np.array(grid.grids)
    dxes = [grid.dxyz, grid.autoshifted_dxyz()]
    sim = maxwell.FdfdSimProp(eps=eps,
                              source=np.zeros_like(eps),
                              wlen=1550,
                              dxes=dxes,
                              pml_layers=[10, 10, 0, 0, 10, 10],
                              grid=grid,
                              solver=maxwell.DIRECT_SOLVER)
    src = maxwell.GaussianSourceImpl(
        maxwell.GaussianSource(w0=5200,
                               center=[0, 0, 0],
                               extents=[14000, 0, 0],
                               normal=[0, 0, -1],
                               power=1,
                               theta=0,
                               psi=0,
                               polarization_angle=np.pi / 2,
                               normalize_by_sim=True))

    src.before_sim(sim)

    fields = maxwell.DIRECT_SOLVER.solve(
        omega=2 * np.pi / sim.wlen,
        dxes=sim.dxes,
        epsilon=fdfd_tools.vec(sim.eps),
        mu=None,
        J=fdfd_tools.vec(sim.source),
        pml_layers=sim.pml_layers,
        bloch_vec=sim.bloch_vec,
    )
    fields = fdfd_tools.unvec(fields, grid.shape)
    field_y = fields[1].squeeze()

    np.testing.assert_allclose(field_y[:, 53],
                               np.zeros_like(field_y[:, 53]),
                               atol=1e-4)

    # Calculate what the amplitude of the Gaussian field should look like.
    # Amplitude determined empirically through simulation.
    coords = (np.arange(len(field_y[:, 20])) - len(field_y[:, 20]) / 2) * 40
    target_gaussian = np.exp(-coords**2 / 5200**2) * 0.00278
    np.testing.assert_allclose(np.abs(field_y[:, 20]),
                               target_gaussian,
                               atol=1e-4)
예제 #6
0
def make_objective_fdfd(eps: goos.Shape, stage: str, sim_3d: bool):
    dx = 20
    if sim_3d:
        sim_z_extent = 2500
        src_z_extent = 1000
        pml_thickness = [10 * dx] * 6
        timing_comp = 1
        solver = "maxwell_cg"
    else:
        sim_z_extent = 0
        src_z_extent = 20
        pml_thickness = [10 * dx] * 4 + [0] * 2
        timing_comp = 2
        solver = "local_direct"

    sim = maxwell.fdfd_simulation(
        name="sim_{}".format(stage),
        wavelength=1550,
        eps=eps,
        solver=solver,
        sources=[
            maxwell.WaveguideModeSource(center=[-1400, 0, 0],
                                        extents=[0, 2500, src_z_extent],
                                        normal=[1, 0, 0],
                                        mode_num=0,
                                        power=1),
        ],
        simulation_space=maxwell.SimulationSpace(
            mesh=maxwell.UniformMesh(dx=dx),
            sim_region=goos.Box3d(
                center=[0, 0, 0],
                extents=[4000, 4000, sim_z_extent],
            ),
            pml_thickness=pml_thickness),
        background=goos.material.Material(index=1.0),
        outputs=[
            maxwell.Epsilon(name="eps"),
            maxwell.ElectricField(name="field"),
            maxwell.WaveguideModeOverlap(name="overlap",
                                         center=[0, 1400, 0],
                                         extents=[2500, 0, src_z_extent],
                                         normal=[0, 1, 0],
                                         mode_num=0,
                                         power=1),
        ],
    )

    obj = goos.rename(-goos.abs(sim["overlap"]), name="obj_{}".format(stage))
    return obj, sim
예제 #7
0
def test_pixelated_multietch_grating_fit_edge_locs():
    # Grating defined in xz-plane.
    with goos.OptimizationPlan() as plan:
        height_index = goos.Variable([2, 0, 1, 2], parameter=True)

        edge_locs_target = goos.Variable([0, 1, 1.5, 2], parameter=True)
        grating_target = goos.grating.PixelatedGrating(
            edge_locs_target,
            height_index=height_index,
            height_fracs=[0, 0.5, 1],
            pos=[0, 0, 0],
            extents=[2, 10, 0.220],
            material=goos.material.Material(index=1),
            material2=goos.material.Material(index=3.5),
            grating_dir=0,
            grating_dir_spacing=0.5,
            etch_dir_divs=2,
            use_edge_locs=True)

        edge_locs = goos.Variable([0, 0.8, 1.6, 2])
        grating = goos.grating.PixelatedGrating(
            edge_locs,
            height_index=height_index,
            height_fracs=[0, 0.5, 1],
            pos=[0, 0, 0],
            extents=[2, 10, 0.220],
            material=goos.material.Material(index=1),
            material2=goos.material.Material(index=3.5),
            grating_dir=0,
            grating_dir_spacing=0.5,
            etch_dir_divs=2,
            use_edge_locs=True)

        from spins.goos_sim import maxwell
        region = goos.Box3d(center=[0, 0, 0], extents=[3, 11, 0.5])
        mesh = maxwell.UniformMesh(dx=0.1)
        eps_diff = goos.Norm(
            maxwell.RenderShape(
                grating, region=region, mesh=mesh, wavelength=1.55) -
            maxwell.RenderShape(
                grating_target, region=region, mesh=mesh, wavelength=1.55))

        goos.opt.scipy_minimize(eps_diff, "L-BFGS-B", max_iters=20)
        plan.run()

        np.testing.assert_almost_equal(grating.get().array,
                                       grating_target.get().array)
예제 #8
0
def test_pixelated_multietch_grating_xz_gradient(use_edge_locs, params, pol):
    # Brute force calculate the gradient.
    # Grating defined in xz-plane.
    with goos.OptimizationPlan() as plan:
        edge_locs = goos.Variable(params)
        height_index = goos.Variable([0, 1, 0, 1])
        grating = goos.grating.PixelatedGrating(
            edge_locs,
            height_index=height_index,
            height_fracs=[0.4, 1],
            pos=[0, 0, 0],
            extents=[2, 10, 0.220],
            material=goos.material.Material(index=1),
            material2=goos.material.Material(index=3.5),
            grating_dir=0,
            grating_dir_spacing=0.5,
            etch_dir_divs=4,
            etch_polarity=pol,
            use_edge_locs=use_edge_locs)

        from spins.goos_sim import maxwell
        shape = maxwell.RenderShape(grating,
                                    region=goos.Box3d(center=[0, 0, 0],
                                                      extents=[4, 10, 0.220]),
                                    mesh=maxwell.UniformMesh(dx=0.25),
                                    wavelength=1550)

        np.random.seed(247)
        obj = goos.dot(shape, np.random.random(shape.get().array.shape))

        val_orig = edge_locs.get().array
        step = 1e-5
        grad_num = np.zeros_like(val_orig)
        for i in range(len(val_orig)):
            delta = np.zeros_like(val_orig)
            delta[i] = 1

            edge_locs.set(val_orig + step * delta)
            f_plus = obj.get(run=True).array

            edge_locs.set(val_orig - step * delta)
            f_minus = obj.get(run=True).array

            grad_num[i] = (f_plus - f_minus) / (2 * step)

        grad_backprop = obj.get_grad([edge_locs])[0].array_grad
        np.testing.assert_allclose(grad_backprop, grad_num)
예제 #9
0
def test_render_pixelated_cont_shape_grad():
    with goos.OptimizationPlan() as plan:

        def initializer(size):
            return [[1, 0], [0.5, 0.75], [0, 0.8], [1, 0.8]]

        var, design = goos.pixelated_cont_shape(
            initializer=initializer,
            pos=[200, 0, 0],
            extents=[1000, 1000, 220],
            material=goos.material.Material(index=2),
            material2=goos.material.Material(index=4),
            pixel_size=[250, 500, 220])

        render = maxwell.RenderShape(
            design,
            region=goos.Box3d(center=[0, 0, 0], extents=[1500, 1500, 200]),
            mesh=maxwell.UniformMesh(dx=40),
            background=goos.material.Material(index=1.0),
            wavelength=1550)

        # Compute a random objective function to test gradient.
        np.random.seed(247)
        obj = goos.dot(np.random.random(render.get().array.shape), render)

        adjoint_grad = obj.get_grad([var])[0].array_grad

        # Calculate brute force gradient.
        var_val = var.get().array
        eps = 0.001
        num_grad = np.zeros_like(var_val)
        for i in range(var_val.shape[0]):
            for j in range(var_val.shape[1]):
                temp_val = var_val.copy()
                temp_val[i, j] += eps
                var.set(temp_val)
                fplus = obj.get(run=True).array

                temp_val = var_val.copy()
                temp_val[i, j] -= eps
                var.set(temp_val)
                fminus = obj.get(run=True).array

                num_grad[i, j] = (fplus - fminus) / (2 * eps)

        np.testing.assert_array_almost_equal(adjoint_grad, num_grad)
예제 #10
0
파일: bend90.py 프로젝트: zizai/spins-b
def make_objective(eps: goos.Shape, stage: str, sim_3d: bool):
    if sim_3d:
        sim_z_extent = 2500
        solver_info = maxwell.MaxwellSolver(solver="maxwell_cg",
                                            err_thresh=1e-2)
        pml_thickness = [400] * 6
    else:
        sim_z_extent = 40
        solver_info = maxwell.DirectSolver()
        pml_thickness = [400, 400, 400, 400, 0, 0]

    sim = maxwell.fdfd_simulation(
        name="sim_{}".format(stage),
        wavelength=1550,
        eps=eps,
        solver_info=solver_info,
        sources=[
            maxwell.WaveguideModeSource(center=[-1400, 0, 0],
                                        extents=[0, 2500, 1000],
                                        normal=[1, 0, 0],
                                        mode_num=0,
                                        power=1)
        ],
        simulation_space=maxwell.SimulationSpace(
            mesh=maxwell.UniformMesh(dx=40),
            sim_region=goos.Box3d(
                center=[0, 0, 0],
                extents=[4000, 4000, sim_z_extent],
            ),
            pml_thickness=pml_thickness),
        background=goos.material.Material(index=1.0),
        outputs=[
            maxwell.Epsilon(name="eps"),
            maxwell.ElectricField(name="field"),
            maxwell.WaveguideModeOverlap(name="overlap",
                                         center=[0, 1400, 0],
                                         extents=[2500, 0, 1000],
                                         normal=[0, 1, 0],
                                         mode_num=0,
                                         power=1),
        ],
    )

    obj = goos.rename(-goos.abs(sim["overlap"]), name="obj_{}".format(stage))
    return obj, sim
예제 #11
0
def make_objective(eps: goos.Shape, stage: str):
    sim_z_extent = 1800
    simcenter_positon_z = 300
    sources_wx = 8000
    sources_wy = 8000
    solver_info = maxwell.MaxwellSolver(solver="maxwell_cg", err_thresh=1e-2)
    pml_thickness = [400, 400, 400, 400, 400, 400]
    sources_position_z = 800
    wavelength = 635
    background = goos.material.Material(index=1.0)
    simulation_space = maxwell.SimulationSpace(
        mesh=maxwell.UniformMesh(dx=50),
        sim_region=goos.Box3d(
            center=[0, 0, simcenter_positon_z],
            extents=[10000, 10000, sim_z_extent],
        ),
        pml_thickness=pml_thickness)
    sources1 = [
        maxwell.LaguerreGaussianSource(w0=1400,
                                       center=[0, 0, sources_position_z],
                                       beam_center=[0, 0, sources_position_z],
                                       extents=[sources_wx, sources_wy, 0],
                                       normal=[0, 0, -1],
                                       theta=0,
                                       psi=0,
                                       m=2,
                                       p=0,
                                       polarization_angle=0,
                                       power=1),
    ]
    sources2 = [
        maxwell.LaguerreGaussianSource(w0=1400,
                                       center=[0, 0, sources_position_z],
                                       beam_center=[0, 0, sources_position_z],
                                       extents=[sources_wx, sources_wy, 0],
                                       normal=[0, 0, -1],
                                       theta=0,
                                       psi=0,
                                       m=3,
                                       p=0,
                                       polarization_angle=0,
                                       power=1),
    ]
    sources3 = [
        maxwell.LaguerreGaussianSource(w0=1400,
                                       center=[0, 0, sources_position_z],
                                       beam_center=[0, 0, sources_position_z],
                                       extents=[sources_wx, sources_wy, 0],
                                       normal=[0, 0, -1],
                                       theta=0,
                                       psi=0,
                                       m=-3,
                                       p=0,
                                       polarization_angle=0,
                                       power=1),
    ]
    sources4 = [
        maxwell.LaguerreGaussianSource(w0=1400,
                                       center=[0, 0, sources_position_z],
                                       beam_center=[0, 0, sources_position_z],
                                       extents=[sources_wx, sources_wy, 0],
                                       normal=[0, 0, -1],
                                       theta=0,
                                       psi=0,
                                       m=-2,
                                       p=0,
                                       polarization_angle=0,
                                       power=1),
    ]
    sources5 = [
        maxwell.LaguerreGaussianSource(w0=1400,
                                       center=[0, 0, sources_position_z],
                                       beam_center=[0, 0, sources_position_z],
                                       extents=[sources_wx, sources_wy, 0],
                                       normal=[0, 0, -1],
                                       theta=0,
                                       psi=0,
                                       m=1,
                                       p=0,
                                       polarization_angle=0,
                                       power=1),
    ]
    sources6 = [
        maxwell.LaguerreGaussianSource(w0=1400,
                                       center=[0, 0, sources_position_z],
                                       beam_center=[0, 0, sources_position_z],
                                       extents=[sources_wx, sources_wy, 0],
                                       normal=[0, 0, -1],
                                       theta=0,
                                       psi=0,
                                       m=-1,
                                       p=0,
                                       polarization_angle=0,
                                       power=1),
    ]
    sources7 = [
        maxwell.LaguerreGaussianSource(w0=1400,
                                       center=[0, 0, sources_position_z],
                                       beam_center=[0, 0, sources_position_z],
                                       extents=[sources_wx, sources_wy, 0],
                                       normal=[0, 0, -1],
                                       theta=0,
                                       psi=0,
                                       m=0,
                                       p=0,
                                       polarization_angle=0,
                                       power=1),
    ]
    outputs = [
        maxwell.Epsilon(name="eps"),
        maxwell.ElectricField(name="field"),
        maxwell.WaveguideModeOverlap(name="overlap1",
                                     center=[1600, -4500, 0],
                                     extents=[800, 0, 400],
                                     normal=[0, -1, 0],
                                     mode_num=0,
                                     power=1),
        maxwell.WaveguideModeOverlap(name="overlap2",
                                     center=[-1600, -4500, 0],
                                     extents=[800, 0, 400],
                                     normal=[0, -1, 0],
                                     mode_num=0,
                                     power=1),
        maxwell.WaveguideModeOverlap(name="overlap3",
                                     center=[1600, 4500, 0],
                                     extents=[800, 0, 400],
                                     normal=[0, 1, 0],
                                     mode_num=0,
                                     power=1),
        maxwell.WaveguideModeOverlap(name="overlap4",
                                     center=[-1600, 4500, 0],
                                     extents=[800, 0, 400],
                                     normal=[0, 1, 0],
                                     mode_num=0,
                                     power=1),
        maxwell.WaveguideModeOverlap(name="overlap5",
                                     center=[4500, -1600, 0],
                                     extents=[0, 800, 400],
                                     normal=[1, 0, 0],
                                     mode_num=0,
                                     power=1),
        maxwell.WaveguideModeOverlap(name="overlap6",
                                     center=[4500, 1600, 0],
                                     extents=[0, 800, 400],
                                     normal=[1, 0, 0],
                                     mode_num=0,
                                     power=1),
        maxwell.WaveguideModeOverlap(name="overlap7",
                                     center=[-4500, 0, 0],
                                     extents=[0, 800, 400],
                                     normal=[-1, 0, 0],
                                     mode_num=0,
                                     power=1),
    ]
    sim1 = maxwell.fdfd_simulation(
        name="sim1_{}".format(stage),
        wavelength=wavelength,
        eps=eps,
        solver_info=solver_info,
        sources=sources1,
        simulation_space=simulation_space,
        background=background,
        outputs=outputs,
    )
    sim2 = maxwell.fdfd_simulation(
        name="sim2_{}".format(stage),
        wavelength=wavelength,
        eps=eps,
        solver_info=solver_info,
        sources=sources2,
        simulation_space=simulation_space,
        background=background,
        outputs=outputs,
    )
    sim3 = maxwell.fdfd_simulation(
        name="sim3_{}".format(stage),
        wavelength=wavelength,
        eps=eps,
        solver_info=solver_info,
        sources=sources3,
        simulation_space=simulation_space,
        background=background,
        outputs=outputs,
    )
    sim4 = maxwell.fdfd_simulation(
        name="sim4_{}".format(stage),
        wavelength=wavelength,
        eps=eps,
        solver_info=solver_info,
        sources=sources4,
        simulation_space=simulation_space,
        background=background,
        outputs=outputs,
    )
    sim5 = maxwell.fdfd_simulation(
        name="sim5_{}".format(stage),
        wavelength=wavelength,
        eps=eps,
        solver_info=solver_info,
        sources=sources5,
        simulation_space=simulation_space,
        background=background,
        outputs=outputs,
    )
    sim6 = maxwell.fdfd_simulation(
        name="sim6_{}".format(stage),
        wavelength=wavelength,
        eps=eps,
        solver_info=solver_info,
        sources=sources6,
        simulation_space=simulation_space,
        background=background,
        outputs=outputs,
    )
    sim7 = maxwell.fdfd_simulation(
        name="sim7_{}".format(stage),
        wavelength=wavelength,
        eps=eps,
        solver_info=solver_info,
        sources=sources7,
        simulation_space=simulation_space,
        background=background,
        outputs=outputs,
    )

    obj1 = goos.rename(
        ((goos.abs(sim1["overlap1"]) - 12)**2 + goos.abs(sim1["overlap2"])**2 +
         goos.abs(sim1["overlap3"])**2 + goos.abs(sim1["overlap4"])**2 +
         goos.abs(sim1["overlap5"])**2 + goos.abs(sim1["overlap6"])**2 +
         goos.abs(sim1["overlap7"])**2),
        name="obj1_{}".format(stage))
    obj2 = goos.rename(
        (goos.abs(sim2["overlap1"])**2 +
         (goos.abs(sim2["overlap2"]) - 12)**2 + goos.abs(sim2["overlap3"])**2 +
         goos.abs(sim2["overlap4"])**2 + goos.abs(sim2["overlap5"])**2 +
         goos.abs(sim2["overlap6"])**2 + goos.abs(sim2["overlap7"])**2),
        name="obj2_{}".format(stage))
    obj3 = goos.rename(
        (goos.abs(sim3["overlap1"])**2 + goos.abs(sim3["overlap2"])**2 +
         (goos.abs(sim3["overlap3"]) - 12)**2 + goos.abs(sim3["overlap4"])**2 +
         goos.abs(sim3["overlap5"])**2 + goos.abs(sim3["overlap6"])**2 +
         goos.abs(sim3["overlap7"])**2),
        name="obj3_{}".format(stage))
    obj4 = goos.rename(
        (goos.abs(sim4["overlap1"])**2 + goos.abs(sim4["overlap2"])**2 +
         goos.abs(sim4["overlap3"])**2 +
         (goos.abs(sim4["overlap4"]) - 12)**2 + goos.abs(sim4["overlap5"])**2 +
         goos.abs(sim4["overlap6"])**2 + goos.abs(sim4["overlap7"])**2),
        name="obj4_{}".format(stage))
    obj5 = goos.rename(
        (goos.abs(sim5["overlap1"])**2 + goos.abs(sim5["overlap2"])**2 +
         goos.abs(sim5["overlap3"])**2 + goos.abs(sim5["overlap4"])**2 +
         (goos.abs(sim5["overlap5"]) - 12)**2 + goos.abs(sim5["overlap6"])**2 +
         goos.abs(sim5["overlap7"])**2),
        name="obj5_{}".format(stage))
    obj6 = goos.rename(
        (goos.abs(sim6["overlap1"])**2 + goos.abs(sim6["overlap2"])**2 +
         goos.abs(sim6["overlap3"])**2 + goos.abs(sim6["overlap4"])**2 +
         goos.abs(sim6["overlap5"])**2 +
         (goos.abs(sim6["overlap6"]) - 12)**2 + goos.abs(sim6["overlap7"])**2),
        name="obj5_{}".format(stage))
    obj7 = goos.rename(
        (goos.abs(sim7["overlap1"])**2 + goos.abs(sim7["overlap2"])**2 +
         goos.abs(sim7["overlap3"])**2 + goos.abs(sim7["overlap4"])**2 +
         goos.abs(sim7["overlap5"])**2 + goos.abs(sim7["overlap6"])**2 +
         (goos.abs(sim7["overlap7"]) - 12)**2),
        name="obj5_{}".format(stage))
    obj = obj1 + obj2 + obj3 + obj4 + 2 * obj5 + 2 * obj6 + 8 * obj7
    return obj, sim1, sim2, sim3, sim4, sim5, sim6, sim7
예제 #12
0
파일: grating_1d.py 프로젝트: zizai/spins-b
def make_objective(eps: goos.Shape, stage: str, params: Options):
    """Creates the objective.

    The function sets up the simulation and the objective function for the
    grating optimization. The simulation is a FDFD simulation with a
    Gaussian beam source that couples into a the waveguide.
    The optimization minimizes `(1 - coupling_eff)**2` where `coupling_eff` is
    the fiber-to-chip coupling efficiency.

    Args:
        eps: The permittivity distribution, including the waveguide and
            grating.
        stage: Name of the optimization stage. Used to name the nodes.
        params: Options for the optimization problem.

    Returns:
        A tuple `(obj, sim)` where `obj` is the objective and `sim` is the
        simulation.
    """
    solver = "local_direct"

    sim_left_x = -params.wg_len
    sim_right_x = params.coupler_len + params.buffer_len
    pml_thick = params.dx * 10
    sim_z_center = (params.wg_thickness / 2 + params.beam_dist -
                    params.box_size) / 2
    sim_z_extent = (params.wg_thickness + params.beam_dist + params.box_size +
                    2000 + pml_thick * 2)

    sim = maxwell.fdfd_simulation(
        name="sim_{}".format(stage),
        wavelength=params.wlen,
        eps=eps,
        solver=solver,
        sources=[
            maxwell.GaussianSource(
                w0=params.beam_width / 2,
                center=[
                    params.coupler_len / 2, 0,
                    params.wg_thickness / 2 + params.beam_dist
                ],
                extents=[params.beam_extents, 0, 0],
                normal=[0, 0, -1],
                power=1,
                theta=np.deg2rad(params.source_angle_deg),
                psi=np.pi / 2,
                polarization_angle=0,
                normalize_by_sim=True)
        ],
        simulation_space=maxwell.SimulationSpace(
            mesh=maxwell.UniformMesh(dx=params.dx),
            sim_region=goos.Box3d(
                center=[(sim_left_x + sim_right_x) / 2, 0, sim_z_center],
                extents=[sim_right_x - sim_left_x, 0, sim_z_extent],
            ),
            pml_thickness=[pml_thick, pml_thick, 0, 0, pml_thick, pml_thick]),
        background=goos.material.Material(index=params.eps_bg),
        outputs=[
            maxwell.Epsilon(name="eps"),
            maxwell.ElectricField(name="field"),
            maxwell.WaveguideModeOverlap(name="overlap",
                                         center=[-params.wg_len / 2, 0, 0],
                                         extents=[0, 1000, 2000],
                                         normal=[-1, 0, 0],
                                         mode_num=0,
                                         power=1),
        ],
    )

    obj = (1 - goos.abs(sim["overlap"]))**2
    obj = goos.rename(obj, name="obj_{}".format(stage))
    return obj, sim
예제 #13
0
def test_simulate_2d():
    with goos.OptimizationPlan() as plan:
        sim_region = goos.Box3d(center=[0, 0, 0], extents=[4000, 4000, 40])
        sim_mesh = maxwell.UniformMesh(dx=40)

        waveguide = goos.Cuboid(pos=goos.Constant([0, 0, 0]),
                                extents=goos.Constant([6000, 500, 40]),
                                material=goos.material.Material(index=3.45))

        eps = maxwell.RenderShape(waveguide,
                                  region=sim_region,
                                  mesh=sim_mesh,
                                  background=goos.material.Material(index=1.0),
                                  wavelength=1550)

        sim = maxwell.SimulateNode(
            wavelength=1550,
            simulation_space=maxwell.SimulationSpace(
                sim_region=sim_region,
                mesh=sim_mesh,
                pml_thickness=[400, 400, 400, 400, 0, 0],
            ),
            eps=eps,
            sources=[
                maxwell.WaveguideModeSource(
                    center=[-500, 0, 0],
                    extents=[0, 2500, 0],
                    normal=[1, 0, 0],
                    mode_num=0,
                    power=1,
                )
            ],
            solver_info=maxwell.DirectSolver(),
            outputs=[
                maxwell.Epsilon(name="eps"),
                maxwell.ElectricField(name="fields"),
                maxwell.WaveguideModeOverlap(name="overlap_forward",
                                             wavelength=1550,
                                             center=[1000, 0, 0],
                                             extents=[0, 2500, 0],
                                             normal=[1, 0, 0],
                                             mode_num=0,
                                             power=1),
                maxwell.WaveguideModeOverlap(name="overlap_backward",
                                             wavelength=1550,
                                             center=[-1000, 0, 0],
                                             extents=[0, 2500, 0],
                                             normal=[-1, 0, 0],
                                             mode_num=0,
                                             power=1),
                maxwell.WaveguideModeOverlap(name="overlap_forward2",
                                             wavelength=1550,
                                             center=[0, 0, 0],
                                             extents=[0, 2500, 0],
                                             normal=[1, 0, 0],
                                             mode_num=0,
                                             power=1),
            ])
        out = sim.get()

        # Power transmitted should be unity but numerical dispersion could
        # affect the actual transmitted power.
        assert np.abs(out[4].array)**2 >= 0.99
        assert np.abs(out[4].array)**2 <= 1.01

        # Check that waveguide power is roughly constant along waveguide.
        np.testing.assert_allclose(np.abs(out[2].array)**2,
                                   np.abs(out[4].array)**2,
                                   rtol=1e-2)

        # Check that we get minimal leakage of power flowing backwards.
        assert np.abs(out[3].array)**2 < 0.01
예제 #14
0
                        extents=goos.Constant([3000, 400, 220]),
                        material=goos.material.Material(index=1))
    # Define output waveguide.
    wg_out = goos.Cuboid(pos=goos.Constant([0, 2000, 0]),
                         extents=goos.Constant([400, 3000, 220]),
                         material=goos.material.Material(index=1))

    # Group these background structures together.
    eps_background_structures = goos.GroupShape([wg_in, wg_out])
    '''
Visualize the constant background structures we just defined.
'''
with plan:
    eps_rendered = maxwell.RenderShape(
        eps_background_structures,
        region=goos.Box3d(center=[0, 0, 0], extents=[3000, 3000, 0]),
        mesh=maxwell.UniformMesh(dx=40),
        wavelength=635,
    )

    goos.util.visualize_eps(eps_rendered.get().array[2])
'''
Define and initialize the design region.
'''
with plan:
    # Use random initialization, where each pixel is randomly assigned
    # a value in the range [0.3,0.7].
    def initializer(size):
        # Set the seed immediately before calling `random` to ensure
        # reproducibility.
        np.random.seed(247)
예제 #15
0
def test_simulate_wg_straight_2d_multicore():
    with goos.OptimizationPlan() as plan:
        eps = goos.Cuboid(pos=goos.Constant([0, 0, 0]),
                          extents=goos.Constant([6000, 500, 40]),
                          material=goos.material.Material(index=3.45))
        sim = meep.FdtdSimulation(
            eps=eps,
            sources=[
                meep.WaveguideModeSource(
                    center=[-500, 0, 0],
                    extents=[0, 2500, 0],
                    normal=[1, 0, 0],
                    mode_num=0,
                    power=1,
                    wavelength=1550,
                    bandwidth=100,
                ),
            ],
            sim_space=meep.SimulationSpace(
                dx=20,
                sim_region=goos.Box3d(
                    center=[0, 0, 0],
                    extents=[4000, 4000, 0],
                ),
                pml_thickness=[800, 800, 800, 800, 0, 0]),
            sim_timing=meep.SimulationTiming(stopping_conditions=[
                meep.StopWhenFieldsDecayed(
                    time_increment=50,
                    component=2,
                    pos=[0, 0, 0],
                    threshold=1e-6,
                )
            ]),
            background=goos.material.Material(index=1.0),
            outputs=[
                meep.Epsilon(wavelength=1550),
                meep.ElectricField(wavelength=1550),
                meep.WaveguideModeOverlap(wavelength=1550,
                                          center=[1000, 0, 0],
                                          extents=[0, 2500, 0],
                                          normal=[1, 0, 0],
                                          mode_num=0,
                                          power=1),
                meep.WaveguideModeOverlap(wavelength=1550,
                                          center=[-1000, 0, 0],
                                          extents=[0, 2500, 0],
                                          normal=[-1, 0, 0],
                                          mode_num=0,
                                          power=1),
                meep.WaveguideModeOverlap(wavelength=1550,
                                          center=[0, 0, 0],
                                          extents=[0, 2500, 0],
                                          normal=[1, 0, 0],
                                          mode_num=0,
                                          power=1),
                meep.WaveguideModeOverlap(wavelength=1500,
                                          center=[0, 0, 0],
                                          extents=[0, 2500, 0],
                                          normal=[1, 0, 0],
                                          mode_num=0,
                                          power=1,
                                          normalize=True),
                meep.WaveguideModeOverlap(wavelength=1500,
                                          center=[0, 0, 0],
                                          extents=[0, 2500, 0],
                                          normal=[1, 0, 0],
                                          mode_num=0,
                                          power=1,
                                          normalize=False),
            ],
            sim_cores=2,
        )

        out = sim.get()

        # Plot the fields.
        #import matplotlib.pyplot as plt
        #eps = out[0].array
        #plt.imshow(eps)

        #plt.figure()
        #field = out[1].array
        #plt.imshow(np.real(field[2]))

        #plt.show()

        # Power transmitted should be unity but numerical dispersion could
        # affect the actual transmitted power. Last time we checked, the power
        # ~0.96.
        # 1550 nm overlap.
        assert np.abs(out[4].array)**2 >= 0.96
        assert np.abs(out[4].array)**2 <= 1.04
        # 1525 nm overlap (with normalization)
        assert np.abs(out[5].array)**2 >= 0.96
        assert np.abs(out[5].array)**2 <= 1.04

        # The unnormalized power should be roughly ~30%.
        assert np.abs(out[6].array)**2 < 0.40
        assert np.abs(out[6].array)**2 > 0.20

        # Check that waveguide power is roughly constant along waveguide.
        np.testing.assert_allclose(np.abs(out[2].array)**2,
                                   np.abs(out[4].array)**2,
                                   rtol=1e-2)

        # Check that we get minimal leakage of power flowing backwards.
        assert np.abs(out[3].array)**2 / np.abs(out[2].array)**2 < 0.01
예제 #16
0
def test_simulate_wg_opt():
    with goos.OptimizationPlan() as plan:
        wg_in = goos.Cuboid(pos=goos.Constant([-2000, 0, 0]),
                            extents=goos.Constant([3000, 800, 40]),
                            material=goos.material.Material(index=3.45))
        wg_out = goos.Cuboid(pos=goos.Constant([2000, 0, 0]),
                             extents=goos.Constant([3000, 800, 40]),
                             material=goos.material.Material(index=3.45))

        def initializer(size):
            # Set the seed immediately before calling `random` to ensure
            # reproducibility.
            np.random.seed(247)
            return np.random.random(size) * 0.1 + np.ones(size) * 0.7

        var, design = goos.pixelated_cont_shape(
            initializer=initializer,
            pos=goos.Constant([0, 0, 0]),
            extents=[1000, 800, 40],
            pixel_size=[40, 40, 40],
            material=goos.material.Material(index=1),
            material2=goos.material.Material(index=3.45),
        )
        eps = goos.GroupShape([wg_in, wg_out, design])
        sim = meep.FdtdSimulation(
            eps=eps,
            sources=[
                meep.WaveguideModeSource(
                    center=[-1000, 0, 0],
                    extents=[0, 2500, 0],
                    normal=[1, 0, 0],
                    mode_num=2,
                    power=1,
                    wavelength=1550,
                    bandwidth=100,
                )
            ],
            sim_space=meep.SimulationSpace(
                dx=40,
                sim_region=goos.Box3d(
                    center=[0, 0, 0],
                    extents=[4000, 4000, 0],
                ),
                pml_thickness=[400, 400, 400, 400, 0, 0]),
            sim_timing=meep.SimulationTiming(stopping_conditions=[
                meep.StopWhenFieldsDecayed(
                    time_increment=50,
                    component=2,
                    pos=[0, 0, 0],
                    threshold=1e-6,
                )
            ], ),
            background=goos.material.Material(index=1.0),
            outputs=[
                meep.Epsilon(wavelength=1550),
                meep.ElectricField(wavelength=1550),
                meep.WaveguideModeOverlap(wavelength=1550,
                                          center=[1000, 0, 0],
                                          extents=[0, 2500, 0],
                                          normal=[1, 0, 0],
                                          mode_num=0,
                                          power=1),
            ])

        obj = -goos.abs(sim[2])

        import meep as mp
        mp.quiet()
        goos.opt.scipy_minimize(obj,
                                "L-BFGS-B",
                                monitor_list=[obj],
                                max_iters=5)
        plan.run()

        # Check that we can optimize. We choose something over 60% as
        # incorrect gradients will typically not reach this point.
        assert obj.get().array < -0.85

        # As a final check, compare simulation results against Maxwell.
        # Note that dx = 40 for Meep is actually too innaccurate. We therefore
        # resimulate the final structure for both Meep and Maxwell.
        from spins.goos_sim import maxwell
        sim_fdfd = maxwell.fdfd_simulation(
            wavelength=1550,
            eps=eps,
            sources=[
                maxwell.WaveguideModeSource(
                    center=[-1000, 0, 0],
                    extents=[0, 2500, 0],
                    normal=[1, 0, 0],
                    mode_num=2,
                    power=1,
                )
            ],
            simulation_space=maxwell.SimulationSpace(
                mesh=maxwell.UniformMesh(dx=20),
                sim_region=goos.Box3d(
                    center=[0, 0, 0],
                    extents=[4000, 4000, 0],
                ),
                pml_thickness=[400, 400, 400, 400, 0, 0]),
            background=goos.material.Material(index=1.0),
            outputs=[
                maxwell.Epsilon(),
                maxwell.ElectricField(),
                maxwell.WaveguideModeOverlap(center=[1000, 0, 0],
                                             extents=[0, 2500, 0],
                                             normal=[1, 0, 0],
                                             mode_num=0,
                                             power=1),
            ],
            solver="local_direct")

        sim_fdtd_hi = meep.FdtdSimulation(
            eps=eps,
            sources=[
                meep.WaveguideModeSource(
                    center=[-1000, 0, 0],
                    extents=[0, 2500, 0],
                    normal=[1, 0, 0],
                    mode_num=2,
                    power=1,
                    wavelength=1550,
                    bandwidth=100,
                )
            ],
            sim_space=meep.SimulationSpace(
                dx=20,
                sim_region=goos.Box3d(
                    center=[0, 0, 0],
                    extents=[4000, 4000, 0],
                ),
                pml_thickness=[400, 400, 400, 400, 0, 0]),
            sim_timing=meep.SimulationTiming(stopping_conditions=[
                meep.StopWhenFieldsDecayed(
                    time_increment=50,
                    component=2,
                    pos=[0, 0, 0],
                    threshold=1e-6,
                )
            ], ),
            background=goos.material.Material(index=1.0),
            outputs=[
                meep.Epsilon(wavelength=1550),
                meep.ElectricField(wavelength=1550),
                meep.WaveguideModeOverlap(wavelength=1550,
                                          center=[1000, 0, 0],
                                          extents=[0, 2500, 0],
                                          normal=[1, 0, 0],
                                          mode_num=0,
                                          power=1),
            ])
        fdtd_hi_power = goos.abs(sim_fdtd_hi[2])**2
        fdfd_power = goos.abs(sim_fdfd[2])**2

        # Check that power is correct within 0.5%.
        assert np.abs(fdfd_power.get().array - fdtd_hi_power.get().array) < 0.005
예제 #17
0
def test_simulate_wg_opt_grad():
    with goos.OptimizationPlan() as plan:
        wg_in = goos.Cuboid(pos=goos.Constant([-2000, 0, 0]),
                            extents=goos.Constant([3000, 800, 220]),
                            material=goos.material.Material(index=3.45))
        wg_out = goos.Cuboid(pos=goos.Constant([2000, 0, 0]),
                             extents=goos.Constant([3000, 800, 220]),
                             material=goos.material.Material(index=3.45))

        def initializer(size):
            # Set the seed immediately before calling `random` to ensure
            # reproducibility.
            np.random.seed(247)
            return np.random.random(size)

        var, design = goos.pixelated_cont_shape(
            initializer=initializer,
            pos=goos.Constant([0, 0, 0]),
            extents=[1000, 800, 220],
            pixel_size=[500, 400, 220],
            material=goos.material.Material(index=1),
            material2=goos.material.Material(index=3.45),
        )
        eps = goos.GroupShape([wg_in, wg_out, design])
        sim = maxwell.fdfd_simulation(
            eps=eps,
            wavelength=1550,
            solver="local_direct",
            sources=[
                maxwell.WaveguideModeSource(
                    center=[-1000, 0, 0],
                    extents=[0, 2500, 0],
                    normal=[1, 0, 0],
                    mode_num=2,
                    power=1,
                )
            ],
            simulation_space=maxwell.SimulationSpace(
                mesh=maxwell.UniformMesh(dx=40),
                sim_region=goos.Box3d(
                    center=[0, 0, 0],
                    extents=[4000, 4000, 40],
                ),
                pml_thickness=[400, 400, 400, 400, 0, 0]),
            background=goos.material.Material(index=1.0),
            outputs=[
                maxwell.Epsilon(),
                maxwell.ElectricField(),
                maxwell.WaveguideModeOverlap(wavelength=1550,
                                             center=[1000, 0, 0],
                                             extents=[0, 2500, 0],
                                             normal=[1, 0, 0],
                                             mode_num=0,
                                             power=1),
            ])

        obj = -goos.abs(sim[2])

        adjoint_grad = obj.get_grad([var])[0].array_grad

        # Calculate brute force gradient.
        var_val = var.get().array
        eps = 0.001
        num_grad = np.zeros_like(var_val)
        for i in range(var_val.shape[0]):
            for j in range(var_val.shape[1]):
                temp_val = var_val.copy()
                temp_val[i, j] += eps
                var.set(temp_val)
                fplus = obj.get(run=True).array

                temp_val = var_val.copy()
                temp_val[i, j] -= eps
                var.set(temp_val)
                fminus = obj.get(run=True).array

                num_grad[i, j] = (fplus - fminus) / (2 * eps)

        np.testing.assert_array_almost_equal(adjoint_grad, num_grad, decimal=3)
예제 #18
0
def test_simulate_wg_opt():
    with goos.OptimizationPlan() as plan:
        wg_in = goos.Cuboid(pos=goos.Constant([-2000, 0, 0]),
                            extents=goos.Constant([3000, 800, 220]),
                            material=goos.material.Material(index=3.45))
        wg_out = goos.Cuboid(pos=goos.Constant([2000, 0, 0]),
                             extents=goos.Constant([3000, 800, 220]),
                             material=goos.material.Material(index=3.45))

        def initializer(size):
            # Set the seed immediately before calling `random` to ensure
            # reproducibility.
            np.random.seed(247)
            return np.random.random(size) * 0.1 + np.ones(size) * 0.5

        var, design = goos.pixelated_cont_shape(
            initializer=initializer,
            pos=goos.Constant([0, 0, 0]),
            extents=[1000, 800, 220],
            pixel_size=[40, 40, 40],
            material=goos.material.Material(index=1),
            material2=goos.material.Material(index=3.45),
        )
        eps = goos.GroupShape([wg_in, wg_out, design])
        sim = maxwell.fdfd_simulation(
            eps=eps,
            wavelength=1550,
            solver="local_direct",
            sources=[
                maxwell.WaveguideModeSource(
                    center=[-1000, 0, 0],
                    extents=[0, 2500, 0],
                    normal=[1, 0, 0],
                    mode_num=2,
                    power=1,
                )
            ],
            simulation_space=maxwell.SimulationSpace(
                mesh=maxwell.UniformMesh(dx=40),
                sim_region=goos.Box3d(
                    center=[0, 0, 0],
                    extents=[4000, 4000, 40],
                ),
                pml_thickness=[400, 400, 400, 400, 0, 0]),
            background=goos.material.Material(index=1.0),
            outputs=[
                maxwell.Epsilon(),
                maxwell.ElectricField(),
                maxwell.WaveguideModeOverlap(wavelength=1550,
                                             center=[1000, 0, 0],
                                             extents=[0, 2500, 0],
                                             normal=[1, 0, 0],
                                             mode_num=0,
                                             power=1),
            ])

        obj = -goos.abs(sim[2])

        goos.opt.scipy_minimize(obj,
                                "L-BFGS-B",
                                monitor_list=[obj],
                                max_iters=15)
        plan.run()

        assert obj.get().array < -0.90
예제 #19
0
def make_objective_fdtd(eps: goos.Shape, stage: str, sim_3d: bool):
    if sim_3d:
        sim_z_extent = 2500
        src_z_extent = 1000
        pml_thickness = [400, 400, 400, 400, 400, 400]
        # Dominant E-component is Ey.
        timing_comp = 1
        # Simulate across 4 cores.
        sim_cores = 4
    else:
        sim_z_extent = 0
        src_z_extent = 0
        # No PMLs in the vertical direction for 2D.
        pml_thickness = [400, 400, 400, 400, 0, 0]
        # Dominant E-component is Ez.
        timing_comp = 2
        # Simulate using only a single CPU.
        sim_cores = 1

    sim = meep.fdtd_simulation(
        name="sim_{}".format(stage),
        eps=eps,
        sources=[
            meep.WaveguideModeSource(center=[-1400, 0, 0],
                                     extents=[0, 2500, src_z_extent],
                                     normal=[1, 0, 0],
                                     mode_num=0,
                                     power=1,
                                     wavelength=1550,
                                     bandwidth=100),
        ],
        sim_space=meep.SimulationSpace(dx=20,
                                       sim_region=goos.Box3d(
                                           center=[0, 0, 0],
                                           extents=[4000, 4000, sim_z_extent],
                                       ),
                                       pml_thickness=pml_thickness),
        # `SimulationTiming` handles termination condition for FDTD.
        # In this case, we rely on Meep's `stop_when_fields_decayed` which
        # waits until the field component indexed by `timing_comp`
        # at pos (0, 0, 0) has decayed (after the source has finished).
        sim_timing=meep.SimulationTiming(stopping_conditions=[
            meep.StopWhenFieldsDecayed(
                time_increment=100,
                component=timing_comp,
                pos=[0, 0, 0],
                threshold=1e-4,
            )
        ]),
        background=goos.material.Material(index=1.0),
        outputs=[
            meep.Epsilon(name="eps", wavelength=1550),
            meep.ElectricField(name="field", wavelength=1550),
            meep.WaveguideModeOverlap(name="overlap",
                                      wavelength=1550,
                                      center=[0, 1400, 0],
                                      extents=[2500, 0, src_z_extent],
                                      normal=[0, 1, 0],
                                      mode_num=0,
                                      power=1),
        ],
        sim_cores=sim_cores,
    )

    obj = goos.rename(-goos.abs(sim["overlap"]), name="obj_{}".format(stage))
    return obj, sim
예제 #20
0
def main(save_folder: str,
         min_feature: float = 100,
         use_cubic: bool = True,
         visualize: bool = False) -> None:
    goos.util.setup_logging(save_folder)

    with goos.OptimizationPlan(save_path=save_folder) as plan:
        wg_1 = goos.Cuboid(pos=goos.Constant([1600, -4500, 0]),
                           extents=goos.Constant([600, 1000, 230]),
                           material=goos.material.Material(index=3.45))
        wg_2 = goos.Cuboid(pos=goos.Constant([-1600, -4500, 0]),
                           extents=goos.Constant([600, 1000, 230]),
                           material=goos.material.Material(index=3.45))
        wg_3 = goos.Cuboid(pos=goos.Constant([1600, 4500, 0]),
                           extents=goos.Constant([600, 1000, 230]),
                           material=goos.material.Material(index=3.45))
        wg_4 = goos.Cuboid(pos=goos.Constant([-1600, 4500, 0]),
                           extents=goos.Constant([600, 1000, 230]),
                           material=goos.material.Material(index=3.45))
        wg_5 = goos.Cuboid(pos=goos.Constant([4500, -1600, 0]),
                           extents=goos.Constant([1000, 600, 230]),
                           material=goos.material.Material(index=3.45))
        wg_6 = goos.Cuboid(pos=goos.Constant([4500, 1600, 0]),
                           extents=goos.Constant([1000, 600, 230]),
                           material=goos.material.Material(index=3.45))
        wg_7 = goos.Cuboid(pos=goos.Constant([-4500, 0, 0]),
                           extents=goos.Constant([1000, 600, 230]),
                           material=goos.material.Material(index=3.45))
        substrate = goos.Cuboid(pos=goos.Constant([0, 0, -500]),
                                extents=goos.Constant([11000, 11000, 770]),
                                material=goos.material.Material(index=1.4))

        def initializer(size):
            # Set the seed immediately before calling `random` to ensure
            # reproducibility.
            #np.random.seed(247)
            return np.ones(size) * 0.5
            #return np.random.random(size) * 0.2 + 0.5

        # Continuous optimization.
        var, design = goos.pixelated_cont_shape(
            initializer=initializer,
            pos=goos.Constant([0, 0, 0]),
            extents=[8000, 8000, 230],
            material=goos.material.Material(index=1),
            material2=goos.material.Material(index=3.45),
            pixel_size=[50, 50, 230],
            var_name="var_cont")

        sigmoid_factor = goos.Variable(4, parameter=True, name="discr_factor")
        design = goos.cast(goos.Sigmoid(sigmoid_factor * (2 * design - 1)),
                           goos.Shape)
        eps = goos.GroupShape(
            [wg_1, wg_2, wg_3, wg_4, wg_5, wg_6, wg_7, design, substrate])

        # This node is purely for debugging purposes.
        eps_rendered = maxwell.RenderShape(
            eps,
            region=goos.Box3d(center=[0, 0, 0], extents=[10000, 10000, 0]),
            mesh=maxwell.UniformMesh(dx=50),
            wavelength=635,
        )
        if visualize:
            goos.util.visualize_eps(eps_rendered.get().array[2])

        obj, sim1, sim2, sim3, sim4, sim5, sim6, sim7 = make_objective(
            eps, "cont")

        for factor in [4, 8, 12]:
            sigmoid_factor.set(factor)
            goos.opt.scipy_minimize(
                obj,
                "L-BFGS-B",
                monitor_list=[
                    sim1["eps"], sim1["field"], sim1["overlap1"],
                    sim1["overlap2"], sim1["overlap3"], sim1["overlap4"],
                    sim1["overlap5"], sim1["overlap6"], sim1["overlap7"],
                    sim2["eps"], sim2["field"], sim2["overlap1"],
                    sim2["overlap2"], sim2["overlap3"], sim2["overlap4"],
                    sim2["overlap5"], sim2["overlap6"], sim2["overlap7"],
                    sim3["eps"], sim3["field"], sim3["overlap1"],
                    sim3["overlap2"], sim3["overlap3"], sim3["overlap4"],
                    sim3["overlap5"], sim3["overlap6"], sim3["overlap7"],
                    sim4["eps"], sim4["field"], sim4["overlap1"],
                    sim4["overlap2"], sim4["overlap3"], sim4["overlap4"],
                    sim4["overlap5"], sim4["overlap6"], sim4["overlap7"],
                    sim5["eps"], sim5["field"], sim5["overlap1"],
                    sim5["overlap2"], sim5["overlap3"], sim5["overlap4"],
                    sim5["overlap5"], sim5["overlap6"], sim5["overlap7"],
                    sim6["eps"], sim6["field"], sim6["overlap1"],
                    sim6["overlap2"], sim6["overlap3"], sim6["overlap4"],
                    sim6["overlap5"], sim6["overlap6"], sim6["overlap7"],
                    sim7["eps"], sim7["field"], sim7["overlap1"],
                    sim7["overlap2"], sim7["overlap3"], sim7["overlap4"],
                    sim7["overlap5"], sim7["overlap6"], sim7["overlap7"], obj
                ],
                max_iters=25,
                name="opt_cont{}".format(factor))

        plan.save()
        plan.run()

        if visualize:
            goos.util.visualize_eps(eps_rendered.get().array[2])