二维方格子Ising模型代码

#include 
#include 
#include 
#include 
#include

using namespace std;

ofstream out("data.dat");
const int L = 50;                //模拟尺寸             
const int MCS = 20000;           //总的模拟步数  
const int MS = 10000;             //除去预热统计的步数 
const double J = -1;             //J=1AFM,J=-1FM
            
double H = 0;

double InitialSpin(int s[][L])
{
	for (int i = 0; i < L; i++)
	{
		for (int j = 0; j < L; j++)
		{
			//s[i][j] = 1; 
			s[i][j]= 2 * (rand() % 2) - 1;
		}
	}
	return 0;
}
//随机初始化自旋分布 
//----------------------------------------

double ExchangeEnergy(int Spin[][L])
{
	int down,up,left,right;
	double e = 0;
	for (int i = 0; i < L; i++)
	{
		for (int j = 0; j < L; j++)
		{
			
			e += J*Spin[i][j]*(Spin[(i+1)%L][j]+Spin[(i-1+L)%L][j]+Spin[i][(j+1)%L]+Spin[i][(j-1+L)%L]);
		}
	}
	return e;
}
// 计算体系的总能量 

//计算格点的局域能量 
double Magnetization(int s[][L])
{
	double m = 0;
	for (int i = 0; i < L; i++)
	{
		for (int j = 0; j < L; j++)
		{
			m += s[i][j];
		}
	}
	return m;
}
//输出体系的磁性 
void MonteCarlo(int Spin[][L],double T)
{
	int iaccept = 0;//统计接受样本 
	double se = 0;
	double se2 = 0;
	double sm = 0;
	double sm2 = 0;
	double de = 0;
	double m;
	int up,down,right,left;
	int E1,E2;
	double p,r;
	for (int mcs = MCS; mcs > 0; mcs--)
	{
		for(int i=0;ip)
                 {
                 	Spin[i][j]=-Spin[i][j];
                 	iaccept++;
				 }
                
                
		       }
           
			}
		}
				if (mcs < MS)
		{
			m=0;
			 m = Magnetization(Spin) / L / L;         //输出总磁矩 
			sm += m;         //将每一步磁矩求和取平均 
			sm2 += m*m;      //将每一步磁矩的平方求和 
			double e = ExchangeEnergy(Spin) / L / L - H*m;  //体系总能量 
			se += e;        //将每一步能量求和取平均 
			se2 += e*e;    //将每一步能量平方求和取平均 
		}
		}
	se/=MS;
	se2 /= MS;
	sm /= MS;
	sm2 /= MS;
	double Capacity = (se2 - se*se) / T / T;//热容的定义 
	double Manet = (sm2 - sm*sm) / T;   //磁化率定义 
	out << T << '\t'  << '\t' << se << '\t' << Capacity << '\t' << sm << '\t' <

你可能感兴趣的:(算法)