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); }