# iqdmrg related problem

+1 vote

Dear all:

I would like to understand more about iqdmrg. I hope you can help me. Thanks in advance. The questions are listed as below.

1. Is it correct that iqdmrg is a U(1) symmetric dmrg program?

2. Take heisenberg chain as an example, the quantum number of the tensor index in the center of the chain is truncated. I would like to know how you do this. For example, one tensor at site 49 shown below. I suppose that for this tensor there also quantum numbers like QN(49), QN(48),... but here they are definitely truncated.

/--------------IQTensor--------------
r=3 div=QN(0) log(scale)=0
IQIndex(S=1/2 49,2,Site,338) < Out >
(Up 49,1,Site,810) QN(1)
(Dn 49,1,Site,550) QN(-1)
\ ------------------------------------

1. I also tested with pure external magnetic form H= \sum h*S^z. The ground state shows that the total quantum number of the wave function is QN(0), which concerned me a lot since I expect the quantum number of the chain should be QN(N). Is that correct?

Sorry for the massive contents, and probably trivial questions listed above. But I do want to know more on this. Any comments are welcomed. Thanks very much.

Best Regards
Wangwei Lan

+1 vote
answered Feb 21, 2017 by (20,240 points)

Hi Wangwei,
These are all reasonable questions based on the small amount of documentation we have on the "IQTensor" system so far. Hopefully in the near future the ITensor book section will be expanded even more to cover all of these questions.

(1) iqdmrg (and the IQTensor / IQMPS / IQMPO system more generally) can handle U(1) symmetries associated with conserving quantum numbers following an integer addition rule as well as quantum numbers following a Z_N addition rule (addition modulo N). So for example you can also conserve just fermion parity instead of fermion number, or more exotic kinds of quantum numbers. The documentation page on the QN class gives a variety of examples: http://itensor.org/docs.cgi?page=classes/qn

(2) The way IQTensors are truncated is that all of their non-zero blocks are SVD'd separately (for more on IQTensor blocks, see http://itensor.org/docs.cgi?page=book/block_sparse). All of the resulting singular values are collected, and sorted, and then used to determine a threshold or cutoff for the entire spectrum of the IQTensor. This threshold is then applied to each block to truncate it. Some blocks may get truncated entirely in this process in which case they are removed. The result is really very similar to how truncation is defined for SVD'ing a dense tensor but is much more efficient due to the sparsity.

(3) The way that iqdmrg determines the quantum number (QN) sector to work in is from the initial state (IQMPS wavefunction) that you provide it. The main feature of iqdmrg is that it will not change the global QNs of the IQMPS. So if you give it an IQMPS with a total Sz of zero, nothing the code does can change this, even if you include a magnetic field. If you want to get the ground state in a different QN sector, you must change the initial state you provide. The InitState object is a convenient way to specify an initial state by giving a product-state spin pattern.