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"
#include "itensor/util/print_macro.h"
using namespace itensor;
int main()
{
int N = 6;
Real tau = 10.;
int Npass = 4;
auto sites = SpinHalf(N);
//inds(SiteSet) -> IndexSet is a convenient function
//for extracting the indices of a SiteSet
auto indices = inds(sites);
//Make a random initial wavefunction psi with 0 magnetization
//psi is an ITensor with all of the site indices in "sites";
auto psi = randomITensor(QN({"Sz",0}),indices);
//Make the Hamiltonian as an MPO
auto ampo = AutoMPO(sites);
for( auto j : range1(N-1) )
{
ampo += 0.5,"S+",j,"S-",j+1;
ampo += 0.5,"S-",j,"S+",j+1;
ampo += "Sz",j,"Sz",j+1;
}
auto Hmpo = toMPO(ampo);
//Make a single ITensor out of the MPO
auto H = Hmpo(1);
for(auto j : range1(2,N)) H *= Hmpo(j);
//Create expH = exp(-tau*H)
auto expH = expHermitian(H,-tau);
//Apply expH to psi a few times to project into ground state
auto gs = psi; //initialize to psi
for(int n = 1; n <= Npass; ++n)
{
gs *= expH;
gs.noPrime();
gs /= norm(gs);
}
Print(gs);
//Compute the ground state energy
auto E0 = elt(prime(dag(gs))*H*gs);
Print(E0);
//Compute the variance <H^2>-<H>^2 to check that gs is
//an eigenstate. The result "var" should be very small.
auto H2 = multSiteOps(H,H);
auto var = elt(prime(dag(gs))*H2*gs)-(E0*E0);
Print(var);
return 0;
}
Back to Formulas
Back to Main