Esempio n. 1
0
 def test_param_circle(self, n):
     bz = BrillouinZone.param_circle(1, 10, 0.1, n, [1 / 2] * 3)
     assert len(bz) == 10
     sc = SuperCell(1)
     bz_loop = BrillouinZone.param_circle(sc, 10, 0.1, n, [1 / 2] * 3, True)
     assert len(bz_loop) == 10
     assert not np.allclose(bz.k, bz_loop.k)
     assert np.allclose(bz_loop.k[0, :], bz_loop.k[-1, :])
Esempio n. 2
0
 def test_class1(self, setup):
     class Test(SuperCellChild):
         def __init__(self, sc):
             self.set_supercell(sc)
         def eigh(self, k, *args, **kwargs):
             return np.arange(3)
         def eig(self, k, *args, **kwargs):
             return np.arange(3) - 1
     bz = BrillouinZone(Test(setup.s1))
     str(bz)
     assert np.allclose(bz.eigh(), np.arange(3))
     assert np.allclose(bz.eig(), np.arange(3)-1)
Esempio n. 3
0
 def test_bz1(self):
     bz = BrillouinZone(1.)
     bz.weight
     bz = BrillouinZone(self.s1)
     assert_equal(len(bz), 1)
     assert_true(np.allclose(bz.k([0, 0, 0]), [0] * 3))
     assert_true(np.allclose(bz.k([0.5, 0, 0]), [m.pi, 0, 0]))
     assert_true(np.allclose(bz.kb([0, 0, 0]), [0] * 3))
     assert_true(np.allclose([0.5, 0, 0], bz.k(bz.kb([0.5, 0, 0]))))
     for k in bz:
         assert_true(np.allclose(k, np.zeros(3)))
 def test_bz1(self, setup):
     bz = BrillouinZone(1.)
     repr(bz)
     bz.weight
     bz = BrillouinZone(setup.s1)
     assert len(bz) == 1
     assert np.allclose(bz.tocartesian([0, 0, 0]), [0] * 3)
     assert np.allclose(bz.tocartesian([0.5, 0, 0]), [m.pi, 0, 0])
     assert np.allclose(bz.toreduced([0, 0, 0]), [0] * 3)
     assert np.allclose([0.5, 0, 0], bz.tocartesian(bz.toreduced([0.5, 0, 0])))
     for k in bz:
         assert np.allclose(k, np.zeros(3))
Esempio n. 5
0
    def test_class2(self, setup):
        class Test(SuperCellChild):
            def __init__(self, sc):
                self.set_supercell(sc)

            def eigh(self, k, *args, **kwargs):
                return np.arange(3)

            def eig(self, k, *args, **kwargs):
                return np.arange(3) - 1

        bz = BrillouinZone(Test(setup.s1))
        # Try the list/yield method
        for val in bz.apply.list.eigh():
            assert np.allclose(val, np.arange(3))
        for val in bz.apply.iter.eigh():
            assert np.allclose(val, np.arange(3))
        for val in bz.apply.iter.eig():
            assert np.allclose(val, np.arange(3) - 1)
        for val in bz.apply.oplist.eigh():
            assert np.allclose(val, np.arange(3))
        # Average
        bz_average = bz.apply.average
        assert np.allclose(bz_average.eigh(), np.arange(3))
        assert np.allclose(bz_average.eigh(eta=True), np.arange(3))
        assert np.allclose(bz.apply.eigh.average(eta=True), np.arange(3))
Esempio n. 6
0
    def test_bz_parametrize_integer(self, setup):
        # parametrize for single integers
        def func(parent, N, i):
            return [i / N, 0, 0]

        bz = BrillouinZone.parametrize(setup.s1, func, 10)
        assert len(bz) == 10
        assert np.allclose(bz.k[-1], [9 / 10, 0, 0])
Esempio n. 7
0
 def test_brillouinzone_pickle(self, setup):
     import pickle as p
     bz1 = BrillouinZone(geom.graphene(), [[0] * 3, [0.25] * 3], [1/2] * 2)
     n = p.dumps(bz1)
     bz2 = p.loads(n)
     assert np.allclose(bz1.k, bz2.k)
     assert np.allclose(bz1.weight, bz2.weight)
     assert bz1.parent == bz2.parent
