added c ratio calculation
[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 implantation at temperatures
6  * below 400 degree celsius.
7  * hopefully the program will simulate the stabilization of the
8  * selforganizing lamella structure in the observed behaviour.
9  *
10  * refs: 
11  *  - J. K. N. Lindner. Habilationsschrift, Universitaet Augsburg.
12  *  - Maik Haeberlen. Diplomarbeit, Universitaet Augsburg.
13  */
14
15 #define _GNU_SOURCE
16 #include <stdio.h>
17 #include <stdlib.h>
18 #include <string.h>
19 #include <sys/types.h>
20 #include <sys/stat.h>
21 #include <fcntl.h>
22 #include <unistd.h>
23
24 #include "nlsop.h"
25
26 #include "dfbapi.h"
27 #include "random.h"
28
29 #define MAKE_AMORPH(N) *(N)|=AMORPH
30 #define MAKE_CRYST(N) *(N)&=~AMORPH
31
32 int usage(void)
33 {
34  puts("usage:");
35  puts("-h \t\t help");
36  puts("-n \t\t no user interaction");
37  puts("-Z \t\t cryst -> amorph c diffusion in z direction");
38  printf("-a <value> \t slope of nuclear energy loss (default %f)\n",A_EL);
39  printf("-b <value> \t nuclear energy loss offset (default %f)\n",B_EL);
40  printf("-x <value> \t # x cells (default %d)\n",X);
41  printf("-y <value> \t # y cells (default %d)\n",Y);
42  printf("-z <value> \t # z cells (default %d)\n",Z);
43  printf("-s <value> \t steps (default %d)\n",STEPS);
44  printf("-d <value> \t refresh display (default %d)\n",REFRESH);
45  printf("-r <value> \t amorphous influence range (default %d)\n",RANGE);
46  printf("-f <value> \t pressure = <value> * 1/distance^2 (default %f)\n",A_AP);
47  printf("-p <value> \t pressure offset (default %f)\n",B_AP);
48  printf("-F <value> \t proportionality constant between c conc and ability to get amorphous (default %f)\n",A_CP);
49  printf("-A <value> \t slope of linear c distribution (default %f)\n",A_CD);
50  printf("-B <value> \t linear c distribution offset (default %f)\n",B_CD);
51  printf("-D <value> \t diffusion rate from cryst to amorph cells (default %f)\n",DR_AC);
52  printf("-c <value> \t diffusion rate in cryst cells (default %f)\n",DR_CC);
53  printf("-e <value> \t do diffusion every <value> steps (default %d)\n",DIFF_RATE);
54  printf("-W <value> \t write every <value> steps to save file (default %d)\n",RESAVE);
55  puts("-C <file> \t convert file to gnuplot format");
56  puts("-L <file> \t load from file");
57  puts("-S <file> \t save to file");
58  puts("-R <file> \t read from random file");
59  puts("-P <file> \t specify implantatin profile file");
60  
61  return 1;
62 }
63
64 int process_cell(d3_lattice *d3_l,u32 x,u32 y,u32 z,info *my_info)
65 {
66  unsigned char *thiz;
67  int *conc;
68  int i,j;
69  int off;
70  double p;
71
72  thiz=d3_l->status+x+y*d3_l->max_x+z*d3_l->max_x*d3_l->max_y;
73  conc=d3_l->extra+x+y*d3_l->max_x+z*d3_l->max_x*d3_l->max_y;
74  p=my_info->b_ap*URAND_MAX;
75  for(i=-(my_info->range);i<=my_info->range;i++)
76  {
77   for(j=-(my_info->range);j<=my_info->range;j++)
78   {
79    if(!(i==0 && j==0))
80    {
81     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;
82     if(*(d3_l->status+off)&AMORPH) p+=my_info->a_ap*(*(d3_l->extra+off))*URAND_MAX/(i*i+j*j);
83    } 
84   }
85  }
86  p+=*conc*my_info->a_cp*URAND_MAX;
87  printf("debug: %f - %u\n",p,URAND_MAX);
88  if(!(*thiz&AMORPH))
89  {
90   if(get_rand(URAND_MAX)<=p) MAKE_AMORPH(thiz);
91  } else
92  {
93   /* assume 1-p probability */
94   if(get_rand(URAND_MAX)>p) MAKE_CRYST(thiz);
95  }
96  
97  return 1;
98 }
99
100 int distrib_c(d3_lattice *d3_l,info *my_info,int step,double c_ratio)
101 {
102  u32 x,y,z;
103  int i,j,k,c;
104  int offset,off;
105  int carry;
106
107  /* put one c ion somewhere in the lattice */
108  if(my_info->cc<c_ratio*step)
109  {
110   x=get_rand(d3_l->max_x);
111   y=get_rand(d3_l->max_y);
112   z=get_rand_lgp(d3_l->max_z,my_info->a_cd,my_info->b_cd);
113   *(d3_l->extra+x+y*d3_l->max_x+z*d3_l->max_x*d3_l->max_y)+=1;
114   (my_info->cc)++;
115  }
116
117  if(step%my_info->diff_rate==0)
118  {
119
120  for(i=0;i<d3_l->max_x;i++)
121  {
122   for(j=0;j<d3_l->max_y;j++)
123   {
124    for(k=0;k<d3_l->max_z;k++)
125    {
126     offset=i+j*d3_l->max_x+k*d3_l->max_x*d3_l->max_y;
127     /* case amorph - amorph <-> cryst diffusion */
128     if(*(d3_l->status+offset)&AMORPH)
129     {
130      for(c=-1;c<=1;c++)
131      {
132       if(c!=0)
133       {
134        off=((i+d3_l->max_x+c)%d3_l->max_x)+j*d3_l->max_x+k*d3_l->max_x*d3_l->max_y;
135        carry=0;
136        if(!(*(d3_l->status+off)&AMORPH)) carry=(int)(my_info->dr_ac*(*(d3_l->extra+off)));
137        if(carry!=0)
138        {
139         *(d3_l->extra+offset)+=carry;
140         *(d3_l->extra+off)-=carry;
141        }
142       }
143      }
144      for(c=-1;c<=1;c++)
145      {
146       if(c!=0)
147       {
148        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;
149        carry=0;
150        if(!(*(d3_l->status+off)&AMORPH)) carry=(int)(my_info->dr_ac*(*(d3_l->extra+off)));                             
151        if(carry!=0)
152        {
153         *(d3_l->extra+offset)+=carry; 
154         *(d3_l->extra+off)-=carry; 
155        }
156       }
157      }
158      if(my_info->z_diff)
159      {
160       for(c=-1;c<=1;c++)
161       {
162        if(c!=0)
163        {
164         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;
165         carry=0;
166         if(!*(d3_l->status+off)&AMORPH) carry=(int)(my_info->dr_ac*(*(d3_l->extra+off)));
167         if(carry!=0)
168         {
169          *(d3_l->extra+off)-=carry;
170          *(d3_l->extra+offset)+=carry;
171         }
172        }
173       }
174      }  
175     } else
176     /* case not amorph - cryst <-> cryst diffusion */
177     {
178      for(c=-1;c<=1;c++) 
179      {
180       if(c!=0)
181       {
182        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;
183        carry=0;
184        if(!(*(d3_l->status+off)&AMORPH))
185        {
186         carry=(*(d3_l->extra+off)-*(d3_l->extra+offset))/2;
187         if(carry!=0)
188         {
189          *(d3_l->extra+offset)+=carry;
190          *(d3_l->extra+off)-=carry;
191         }
192        }
193       }
194      }
195      for(c=-1;c<=1;c++)
196      {
197       if(c!=0)
198       {
199        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;
200        carry=0;
201        if(!(*(d3_l->status+off)&AMORPH))
202        {
203         carry=(*(d3_l->extra+off)-*(d3_l->extra+offset))/2;
204         if(carry!=0)
205         {
206          *(d3_l->extra+offset)+=carry;
207          *(d3_l->extra+off)-=carry;
208         }
209        }
210       }
211      }
212     }
213    } /* for z */
214   } /* for y */
215  } /* for x */
216
217  } /* if step modulo diff_rate == 0 */
218
219  return 1;
220 }
221
222 int calc_pressure(d3_lattice *d3_l,int range)
223 {
224  int i,j,off;
225  double count;
226  int x,y,z;
227
228  for(x=0;x<d3_l->max_x;x++)
229  {
230   for(y=0;y<d3_l->max_y;y++)
231   {
232    for(z=0;z<d3_l->max_z;z++)
233    {
234     count=0;
235     for(i=-range;i<=range;i++)
236     {
237      for(j=-range;j<=range;j++)
238      {
239       if(i!=0 && j!=0)
240       {
241        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;
242        if(*(d3_l->status+off)&AMORPH) count+=((double)*(d3_l->extra+off))/(i*i+j*j);
243       }
244      }
245     }
246     *(unsigned char *)(d3_l->v_ptr+x+y*d3_l->max_x+z*d3_l->max_x*d3_l->max_y)=(unsigned char)(count*255/MAX_VPTR);
247    }
248   }
249  }
250
251  return 1;
252 }
253
254 int save_to_file(char *sf,d3_lattice *d3_l,info *my_inf)
255 {
256  int sf_fd,c;
257
258  if((sf_fd=open(sf,O_WRONLY|O_CREAT))<0)
259  {
260   puts("cannot open save file");
261   return -1;
262  }
263  if(write(sf_fd,d3_l,sizeof(d3_lattice))<sizeof(d3_lattice))
264  {
265   puts("failed saving d3 lattice struct");
266   return -1;
267  }
268  if(write(sf_fd,my_inf,sizeof(info))<sizeof(info))
269  {
270   puts("failed saving info struct");
271   return-1;
272  }
273  c=d3_l->max_x*d3_l->max_y*d3_l->max_z;
274  if(write(sf_fd,d3_l->status,c*sizeof(unsigned char))<c*sizeof(unsigned char))
275  {
276   puts("failed saving status of d3 lattice sites");
277   return -1;
278  }
279  if(write(sf_fd,d3_l->extra,c*sizeof(int))<c*sizeof(int))
280  {
281   puts("failed saving sites concentration");
282   return -1;
283  }
284  close(sf_fd);
285
286  return 1;
287 }
288
289 int load_from_file(char *lf,d3_lattice *d3_l,info *my_inf)
290 {
291  int lf_fd,c;
292
293  if((lf_fd=open(lf,O_RDONLY))<0)
294  {
295   puts("cannot open load file");
296   return -1;
297  }
298  if(read(lf_fd,d3_l,sizeof(d3_lattice))<sizeof(d3_lattice))
299  {
300   puts("failed reading d3 lattice struct");
301   return -1;
302  }
303  if(read(lf_fd,my_inf,sizeof(info))<sizeof(info))
304  {
305   puts("failed reading info struct");
306   return-1;
307  }
308  c=d3_l->max_x*d3_l->max_y*d3_l->max_z;
309  if((d3_l->status=(unsigned char*)malloc(c*sizeof(unsigned char)))==NULL)
310  {
311   puts("cannot allocate status buffer");
312   return -1;
313  }
314  if((d3_l->extra=(int *)malloc(c*sizeof(int)))==NULL)
315  {
316   puts("cannot allocate concentration buffer");
317   return -1;
318  }
319  if(read(lf_fd,d3_l->status,c*sizeof(unsigned char))<c*sizeof(unsigned char))
320  {
321   puts("failed reading status of d3 lattice sites");
322   return -1;
323  }
324  if(read(lf_fd,d3_l->extra,c*sizeof(int))<c*sizeof(int))
325  {
326   puts("failed reading sites concentration");
327   return -1;
328  }
329  close(lf_fd);
330
331  return 1;
332 }
333
334 int convert_file(char *cf,d3_lattice *d3_l)
335 {
336  int x,y,z;
337  int c_fd;
338
339  if((c_fd=open(cf,O_WRONLY|O_CREAT))<0)
340  {
341   puts("cannot open convert file");
342   return -1;
343  }
344  dprintf(c_fd,"# created by nlsop (gnuplot format)\n");
345  for(x=0;x<d3_l->max_x;x++)
346  {
347   for(y=0;y<d3_l->max_y;y++)
348   {
349    for(z=0;z<d3_l->max_z;z++)
350    {
351     if(*(d3_l->status+x+y*d3_l->max_x+z*d3_l->max_x*d3_l->max_y)&AMORPH) dprintf(c_fd,"%d %d %d\n",x,y,z);
352    }
353   }
354  }
355  close(c_fd);
356
357  return 1;
358 }
359
360 int get_c_ratio(double *c_ratio,char *pfile,info *my_info,d3_lattice *d3_l)
361 {
362  double all,a,b,d;
363  int i,k;
364  int p_fd;
365  unsigned char buf[32];
366  char *p;
367  unsigned char c;
368
369  if((p_fd=open(pfile,O_RDONLY))<0)
370  {
371   puts("cannot open profile file");
372   return -1;
373  }
374  k=1;
375  d=0;
376  all=0;
377  while(k)
378  {
379   for(i=0;i<32;i++)
380   {
381    k=read(p_fd,&c,1);
382    buf[i]=c;
383    if(c=='\n') break;
384   }
385   if(k)
386   {
387    p=strtok(buf," ");
388    a=atof(p)/10; /* nm */
389    p=strtok(NULL," ");
390    b=atof(p);
391    if(a>my_info->b_cd*CELL_LENGTH && a<(my_info->b_cd+d3_l->max_z)*CELL_LENGTH) d+=b;
392    all+=b;
393   }
394  }
395  *c_ratio=d/all;
396
397  return 1;
398 }
399
400 int main(int argc,char **argv)
401 {
402  u32 x,y,z,x_c,y_c,z_c;
403  int i,quit,escape,switchmode,nowait;
404  int refresh,resave;
405  char s_file[MAX_CHARS];
406  char s_file_tmp[MAX_CHARS];
407  char l_file[MAX_CHARS];
408  char c_file[MAX_CHARS];
409  char p_file[MAX_CHARS];
410  char convert;
411  char r_file[MAX_CHARS];
412 #ifdef USE_DFB_API
413  char xyz_txt[MAX_TXT];
414  char status_txt[MAX_TXT];
415  char conc_txt[MAX_TXT];
416  char steps_txt[MAX_TXT];
417  char cc_txt[MAX_TXT];
418  char a_txt[MAX_TXT];
419  char s_txt[MAX_TXT];
420  char ap_txt[MAX_TXT];
421  char el_txt[MAX_TXT];
422  char cd_txt[MAX_TXT];
423  char r_txt[MAX_TXT];
424  char cp_txt[MAX_TXT];
425  char zdiff_txt[MAX_TXT];
426  char diff_txt[MAX_TXT];
427  char dr_ac_txt[MAX_TXT];
428  char dr_cc_txt[MAX_TXT];
429  char mode_txt[MAX_TXT];
430  char *arg_v[MAX_ARGV];
431 #endif
432  d3_lattice d3_l;
433  info my_info;
434  unsigned char mode;
435  double c_ratio;
436
437  d3_l.max_x=X;
438  d3_l.max_y=Y;
439  d3_l.max_z=Z;
440  my_info.steps=STEPS;
441  my_info.range=RANGE;
442  refresh=REFRESH;
443  resave=RESAVE;
444  my_info.z_diff=0;
445  my_info.a_el=A_EL;
446  my_info.b_el=B_EL;
447  my_info.a_cd=A_CD;
448  my_info.b_cd=B_CD;
449  my_info.a_ap=A_AP;
450  my_info.b_ap=B_AP;
451  my_info.a_cp=A_CP;
452  my_info.cc=CC;
453  my_info.dr_ac=DR_AC;
454  my_info.dr_cc=DR_CC;
455  my_info.diff_rate=DIFF_RATE;
456  nowait=0;
457  quit=0;
458  escape=0;
459  switchmode=0;
460  strcpy(s_file,"");
461  strcpy(l_file,"");
462  strcpy(c_file,"");
463  strcpy(p_file,IMP_PROFILE);
464  convert=0;
465  strcpy(r_file,"");
466  mode=0;
467
468  for(i=1;i<argc;i++)
469  {
470   if(argv[i][0]=='-')
471   {
472    switch(argv[i][1])
473    {
474     case 'h':
475      usage();
476      return -1;
477     case 'n':
478      nowait=1;
479      break;
480     case 'a':
481      my_info.a_el=atof(argv[++i]);
482      break;
483     case 'b':
484      my_info.b_el=atof(argv[++i]);
485      break;
486     case 'x':
487      d3_l.max_x=atoi(argv[++i]);
488      break;
489     case 'y':
490      d3_l.max_y=atoi(argv[++i]);
491      break;
492     case 'z':
493      d3_l.max_z=atoi(argv[++i]);
494      break;
495     case 'Z':
496      my_info.z_diff=1;
497      break;
498     case 's':
499      my_info.steps=atoi(argv[++i]);
500      break;
501     case 'd':
502      refresh=atoi(argv[++i]);
503      break;
504     case 'r':
505      my_info.range=atoi(argv[++i]);
506      break;
507     case 'f':
508      my_info.a_ap=atof(argv[++i]);
509      break;
510     case 'p':
511      my_info.b_ap=atof(argv[++i]);
512      break;
513     case 'F':
514      my_info.a_cp=atof(argv[++i]);
515      break;
516     case 'A':
517      my_info.a_cd=atof(argv[++i]);
518      break;
519     case 'B':
520      my_info.b_cd=atof(argv[++i]);
521      break;
522     case 'W':
523      resave=atoi(argv[++i]);
524      break;
525     case 'C':
526      strcpy(l_file,argv[++i]);
527      if(i<argc-1) if(argv[i+1][0]!='-') strcpy(c_file,argv[++i]);
528      convert=1;
529      break;
530     case 'D':
531      my_info.dr_ac=atof(argv[++i]);
532      break;
533     case 'c':
534      my_info.dr_cc=atof(argv[++i]);
535      break;
536     case 'e':
537      my_info.diff_rate=atoi(argv[++i]);
538      break;
539     case 'L':
540      strcpy(l_file,argv[++i]);
541      break;
542     case 'S':
543      strcpy(s_file,argv[++i]);
544      break;
545     case 'R':
546      strcpy(r_file,argv[++i]);
547      break;
548     case 'P':
549      strcpy(p_file,argv[++i]);
550      break;
551     default:
552      usage();
553      return -1;
554    }
555   } else usage();
556  }
557
558  x=d3_l.max_x/2-1;
559  y=d3_l.max_y/2-1;
560  z=d3_l.max_z/2-1;
561
562 #ifdef NODFB
563  if(!strcmp(s_file,""))
564  {
565   puts("NODFB defined, run with -S option");
566   return -1;
567  }
568 #endif
569
570  if(!strcmp(r_file,"")) rand_init(NULL);
571  else rand_init(r_file);
572
573  if(!strcmp(l_file,""))
574  {
575   i=d3_l.max_x*d3_l.max_y*d3_l.max_z;
576 #ifdef USE_DFB_API
577   d3_lattice_init(&argc,argv,&d3_l);
578 #endif
579   if((d3_l.status=(unsigned char *)malloc(i*sizeof(unsigned char)))==NULL)
580   {
581    puts("failed allocating status buffer");
582    return -1;
583   }
584   memset(d3_l.status,0,i*sizeof(unsigned char));
585   if((d3_l.extra=(int *)malloc(i*sizeof(int)))==NULL)
586   {
587    puts("failed allocating concentration buffer");
588    return -1;
589   }
590   memset(d3_l.extra,0,i*sizeof(int));
591  } else
592  {
593   load_from_file(l_file,&d3_l,&my_info);
594   if(convert) 
595   {   
596    if(!strcmp(c_file,"")) sprintf(c_file,"%s_gnuplot",l_file);
597    printf("converting file %s to %s\n",l_file,c_file);
598    convert_file(c_file,&d3_l);
599    puts("done");
600    return 1;
601   } 
602 #ifdef USE_DFB_API
603     else d3_lattice_init(&argc,argv,&d3_l);
604 #endif
605  }
606
607 #ifdef USE_DFB_API
608  d3_event_init(&d3_l);
609 #endif
610
611 #ifdef USE_DFB_API
612  strcpy(a_txt,"args:");
613  sprintf(s_txt,"steps: %d",my_info.steps);
614  sprintf(r_txt,"pressure range: %d",my_info.range);
615  sprintf(ap_txt,"a_ap: %.2f  b_ap: %.3f",my_info.a_ap,my_info.b_ap);
616  sprintf(el_txt,"a_el: %.2f  b_el: %.3f",my_info.a_el,my_info.b_el);
617  sprintf(cd_txt,"a_cd: %.2f  b_cd: %.3f",my_info.a_cd,my_info.b_cd);
618  sprintf(cp_txt,"a_cp: %.4f",my_info.a_cp);
619  sprintf(dr_ac_txt,"a/c diffusion rate: %.4f",my_info.dr_ac);
620  sprintf(dr_cc_txt,"c/c diffusion rate: %.4f",my_info.dr_cc);
621  sprintf(zdiff_txt,"diffusion in z direction: %c",my_info.z_diff?'y':'n');
622  sprintf(diff_txt,"diffusion every %d steps",my_info.diff_rate);
623  strcpy(mode_txt,"view: a/c mode");
624  arg_v[1]=xyz_txt;
625  arg_v[2]=NULL;
626  arg_v[3]=status_txt;
627  arg_v[4]=conc_txt;
628  arg_v[5]=NULL;
629  arg_v[6]=mode_txt;
630  arg_v[7]=NULL;
631  arg_v[8]=steps_txt;
632  arg_v[9]=cc_txt;
633  arg_v[10]=NULL;
634  arg_v[11]=diff_txt;
635  arg_v[12]=zdiff_txt;
636  arg_v[13]=NULL;
637  arg_v[14]=a_txt;
638  arg_v[15]=NULL;
639  arg_v[16]=s_txt;
640  arg_v[17]=r_txt;
641  arg_v[18]=NULL;
642  arg_v[19]=ap_txt;
643  arg_v[20]=el_txt;
644  arg_v[21]=cd_txt;
645  arg_v[22]=cp_txt;
646  arg_v[23]=NULL;
647  arg_v[24]=dr_ac_txt;
648  arg_v[25]=dr_cc_txt;
649 #endif
650
651  if(!strcmp(l_file,""))
652  {
653   if(get_c_ratio(&c_ratio,p_file,&my_info,&d3_l)!=1)
654   {
655    puts("failed calculating ratio");
656    return -1;
657   }
658   i=0;
659   while((i<my_info.steps) && (quit==0) && (escape==0))
660   {
661    x_c=get_rand(d3_l.max_x);
662    y_c=get_rand(d3_l.max_y);
663    z_c=get_rand_lgp(d3_l.max_z,my_info.a_el,my_info.b_el);
664    distrib_c(&d3_l,&my_info,i,c_ratio);
665    process_cell(&d3_l,x_c,y_c,z_c,&my_info);
666 #ifdef USE_DFB_API
667    if(i%refresh==0)
668    {
669     sprintf(xyz_txt,"x: %d  y: %d  z: %d",x+1,y+1,z+1);
670     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');
671     sprintf(conc_txt,"conc: %d",*(d3_l.extra+x+y*d3_l.max_x+z*d3_l.max_x*d3_l.max_y));
672     sprintf(steps_txt,"step: %d",i);
673     sprintf(cc_txt,"total c: %d",my_info.cc);
674     d3_lattice_draw(&d3_l,x,y,z,24,arg_v,mode);
675    }
676 #endif
677    if(i%resave==0 && strcmp(s_file,"") && resave!=0 && i!=0)
678    {
679     sprintf(s_file_tmp,"%s_%d_of_%d",s_file,i,my_info.steps);
680     save_to_file(s_file_tmp,&d3_l,&my_info);
681 #ifdef NODFB
682     printf("saved %s\n",s_file_tmp);
683 #endif
684    }
685    i++;
686   }
687  }
688
689  if(strcmp(s_file,""))
690  {
691    printf("saved %s\n",s_file);
692    save_to_file(s_file,&d3_l,&my_info);
693  }
694
695 #ifdef USE_DFB_API
696  /* allocating buffer for pressure values */
697  if((d3_l.v_ptr=malloc(d3_l.max_x*d3_l.max_y*d3_l.max_z*sizeof(unsigned char)))==NULL)
698  {
699   puts("cannot allocate buffer for pressure values");
700   return -1;
701  }
702  /* calc values */
703  calc_pressure(&d3_l,my_info.range);
704
705  while((quit==0) && (escape==0) && (nowait==0))
706  {
707   /* bahh! */
708   if(switchmode==0) mode=0;
709   if(switchmode==1) mode=1;
710   if(switchmode==2) mode=2;
711   /* end of bahh! */
712   sprintf(xyz_txt,"x: %d  y: %d  z: %d",x+1,y+1,z+1);
713   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');
714   sprintf(conc_txt,"conc: %d",*(d3_l.extra+x+y*d3_l.max_x+z*d3_l.max_x*d3_l.max_y));
715   strcpy(steps_txt,"step: end!");
716   sprintf(cc_txt,"total c: %d",my_info.cc);
717   if(switchmode==0) strcpy(mode_txt,"view: a/c mode");
718   if(switchmode==1) strcpy(mode_txt,"view: c conc mode");
719   if(switchmode==2) strcpy(mode_txt,"view: a pressure mode");
720   d3_lattice_draw(&d3_l,x,y,z,24,arg_v,mode);
721   scan_event(&d3_l,&x,&y,&z,&quit,&escape,&switchmode);
722  }
723
724  d3_lattice_release(&d3_l);
725 #endif
726
727  return 1;
728 }