dfbapi: font display changes
[physik/nlsop.git] / nlsop.c
1 /*
2  * nlsop.c 
3  *
4  * this program tries helping to understand the amorphous depuration
5  * and recrystallization of SiCx while ion implanation. hopefully the program 
6  * will simulate the stabilization of the selforganizing structure in the
7  * observed behaviour.
8  *
9  * refs: 
10  *  - J. K. N. Lindner. Habilationsschrift, Universitaet Augsburg.
11  *  - Maik Haeberlen. Diplomarbeit, Universitaet Augsburg.
12  */
13
14 #define _GNU_SOURCE
15 #include <stdio.h>
16 #include <stdlib.h>
17 #include <string.h>
18 #include <sys/types.h>
19 #include <sys/stat.h>
20 #include <fcntl.h>
21 #include <unistd.h>
22
23 #include "nlsop.h"
24
25 #include "dfbapi.h"
26 #include "random.h"
27
28 #define MAKE_AMORPH(N) *(N)|=AMORPH
29 #define MAKE_CRYST(N) *(N)&=~AMORPH
30
31 int usage(void)
32 {
33  puts("usage:");
34  puts("-h \t\t help");
35  puts("-n \t\t no user interaction");
36  printf("-a <value> \t slope of nuclear energy loss (default %f)\n",A_EL);
37  printf("-b <value> \t nuclear energy loss offset (default %f)\n",B_EL);
38  printf("-x <value> \t # x cells (default %d)\n",X);
39  printf("-y <value> \t # x cells (default %d)\n",Y);
40  printf("-z <value> \t # x cells (default %d)\n",Z);
41  /*
42  printf("-X <value> \t display x (default %d)\n",X/2-1);
43  printf("-Y <value> \t display y (default %d)\n",Y/2-1);
44  printf("-Z <value> \t display z (default %d)\n",Z/2-1);
45  */
46  printf("-s <value> \t steps (default %d)\n",STEPS);
47  printf("-d <value> \t refresh display (default %d)\n",REFRESH);
48  printf("-r <value> \t amorphous influence range (default %d)\n",RANGE);
49  printf("-f <value> \t pressure = <value> * 1/distance^2 (default %f)\n",A_AP);
50  printf("-p <value> \t pressure offset (default %f)\n",B_AP);
51  printf("-A <value> \t slope of linear c distribution (default %f)\n",A_CD);
52  printf("-B <value> \t linear c distribution offset (default %f)\n",B_CD);
53  printf("-C <value> \t initial c concentration (default %d)\n",CC);
54  puts("-L <file> \t load from file");
55  puts("-S <file> \t save to file");
56  puts("-R <file> \t read from random file");
57  
58  return 1;
59 }
60
61 int process_cell(d3_lattice *d3_l,u32 x,u32 y,u32 z,int r,double a,double b,int *t_c)
62 {
63  unsigned char *thiz;
64  int *conc;
65  int i,j;
66  double p;
67
68  thiz=d3_l->status+x+y*d3_l->max_x+z*d3_l->max_x*d3_l->max_y;
69  conc=d3_l->extra+x+y*d3_l->max_x+z*d3_l->max_x*d3_l->max_y;
70  p=b*URAND_MAX;
71  for(i=-r;i<=r;i++)
72  {
73   for(j=-r;j<=r;j++)
74   {
75    if(!(i==0 && j==0))
76    {
77     if(*(d3_l->status+((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)&AMORPH) p+=a*URAND_MAX/(i*i+j*j);
78    } 
79   }
80  }
81  if(!(*thiz&AMORPH))
82  {
83   if(get_rand(URAND_MAX)<=p)
84   {
85    MAKE_AMORPH(thiz);
86    *t_c=*t_c+1-*conc;
87   } else *t_c+=1;
88  } else
89  {
90   /* assume 1-p probability */
91   if(get_rand(URAND_MAX)>p)
92   {
93    MAKE_CRYST(thiz);
94    *t_c=*t_c+1+*conc;
95   } else *t_c+=1;
96  }
97
98  return 1;
99 }
100
101 int distrib_c(d3_lattice *d3_l,int t_c,double a,double b)
102 {
103  int i,j,k,total,area;
104  double sum;
105  int temp,left;
106  int *area_h;
107  u32 x,y,z;
108
109  area=d3_l->max_x*d3_l->max_y;
110  area_h=(int *)malloc(d3_l->max_z*sizeof(int));
111
112  total=0;
113  sum=b*d3_l->max_z+a*d3_l->max_z*(d3_l->max_z+1)/2;
114  for(i=0;i<d3_l->max_z;i++)
115  {
116   area_h[i]=0;
117   for(j=0;j<area;j++)
118   {
119    if(!(*(d3_l->status+(i*area)+j)&AMORPH))
120    {
121     area_h[i]+=1;
122    }
123   }
124   temp=(int)((i+1)*a+b)*t_c/(sum*area_h[i]);
125   for(j=0;j<area;j++)
126   {
127    if(!(*(d3_l->status+(i*area)+j)&AMORPH))
128    {
129     *(d3_l->extra+(i*area)+j)=temp;
130     total+=temp;
131    }
132   }
133   left=(int)(((i+1)*a+b)*t_c/sum)%area_h[i];
134   while(left)
135   {
136    x=get_rand(d3_l->max_x);
137    y=get_rand(d3_l->max_y);
138    if(!(*(d3_l->status+(i*area)+x+y*d3_l->max_x)&AMORPH))
139    {
140     *(d3_l->extra+(i*area)+x+y*d3_l->max_x)+=1;
141     total+=1;
142     left-=1;
143    }
144   }
145  }
146  left=t_c-total;
147  while(left)
148  {
149   x=get_rand(d3_l->max_x);
150   y=get_rand(d3_l->max_y);
151   z=get_rand_lgp(d3_l->max_z,a,b);
152   if(!(*(d3_l->status+x+y*d3_l->max_x+z*area)&AMORPH))
153   {
154    *(d3_l->extra+x+y*d3_l->max_x+z*area)+=1;
155    left-=1;
156   }
157  }
158  free(area_h);
159
160  return 1;
161 }
162
163 int save_to_file(char *sf,d3_lattice *d3_l,info *my_inf)
164 {
165  int sf_fd,c;
166
167  if((sf_fd=open(sf,O_WRONLY|O_CREAT))<0)
168  {
169   puts("cannot open save file");
170   return -1;
171  }
172  if(write(sf_fd,d3_l,sizeof(d3_lattice))<sizeof(d3_lattice))
173  {
174   puts("failed saving d3 lattice struct");
175   return -1;
176  }
177  if(write(sf_fd,my_inf,sizeof(info))<sizeof(info))
178  {
179   puts("failed saving info struct");
180   return-1;
181  }
182  c=d3_l->max_x*d3_l->max_y*d3_l->max_z;
183  if(write(sf_fd,d3_l->status,c*sizeof(unsigned char))<c*sizeof(unsigned char))
184  {
185   puts("failed saving status of d3 lattice sites");
186   return -1;
187  }
188  if(write(sf_fd,d3_l->extra,c*sizeof(int))<c*sizeof(int))
189  {
190   puts("failed saving sites concentration");
191   return -1;
192  }
193  close(sf_fd);
194
195  return 1;
196 }
197
198 int load_from_file(char *lf,d3_lattice *d3_l,info *my_inf)
199 {
200  int lf_fd,c;
201
202  if((lf_fd=open(lf,O_RDONLY))<0)
203  {
204   puts("cannot open load file");
205   return -1;
206  }
207  if(read(lf_fd,d3_l,sizeof(d3_lattice))<sizeof(d3_lattice))
208  {
209   puts("failed reading d3 lattice struct");
210   return -1;
211  }
212  if(read(lf_fd,my_inf,sizeof(info))<sizeof(info))
213  {
214   puts("failed reading info struct");
215   return-1;
216  }
217  c=d3_l->max_x*d3_l->max_y*d3_l->max_z;
218  if((d3_l->status=(unsigned char*)malloc(c*sizeof(unsigned char)))==NULL)
219  {
220   puts("cannot allocate status buffer");
221   return -1;
222  }
223  if((d3_l->extra=(int *)malloc(c*sizeof(int)))==NULL)
224  {
225   puts("cannot allocate concentration buffer");
226   return -1;
227  }
228  if(read(lf_fd,d3_l->status,c*sizeof(unsigned char))<c*sizeof(unsigned char))
229  {
230   puts("failed reading status of d3 lattice sites");
231   return -1;
232  }
233  if(read(lf_fd,d3_l->extra,c*sizeof(int))<c*sizeof(int))
234  {
235   puts("failed reading sites concentration");
236   return -1;
237  }
238  close(lf_fd);
239
240  return 1;
241 }
242
243 int main(int argc,char **argv)
244 {
245  u32 max_x,max_y,max_z,x,y,z,x_c,y_c,z_c;
246  int i,quit,escape,nowait;
247  int refresh;
248  char s_file[MAX_CHARS];
249  char l_file[MAX_CHARS];
250  char r_file[MAX_CHARS];
251  char x_txt[MAX_TXT];
252  char y_txt[MAX_TXT];
253  char z_txt[MAX_TXT];
254  char status_txt[MAX_TXT];
255  char conc_txt[MAX_TXT];
256  char steps_txt[MAX_TXT];
257  char cc_txt[MAX_TXT];
258  char a_txt[MAX_TXT];
259  char s_txt[MAX_TXT];
260  char ap_txt[MAX_TXT];
261  char el_txt[MAX_TXT];
262  char cd_txt[MAX_TXT];
263  char r_txt[MAX_TXT];
264  char ap2_txt[MAX_TXT];
265  char cd2_txt[MAX_TXT];
266  char el2_txt[MAX_TXT];
267  char *arg_v[MAX_ARGV];
268  d3_lattice d3_l;
269  info my_info;
270
271  max_x=X;
272  max_y=Y;
273  max_z=Z;
274  my_info.steps=STEPS;
275  my_info.range=RANGE;
276  refresh=REFRESH;
277  my_info.a_el=A_EL;
278  my_info.b_el=B_EL;
279  my_info.a_cd=A_CD;
280  my_info.b_cd=B_CD;
281  my_info.a_ap=A_AP;
282  my_info.b_ap=B_AP;
283  my_info.cc=CC;
284  nowait=0;
285  quit=0;
286  escape=0;
287  strcpy(s_file,"");
288  strcpy(l_file,"");
289  strcpy(r_file,"");
290
291  for(i=1;i<argc;i++)
292  {
293   if(argv[i][0]=='-')
294   {
295    switch(argv[i][1])
296    {
297     case 'h':
298      usage();
299      return -1;
300     case 'n':
301      nowait=1;
302      break;
303     case 'a':
304      my_info.a_el=atof(argv[++i]);
305      break;
306     case 'b':
307      my_info.b_el=atof(argv[++i]);
308      break;
309     case 'x':
310      max_x=atoi(argv[++i]);
311      break;
312     case 'y':
313      max_y=atoi(argv[++i]);
314      break;
315     case 'z':
316      max_z=atoi(argv[++i]);
317      break;
318     /*
319     case 'X':
320      x=atoi(argv[++i]);
321      break;
322     case 'Y':
323      y=atoi(argv[++i]);
324      break;
325     case 'Z':
326      z=atoi(argv[++i]);
327      break;
328     */
329     case 's':
330      my_info.steps=atoi(argv[++i]);
331      break;
332     case 'd':
333      refresh=atoi(argv[++i]);
334      break;
335     case 'r':
336      my_info.range=atoi(argv[++i]);
337      break;
338     case 'f':
339      my_info.a_ap=atof(argv[++i]);
340      break;
341     case 'p':
342      my_info.b_ap=atof(argv[++i]);
343      break;
344     case 'A':
345      my_info.a_cd=atof(argv[++i]);
346      break;
347     case 'B':
348      my_info.b_cd=atof(argv[++i]);
349      break;
350     case 'C':
351      my_info.cc=atoi(argv[++i]);
352      break;
353     case 'L':
354      strcpy(l_file,argv[++i]);
355      break;
356     case 'S':
357      strcpy(s_file,argv[++i]);
358      break;
359     case 'R':
360      strcpy(r_file,argv[++i]);
361      break;
362     default:
363      usage();
364      return -1;
365    }
366   } else usage();
367  }
368
369  x=max_x/2-1;
370  y=max_y/2-1;
371  z=max_z/2-1;
372
373
374
375  if(!strcmp(r_file,"")) rand_init(NULL);
376  else rand_init(r_file);
377
378  if(!strcmp(l_file,""))
379  {
380   i=max_x*max_y*max_z;
381   d3_lattice_init(&argc,argv,&d3_l,max_x,max_y,max_z);
382   if((d3_l.status=(unsigned char *)malloc(i*sizeof(unsigned char)))==NULL)
383   {
384    puts("failed allocating status buffer");
385    return -1;
386   }
387   memset(d3_l.status,0,i*sizeof(unsigned char));
388   if((d3_l.extra=(int *)malloc(i*sizeof(int)))==NULL)
389   {
390    puts("failed allocating concentration buffer");
391    return -1;
392   }
393   memset(d3_l.extra,0,i*sizeof(int));
394  } else
395  {
396   load_from_file(l_file,&d3_l,&my_info);
397   d3_lattice_init(&argc,argv,&d3_l,d3_l.max_x,d3_l.max_y,d3_l.max_z);
398  }
399
400  d3_event_init(&d3_l);
401
402  strcpy(a_txt,"args:");
403  sprintf(s_txt,"steps: %d",my_info.steps);
404  sprintf(r_txt,"pressure range: %d",my_info.range);
405  sprintf(ap_txt,"p faktor: %.2f",my_info.a_ap);
406  sprintf(ap2_txt,"p offset: %.2f",my_info.b_ap);
407  sprintf(el_txt,"e loss slope: %.2f",my_info.a_el);
408  sprintf(el2_txt,"e loss offset: %.2f",my_info.b_el);
409  sprintf(cd_txt,"c distrib slope: %.2f",my_info.a_cd);
410  sprintf(cd2_txt,"c distrib offset: %.2f",my_info.b_cd);
411  arg_v[1]=x_txt;
412  arg_v[2]=y_txt;
413  arg_v[3]=z_txt;
414  arg_v[4]=NULL;
415  arg_v[5]=status_txt;
416  arg_v[6]=conc_txt;
417  arg_v[7]=NULL;
418  arg_v[8]=NULL;
419  arg_v[9]=NULL;
420  arg_v[10]=steps_txt;;
421  arg_v[11]=cc_txt;
422  arg_v[12]=NULL;
423  arg_v[13]=NULL;
424  arg_v[14]=a_txt;
425  arg_v[15]=NULL;
426  arg_v[16]=s_txt;
427  arg_v[17]=r_txt;
428  arg_v[18]=ap_txt;
429  arg_v[19]=ap2_txt;
430  arg_v[20]=el_txt;
431  arg_v[21]=el2_txt;
432  arg_v[22]=cd_txt;
433  arg_v[23]=cd2_txt;
434
435  if(!strcmp(l_file,""))
436  {
437   i=0;
438   while((i<my_info.steps) && (quit==0) && (escape==0))
439   {
440    x_c=get_rand(d3_l.max_x);
441    y_c=get_rand(d3_l.max_y);
442    z_c=get_rand_lgp(d3_l.max_z,my_info.a_el,my_info.b_el);
443    distrib_c(&d3_l,my_info.cc,my_info.a_cd,my_info.b_cd);
444    process_cell(&d3_l,x_c,y_c,z_c,my_info.range,my_info.a_ap,my_info.b_ap,&(my_info.cc));
445    if(i%refresh==0)
446    {
447     sprintf(x_txt,"x: %d",x+1);
448     sprintf(y_txt,"y: %d",y+1);
449     sprintf(z_txt,"z: %d",z+1);
450     sprintf(status_txt,"status: %c",(*(d3_l.status+x+y*d3_l.max_x+z*d3_l.max_x*d3_l.max_y)&AMORPH)?'a':'c');
451     sprintf(conc_txt,"conc: %d",*(d3_l.extra+x+y*d3_l.max_x+z*d3_l.max_x*d3_l.max_y));
452     sprintf(steps_txt,"step: %d",i);
453     sprintf(cc_txt,"total c: %d",my_info.cc);
454     d3_lattice_draw(&d3_l,x,y,z,23,arg_v);
455     // scan_event(&d3_l,&x,&y,&z,&quit,&escape);
456    }
457    i++;
458   }
459  }
460
461  if(strcmp(s_file,"")) save_to_file(s_file,&d3_l,&my_info);
462
463  while((quit==0) && (escape==0) && (nowait==0))
464  {
465   sprintf(x_txt,"x: %d",x+1);
466   sprintf(y_txt,"y: %d",y+1);
467   sprintf(z_txt,"z: %d",z+1);
468   sprintf(status_txt,"status: %c",(*(d3_l.status+x+y*d3_l.max_x+z*d3_l.max_x*d3_l.max_y)&AMORPH)?'a':'c');
469   sprintf(conc_txt,"conc: %d",*(d3_l.extra+x+y*d3_l.max_x+z*d3_l.max_x*d3_l.max_y));
470   strcpy(steps_txt,"step: end!");
471   sprintf(cc_txt,"total c: %d",my_info.cc);
472   d3_lattice_draw(&d3_l,x,y,z,23,arg_v);
473   scan_event(&d3_l,&x,&y,&z,&quit,&escape);
474  }
475
476  return 1;
477 }