X-Git-Url: https://hackdaworld.org/gitweb/?p=physik%2Fnlsop.git;a=blobdiff_plain;f=nlsop_client.c;h=beeda9f8daedf4982e5d31c7a841392b8c77d5d8;hp=8a1c81c72f48aecf44771a577db60a463bb8adb7;hb=HEAD;hpb=361df9fdcc3ff3f6eb5480b9dc6f34e1bcced416 diff --git a/nlsop_client.c b/nlsop_client.c index 8a1c81c..beeda9f 100644 --- a/nlsop_client.c +++ b/nlsop_client.c @@ -59,12 +59,15 @@ char p_file[MAX_CHARS]; char n_e_file[MAX_CHARS]; char r_file[MAX_CHARS]; +char s_file[MAX_CHARS]; +int start_fd; t_net *gnet; d3_lattice *gd3_l; info *gmy_info; int *gi; unsigned char dc; unsigned char shut_down; +double c_ratio; int get_data_and_calc(t_event *event,void *allineed); int nop(t_event *event,void *allineed); @@ -72,7 +75,7 @@ int nop(t_event *event,void *allineed); int usage(char *prog) { puts("usage:"); - printf("%s -i ip -p port -r/P/n random/profile/neloss file\n",prog); + printf("%s -i ip -p port -r/P/n/s random/profile/neloss/start file\n",prog); return 1; } @@ -102,6 +105,47 @@ int sputter(d3_lattice *d3_l) return 1; } +int get_c_ratio(double *c_ratio,char *pfile,info *my_info,d3_lattice *d3_l) +{ + double all,a,b,d; + int i,k; + int p_fd; + unsigned char buf[32]; + char *p; + unsigned char c; + + if((p_fd=open(pfile,O_RDONLY))<0) + { + puts("cannot open profile file"); + return -1; + } + k=1; + d=0; + all=0; + while(k) + { + for(i=0;i<32;i++) + { + k=read(p_fd,&c,1); + buf[i]=c; + if(c=='\n') 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) d+=b; + all+=b; + } + } + *c_ratio=d/all; + close(p_fd); + + return 1; +} + int process_cell(d3_lattice *d3_l,u32 x,u32 y,u32 z,info *my_info,u32 nel_z) { unsigned char *thiz; @@ -161,11 +205,13 @@ int distrib_c(d3_lattice *d3_l,info *my_info,int step,u32 rj_m,u32 *rj_g) int carry; /* put one c ion somewhere in the lattice */ - 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(c_ratio*step<=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) { @@ -348,6 +394,8 @@ int main(int argc,char **argv) strcpy(p_file,IMP_PROFILE); strcpy(n_e_file,NEL_PROFILE); strcpy(r_file,""); + strcpy(s_file,""); + start_fd=0; port=1025; /* parse/check argv */ @@ -372,6 +420,9 @@ int main(int argc,char **argv) case 'p': port=atoi(argv[++i]); break; + case 's': + strcpy(s_file,argv[++i]); + break; default: usage(argv[0]); return -1; @@ -383,6 +434,13 @@ int main(int argc,char **argv) return -1; } + /* try a file to start from */ + if(strcmp(s_file,"")) { + start_fd=open(s_file,O_RDONLY); + if(start_fd>0) printf("using %s as a starting file ...\n",s_file); + else printf("errors opening %s!\n",s_file); + } + /* event init */ event_init(&event,1); event_set_timeout(&event,0,0); @@ -406,6 +464,7 @@ int main(int argc,char **argv) event_start(&event,NULL,get_data_and_calc,nop); network_shutdown(&net); + if(start_fd>0) close(start_fd); return 1; } @@ -428,6 +487,7 @@ int get_data_and_calc(t_event *event,void *allineed) { u32 x_c,y_c,z_c; int i,j; int c_step; + unsigned char do_sputter; unsigned char data; t_net *net; @@ -435,6 +495,8 @@ int get_data_and_calc(t_event *event,void *allineed) { c_step=0; ne_max=0; ip_max=0; + do_sputter=1; + c_ratio=0; net=gnet; gd3_l=&d3_l; @@ -481,6 +543,31 @@ int get_data_and_calc(t_event *event,void *allineed) { memset(d3_l.status,0,j*sizeof(unsigned char)); memset(d3_l.extra,0,j*sizeof(int)); } + /* check for file to start from ... */ + if(start_fd>0) { + printf("starting from a save file!\n"); + unsigned char *nullbuf; + nullbuf=(unsigned char *)malloc(sizeof(d3_lattice)); + if(read(start_fd,nullbuf,sizeof(d3_lattice))!=sizeof(d3_lattice)) { + printf("read failed (start file d3l)\n"); + return -1; + } + free(nullbuf); + nullbuf=(unsigned char *)malloc(sizeof(info)); + if(read(start_fd,nullbuf,sizeof(info))!=sizeof(info)) { + printf("read failed (start file info)\n"); + return -1; + } + free(nullbuf); + if(read(start_fd,d3_l.status,j*sizeof(unsigned char))!=j*sizeof(unsigned char)) { + printf("read failed (start file status)\n"); + return -1; + } + if(read(start_fd,d3_l.extra,j*sizeof(int))!=j*sizeof(int)) { + printf("read failed (start file extra)\n"); + return -1; + } + } } else { printf("unknown instruction, restarting ...\n"); @@ -525,7 +612,7 @@ int get_data_and_calc(t_event *event,void *allineed) { /* this should be obsolete - z is high enough - we check now! */ if(c_profile[d3_l.max_z-1]!=0) { printf("max_z (%d) too small - sputtering not possible\n",d3_l.max_z); - return -1; + do_sputter=0; } /* sputtering really possible ?*/ @@ -533,6 +620,12 @@ int get_data_and_calc(t_event *event,void *allineed) { printf("warning: max_z (%d) too small, there may be amorphous volumes\n", d3_l.max_z); + /* maybe we need a ratio! */ + if(!do_sputter) { + get_c_ratio(&c_ratio,p_file,&my_info,&d3_l); + printf("calculated c ratio: %f\n",c_ratio); + } + /* * start of simulation */ @@ -553,7 +646,7 @@ int get_data_and_calc(t_event *event,void *allineed) { send_data(0); dc=DC_QUIT; } - if(i%my_info.s_rate==0) sputter(&d3_l); + if((do_sputter)&(i%my_info.s_rate==0)) sputter(&d3_l); if(shut_down) { free(d3_l.status); free(d3_l.extra);