예제 #1
0
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)
예제 #2
0
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()
예제 #3
0
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)
예제 #4
0
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()
예제 #5
0
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()
예제 #6
0
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()
예제 #7
0
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()
예제 #8
0
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)
예제 #9
0
def sim():
    for i in pbar(range(100)):
        yield dict(counter=i)
        sleep(1)