⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 ising.cpp

📁 Ising模型
💻 CPP
字号:
#include "fstream.h"
#include "math.h"
#include "stdlib.h"
#include "iostream.h"
//完成测试
void initialize(int a[],int n)
{	
	int i,j;
	for(i=0;i<n;i++)
	{
		for(j=0;j<n;j++)
		{
			int long x=rand();
			if(x<RAND_MAX/2)
				a[i*n+j]=1;
			else 
				a[i*n+j]=-1;
		}
	}
}
/*
//MCS
void MCS(int a[],int n,double jkt)
{
	//de能量差
	int i,j,m=0,de;
	double p,h;
	for(i=0;i<n;i++)
	{
		for(j=0;j<n;j++)
		{
			m =0;
			m+=a[i*n+(j+1)%n]; //右
			m+=a[i*n+(j+n-1)%n]; //左
			m+=a[((i+1)%n)*n+j]; //下
			m+=a[((i+n-1)%n)*n+j]; //上
			de=m*2*a[i*n+j]; 
		//	temp=max(0,de);// for -if
		//	p=exp(-1*temp*jkt);
			p=exp(-1*de*jkt);
			if(p<1)
			{
				h=rand()*1.0/RAND_MAX;
				if(h<p) a[i*n+j]=a[i*n+j]*(-1);
			}
			else a[i*n+j]=a[i*n+j]*(-1);
		}
	}
}
*/
//MCS
void MCS(int a[],int n,double jkt)
{
	//de能量差
	int i,m=0,de;
	double x,y,p,h,t;
	t=1.0/n; // t步长
	for(i=0;i<n*n;i++)
	{	
		
		x=rand()*1.0/RAND_MAX;
		y=rand()*1.0/RAND_MAX;
		int xx=int(x/t);
		int yy=int(y/t);
		m =0;
		m+=a[xx*n+(yy+1)%n]; //右
		m+=a[xx*n+(yy+n-1)%n]; //左
		m+=a[((xx+1)%n)*n+yy]; //下
		m+=a[((xx+n-1)%n)*n+yy]; //上
		de=m*2*a[xx*n+yy];
		p=exp(-1*de*jkt);
		if(p<1)
		{
			h=rand()*1.0/RAND_MAX;
			if(h<p) a[xx*n+yy]=a[xx*n+yy]*(-1);
		}
		else a[xx*n+yy]=a[xx*n+yy]*(-1);
	}

}
	
//total次MCS
void MCStime(int a[],int n,double jkt,int total)
{
	for(int i=0;i<total;i++)
	{
		MCS(a,n,jkt);
	}
}
//抽样count次 每隔10 MCS 抽样一次 返回值为count次抽样的平均值
double sample(int a[],int n,double jkt,int count)
{	
	double smp=0.0;
	for(int i=0;i<count;i++)
	{
		MCStime(a,n,jkt,10);
		for(int j=0;j<n;j++)
		{
			for(int k=0;k<n;k++)
			{
				smp+=a[j*n+k];
			}
		}
	}
	smp=smp/(n*n)/count;
	return smp;
}
void main()
{
	int total=2000,n=40,count=100;
	double s;

	int * p;
	p=new int[n*n];
	//初始化
	initialize(p,n);

	ofstream outfile("Ising.dat");
	if(! outfile)
	{
		cout<<"can't open the file";
		exit(1);
	}
	
	for(double jkt=0.40;jkt<0.50;jkt+=0.002)
	{
		//多次MCS 达到平衡态
		MCStime(p,n,jkt,total);
		//平衡后抽样,s为抽样平均值
		s=sample(p,n,jkt,count);
		//输出当前jkt下的<s>
		outfile<<jkt<<'\t'<<s<<endl;
	}
	outfile.close();
	delete p;
}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -