source: trunk/source/geometry/solids/test/fred/process.c @ 1350

Last change on this file since 1350 was 1350, checked in by garnier, 13 years ago

update to last version 4.9.4

File size: 6.1 KB
Line 
1/*
2  MEDERNACH Emmanuel
3  Aug  8, 2000
4 */
5
6 #include <stdio.h>
7 #include <unistd.h>
8 #include <sys/types.h>
9 #include <sys/wait.h>
10 #include <math.h>
11
12double sqrt(double d);
13
14 /*
15 TODO:
16 Add support for 'error management'
17  */
18
19 pid_t wait(int *status) ;
20
21 void read_choice(int *choice)
22 {
23
24   if (choice == NULL) return ;
25   (*choice) = -1;
26
27   printf("Possible volumes are :\n");
28   printf("1: BOX\n");
29   printf("2: TUBS\n");
30   printf("3: CONE\n");
31   printf("4: PCON\n");
32   printf("5: PGON\n");
33   printf("6: PGON2\n");
34   printf("7: CONE2 (Emm)\n");
35   //printf("8: THINBOX (Emm)\n");
36   printf("8: TORUS2 (Emm)\n");
37   while (((*choice) < 1) || ((*choice) > 8))
38     {
39       scanf("%d",choice);
40     }
41 }
42
43 void write_ini(const char *init,int choice,double x,double y,double z,double dx,double dy,double dz)
44 {
45   FILE *fi= NULL;
46   double Norm = sqrt((dx*dx) + (dy*dy) + (dz*dz)) ;
47
48   //printf("Norm = %f\n",Norm);
49
50   fi = fopen(init,"w");
51   if (fi == NULL)
52     {
53       perror("Some problems towrite in the Init.fred file");
54       exit (1);
55     }
56
57   switch (choice)
58     {
59     case 1:
60       fprintf(fi,"/fred/volume BOX\n");
61       break;
62     case 2:
63       fprintf(fi,"/fred/volume TUBS\n");
64       break;
65     case 3:
66       fprintf(fi,"/fred/volume CONE\n");
67       break;
68     case 4:
69       fprintf(fi,"/fred/volume PCON\n");
70       break;
71     case 5:
72       fprintf(fi,"/fred/volume PGON\n");
73       break;
74     case 6:
75       fprintf(fi,"/fred/volume PGON2\n");
76       break;
77     case 7:
78       fprintf(fi,"/fred/volume CONE2\n");
79       break;
80     case 8:
81       fprintf(fi,"/fred/volume TORUS2\n");
82       break;
83     default:
84       fprintf(stderr,"%d is not between 1 and 8\n",choice);
85       exit(2);
86       break;
87     }
88   fprintf(fi,"/fred/gun G4\n");
89   fprintf(fi,"/gun/position %f %f %f\n",x,y,z);
90   fprintf(fi,"/gun/direction %f %f %f\n",dx/Norm,dy/Norm,dz/Norm);
91   fprintf(fi,"/run/initialize \n");
92   fprintf(fi,"/run/beamOn\n");
93   fclose(fi);
94 }
95
96 int main (void)
97 {
98   pid_t son = -1;
99   int status = 0;
100   char init[]="Init.fred";
101   char *param [3];
102
103   int choice = -1 ;
104   double posx,posy,posz;
105   double dirx,diry,dirz;
106
107   double startx,starty,startz;
108   double beginx,beginy,beginz;
109   double endx,endy,endz;
110   double deltax,deltay,deltaz;
111   double begindirx,enddirx,stepdirx;
112   double begindiry,enddiry,stepdiry;
113   double begindirz,enddirz,stepdirz;
114
115   int TakeOtherPoint = 0;
116
117
118   /* write an init file */
119
120   read_choice(&choice);
121
122
123   posx = posy = posz = 0;
124   dirx = diry = dirz = 1;
125
126
127   printf("You could choose a delta <= 0 to have only a plane\n");
128   /* rotation in a cone for example could be performed */
129   /* to have only a y=0 plane to search */ 
130   printf("Choose a beginning, an end and a step for x (0 200 10)\n");
131   scanf("%lf %lf %lf",&beginx,&endx,&deltax);
132   printf("Choose a beginning, an end and a step for y (0 200 10)\n");
133   scanf("%lf %lf %lf",&beginy,&endy,&deltay);
134   printf("Choose a beginning, an end and a step for z (0 200 10)\n");
135   scanf("%lf %lf %lf",&beginz,&endz,&deltaz);
136
137   /* you could want to continue after a previous crash
138      (X could hangs if swap is full)
139   */
140
141   printf("you could want to continue after a previous crash\n");
142   printf("In this case just indicate from where do you want to start (x y z)\n\n");
143   scanf("%lf %lf %lf",&startx,&starty,&startz);
144
145   printf("you could now have a grid of direction to point\n");
146   printf("Choose a beginning, an end and a step for all direction (-30 30 1)\n");
147   printf("\nfor direction x : ");
148   scanf("%lf %lf %lf",&begindirx,&enddirx,&stepdirx);
149   printf("\nfor direction y : ");
150   scanf("%lf %lf %lf",&begindiry,&enddiry,&stepdiry);
151   printf("\nfor direction z : ");
152   scanf("%lf %lf %lf",&begindirz,&enddirz,&stepdirz);
153
154   /* we want also != step for each direction */
155
156   posx = startx ;
157   posy = starty ;
158   posz = startz ;
159
160
161   printf("We start at %f %f %f\n",posx,posy,posz);
162
163   while (posx < endx)
164     { /* loop on x */
165
166       printf("Posx = %f\n",posx);
167       while (posy < endy)
168         { /* loop on y */
169
170           printf("Posy = %f\n",posy);
171           while (posz < endz)
172             { /* loop on z */
173
174               printf("\tPosz = %f\n",posz);
175               TakeOtherPoint = 0;
176               for (dirx=begindirx;(dirx<enddirx) && (TakeOtherPoint == 0);dirx+=stepdirx)
177                 for (diry=begindiry;(diry<enddiry) && (TakeOtherPoint == 0);diry+=stepdiry)
178                   for (dirz=begindirz;(dirz<enddirz) && (TakeOtherPoint == 0);dirz+=stepdirz)
179                     {
180                       write_ini(init,choice,posx,posy,posz,dirx,diry,dirz);
181
182                       /* call to Fred */
183                       son = fork();
184                       switch(son)
185                         {
186                         case -1:
187                           perror("Fork process error");
188                           exit(1);
189                           break;
190                         case 0:
191                           /* execvp (Emm)fred with init file */
192                           param[0] = "fred";
193                           param[1] = init;
194                           param[2] = NULL;
195
196                           /* no output nor input */
197                           close (0);
198                           close (1);
199                           close (2);
200
201                           if  (execvp("fred",param) == -1)
202                             {
203                               fprintf(stderr,"fred program not found ..\n");
204                               exit(1);
205                             }
206                           break;
207                         default:
208                           /* wait for the other process */
209                           waitpid(son,&status,0);
210                           if (WIFEXITED(status) == 0)
211                             {
212                               /* some errors */
213                               /* keep the current init */
214                                   double Norm = sqrt(dirx*dirx+diry*diry+dirz*dirz);
215
216                               fprintf(stderr,"I catch an error : bad return value %f %f %f %f %f %f\n",posx,posy,posz,(dirx/Norm),(diry/Norm),(dirz/Norm));
217                               /* we take another point */
218                               /* Ok this is not really the way to do ..*/
219                               TakeOtherPoint = 1;
220                             }
221                           else
222                             if (WIFSIGNALED(status))
223                               {
224                                 /* some errors */
225                                 /* keep the current init */
226                                   double Norm = sqrt(dirx*dirx+diry*diry+dirz*dirz);
227                                 fprintf(stderr,"I catch an error : Signal terminated %f %f %f %f %f %f\n",posx,posy,posz,(dirx/Norm),(diry/Norm),(dirz/Norm));
228                                 /* we take another point */
229                                 /* Ok this is not really the way to do ..*/
230                                 TakeOtherPoint = 1;
231                               }
232                           break;
233                         }
234                     }
235               /* loop on z */
236               posz += deltaz ;
237             }
238           posz = beginz ;
239
240           /* loop on y */
241           posy += deltay ;
242         }
243       posy = beginy ;
244
245       /* loop on x */
246       posx += deltax ;
247     }
248   posx = beginx ;
249
250   return 0;
251   
252 }
253
Note: See TracBrowser for help on using the repository browser.