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