def force_gmmt(): wavelengths = np.linspace(400 * nm, 1000 * nm, 100) eps = meep_ext.get_eps(material)(wavelengths) Au = miepy.data_material(wavelengths, eps) # Au = miepy.constant_material(3.5**2) # Au = miepy.materials.Au() particles = [] for i in range(9): orientation = miepy.quaternion.from_spherical_coords(theta[i], phi[i]) particles.append( miepy.cylinder(position=[x[i], y[i], z[i]], radius=radius, height=height, material=Au, orientation=orientation)) F = np.zeros([3, 9, len(wavelengths)], dtype=float) for i, wavelength in enumerate(pbar(wavelengths)): sol = miepy.cluster(particles=particles, source=miepy.sources.plane_wave([1, 0]), wavelength=wavelength, lmax=4) F[..., i] = sol.force() # if i == 0: # miepy.visualize(sol) return dict(wavelengths=wavelengths, force=F)
def progress(i): progress = 0 for j in pbar(range(N)): if i in (2, 5, 8) and j == 40: raise RuntimeError sleep(T / N) yield dict()
def force_gmmt(): wavelengths = np.linspace(400 * nm, 1000 * nm, 100) # eps = meep_ext.get_eps(material)(wavelengths) # Au = miepy.data_material(wavelengths, eps) material = miepy.constant_material(3.5**2) particles = [ miepy.cube([-sep / 2, 0, 0], 200 * nm, material), miepy.cube([sep / 2, 0, 0], 200 * nm, material) ] F1 = np.zeros((3, ) + wavelengths.shape, dtype=float) F2 = np.zeros((3, ) + wavelengths.shape, dtype=float) for i, wavelength in enumerate(pbar(wavelengths)): c = miepy.cluster(particles=particles, source=miepy.sources.plane_wave([1, 0]), wavelength=wavelength, lmax=4) q = miepy.quaternion.from_spherical_coords(0, 0) c.update(orientation=[q, q]) F1[:, i] = c.force_on_particle(1) q = miepy.quaternion.from_spherical_coords(0, np.pi / 4) c.update(orientation=[q, q]) F2[:, i] = c.force_on_particle(1) return dict(wavelengths=wavelengths, F1=F1, F2=F2)
def vis(): fig, ax = plt.subplots() norm = job.load(norm_sim) scat = job.load(scat_sim) ax.plot((1 / nm) / norm.frequency, scat.scattering / norm.incident * norm.area, 'o', color='C0', label='scattering (FDTD)') ax.plot((1 / nm) / norm.frequency, scat.absorption / norm.incident * norm.area, 'o', color='C1', label='absorption (FDTD)') ax.plot((1 / nm) / norm.frequency, (scat.scattering + scat.absorption) / norm.incident * norm.area, 'o', color='C2', label='extinction (FDTD)') wavelengths = np.linspace(400 * nm, 1000 * nm, 100) eps = meep_ext.get_eps(material)(wavelengths) Au = miepy.data_material(wavelengths, eps) # Au = miepy.constant_material(3.5**2) C, A, E = [np.zeros_like(wavelengths) for i in range(3)] particles = [] for i in range(9): orientation = miepy.quaternion.from_spherical_coords(theta[i], phi[i]) particles.append( miepy.cylinder(position=[x[i], y[i], z[i]], radius=radius, height=height, material=Au, orientation=orientation)) for i, wavelength in enumerate(pbar(wavelengths)): sol = miepy.cluster(particles=particles, source=miepy.sources.plane_wave([1, 0]), wavelength=wavelength, lmax=3) C[i], A[i], E[i] = sol.cross_sections() ax.axhline(0, linestyle='--', color='black') ax.plot(wavelengths / nm, C, color='C0', label='scattering (GMT)') ax.plot(wavelengths / nm, A, color='C1', label='absorption (GMT)') ax.plot(wavelengths / nm, E, color='C2', label='extinction (GMT)') ax.legend() ax.set(xlabel='wavelength (nm)', ylabel='cross-section') plt.show()
def make_vid(): var = job.load(sim) traj = var.pos[::10] for i in pbar(range(len(traj))): pov_content = make_pov_file(traj[i] / (100 * nm)) with open('om.pov', 'w') as f: f.write(pov_content) command = ['povray', 'Width=600 Height=600 om.pov', f'-Oimg/img_{i+1}'] proc = subprocess.run(command, capture_output=True) return dict()
def sim(): cluster = miepy.sphere_cluster(position=initial, radius=radius, material=Ag, source=source, wavelength=wavelength, medium=water, lmax=2) bd = stoked_from_cluster_2d(cluster, dt=dt, temperature=300) for i in pbar(range(Nsteps)): if i % 10 == 0: yield dict(pos=bd.position) bd.step()
def sim(): drag = stoked.drag_sphere(75*nm, 8e-4) A = 2e-20 k = 2*np.pi*1.33/(800*nm) # sep = 600*nm # initial = [[-sep/2, 0, 0], [sep/2, 0, 0]] # amplitude = [1,1] # phase = [0, .3] phase = np.zeros(len(initial), dtype=float) amplitude = np.ones(len(initial), dtype=float) order = np.arange(len(initial)).astype(int) np.random.shuffle(order) size = int(len(initial)//4) idx1 = order[:size] idx2 = order[size:2*size] idx3 = order[2*size:3*size] idx4 = order[3*size:] phase[idx2] = .5 phase[idx3] = 1 phase[idx4] = 1.5 amplitude[idx2] = 1.3 amplitude[idx3] = 1.6 amplitude[idx4] = 1.9 bd = stoked.brownian_dynamics(temperature=300, dt=5*us, position=initial, drag=drag, force=partial(harmonic_force, stiffness=.3e-8), interactions=[nonrec_force(A, amplitude, phase, k), stoked.double_layer_sphere(75*nm, -77e-3)]) yield once(idx2=idx2, idx3=idx3, idx4=idx4) for i in pbar(range(Nsteps)): if i % 10 == 0: yield dict(pos=bd.position) bd.step()
def gmt_sim(): wavelengths = np.linspace(400*nm, 1000*nm, 100) eps = meep_ext.get_eps(material)(wavelengths) Au = miepy.data_material(wavelengths, eps) Au = miepy.constant_material(3.5**2) C, A, E = [np.zeros_like(wavelengths) for i in range(3)] particles = [] # orientation = miepy.quaternion.from_spherical_coords(theta[i], phi[i]) particles.append(miepy.cube([0,0,0], W, material=Au, orientation=q)) for i, wavelength in enumerate(pbar(wavelengths)): sol = miepy.cluster(particles=particles, source=miepy.sources.plane_wave([1,0]), wavelength=wavelength, lmax=4) C[i], A[i], E[i] = sol.cross_sections() return dict(wavelengths=wavelengths, C=C, A=A, E=E)
def sim(): for i in pbar(range(100)): yield dict(counter=i) sleep(1)