Esempio n. 8
0
 def test_bz_volume_direct(self):
     bz = BrillouinZone(1.)
     assert bz.volume(True, [0, 1])[1] == 2
     assert bz.volume(True, [1])[1] == 1
     assert bz.volume(True, [2, 1])[1] == 2
     assert bz.volume(True, [2, 1, 0])[1] == 3
     assert bz.volume(True, [])[1] == 0
Esempio n. 9
0
    def test_bz_parametrize_list(self, setup):
        # parametrize for single integers
        def func(parent, N, i):
            return [i[0] / N[0], i[1] / N[1], 0]

        bz = BrillouinZone.parametrize(setup.s1, func, [10, 2])
        assert len(bz) == 20
        assert np.allclose(bz.k[-1], [9 / 10, 1 / 2, 0])
        assert np.allclose(bz.k[-2], [9 / 10, 0 / 2, 0])
Esempio n. 10
0
 def test_berry_phase_method_fail(self):
     g = Geometry([[-.6, 0, 0], [0.6, 0, 0]], Atom(1, 1.001), sc=[2, 10, 10])
     g.set_nsc([3, 1, 1])
     H = Hamiltonian(g)
     H.construct([(0.1, 1.0, 1.5), (0, 1., 0.5)])
     # Contour
     k = np.linspace(0.0, 1.0, 101)
     K = np.zeros([k.size, 3])
     K[:, 0] = k
     bz = BrillouinZone(H, K)
     berry_phase(bz, method='unknown')
Esempio n. 11
0
 def test_berry_phase_zak(self):
     # SSH model, topological cell
     g = Geometry([[-.6, 0, 0], [0.6, 0, 0]], Atom(1, 1.001), sc=[2, 10, 10])
     g.set_nsc([3, 1, 1])
     H = Hamiltonian(g)
     H.construct([(0.1, 1.0, 1.5), (0, 1., 0.5)])
     # Contour
     k = np.linspace(0.0, 1.0, 101)
     K = np.zeros([k.size, 3])
     K[:, 0] = k
     bz = BrillouinZone(H, K)
     assert np.allclose(np.abs(berry_phase(bz, sub=0, method='zak')), np.pi)
     # Just to do the other branch
     berry_phase(bz, method='zak')
Esempio n. 12
0
def test_real_space_H_3d():
    sc = SuperCell(1., nsc=[3] * 3)
    H = Atom(Z=1, R=[1.001])
    geom = Geometry([0] * 3, atoms=H, sc=sc)
    H = Hamiltonian(geom)
    H.construct(([0.001, 1.01], (0, -1)))
    RSE = RealSpaceSE(H, 0, [1, 2], (3, 4, 2))
    RSE.set_options(dk=100, trs=True)
    RSE.initialize()
    nk = np.ones(3, np.int32)
    nk[[1, 2]] = 23
    bz = BrillouinZone(H, nk)
    RSE.set_options(bz=bz)

    RSE.green(0.1)
    # Since there is only 2 repetitions along one direction we will have the full matrix
    # coupled!
    assert np.allclose(RSE.self_energy(0.1), RSE.self_energy(0.1, coupling=True))
    assert np.allclose(RSE.self_energy(0.1, bulk=True), RSE.self_energy(0.1, bulk=True, coupling=True))
Esempio n. 13
0
    def test_class2(self):
        class Test(SuperCellChild):
            def __init__(self, sc):
                self.set_supercell(sc)

            def eigh(self, k, *args, **kwargs):
                return np.arange(3)

            def eig(self, k, *args, **kwargs):
                return np.arange(3) - 1

        bz = BrillouinZone(Test(self.s1))
        # Yields
        bz.yields()
        for val in bz.eigh():
            assert_true(np.allclose(val, np.arange(3)))
        for val in bz.eig():
            assert_true(np.allclose(val, np.arange(3) - 1))
        # Average
        assert_true(np.allclose(bz.average().eigh(), np.arange(3)))
