I’m still pretty inexperienced with DMRG, so wanted to share my current experience with this issue and see what more experienced people think.
I’m investigating a system where charge mod 4 is conserved, and have been trying to figure out how to find the ground state/energy in each symmetry sector.
The first way I attempted was by defining an operator to have large energy penalties for the sectors I wanted to omit, which I then add to the regular Hamiltonian. The runtime per sweep is quite fast, and the bond dimension never gets beyond a few hundred even though I set the max dimension to 10K. The energy also seems to converge fairly well to a value, typically decreasing monotonically, and I consistently verify the resulting state is in the sector I want. I’m still working on ensuring it’s an energy eigenstate by looking at the variance. As for whether it’s the lowest energy or not is another concern which I’ll worry about later.
My second way which I’ve now been trying as I read more into the documentation is defining custom sites on top of the built-in “Electron” site class, with a charge mod 4 quantum number. I then define a random MPS from a state with well defined charge mod 4. I’ve been fiddling around with noise a bit alternating between low (10E-10) and zero noise by the end, and have rather low cutoff (10E-10). Despite that, for the same systems as I tested my first method on, the bond dimension seems to get into the 1000s at times, and the energies often fluctuate a lot, going up and down instead of converging nicely, and so on.
Is there any ideas what might be going on with my second approach of built-in conservation? And is there a general consensus for which of these two approaches is generally better?
That wasn’t the most coherent question, so I’d be happy to elaborate in words or provide code snippets of mine if that’d be helpful. Thank you!