As a beginner, I have a very naive question here. I’m thinking of a simple transverse field ising model ,and trying to eccode the z2 parity in itensor, but fail. If it can be achieved, can you provide a simple 1D example that can be learned.
I am looking forward to getting your views or suggestions on this issue. Thank you for your answer, thanks for itensor team.
According to itensor.jl’s tutorial, I have tried to write an ising model with h=1, J=1, using z2 parity.
using MKL
using LinearAlgebra
using ITensors
using ITensors.HDF5
using Plots
ITensors.disable_threaded_blocksparse()
ITensors.Strided.set_num_threads(1)
BLAS.set_num_threads(8)
@show Threads.nthreads()
@show Sys.CPU_THREADS
@show ITensors.blas_get_num_threads()
@show ITensors.Strided.get_num_threads()
@show ITensors.using_threaded_blocksparse()
@show BLAS.get_config()
println()
@time let
N = 64
println("Begin calculation TFI=",N)
# ground state
sites = siteinds("S=1/2",N; conserve_szparity=true)
ampo = OpSum()
for j = 1:N-1
ampo .+= -4.0,"Sx",j,"Sx",j+1
ampo .+= -2.0,"Sz",j
end
ampo .+= -2.0,"Sz",N
H = MPO(ampo,sites)
state = [isodd(n) ? "Up" : "Dn" for n=1:N]
psi0 = productMPS(sites,state)
sweeps = Sweeps(20) # number of sweeps is 20
maxdim!(sweeps,10,20,100,100,200) # gradually increase states kept
cutoff!(sweeps,1E-14) # desired truncation error
energy,psi = dmrg(H,psi0,sweeps)
println(" Transverse field = ",energy/N)
My first question is, whether the above code with z2 parity can speed up the operation compared to the non-QN conserving ising model code?
My second question is, in the answer to Multi-thread julia ITensor - ITensor Support Q&A it says: for z2 parity , if the blocks are large enough , it may be better to use BLAS/LAPACK multithreading instead of block sparse multithreading. I wonder if my code above applies both BLAS/LAPACK multithreading and z2 parity correctly?
Hi kevinh,
Yes your code looks correct for what you’re trying to do, and I’m glad you figured out about the conserve_szparity
keyword.
-
At a glance, yes it looks like your code is doing the right thing to enable BLAS multithreading and to disable ITensor block-sparse multithreading (which is a good idea if you are using BLAS multithreading). But the most important thing is to test your code on some medium-sized systems with different multithreading settings to see if you can observe a benefit to using it, since the benefits of multithreading (and different kinds of multithreading) depend sensitively and in non-obvious ways on details like the typical block size in the tensors, number of blocks, etc. which are hard to predict.
-
To verify that the
conserve_szparity
setting is working properly, print out the first few sites to check that they carry Z_2 parity quantum numbers:@show sites[1]
etc.