Learn to Use ITensor
Exactly Compute Ground State of a Small Hamiltonian
As a test for more scalable codes, it is often useful to work in the full Hilbert space and exactly find the ground state of the Hamiltonian of a small system.
Below is a code that initializes a random wavefunction as a single ITensor, then applies @@e^{-\tau\, H}@@ a few times to this ITensor wavefunction to obtain the ground state.
#include "itensor/all.h" using namespace itensor; using std::vector; int main() { int N = 6; Real tau = 10.; int Npass = 4; auto sites = SpinHalf(N); //Make initial wavefunction psi a random state auto indices = vector<Index>(); for(auto j : range1(N)) indices.push_back(sites(j)); //psi is an ITensor with all of the site indices in "sites"; auto psi = ITensor(indices); //randomize the elements of psi randomize(psi); //Make the Hamiltonian as a single ITensor ITensor H; for(auto b : range1(N-1)) { auto term = sites.op("Sz",b)*sites.op("Sz",b+1); term += 0.5*sites.op("S+",b)*sites.op("S-",b+1); term += 0.5*sites.op("S-",b)*sites.op("S+",b+1); for(auto j : range1(b-1)) term *= sites.op("Id",j); for(auto j : range1(b+2,N)) term *= sites.op("Id",j); H += term; } //Create eH = exp(-tau*H) auto eH = expHermitian(H,-tau); //Apply eH to psi a few times to project into ground state auto gs = psi; //initialize to psi for(int n = 1; n <= Npass; ++n) { gs = (eH*gs).noprime(); gs /= norm(gs); } Print(gs); //Compute the ground state energy auto E0 = (prime(gs)*H*gs).real(); Print(E0); //Compute the variance to check that gs is //an eigenstate. The result "var" should be very small. auto H2 = multSiteOps(H,H); auto var = (prime(gs)*H2*gs).real()-E0*E0; Print(var); return 0; }
