예제 #1
0
def test_multi_sites_combine_charges():
    spin = site.SpinSite(0.5, 'Sz')
    spin1 = site.SpinSite(1, 'Sz')
    ferm = site.SpinHalfFermionSite(cons_N='N', cons_Sz='Sz')
    spin_ops = {
        op_name: get_site_op_flat(spin, op_name)
        for op_name in spin.opnames
    }
    spin1_ops = {
        op_name: get_site_op_flat(spin1, op_name)
        for op_name in spin1.opnames
    }
    ferm_ops = {
        op_name: get_site_op_flat(ferm, op_name)
        for op_name in ferm.opnames
    }
    site.multi_sites_combine_charges([spin, ferm])
    assert tuple(spin.leg.chinfo.names) == ('2*Sz', 'N', 'Sz')
    spin.test_sanity()
    ferm.test_sanity()
    for op_name, op_flat in spin_ops.items():
        op_flat2 = get_site_op_flat(spin, op_name)
        npt.assert_equal(op_flat, op_flat2)
    for op_name, op_flat in ferm_ops.items():
        op_flat2 = get_site_op_flat(ferm, op_name)
        npt.assert_equal(op_flat, op_flat2)

    spin = site.SpinSite(0.5, 'Sz')
    ferm = site.SpinHalfFermionSite(cons_N='N', cons_Sz='Sz')
    site.multi_sites_combine_charges([ferm, spin],
                                     same_charges=[[(0, 'Sz'), (1, '2*Sz')]])
    assert tuple(ferm.leg.chinfo.names) == ('N', 'Sz')
    spin.test_sanity()
    ferm.test_sanity()
    for op_name, op_flat in spin_ops.items():
        op_flat2 = get_site_op_flat(spin, op_name)
        npt.assert_equal(op_flat, op_flat2)
    for op_name, op_flat in ferm_ops.items():
        op_flat2 = get_site_op_flat(ferm, op_name)
        npt.assert_equal(op_flat, op_flat2)

    # and finally a few more, changing orders as well
    ferm = site.SpinHalfFermionSite(cons_N='N', cons_Sz='Sz')
    spin = site.SpinSite(0.5, 'Sz')
    spin1 = site.SpinSite(1, 'Sz')
    site.multi_sites_combine_charges([ferm, spin1, spin],
                                     same_charges=[[(0, 'Sz'), (2, '2*Sz')]])
    assert tuple(ferm.leg.chinfo.names) == ('N', 'Sz', '2*Sz')
    spin.test_sanity()
    ferm.test_sanity()
    spin1.test_sanity()
    for op_name, op_flat in spin_ops.items():
        op_flat2 = get_site_op_flat(spin, op_name)
        npt.assert_equal(op_flat, op_flat2)
    for op_name, op_flat in ferm_ops.items():
        op_flat2 = get_site_op_flat(ferm, op_name)
        npt.assert_equal(op_flat, op_flat2)
    for op_name, op_flat in spin1_ops.items():
        op_flat2 = get_site_op_flat(spin1, op_name)
        npt.assert_equal(op_flat, op_flat2)
예제 #2
0
def test_spin_site_ops():
    for s in [0.5, 1, 1.5, 2, 5]:
        sites = []
        for conserve in [None, 'Sz', 'parity']:
            S = site.SpinSite(s, conserve)
            sites.append(S)
        check_same_operators(sites)
예제 #3
0
def test_IrregularLattice():
    s1 = site.SpinHalfSite('Sz')
    s2 = site.SpinSite(0.5, 'Sz')
    reg = lattice.Honeycomb(3, 3, [s1, s2], bc=['open', 'periodic'])
    ir = lattice.IrregularLattice(reg, [[1, 1, 0], [1, 1, 1], [0, 0, 0]],
                                  ([[1, 1, 2], [1, 1, 3]], [7, 10]), [s2, s2],
                                  [[-0.1, 0.0], [0.1, 0.0]])
    known = {  # written down by hand for this particular case
        (0, 1, (0, 0)): {'i': [5, 11, 0, 12, 1, 7, 13], 'j': [8, 14, 3, 15, 4, 10, 16]},
        (1, 0, (1, 0)): {'i': [ 2,  8,  4, 10], 'j': [5, 11, 7, 13]},
        (1, 0, (0, 1)): {'i': [ 2,  14,  3, 15, 10, 16], 'j': [0, 12, 1, 13, 5, 11]},
    }
    for (u0, u1, dx), expect in known.items():
        i, j, lat, sh = ir.possible_couplings(u0, u1, dx)
        print(i, j)
        sort = np.lexsort(lat.T)
        i = i[sort]
        j = j[sort]
        npt.assert_equal(i, np.array(expect['i']))
        npt.assert_equal(j, np.array(expect['j']))

        ops = [(None, dx, u1), (None, [0, 0], u0)]
        m_ji, m_lat_indices, m_coupling_shape = ir.possible_multi_couplings(ops)
        sort = np.lexsort(m_lat_indices.T)
        npt.assert_equal(m_ji[sort, 1], np.array(expect['i']))
        npt.assert_equal(m_ji[sort, 0], np.array(expect['j']))
