From cc5565b7176980ca0d63720b580a407808077bf7 Mon Sep 17 00:00:00 2001
From: Anton Akhmerov <anton.akhmerov@gmail.com>
Date: Wed, 21 Dec 2016 18:11:22 +0100
Subject: [PATCH] automatically extend period of attached leads

---
 kwant/builder.py            | 22 ++++++++++++++++------
 kwant/tests/test_builder.py | 13 +++++++++++++
 2 files changed, 29 insertions(+), 6 deletions(-)

diff --git a/kwant/builder.py b/kwant/builder.py
index 90c22623..b3eaf2b4 100644
--- a/kwant/builder.py
+++ b/kwant/builder.py
@@ -1270,12 +1270,22 @@ class Builder:
 
         if sym.num_directions != 1:
             raise ValueError('Only builders with a 1D symmetry are allowed.')
-        for hopping in lead_builder.hoppings():
-            if not -1 <= sym.which(hopping[1])[0] <= 1:
-                msg = ('The following hopping connects non-neighboring lead '
-                       'unit cells. Only nearest-cell hoppings are allowed '
-                       '(consider increasing the lead period).\n{0}')
-                raise ValueError(msg.format(hopping))
+
+        try:
+            hop_range = max(abs(sym.which(hopping[1])[0])
+                            for hopping in lead_builder.hoppings())
+        except ValueError:  # if there are no hoppings max() will raise
+            hop_range = 0
+
+        if hop_range > 1:
+            # Automatically increase the period, potentially warn the user.
+            new_lead = Builder(sym.subgroup((hop_range,)))
+            new_lead.fill(lead_builder, next(iter(lead_builder.sites())),
+                          max_sites=float('inf'))
+            lead_builder = new_lead
+            sym = lead_builder.symmetry
+            H = lead_builder.H
+
         if not H:
             raise ValueError('Lead to be attached contains no sites.')
 
diff --git a/kwant/tests/test_builder.py b/kwant/tests/test_builder.py
index 2f497277..6d9573b2 100644
--- a/kwant/tests/test_builder.py
+++ b/kwant/tests/test_builder.py
@@ -755,6 +755,19 @@ def test_attach_lead():
     assert len(list(syst.sites())) == 6
     syst.attach_lead(lead, fam(-5))
     assert set(syst.leads[0].interface) == set([fam(-1), fam(0)])
+
+    # add some further-than-nearest-neighbor hoppings
+    hop_range = 3
+    lead = builder.Builder(VerySimpleSymmetry(1))
+    lead[fam(0)] = 1
+    for i in range(1, hop_range + 1):
+        lead[fam(0), fam(i)] = 1
+    syst.attach_lead(lead)
+    expanded_lead = syst.leads[-1].builder
+    assert expanded_lead.symmetry.period == hop_range
+    assert len(list(expanded_lead.sites())) == hop_range
+
+    # check that we can actually finalize the system
     syst.finalized()
 
 
-- 
GitLab