Programming: Monte-Carlo simulation of spin-glass model

Write a complete Monte-Carlo simulation program for the Sherrington–Kirkpatrick model of spin glass.

The model is defined by the Hamiltonian, \[H=-\sum_{i<j}J_{i,j}s_i s_j,\] where $s_i=\pm 1$ with $i=0,..,N-1$ are the $N$ spins of the system.

Both structure ($h_i$,$J_{i,j}$) and state ($s_i$) data are stored in one dimensional arrays.

int sz = 64;
int * spin = new int[sz];
double * h = new double [sz];
double * j = new double [sz*(sz-1)/2];

Since the coupling involves two spins, it is instinctive to use a two-dimensional array for j. However, in a more general view, it is clearer to serialize the iteration into one over links instead of two nodes. This also reduces redundancy.

Since we are using C++, we will use the vector class in place of array pointers:

std::vector<int> spin;
std::vector<double> h;
std::vector<double> j;

For couplings, we use struct Link to keep track of the nodes involved in each bond.

struct Link {
	int n0;
	int n1;
};
std::vector<Link> lnks;

For portability of data, we use HDF5 library. Here, we try the C++ binding of the library.

#include <H5Cpp.h>
#include <vector>
 
std::vector<double> h;
std::vector<double> j;
 
void load_params(std::string filename)
{
        using namespace H5;
        H5File f(filename,H5F_ACC_RDONLY);
        // read h
        DataSet d = f.openDataSet("h");
        hsize_t sz;
        d.getSpace().getSimpleExtentDims(&sz,0);
        h.resize(sz);
        d.read(h.data(),PredType::NATIVE_DOUBLE);
        // read j
        d = f.openDataSet("j");
        d.getSpace().getSimpleExtentDims(&sz,0);
        j.resize(sz);
        d.read(j.data(),PredType::NATIVE_DOUBLE);
}