def test_singular_fully_degenerate(): """This testcase features a rectangular (and hence singular) hopping matrix with complete degeneracy. This case can still be treated with the Schur technique.""" w = 5 # width t = 1.5 # hopping element e = 3.3 # Fermi energy h_hop_s = -t * np.identity(w) h_cell_s = h_cell_s_func(t, w, e) h_hop = np.zeros((4*w, 2*w)) h_hop[2*w:3*w, :w] = h_hop_s h_hop[3*w:4*w, w:2*w] = h_hop_s h_cell = np.zeros((4*w, 4*w)) h_cell[:w, :w] = h_cell_s h_cell[:w, 2*w:3*w] = h_hop_s h_cell[w:2*w, w:2*w] = h_cell_s h_cell[w:2*w, 3*w:4*w] = h_hop_s h_cell[2*w:3*w, :w] = h_hop_s h_cell[2*w:3*w, 2*w:3*w] = h_cell_s h_cell[3*w:4*w, w:2*w] = h_hop_s h_cell[3*w:4*w, 3*w:4*w] = h_cell_s g = np.zeros((2*w, 2*w), dtype=complex) g[:w, :w] = leads.square_selfenergy(w, t, e) g[w:, w:] = leads.square_selfenergy(w, t, e) assert_almost_equal(g, modes_se(h_cell, h_hop))
def test_singular_degenerate_with_crossing(): """This testcase features a rectangular (and hence singular) hopping matrix with degeneracy k-values including a crossing with velocities of opposite sign. This case must be treated with the fall-back technique.""" w = 5 # width t = 20.5 # hopping element e = 3.3 # Fermi energy h_hop_s = -t * np.identity(w) h_cell_s = h_cell_s_func(t, w, e) h_hop = np.zeros((4*w, 2*w)) h_hop[2*w:3*w, :w] = h_hop_s h_hop[3*w:4*w, w:2*w] = -h_hop_s h_cell = np.zeros((4*w, 4*w)) h_cell[:w, :w] = h_cell_s h_cell[:w, 2*w:3*w] = h_hop_s h_cell[w:2*w, w:2*w] = -h_cell_s h_cell[w:2*w, 3*w:4*w] = -h_hop_s h_cell[2*w:3*w, :w] = h_hop_s h_cell[2*w:3*w, 2*w:3*w] = h_cell_s h_cell[3*w:4*w, w:2*w] = -h_hop_s h_cell[3*w:4*w, 3*w:4*w] = -h_cell_s g = np.zeros((2*w, 2*w), dtype=complex) g[:w, :w] = leads.square_selfenergy(w, t, e) g[w:, w:] = -np.conj(leads.square_selfenergy(w, t, e)) assert_almost_equal(g, modes_se(h_cell, h_hop))
def test_regular_degenerate_with_crossing(): """This is a testcase with invertible hopping matrices, and degenerate k-values with a crossing such that one mode has a positive velocity, and one a negative velocity For this case the fall-back technique must be used. """ w = 4 # width t = 0.5 # hopping element e = 1.8 # Fermi energy global h_hop h_hop_s = -t * np.identity(w) h_cell_s = h_cell_s_func(t, w, e) hop = np.zeros((2*w, 2*w)) hop[:w, :w] = h_hop_s hop[w:, w:] = -h_hop_s h_cell = np.zeros((2*w, 2*w)) h_cell[:w, :w] = h_cell_s h_cell[w:, w:] = -h_cell_s g = np.zeros((2*w, 2*w), dtype=complex) g[:w, :w] = leads.square_selfenergy(w, t, e) g[w:, w:] = -np.conj(leads.square_selfenergy(w, t, e)) assert_almost_equal(g, modes_se(h_cell, hop))
def test_regular_degenerate_with_crossing(): """This is a testcase with invertible hopping matrices, and degenerate k-values with a crossing such that one mode has a positive velocity, and one a negative velocity For this case the fall-back technique must be used. """ w = 4 # width t = 0.5 # hopping element e = 1.8 # Fermi energy h_hop_s = -t * np.identity(w) h_cell_s = h_cell_s_func(t, w, e) hop = np.zeros((2*w, 2*w)) hop[:w, :w] = h_hop_s hop[w:, w:] = -h_hop_s h_cell = np.zeros((2*w, 2*w)) h_cell[:w, :w] = h_cell_s h_cell[w:, w:] = -h_cell_s g = np.zeros((2*w, 2*w), dtype=complex) g[:w, :w] = leads.square_selfenergy(w, t, e) g[w:, w:] = -np.conj(leads.square_selfenergy(w, t, e)) assert_almost_equal(g, modes_se(h_cell, hop))
def test_singular_but_square(): """This testcase features a singular, square hopping matrices without degeneracies. This case can be treated with the Schur technique.""" w = 5 # width t = 0.9 # hopping element e = 2.38 # Fermi energy h_hop_s = -t * np.identity(w) h_cell_s = h_cell_s_func(t, w, e) h_hop = np.zeros((2*w, 2*w)) h_hop[w:, :w] = h_hop_s h_cell = np.zeros((2*w, 2*w)) h_cell[:w, :w] = h_cell_s h_cell[:w, w:] = h_hop_s h_cell[w:, :w] = h_hop_s h_cell[w:, w:] = h_cell_s g = np.zeros((2*w, 2*w), dtype=complex) g[:w, :w] = leads.square_selfenergy(w, t, e) assert_almost_equal(g, modes_se(h_cell, h_hop))
def test_analytic_numeric(): w = 5 # width t = 0.78 # hopping element e = 1.3 # Fermi energy assert_almost_equal(leads.square_selfenergy(w, t, e), modes_se(h_cell_s_func(t, w, e), -t * np.identity(w)))
def test_regular_fully_degenerate(): """Selfenergy with an invertible hopping matrix, and degenerate bands.""" w = 6 # width t = 0.5 # hopping element e = 1.3 # Fermi energy h_hop_s = -t * np.identity(w) h_cell_s = h_cell_s_func(t, w, e) h_hop = np.zeros((2*w, 2*w)) h_hop[:w, :w] = h_hop_s h_hop[w:, w:] = h_hop_s h_cell = np.zeros((2*w, 2*w)) h_cell[:w, :w] = h_cell_s h_cell[w:, w:] = h_cell_s g = np.zeros((2*w, 2*w), dtype=complex) g[:w, :w] = leads.square_selfenergy(w, t, e) g[w:, w:] = leads.square_selfenergy(w, t, e) assert_almost_equal(g, modes_se(h_cell, h_hop)) # Now with conservation laws and symmetries. conserved = np.identity(2*w) projectors = [sparse.csr_matrix(i) for i in [conserved[:, :w], conserved[:, w:]]] modes2 = leads.modes(h_cell, h_hop, projectors=projectors) current_conserving(modes2[1]) assert_almost_equal(g, modes2[1].selfenergy()) trs = sparse.identity(2*w) modes3 = leads.modes(h_cell, h_hop, projectors=projectors, time_reversal=trs) current_conserving(modes3[1]) assert_almost_equal(g, modes3[1].selfenergy()) phs = np.eye(2*w, 2*w, w) + np.eye(2*w, 2*w, -w) modes4 = leads.modes(h_cell, h_hop, projectors=projectors, time_reversal=trs, particle_hole=phs) current_conserving(modes4[1]) assert_almost_equal(g, modes4[1].selfenergy())
def test_regular_fully_degenerate(): """Selfenergy with an invertible hopping matrix, and degenerate bands.""" w = 6 # width t = 0.5 # hopping element e = 1.3 # Fermi energy h_hop_s = -t * np.identity(w) h_cell_s = h_cell_s_func(t, w, e) h_hop = np.zeros((2*w, 2*w)) h_hop[:w, :w] = h_hop_s h_hop[w:, w:] = h_hop_s h_cell = np.zeros((2*w, 2*w)) h_cell[:w, :w] = h_cell_s h_cell[w:, w:] = h_cell_s g = np.zeros((2*w, 2*w), dtype=complex) g[:w, :w] = leads.square_selfenergy(w, t, e) g[w:, w:] = leads.square_selfenergy(w, t, e) assert_almost_equal(g, modes_se(h_cell, h_hop))
def test_singular(): """This testcase features a rectangular (and hence singular) hopping matrix without degeneracies. This case can be treated with the Schur technique.""" w = 5 # width t = .5 # hopping element e = 0.4 # Fermi energy h_hop_s = -t * np.identity(w) h_cell_s = h_cell_s_func(t, w, e) h_hop = np.zeros((2*w, w)) h_hop[w:, :w] = h_hop_s h_cell = np.zeros((2*w, 2*w)) h_cell[:w, :w] = h_cell_s h_cell[:w, w:] = h_hop_s h_cell[w:, :w] = h_hop_s h_cell[w:, w:] = h_cell_s g = leads.square_selfenergy(w, t, e) assert_almost_equal(g, modes_se(h_cell, h_hop))
def selfenergy(self, fermi_energy, args=()): return square_selfenergy(self.width, self.t, self.potential + fermi_energy)
def selfenergy(self, fermi_energy, args=(), params=None): assert not args assert params is None return square_selfenergy(self.width, self.t, self.potential + fermi_energy)