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

📄 111.txt

📁 晶体生长蒙特卡洛模拟机制 希望和大家共享
💻 TXT
📖 第 1 页 / 共 3 页
字号:
do{
	rnd=R_RANDOM()*State_tree[1];
	k=1;
	while( k < 64 ){
		k*=2;
		if( rnd > State_tree[k] ) {rnd-=State_tree[k];k++;}
	}
	k-=64;
	if( choice_flg[k] == 0 || Nxij[k]<=0) tree_set();
} while( choice_flg[k] == 0 || Nxij[k]<=0 );
	return(k);
}
unsigned char config(a,b,c,i,j)
	int	*a,*b,*c,i,j;
{
	int	I,J,hight,hbius,z;

	I=J=0;
	hight=Surface[i][j];
	if( Crystal[hight-1][i][j]=='A' ) 		*c=0; else *c=16;// 0:在A之下; 16 :在B之下
	z=Base_h[i][j]-Base_h[i][P_Y[j+2]];
	if(z/3==0){hbius=hight;}
	else if(z>0){hbius=hight+(z+1)/4;} else {hbius=hight+(z-1)/4;}
	switch( Crystal[hbius][i][P_Y[j+2]] ){
		case 'A'	: I++;break;
		case 'B'	: J++;break;
	}
	z=Base_h[i][j]-Base_h[i][P_Y[j]];
	if(z/3==0){hbius=hight;}
	else if(z>0){hbius=hight+(z+1)/4;} else {hbius=hight+(z-1)/4;}
	switch( Crystal[hbius][i][P_Y[j]] ){
		case 'A'	: I++;break;
		case 'B'	: J++;break;
	}
	z=Base_h[i][j]-Base_h[P_X[i+2]][j];
	if(z/3==0){hbius=hight;}
	else if(z>0){hbius=hight+(z+1)/4;} else {hbius=hight+(z-1)/4;}
	switch( Crystal[hbius][P_X[i+2]][j] ){
		case 'A'	: I++;break;
		case 'B'	: J++;break;
	}
	z=Base_h[i][j]-Base_h[P_X[i]][j];
	if(z/3==0){hbius=hight;}
	else if(z>0){hbius=hight+(z+1)/4;} else {hbius=hight+(z-1)/4;}
	switch( Crystal[hbius][P_X[i]][j] ){
		case 'A'	: I++;break;
		case 'B'	: J++;break;
	}
	*a=I;
	*b=J;
	return( Crystal[hight][i][j] );
}
#ifdef	GR
wait_key()
{
	int c;
	while( (c=INKEY()) == 255 );
	return(c);
}
#endif
/*在惯例之下为图表*/
#ifdef	GR
static int POINT_SIZE;
#define LX 6
#define LY 4
#define LZ 4
#define Hd 2
static int Lx=6;
static int Ly=4;
static int Lz=4;
static int Lxx,Lyy,Lzz,Lzs,Lshift;
static int Show_sizex;
static int Screen[1280];
static char OLD_COLOR[M_SIZE][M_SIZE];

PSETWI(int n)
{int IU,IV;
	if( n<2 ) n=1;
    POINT_SIZE=n;
	G_COLOR_INDEX(COLOR_INDEX);
// GWldcsiz((float)(n), (float)(n), &IU, &IV);
//printf("Size= %d %d %d\n",n,IU,IV);
//GWsetpen(-1,-1,IU, -1);
}
PSETW(int x,int y,int c)
{ int i;
if(Disp_mode !=2 )return;
    x *=POINT_SIZE;
    y *=POINT_SIZE;
	GWsrect((float)x,(float)(CRT_HIGHT-y),(float)(x+POINT_SIZE),
			(float)(CRT_HIGHT-(y+POINT_SIZE)),COLOR_INDEX[c%16]);
}

