This is an old revision of the document!
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.
System representation
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.
Data storage
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); }