Liu Feng wrote:
I would like to study a non-hermitian system using kwant. It seems that the Builder class forcibly ensures hermitian hoppings, is there any method to turn it off? Many thanks!
Dear Feng Liu, ensuring that any hopping matrices H_ij and H_ji are Hermitian conjugates of each other is currently indeed baked in into Kwant in at least two ways:
(1) Whenever a hopping is set in one direction for a builder, the other direction is automatically defined as its Hermitian conjugate.
(2) The method hamiltonian_submatrix of low-level systems only ever queries hoppings in one direction and assumes that the opposite hopping is the Hermitian conjugate.
This was decided for performance and simplicity reasons because we assumed back then that non-Hermitian conjugates were not relevant enough. This might have been a mistake.
However, on the level of Kwant solvers, hermiticity is not required for most things. There is a check that can be disabled using the check_hermiticity flag.
Together, this means that currently you can work with non-Hermitian systems as long as the non-hermiticity is limited to onsite elements of a Hamiltonian. (This implies that there is more than a single orbital per site.)
I am not aware of any other way to bypass hermiticity enforcement in current Kwant. However, work is underway to remove these restrictions. The new low-level format and the successor of hamiltonian_submatrix no longer assume that all hoppings are Hermitian. And the hermiticity enforcement of builders could (and I guess should) be made optional as well.
However, there’s currently no ETA for the new release.