Kwant is taking a unit cell larger than the one defined in the calculation of the phosphorene band structure

Hi, colleagues! I'm defining the phosphorene unit cell perfectly. However, when the leads are attached to the scattering region, the kwant increases the unit cell, and thus "duplicate" energy levels appear. I'm using the model with 10 interlayer hoppings and 5 interlayer hoppings. Apparently, in the model of 5 interlayer hoppings it doesn't happen! Thank you for your help now.

Dear Ronan, Kwant adds sites to the lead until it reaches the system. This doesn't mean that it duplicates the unit cell. In fact, the band can be obtained without attaching the lead and the Hamiltonian of the unit cell can be directly obtained by: lead.cell_hamiltonian(params=params) #(the lead needs to be finalized here) or (syst.leads[0]. cell_hamiltonian(params=params) ) So you can verify that the unit cell is not duplicated and it is solely defined using the base you defined for the lattice. I hope this helps, Adel On Tue, Aug 4, 2020 at 10:49 PM Ronan Viana <ronan.viana@fisica.ufc.br> wrote:
Hi, colleagues!
I'm defining the phosphorene unit cell perfectly. However, when the leads are attached to the scattering region, the kwant increases the unit cell, and thus "duplicate" energy levels appear. I'm using the model with 10 interlayer hoppings and 5 interlayer hoppings. Apparently, in the model of 5 interlayer hoppings it doesn't happen! Thank you for your help now.
-- Abbout Adel

Hi Ronan, The unit cell you probably defined with `kwant.lattice`. The modes of the leads correspond to a folded Brillouin zone in the direction of the translational symmetry that the leads have. If you use a direction that needs more than one unitcell length, say ``` lead = kwant.Builder(kwant.TranslationalSymmetry(lat.vec((2, 0)))) ```, then the Brillouin zone will be folded `2` times. Besides that, the direction can influence the degeneracy of the levels. For example, in a honeycomb lattice, a lead with zigzag edges has non-degenerate bands, and one with armchair edges has degenerate bands. Again, this is because of how you cut and fold the Brillouin zone. Regards, Pablo

Dear Ronan, from a private exchange you provided me with your code where this error happened. I could confirm your findings of kwant duplicating the lead unitcell length. In fact, this is noticeable if you try: ``` syst_a, (lead0a, lead1a) = make_system(E=E, extra_hops=True) # those problematic hoppings syst_b, (lead0b, lead1b) = make_system(E=E, extra_hops=False) syst_a.attach_lead(lead0a); syst_a.attach_lead(lead1a); syst_b.attach_lead(lead0b); syst_b.attach_lead(lead1b); print(syst_a.leads[0].finalized().symmetry.periods) print(syst_b.leads[0].finalized().symmetry.periods) ``` The result is ``` [[0.0 -6.624989490547891 0.0]] [[0.0 -3.3124947452739457 0.0]] ``` The duplication of the lead unitcell went unnoticed because of attaching the leads to a system, and finalizing the system. However, if you try and finalize the leads on themselves, you get the error ``` lead0a.finalized()
ValueError: Further-than-nearest-neighbor cells are connected by hopping
This error does not show up in the second case (`extra_hops=False`) because
only lead unitcells that are next to each other are connected.
I supose that the way the Bloch Hamiltonian is defined makes that it's only possible
to have first unitcell neighbors connected, therefore, for further than nearest neighbors
Kwant duplicates the unitcell, in order to fit the `H_0 + e^(i k a) V + c.c.` expression of Bloch
Hamiltonians.
That said, I don't see that this behaviour is well documented.
The lead `Builder` with longer than one unitcell hoppings cannot be finalized, but it can
be attached to a `FiniteSystem`, transforming the lead into a `BuilderLead` that *can* be
finalized, with twice the unitcell length.
This may make sense, since in the later case you are probably interested in transport measurements
(scattering matrix) which should not change, but it is, at least, an inconsistent or not well documented
behaviour.
I suggest that you make a minimal example (a linear chain, for example) and open an issue in the kwant gitlab.
Best regards,
Pablo
participants (3)
-
Abbout Adel
-
pablo.perez.piskunow@gmail.com
-
Ronan Viana