Hi everyone,
I was trying to understand how the has_fermion_string()
function works for the electron type defined in Itensor. As far as i understand, has_fermion_string()
inserts the JW string at the site where the fermionic operator sits, while the svdMPO()
function inputs it at the rest of the sites. But how does the itensor system know whether the F operator corresponds to the up-spin or the down spin? I can see an Fup and Fdn operator defined in the electron type file, but I can’t seem to understand how that is utilized in the OpSum()
constructor. The opsum_to_generic_mpo.jl file only seems to insert the F and does not refer to an Fdn or an Fup. Any help is much appreciated!
It’s a good question, and I remember when I was first looking into how the JW mapping worked in detail that there is very little literature on how to define it in the case of fermions with spin.
Fortunately the rule to generalize the string operators to the case of spinful fermions or other situations is pretty simple: you can just define a string operator which is diagonal and takes the value -1 for states which have odd fermion parity and +1 for even fermion parity. So for the “Electron” sites in ITensor the definition is:
function ITensors.op(::OpName"F", ::SiteType"Electron")
return [
1.0 0.0 0.0 0.0
0.0 -1.0 0.0 0.0
0.0 0.0 -1.0 0.0
0.0 0.0 0.0 1.0
]
end
where the -1's are in the second and third diagonal entries since our convention is that the second and third states of a site are the states \ket{\uparrow} and \ket{\downarrow}, each with one electron.
The fact that “Fup” and “Fdn” are also defined for the “Electron” sites may cause more confusion than necessary. I don’t think the OpSum system or the svdMPO function uses those operators.
Finally, though this isn’t necessary to understand the JW mapping and how to generalize it, when I learned how to define it for spinful sites, it was helpful for me at the time to think of breaking each site into “split sites” which are spinless fermions where the first site represents the presence of an “up electron” and the second a “down electron”. Since these are now formally spinless fermion sites the JW string is now defined in the usual way. But again the real rule is just that of odd parity.
Hi Miles,
Thanks for the quick reply. This answers a few of my confusions regarding the type file construction. I have a follow-up to this. I’m working with a custom Hilbert space consisting of two fermions (spinless) and a boson. I have followed the electron type file for reference and defined the correct form for the F operators, but relying on the has_fermion_string()
gives the wrong ground-state, compared to ED. If I input “Fup” and “Fdn” operators into the OpSum() by hand, the ground-state matches with the ED. Im not sure what could be going wrong, except maybe that the two fermions in my case are lying at one site and one needs to specify whether I’m referring to fermion 1 or fermion 2, but this does not seem to be a problem for the spinful type file construction.