def threefold(n, h, d, points=True): s = System(hextess(n, points)) ct = [] ct.append(PatternRangeConstraint(min=0, max=1.)) for p in 0, 4*np.pi/3, 2*np.pi/3: x = np.array([d/3**.5*np.cos(p), d/3**.5*np.sin(p), h]) r = euler_matrix(p, np.pi/2, np.pi/4, "rzyz")[:3, :3] for i in "x y z xy xz yz".split(): ct.append(PotentialObjective(derivative=i, x=x, rotation=r, value=0)) for i, v in ("xx", 1), ("yy", 1): ct.append(PotentialObjective(derivative=i, x=x, rotation=r, value=v)) s.rfs, c = s.optimize(ct) return s, c
def five_wire(edge, width, top, mid, bot): e, r, t, m, b = edge, width/2, top + mid/2, mid/2, -bot - mid/2 electrodes = [ ("tl", [[(-e, e), (-e, t), (-r, t), (-r, e)]]), ("tm", [[(-r, e), (-r, t), (r, t), (r, e)]]), ("tr", [[(r, e), (r, t), (e, t), (e, e)]]), ("bl", [[(-e, -e), (-r, -e), (-r, b), (-e, b)]]), ("bm", [[(-r, -e), (r, -e), (r, b), (-r, b)]]), ("br", [[(r, -e), (e, -e), (e, b), (r, b)]]), ("r", [[(-e, t), (-e, m), (e, m), (e, t)], [(-e, b), (e, b), (e, -m), (-e, -m)]]), ("c", [[(-e, m), (-e, -m), (e, -m), (e, m)]]), ] s = System([PolygonPixelElectrode(name=n, paths=map(np.array, p)) for n, p in electrodes]) s["r"].rf = 1. return s
fig, ax = plt.subplots(subplot_kw=dict(aspect="equal")) mesh.plot(ax) # explore it in fancy 3D # fire up a mayavi2 window showing base mesh, charges on final mesh # and isosurfaces of the pseudopotential # Result.view(prefix, "RF") # need to start the full eventloop for the window. # close it to return control to the notebook # from pyface.api import GUI # GUI().start_event_loop() from electrode import System, GridElectrode # load the electrostatics results into a electrode.System() s = System() for name in "DC1 DC2 DC3 DC4 DC5 RF".split(): r = Result.from_vtk(prefix, name) e = GridElectrode.from_result(r) e.name = name s.append(e) s["RF"].rf = 1. n = 30 xyz = grid.to_mgrid() p = s.potential(xyz.reshape(3, -1).T, 0).reshape(xyz[0].shape) v = np.linspace(0, 2e-2, 21) fig, ax = plt.subplots() ax.set_aspect("equal") ax.contour(xyz[1, 10, :, :], xyz[2, 10, :, :],
# explore it in fancy 3D # fire up a mayavi2 window showing base mesh, charges on final mesh # and isosurfaces of the pseudopotential Result.view(prefix, "RF") # need to start the full eventloop for the window. # close it to return control to the notebook from pyface.api import GUI GUI().start_event_loop() # <codecell> from electrode import System, GridElectrode # load the electrostatics results into a electrode.System() s = System() for name in "DC1 DC2 DC3 DC4 DC5 RF".split(): r = Result.from_vtk(prefix, name) e = GridElectrode.from_result(r) e.name = name s.append(e) s["RF"].rf = 1. # <codecell> from scipy.constants import atomic_mass x0 = s.minimum((0, 0, 1.)) for _ in s.analyze_static(x0, m=25*atomic_mass, u=50., l=40e-6, o=100e6*2*np.pi): print(_)
# compensate stray fields and confine the ion axially. # # The `shim()` method can be used to calculate voltage vectors for these # dc electrodes that are result in orthogonal effects with regards to some # cartesian partial derivatives at certain points. To use it we build a # temporary new system `s1` holding only the dc electrodes. Since these dc # electrode instances also appear in our primary system `s`, changes in # voltages are automatically synchronized between the two systems. # # We then can calculate the shim voltage vectors that result in unit # changes of each of the partial derivatives `y, z, xx, xy, xz, yy` at # `x0` and plot the voltage distributions. # <codecell> s1 = System([e for e in s if not e.rf]) derivs = "y z xx xy xz yy".split() u = s1.shims([(x0, None, deriv) for deriv in derivs]) fig, ax = plt.subplots(2, len(derivs)/2, figsize=(12, 10)) for d, ui, axi in zip(derivs, u, ax.flat): with s1.with_voltages(dcs=ui): s.plot_voltages(axi) axi.set_aspect("equal") axi.set_xlim(-r, r) axi.set_ylim(-r, r) um = ui[np.argmax(np.fabs(ui))] axi.set_title("%s, max=%g" % (d, um)) # <markdowncell> # Rf/dc pattern optimization