| 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': |
| 353 |
|
addmodfile(argv[i], curout, binval, bincnt); |
| 354 |
|
continue; |
| 355 |
|
case 'P': /* persist file */ |
| 356 |
< |
error(USER, "persist file is automatic"); |
| 357 |
< |
break; |
| 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; |
| 354 |
– |
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 */ |