* selforganizing lamella structure in the observed behaviour.
*
* refs:
- * - J. K. N. Lindner. Habilationsschrift, Universitaet Augsburg.
+ * - J. K. N. Lindner. Habil.Schrift, Universitaet Augsburg.
* - Maik Haeberlen. Diplomarbeit, Universitaet Augsburg.
*
* Copyright (C) 2004 Frank Zirkelbach
puts("-n \t\t no user interaction");
puts("-Z \t\t cryst -> amorph c diffusion in z direction");
puts("-i \t\t no cryst to cryst diffusion");
- printf("-a <value> \t slope of nuclear energy loss (default %f)\n",A_EL);
- printf("-b <value> \t nuclear energy loss offset (default %f)\n",B_EL);
printf("-x <value> \t # x cells (default %d)\n",X);
printf("-y <value> \t # y cells (default %d)\n",Y);
printf("-z <value> \t # z cells (default %d)\n",Z);
printf("-f <value> \t pressure = <value> * 1/distance^2 (default %f)\n",A_AP);
printf("-p <value> \t pressure offset (default %f)\n",B_AP);
printf("-F <value> \t proportionality constant between c conc and ability to get amorphous (default %f)\n",A_CP);
- printf("-A <value> \t slope of linear c distribution (default %f)\n",A_CD);
- printf("-B <value> \t linear c distribution offset (default %f)\n",B_CD);
printf("-D <value> \t diffusion rate from cryst to amorph cells (default %f)\n",DR_AC);
printf("-c <value> \t diffusion rate in cryst cells (default %f)\n",DR_CC);
printf("-e <value> \t do diffusion every <value> steps (default %d)\n",DIFF_RATE);
puts("-S <file> \t save to file");
puts("-R <file> \t read from random file");
puts("-P <file> \t specify implantation profile file");
+ puts("-N <file> \t specify nuclear energy loss profile file");
printf("-H <value> \t collisions per ion in simulation window (default %d)\n",CPI);
+ puts("-m <value> \t specify c->a carbon saturation");
return 1;
}
-int process_cell(d3_lattice *d3_l,u32 x,u32 y,u32 z,info *my_info)
+int process_cell(d3_lattice *d3_l,u32 x,u32 y,u32 z,info *my_info,u32 nel_z)
{
unsigned char *thiz;
int *conc;
int i,j;
int off;
- double p;
+ double p,q;
thiz=d3_l->status+x+y*d3_l->max_x+z*d3_l->max_x*d3_l->max_y;
conc=d3_l->extra+x+y*d3_l->max_x+z*d3_l->max_x*d3_l->max_y;
- p=my_info->b_ap*URAND_MAX;
+ p=my_info->b_ap*nel_z;
for(i=-(my_info->range);i<=my_info->range;i++)
{
for(j=-(my_info->range);j<=my_info->range;j++)
} else
{
/* assume 1-p probability */
+ /* also look for neighbours ! */
+ q=(URAND_MAX-p)>0?URAND_MAX-p:0;
+ j=0;
+ j+=(*(d3_l->status+((x+d3_l->max_x+1)%d3_l->max_x)+y*d3_l->max_x+z*d3_l->max_x*d3_l->max_y)&AMORPH)?1:0;
+ j+=(*(d3_l->status+((x+d3_l->max_x-1)%d3_l->max_x)+y*d3_l->max_x+z*d3_l->max_x*d3_l->max_y)&AMORPH)?1:0;
+ j+=(*(d3_l->status+x+((y+1+d3_l->max_y)%d3_l->max_y)*d3_l->max_x+z*d3_l->max_x*d3_l->max_y)&AMORPH)?1:0;
+ j+=(*(d3_l->status+x+((y-1+d3_l->max_y)%d3_l->max_y)*d3_l->max_x+z*d3_l->max_x*d3_l->max_y)&AMORPH)?1:0;
+ j+=(*(d3_l->status+x+y*d3_l->max_x+((z+1+d3_l->max_z)%d3_l->max_z)*d3_l->max_x*d3_l->max_y)&AMORPH)?1:0;
+ j+=(*(d3_l->status+x+y*d3_l->max_x+((z-1+d3_l->max_z)%d3_l->max_z)*d3_l->max_x*d3_l->max_y)&AMORPH)?1:0;
+
+ p+=((q/6)*j);
if(get_rand(URAND_MAX)>p) MAKE_CRYST(thiz);
}
{
x=get_rand(d3_l->max_x);
y=get_rand(d3_l->max_y);
- // printf("nd: %d %d\n",x,y);
- // z=get_rand_lgp(d3_l->max_z,my_info->a_cd,my_info->b_cd);
z=get_rand_reject(d3_l->max_z,rj_m,rj_g);
- // printf("%d\n",z);
*(d3_l->extra+x+y*d3_l->max_x+z*d3_l->max_x*d3_l->max_y)+=1;
(my_info->cc)++;
}
{
offset=i+j*d3_l->max_x+k*d3_l->max_x*d3_l->max_y;
/* case amorph: amorph <- cryst diffusion */
- if(*(d3_l->status+offset)&AMORPH)
+ if(*(d3_l->status+offset)&AMORPH && *(d3_l->extra+offset)<my_info->c_sat)
{
for(c=-1;c<=1;c++)
{
int write_ac_distr(d3_lattice *d3_l,int ac_distr)
{
int fd,x,y,z;
- int count=0,offset;
+ int count,offset;
char file[16];
if(ac_distr==1) strcpy(file,"a.plot");
for(z=0;z<d3_l->max_z;z++)
{
+ count=0;
for(x=0;x<d3_l->max_x;x++)
{
for(y=0;y<d3_l->max_y;y++)
return 1;
}
-int write_bmp(d3_lattice *d3_l,int window,u32 x,u32 y,u32 z)
+int write_bmp(d3_lattice *d3_l,int window,u32 x,u32 y,u32 z,int max)
{
- int fd,i,j,size=0,foo=0,end=0;
+ int fd,i,j,size=0,foo=0,k,sum;
int width=0,height=0;
char bmpfile[MAX_CHARS];
char buf[128];
- if(((window==4)||(window==5))&&(d3_l->max_z<FFT_HEIGHT) )
- {
- puts("error: z < FFT_HEIGHT!");
- puts("not writing bmp file ...");
- return -1;
- }
-
- if(window%3==1)
+ if(window==1)
{
sprintf(bmpfile,"x-z_%d.bmp",y);
foo=3*d3_l->max_x;
- if(window==1)
- {
- size=(foo+(4-foo%4))*d3_l->max_z;
- height=d3_l->max_z;
- }
- else
- {
- size=(foo+(4-foo%4))*FFT_HEIGHT;
- end=d3_l->max_z-FFT_HEIGHT;
- height=FFT_HEIGHT;
- }
+ size=(foo+(4-foo%4))*d3_l->max_z;
+ height=d3_l->max_z;
width=d3_l->max_x;
}
- if(window%3==2)
+ if(window==2)
{
sprintf(bmpfile,"y-z_%d.bmp",x);
foo=3*d3_l->max_y;
- if(window==2)
- {
- size=(foo+(4-foo%4))*d3_l->max_z;
- height=d3_l->max_z;
- }
- else
- {
- size=(foo+(4-foo%4))*FFT_HEIGHT;
- end=d3_l->max_z-FFT_HEIGHT;
- height=FFT_HEIGHT;
- }
+ size=(foo+(4-foo%4))*d3_l->max_z;
+ height=d3_l->max_z;
width=d3_l->max_y;
}
if(window==3)
width=d3_l->max_x;
height=d3_l->max_y;
}
+ if(window==4)
+ {
+ sprintf(bmpfile,"x-z_cdistr_%d.bmp",y);
+ foo=3*d3_l->max_x;
+ size=(foo+(4-foo%4))*d3_l->max_z;
+ height=d3_l->max_z;
+ width=d3_l->max_x;
+ }
+ if(window==5)
+ {
+ sprintf(bmpfile,"y-z_cdistr_%d.bmp",x);
+ foo=3*d3_l->max_y;
+ size=(foo+(4-foo%4))*d3_l->max_z;
+ height=d3_l->max_z;
+ width=d3_l->max_y;
+ }
+ if(window==6)
+ {
+ sprintf(bmpfile,"x-y_cdistr_%d.bmp",z);
+ foo=3*d3_l->max_x;
+ size=(foo+(4-foo%4))*d3_l->max_y;
+ width=d3_l->max_x;
+ height=d3_l->max_y;
+ }
if((fd=open(bmpfile,O_WRONLY|O_CREAT))<0)
{
puts("failed writing bmp header");
return -1;
}
- if(window%3==1)
+ if(window==1)
{
- for(j=0;j<d3_l->max_z-end;j++)
+ for(j=0;j<d3_l->max_z;j++)
{
for(i=0;i<d3_l->max_x;i++)
{
- if(*(d3_l->status+i+y*d3_l->max_x+(d3_l->max_z-j-1)*d3_l->max_x*d3_l->max_y)&RED) memset(buf,0xff,3);
- else memset(buf,0,3);
+ sum=0;
+ for(k=-2;k<=2;k++)
+ if(*(d3_l->status+i+(((y+k+d3_l->max_y)%d3_l->max_y)*d3_l->max_x)+(d3_l->max_z-j-1)*d3_l->max_x*d3_l->max_y)&RED) sum+=0xff;
+ sum/=5;
+ memset(buf,(unsigned char)sum,3);
if(write(fd,buf,3)<3)
{
puts("failed writing rgb values to bmp file");
}
}
}
- if(window%3==2)
+ if(window==2)
{
- for(j=0;j<d3_l->max_z-end;j++)
+ for(j=0;j<d3_l->max_z;j++)
{
for(i=0;i<d3_l->max_y;i++)
{
- if(*(d3_l->status+x+i*d3_l->max_x+(d3_l->max_z-j-1)*d3_l->max_x*d3_l->max_y)&RED) memset(buf,0xff,3);
- else memset(buf,0,3);
+ sum=0;
+ for(k=-2;k<=2;k++)
+ if(*(d3_l->status+((x+k+d3_l->max_x)%d3_l->max_x)+i*d3_l->max_x+(d3_l->max_z-j-1)*d3_l->max_x*d3_l->max_y)&RED) sum+=0xff;
+ sum/=5;
+ memset(buf,(unsigned char)sum,3);
if(write(fd,buf,3)<3)
{
puts("failed writing rgb values to bmp file");
}
}
}
+ if(window==4)
+ {
+ for(j=0;j<d3_l->max_z;j++)
+ {
+ for(i=0;i<d3_l->max_x;i++)
+ {
+ sum=*(d3_l->extra+i+y*d3_l->max_x+(d3_l->max_z-j-1)*d3_l->max_x*d3_l->max_y);
+ sum=sum*255/max;
+ memset(buf,(unsigned char)sum,3);
+ if(write(fd,buf,3)<3)
+ {
+ puts("failed writing rgb values to bmp file");
+ return-1;
+ }
+ }
+ if(foo%4)
+ {
+ memset(buf,0,4-foo%4);
+ if(write(fd,buf,4-foo%4)<4-foo%4)
+ {
+ puts("failed writing 4 byte ending");
+ return -1;
+ }
+ }
+ }
+ }
+ if(window==5)
+ {
+ for(j=0;j<d3_l->max_z;j++)
+ {
+ for(i=0;i<d3_l->max_x;i++)
+ {
+ sum=*(d3_l->extra+x+i*d3_l->max_x+(d3_l->max_z-j-1)*d3_l->max_x*d3_l->max_y);
+ sum=sum*255/max;
+ memset(buf,(unsigned char)sum,3);
+ if(write(fd,buf,3)<3)
+ {
+ puts("failed writing rgb values to bmp file");
+ return-1;
+ }
+ }
+ if(foo%4)
+ {
+ memset(buf,0,4-foo%4);
+ if(write(fd,buf,4-foo%4)<4-foo%4)
+ {
+ puts("failed writing 4 byte ending");
+ return -1;
+ }
+ }
+ }
+ }
+ if(window==6)
+ {
+ for(j=0;j<d3_l->max_z;j++)
+ {
+ for(i=0;i<d3_l->max_x;i++)
+ {
+ sum=*(d3_l->extra+i+(d3_l->max_y-j-1)*d3_l->max_x+z*d3_l->max_x*d3_l->max_y);
+ sum=sum*255/max;
+ memset(buf,(unsigned char)sum,3);
+ if(write(fd,buf,3)<3)
+ {
+ puts("failed writing rgb values to bmp file");
+ return-1;
+ }
+ }
+ if(foo%4)
+ {
+ memset(buf,0,4-foo%4);
+ if(write(fd,buf,4-foo%4)<4-foo%4)
+ {
+ puts("failed writing 4 byte ending");
+ return -1;
+ }
+ }
+ }
+ }
close(fd);
return 1;
a=atof(p)/10; /* nm */
p=strtok(NULL," ");
b=atof(p);
- if(a>my_info->b_cd*CELL_LENGTH && a<(my_info->b_cd+d3_l->max_z)*CELL_LENGTH) d+=b;
+ if(a<=d3_l->max_z*CELL_LENGTH) d+=b;
all+=b;
}
}
if(a>d3_l->max_z*CELL_LENGTH) k=0;
else
{
- graph[(int)(a/CELL_LENGTH)]=(int)(URAND_MAX*b);
+ graph[(int)(a/CELL_LENGTH)]=(int)(URAND_MAX/100*b);
flag[(int)(a/CELL_LENGTH)]=1;
}
}
free(flag);
- // printf("debug: (interpolated c profile)\n");
- // for(i=0;i<d3_l->max_z;i++) printf("%d %d\n",i,graph[i]);
+#ifdef DEBUG_INTERPOL_PROFILE
+ printf("debug: (interpolated profile)\n");
+ for(i=0;i<d3_l->max_z;i++) printf("%d %d\n",i,graph[i]);
+#endif
return max;
}
char l_file[MAX_CHARS];
char c_file[MAX_CHARS];
char p_file[MAX_CHARS];
+ char n_e_file[MAX_CHARS];
char convert;
char r_file[MAX_CHARS];
#ifdef USE_DFB_API
char a_txt[MAX_TXT];
char s_txt[MAX_TXT];
char ap_txt[MAX_TXT];
- char el_txt[MAX_TXT];
- char cd_txt[MAX_TXT];
char r_txt[MAX_TXT];
char cp_txt[MAX_TXT];
char zdiff_txt[MAX_TXT];
char dr_cc_txt[MAX_TXT];
char dose_txt[MAX_TXT];
char mode_txt[MAX_TXT];
+ char hpi_txt[MAX_TXT];
+ char csat_txt[MAX_TXT];
char *arg_v[MAX_ARGV];
#endif
d3_lattice d3_l;
u32 *c_profile;
u32 *n_e_loss;
u32 ne_max,ip_max;
+ u32 nel_z;
d3_l.max_x=X;
d3_l.max_y=Y;
resave=RESAVE;
my_info.z_diff=0;
my_info.c_diff=1;
- my_info.a_el=A_EL;
- my_info.b_el=B_EL;
- my_info.a_cd=A_CD;
- my_info.b_cd=B_CD;
my_info.a_ap=A_AP;
my_info.b_ap=B_AP;
my_info.a_cp=A_CP;
my_info.dr_cc=DR_CC;
my_info.diff_rate=DIFF_RATE;
my_info.cpi=CPI;
+ my_info.c_sat=C_SAT;
nowait=0;
quit=0;
escape=0;
strcpy(l_file,"");
strcpy(c_file,"");
strcpy(p_file,IMP_PROFILE);
+ strcpy(n_e_file,NEL_PROFILE);
convert=0;
strcpy(r_file,"");
mode=0;
case 'n':
nowait=1;
break;
- case 'a':
- my_info.a_el=atof(argv[++i]);
- break;
- case 'b':
- my_info.b_el=atof(argv[++i]);
- break;
case 'x':
d3_l.max_x=atoi(argv[++i]);
break;
case 'F':
my_info.a_cp=atof(argv[++i]);
break;
- case 'A':
- my_info.a_cd=atof(argv[++i]);
- break;
- case 'B':
- my_info.b_cd=atof(argv[++i]);
- break;
case 'W':
resave=atoi(argv[++i]);
break;
case 'P':
strcpy(p_file,argv[++i]);
break;
+ case 'N':
+ strcpy(n_e_file,argv[++i]);
+ break;
case 'g':
strcpy(l_file,argv[++i]);
if(i<argc-1) if(argv[i+1][0]!='-') c_step=atoi(argv[++i]);
case 'H':
my_info.cpi=atoi(argv[++i]);
break;
+ case 'm':
+ my_info.c_sat=atoi(argv[++i]);
+ break;
default:
usage();
return -1;
sprintf(s_txt,"steps: %d",my_info.steps);
sprintf(dose_txt,"dose: %.2fe+17 C/cm²",my_info.steps*1.0/(d3_l.max_x*d3_l.max_y*CELL_LENGTH*CELL_LENGTH*1000));
sprintf(r_txt,"pressure range: %d",my_info.range);
- sprintf(ap_txt,"a_ap: %.4f b_ap: %.3f",my_info.a_ap,my_info.b_ap);
- sprintf(el_txt,"a_el: %.3f b_el: %.3f",my_info.a_el,my_info.b_el);
- sprintf(cd_txt,"a_cd: %.3f b_cd: %.3f",my_info.a_cd,my_info.b_cd);
- sprintf(cp_txt,"a_cp: %.5f",my_info.a_cp);
- sprintf(dr_ac_txt,"a/c diffusion rate: %.4f",my_info.dr_ac);
- if(my_info.c_diff!=0) sprintf(dr_cc_txt,"c/c diffusion rate: %.4f",my_info.dr_cc);
+ sprintf(ap_txt,"a_ap: %f b_ap: %f",my_info.a_ap,my_info.b_ap);
+ sprintf(cp_txt,"a_cp: %f",my_info.a_cp);
+ sprintf(dr_ac_txt,"a/c diffusion rate: %f",my_info.dr_ac);
+ if(my_info.c_diff!=0) sprintf(dr_cc_txt,"c/c diffusion rate: %f",my_info.dr_cc);
else sprintf(dr_cc_txt,"c/c diffusion rate: none");
sprintf(zdiff_txt,"diffusion in z direction: %c",my_info.z_diff?'y':'n');
sprintf(diff_txt,"diffusion every %d steps",my_info.diff_rate);
strcpy(mode_txt,"view: a/c mode");
- arg_v[1]=xyz_txt;
- arg_v[2]=NULL;
+ sprintf(hpi_txt,"hits per ion: %d",my_info.cpi);
+ sprintf(csat_txt,"carbon saturation: %d",my_info.c_sat);
+ arg_v[1]=mode_txt;
+ arg_v[2]=xyz_txt;
arg_v[3]=status_txt;
arg_v[4]=conc_txt;
arg_v[5]=NULL;
- arg_v[6]=mode_txt;
- arg_v[7]=NULL;
- arg_v[8]=steps_txt;
- arg_v[9]=cc_txt;
- arg_v[10]=NULL;
- arg_v[11]=diff_txt;
- arg_v[12]=zdiff_txt;
- arg_v[13]=NULL;
- arg_v[14]=a_txt;
- arg_v[15]=s_txt;
- arg_v[16]=dose_txt;
- arg_v[17]=NULL;
- arg_v[18]=r_txt;
- arg_v[19]=ap_txt;
- arg_v[20]=el_txt;
- arg_v[21]=cd_txt;
- arg_v[22]=cp_txt;
+ arg_v[6]=steps_txt;
+ arg_v[7]=cc_txt;
+ arg_v[8]=NULL;
+ arg_v[9]=a_txt;
+ arg_v[10]=s_txt;
+ arg_v[11]=dose_txt;
+ arg_v[12]=diff_txt;
+ arg_v[13]=zdiff_txt;
+ arg_v[14]=r_txt;
+ arg_v[15]=ap_txt;
+ arg_v[16]=cp_txt;
+ arg_v[17]=dr_ac_txt;
+ arg_v[18]=dr_cc_txt;
+ arg_v[19]=hpi_txt;
+ arg_v[20]=csat_txt;
+ arg_v[21]=NULL;
+ arg_v[22]=NULL;
arg_v[23]=NULL;
- arg_v[24]=dr_ac_txt;
- arg_v[25]=dr_cc_txt;
+ arg_v[24]=NULL;
+ arg_v[25]=NULL;
#endif
if((!strcmp(l_file,""))||(c_step))
return -1;
}
ip_max=get_reject_graph(&my_info,&d3_l,p_file,c_profile);
+ ne_max=get_reject_graph(&my_info,&d3_l,n_e_file,n_e_loss);
#ifdef DEBUG_RAND
while(1)
{
+#ifdef DEBUG_CP
printf("%d\n",get_rand_reject(d3_l.max_z,ip_max,c_profile));
+#endif
+#ifdef DEBUG_NEL
+ printf("%d\n",get_rand_reject(d3_l.max_z,ne_max,n_e_loss));
+#endif
+#ifdef DEBUG_NORM
+ printf("%d\n",get_rand(d3_l.max_z));
+#endif
}
#endif
{
x_c=get_rand(d3_l.max_x);
y_c=get_rand(d3_l.max_y);
- z_c=get_rand_lgp(d3_l.max_z,my_info.a_el,my_info.b_el);
- // printf("%d\n",z_c);
- process_cell(&d3_l,x_c,y_c,z_c,&my_info);
+ // z_c=get_rand_reject(d3_l.max_z,ne_max,n_e_loss);
+ z_c=get_rand(d3_l.max_z);
+ nel_z=URAND_MAX*(1.0*n_e_loss[z_c]/ne_max);
+ process_cell(&d3_l,x_c,y_c,z_c,&my_info,nel_z);
}
distrib_c(&d3_l,&my_info,i,c_ratio,ip_max,c_profile);
#ifdef USE_DFB_API
bmp=0;
ac_distr=0;
scan_event(&d3_l,&x,&y,&z,&quit,&escape,&switchmode,&bmp,&ac_distr);
- if(bmp) write_bmp(&d3_l,bmp,x,y,z);
+ if(bmp) write_bmp(&d3_l,bmp,x,y,z,max_extra);
if(ac_distr) write_ac_distr(&d3_l,ac_distr);
}