diff --git a/kwant/builder.py b/kwant/builder.py index 3ffdf09940f359bcdcccad1adf210a63761a2697..f65a8e08ae06241ccf5d3ca6d173abb3c62c0581 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))