From c5b9953db14e79a0c8457b2f7ca7bbc54e35d619 Mon Sep 17 00:00:00 2001 From: hackbard Date: Tue, 5 Oct 2004 19:10:07 +0000 Subject: [PATCH 1/1] implemented sputtering effect --- nlsop.c | 76 ++++++++++++++++++++++++++++++++++++++++----------------- nlsop.h | 4 +-- 2 files changed, 56 insertions(+), 24 deletions(-) diff --git a/nlsop.c b/nlsop.c index 2bec6ec..fc34c8a 100644 --- a/nlsop.c +++ b/nlsop.c @@ -76,11 +76,33 @@ int usage(void) 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); - puts("-m \t specify c->a carbon saturation"); + printf("-m \t number of ion hits sputtering 3nm (default %d)\n",S_RATE); return 1; } +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; @@ -127,7 +149,7 @@ int process_cell(d3_lattice *d3_l,u32 x,u32 y,u32 z,info *my_info,u32 nel_z) return 1; } -int distrib_c(d3_lattice *d3_l,info *my_info,int step,double c_ratio,u32 rj_m,u32 *rj_g) +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; @@ -135,14 +157,11 @@ int distrib_c(d3_lattice *d3_l,info *my_info,int step,double c_ratio,u32 rj_m,u3 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_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)++; - } + 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) { @@ -155,7 +174,7 @@ int distrib_c(d3_lattice *d3_l,info *my_info,int step,double c_ratio,u32 rj_m,u3 { 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 && *(d3_l->extra+offset)c_sat) + if(*(d3_l->status+offset)&AMORPH) { for(c=-1;c<=1;c++) { @@ -1131,7 +1150,7 @@ int main(int argc,char **argv) d3_lattice d3_l; info my_info; unsigned char mode; - double c_ratio; + //double c_ratio; #ifdef USE_DFB_API int max_extra; #endif @@ -1157,7 +1176,7 @@ int main(int argc,char **argv) my_info.dr_cc=DR_CC; my_info.diff_rate=DIFF_RATE; my_info.cpi=CPI; - my_info.c_sat=C_SAT; + my_info.s_rate=S_RATE; nowait=0; quit=0; escape=0; @@ -1264,7 +1283,7 @@ int main(int argc,char **argv) my_info.cpi=atoi(argv[++i]); break; case 'm': - my_info.c_sat=atoi(argv[++i]); + my_info.s_rate=atoi(argv[++i]); break; default: usage(); @@ -1358,7 +1377,7 @@ int main(int argc,char **argv) sprintf(diff_txt,"diffusion every %d steps",my_info.diff_rate); strcpy(mode_txt,"view: a/c mode"); sprintf(hpi_txt,"hits per ion: %d",my_info.cpi); - sprintf(csat_txt,"carbon saturation: %d",my_info.c_sat); + sprintf(csat_txt,"sputter rate (3nm/#c): %d",my_info.s_rate); arg_v[1]=mode_txt; arg_v[2]=xyz_txt; arg_v[3]=status_txt; @@ -1404,18 +1423,30 @@ int main(int argc,char **argv) 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 MORE_PRINTF + printf(" done\n"); +#endif + + if((!strcmp(l_file,""))||(c_step)) { - /* calculate ratio of c_simwindow / c_total */ - if(get_c_ratio(&c_ratio,p_file,&my_info,&d3_l)!=1) + + /* this should be obsolete - z is high enough - we check now! */ + if(c_profile[d3_l.max_z-1]!=0) { - puts("failed calculating ratio"); + printf("max_z (%d) too small - sputtering not possible\n",d3_l.max_z); return -1; } + /* calculate ratio of c_simwindow / c_total */ + //if(get_c_ratio(&c_ratio,p_file,&my_info,&d3_l)!=1) + //{ + // puts("failed calculating ratio"); + // return -1; + //} -#ifdef MORE_PRINTF - printf(" done\n"); -#endif + /* sputtering realy possible ?*/ + if(n_e_loss[d3_l.max_z-1]!=0) + printf("warning: max_z (%d) too small - there may be amorphous volumes\n",d3_l.max_z); #ifdef DEBUG_RAND i=0; @@ -1454,7 +1485,7 @@ int main(int argc,char **argv) 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); + distrib_c(&d3_l,&my_info,i,ip_max,c_profile); #ifdef USE_DFB_API if(i%refresh==0) { @@ -1475,6 +1506,7 @@ int main(int argc,char **argv) #endif } i++; + if(i%my_info.s_rate==0) sputter(&d3_l); } } diff --git a/nlsop.h b/nlsop.h index afc0c84..5e8db78 100644 --- a/nlsop.h +++ b/nlsop.h @@ -15,7 +15,7 @@ typedef unsigned int u32; typedef struct __info { - int cc,steps,range,diff_rate,cpi,c_sat; + int cc,steps,range,diff_rate,cpi,s_rate; double s,b,c,dr_ac,dr_cc; char z_diff,c_diff; } info; @@ -52,7 +52,7 @@ typedef struct __info #define CPI 100 -#define C_SAT (168*8) +#define S_RATE ((2*3*STEPS)/100) #define SI_PER_VOLUME (168*8) #define FFT_HEIGHT 64 -- 2.20.1