//=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=* // Program ising //=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=* #include "cip.h" #include "nxgraph.h" //---- definition of fundermental constants //---- physical constants const double J = 1.0; // bonding constant const double H = 0.0; // external magnetic field const int SIZE = 16; // size of lattice //---- experimental settings // settings about temperature const double T_INIT = 0.25; // initial temperature const double T_FINA = 5.00; // final temperature const double T_STEP = 0.25; // increments // settings about sweep the lattice const int RELAX = 400; // steps till relaxation const int INTERVAL = 10; // steps per one measure // settings about number of data to measure fluctuations of ... const int SAMPLES = 40; // energy, magnetization const int GROUPS = 20; // susceptibility, specific heat // file names of output data const char* fnames[4] = { "energy.dat", "magnet.dat", "suscep.dat", "spheat.dat" }; // titles of each quantities const char* titles[4] = { "Energy", "Magnetization", "Susceptibility", "Specific heat" }; // file pointers static FILE* fptrs[4]; //---- index indicators const int ENERGY = 0; const int MAGNET = 1; const int SUSCEP = 2; const int SPHEAT = 3; //---- graphics settings const int WIN_WIDTH = 256; const int WIN_HEIGHT = 256; //---- declaration and definition of class Statistic class Statistic { int n; // current total of data double sum1, sum2; // current sum of data and its square public: inline Statistic( void ){ n = 0; sum1 = sum2 = 0.0; } //-- adds a new datum inline void Add( double datum ){ n++; sum1 += datum; sum2 += datum*datum; } //-- current mean value inline double Mean( void ){ return sum1/n; } //-- current variance value inline double Variance( void ){ return (sum2 - sqr(sum1)/n)/(n-1); } //-- current deviation value inline double Deviation( void ){ return sqrt( Variance() ); } //-- current deviation of mean value, namely error value inline double Error( void ){ return sqrt( Variance()/n ); } }; //---- declaration and difinition of class Spin class Spin { int spin; // the value of spin, it takes +1 or -1 public: //-- sets this spin randomly +1 or -1 void RandSet( void ){ if( Urand() > 0.5 ) spin = +1; else spin = -1; } //-- represents the value of spin when this object is called operator int (){ return spin; } //-- transits this spin by given probability void Transit( int s_sum, double prob ){ if( Urand() < prob ) spin = +1; else spin = -1; } }; //---- declaration of class Lattice class Lattice { Spin spin[SIZE][SIZE]; // spins in this lattice double prob[5]; // table of transition probability public: Lattice( double T ); void Sweep( int interval ); void Measure( Statistic& Energy, Statistic& Magnet ); void Draw( void ); private: inline void Neighbor( int& im, int& ip, int i ); }; //---- makes transition propability table and let spins randomly turn Lattice::Lattice( double T ) { for( int s_sum=-4 ; s_sum<=+4 ; s_sum+=2 ){ double eplus = exp( (J*s_sum+H)/T ); prob[s_sum/2+2] = eplus/(eplus+1.0/eplus); } for( int ix=0 ; ix