Example #1
0
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()
Example #2
0
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))
Example #3
0
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()
Example #4
0
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'
Example #5
0
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'
Example #6
0
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)
Example #7
0
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])
Example #8
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"
Example #9
0
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)
Example #10
0
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
Example #11
0
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)
Example #12
0
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))
Example #13
0
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)
Example #14
0
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)
Example #15
0
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.'
Example #16
0
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'
Example #17
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'
Example #18
0
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)

d = 120
# qs = np.linspace(-d, d, 8192, endpoint=False)
qs, iq0 = scattering.energies(E, dE, N=2*8192, WE=2 * d)

plt.figure(figsize=(6, 6))
Example #19
0
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)))