0 votes
asked by (400 points)
edited by

Hello world,

I'm interested in constructing a custom site set for SU(2)xSU(2) fermions, i.e. fermions with spin-1/2 and pseudospin-1/2. I keep reading in the docs that the SiteSets can be mixed with other SiteSets, so I assume I could mix two instances of Hubbard SiteSet to produce what I'm looking for; however, I can't seem to find any good information or tutorials on how to create custom SiteSets.

Where could one find such information?
Any direction, resources, or suggestions would be great!

commented by (70.1k points)
Hi, so we don't support SU(2) or any other non-Abelian symmetries. But maybe you are asking about conserving the U(1) x U(1) subgroup of the full symmetry group of your system? By that I mean conserving both spin and charge.
commented by (400 points)
edited by
Hey Miles, thanks for responding.

I mean to say that I want to construct operators labelled by spin (up/down) and psuedo-spin(A/B), for example, CupA, which destroys a fermion of type spin-up with psuedo-spin A. I don't actually care about preserving the SU(2) symmetry of the spins nor the pseudo-spin; in fact, I don't care about preserving the U(1) subgroups either, only total particle number.

I think I found a quick-n-easy solution to my problem: doubling the number of sites, and letting the even sites represent A-type fermions and the odd represent B-type. So long as the Hamiltonian is written in a way which takes this into account, I think everything should work as I hoped.

I've also tried rewriting the iTensor hubbard.h to include an additional quantum number. I noticed that in hubbard.h, if conserveSz==false, then the value Sz=0 was stored for every QN() function in the definition the the IQIndex. So I assume that if I want to introduce another quantum number label, but don't care to conserve that quantum number, then I could do something like:
            s = IQIndex{nameint("site=",n),
                    Index(nameint("Emp ",n),1,Site), QN("Tz=",0,"Sz=", 0,"Nf=",0),
                    Index(nameint("UpA ",n),1,Site), QN("Tz=",0,"Sz=",Up,"Nf=",1),
                    Index(nameint("UpB ",n),1,Site), QN("Tz=",0,"Sz=",Up,"Nf=",1),
                    Index(nameint("DnA ",n),1,Site), QN("Tz=",0,"Sz=",Dn,"Nf=",1),
                    Index(nameint("DnB ",n),1,Site), QN("Tz=",0,"Sz=",Dn,"Nf=",1),
                    Index(nameint("UpAUpB ",n),1,Site), QN("Tz=",0,"Sz=", 2*Up,"Nf=",2),
                    Index(nameint("UpADnB ",n),1,Site), QN("Tz=",0,"Sz=", 0,"Nf=",2),
                    Index(nameint("DnAUpB ",n),1,Site), QN("Tz=",0,"Sz=", 0,"Nf=",2),
                    Index(nameint("DnADnB ",n),1,Site), QN("Tz=",0,"Sz=", 2*Dn,"Nf=",2)};
Where I introduced a new basis for states at a site, and set my new QN("Tz=0",0). Further defining how each newly defined operator acts in this basis, for example:
        IQTensor Op(dag(s),sP);
        if(opname == "CupA")
I'm testing my code now, and I see no problems so far, though I have yet to checked everything.

I do have one question still -- how is the anti-commutation handled between sites? I understand this requires the Jordan-Wigner strings, but that AutoMPO handles this automatically for fermions. What indicates to AutoMPO that a collection of operators defined for a Site Set is fermionic?

commented by (400 points)
I think I may have answered my own question regarding AutoMPO and how it recognizes if my operators are fermionic. I found the following in autompo.cc :
isFermionic(SiteTerm const& st)
#ifdef DEBUG
    for(char c : st.op)
    if(c == '*')
        Error("SiteTerm contains a '*' but isFermionic does not handle this case");
    if(!st.op.empty() && st.op.front() == 'C') return true;
    return false;

Please tell me if I'm wrong, but I believe it reads the string name of my onsite operator (e.g. opname="CupA"), and if the first character is "C" then it returns true. Therefore, all of my operators are taken to be fermionic because I named them in the standard convention, starting with "C".

I also noticed in autompo.cc the following:
fermionicTerm(const string& op)
    static array<pair<string,string>,6>
           rewrites =
    for(auto& p : rewrites)
        if(p.first == op) return p.second;
    return op;

Could one rewrite this to account for the extra flavour labels that I'm trying to add? Perhaps also rewriting the "Fermiphase" or "F" local operator defined in hubbard.h to account for the extra flavours, similarly to how I did "CupA". Would AutoMPO then be able to handle my new operators? Or should I stick to the doubling site trick?


Please log in or register to answer this question.

Welcome to ITensor Support Q&A, where you can ask questions and receive answers from other members of the community.

Formatting Tips:
  • To format code, indent by four spaces
  • To format inline LaTeX, surround it by @@ on both sides
  • To format LaTeX on its own line, surround it by $$ above and below
  • For LaTeX, it may be necessary to backslash-escape underscore characters to obtain proper formatting. So for example writing \sum\_i to represent a sum over i.
If you cannot register due to firewall issues (e.g. you cannot see the capcha box) please email Miles Stoudenmire to ask for an account.

To report ITensor bugs, please use the issue tracker.