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