예제 #4
0
def test_spin_site():
    for s in [0.5, 1, 1.5, 2, 5]:
        print('s = ', s)
        for conserve in [None, 'Sz', 'parity']:
            print("conserve = ", conserve)
            S = site.SpinSite(s, conserve)
            S.test_sanity()
            if conserve != 'Sz':
                SxSy = ['Sx', 'Sy']
            else:
                SxSy = None
            check_spin_site(S, SxSy=SxSy)
예제 #5
0
def test_spin_site():
    hcs = dict(Id='Id', JW='JW', Sx='Sx', Sy='Sy', Sz='Sz', Sp='Sm', Sm='Sp')
    for s in [0.5, 1, 1.5, 2, 5]:
        print('s = ', s)
        sites = []
        for conserve in [None, 'Sz', 'parity']:
            print("conserve = ", conserve)
            S = site.SpinSite(s, conserve)
            S.test_sanity()
            for op in S.onsite_ops:
                assert S.hc_ops[op] == hcs[op]
            if conserve != 'Sz':
                SxSy = ['Sx', 'Sy']
            else:
                SxSy = None
            check_spin_site(S, SxSy=SxSy)
            sites.append(S)
        check_same_operators(sites)
예제 #6
0
def test_TrivialLattice():
    s1 = site.SpinHalfSite('Sz')
    s2 = site.SpinSite(0.5, 'Sz')
    s3 = site.SpinSite(1.0, 'Sz')
    lat = lattice.TrivialLattice([s1, s2, s3, s2, s1])
    lat.test_sanity()
예제 #7
0
def test_set_common_charges():
    spin = site.SpinSite(0.5, 'Sz')
    spin1 = site.SpinSite(1, 'Sz')
    ferm = site.SpinHalfFermionSite(cons_N='N', cons_Sz='Sz')
    boson = site.BosonSite(2, 'N')
    spin_ops = {
        op_name: get_site_op_flat(spin, op_name)
        for op_name in spin.opnames
    }
    spin1_ops = {
        op_name: get_site_op_flat(spin1, op_name)
        for op_name in spin1.opnames
    }
    ferm_ops = {
        op_name: get_site_op_flat(ferm, op_name)
        for op_name in ferm.opnames
    }
    boson_ops = {
        op_name: get_site_op_flat(boson, op_name)
        for op_name in boson.opnames
    }
    site.set_common_charges([spin, ferm])
    assert tuple(spin.leg.chinfo.names) == ('2*Sz', 'N')
    spin.test_sanity()
    ferm.test_sanity()
    for op_name, op_flat in spin_ops.items():
        op_flat2 = get_site_op_flat(spin, op_name)
        npt.assert_equal(op_flat, op_flat2)
    for op_name, op_flat in ferm_ops.items():
        op_flat2 = get_site_op_flat(ferm, op_name)
        npt.assert_equal(op_flat, op_flat2)

    spin = site.SpinSite(0.5, 'Sz')
    ferm = site.SpinHalfFermionSite(cons_N='N', cons_Sz='Sz')
    site.set_common_charges([ferm, spin],
                            new_charges=[[(1, 0, '2*Sz'), (1, 1, '2*Sz')]])
    assert tuple(ferm.leg.chinfo.names) == ('2*Sz', )
    spin.test_sanity()
    ferm.test_sanity()
    for op_name, op_flat in spin_ops.items():
        op_flat2 = get_site_op_flat(spin, op_name)
        npt.assert_equal(op_flat, op_flat2)
    for op_name, op_flat in ferm_ops.items():
        op_flat2 = get_site_op_flat(ferm, op_name)
        npt.assert_equal(op_flat, op_flat2)

    # and finally a few more, changing orders as well
    ferm = site.SpinHalfFermionSite(cons_N='N', cons_Sz='Sz')
    spin = site.SpinSite(0.5, 'Sz')
    spin1 = site.SpinSite(1, 'Sz')
    boson = site.BosonSite(2, 'N')

    site.set_common_charges(
        [ferm, spin1, spin, boson],
        new_charges=[[(1, 0, '2*Sz'), (1, 2, '2*Sz')],
                     [(2, 0, 'N'), (1, 3, 'N')], [(0.5, 1, '2*Sz')]],
        new_names=['2*(Sz_f + Sz_spin-half)', '2*N_f+N_b', 'Sz_spin-1'])
    assert tuple(ferm.leg.chinfo.names) == ('2*(Sz_f + Sz_spin-half)',
                                            '2*N_f+N_b', 'Sz_spin-1')
    spin.test_sanity()
    ferm.test_sanity()
    spin1.test_sanity()
    boson.test_sanity()
    for op_name, op_flat in spin_ops.items():
        op_flat2 = get_site_op_flat(spin, op_name)
        npt.assert_equal(op_flat, op_flat2)
    for op_name, op_flat in ferm_ops.items():
        op_flat2 = get_site_op_flat(ferm, op_name)
        npt.assert_equal(op_flat, op_flat2)
    for op_name, op_flat in spin1_ops.items():
        op_flat2 = get_site_op_flat(spin1, op_name)
        npt.assert_equal(op_flat, op_flat2)
    for op_name, op_flat in boson_ops.items():
        op_flat2 = get_site_op_flat(boson, op_name)
        npt.assert_equal(op_flat, op_flat2)