Learn to Use ITensor

main / formulas / mixed_sites_dmrg C++v3 | C++v2 | Julia

DMRG Calculation with Mixed Local Hilbert Space Types

The following fully-working example shows how to set up a calculation mixing S=1/2 and S=1 spins on every other site of a 1D system. The Hamiltonian involves Heisenberg spin interactions with adjustable couplings between sites of the same spin or different spin.

Note that the only difference from a regular ITensor DMRG calculation is that the sites array has Index objects which alternate in dimension and in which physical tag type they carry, whether "S=1/2" or "S=1". (Try printing out the sites array to see!) These tags tell the AutoMPO system which local operators to use for these sites when building the Hamiltonian MPO.

using ITensors

let
  N = 100

  # Make an array of N Index objects with alternating
  # "S=1/2" and "S=1" tags on odd versus even sites
  # (The first argument n->isodd(n) ... is an 
  # on-the-fly function mapping integers to strings)
  sites = siteinds(n->isodd(n) ? "S=1/2" : "S=1",N)

  # Couplings between spin-half and
  # spin-one sites:
  Jho = 1.0 # half-one coupling
  Jhh = 0.5 # half-half coupling
  Joo = 0.5 # one-one coupling

  ampo = AutoMPO()
  for j=1:N-1
    ampo += 0.5*Jho,"S+",j,"S-",j+1
    ampo += 0.5*Jho,"S-",j,"S+",j+1
    ampo += Jho,"Sz",j,"Sz",j+1
  end
  for j=1:2:N-2
    ampo += 0.5*Jhh,"S+",j,"S-",j+2
    ampo += 0.5*Jhh,"S-",j,"S+",j+2
    ampo += Jhh,"Sz",j,"Sz",j+2
  end
  for j=2:2:N-2
    ampo += 0.5*Joo,"S+",j,"S-",j+2
    ampo += 0.5*Joo,"S-",j,"S+",j+2
    ampo += Joo,"Sz",j,"Sz",j+2
  end
  H = MPO(ampo,sites)

  sweeps = Sweeps(10)
  maxdim!(sweeps,10,10,20,40,80,100,140,180,200)
  cutoff!(sweeps,1E-8)

  psi0 = randomMPS(sites,4)

  energy,psi = dmrg(H,psi0,sweeps)

  return
end

Back to Formulas
Back to Main