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)