PSET_BI(int n)
{
int i;
if(sizex>=sizey)i=sizex;else i=sizey;
PSETWI(CRT_HIGHT/i);
for(i=0;i<1280;Screen[i]=4000,i++);
	if( sizex > 31 ) Show_sizex=31; else Show_sizex=sizex-1;
	Lx=LX*n; Ly=LY*n; Lz=LZ*n;
	Lxx=Lx-1; Lyy=Ly-1; Lzz=Lz-1;
	Lzs=Lz*Show_sizex;Lshift=CRT_HIGHT-1-Show_sizex*Lz-3*Lz;
}
int kabeSW=1;
repaint()
{
	int j,k,h,KLim;
	int c;
	KLim=sizey;
	if(sizey>=CRT_HIGHT){KLim=CRT_HIGHT;}
//GWmode(1,1);
//GWsetogn(0,-1);
if( Disp_mode == 2){	
	for(j=0;j<sizex;j++) for(k=0;k<KLim;k++) {
		h=Surface[j][k];
		if( Crystal[h][j][k] == 'A' ){
				c=(h+CNP+Color_Base[j])%CN + A_atom;
        } else {
				c=(h+CNP+Color_Base[j])%CN + B_atom;
        }
		if(c!=OLD_COLOR[j][k]){PSETW(j,k,c);OLD_COLOR[j][k]=c;}
	}
}
if( Disp_mode == 1 ){
	for(j=0;j<=Show_sizex;j++) for(k=0;k<=Show_sizex;k++) {
		h=Surface[j][k];
		if( Crystal[h][j][k] == 'A' ){
			PSET_BN(j,k,h,A_atom);
		} else {
			PSET_BN(j,k,h,B_atom);
		}
	}
	kabe_nuri();
}
//GWflush(-1);
}
kabe_nuri()
{
	int	i,j;
	for(i=0;i<=Show_sizex;i++){
		for(j=BASE-3;j<Surface[Show_sizex][i]+Base_h[Show_sizex][i];j++)
			{kabex(Show_sizex,i,j);}
		for(j=BASE-3;j<Surface[i][Show_sizex]+Base_h[i][Show_sizex];j++)
			{kabey(i,Show_sizex,j);}
	}
}
float PL[4][2];
kabex(x,y,z)
{
	int h,xx,yy,i,xs,ys,hh;

	h=z-BASE;
	if( Crystal[z-Base_h[x][y]][x][y] == 'A' ) hh= (z+CNP)%CN + A_atom;
				else  hh= (z+CNP)%CN + B_atom;
	xx=x*Lx+Lzs-y*Lz;
	yy=y*Lz-h*Ly+Lshift;
	G_COLOR(hh);hh=COLOR_INDEX[hh];
	G_COLOR(0);
	GWsetbrs(hh,1,0);
	PL[0][0]=xx+Lx;PL[0][1]=CRT_HIGHT-yy;
	PL[1][0]=xx+Lx;PL[1][1]=CRT_HIGHT-(yy-Ly);
	PL[2][0]=xx+Lx+Lz;PL[2][1]=CRT_HIGHT-(yy-Ly-Lz);
	PL[3][0]=xx+Lx+Lz;PL[3][1]=CRT_HIGHT-(yy-Lz);
	GWpolygon(PL,4,0);	
}
kabey(x,y,z)
{
	int h,xx,yy,i,xs,ys,hh;

	h=z-BASE;
	if( Crystal[z-Base_h[x][y]][x][y] == 'A' ) hh= (z+CNP)%CN + A_atom;
				else  hh= (z+CNP)%CN + B_atom;
	xx=x*Lx+Lzs-y*Lz;
	yy=y*Lz-h*Ly+Lshift;
	G_COLOR(hh);hh=COLOR_INDEX[hh];
	G_COLOR(0);
	GWsetbrs(hh,1,1);
	PL[0][0]=xx;PL[0][1]=CRT_HIGHT-yy;
	PL[1][0]=xx+Lx;PL[1][1]=CRT_HIGHT-yy;
	PL[2][0]=xx+Lx;PL[2][1]=CRT_HIGHT-(yy-Ly);
	PL[3][0]=xx;PL[3][1]=CRT_HIGHT-(yy-Ly);
	GWpolygon(PL,4,0);	
}
PSET_BN(int x,int y,int z,int c)
{
	int h,hh,xx,yy,i,xs,ys;
	if(Disp_mode !=1 ) return;
	if(x<0 || x>Show_sizex || y<0 || y>Show_sizex) return;
	h=z-BASE; hh=(z+CNP)%CN+c;
	xx=x*Lx+Lzs-y*Lz;
	yy=y*Lz-h*Ly+Lshift;
	G_COLOR(hh);hh=COLOR_INDEX[hh];
	G_COLOR(0);
	GWsetbrs(hh,1,1);
	PL[0][0]=xx;PL[0][1]=CRT_HIGHT-yy;
	PL[1][0]=xx+Lx;PL[1][1]=CRT_HIGHT-yy;
	PL[2][0]=xx+Lx;PL[2][1]=CRT_HIGHT-(yy-Ly);
	PL[3][0]=xx;PL[3][1]=CRT_HIGHT-(yy-Ly);
	GWpolygon(PL,4,0);
	PL[0][0]=xx+Lx;PL[0][1]=CRT_HIGHT-yy;
	PL[1][0]=xx+Lx;PL[1][1]=CRT_HIGHT-(yy-Ly);
	PL[2][0]=xx+Lx+Lz;PL[2][1]=CRT_HIGHT-(yy-Ly-Lz);
	PL[3][0]=xx+Lx+Lz;PL[3][1]=CRT_HIGHT-(yy-Lz);
	GWpolygon(PL,4,0);
	PL[0][0]=xx;PL[0][1]=CRT_HIGHT-(yy-Ly);
	PL[1][0]=xx+Lx;PL[1][1]=CRT_HIGHT-(yy-Ly);
	PL[2][0]=xx+Lx+Lz;PL[2][1]=CRT_HIGHT-(yy-Ly-Lz);
	PL[3][0]=xx+Lz;PL[3][1]=CRT_HIGHT-(yy-Ly-Lz);
	GWpolygon(PL,4,0);
}
PSET_H_check(int x,int y,int L){
	int xs,ys,SW,i;
	SW=0;
	xs=x;ys=y;
	for(i=0;i<L;i++){
		if(Screen[xs]>=ys){SW=1;break;}
		xs++;ys--;
	}
	if(SW==0) return;
	x=xs;y=ys;
	for(;i<L;i++){
		xs++;ys--;
		if(Screen[xs]<ys){xs--;ys++;break;}
	}
	G_LINE(x,y,xs,ys);
}
PSET_BNN(int x,int y,int z,int c)
{
	int h,hh,xx,yy,i,xs,ys,k;
	h=z-BASE; hh=(z+CNP)%CN+c;
	xx=x*Lx+Lzs-y*Lz;
	yy=y*Lz-h*Ly+Lshift;xs=hh;
	G_COLOR(hh);hh=COLOR_INDEX[hh];
	GWsetbrs(hh,1,1);
	k=0;
		if(Screen[xx+2]>=yy-Ly-1)
			{PL[k][0]=xx;PL[k][1]=CRT_HIGHT-(yy-Ly);k++;}
		if(Screen[xx+Lx]>=yy-Ly)
			{PL[k][0]=xx+Lx;PL[k][1]=CRT_HIGHT-(yy-Ly);k++;}
		else
			{for(i=xx+Lx-1;i>xx;i--){
					if(Screen[i]>=yy-Ly){
						PL[k][0]=i;PL[k][1]=CRT_HIGHT-(yy-Ly);k++;
						break;
					}
				}
			}
		if(Screen[xx+Lx+Lz-2]>=yy-Ly-Lz+1)
			{PL[k][0]=xx+Lx+Lz;PL[k][1]=CRT_HIGHT-(yy-Ly-Lz);k++;}
		else
			{for(i=xx+Lx+Lz-2;i>xx+Lz;i--){
					if(Screen[i]>=yy-Lz-Ly+1){
						PL[k][0]=i;PL[k][1]=CRT_HIGHT-(yy-Ly-Lz);k++;
						break;
					}
				}
			}
		if(Screen[xx+Lz]>=yy-Ly-Lz+1)
			{PL[k][0]=xx+Lz;PL[k][1]=CRT_HIGHT-(yy-Ly-Lz);k++;}
		else
			{for(i=xx+Lz+1;i<xx+Lx+Lz;i++){
					if(Screen[i]>=yy-Lz-Ly+1){
						PL[k][0]=i;PL[k][1]=CRT_HIGHT-(yy-Ly-Lz);k++;
						break;
					}
				}
			}
	if(k>2)GWpolygon(PL,k,0);//上面
	k=0;
		if(Screen[xx+Lx]>=yy)
			{PL[k][0]=xx+Lx;PL[k][1]=CRT_HIGHT-yy;k++;}
		if(Screen[xx+Lx+1]>=yy-Ly)
			{PL[k][0]=xx+Lx;PL[k][1]=CRT_HIGHT-(yy-Ly);k++;}
		if(Screen[xx+Lx+Lz-1]>=yy-Ly-Lz+2)
			{PL[k][0]=xx+Lx+Lz;PL[k][1]=CRT_HIGHT-(yy-Ly-Lz);k++;}
		if(Screen[xx+Lx+Lz-1]>=yy-Lz)
			{PL[k][0]=xx+Lx+Lz;PL[k][1]=CRT_HIGHT-(yy-Lz);k++;}
		if(k>2) GWpolygon(PL,k,0);//右側面
	k=0;
		if(Screen[xx]>=yy)//{
			{PL[k][0]=xx;PL[k][1]=CRT_HIGHT-yy;k++;}
		if(Screen[xx+Lx-1]>=yy)
			{PL[k][0]=xx+Lx;PL[k][1]=CRT_HIGHT-yy;k++;}
		if(Screen[xx+Lx-1]>=yy-Ly+1)
			{PL[k][0]=xx+Lx;PL[k][1]=CRT_HIGHT-(yy-Ly);k++;}
		if(Screen[xx+1]>=yy-Ly+1)
			{PL[k][0]=xx;PL[k][1]=CRT_HIGHT-(yy-Ly);k++;}
	if(k>2) GWpolygon(PL,k,0);//前面
	G_H_H_line(xx+Lz,yy-Ly-Lz,0,Lx);
	G_H_H_line(xx,yy,0,Lx);
	G_H_H_line(xx,yy-Ly,0,Lx);
	G_H_V_line(xx,yy-Ly,0,Ly+1);
	G_H_V_line(xx+Lx,yy-Ly,0,Ly+1);
	G_H_V_line(xx+Lx+Lz,yy-Ly-Lz,0,Ly+1);
	G_COLOR(0);
	PSET_H_check(xx+Lx,yy-Ly,Ly);
	PSET_H_check(xx+Lx,yy,Ly);
	PSET_H_check(xx,yy-Ly,Ly);
}
PSET_BH(int x,int y,int z,int c)
{
	int h,hh,xx,yy,i,xs,ys;
	if(Disp_mode != 1) return;
	if(x<0 || x>Show_sizex || y<0 || y>Show_sizex) return;
	Make_Screen(x,y);
	PSET_BNN(x,y,z,c);
}
Make_Screen(int x,int y)
{
int i,j,y1,x2,xs,xe;
	y1=y+Hd;if(y1>Show_sizex) y1=Show_sizex;
	x2=x+Hd;if(x2>Show_sizex) x2=Show_sizex;
	xs=x*Lx+Lzs-y1*Lz;
	xe=(x2+1)*Lx+Lzs-(y-1)*Lz;
	for(i=xs;i<=xe;i++) Screen[i]=4000;
	for(i=x+1;i<=x2;i++){Mask_Screen(i,y);}
	for(j=y+1;j<=y1;j++) for(i=x;i<=x2;i++){Mask_Screen(i,j);}
}
Mask_Screen(int x,int y)
{
int	xx,yy,h,i;
	if( x<0 || x>Show_sizex || y<0 || y>Show_sizex ) return;
	h=Surface[x][y]-BASE+Base_h[x][y];
	xx=x*Lx+Lzs-y*Lz;
	yy=y*Lz-(h+1)*Ly+Lshift+1;
	for(i=xx;i<=xx+Lz;i++){
		yy--;
		if( yy<Screen[i] ) Screen[i] =yy;
	}	
	for(;i<=xx+Lzz+Lx;i++){
		if( yy<Screen[i] ) Screen[i] =yy;
	}
}
PSET_BE(int x,int y,int z,int c)
{
	int i,j,a,b,zz;
	if(Disp_mode !=1 ) return;
	if(x<0 || x>Show_sizex || y<0 || y>Show_sizex) return;
	if( y<1 || x<1 ) {PSET_cl(x,y,z+1);}
	for(i=x-Hd;i<=x;i++) if( i>=0 && i<=Show_sizex ) {
 		for(j=y-Hd;j<=y;j++){
		if( j>=0 && j<=Show_sizex ) {
		if( config(&a,&b,&zz,i,j) == 'A' ) c=A_atom; else c=B_atom;
//getch();
			PSET_BH(i,j,Surface[i][j]+Base_h[i][j],c);
		}
	}}
}
PSET_cl(int x,int y,int z)
{
int h,hh,xx,yy,i,xs,ys;
Make_Screen(x,y);
h=z-BASE;
	xx=x*Lx+Lzs-y*Lz;
	yy=y*Lz-h*Ly+Lshift;
	G_COLOR(0);hh=COLOR_INDEX[0];
	GWsetbrs(hh,1,1);
/*
	PL[0][0]=xx;PL[0][1]=CRT_HIGHT-yy;
	PL[1][0]=xx+Lx+Lz;PL[1][1]=CRT_HIGHT-yy;
	PL[2][0]=xx+Lx+Lz;PL[2][1]=CRT_HIGHT-(yy-Ly-Lz);
	PL[3][0]=xx;PL[3][1]=CRT_HIGHT-(yy-Ly-Lz);
	GWpolygon(PL,4,0);
	
*/
	PL[0][0]=xx;PL[0][1]=CRT_HIGHT-(yy-Ly);
	PL[1][0]=xx+Lx;PL[1][1]=CRT_HIGHT-(yy-Ly);
	PL[2][0]=xx+Lx+Lz;PL[2][1]=CRT_HIGHT-(yy-Ly-Lz);
	PL[3][0]=xx+Lz;PL[3][1]=CRT_HIGHT-(yy-Ly-Lz);
	GWpolygon(PL,4,0);
	PL[0][0]=xx+Lx;PL[0][1]=CRT_HIGHT-yy;
	PL[1][0]=xx+Lx;PL[1][1]=CRT_HIGHT-(yy-Ly);
	PL[2][0]=xx+Lx+Lz;PL[2][1]=CRT_HIGHT-(yy-Ly-Lz);
	PL[3][0]=xx+Lx+Lz;PL[3][1]=CRT_HIGHT-(yy-Lz);
	GWpolygon(PL,4,0);
	PL[0][0]=xx;PL[0][1]=CRT_HIGHT-yy;
	PL[1][0]=xx+Lx;PL[1][1]=CRT_HIGHT-yy;
	PL[2][0]=xx+Lx;PL[2][1]=CRT_HIGHT-(yy-Ly);
	PL[3][0]=xx;PL[3][1]=CRT_HIGHT-(yy-Ly);
	GWpolygon(PL,4,0);
	return;
}
G_H_line(xs,ys,color,length)
{
	if( ys<0 || ys>=CRT_HIGHT || xs>=CRT_WIDE ) return;
	if(xs<0) {
		xs=0;length+=xs;
		if( length<=0 ) return;
	}
	if( xs+length > CRT_WIDE ) length=CRT_WIDE-xs;
	G_horizontal_line(xs,ys,color,length);
}
G_H_H_line(xs,ys,color,length)
{
int	i,j;

	if( Screen[xs]>=ys ){
		if( Screen[xs+length-1] >= ys ) G_H_line(xs,ys,color,length);
			else {
				for(i=xs+length-2;i>=xs;i--){
					length--;
					if( Screen[i] >= ys ) break;
				}
				G_H_line(xs,ys,color,length);
			}
	} else {
		if( Screen[xs+length-1] >= ys ){
			j=xs+length-1;
			for(i=xs+1;i<j;i++){
				length--;
				if( Screen[i] >= ys ) break;
			}
			xs=i;
			G_H_line(xs,ys,color,length);
		}
	}
}
G_V_line(xs,ys,color,length)
{
	if( xs<0 || xs>=CRT_WIDE || ys>=CRT_HIGHT ) return;
	if(ys<0) {
		ys=0;length+=ys;
		if(length<=0) return;
	}
	if( ys+length > CRT_HIGHT ) length=CRT_HIGHT-ys;
	G_vertical_line(xs,ys,color,length);
}
G_H_V_line(xs,ys,color,length)
{
int	i;

	if( (i=Screen[xs-1]) >= ys ){
		if( i < ys+length ) length=i-ys+1;
		G_V_line(xs,ys,color,length);
	}
}
G_H_PSET(xs,ys,color)
{
	if( Screen[xs] >= ys ) G_PSET(xs,ys,color);
}
static	int		crt_shift;
static	double	norm;
graph_init()
{
	int i;
G_WINDOW(CRT_WIDE,CRT_HIGHT);
	G_INIT();
//getch();
//GWmode(1,1);
	GWarrange(6);
//	GWsize(3,&O_IW,&O_IH);
        G_PALETTE(3,0,0,0);
        G_PALETTE(1,0,255,0);
        G_PALETTE(2,255,0,0);
        G_PALETTE(0,255,255,255);
        G_PALETTE(4,0,0,255);
        G_PALETTE(5,255,255,0);
        G_PALETTE(6,0,255,255);
        G_PALETTE(7,255,0,255);

        G_PALETTE(8,200,200,200);
        G_PALETTE(9,0,127,0);
        G_PALETTE(10,127,0,0);
        G_PALETTE(11,100,100,100);
        G_PALETTE(12,0,0,127);
        G_PALETTE(13,127,127,0);
        G_PALETTE(15,127,0,127);
        G_PALETTE(14,0,127,127);
	GWmode(1,0);
	G_CLS();
	PSET_BI(PSET_SIZE);
	norm=(double)(CRT_WIDE-crt_shift)/sizex/sizex;
	crt_shift=PSET_SIZE*sizex*4;
	G_CLS();
}
#endif










⌨️ 快捷键说明

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