101 |
|
/* rtrace command and defaults */ |
102 |
|
char *rtargv[256+2*MAXMODLIST] = { "rtrace", |
103 |
|
"-dj", ".5", "-dr", "3", |
104 |
< |
"-ab", "1", "-ad", "128", }; |
104 |
> |
"-ab", "1", "-ad", "350", }; |
105 |
> |
|
106 |
|
int rtargc = 9; |
107 |
|
/* overriding rtrace options */ |
108 |
< |
char *myrtopts[] = { "-o~~TmWdp", "-h-", "-x", "1", "-y", "0", |
108 |
> |
char *myrtopts[] = { "-h-", "-x", "1", "-y", "0", |
109 |
|
"-dt", "0", "-as", "0", "-aa", "0", NULL }; |
110 |
|
|
111 |
+ |
#define RTCOEFF "-o~~TmWdp" /* compute coefficients only */ |
112 |
+ |
#define RTCONTRIB "-o~~TmVdp" /* compute ray contributions */ |
113 |
+ |
|
114 |
|
struct rtproc rt0; /* head of rtrace process list */ |
115 |
|
|
116 |
|
struct rtproc *rt_unproc = NULL; /* unprocessed ray trees */ |
117 |
|
|
118 |
< |
char persistfn[] = "pfXXXXXX"; /* persist file name */ |
118 |
> |
#define PERSIST_NONE 0 /* no persist file */ |
119 |
> |
#define PERSIST_SINGLE 1 /* user set -P persist */ |
120 |
> |
#define PERSIST_PARALL 2 /* user set -PP persist */ |
121 |
> |
#define PERSIST_OURS 3 /* -PP persist belongs to us */ |
122 |
> |
int persist_state = PERSIST_NONE; /* persist file state */ |
123 |
> |
char persistfn[] = "pfXXXXXX"; /* our persist file name, if set */ |
124 |
|
|
125 |
|
int gargc; /* global argc */ |
126 |
|
char **gargv; /* global argv */ |
217 |
|
int |
218 |
|
main(int argc, char *argv[]) |
219 |
|
{ |
220 |
+ |
int contrib = 0; |
221 |
|
int nprocs = 1; |
222 |
|
int recover = 0; |
223 |
|
char *curout = NULL; |
228 |
|
/* need at least one argument */ |
229 |
|
if (argc < 2) { |
230 |
|
fprintf(stderr, |
231 |
< |
"Usage: %s [-n nprocs][-r][-e expr][-f source][-o ospec][-b binv] {-m mod | -M file} [rtrace options] octree\n", |
231 |
> |
"Usage: %s [-n nprocs][-V][-r][-e expr][-f source][-o ospec][-b binv] {-m mod | -M file} [rtrace options] octree\n", |
232 |
|
argv[0]); |
233 |
|
exit(1); |
234 |
|
} |
250 |
|
} |
251 |
|
if (argv[i][0] == '-') |
252 |
|
switch (argv[i][1]) { |
243 |
– |
case 'r': /* recover output */ |
244 |
– |
if (argv[i][2]) break; |
245 |
– |
recover++; |
246 |
– |
continue; |
253 |
|
case 'n': /* number of processes */ |
254 |
|
if (argv[i][2] || i >= argc-2) break; |
255 |
|
nprocs = atoi(argv[++i]); |
256 |
|
if (nprocs <= 0) |
257 |
|
error(USER, "illegal number of processes"); |
258 |
|
continue; |
259 |
+ |
case 'V': /* output contributions */ |
260 |
+ |
switch (argv[i][2]) { |
261 |
+ |
case '\0': |
262 |
+ |
contrib = !contrib; |
263 |
+ |
continue; |
264 |
+ |
case '+': case '1': |
265 |
+ |
case 'T': case 't': |
266 |
+ |
case 'Y': case 'y': |
267 |
+ |
contrib = 1; |
268 |
+ |
continue; |
269 |
+ |
case '-': case '0': |
270 |
+ |
case 'F': case 'f': |
271 |
+ |
case 'N': case 'n': |
272 |
+ |
contrib = 0; |
273 |
+ |
continue; |
274 |
+ |
} |
275 |
+ |
break; |
276 |
+ |
case 'r': /* recover output */ |
277 |
+ |
if (argv[i][2]) break; |
278 |
+ |
recover++; |
279 |
+ |
continue; |
280 |
|
case 'h': /* output header? */ |
281 |
|
switch (argv[i][2]) { |
282 |
|
case '\0': |
352 |
|
rtargv[rtargc++] = argv[++i]; |
353 |
|
addmodfile(argv[i], curout, binval, bincnt); |
354 |
|
continue; |
355 |
+ |
case 'P': /* persist file */ |
356 |
+ |
if (i >= argc-2) break; |
357 |
+ |
persist_state = (argv[i][2] == 'P') ? |
358 |
+ |
PERSIST_PARALL : PERSIST_SINGLE; |
359 |
+ |
rtargv[rtargc++] = argv[i]; |
360 |
+ |
rtargv[rtargc++] = argv[++i]; |
361 |
+ |
continue; |
362 |
|
} |
363 |
|
rtargv[rtargc++] = argv[i]; /* assume rtrace option */ |
364 |
|
} |
367 |
|
/* add "mandatory" rtrace settings */ |
368 |
|
for (j = 0; myrtopts[j] != NULL; j++) |
369 |
|
rtargv[rtargc++] = myrtopts[j]; |
370 |
+ |
rtargv[rtargc++] = contrib ? RTCONTRIB : RTCOEFF; |
371 |
|
/* just asking for defaults? */ |
372 |
|
if (!strcmp(argv[i], "-defaults")) { |
373 |
|
char sxres[16], syres[16]; |
374 |
|
char *rtpath; |
375 |
|
printf("-n %-2d\t\t\t\t# number of processes\n", nprocs); |
376 |
+ |
printf("-V%c\t\t\t\t# output %s\n", contrib ? '+' : '-', |
377 |
+ |
contrib ? "contributions" : "coefficients"); |
378 |
|
fflush(stdout); /* report OUR options */ |
379 |
|
rtargv[rtargc++] = header ? "-h+" : "-h-"; |
380 |
|
sprintf(fmt, "-f%c%c", inpfmt, outfmt); |
385 |
|
rtargv[rtargc++] = "-y"; |
386 |
|
sprintf(syres, "%d", yres); |
387 |
|
rtargv[rtargc++] = syres; |
351 |
– |
rtargv[rtargc++] = "-oTW"; |
388 |
|
rtargv[rtargc++] = "-defaults"; |
389 |
|
rtargv[rtargc] = NULL; |
390 |
|
rtpath = getpath(rtargv[0], getenv("PATH"), X_OK); |
398 |
|
exit(1); |
399 |
|
} |
400 |
|
if (nprocs > 1) { /* add persist file if parallel */ |
401 |
< |
rtargv[rtargc++] = "-PP"; |
402 |
< |
rtargv[rtargc++] = mktemp(persistfn); |
401 |
> |
if (persist_state == PERSIST_SINGLE) |
402 |
> |
error(USER, "use -PP option for multiple processes"); |
403 |
> |
if (persist_state == PERSIST_NONE) { |
404 |
> |
rtargv[rtargc++] = "-PP"; |
405 |
> |
rtargv[rtargc++] = mktemp(persistfn); |
406 |
> |
persist_state = PERSIST_OURS; |
407 |
> |
} |
408 |
|
} |
409 |
|
/* add format string */ |
410 |
|
sprintf(fmt, "-f%cf", inpfmt); |
464 |
|
{ |
465 |
|
int rtstat; |
466 |
|
|
467 |
< |
if (rt0.next != NULL) /* terminate persistent rtrace */ |
467 |
> |
if (persist_state == PERSIST_OURS) /* terminate persistent rtrace */ |
468 |
|
killpersist(); |
469 |
|
/* clean up rtrace process(es) */ |
470 |
|
rtstat = done_rprocs(&rt0); |
581 |
|
mp = growmodifier(mp, bincnt); |
582 |
|
lep->data = (char *)mp; |
583 |
|
/* allocate output streams */ |
584 |
< |
for (i = outf==NULL || outf[0]=='!' ? 0 : bincnt; i--; ) |
584 |
> |
for (i = outf==NULL || outf[0]=='!' ? 0 : bincnt; i-- > 0; ) |
585 |
|
getostream(mp->outspec, mp->modname, i, 1); |
586 |
|
return mp; |
587 |
|
} |
999 |
|
if (!n || !(isalpha(*cp) | (*cp == '_'))) |
1000 |
|
error(USER, "bad modifier name from rtrace"); |
1001 |
|
/* get modifier name */ |
1002 |
< |
while (n > 0 && *cp != '\t') { |
1002 |
> |
while (n > 1 && *cp != '\t') { |
1003 |
> |
if (mnp - modname >= sizeof(modname)-2) |
1004 |
> |
error(INTERNAL, "modifier name too long"); |
1005 |
|
*mnp++ = *cp++; n--; |
1006 |
|
} |
1007 |
|
*mnp = '\0'; |
1146 |
|
sprintf(errmsg, "seek error on file '%s'", e->key); |
1147 |
|
error(SYSTEM, errmsg); |
1148 |
|
} |
1149 |
+ |
return 0; |
1150 |
|
} |
1151 |
|
|
1152 |
|
/* recover output if possible */ |