def test_g2_fock_state(): N, U, = 2, 0 gs = (.2, .1) model = scattering.Model(omegas=[0] * N, links=[(0, 1, 1)], U=[2 * U] * N) channels = [] channels.append(scattering.Channel(site=0, strength=gs[0])) channels.append(scattering.Channel(site=N - 1, strength=gs[1])) setup = scattering.Setup(model, channels) Es = np.linspace(-3, 12, 1024) dE = 0 g2s = np.zeros(Es.shape, dtype=np.complex128) g2n = np.zeros(Es.shape, dtype=np.complex128) g2d = np.zeros(Es.shape, dtype=np.complex128) for i, E in enumerate(Es): g2s[i], g2n[i], g2d[i] = g2.fock_state(setup, (0, 0), (1, 1), E, dE) plt.semilogy(Es, g2s, label='g2') plt.semilogy(Es, g2n, label='g2n') plt.semilogy(Es, g2d, label='g1g1') plt.legend() plt.show()
def test_smatrix_two_particle_non_interacting(): m = scattering.Model([0] * 2, [[0, 1, 1]], [0] * 2) channels = [ scattering.Channel(site=0, strength=1), scattering.Channel(site=1, strength=1), ] s = scattering.Setup(m, channels) E = 0 dE = 0 chls = [[0, 0], [0, 1], [1, 0], [1, 1]] S2s = np.zeros((4, 4), np.float64) for ci, chlsi in enumerate(chls): for co, chlso in enumerate(chls): _, _, S2, _ = smatrix.two_particle(s, chlsi=chlsi, chlso=chlso, E=E, dE=dE) S2s[ci, co] = np.sum(np.abs(S2)**2) # Test if S2 vanishes assert np.allclose(np.ones((4, 4)) + S2s, np.ones((4, 4)), 1e-2), \ 'S2 does not vanish for non-interacting systems, S2 = {0}.'.format(np.abs(S2s))
def test_ttmatrix(): m = scattering.Model([0] * 2, [[0, 1, 1]], [0] * 2) channels = [ scattering.Channel(site=0, strength=.1), scattering.Channel(site=1, strength=.1), ] se = scattering.Setup(m, channels) E = 0 dE = 0 chls = [[0, 0], [0, 1], [1, 0], [1, 1]] qs = np.linspace(-5, 5, 512) # T2as = np.zeros((4, 4, len(qs)), np.complex128) # T2bs = np.zeros((4, 4, len(qs)), np.complex128) for ci in xrange(4): for co in xrange(4): _, T2a, _, T2b = ttmatrix.two_particle(se, chlsi=chls[ci], chlso=chls[co], E=E, dE=dE, qs=qs) plt.subplot(4, 4, 1 + ci + co * 4) plt.plot(qs, np.real(T2a + T2b), label='real'.format(chls[ci], chls[co])) plt.plot(qs, np.imag(T2a + T2b)) plt.title('{}-{}'.format(chls[ci], chls[co])) plt.legend() plt.show()
def test_g2_unity_in_noninteracting_system(): # model with two sites and no interactiong N, U = 2, 0 model = scattering.Model(omegas=[0] * N, links=[[i, i + 1, 1] for i in xrange(N - 1)], U=[2 * U] * N) # channels channels = [] channels.append(scattering.Channel(site=0, strength=.4)) channels.append(scattering.Channel(site=N - 1, strength=1.1)) setup = scattering.Setup(model, channels) Es = np.linspace(-6, 20, 128) chlso = [1, 1] g12 = np.zeros((len(Es), ), dtype=np.float64) g22 = np.zeros((len(Es), ), dtype=np.float64) for i, E in enumerate(Es): g12[i] = np.real(g2.coherent_state_tau0(setup, [0, 0], chlso, E)[0][0]) g22[i] = np.real(g2.general_state(setup, [0, 0], chlso, E, 0, 0)[0]) assert np.allclose(g22, 1), \ 'g2 != 1 for a weakly coherent state in a non-interacting system' assert np.allclose(g22, 1), \ 'g2 != 1 for a general two-photon state in a non-interacting system'
def test_Setup_transitions(): """ Test the scattering transitions """ m = scat.Model([0] * 6, links=[[c, c + 1] for c in xrange(5)], U=[2] * 6) c1 = scat.Channel(site=0, strength=1.) c2 = scat.Channel(site=4, strength=1.) se = scat.Setup(model=m, channels=[c1, c2]) A10, A01 = [], [] for c in xrange(se.model.n): A10.append(se.trsn(0, c, 1)) A01.append(se.trsn(1, c, 0)) A = np.zeros((se.model.n, se.model.n)) for i in xrange(se.model.n): for j in xrange(se.model.n): A[i, j] = np.abs(A01[i].dot(A10[j])[0][0]) # Test that A is orthogonal assert np.allclose(A, np.eye(se.model.n)) A21, A12 = [], [] for c in xrange(se.model.n): A21.append(se.trsn(1, c, 2)) A12.append(se.trsn(2, c, 1)) # Assert that A21 works for c in xrange(se.model.n): assert np.isclose(np.abs(A01[c].dot(A12[c]).dot(A21[c]).dot(A10[c])), 2), \ 'Transitions 2 -> 1 not properly normalized'
def test_Setup(): """ Test the scattering setup object """ m = scat.Model([0], [], [2]) c1 = scat.Channel(sites=[1], strengths=[2.1]) s = scat.Setup(model=m, channels=[c1]) assert_equals(s.strengths, s.gs)
def _test_g2_optical_theorem(N, U, gs=(1, 1)): N, U, = 2, 2 model = scattering.Model(omegas=[0] * N, links=[(0, 1, 1)], U=[2 * U] * N) channels = [] channels.append(scattering.Channel(site=0, strength=gs[0])) channels.append(scattering.Channel(site=N - 1, strength=gs[1])) setup = scattering.Setup(model, channels) # Es = np.linspace(-6, 20, 128) E = 10 chlsi = (0, 0) dE = .1 i1, i2 = chlsi k0, q0 = .5 * E, .5 * dE E1 = setup.eigenenergies(1) ps = [] nchan = len(setup.channels) for i in xrange(nchan): pj = [] for j in xrange(nchan): pj.append(g2.phi(setup, k0, q0, i, j, i1, i2)) ps.append(pj) # fij2_sqrd fij2_sqrd = 0 for i, _ in enumerate(setup.channels): for j, _ in enumerate(setup.channels): for ll in xrange(nchan): for lp in xrange(nchan): fij2_sqrd += (ps[i][j][lp].conj() * ps[i][j][ll] + ps[j][i][lp].conj() * ps[j][i][ll]) / ( E1[lp].conj() - E1[ll]) fij2_sqrd *= 2 * np.pi * 1j # print(np.real(fij2_sqrd[0])) # croff croff = 0 for i in xrange(nchan): for j in xrange(nchan): croff += g2.fijm(setup, k0, q0, i, j, i1, i2).conj()*g2.fij2(k0 + q0, k0 - q0, ps[i][j], ps[j][i], E1) \ + g2.fijp(setup, k0, q0, i, j, i1, i2).conj()*g2.fij2(k0 - q0, k0 + q0, ps[i][j], ps[j][i], E1) croff = 2 * np.real(croff) # print(croff[0]) assert np.isclose(np.real(fij2_sqrd[0]), -np.real(croff[0]), 1e-6), \ 'Optical theorem broken since: {0} != {1}'.format(np.real(fij2_sqrd[0]), croff[0])
def test_eigenvector_overlaps(): """" Test the eigenbasis """ m = scat.Model([0] * 6, links=[[c, c + 1] for c in xrange(5)], U=[2] * 6) c1 = scat.Channel(sites=[0], strengths=[1.783]) c2 = scat.Channel(sites=[4], strengths=[0.85]) se = scat.Setup(model=m, channels=[c1, c2]) E2, psi2l, psi2r = se.eigenbasis(2) assert np.allclose(np.abs(psi2l.conj().T.dot(psi2r)), np.eye(len(E2))), \ "Basis is not normalized"
def test_tmatrix_oneparticle2(): m = scattering.Model([0] * 2, [[0, 1, 1]], [0] * 2) channels = [ scattering.Channel(site=0, strength=1), scattering.Channel(site=0, strength=1), ] s = scattering.Setup(m, channels) E = 0 _, T1 = tmatrix.one_particle(s, 0, 0, np.array([E])) assert (np.isclose(np.abs(T1[0])**2, 0, 1e-3)) _, T1 = tmatrix.one_particle(s, 0, 1, np.array([E])) assert np.isclose(np.abs(T1[0])**2, 0, 1e-3), \ 'T(1) fails for two side coupled sites. T(1) = {0} != 0.'.format(np.abs(T1[0])**2)
def kerr(E=0, U=0, gs=None): """ Setup the Kerr nonlinear element """ model = scattering.Model(omegas=[E] * 1, links=[], U=[U]) if gs is None: gs = (0.1, 0.1) channels = [] channels.append(scattering.Channel(site=0, strength=gs[0])) channels.append(scattering.Channel(site=0, strength=gs[1])) se = scattering.Setup(model, channels) se.label = 'U={0}'.format(U) return se
def test_tmatrix_oneparticle(): """ Test the S(1) matrix for one example system """ m = scattering.Model([0] * 2, [[0, 1, 1]], [0] * 2) channels = [ scattering.Channel(site=0, strength=1), scattering.Channel(site=1, strength=1), ] s = scattering.Setup(m, channels) E = 0 _, T1 = tmatrix.one_particle(s, 0, 1, np.array([E])) T10num = 2 * np.pi * np.abs(T1[0]) T10ana = 2 * np.pi / (1 + (np.pi)**2) assert np.isclose(T10num, T10ana, 1e-3), \ 'T(1) fails for two-sites coupled in series. T(1) = {0} != {1}.'.format(T10num, T10ana)
def _test_smatrix_optical_theorem2(chlsi): m = scattering.Model(omegas=[0] * 2, links=[[0, 1, .5]], U=[5] * 2) channels = [] channels.append(scattering.Channel(site=0, strength=1)) channels.append(scattering.Channel(site=1, strength=1)) s = scattering.Setup(m, channels) # input statei E = 0 dE = 0 chlsos = [[0, 0], [0, 1], [1, 0], [1, 1]] qs = np.linspace(-100, 100, 8192, endpoint=False) D2s, S2s = [], [] for c, chlso in enumerate(chlsos): qs, D2, S2, S2in = smatrix.two_particle(s, chlsi=chlsi, chlso=chlso, E=E, dE=dE, qs=qs) D2s.append(D2) S2s.append(S2) iq0 = np.where(qs == E / 2)[0][0] dsums = [np.sum(np.abs(D2s[c])**2) for c in xrange(4)] ssums = [np.sum(np.abs(S2s[c])**2) * (qs[1] - qs[0]) for c in xrange(4)] dssums = [ 2 * np.real(np.sum(D2s[c]).conj() * S2s[c][iq0]) for c in xrange(4) ] # Test single particle contribution assert np.isclose(np.sum(dsums), 2, 1e-3), \ 'S(1)S(1) is not normalized (= {0})'.format(np.sum(dsums)) # Test optical theorem assert np.isclose(np.sum(ssums), -np.sum(dssums), 1e-2), \ 'Optical theorem broken, S2.S2 = {0} != -S1.S2 = {1}.'.format(np.sum(ssums), -np.sum(dssums))
def test_tmatrix_vs_ttmatrix(): m = scattering.Model([0] * 2, [[0, 1, 1]], [0] * 2) channels = [ scattering.Channel(site=0, strength=.1), scattering.Channel(site=1, strength=.1), ] se = scattering.Setup(m, channels) E = 0 dE = 0 chlsi = (1, 1) chlso = (1, 1) qs = np.array([.3]) qs, T2, N2 = tmatrix.two_particle(se, chlsi=chlsi, chlso=chlso, E=E, dE=dE, qs=qs, verbal=True) ks, A2, B2, C2 = ttmatrix.two_particle(se, chlsi=chlsi, chlso=chlso, E=E, dE=dE, qs=qs, verbal=True) print('Result:') print(T2) print(A2 + C2) print('Interacting:') print(T2 - N2) print(A2) print('Non-interacting:') print(N2) print(C2)
def compare_g2_fock_state_to_g2_coherent_state(): N, U, = 2, 0 gs = (.2, .1) model = scattering.Model(omegas=[0] * N, links=[(0, 1, 1)], U=[2 * U] * N) channels = [] channels.append(scattering.Channel(site=0, strength=gs[0])) channels.append(scattering.Channel(site=N - 1, strength=gs[1])) setup = scattering.Setup(model, channels) Es = np.linspace(-3, 12, 1024) dE = 0 g2f = np.zeros(Es.shape, dtype=np.complex128) g2c = np.zeros(Es.shape, dtype=np.complex128) for i, E in enumerate(Es): g2s[i], _, _ = g2.fock_state(setup, (0, 0), (1, 1), E, dE)
def test_noninteracting_dimer_eigenenergies(): """Test""" m = scat.Model([0] * 2, [[0, 1, 1.1]], [0] * 2) channels = [ scat.Channel(site=0, strength=1), scat.Channel(site=1, strength=1), ] sp = scat.Setup(m, channels) E1, _, _ = sp.eigenbasis(1) E2, _, _ = sp.eigenbasis(2) E12 = np.zeros((len(E2), ), dtype=np.complex128) for i in xrange(len(E1)): for j in xrange(len(E1)): E12[i + j] = E1[i] + E1[j] E12 = E12[np.argsort(np.real(E12))] E2 = E2[np.argsort(np.real(E2))] assert np.allcose(E2, E12), \ 'Non-interacting dimer, single particle energies do not coincide with the two-particle energies.'
def test_g2_coherent_tau0_and_g2_coherent(): N, U, = 2, 2 gs = (0.1, 0.1) model = scattering.Model(omegas=[0] * N, links=[(0, 1, 1)], U=[2 * U] * N) channels = [] channels.append(scattering.Channel(site=0, strength=gs[0])) channels.append(scattering.Channel(site=N - 1, strength=gs[1])) setup = scattering.Setup(model, channels) Es = np.linspace(-3, 12, 256) g2stau0 = np.zeros((len(Es), ), dtype=np.float64) g2s = np.zeros((len(Es), ), dtype=np.float64) for i, E in enumerate(Es): g2stau0[i] = g2.coherent_state_tau0(setup, (0, 0), (1, 1), E)[0] g2s[i] = g2.coherent_state(setup, (0, 0), (1, 1), E, 0)[0] assert np.allclose(g2stau0, g2s), \ 'g2_coherent_tau0 and g2_coherent do not coincide at tau=0'
def test_noninteracting_dimer_eigenstates(): m = scat.Model([.0] * 2, [[0, 1, 1]], [0] * 2) channels = [ scat.Channel(sites=[0], strengths=[1.]), scat.Channel(sites=[1], strengths=[1.]), ] sp = scat.Setup(m, channels) # One-particle eigenbasis E1, psi1l, psi1r = sp.eigenbasis(1) # Two-particle eigenbasis E2, psi2l, psi2r = sp.eigenbasis(2) B = np.zeros((3, 3), dtype=np.complex128) for i in xrange(2): for j in xrange(2): for m in xrange(2): for n in xrange(2): if m == n: B[m + n, i + j] += np.sqrt(2) * psi1r[m, i] * psi1r[n, j] else: B[m + n, i + j] += psi1r[m, i] * psi1r[n, j] B[:, 0] /= np.sqrt(2) B[:, 1] /= 2 B[:, 2] /= np.sqrt(2) # unphase psi2r *= np.sign(np.real(psi2r[0, :])) B *= np.sign(np.real(B[0, :])) assert np.allclose(psi2r, B), \ 'Non-interacting dimer, single particle states do not coincide with two-particle states'
from __future__ import division, print_function import sys sys.path.append('../') import numpy as np import scattering import smatrix import matplotlib.pyplot as plt # model N = 2 m = scattering.Model( omegas=[0] * N, links=[(0, 1, .5)], U=[5] * N) # channel channels = [] channels.append(scattering.Channel(site=0, strength=1)) channels.append(scattering.Channel(site=1, strength=1)) # setup s = scattering.Setup(m, channels) # input state E = 0 dE = 4.38821403174 chlsi = [0, 0] # output state chlsos = [[0, 0], [0, 1], [1, 0], [1, 1]] qs = np.linspace(-.1, .1, 8192, endpoint=False)
def _test_smatrix_optical_theorem(domega, dE, chlsi, verbose=False): E = 0 m = scattering.Model(omegas=[0] * 2, links=[[0, 1, .5]], U=[5] * 2) channels = [] channels.append(scattering.Channel(site=0, strength=1)) channels.append(scattering.Channel(site=1, strength=1)) s = scattering.Setup(m, channels) # input statei chlsos = [[0, 0], [0, 1], [1, 0], [1, 1]] d = 100 # 50 / np.max(np.abs(dE), .5) print(d) qs, iq0 = scattering.energies(E, dE, N=8192, WE=2 * d) D2s, S2s = [], [] for c, chlso in enumerate(chlsos): qs, D2, S2, S2in = smatrix.two_particle(s, chlsi=chlsi, chlso=chlso, E=E, dE=dE, qs=qs) D2s.append(D2) S2s.append(S2) # iq0s = [np.where(np.isclose(qs, (E - dE) / 2))[0][0], np.where(np.isclose(qs, (E + dE) / 2))[0][0]] dsums = [.5 * np.sum(np.abs(D2s[c])**2) for c in xrange(4)] ssums = [ .5 * np.sum(np.abs(S2s[c])**2) * (qs[1] - qs[0]) for c in xrange(4) ] dssums = [ .5 * 2 * np.real(np.sum(D2s[c]).conj() * S2s[c][iq0]) for c in xrange(4) ] # dsums = [.5 * np.sum(np.abs(D2s[c]) ** 2) for c in xrange(4)] # ssums = [.5 * np.sum(np.abs(S2s[c]) ** 2) * (qs[1] - qs[0]) for c in xrange(4)] # dssums = [.5 * 2 * np.real(np.sum(D2s[c].conj() * S2s[c][iq0])) for c in xrange(4)] if verbose: print('For d(2) = {} and dE = {}:'.format(domega, dE)) # Test single particle contribution assert np.isclose(np.sum(dsums), 1, 1e-3), \ 'S(1)S(1) is not normalized (= {0})'.format(np.sum(dsums)) if verbose: print('S1.S1 norm is: {0}'.format(np.sum(dsums))) # Test optical theorem assert np.isclose(np.sum(ssums), -np.sum(dssums), 1e-2), \ 'Optical theorem broken for parameters: E={0}, dE={1}, chlsi={2}.'.format(E, dE, chlsi) + \ '\n' + \ 'Compare S2.S2 = {0} != -S1.S2 = {1}.'.format(np.sum(ssums), -np.sum(dssums)) if verbose: print('Compare S2.S2 = {0} to -S1.S2 = {1}.'.format( np.sum(ssums), -np.sum(dssums)))