base random stuff fixed
[physik/morpheus.git] / main.c
1 /*
2  * morpheus - main.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 #include <stdio.h>
15 #include <stdlib.h>
16 #include <sys/types.h>
17 #include <sys/stat.h>
18 #include <fcntl.h>
19
20 #include "defines.h"
21
22 /* global variables */
23 u32 sum_z_segments;
24 int random_fd; /* /dev/urandom file descriptor */
25
26 int usage()
27 {
28  puts("usage:");
29  puts("-h: help");
30  puts("-a <value> \t slope of nuclear energy loss (default 1)");
31  puts("-c <value> \t nuclear enery loss at depths 0 (default 0)");
32  puts("-x <value> \t # x segments (default 50)");
33  puts("-y <value> \t # y segments (default 50)");
34  puts("-z <value> \t # z segments (default 100)");
35  puts("-s <value> \t # steps to calculate (default 5000");
36  return -23;
37 }
38
39 int make_amorph(u32 *segment)
40 {
41  *segment=*segment|AMORPH
42  return 23;
43 }
44
45 /* look at segment ... */
46 int process_segment(u32 *segment)
47 {
48  /* tag it ... testing! */
49  make_amorph(segment);
50  
51  return 23;
52 }
53
54 int main(int argc,char **argv) 
55 {
56  u32 x_seg,y_seg,z_seg; /* amount of segments */
57  u32 x,y,z; /* segments */
58  int i; /* for counting */
59  int slope_nel,start_nel; /* nuclear energy loss: slope, constant */
60  int steps; /* # steps */
61  void *segments_p;
62
63  /* default values */
64  x_seg=DEFAULT_X_SEG;
65  y_seg=DEFAULT_Y_SEG;
66  z_seg=DEFAULT_Z_SEG;
67  slope_nel=DEFAULT_SLOPE_NEL;
68  start_nel=DEFAULT_START_NEL;
69  steps=DEFAULT_STEPS;
70  
71  /* parse command args */
72  for(i=1;i<argc;i++)
73  {
74   if(argv[i][0]=='-')
75   {
76    switch(argv[i][1])
77    {
78     case 'h':
79      usage();
80      return 23;
81      break;
82     case 'a':
83      slope_nel=atoi(argv[++i]);
84      break;
85     case 'c':
86      start_nel=atoi(argv[++i]);
87      break;
88     case 'x':
89      x_seg=atoi(argv[++i]);
90      break;
91     case 'y':
92      y_seg=atoi(argv[++i]);
93      break;
94     case 'z':
95      z_seg=atoi(argv[++i]);
96      break;
97    case 's':
98      steps=atoi(argv[++i]);
99      break;
100     default:
101      usage();
102      return -23;
103    }
104   } else usage();
105  }
106
107  /* open random fd */
108  if((random_fd=open("/dev/urandom",O_RDONLY))<0)
109  {
110   puts("cannot open /dev/urandom\n");
111   return -23;
112  }
113
114  /* calculate sum_z_segments one time! */
115  sum_z_segments=0;
116  for(i=1;i<=z_seg;i++) sum_z_segments+=(start_nel+i*slope_nel);
117  printfd("debug: sum z segments -> %d\n",sum_z_segments);
118
119
120  /* testing ... */
121
122  /* allocate segments */
123  if((segments_p=malloc(x_seg*y_seg*z_seg*sizeof(u32)))==NULL)
124  {
125   puts("failed allocating memory for segments\n");
126   return -23;
127  }
128  memset(segments_p,0,x_seg*y_seg*z_seg*sizeof(u32));
129
130  /* main routine */
131  for(i=0;i<steps;i++)
132  {
133   x=rand_get(x_seg);
134   y=rand_get(y_seg);
135   z=rand_get_lgp(slope_nel,start_nel);
136
137   /* todo */
138   distrib_c_conc(segments_p);
139   process_segment((u32)(segments_p+x+y*(x_seg-1)+z*(x_seg-1)*(y_seg-1)));
140   display(segments_p);
141   /* */
142
143  }
144  return 23;
145 }