SUNDMRG.jl: traditional DMRG code with full SU(N) symmetry implementation. A part of the code is influenced by Simple DMRG. https://github.com/simple-dmrg/simple-dmrg
- Fully supporting 2D systems
- Fully supporting MPI parallelization
- Fully supporting CUDA and MAGMA
- CUDA-aware MPI
- File-IO
Before ]add
, you must install MAGMA.jl@0.1.2-
. https://github.com/MGYamada/MAGMA.jl
After that, you can do:
]add https://github.com/MGYamada/SUNDMRG.jl.git
If you want to run the simulation of the SU(2) Heisenberg model on the 4x4 square lattice with a default setting, please use the following.
rank, dmrg = run_DMRG(SU(2)HeisenbergModel(), SquareLattice(4, 4), 100, [100, 200, 400, 800], 1600, CPUEngine)
dmrg
is returned only when rank == 0
when you are using the MPI parallelization.
For a more detailed configuration, please look at the examples directory.
Please be careful that the expectation value of the bond operator is returned in the format of Pij - 1 / Nc for SU(Nc) for the accuracy.
SUNDMRG.jl supports an on-the-fly calculation of SU(2) symmetry coefficients (Wigner symbols). The bond Hamiltonian is Si・Sj in the SU(2) case, not Pij = 2 Si・Sj + 1 / 2. SiSj is also evaluated by Si・Sj, not Pij - 1 / 2.
The density matrix mixing (sometimes called a noise term) is a technique to have a better convergence in DMRG. It perturbs the density matrix a little, avoiding being stuck in some local minima. The small perturbation is specified in the second term of the tuple for each sweep as follows.
rank, dmrg = run_DMRG(SU(3)HeisenbergModel(), SquareLattice(6, 6), (100, 1e-5), [(100, 1e-5), (200, 1e-6), (400, 1e-7), (800, 1e-8)], (1600, 0.0), CPUEngine; widthmax = widthmax, tables = tables)
The value has to become zero or a negligibly small value in the last few sweeps.
- Julia 1.6-
- CUDA.jl 5.0.0-
- MAGMA.jl 0.1.2-
- SUNRepresentations.jl 0.1.2-
- MPI.jl: We strongly recommend to use Open MPI.
- Type piracy in lanczos.jl
- Hybrid parallelization
- Supporting the triangular lattice
- Thick-restart Lanczos
- Supporting the kagome lattice
- MPS formulation
- Supporting a spin system not with a fundamental representation per site
Why do we need
signfactor = iseven(Nc) ? -1.0 : 1.0
in finite.jl
?
MIT
- Masahiko G. Yamada
- James R. Garrison
- Ryan V. Mishmash
Please inquire questions to Masahiko G. Yamada (@MGYamada). Some functions are written by @maartenvd. I would also thank Frank Pollmann and Karlo Penc for stimulating discussions.