diff --git a/kwant/physics/tests/test_gauge.py b/kwant/physics/tests/test_gauge.py index 9798a82ae81dd2a7aad7b28caf6262825cd60cb7..7d5467d4fcd4a48febc6f68b9c8393140e299160 100644 --- a/kwant/physics/tests/test_gauge.py +++ b/kwant/physics/tests/test_gauge.py @@ -4,10 +4,12 @@ from math import sqrt import numpy as np import pytest +import kwant from ... import lattice from ...builder import HoppingKind, Builder, NoSymmetry, Site from .. import gauge + ## Utilities # TODO: remove in favour of 'scipy.stats.special_ortho_group' once @@ -478,3 +480,71 @@ def test_invariant_surface_integral(): rot = special_ortho_group.rvs(3) loop = orig_loop @ rot.transpose() assert np.isclose(I, integral(lambda r: rot @ circular_field(rot.transpose() @ r), loop)) + + +@pytest.fixture +def system_and_gauge(): + def hopping(a, b, peierls): + return -1 * peierls(a, b) + + syst = Builder() + syst[(square_lattice(i, j) for i in range(3) for j in range(10))] = 4 + syst[square_lattice.neighbors()] = hopping + + lead = Builder(lattice.TranslationalSymmetry((-1, 0))) + lead[(square_lattice(0, j) for j in range(10))] = 4 + lead[square_lattice.neighbors()] = hopping + + syst.attach_lead(lead.substituted(peierls='peierls_left')) + syst.attach_lead(lead.reversed().substituted(peierls='peierls_right')) + + syst = syst.finalized() + + magnetic_gauge = gauge.magnetic_gauge(syst) + + return syst, magnetic_gauge + + +@pytest.mark.parametrize('B',[0, 0.1, lambda r: 0.1 * np.exp(-r[1]**2)]) +def test_uniform_magnetic_field(system_and_gauge, B): + syst, gauge = system_and_gauge + + peierls, peierls_left, peierls_right = gauge(B, B, B) + + params = dict(peierls=peierls, peierls_left=peierls_left, + peierls_right=peierls_right) + + s = kwant.smatrix(syst, energy=0.6, params=params) + t = s.submatrix(1, 0) + + b = kwant.physics.Bands(syst.leads[0], params=params) + print(b(0)) + + assert t.shape > (0, 0) # sanity check + assert np.allclose(np.abs(t)**2, np.eye(*t.shape)) + + +def test_phase_sign(system_and_gauge): + syst, gauge = system_and_gauge + + peierls, peierls_left, peierls_right = gauge(0.1, 0.1, 0.1) + + params = dict(peierls=peierls, peierls_left=peierls_left, + peierls_right=peierls_right) + + cut = [(square_lattice(1, j), square_lattice(0, j)) + for j in range(10)] + J = kwant.operator.Current(syst, where=cut) + J = J.bind(params=params) + + psi = kwant.wave_function(syst, energy=0.6, params=params)(0)[0] + + # Electrons incident from the left travel along the *top* + # edge of the Hall bar in the presence of a magnetic field + # out of the plane + j = J(psi) + j_bottom = sum(j[0:5]) + j_top = sum(j[5:10]) + + assert np.isclose(j_top + j_bottom, 1) # sanity check + assert j_top > 0.9