X-Git-Url: https://hackdaworld.org/gitweb/?p=physik%2Fnlsop.git;a=blobdiff_plain;f=nlsop.c;h=146c4eebc73016090db48a71f2261fed2bd3cd5c;hp=9f0e08ce61e68d0ac05b60eb14de595a5f63072f;hb=65f454e2e690473128d65b9f6859e4a354a1e38a;hpb=206b0a678f20b8463b0a3ba30939cb565a77fee6 diff --git a/nlsop.c b/nlsop.c index 9f0e08c..146c4ee 100644 --- a/nlsop.c +++ b/nlsop.c @@ -1,6 +1,8 @@ /* * nlsop.c * + * author: frank zirkelbach (frank.zirkelbach@physik.uni-augsburg.de) + * * this program tries helping to understand the amorphous depuration * and recrystallization of SiCx while ion implantation at temperatures * below 400 degree celsius. @@ -8,8 +10,25 @@ * 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 + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + * */ #define _GNU_SOURCE @@ -29,53 +48,71 @@ #define MAKE_AMORPH(N) *(N)|=AMORPH #define MAKE_CRYST(N) *(N)&=~AMORPH -/* test globals - get removed or included in my_info struct later */ -int amorph_count; -int cryst_count; - int usage(void) { puts("usage:"); puts("-h \t\t help"); puts("-n \t\t no user interaction"); puts("-Z \t\t cryst -> amorph c diffusion in z direction"); - printf("-a \t slope of nuclear energy loss (default %f)\n",A_EL); - printf("-b \t nuclear energy loss offset (default %f)\n",B_EL); - printf("-x \t # x cells (default %d)\n",X); - printf("-y \t # y cells (default %d)\n",Y); - printf("-z \t # z cells (default %d)\n",Z); + puts("-i \t\t no cryst to cryst diffusion"); + printf("-x \t # x cells (default %d)\n",_X); + printf("-y \t # y cells (default %d)\n",_Y); + printf("-z \t # z cells (default %d)\n",_Z); printf("-s \t steps (default %d)\n",STEPS); printf("-d \t refresh display (default %d)\n",REFRESH); printf("-r \t amorphous influence range (default %d)\n",RANGE); - printf("-f \t pressure = * 1/distance^2 (default %f)\n",A_AP); - printf("-p \t pressure offset (default %f)\n",B_AP); - printf("-F \t proportionality constant between c conc and ability to get amorphous (default %f)\n",A_CP); - printf("-A \t slope of linear c distribution (default %f)\n",A_CD); - printf("-B \t linear c distribution offset (default %f)\n",B_CD); + printf("-f \t stress induced amorphization influence (default %f)\n",S_D); + printf("-p \t ballistic amorphization influence (default %f)\n",B_D); + printf("-F \t carbon induced amorphization influence (default %f)\n",C_D); printf("-D \t diffusion rate from cryst to amorph cells (default %f)\n",DR_AC); - printf("-c \t diffusion rate in cryst cells (default %f)\n",DR_CC); printf("-e \t do diffusion every steps (default %d)\n",DIFF_RATE); + puts("-g continue simulation from file and step (step > 0)!"); printf("-W \t write every steps to save file (default %d)\n",RESAVE); puts("-C \t convert file to gnuplot format"); puts("-L \t load from file"); puts("-S \t save to file"); puts("-R \t read from random file"); - puts("-P \t specify implantatin profile file"); + puts("-P \t specify implantation profile file"); + puts("-N \t specify nuclear energy loss profile file"); + printf("-H \t collisions per ion in simulation window (default %d)\n",CPI); + printf("-m \t number of ion hits sputtering 3nm (default %d)\n",S_RATE); return 1; } -int process_cell(d3_lattice *d3_l,u32 x,u32 y,u32 z,info *my_info) +int sputter(d3_lattice *d3_l) +{ + int i,size; + int offh,offl; + + size=d3_l->max_x*d3_l->max_y; + offl=0; + offh=size; + + for(i=0;imax_z-1;i++) + { + memcpy(d3_l->status+offl,d3_l->status+offh,size); + memcpy(d3_l->extra+offl,d3_l->extra+offh,size*sizeof(int)); + offl=offh; + offh+=size; + } + memset(d3_l->status+offl,0,size); + memset(d3_l->extra+offl,0,size); + + return 1; +} + +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*nel_z; for(i=-(my_info->range);i<=my_info->range;i++) { for(j=-(my_info->range);j<=my_info->range;j++) @@ -83,32 +120,35 @@ int process_cell(d3_lattice *d3_l,u32 x,u32 y,u32 z,info *my_info) if(!(i==0 && j==0)) { off=((x+d3_l->max_x+i)%d3_l->max_x)+((y+d3_l->max_y+j)%d3_l->max_x)*d3_l->max_x+z*d3_l->max_x*d3_l->max_y; - if(*(d3_l->status+off)&AMORPH) p+=my_info->a_ap*(*(d3_l->extra+off))*URAND_MAX/(i*i+j*j); + if(*(d3_l->status+off)&AMORPH) p+=my_info->s*(*(d3_l->extra+off))*URAND_MAX/(i*i+j*j); } } } - p+=*conc*my_info->a_cp*URAND_MAX; + p+=*conc*my_info->c*URAND_MAX; if(!(*thiz&AMORPH)) { - if(get_rand(URAND_MAX)<=p) - { - MAKE_AMORPH(thiz); - amorph_count++; - } + if(get_rand(URAND_MAX)<=p) MAKE_AMORPH(thiz); } else { /* assume 1-p probability */ - if(get_rand(URAND_MAX)>p) - { - MAKE_CRYST(thiz); - cryst_count++; - } + /* 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); } return 1; } -int distrib_c(d3_lattice *d3_l,info *my_info,int step,double c_ratio) +int distrib_c(d3_lattice *d3_l,info *my_info,int step,u32 rj_m,u32 *rj_g) { u32 x,y,z; int i,j,k,c; @@ -116,14 +156,11 @@ int distrib_c(d3_lattice *d3_l,info *my_info,int step,double c_ratio) int carry; /* put one c ion somewhere in the lattice */ - if(my_info->ccmax_x); - y=get_rand(d3_l->max_y); - z=get_rand_lgp(d3_l->max_z,my_info->a_cd,my_info->b_cd); - *(d3_l->extra+x+y*d3_l->max_x+z*d3_l->max_x*d3_l->max_y)+=1; - (my_info->cc)++; - } + x=get_rand(d3_l->max_x); + y=get_rand(d3_l->max_y); + z=get_rand_reject(d3_l->max_z,rj_m,rj_g); + *(d3_l->extra+x+y*d3_l->max_x+z*d3_l->max_x*d3_l->max_y)+=1; + (my_info->cc)++; if(step%my_info->diff_rate==0) { @@ -135,7 +172,7 @@ int distrib_c(d3_lattice *d3_l,info *my_info,int step,double c_ratio) for(k=0;kmax_z;k++) { offset=i+j*d3_l->max_x+k*d3_l->max_x*d3_l->max_y; - /* case amorph - amorph <-> cryst diffusion */ + /* case amorph: amorph <- cryst diffusion */ if(*(d3_l->status+offset)&AMORPH) { for(c=-1;c<=1;c++) @@ -158,7 +195,7 @@ int distrib_c(d3_lattice *d3_l,info *my_info,int step,double c_ratio) { off=i+((j+c+d3_l->max_y)%d3_l->max_y)*d3_l->max_x+k*d3_l->max_x*d3_l->max_y; carry=0; - if(!(*(d3_l->status+off)&AMORPH)) carry=(int)(my_info->dr_ac*(*(d3_l->extra+off))); + if(!(*(d3_l->status+off)&AMORPH)) carry=(int)(my_info->dr_ac*(*(d3_l->extra+off))); if(carry!=0) { *(d3_l->extra+offset)+=carry; @@ -166,58 +203,27 @@ int distrib_c(d3_lattice *d3_l,info *my_info,int step,double c_ratio) } } } - if(my_info->z_diff) + /* z diff */ + if(k!=0) { - for(c=-1;c<=1;c++) + off=i+j*d3_l->max_x+(k-1)*d3_l->max_x*d3_l->max_y; + carry=0; + if(!*(d3_l->status+off)&AMORPH) carry=(int)(my_info->dr_ac*(*(d3_l->extra+off))); + if(carry!=0) { - if(c!=0) - { - off=i+j*d3_l->max_x+((k+c+d3_l->max_z)%d3_l->max_z)*d3_l->max_x*d3_l->max_y; - carry=0; - if(!*(d3_l->status+off)&AMORPH) carry=(int)(my_info->dr_ac*(*(d3_l->extra+off))); - if(carry!=0) - { - *(d3_l->extra+off)-=carry; - *(d3_l->extra+offset)+=carry; - } - } - } - } - } else - /* case not amorph - cryst <-> cryst diffusion */ - { - for(c=-1;c<=1;c++) - { - if(c!=0) - { - off=i+((j+c+d3_l->max_y)%d3_l->max_y)*d3_l->max_x+k*d3_l->max_x*d3_l->max_y; - carry=0; - if(!(*(d3_l->status+off)&AMORPH)) - { - carry=(*(d3_l->extra+off)-*(d3_l->extra+offset))/2; - if(carry!=0) - { - *(d3_l->extra+offset)+=carry; - *(d3_l->extra+off)-=carry; - } - } + *(d3_l->extra+off)-=carry; + *(d3_l->extra+offset)+=carry; } } - for(c=-1;c<=1;c++) + if(k!=d3_l->max_z-1) { - if(c!=0) + off=i+j*d3_l->max_x+(k+1)*d3_l->max_x*d3_l->max_y; + carry=0; + if(!*(d3_l->status+off)&AMORPH) carry=(int)(my_info->dr_ac*(*(d3_l->extra+off))); + if(carry!=0) { - off=((i+c+d3_l->max_x)%d3_l->max_x)+j*d3_l->max_x+k*d3_l->max_x*d3_l->max_y; - carry=0; - if(!(*(d3_l->status+off)&AMORPH)) - { - carry=(*(d3_l->extra+off)-*(d3_l->extra+offset))/2; - if(carry!=0) - { - *(d3_l->extra+offset)+=carry; - *(d3_l->extra+off)-=carry; - } - } + *(d3_l->extra+off)-=carry; + *(d3_l->extra+offset)+=carry; } } } @@ -305,6 +311,526 @@ int calc_max_extra(d3_lattice *d3_l) return max; } +int write_ac_distr(d3_lattice *d3_l,int ac_distr) +{ + int fd,x,y,z; + int count,offset; + char file[32]; + int si_count; + + si_count=d3_l->max_x*d3_l->max_y*SI_PER_VOLUME; + if(ac_distr==1) strcpy(file,"carbon_in_av.plot"); + if(ac_distr==2) strcpy(file,"carbon_in_cv.plot"); + if(ac_distr==3) strcpy(file,"carbon.plot"); + if(ac_distr==4) strcpy(file,"amorphous_volumes.plot"); + + if((fd=open(file,O_WRONLY|O_CREAT))<0) + { + puts("cannot open plot file"); + return -1; + } + + for(z=0;zmax_z;z++) + { + count=0; + for(x=0;xmax_x;x++) + { + for(y=0;ymax_y;y++) + { + offset=x+y*d3_l->max_x+z*d3_l->max_x*d3_l->max_y; + if(ac_distr==1) + if(*(d3_l->status+offset)&AMORPH) count+=*(d3_l->extra+offset); + if(ac_distr==2) + if(!(*(d3_l->status+offset)&AMORPH)) count+=*(d3_l->extra+offset); + if(ac_distr==3) count+=*(d3_l->extra+offset); + if(ac_distr==4) + if(*(d3_l->status+offset)&AMORPH) count+=1; + } + } + if(ac_distr==4) dprintf(fd,"%d %d\n",z*CELL_LENGTH,count); +#ifdef ATPROZ + else dprintf(fd,"%d %f\n",z*CELL_LENGTH,100.0*count/si_count); +#else + else dprintf(fd,"%d %d\n",z*CELL_LENGTH,count/(d3_l->max_x*d3_l->max_y)); +#endif + } + close(fd); + + return 1; +} + +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,k,sum; + int width=0,height=0; + char bmpfile[MAX_CHARS]; + char buf[128]; + + if(window==1) + { + sprintf(bmpfile,"x-z_%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==2) + { + sprintf(bmpfile,"y-z_%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==3) + { + sprintf(bmpfile,"x-y_%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(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(window==7) + { + sprintf(bmpfile,"x-z_a_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==8) + { + sprintf(bmpfile,"y-z_a_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==9) + { + sprintf(bmpfile,"x-y_a_cdistr_%d.bmp",z); + foo=3*d3_l->max_x; + size=(foo+(4-foo%4))*d3_l->max_y; + height=d3_l->max_y; + width=d3_l->max_x; + } + if(window==10) + { + sprintf(bmpfile,"x-z_c_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==11) + { + sprintf(bmpfile,"y-z_c_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==12) + { + sprintf(bmpfile,"x-y_c_cdistr_%d.bmp",z); + foo=3*d3_l->max_x; + size=(foo+(4-foo%4))*d3_l->max_y; + height=d3_l->max_y; + width=d3_l->max_x; + } + if((fd=open(bmpfile,O_WRONLY|O_CREAT))<0) + { + puts("cannot open bmp file"); + return -1; + } + + /* bmpheader */ + buf[0]='B'; /* std header start */ + buf[1]='M'; + buf[2]=(size+0x36)&0xff; /* file size */ + buf[3]=(size+0x36)>>8; + memset(buf+4,0,6); + buf[10]=0x36; /* offset to data */ + memset(buf+11,0,3); + buf[14]=0x28; /* length of bmp info header */ + memset(buf+15,0,3); + buf[18]=width&0xff; /* width and height */ + buf[19]=width>>8; + memset(buf+20,0,2); + buf[22]=height&0xff; + buf[23]=height>>8; + memset(buf+24,0,2); + buf[26]=1; /* # planes -> 1 */ + buf[27]=0; + buf[28]=24; /* bits per pixel -> 2^24 (true color) */ + buf[29]=0; + memset(buf+30,0,4); /* compression -> none */ + buf[34]=size&0xff; /* data size */ + buf[35]=size>>8; + memset(buf+36,0,2); + buf[38]=0x12; /* res: pixel/meter */ + buf[39]=0x0b; + memset(buf+40,0,2); + buf[42]=0x12; + buf[43]=0x0b; + memset(buf+44,0,2); + memset(buf+46,0,8); /* no colors, no important colors */ + + if(write(fd,buf,54)<54) + { + puts("failed writing bmp header"); + return -1; + } + if(window==1) + { + for(j=0;jmax_z;j++) + { + for(i=0;imax_x;i++) + { + 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"); + 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==2) + { + for(j=0;jmax_z;j++) + { + for(i=0;imax_y;i++) + { + 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"); + 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==3) + { + for(j=0;jmax_y;j++) + { + for(i=0;imax_x;i++) + { + if(*(d3_l->status+i+(d3_l->max_y-j-1)*d3_l->max_x+z*d3_l->max_x*d3_l->max_y)&RED) memset(buf,0xff,3); + else memset(buf,0,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==4) + { + for(j=0;jmax_z;j++) + { + for(i=0;imax_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;jmax_z;j++) + { + for(i=0;imax_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;jmax_y;j++) + { + for(i=0;imax_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; + } + } + } + } + if(window==7) + { + for(j=0;jmax_z;j++) + { + for(i=0;imax_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) sum=*(d3_l->extra+i+y*d3_l->max_x+(d3_l->max_z-j-1)*d3_l->max_x*d3_l->max_y); + else sum=0; + 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==8) + { + for(j=0;jmax_z;j++) + { + for(i=0;imax_x;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) sum=*(d3_l->extra+x+i*d3_l->max_x+(d3_l->max_z-j-1)*d3_l->max_x*d3_l->max_y); + else sum=0; + 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==9) + { + for(j=0;jmax_y;j++) + { + for(i=0;imax_x;i++) + { + if(*(d3_l->status+i+(d3_l->max_y-j-1)*d3_l->max_x+z*d3_l->max_x*d3_l->max_y)&RED) sum=*(d3_l->extra+i+(d3_l->max_y-j-1)*d3_l->max_x+z*d3_l->max_x*d3_l->max_y); + else sum=0; + 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==10) + { + for(j=0;jmax_z;j++) + { + for(i=0;imax_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)) sum=*(d3_l->extra+i+y*d3_l->max_x+(d3_l->max_z-j-1)*d3_l->max_x*d3_l->max_y); + else sum=0; + 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==11) + { + for(j=0;jmax_z;j++) + { + for(i=0;imax_x;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)) sum=*(d3_l->extra+x+i*d3_l->max_x+(d3_l->max_z-j-1)*d3_l->max_x*d3_l->max_y); + else sum=0; + 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==12) + { + for(j=0;jmax_y;j++) + { + for(i=0;imax_x;i++) + { + if(!(*(d3_l->status+i+(d3_l->max_y-j-1)*d3_l->max_x+z*d3_l->max_x*d3_l->max_y)&RED)) sum=*(d3_l->extra+i+(d3_l->max_y-j-1)*d3_l->max_x+z*d3_l->max_x*d3_l->max_y); + else sum=0; + 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; +} + int save_to_file(char *sf,d3_lattice *d3_l,info *my_inf) { int sf_fd,c; @@ -342,7 +868,8 @@ int save_to_file(char *sf,d3_lattice *d3_l,info *my_inf) int load_from_file(char *lf,d3_lattice *d3_l,info *my_inf) { - int lf_fd,c; + + int lf_fd,c,pos,end,data,data_len,strip; if((lf_fd=open(lf,O_RDONLY))<0) { @@ -354,11 +881,31 @@ int load_from_file(char *lf,d3_lattice *d3_l,info *my_inf) puts("failed reading d3 lattice struct"); return -1; } - if(read(lf_fd,my_inf,sizeof(info))max_x*d3_l->max_y*d3_l->max_z; + data_len=data*(sizeof(int)+sizeof(unsigned char)); + printf("there are %d volumes so we need %d of bytes\n",data,data_len); + end=lseek(lf_fd,0,SEEK_END); + c=end-pos-data_len; + printf("end: %d => length: %d => guessed info size: %d bytes\n",end,end-pos,c); + strip=sizeof(info)-c; + printf("as real programs info size is %d, we strip %d bytes\n",sizeof(info),strip); + lseek(lf_fd,pos,SEEK_SET); + c=sizeof(info); + if(strip>0) c-=strip; + if(c<0) + { + puts("info smaller then strip size"); + return -1; + } + if(read(lf_fd,my_inf,c)0) memset(my_inf+c,0,strip); + if(strip<0) lseek(lf_fd,(-1*strip),SEEK_CUR); c=d3_l->max_x*d3_l->max_y*d3_l->max_z; if((d3_l->status=(unsigned char*)malloc(c*sizeof(unsigned char)))==NULL) { @@ -442,7 +989,7 @@ int get_c_ratio(double *c_ratio,char *pfile,info *my_info,d3_lattice *d3_l) 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; } } @@ -452,16 +999,118 @@ int get_c_ratio(double *c_ratio,char *pfile,info *my_info,d3_lattice *d3_l) return 1; } +u32 get_reject_graph(info *my_info,d3_lattice *d3_l,char *file,u32 *graph) { + double a,b; + int i,j,k; + int fd; + char buf[32],*p; + unsigned char *flag; + u32 max; + + max=0; + if((fd=open(file,O_RDONLY))<0) + { + puts("cannot open file to calculate rejection graph"); + return -1; + } + if((flag=(unsigned char *)malloc(d3_l->max_z))==NULL) + { + puts("cannot malloc flag memory for rejection graph"); + return -1; + } + memset(flag,0,d3_l->max_z); + memset(graph,0,d3_l->max_z*sizeof(u32)); + /* get fixpoints */ + k=1; + while(k) + { + for(i=0;i<32;i++) + { + k=read(fd,&buf[i],1); + if((buf[i]=='\n')||(k==0)) break; + } + if(k) + { + p=strtok(buf," "); + a=atof(p)/10; /* nm */ + p=strtok(NULL," "); + b=atof(p); + if(a>d3_l->max_z*CELL_LENGTH) k=0; + else + { + graph[(int)(a/CELL_LENGTH)]=(int)(URAND_MAX/100*b); + flag[(int)(a/CELL_LENGTH)]=1; + } + } + } + /* do (linear) interpolation here! */ + i=0; + a=0; + while(imax_z) + { + /* graph[0] is 0! */ + j=i; + i++; + while(flag[i]==0&&imax_z) i++; + for(k=j+1;kmax) max=graph[i]; + } + + free(flag); + +#ifdef DEBUG_INTERPOL_PROFILE + printf("debug: %s (interpolated profile)\n",file); + for(i=0;imax_z;i++) printf("%d %d\n",i,graph[i]); +#endif + + return max; +} + +int get_amorphous_layer_info(d3_lattice *d3_l,int *sai,int *sacl,int *eacl) { + int i,j,a,oend,nend,count; + unsigned char sacl_is_set=0; + unsigned char eacl_is_set=0; + unsigned char sai_is_set=0; + + a=d3_l->max_x*d3_l->max_y; + nend=a; + oend=0; + + for(i=0;imax_z;i++) { + count=0; + for(j=oend;jstatus+j)&AMORPH) count++; + oend=nend; + nend+=a; + if((count>=A_START*a)&&(!sai_is_set)) { + *sai=i; + sai_is_set=1; + } + if((count>=AC_START*a)&&(!sacl_is_set)) { + *sacl=i; + sacl_is_set=1; + } + if((count<=A_END*a)&&(sacl_is_set)&&(!eacl_is_set)) { + *eacl=i; + eacl_is_set=1; + } + if((eacl_is_set)&&(count>=A_END*a)) eacl_is_set=0; + } + return 1; +} + int main(int argc,char **argv) { u32 x,y,z,x_c,y_c,z_c; - int i,quit,escape,switchmode,nowait; + int i,j,quit,escape,switchmode,nowait,bmp,ac_distr; int refresh,resave; + int c_step; + int sai,sacl,eacl; char s_file[MAX_CHARS]; char s_file_tmp[MAX_CHARS]; 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 @@ -472,17 +1121,20 @@ int main(int argc,char **argv) char cc_txt[MAX_TXT]; 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 ballistic_txt[MAX_TXT]; + char carbon_txt[MAX_TXT]; + char stress_txt[MAX_TXT]; char r_txt[MAX_TXT]; - char cp_txt[MAX_TXT]; char zdiff_txt[MAX_TXT]; char diff_txt[MAX_TXT]; char dr_ac_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 srate_txt[MAX_TXT]; + char start_ai_txt[MAX_TXT]; + char start_acl_txt[MAX_TXT]; + char end_acl_txt[MAX_TXT]; char *arg_v[MAX_ARGV]; #endif d3_lattice d3_l; @@ -492,40 +1144,50 @@ int main(int argc,char **argv) #ifdef USE_DFB_API int max_extra; #endif + u32 *c_profile; + u32 *n_e_loss; + u32 ne_max,ip_max; + u32 nel_z; + unsigned char do_sputter; - d3_l.max_x=X; - d3_l.max_y=Y; - d3_l.max_z=Z; + d3_l.max_x=_X; + d3_l.max_y=_Y; + d3_l.max_z=_Z; my_info.steps=STEPS; my_info.range=RANGE; refresh=REFRESH; resave=RESAVE; - my_info.z_diff=0; - 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.s=S_D; + my_info.b=B_D; + my_info.c=C_D; my_info.cc=CC; my_info.dr_ac=DR_AC; - my_info.dr_cc=DR_CC; my_info.diff_rate=DIFF_RATE; + my_info.cpi=CPI; + my_info.s_rate=S_RATE; nowait=0; quit=0; escape=0; switchmode=0; + c_step=0; strcpy(s_file,""); strcpy(l_file,""); strcpy(c_file,""); strcpy(p_file,IMP_PROFILE); + strcpy(n_e_file,NEL_PROFILE); convert=0; strcpy(r_file,""); mode=0; + ne_max=0; + ip_max=0; + sai=0; + sacl=0; + eacl=0; + do_sputter=1; - amorph_count=0; - cryst_count=0; +#ifdef MORE_PRINTF + printf("reading argv ..."); +#endif for(i=1;i