+1 vote

Hi Miles,

I have some questions for DMRG in ITensor. Hope you could help.

1. What kind of optimization algorithm does it use, single-site or twosite?

2. PBC is difficult. Will the "Efficient matrix-product state method for periodic boundary conditions" be built in this Library?

3. Can it run in parallel?

4. I tried some simulation with DMRG. I get different numbers with different sweeps.maxm(). The code is:

#include "itensor/all.h"
using namespace itensor;
int main()
{
int N = 32;

auto sites = SpinOne(N);

auto ampo = AutoMPO(sites);
for(int j = 1; j < N; ++j)
{
ampo += 10.0,"S+",j,"S-",j+1;
ampo += 10.0,"S-",j,"S+",j+1;
ampo +=  "Sz*Sz",j;
}
ampo += 10.0,"S+",N,"S-",1;
ampo += 10.0,"S-",N,"S+",1;
ampo +=  "Sz*Sz",N;

auto H = IQMPO(ampo);

auto state = InitState(sites);
for(int i = 1; i <= N; ++i)
{
if(i%2 == 1)
state.set(i,"Up");
else
state.set(i,"Dn");
}

auto psi = IQMPS(state);

auto sweeps = Sweeps(200);
sweeps.maxm() = 20,40,100,100,200;
sweeps.cutoff() = 1E-10;

auto energy = dmrg(psi,H,sweeps,{"Quiet=",true});

return 0;
}


For this case, the vN Entropy at center bond converges at 1.834080476998. If I use "sweeps.maxm() = 20,40,60,80,100,120,140,160,180,200;", the vN Entropy at center bond converges at 1.834080201341. The difference is not big. But when I set "N=64", the two vN entropy become 2.059443246913 and 2.059446044498. It seems this difference will be bigger with larger N. Is this normal? Which one I should trust? Is there a rule to set "sweeps.maxm()"?

Many thanks.

Best regards,

Jin

+1 vote
edited by

3. ITensor sends tensor contractions to BLAS dgemm, so if your BLAS has multithreading enabled (e.g. if you have set OMP_NUM_THREADS or MKL_NUM_THREADS or VECLIB_NUM_THREADS environment variables greater than 1) then you will see greater than 100% cpu usage for large enough tensor contractions. Other than that right now there's no other multithreading or paralellism happening in ITensor, though we'd like to improve this soon. If you are asking about the real-space parallel DMRG algorithm I wrote about in 2013, that's not publicly available because the code needs to be polished, but if you email me I can send you an old copy of the code if you want to try fixing it up yourself.