Esempio n. 14
0
 def test_to_reduced(self, setup):
     bz = BrillouinZone(setup.s2)
     for k in [[0.1] * 3, [0.2] * 3]:
         cart = bz.tocartesian(k)
         rec = bz.toreduced(cart)
         assert np.allclose(rec, k)
Esempio n. 15
0
 def test_default_weight(self):
     bz1 = BrillouinZone(geom.graphene(), [[0] * 3, [0.25] * 3],
                         [1 / 2] * 2)
     bz2 = BrillouinZone(geom.graphene(), [[0] * 3, [0.25] * 3])
     assert np.allclose(bz1.k, bz2.k)
     assert np.allclose(bz1.weight, bz2.weight)
Esempio n. 16
0
 def test_bz_fail(self, setup):
     with pytest.raises(ValueError):
         BrillouinZone(setup.s1, [0] * 3, [.5] * 2)
Esempio n. 17
0
    def test_bz1(self, setup):
        bz = BrillouinZone(1.)
        str(bz)
        bz.weight
        bz = BrillouinZone(setup.s1)
        assert len(bz) == 1
        assert np.allclose(bz.tocartesian([0, 0, 0]), [0] * 3)
        assert np.allclose(bz.tocartesian([0.5, 0, 0]), [m.pi, 0, 0])
        assert np.allclose(bz.toreduced([0, 0, 0]), [0] * 3)
        assert np.allclose([0.5, 0, 0],
                           bz.tocartesian(bz.toreduced([0.5, 0, 0])))
        for k in bz:
            assert np.allclose(k, np.zeros(3))

        w = 0.
        for k, wk in bz.iter(True):
            assert np.allclose(k, np.zeros(3))
            w += wk
        assert w == pytest.approx(1.)

        bz = BrillouinZone(setup.s1, [[0] * 3, [0.5] * 3], [.5] * 2)
        assert len(bz) == 2
        assert len(bz.copy()) == 2
Esempio n. 18
0
 def test_bz_fail(self, setup):
     BrillouinZone(setup.s1, [0] * 3, [.5] * 2)
Esempio n. 19
0
    k = [0, 0.13, 0]

    # Check that left/right are different

    L_SE = SL.self_energy(E, k, bulk=True)
    R_SE = SR.self_energy(E, k)
    g = np.linalg.inv(L_SE - R_SE)
    G = SL.green(E, k)
    assert np.allclose(g, G)
    assert np.allclose(SL.green(E, k), SR.green(E, k))


@pytest.mark.parametrize("k_axes", [0, 1])
@pytest.mark.parametrize("semi_axis", [0, 1])
@pytest.mark.parametrize("trs", [True, False])
@pytest.mark.parametrize("bz", [None, BrillouinZone([1])])
@pytest.mark.parametrize("unfold", [1, 2])
def test_real_space_HS(setup, k_axes, semi_axis, trs, bz, unfold):
    if k_axes == semi_axis:
        return
    RSE = RealSpaceSE(setup.HS, semi_axis, k_axes, (unfold, unfold, unfold))
    RSE.set_options(dk=100, trs=trs, bz=bz)
    RSE.initialize()
    RSE.green(0.1)


@pytest.mark.parametrize("k_axes", [0, 1])
@pytest.mark.parametrize("semi_axis", [0, 1])
@pytest.mark.parametrize("trs", [True, False])
@pytest.mark.parametrize("bz", [None, BrillouinZone([1])])
@pytest.mark.parametrize("unfold", [1, 2])
Esempio n. 20
0
 def test_bz_volume_self(self):
     bz = BrillouinZone(1.)
     assert bz.volume(True)[1] == 0
     bz = BrillouinZone(SuperCell(1, nsc=[3, 1, 1]))
     assert bz.volume(True)[1] == 1
     bz = BrillouinZone(SuperCell(1, nsc=[3, 3, 1]))
     assert bz.volume(True)[1] == 2
     bz = BrillouinZone(SuperCell(1, nsc=[3, 3, 3]))
     assert bz.volume(True)[1] == 3