From f23ed914c05fd48931ab7673ad97247580d11d59 Mon Sep 17 00:00:00 2001 From: quaeritis <quaeritis@rebellare.de> Date: Wed, 20 Jan 2021 12:03:26 +0100 Subject: [PATCH] add singns argument for add_peierls_phase --- kwant/builder.py | 25 ++++++++++++++++++++----- 1 file changed, 20 insertions(+), 5 deletions(-) diff --git a/kwant/builder.py b/kwant/builder.py index 3ffdf099..f65a8e08 100644 --- a/kwant/builder.py +++ b/kwant/builder.py @@ -1528,13 +1528,24 @@ class Builder: _require_system -def _add_peierls_phase(syst, peierls_parameter): +def _add_peierls_phase(syst, peierls_parameter, signs): + def phi_matrix(phi, signs): + phase_factors = [] + for sign in signs: + if sign == -1: + phase_factors.append(phi.conjugate()) + elif sign == 1: + phase_factors.append(phi) + return np.diag(phase_factors) @memoize def wrap_hopping(hop): def f(*args): a, b, *args, phi = args - return hop(a, b, *args) * phi(a, b) + if signs is not None: + return np.dot(hop(a, b, *args), phi_matrix(phi(a, b), signs)) + else: + return hop(a, b, *args) * phi(a, b) params = ('_site0', '_site1') if callable(hop): @@ -1550,7 +1561,10 @@ def _add_peierls_phase(syst, peierls_parameter): const_hoppings = {} def const_hopping(a, b, phi): - return const_hoppings[a, b] * phi(a, b) + if signs is not None: + return np.dot(hop(a, b, *args), phi_matrix(phi(a, b), signs)) + else: + return hop(a, b, *args) * phi(a, b) # fix the signature params = ('_site0', '_site1', peierls_parameter) @@ -1571,6 +1585,7 @@ def _add_peierls_phase(syst, peierls_parameter): _add_peierls_phase( lead.builder, peierls_parameter + '_lead{}'.format(i), + signs ), lead.interface, lead.padding, @@ -1590,7 +1605,7 @@ def _add_peierls_phase(syst, peierls_parameter): return ret -def add_peierls_phase(syst, peierls_parameter='phi', fix_gauge=True): +def add_peierls_phase(syst, peierls_parameter='phi', fix_gauge=True, signs=None): """Add a Peierls phase parameter to a Builder. Parameters @@ -1690,7 +1705,7 @@ def add_peierls_phase(syst, peierls_parameter='phi', fix_gauge=True): raise TypeError("'add_peierls_phase' does not work with " "vectorized Builders") - ret = _add_peierls_phase(syst, peierls_parameter).finalized() + ret = _add_peierls_phase(syst, peierls_parameter, signs).finalized() if fix_gauge: return ret, wrap_gauge(magnetic_gauge(ret)) -- GitLab