Hi,
1) In VAMPIRE, exchange coupling strengths are given in units of Joules/link (which end up being on the order of 10^22). In the TenPy documentation, the values used in the documentation are numbers on the order of 1 (e.g., for add_coupling()). Do the units matter? Can I just use values in meV? Apologies if I missed this in the documentation
2) If I specify anisotropic exchange \(J.S_i.S_j\) (Jxx,Jxy,Jxz,Jyx,Jyy,Jyz,Jzx,Jzy,Jzz) via add_coupling(), and my system has DMI too, will I need to specify DMI D separately (using \(D. S_i \times S_j\)) ? Or will the DMI be automatically treated from the anisotropic J values in TenPy, since they are related by: Dz = (Jxy  Jyx)/2, etc (since components of the DMI vector are related to the antisymmetric part of J)?
Thanks in advance!
Units of exchange coupling and DMI/anisotropic J

 Posts: 7
 Joined: 28 Jun 2023, 23:37
Re: Units of exchange coupling and DMI/anisotropic J
1.) Hmm, good question. I never tried, but I'm afraid it wouldn't go well, and strongly advise against it.
In theory, I agree that you can choose arbitary units and scale all terms in the hamiltonian accordingly. In practice, we have several points where we discard everything on the order of machine precision (or often even a bit higher, I think up to 1.e12) to avoid issues with floating point precision  e.g. when you add the same term multiple times, and the prefactors add up to 1.e14, this is usually due to roundoff errors, so we implicitly assume that this should be zero and drop such terms. Accordingly, when your prefactors of h are all on the order of 1022, the model generated by tenpy will be trivial without term, as it dropped them all.
Even if we would allow such small terms in the Hamiltonian, I think it might also lead to issue with DMRG itself  each time we truncate, we explicitly drop every singular value smaller than an absolute threshold. Also, the Mixer/subspace expansion assume that the terms are of O(1) to work correctly.
To conclude, I highly recommend to choose one of the couplings as unit and set it to 1 (or at least order 1) and have all other coupling be defined in strength relative to that. (some) Terms of 1e.3 to 1e3 or so are fine, but in general, one wants to avoid situations with too extreme numbers in numerical algorithms (keyword condition number).
2.) Duplicate question with this topic where I tried to answer this already.
In theory, I agree that you can choose arbitary units and scale all terms in the hamiltonian accordingly. In practice, we have several points where we discard everything on the order of machine precision (or often even a bit higher, I think up to 1.e12) to avoid issues with floating point precision  e.g. when you add the same term multiple times, and the prefactors add up to 1.e14, this is usually due to roundoff errors, so we implicitly assume that this should be zero and drop such terms. Accordingly, when your prefactors of h are all on the order of 1022, the model generated by tenpy will be trivial without term, as it dropped them all.
Even if we would allow such small terms in the Hamiltonian, I think it might also lead to issue with DMRG itself  each time we truncate, we explicitly drop every singular value smaller than an absolute threshold. Also, the Mixer/subspace expansion assume that the terms are of O(1) to work correctly.
To conclude, I highly recommend to choose one of the couplings as unit and set it to 1 (or at least order 1) and have all other coupling be defined in strength relative to that. (some) Terms of 1e.3 to 1e3 or so are fine, but in general, one wants to avoid situations with too extreme numbers in numerical algorithms (keyword condition number).
2.) Duplicate question with this topic where I tried to answer this already.