📄 111.txt
字号:
int a,b,c,I,J;
unsigned char atom;
for(i=0;i<sizex;i++) for(j=0;j<sizey;j++){
atom=config(&a,&b,&c,i,j);//如果底部是A,c=0;B,如果是,16
k=a*(11-a)/2+b;
if(atom=='A'){
k+=c;
} else {
k+=32+c;
}
Config[i][j]=k;
}
}
surface_init()//SPI
{
int i,j,k,sz;
unsigned char A,B,T;
unsigned char *pt;
for(i=BASE;i<HORIZON;i++) for(j=0;j<sizex;j++) for(k=0;k<sizey;k++)
{
Crystal[i][j][k]=0;
}
A='A';B='B';
i=BASE;
for(j=0;j<sizex;j++){for(k=0;k<sizey;k++){
if( INIT1 > R_RANDOM()*100.0 ) Crystal[i][j][k]=B;
else Crystal[i][j][k]=A;
}}
for(i=0;i<=BASE-1;i++){for(j=0;j<sizex;j++){for(k=0;k<sizey;k++){
if( INIT1 > R_RANDOM()*100.0 ) Crystal[i][j][k]=B;
else Crystal[i][j][k]=A;
}}}
for(j=0;j<sizex;j++) for(k=0;k<sizey;k++) {
Surface[j][k]=BASE;
}
}
//Surface[x][y]*(4=Bius)+Base_h[x][y] 如此它测试高度。
/*周期性边界条件和集合为介绍步*/
Spiral_Base_Set(){
int m,n,h,hh,i,k;
m=sizex/2;n=sizey/2;
h=0;
for(i=Step_N;i>0;i--){ //Spiral source
hh=h;
for(k=0;k<i;k++){Base_h[m-k][n-i+1]=hh;hh++;}
for(k=0;k<i;k++){Base_h[m-i+1][n-i+2+k]=hh;hh++;}
for(k=0;k<i;k++){Base_h[m-i+2+k][n+1]=hh;hh++;}
for(k=0;k<i;k++){Base_h[m+1][n-k]=hh;hh++;}
h=h+3;
}
for(i=0;i<n-Step_N+1;i++)Base_h[m+1][i]=Step_N*4-1;
for(i=0;i<=n+1;i++){ //右上整形
k=m+2;
while(Base_h[k-1][i]>0){Base_h[k][i]=Base_h[k-1][i]-1;k++;}
}
for(i=m-1;i>=m-Step_N+1;i--){ //上中間整形
k=n-Step_N;
while(Base_h[i][k-1]>0){Base_h[i][k]=Base_h[i][k-1]-1;k--;}
}
for(i=0;i<=n+1;i++){
k=m-Step_N;
while(Base_h[k+1][i]>0){Base_h[k][i]=Base_h[k+1][i]-1;k--;}
}
for(i=0;i<sizex;i++){
k=n+2;
while(Base_h[i][k-1]>0){Base_h[i][k]=Base_h[i][k-1]-1;k++;}
}
}
Step_Base_Set(){
int i,j,k,m,jj,n;
k=sizex/Step_N;n=Step_N;
jj=0;
for(i=k/2;i<sizex;i += k){
for(j=jj;j<=i;j++)Color_Base[j]=n;
n--;jj=i+1;
for(m=1;m<=3;m++){
for(j=0;j<sizey;j++){
Base_h[i-3+m][j]=m;
}
}
}
for(j=i;j<sizex;j++)Color_Base[j]=n;
}
perio_set()
{
int i,k;
for(i=1;i<=sizex;i++) P_X[i]=i-1;for(i=1;i<=sizey;i++)P_Y[i]=i-1;
for(i=0;i<sizex;i++)for(k=0;k<sizey;k++){Base_h[i][k]=0;}
for(i=0;i<sizex;i++) Color_Base[i]=0;
if(MODEL==1){
SPI_UP_x=sizex-2;SPI_LOW_x=1; SPI_UP_y=sizey-2;SPI_LOW_y=1;
P_X[0]=1;P_X[sizex+1]=sizex-2; P_Y[0]=1;P_Y[sizey+1]=sizey-2;//Spiral; 对称界限
Spiral_Base_Set();
} else {
SPI_UP_x=sizex;SPI_LOW_x=-1; SPI_UP_y=sizey;SPI_LOW_y=-1;
P_X[0]=sizex-1;P_X[sizex+1]=0; P_Y[0]=sizey-1;P_Y[sizey+1]=0;//周期境界
if(Step_N>0){
Step_Base_Set();
}
}
}
int furoku;
prob_def()
{
int i,j,k;
double ramda_A,ramda_B,kmxa,kmxb;
k_a=(1-alpha)*F;k_b=alpha*F;
ramda_A=ramda_a*ramda_a;
ramda_B=ramda_b*ramda_b;
for(k=0;k<STATE;k++) {
Kxij[k]=0.0;choice_flg[k]=Prob[k][0]=Prob[k][1]=Prob[k][2]=0;
}
for(i=0;i<5;i++)for(j=0;j<5;j++){
if(i+j>4) continue; //这里4。1它下
k=i*(11-i)/2+j; //这个系统是重要的
choice_flg[k]=choice_flg[k+16]=choice_flg[k+32]=choice_flg[k+48]=1;
kmxa=exp(-i*fai_aa-j*fai_ab);kmxb=exp(-i*fai_ab-j*fai_bb);
Kxij[k]=k_a+k_b+(1.0+ramda_A)*kmxa*exp(-fai_aa);// 在A A之下
Kxij[k+16]=k_a+k_b+(1.0+ramda_A)*kmxa*exp(-fai_ab);//在A B之下
Kxij[k+32]=k_a+k_b+(1.0+ramda_B)*kmxb*exp(-fai_ab_v);// 在A之下Kxij[k+48]=k_a+k_b+(1.0+ramda_B)*kmxb*exp(-fai_bb);// 在B之下
Prob[k][0]=ramda_A*kmxa*exp(-fai_aa)/Kxij[k];// 表面传播
Prob[k+16][0]=ramda_A*kmxa*exp(-fai_ab)/Kxij[k+16];
Prob[k+32][0]=ramda_B*kmxb*exp(-fai_ab_v)/Kxij[k+32];
Prob[k+48][0]=ramda_B*kmxb*exp(-fai_bb)/Kxij[k+48];
Prob[k][1]=Prob[k][0]+k_a/Kxij[k];// 可能性A原子落的地方
Prob[k][2]=Prob[k][1]+k_b/Kxij[k];//可能性B原子落的地方,除那蒸发之外
Prob[k+16][1]=Prob[k+16][0]+k_a/Kxij[k+16];
Prob[k+16][2]=Prob[k+16][1]+k_b/Kxij[k+16];
Prob[k+32][1]=Prob[k+32][0]+k_a/Kxij[k+32];
Prob[k+32][2]=Prob[k+32][1]+k_b/Kxij[k+32];
Prob[k+48][1]=Prob[k+48][0]+k_a/Kxij[k+48];
Prob[k+48][2]=Prob[k+48][1]+k_b/Kxij[k+48];
}
}
static int c_ount=0;
/*模仿物质 */
monte()
{
int k,member,I,J;
double r;
for(c_ount=0;c_ount<Limit;c_ount++){
Time += 1.0/State_tree[1];
k=choice();
member=M_RANDOM(Nxij[k])+Set_pt[k];
I=Surface_tblX[member]; J=Surface_tblY[member];
r=R_RANDOM();
//printf("%e %e k=%d\n",r,Prob[k][2],k);getch();
if( r < Prob[k][0] ){
diffusion(I,J,k);
} else {
if( r <= Prob[k][1] ){
create_A(I,J); C_a++;
} else {
if( r <= Prob[k][2] ) {
create_B(I,J);C_b++;
} else {
if( Crystal[Surface[I][J]][I][J]=='A' ) {
E_a++;
} else {
E_b++;
}
evapolation(I,J);
}
}
}//getch();
if(timing==1){
for(k=1;k<Speed;k++)INKEY();
}
}
}
static int x[]={0,0,1,-1,1,-1,1,-1};
static int y[]={1,-1,0,0,1,1,-1,-1};
evapolation(I,J)
int I,J;
{
int a,b,c,i,j;
unsigned char atom,old_config,new_config;
int new_hight,hight,hbius;
int (*action)(int,int,int),Del_A(),Del_B();
new_hight=--Surface[I][J];
if( new_hight == 0 ) { printf("Under flow Error\n");EXIT(1);}
hight=new_hight+1;
hbius=hight*Bius;
atom=Crystal[hight][I][J];
Crystal[hight][I][J] = 0;
if( atom == 'A' ) action=Del_A; else action=Del_B;
i=P_X[I+2];
if( ((Surface[i][J]*Bius+Base_h[i][J])-(hbius+Base_h[I][J]))/2==0 ){
if(I<SPI_UP_x){action(i,J,0);} else {if(I==SPI_UP_x)action(i,J,1);}
}
i=P_X[I];
if( ((Surface[i][J]*Bius+Base_h[i][J])-(hbius+Base_h[I][J]))/2==0 ){
if(I>SPI_LOW_x){action(i,J,0);} else {if(I==SPI_LOW_x)action(i,J,1);}
}
j=P_Y[J+2];
if( ((Surface[I][j]*Bius+Base_h[I][j])-(hbius+Base_h[I][J]))/2==0 ){
if(J<SPI_UP_y){action(I,j,0);} else {if(J==SPI_UP_y)action(I,j,1);}
}
j=P_Y[J];
if( ((Surface[I][j]*Bius+Base_h[I][j])-(hbius+Base_h[I][J]))/2==0 ){
if(J>SPI_LOW_y){action(I,j,0);} else {if(J==SPI_LOW_y)action(I,j,1);}
}
old_config=Config[I][J];
i=G[old_config&15][0]+G[old_config&15][1];
#ifdef DEBUG
if(i<0 || i>4)printf("??????????????evapo %d\n",i);
#endif
kink_E[i]++;
atom=config(&a,&b,&c,I,J);
if( atom == 'A' ) {
new_config=a*(11-a)/2+b+c;
atom=A_atom;
} else {
new_config=a*(11-a)/2+b+32+c;
atom=B_atom;
}
#ifdef DEBUG
if(choice_flg[new_config]==0)printf("Error in eva,%d\n",new_config);
#endif
#ifdef GR
if(timing==1){
PSET_BE(I,J,new_hight+Color_Base[I],atom );
PSETW(I,J,(new_hight+CNP+Color_Base[I])%CN+atom );
}
#endif
if( old_config != new_config ) modify(old_config,new_config,I,J);
}
Del_A(I,J,sw)
int I,J,sw;
{
int i,j;
unsigned char old_config,new_config;
old_config = Config[I][J];
i=G[old_config&15][0];j=G[old_config&15][1];
new_config=old_config-i*(11-i)/2+(i-1-sw)*(12-i+sw)/2;
#ifdef DEBUG
if(choice_flg[new_config]==0)printf("Error in dela,%d\n",new_config);
#endif
modify(old_config,new_config,I,J);
}
Del_B(I,J,sw)
int I,J,sw;
{
int i,j;
unsigned char old_config,new_config;
old_config = Config[I][J];
new_config=old_config-1-sw;
#ifdef DEBUG
if(choice_flg[new_config]==0)printf("Error in delb,%d\n",new_config);
#endif
modify(old_config,new_config,I,J);
}
Reset(){int i,j,k,s_min,s_max;
s_min=s_max=Surface[0][0];
for(i=0;i<sizex;i++)for(j=0;j<sizey;j++){
if(s_min>Surface[i][j])s_min=Surface[i][j];
if(s_max<Surface[i][j])s_max=Surface[i][j];
}
if(s_min<=BASE){printf("Can not reset the surface\n");EXIT(2);}
for(k=0;k<=s_max-s_min+BASE;k++)
for(i=0;i<sizex;i++)for(j=0;j<sizey;j++){
Crystal[k][i][j]=Crystal[k+s_min-BASE][i][j];
}
for(i=0;i<sizex;i++)for(j=0;j<sizey;j++){
Surface[i][j] -=s_min-BASE;
}
for(k=s_max-s_min+BASE+1;k<HORIZON;k++)
for(i=0;i<sizex;i++)for(j=0;j<sizey;j++){
Crystal[k][i][j]=0;
}
}
create_A(I,J)
int I,J;
{
int a,b,c,i,j,new_hight,hbius;
unsigned char atom,old_config,new_config;
if( Surface[I][J] == HORIZON-1 ) {Reset();}
new_hight=++Surface[I][J];
hbius=new_hight*Bius;
Crystal[new_hight][I][J] = 'A';
i=P_X[I+2];
if( ((Surface[i][J]*Bius+Base_h[i][J])-(hbius+Base_h[I][J]))/2==0 ){
if(I<SPI_UP_x){Add_A(i,J,0);} else {if(I==SPI_UP_x)Add_A(i,J,1);}
}
i=P_X[I];
if( ((Surface[i][J]*Bius+Base_h[i][J])-(hbius+Base_h[I][J]))/2==0 ){
if(I>SPI_LOW_x){Add_A(i,J,0);} else {if(I==SPI_LOW_x)Add_A(i,J,1);}
}
j=P_Y[J+2];
if(((Surface[I][j]*Bius+Base_h[I][j])-(hbius+Base_h[I][J]))/2==0){
if(J<SPI_UP_y){Add_A(I,j,0);} else {if(J==SPI_UP_y) Add_A(I,j,1);}
}
j=P_Y[J];
if(((Surface[I][j]*Bius+Base_h[I][j])-(hbius+Base_h[I][J]))/2==0){
if(J>SPI_LOW_y){Add_A(I,j,0);} else {if(J==SPI_LOW_y)Add_A(I,j,1);}
}
old_config=Config[I][J];
atom=config(&a,&b,&c,I,J);
new_config=a*(11-a)/2+b+c;
i=G[new_config&15][0]+G[new_config&15][1];
#ifdef DEBUG
if(i<0 || i>4)printf("??????????????C_A %d\n",i);
if(choice_flg[new_config]==0)printf("Error in crea,%d\n",new_config);
#endif
kink_C[i]++;
#ifdef GR
if(timing==1){
PSET_BH(I,J,new_hight+Color_Base[I],A_atom);
PSETW(I,J,(new_hight+CNP+Color_Base[I])%CN+A_atom);
}
#endif
if( old_config != new_config ) modify(old_config,new_config,I,J);
}
create_B(I,J)
int I,J;
{
int a,b,c,i,j,new_hight,hbius;
unsigned char atom,old_config,new_config;
if( Surface[I][J] == HORIZON-1 ) {Reset();}
new_hight=++Surface[I][J];
hbius=new_hight*Bius;
Crystal[new_hight][I][J] = 'B';
i=P_X[I+2];
if( ((Surface[i][J]*Bius+Base_h[i][J])-(hbius+Base_h[I][J]))/2==0 ){
if(I<SPI_UP_x){Add_B(i,J,0);} else {if(I==SPI_UP_x)Add_B(i,J,1);}
}
i=P_X[I];
if( ((Surface[i][J]*Bius+Base_h[i][J])-(hbius+Base_h[I][J]))/2==0 ){
if(I>SPI_LOW_x){Add_B(i,J,0);} else {if(I==SPI_LOW_x)Add_B(i,J,1);}
}
j=P_Y[J+2];
if(((Surface[I][j]*Bius+Base_h[I][j])-(hbius+Base_h[I][J]))/2==0){
if(J<SPI_UP_y){ Add_B(I,j,0);} else {if(J==SPI_UP_y)Add_B(I,j,1);}
}
j=P_Y[J];
if(((Surface[I][j]*Bius+Base_h[I][j])-(hbius+Base_h[I][J]))/2==0){
if(J>SPI_LOW_y){ Add_B(I,j,0);} else {if(J==SPI_LOW_y)Add_B(I,j,1);}
}
old_config=Config[I][J];
atom=config(&a,&b,&c,I,J);
new_config=a*(11-a)/2+b+c+32;
i=G[new_config&15][0]+G[new_config&15][1];
#ifdef DEBUG
if(i<0 || i>4)printf("?????????????? C_B %d\n",i);
if(choice_flg[new_config]==0)printf("Error in creb,%d\n",new_config);
#endif
kink_C[i]++;
#ifdef GR
if(timing==1){
PSET_BH(I,J,new_hight+Color_Base[I],B_atom);
PSETW(I,J,(new_hight+CNP+Color_Base[I])%CN+B_atom);
}
#endif
if( old_config != new_config ) modify(old_config,new_config,I,J);
}
Add_A(I,J,sw)
int I,J,sw;
{
int i,j;
unsigned char old_config,new_config;
old_config = Config[I][J];
i=G[old_config&15][0], j=G[old_config&15][1];
new_config=old_config-i*(11-i)/2+(i+1+sw)*(10-i-sw)/2;
#ifdef DEBUG
if(choice_flg[new_config]==0)printf("Error in adda,%d i=%d j=%d I=%d J=%d sw=%d\n",
new_config,i,j,I,J,sw);
#endif
modify(old_config,new_config,I,J);
}
Add_B(I,J,sw)
int I,J,sw;
{
int i,j;
unsigned char old_config,new_config;
old_config = Config[I][J];
new_config=old_config+1+sw;
#ifdef DEBUG
if(choice_flg[new_config]==0)printf("Error in addB,%d I=%d J=%d sw=%d\n",
new_config,I,J,sw);
#endif
modify(old_config,new_config,I,J);
}
modify(old_config,new_config,I,J)
unsigned char old_config,new_config;
int I,J;
{
double hindo;
int k,st,n,i,j;
k=old_config;
hindo=Kxij[k];
k+=64;
while( k>0 ){
State_tree[k] -= hindo;
k /= 2;
}
k=new_config;
hindo=Kxij[k];
k+=64;
#ifdef DEBUG
if( hindo == 0.0 ){
printf("Fatal Error in modify\n");
printf("New=%d Old=%d I=%d J=%d\n",new_config,old_config,I,J);
printf("O %e N %e\n",Kxij[old_config],Kxij[new_config]);
exit(1);
}
#endif
while( k>0 ){
State_tree[k] += hindo;
k /= 2;
}
Config[I][J] = new_config;
n=--Nxij[old_config]+Set_pt[old_config]; /*删除老 */
st=Surface_pt[I][J];
Surface_tblX[st]=i=Surface_tblX[n];
Surface_tblY[st]=j=Surface_tblY[n];
Surface_pt[i][j]=st;
n=Nxij[new_config]++; /*增加新 */
st=Set_pt[new_config]+n;
if( st>=Set_pt[new_config+1] ){
table_set();
return;
}
Surface_pt[I][J]=st;
Surface_tblX[st]=I;
Surface_tblY[st]=J;
}
check_tree()
{
double new_state;
int i;
new_state=0.0;
for(i=64;i<128;i++) new_state+=State_tree[i];
if( fabs(new_state-State_tree[1])/new_state > 1.0e-8 ){
return(1);
}
return(0);
}
diffusion(I,J,k)
int I,J,k;
{
int new,i,j;
evapolation(I,J);
new=I_RANDOM()>>30; /* 4 direction */
I=P_X[I+x[new]+1]; /* 向前移动 */
J=P_Y[J+y[new]+1];
if( k<32 ) create_A(I,J); else create_B(I,J);// 原子的类型被检查
}
choice()
{
int k;
double rnd;
int dmy;
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -