def test_hopping_generator(): """Generated next-nearest hoppings should produce the same result as the builtin lattice""" from scipy.spatial import cKDTree @pb.hopping_generator("tnn_test", energy=graphene.t_nn) def next_nearest(x, y, z): pos = np.stack([x, y, z], axis=1) dmin = graphene.a * 0.95 dmax = graphene.a * 1.05 kdtree = cKDTree(pos) coo = kdtree.sparse_distance_matrix(kdtree, dmax).tocoo() idx = coo.data > dmin return coo.row[idx], coo.col[idx] @pb.onsite_energy_modifier def onsite_offset(energy): return energy + 3 * graphene.t_nn model = pb.Model(graphene.monolayer(), next_nearest, onsite_offset, graphene.hexagon_ac(1)) expected = pb.Model(graphene.monolayer(2), graphene.hexagon_ac(1)) assert pytest.fuzzy_equal(model.hamiltonian, expected.hamiltonian) @pb.hopping_generator("t_new", energy=1.0) def bad_generator(): """Different array lengths""" return [0, 1, 2], [0, 1] model = pb.Model(graphene.monolayer(), pb.primitive(3, 3), bad_generator) with pytest.raises(RuntimeError) as excinfo: model.eval() assert "the number of `from` and `to` indices must be equal" in str( excinfo.value)
def factory(v1, v2, energy=np.linspace(0, 0.1, 10)): model = pb.Model(graphene.monolayer(), graphene.hexagon_ac(side_width=15), pb.constant_potential(v1), pb.constant_potential(v2)) kpm = pb.greens.kpm(model) return kpm.deferred_ldos(energy, broadening=0.15, position=[0, 0])
def test_ldos_sublattice(): """LDOS for A and B sublattices should be antisymmetric for graphene with a mass term""" model = pb.Model(graphene.monolayer(), graphene.hexagon_ac(10), graphene.mass_term(1)) kpm = pb.greens.kpm(model) a, b = (kpm.calc_ldos(np.linspace(-5, 5, 50), 0.1, [0, 0], sub) for sub in ('A', 'B')) assert pytest.fuzzy_equal(a.ldos, b.ldos[::-1], rtol=1e-3, atol=1e-6)
def test_ldos_sublattice(): """LDOS for A and B sublattices should be antisymmetric for graphene with a mass term""" model = pb.Model(graphene.monolayer(), graphene.hexagon_ac(10), graphene.mass_term(1)) kpm = pb.chebyshev.kpm(model) a, b = (kpm.calc_ldos(np.linspace(-5, 5, 50), 0.1, [0, 0], sub) for sub in ('A', 'B')) assert pytest.fuzzy_equal(a.ldos, b.ldos[::-1], rtol=1e-3, atol=1e-6)
def factory(v, energy=np.linspace(0, 0.1, 10)): model = pb.Model( graphene.monolayer(), graphene.hexagon_ac(side_width=15), pb.constant_potential(v) ) kpm = pb.greens.kpm(model) return kpm.deferred_ldos(energy, broadening=0.15, position=[0, 0])
def factory(v, energy=np.linspace(0, 0.1, 10)): model = pb.Model(graphene.monolayer(), graphene.hexagon_ac(side_width=15), pb.constant_potential(v)) kpm = pb.kpm(model, kernel=pb.lorentz_kernel()) return kpm.deferred_ldos(energy, broadening=0.15, position=[0, 0], sublattice="B")
def test_optimized_hamiltonian(): """Currently available only in internal interface""" from pybinding import _cpp model = pb.Model(graphene.monolayer(), graphene.hexagon_ac(10)) h = model.hamiltonian oh = _cpp.OptimizedHamiltonian(model.raw_hamiltonian, 0) assert oh.matrix.shape == h.shape assert oh.sizes[-1] == h.shape[0] assert len(oh.indices) == h.shape[0]
def test_optimized_hamiltonian(): """Currently available only in internal interface""" from pybinding import _cpp model = pb.Model(graphene.monolayer(), graphene.hexagon_ac(10)) h = model.hamiltonian oh = _cpp.OptimizedHamiltonian(model.raw_hamiltonian, 0) assert oh.matrix.shape == h.shape assert oh.sizes[-1] == h.shape[0] assert len(oh.indices) == h.shape[0]
def test_kpm_reuse(): """KPM should return the same result when a single object is used for multiple calculations""" model = pb.Model(graphene.monolayer(), graphene.hexagon_ac(10)) kpm = pb.greens.kpm(model) energy = np.linspace(-5, 5, 50) broadening = 0.1 for position in [0, 0], [6, 0]: actual = kpm.calc_ldos(energy, broadening, position) expected = pb.greens.kpm(model).calc_ldos(energy, broadening, position) assert pytest.fuzzy_equal(actual, expected, rtol=1e-3, atol=1e-6)
def test_kpm_reuse(): """KPM should return the same result when a single object is used for multiple calculations""" model = pb.Model(graphene.monolayer(), graphene.hexagon_ac(10)) kpm = pb.chebyshev.kpm(model) energy = np.linspace(-5, 5, 50) broadening = 0.1 for position in [0, 0], [6, 0]: actual = kpm.calc_ldos(energy, broadening, position) expected = pb.chebyshev.kpm(model).calc_ldos(energy, broadening, position) assert pytest.fuzzy_equal(actual, expected, rtol=1e-3, atol=1e-6)
def test_hopping_generator(): """Generated next-nearest hoppings should produce the same result as the builtin lattice""" from scipy.spatial import cKDTree @pb.hopping_generator("tnn_test", energy=graphene.t_nn) def next_nearest(x, y, z): pos = np.stack([x, y, z], axis=1) dmin = graphene.a * 0.95 dmax = graphene.a * 1.05 kdtree = cKDTree(pos) coo = kdtree.sparse_distance_matrix(kdtree, dmax).tocoo() idx = coo.data > dmin return coo.row[idx], coo.col[idx] @pb.onsite_energy_modifier def onsite_offset(energy): return energy + 3 * graphene.t_nn model = pb.Model(graphene.monolayer(), next_nearest, onsite_offset, graphene.hexagon_ac(1)) expected = pb.Model(graphene.monolayer(2), graphene.hexagon_ac(1)) assert pytest.fuzzy_equal(model.hamiltonian, expected.hamiltonian)
def test_site_generator(): """Generated some disordered sites""" @pb.site_generator("New", energy=0.4) def site_gen(): x = [10, 20, 30] y = [1, 2, 3] z = [0, -1, -2] return x, y, z model = pb.Model(graphene.monolayer(), graphene.hexagon_ac(1), site_gen) s = model.system[model.system.x >= 10] assert s.num_sites == 3 assert pytest.fuzzy_equal(s.x, [10, 20, 30]) assert pytest.fuzzy_equal(s.y, [1, 2, 3]) assert pytest.fuzzy_equal(s.z, [0, -1, -2])
import pybinding as pb from pybinding.repository import graphene import matplotlib.pyplot as plt from math import pi pb.pltutils.use_style() model = pb.Model( graphene.monolayer(), pb.rectangle(x=2, y=1.2) ) model.plot() plt.show() model = pb.Model( graphene.monolayer(), pb.regular_polygon(num_sides=6, radius=1.4, angle=pi/6) ) model.plot() plt.show() # A graphene-specific shape which guaranties armchair edges on all sides model = pb.Model( graphene.bilayer(), graphene.hexagon_ac(side_width=1) ) model.plot() plt.show()
import pytest import pybinding as pb from pybinding.repository import graphene models = { 'graphene-monolayer': [graphene.monolayer(), graphene.hexagon_ac(1)], 'graphene-monolayer-alt': [graphene.monolayer_alt(), pb.rectangle(1.6, 1.4)], 'graphene-monolayer-4atom': [graphene.monolayer_4atom()], 'graphene-monolayer-nn': [graphene.monolayer(2), pb.regular_polygon(6, 0.9)], 'graphene-monolayer-periodic-1d': [graphene.monolayer(), pb.primitive(5, 5), pb.translational_symmetry(a1=True, a2=False)], 'graphene-monolayer-periodic-1d-alt': [graphene.monolayer_4atom(), pb.rectangle(1), pb.translational_symmetry(a1=False, a2=0.6)], 'graphene-monolayer-periodic-2d': [graphene.monolayer(), pb.primitive(a1=5, a2=5), pb.translational_symmetry(a1=1, a2=1)], 'graphene-monolayer-4atom-periodic-2d': [graphene.monolayer_4atom(), pb.rectangle(1), pb.translational_symmetry(a1=0.6, a2=0.6)], 'graphene-bilayer': [graphene.bilayer(), graphene.hexagon_ac(0.6)], } @pytest.fixture(scope='module', ids=list(models.keys()), params=models.values()) def model(request): return pb.Model(*request.param) def test_api(): model = pb.Model(graphene.monolayer(), pb.primitive(2, 2)) system = model.system
def test_system_plot(compare_figure): model = pb.Model(graphene.bilayer(), graphene.hexagon_ac(0.1)) with compare_figure() as chk: model.system.plot() assert chk.passed
import pytest import numpy as np import pybinding as pb from pybinding.repository import graphene, group6_tmd models = { 'graphene-monolayer': [graphene.monolayer(), graphene.hexagon_ac(1)], 'graphene-monolayer-alt': [graphene.monolayer_alt(), pb.rectangle(1.6, 1.4)], 'graphene-monolayer-4atom': [graphene.monolayer_4atom()], 'graphene-monolayer-nn': [graphene.monolayer(2), pb.regular_polygon(6, 0.9)], 'graphene-monolayer-periodic-1d': [graphene.monolayer(), pb.primitive(5, 5), pb.translational_symmetry(a1=True, a2=False)], 'graphene-monolayer-periodic-1d-alt': [graphene.monolayer_4atom(), pb.rectangle(1), pb.translational_symmetry(a1=False, a2=0.6)], 'graphene-monolayer-periodic-2d': [graphene.monolayer(), pb.primitive(a1=5, a2=5), pb.translational_symmetry(a1=1, a2=1)], 'graphene-monolayer-4atom-periodic-2d': [graphene.monolayer_4atom(), pb.rectangle(1), pb.translational_symmetry(a1=0.6, a2=0.6)], 'graphene-bilayer': [graphene.bilayer(), graphene.hexagon_ac(0.6)], } @pytest.fixture(scope='module', ids=list(models.keys()), params=models.values()) def model(request): return pb.Model(*request.param) def test_pickle_round_trip(model): import pickle unpickled = pickle.loads(pickle.dumps(model.system))
import pytest import numpy as np import pybinding as pb from pybinding.repository import graphene, group6_tmd models = { 'graphene-monolayer': [graphene.monolayer(), graphene.hexagon_ac(1)], 'graphene-monolayer-alt': [graphene.monolayer_alt(), pb.rectangle(1.6, 1.4)], 'graphene-monolayer-4atom': [graphene.monolayer_4atom()], 'graphene-monolayer-nn': [graphene.monolayer(2), pb.regular_polygon(6, 0.9)], 'graphene-monolayer-periodic-1d': [ graphene.monolayer(), pb.primitive(5, 5), pb.translational_symmetry(a1=True, a2=False) ], 'graphene-monolayer-periodic-1d-alt': [ graphene.monolayer_4atom(), pb.rectangle(1), pb.translational_symmetry(a1=False, a2=0.6) ], 'graphene-monolayer-periodic-2d': [ graphene.monolayer(), pb.primitive(a1=5, a2=5), pb.translational_symmetry(a1=1, a2=1) ], 'graphene-monolayer-4atom-periodic-2d': [
def test_system_plot(compare_figure): model = pb.Model(graphene.bilayer(), graphene.hexagon_ac(0.1)) with compare_figure() as chk: model.system.plot() assert chk.passed
#!/usr/bin python # -*- encoding: utf-8 -*- ''' @Author : Celeste Young @File : 石墨烯单层.py @Time : 2021/9/18 16:25 @E-mail : [email protected] @Tips : ''' """Several finite-sized systems created using builtin lattices and shapes""" import pybinding as pb from pybinding.repository import graphene import matplotlib.pyplot as plt from math import pi pb.pltutils.use_style() model_1 = pb.Model( graphene.monolayer(), # pb.rectangle(x=2, y=1.2) pb.regular_polygon(num_sides=6, radius=1.4)) model_2 = pb.Model(graphene.bilayer(), graphene.hexagon_ac(side_width=1)) model_3 = pb.Model( graphene.monolayer(), # pb.rectangle(x=2, y=1.2) pb.regular_polygon(num_sides=6, radius=1.4, angle=0)) model_2.plot() # model_2.plot() plt.show()