diff --git a/kwant/lattice.py b/kwant/lattice.py index 4b1b67d3cbb1114ff3099a8806a15435e91a84f4..c0069ad1d7124e5c873dc0219fd1e48b1d95def9 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