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, :])
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)
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))
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))
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])
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
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
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])
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')
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')
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))
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)))
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)
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)
def test_bz_fail(self, setup): with pytest.raises(ValueError): BrillouinZone(setup.s1, [0] * 3, [.5] * 2)
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
def test_bz_fail(self, setup): BrillouinZone(setup.s1, [0] * 3, [.5] * 2)
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])
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