From b9f43ec416709d57366027cdde34668124a535ad Mon Sep 17 00:00:00 2001
From: Anton Akhmerov <anton.akhmerov@gmail.com>
Date: Mon, 18 Feb 2013 18:15:12 -0500
Subject: [PATCH] fix bug in TranslationalSymmetry.reversed

---
 kwant/lattice.py | 26 ++++++++++++--------------
 1 file changed, 12 insertions(+), 14 deletions(-)

diff --git a/kwant/lattice.py b/kwant/lattice.py
index 4b1b67d3..c0069ad1 100644
--- a/kwant/lattice.py
+++ b/kwant/lattice.py
@@ -245,6 +245,7 @@ class TranslationalSymmetry(builder.Symmetry):
         # A dictionary containing cached data required for applying the
         # symmetry to different site groups.
         self.site_group_data = {}
+        self.is_reversed = False
 
     def add_site_group(self, gr, other_vectors=None):
         """
@@ -326,7 +327,8 @@ class TranslationalSymmetry(builder.Symmetry):
 
     def which(self, site):
         det_x_inv_m_part, det_m = self._get_site_group_data(site.group)[-2:]
-        return ta.dot(det_x_inv_m_part, site.tag) // det_m
+        result = ta.dot(det_x_inv_m_part, site.tag) // det_m
+        return -result if self.is_reversed else result
 
     def act(self, element, a, b=None):
         m_part = self._get_site_group_data(a.group)[0]
@@ -335,6 +337,8 @@ class TranslationalSymmetry(builder.Symmetry):
         except ValueError:
             msg = 'Expecting a {0}-tuple group element, but got `{1}` instead.'
             raise ValueError(msg.format(self.num_directions, element))
+        if self.is_reversed:
+            delta *= -1
         if b is None:
             return builder.Site(a.group, a.tag + delta, True)
         elif b.group is a.group:
@@ -348,6 +352,8 @@ class TranslationalSymmetry(builder.Symmetry):
                 msg = 'Expecting a {0}-tuple group element, ' + \
                       'but got `{1}` instead.'
                 raise ValueError(msg.format(self.num_directions, element))
+            if self.is_reversed:
+                delta2 *= -1
             return builder.Site(a.group, a.tag + delta, True), \
                 builder.Site(b.group, b.tag + delta2, True)
 
@@ -357,20 +363,12 @@ class TranslationalSymmetry(builder.Symmetry):
     def reversed(self):
         """Return a reversed copy of the symmetry.
 
-        The result is identical to creating a new symmetry with all the
-        period vectors opposite to the original but with the same fundamental
-        domain.
+        The resulting symmetry has all the period vectors opposite to the
+        original and an identical fundamental domain.
         """
-        periods = [[-i for i in j] for j in self.periods]
-        result = TranslationalSymmetry(*periods)
-        for gr in self.site_group_data:
-            m_part, det_x_inv_m_part, det_m = self.site_group_data[gr]
-            if self.num_directions % 2:
-                det_m = -det_m
-            else:
-                det_x_inv_m_part = -det_x_inv_m_part
-            m_part = -m_part
-            result.site_group_data[gr] = (m_part, det_x_inv_m_part, det_m)
+        result = TranslationalSymmetry(*self.periods)
+        result.site_group_data = self.site_group_data
+        result.is_reversed = not self.is_reversed
         return result
 
 
-- 
GitLab