From fa3256d56e20e697df0a92c1204aa8705428f15e Mon Sep 17 00:00:00 2001
From: Anton Akhmerov <anton.akhmerov@gmail.com>
Date: Sun, 5 Mar 2017 12:37:21 +0100
Subject: [PATCH] fix lead attachment and add test for previously failing case

Fixes #92.
---
 kwant/builder.py            | 11 +++++++++--
 kwant/tests/test_builder.py |  9 +++++++++
 2 files changed, 18 insertions(+), 2 deletions(-)

diff --git a/kwant/builder.py b/kwant/builder.py
index 657a2bf1..68d99b18 100644
--- a/kwant/builder.py
+++ b/kwant/builder.py
@@ -1379,10 +1379,17 @@ class Builder:
             if domain < min_dom:
                 raise ValueError('Builder does not interrupt the lead,'
                                  ' this lead cannot be attached.')
-            return domain < max_dom + 1
+            return domain <= max_dom + 1
 
-        all_added = self.fill(lead_builder, shape, (max_dom,),
+        # We start flood-fill from the first domain that doesn't belong to the
+        # system (this one is guaranteed to contain a complete unit cell of the
+        # lead). After flood-fill we remove that domain.
+        all_added = self.fill(lead_builder, shape, (max_dom + 1,),
                               max_sites=float('inf'))
+        to_delete = {site for site in all_added
+                     if sym.which(site)[0] == max_dom + 1}
+        all_added = [site for site in all_added if site not in to_delete]
+        del self[to_delete]
 
         # Calculate the interface.
         interface = set()
diff --git a/kwant/tests/test_builder.py b/kwant/tests/test_builder.py
index 922f1142..8ffab406 100644
--- a/kwant/tests/test_builder.py
+++ b/kwant/tests/test_builder.py
@@ -772,6 +772,15 @@ def test_attach_lead():
     syst.finalized()
 
 
+def test_attach_lead_incomplete_unit_cell():
+    lat = kwant.lattice.chain()
+    syst = kwant.Builder()
+    lead = kwant.Builder(kwant.TranslationalSymmetry((2,)))
+    syst[lat(1)] = lead[lat(0)] = lead[lat(1)] = 0
+    lead[lat.neighbors()] = 0
+    assert(len(syst.attach_lead(lead)) == 0)
+
+
 def test_neighbors_not_in_single_domain():
     sr = builder.Builder()
     lead = builder.Builder(VerySimpleSymmetry(-1))
-- 
GitLab