22 #include <sys/types.h> 26 #define TACHYON_INTERNAL 1 33 #if defined(__PARAGON__) || defined(__IPSC__) 38 #if defined(__PARAGON__) 46 #if !defined(__IPSC__) && !defined(__PARAGON__) && !defined(NEXT) 56 #if defined(_MSC_VER) || defined(WIN32) 59 #define WIN32GETTICKCOUNT 65 #if defined(__linux) || defined(Bsd) || defined(AIX) || defined(__APPLE__) || defined(__sun) || defined(__hpux) || defined(_CRAYT3E) || defined(_CRAY) || defined(_CRAYC) || defined(__osf__) || defined(__BEOS__) 69 #if defined(MCOS) || defined(VXWORKS) 74 #if defined(WIN32GETTICKCOUNT) 82 t->starttime = GetTickCount();
94 ttime = ((double) (t->
endtime - t->starttime)) / 1000.0;
101 #if defined(POSIXTIME) 106 struct timespec starttime;
107 struct timespec endtime;
112 clock_gettime(CLOCK_REALTIME, &t->starttime);
117 clock_gettime(CLOCK_REALTIME, &t->
endtime);
123 ttime = ((double) (t->
endtime.tv_sec - t->starttime.tv_sec)) +
124 ((
double) (t->
endtime.tv_nsec - t->starttime.tv_nsec)) / 1000000000.0;
132 #if defined(__IPSC__) || defined(__PARAGON__) 141 t->starttime=mclock();
146 t->stoptime=mclock();
152 ttime = ((double) t->stoptime - t->starttime) / 1000.0;
162 struct timeval starttime, endtime;
163 #if !defined(VMS) && (__STDC_VERSION__ < 201112L) 170 #if defined(VMS) || (__STDC_VERSION__ >= 201112L) 171 gettimeofday(&t->starttime, NULL);
173 gettimeofday(&t->starttime, &t->
tz);
179 #if defined(VMS) || (__STDC_VERSION__ >= 201112L) 180 gettimeofday(&t->
endtime, NULL);
189 ttime = ((double) (t->
endtime.tv_sec - t->starttime.tv_sec)) +
190 ((
double) (t->
endtime.tv_usec - t->starttime.tv_usec)) / 1000000.0;
217 ttime = difftime(t->stoptime, t->starttime);
248 #if defined(__IPSC__) && !defined(__PARAGON__) 251 char * strstr(
const char *s,
const char *find) {
255 if ((c = *find++) != 0) {
259 if ((sc = *s++) == 0)
262 }
while (strncmp(s, find, len) != 0);
272 return (!((c) & ~0177));
325 #if defined(_CRAYT3E) 327 *idum = ((1099087573 * (*idum))) & ((
unsigned int) 0xffffffff);
330 *idum = (1099087573 * (*idum));
345 unsigned int rt_rand(
unsigned int * idum) {
346 #if defined(_CRAYT3E) 348 *idum = ((1664525 * (*idum)) + 1013904223) & ((
unsigned int) 0xffffffff);
351 *idum = ((1664525 * (*idum)) + 1013904223);
365 #if defined(RT_RNG_USE_QUICK_AND_DIRTY) 368 #if defined(_CRAYT3E) 370 rngh->randval = ((1099087573 * (rngh->randval))) & ((
unsigned int) 0xffffffff);
373 rngh->randval = (1099087573 * rngh->randval);
375 return rngh->randval;
386 #elif defined(RT_RNG_USE_MERSENNE_TWISTER) 395 #define MATRIX_A 0x9908b0dfUL 396 #define UPPER_MASK 0x80000000UL 397 #define LOWER_MASK 0x7fffffffUL 401 rngh->mag01[0]=0x0UL;
402 rngh->mag01[1]=MATRIX_A;
407 unsigned int * mt = rngh->mt;
410 mt[0]= s & 0xffffffffUL;
411 for (mti=1; mti<N; mti++) {
412 mt[mti] = (1812433253UL * (mt[mti-1] ^ (mt[mti-1] >> 30)) + mti);
424 unsigned int * mt = rngh->mt;
425 unsigned int * mag01 = rngh->mag01;
434 for (kk=0;kk<N-M;kk++) {
435 y = (mt[kk]&UPPER_MASK)|(mt[kk+1]&LOWER_MASK);
436 mt[kk] = mt[kk+M] ^ (y >> 1) ^ mag01[y & 0x1UL];
439 y = (mt[kk]&UPPER_MASK)|(mt[kk+1]&LOWER_MASK);
440 mt[kk] = mt[kk+(M-N)] ^ (y >> 1) ^ mag01[y & 0x1UL];
442 y = (mt[N-1]&UPPER_MASK)|(mt[0]&LOWER_MASK);
443 mt[N-1] = mt[M-1] ^ (y >> 1) ^ mag01[y & 0x1UL];
452 y ^= (y << 7) & 0x9d2c5680UL;
453 y ^= (y << 15) & 0xefc60000UL;
461 #elif defined(RT_RNG_USE_KISS93) 502 rngh->
x = rngh->
x * 69069 + 1;
503 rngh->
y ^= rngh->
y << 13;
504 rngh->
y ^= rngh->
y >> 17;
505 rngh->
y ^= rngh->
y << 5;
506 rngh->
k = (rngh->
z >> 2) + (rngh->
w >> 3) + (rngh->
c >> 2);
507 rngh->
m = rngh->
w + rngh->
w + rngh->
z + rngh->
c;
510 rngh->
c = rngh->
k >> 30;
511 return rngh->
x + rngh->
y + rngh->
w;
539 unsigned long long t, a=698769069LL;
540 rngh->
x = 69069 * rngh->
x + 12345;
541 rngh->
y ^= (rngh->
y<<13);
542 rngh->
y ^= (rngh->
y>>17);
543 rngh->
y ^= (rngh->
y<<5);
546 return rngh->
x+rngh->
y+(rngh->
z=t);
584 unsigned int seedbuf[11] = {
598 return seedbuf[tid % 11] + node * 31337;
614 unsigned int tea2(
unsigned int v0,
unsigned int v1) {
617 for (n=0; n<2; n++) {
619 v0 += ((v1<<4)+0xa341316c)^(v1+s0)^((v1>>5)+0xc8013ea4);
620 v1 += ((v0<<4)+0xad90777d)^(v0+s0)^((v0>>5)+0x7e95761e);
626 unsigned int tea4(
unsigned int v0,
unsigned int v1) {
629 for (n=0; n<4; n++) {
631 v0 += ((v1<<4)+0xa341316c)^(v1+s0)^((v1>>5)+0xc8013ea4);
632 v1 += ((v0<<4)+0xad90777d)^(v0+s0)^((v0>>5)+0x7e95761e);
650 for (i=0; i<20; i++) {
651 x = x - (pow(x, dim+1) - x - 1) / ((dim+1)*pow(x, dim)-1);
659 const double g = 1.61803398874989484820458683436563;
660 const double a1 = 1.0 / g;
661 const double seed = 0.5;
663 ngold = (seed + (a1 * n));
664 return ngold - trunc(ngold);
669 const double g = 1.61803398874989484820458683436563;
670 const double a1 = 1.0 / g;
671 float ngold = (*x) + a1;
672 *x = ngold - trunc(ngold);
678 const double g = 1.32471795724474602596;
679 const double a1 = 1.0 / g;
680 const double a2 = 1.0 / (g*g);
681 const double seed = 0.5;
684 ngold = (seed + (a1 * n));
685 *x = (float) (ngold - trunc(ngold));
687 ngold = (seed + (a2 * n));
688 *y = (float) (ngold - trunc(ngold));
693 const float g = 1.32471795724474602596;
694 const float a1 = 1.0 / g;
695 const float a2 = 1.0 / (g*g);
699 *x = (ngold - trunc(ngold));
702 *y = (ngold - trunc(ngold));
708 const double g = 1.22074408460575947536;
709 const double a1 = 1.0 / g;
710 const double a2 = 1.0 / (g*g);
711 const double a3 = 1.0 / (g*g*g);
712 const double seed = 0.5;
715 ngold = (seed + (a1 * n));
716 *x = (float) (ngold - trunc(ngold));
718 ngold = (seed + (a2 * n));
719 *y = (float) (ngold - trunc(ngold));
721 ngold = (seed + (a3 * n));
722 *z = (float) (ngold - trunc(ngold));
727 const float g = 1.22074408460575947536;
728 const float a1 = 1.0 / g;
729 const float a2 = 1.0 / (g*g);
730 const float a3 = 1.0 / (g*g*g);
734 *x = (ngold - trunc(ngold));
737 *y = (ngold - trunc(ngold));
740 *z = (ngold - trunc(ngold));
760 float r, phi, dx, dy;
771 }
while ((dx*dx + dy*dy) > 0.250f);
787 float z = 2.0f * u1 - 1.0f;
788 #if defined(_MSC_VER) 789 float R = (float) sqrt(1.0f - z*z);
791 float R = sqrtf(1.0f - z*z);
795 float phi = TWOPI * u2;
796 #if defined(_MSC_VER) 797 dir[0] = (float) R * cos(phi);
798 dir[1] = (float) R * sin(phi);
800 dir[0] = R * cosf(phi);
801 dir[1] = R * sinf(phi);
811 float dx, dy, dz, len, invlen;
816 len = dx*dx + dy*dy + dz*dz;
817 }
while (len > 0.250f);
818 invlen = 1.0f / sqrt(len);
821 dir[0] = dx * invlen;
822 dir[1] = dy * invlen;
823 dir[2] = dz * invlen;
unsigned int rng_seed_from_tid_nodeid(int tid, int node)
double rt_timer_time(rt_timerhandle v)
unsigned int rt_rand(unsigned int *idum)
void goldenratioseq2d_incr(float *x, float *y)
void rt_timer_destroy(rt_timerhandle v)
void rt_timer_start(rt_timerhandle v)
unsigned int tea2(unsigned int v0, unsigned int v1)
void rng_frand_seed(rng_frand_handle *rngh, unsigned int seed)
void jitter_offset2f(unsigned int *pval, float *xy)
void jitter_sphere3f(rng_frand_handle *rngh, float *dir)
void rt_finalize(void)
Shut down Tachyon library for good, at final use before program termination.
void rt_timer_stop(rt_timerhandle v)
void goldenratioseq1d_incr(float *x)
void rng_urand_seed(rng_urand_handle *rngh, unsigned int seed)
struct timeval starttime endtime
double rt_timer_timenow(rt_timerhandle v)
void rng_urand_init(rng_urand_handle *rngh)
void goldenratioseq2d(int n, float *x, float *y)
float goldenratioseq1d(int n)
unsigned int rng_urand(rng_urand_handle *rngh)
Tachyon cross-platform timers, special math function wrappers, and RNGs.
void goldenratioseq3d(int n, float *x, float *y, float *z)
float rng_frand(rng_frand_handle *rngh)
void goldenratioseq3d_incr(float *x, float *y, float *z)
void jitter_disc2f(unsigned int *pval, float *dir)
void rng_drand_init(rng_drand_handle *rngh)
double compute_goldenratio_phi(int dim)
double rng_drand(rng_frand_handle *rngh)
unsigned int tea4(unsigned int v0, unsigned int v1)
rt_timerhandle rt_timer_create(void)
Tachyon public API function prototypes and declarations used to drive the ray tracing engine...
void rng_drand_seed(rng_frand_handle *rngh, unsigned int seed)
void rng_frand_init(rng_frand_handle *rngh)