def dimer_scat(): """perform scattering simulation""" scat = meep.Simulation(cell_size=cell, boundary_layers=[pml], geometry=geometry, resolution=resolution) scat.init_fields() source(scat) L = 2 * radius + 2 * particle_monitor_gap Fx = meep_ext.add_force_box(scat, fcen, df, nfreq, p2, [L, L, L], meep.X) Fy = meep_ext.add_force_box(scat, fcen, df, nfreq, p2, [L, L, L], meep.Y) Fz = meep_ext.add_force_box(scat, fcen, df, nfreq, p2, [L, L, L], meep.Z) # scat.run(until_after_sources=8*um) scat.run(until_after_sources=meep.stop_when_fields_decayed( .5 * um, meep.Ex, pt=p2 - meep.Vector3(0, 0, L / 2), decay_by=1e-7)) return { 'Fx': np.array(meep.get_forces(Fx)), 'Fy': np.array(meep.get_forces(Fy)), 'Fz': np.array(meep.get_forces(Fz)), 'frequency': np.array(meep.get_force_freqs(Fx)) }
def force_sim(): """perform scattering simulation""" sim = meep.Simulation(cell_size=cell, boundary_layers=[pml], geometry=geometry, default_material=medium, resolution=resolution) sim.init_fields() source(sim) L = 2**.5 * W + 2 * particle_monitor_gap p = meep.Vector3(sep / 2, 0, 0) Fx_mon = meep_ext.add_force_box(sim, fcen, df, nfreq, p, [L, L, L], meep.X) Fy_mon = meep_ext.add_force_box(sim, fcen, df, nfreq, p, [L, L, L], meep.Y) Fz_mon = meep_ext.add_force_box(sim, fcen, df, nfreq, p, [L, L, L], meep.Z) sim.run(until_after_sources=meep.stop_when_fields_decayed( .5 * um, decay, pt=meep.Vector3(0, 0, monitor_size[2] / 2), decay_by=1e-5)) Fx = np.array(meep.get_forces(Fx_mon)) Fy = np.array(meep.get_forces(Fy_mon)) Fz = np.array(meep.get_forces(Fz_mon)) frequency = np.array(meep.get_force_freqs(Fx_mon)) return dict(frequency=frequency, Fx=Fx, Fy=Fy, Fz=Fz)
def sim(separation): """perform scattering simulation""" L = separation + 2*radius + 2*pml_monitor_gap + 2*particle_monitor_gap + 2*pml.thickness cell = meep.Vector3(L,L,L) p1 = meep.Vector3(-separation/2, 0, 0) p2 = meep.Vector3(separation/2, 0, 0) geometry = [meep.Sphere(center=p1, radius=radius, material=gold), meep.Sphere(center=p2, radius=radius, material=gold)] scat = meep.Simulation(cell_size=cell, boundary_layers=[pml], geometry=geometry, resolution=resolution) scat.init_fields() source(scat) L = 2*radius + 2*particle_monitor_gap Fx = meep_ext.add_force_box(scat, fcen, 0, 1, p2, [L,L,L], meep.X) Fy = meep_ext.add_force_box(scat, fcen, 0, 1, p2, [L,L,L], meep.Y) Fz = meep_ext.add_force_box(scat, fcen, 0, 1, p2, [L,L,L], meep.Z) # scat.run(until_after_sources=8*um) scat.run(until_after_sources=meep.stop_when_fields_decayed(.5*um, meep.Ex, pt=p2-meep.Vector3(0,0,L/2), decay_by=1e-5)) return {'Fx': np.array(meep.get_forces(Fx))[0], 'Fy': np.array(meep.get_forces(Fy))[0], 'Fz': np.array(meep.get_forces(Fz))[0]}
def force_sim(): """perform scattering simulation""" sim = meep.Simulation(cell_size=cell, boundary_layers=[pml], geometry=geometry, default_material=medium, resolution=resolution) sim.init_fields() source(sim) L = 2*radius + 2*particle_monitor_gap forces = {} for i in range(9): p = meep.Vector3(x[i], y[i], z[i]) key = 'N{i}_F{c}' forces[key.format(i=i, c='x')] = meep_ext.add_force_box(sim, fcen, df, nfreq, p, [L,L,L], meep.X) forces[key.format(i=i, c='y')] = meep_ext.add_force_box(sim, fcen, df, nfreq, p, [L,L,L], meep.Y) forces[key.format(i=i, c='z')] = meep_ext.add_force_box(sim, fcen, df, nfreq, p, [L,L,L], meep.Z) sim.run(until_after_sources=meep.stop_when_fields_decayed(.5*um, decay, pt=meep.Vector3(0,0,monitor_size[2]/2), decay_by=1e-8)) ret = {} for i in range(9): for c in ['x', 'y', 'z']: key = f'N{i}_F{c}' ret[key] = np.array(meep.get_forces(forces[key])) ret['frequency'] = np.array(meep.get_force_freqs(forces['N1_Fx'])) return ret
def test_force(self): self.sim.run(until_after_sources=mp.stop_when_fields_decayed( 50, mp.Ez, mp.Vector3(), 1e-6)) # Test store and load of force as numpy array fdata = self.sim.get_force_data(self.myforce) self.sim.load_force_data(self.myforce, fdata) self.sim.display_forces(self.myforce) f = mp.get_forces(self.myforce) self.assertAlmostEqual(f[0], -0.11039089113393187) places = 6 if mp.is_single_precision() else 7 self.assertAlmostEqual(f[0], mp.get_forces(self.myforce_decimated)[0], places=places)
def test_force(self): self.sim.run(until_after_sources=mp.stop_when_fields_decayed( 50, mp.Ez, mp.Vector3(), 1e-6)) self.sim.display_forces(self.myforce) f = mp.get_forces(self.myforce) self.assertAlmostEqual(f[0], -0.11039089113393187)
def test_force(self): self.sim.run(until_after_sources=mp.stop_when_fields_decayed(50, mp.Ez, mp.Vector3(), 1e-6)) # Test store and load of force as numpy array fdata = self.sim.get_force_data(self.myforce) self.sim.load_force_data(self.myforce, fdata) self.sim.display_forces(self.myforce) f = mp.get_forces(self.myforce) self.assertAlmostEqual(f[0], -0.11039089113393187)
def parallel_waveguide(s,xodd): geometry = [mp.Block(center=mp.Vector3(-0.5*(s+a)), size=mp.Vector3(a,a,mp.inf), material=Si), mp.Block(center=mp.Vector3(0.5*(s+a)), size=mp.Vector3(a,a,mp.inf), material=Si)] symmetries = [mp.Mirror(mp.X, phase=-1.0 if xodd else 1.0), mp.Mirror(mp.Y, phase=-1.0)] sources = [mp.Source(src=mp.GaussianSource(fcen, fwidth=df), component=mp.Ey, center=mp.Vector3(-0.5*(s+a)), size=mp.Vector3(a,a)), mp.Source(src=mp.GaussianSource(fcen, fwidth=df), component=mp.Ey, center=mp.Vector3(0.5*(s+a)), size=mp.Vector3(a,a), amplitude=-1.0 if xodd else 1.0)] sim = mp.Simulation(resolution=resolution, cell_size=cell, boundary_layers=pml_layers, geometry=geometry, symmetries=symmetries, k_point=k_point, sources=sources) h = mp.Harminv(mp.Ey, mp.Vector3(0.5*(s+a)), fcen, df) sim.run(mp.after_sources(h), until_after_sources=200) f = h.modes[0].freq print("freq:, {}, {}".format(s, f)) sim.reset_meep() eig_sources = [mp.EigenModeSource(src=mp.GaussianSource(f, fwidth=df), size=mp.Vector3(a,a), center=mp.Vector3(-0.5*(s+a)), eig_kpoint=k_point, eig_match_freq=True, eig_parity=mp.ODD_Y), mp.EigenModeSource(src=mp.GaussianSource(f, fwidth=df), size=mp.Vector3(a,a), center=mp.Vector3(0.5*(s+a)), eig_kpoint=k_point, eig_match_freq=True, eig_parity=mp.ODD_Y, amplitude=-1.0 if xodd else 1.0)] sim.change_sources(eig_sources) flux_reg = mp.FluxRegion(direction=mp.Z, center=mp.Vector3(), size=mp.Vector3(1.2*(2*a+s),1.2*a)) wvg_flux = sim.add_flux(f, 0, 1, flux_reg) force_reg1 = mp.ForceRegion(mp.Vector3(0.5*s), direction=mp.X, weight=1.0, size=mp.Vector3(y=a)) force_reg2 = mp.ForceRegion(mp.Vector3(0.5*s+a), direction=mp.X, weight=-1.0, size=mp.Vector3(y=a)) wvg_force = sim.add_force(f, 0, 1, force_reg1, force_reg2) sim.run(until_after_sources=5000) flux = mp.get_fluxes(wvg_flux)[0] force = mp.get_forces(wvg_force)[0] sim.reset_meep() return flux, force
def parallel_waveguide(s, xodd): geometry = [ mp.Block(center=mp.Vector3(-0.5 * (s + a)), size=mp.Vector3(a, a, mp.inf), material=Si), mp.Block(center=mp.Vector3(0.5 * (s + a)), size=mp.Vector3(a, a, mp.inf), material=Si) ] symmetries = [ mp.Mirror(mp.X, phase=-1.0 if xodd else 1.0), mp.Mirror(mp.Y, phase=-1.0) ] sources = [ mp.Source(src=mp.GaussianSource(fcen, fwidth=df), component=mp.Ey, center=mp.Vector3(-0.5 * (s + a)), size=mp.Vector3(a, a)), mp.Source(src=mp.GaussianSource(fcen, fwidth=df), component=mp.Ey, center=mp.Vector3(0.5 * (s + a)), size=mp.Vector3(a, a), amplitude=-1.0 if xodd else 1.0) ] sim = mp.Simulation(resolution=resolution, cell_size=cell, boundary_layers=pml_layers, geometry=geometry, symmetries=symmetries, k_point=k_point, sources=sources) h = mp.Harminv(mp.Ey, mp.Vector3(0.5 * (s + a)), fcen, df) sim.run(mp.after_sources(h), until_after_sources=200) f = h.modes[0].freq print("freq:, {}, {}".format(s, f)) sim.reset_meep() eig_sources = [ mp.EigenModeSource(src=mp.GaussianSource(f, fwidth=df), size=mp.Vector3(a, a), center=mp.Vector3(-0.5 * (s + a)), direction=mp.Z, eig_kpoint=k_point, eig_match_freq=True, eig_parity=mp.ODD_Y), mp.EigenModeSource(src=mp.GaussianSource(f, fwidth=df), size=mp.Vector3(a, a), center=mp.Vector3(0.5 * (s + a)), direction=mp.Z, eig_kpoint=k_point, eig_match_freq=True, eig_parity=mp.ODD_Y, amplitude=-1.0 if xodd else 1.0) ] sim.change_sources(eig_sources) flux_reg = mp.FluxRegion(direction=mp.Z, center=mp.Vector3(), size=mp.Vector3(1.2 * (2 * a + s), 1.2 * a)) wvg_flux = sim.add_flux(f, 0, 1, flux_reg) force_reg1 = mp.ForceRegion(mp.Vector3(0.5 * s), direction=mp.X, weight=1.0, size=mp.Vector3(y=a)) force_reg2 = mp.ForceRegion(mp.Vector3(0.5 * s + a), direction=mp.X, weight=-1.0, size=mp.Vector3(y=a)) wvg_force = sim.add_force(f, 0, 1, force_reg1, force_reg2) sim.run(until_after_sources=5000) flux = mp.get_fluxes(wvg_flux)[0] force = mp.get_forces(wvg_force)[0] sim.reset_meep() return flux, force
def parallel_waveguide(s, xodd): geometry = [ mp.Block(center=mp.Vector3(-0.5 * (s + a)), size=mp.Vector3(a, a, mp.inf), material=Si), mp.Block(center=mp.Vector3(0.5 * (s + a)), size=mp.Vector3(a, a, mp.inf), material=Si) ] symmetries = [ mp.Mirror(mp.X, phase=-1 if xodd else 1), mp.Mirror(mp.Y, phase=-1) ] sim = mp.Simulation(resolution=resolution, cell_size=cell, geometry=geometry, boundary_layers=pml_layers, symmetries=symmetries, k_point=k_point) sim.init_sim() EigenmodeData = sim.get_eigenmode(0.22, mp.Z, mp.Volume(center=mp.Vector3(), size=mp.Vector3(sx, sy)), 2 if xodd else 1, k_point, match_frequency=False, parity=mp.ODD_Y) fcen = EigenmodeData.freq print("freq:, {}, {}, {}".format("xodd" if xodd else "xeven", s, fcen)) sim.reset_meep() eig_sources = [ mp.EigenModeSource(src=mp.GaussianSource(fcen, fwidth=0.1 * fcen), size=mp.Vector3(sx, sy), center=mp.Vector3(), eig_band=2 if xodd else 1, eig_kpoint=k_point, eig_match_freq=False, eig_parity=mp.ODD_Y) ] sim.change_sources(eig_sources) flux_reg = mp.FluxRegion(direction=mp.Z, center=mp.Vector3(), size=mp.Vector3(sx, sy)) wvg_flux = sim.add_flux(fcen, 0, 1, flux_reg) force_reg1 = mp.ForceRegion(mp.Vector3(0.49 * s), direction=mp.X, weight=1, size=mp.Vector3(y=sy)) force_reg2 = mp.ForceRegion(mp.Vector3(0.5 * s + 1.01 * a), direction=mp.X, weight=-1, size=mp.Vector3(y=sy)) wvg_force = sim.add_force(fcen, 0, 1, force_reg1, force_reg2) sim.run(until_after_sources=1500) flux = mp.get_fluxes(wvg_flux)[0] force = mp.get_forces(wvg_force)[0] print("data:, {}, {}, {}, {}, {}".format("xodd" if xodd else "xeven", s, flux, force, -force / flux)) sim.reset_meep() return flux, force