diff --git a/kwant/builder.py b/kwant/builder.py index 90c2262398a460ccedf4eb002b1add5a58a9204f..b3eaf2b4110a05cf3f3c52fcaee53d59e0335644 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 2f497277cfa87885e18c84ca587bd16323114038..6d9573b2f287c460c59050cafe1c377704bd8c7e 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()