ViewVC Help
View File | Revision Log | Show Annotations | Download File | Root Listing
root/radiance/ray/src/rt/pmaprand.h
Revision: 2.9
Committed: Tue Sep 17 16:36:05 2024 UTC (7 months, 2 weeks ago) by greg
Content type: text/plain
Branch: MAIN
CVS Tags: HEAD
Changes since 2.8: +10 -2 lines
Log Message:
chore: Added extern "C" to headers to avoid C++ name mangling

File Contents

# User Rev Content
1 greg 2.9 /* RCSid $Id: pmaprand.h,v 2.8 2017/08/14 21:12:10 rschregle Exp $ */
2 greg 2.1
3     /*
4 rschregle 2.8 ======================================================================
5 greg 2.1 Random number generators for photon distribution
6    
7     Roland Schregle (roland.schregle@{hslu.ch, gmail.com})
8     (c) Fraunhofer Institute for Solar Energy Systems,
9 rschregle 2.3 (c) Lucerne University of Applied Sciences and Arts,
10 rschregle 2.8 supported by the Swiss National Science Foundation (SNSF, #147053)
11     ======================================================================
12 greg 2.1
13 greg 2.9 $Id: pmaprand.h,v 2.8 2017/08/14 21:12:10 rschregle Exp $
14 greg 2.1 */
15    
16    
17    
18 rschregle 2.7 #ifndef PMAPRAND_H
19     #define PMAPRAND_H
20    
21 rschregle 2.8 /* According to the analytical validation, skipping sequential samples
22     * when sharing a single RNG among multiple sampling domains introduces
23     * overlapping photon rays (reported as 'duplicate keys' when building
24     * the underlying data structure) and therefore bias. This is aggravated
25     * when running parallel photon distribution subprocesses, where photon
26     * rays from different subprocesses may correlate.
27     * We therefore maintain a separate RNG state for each sampling domain
28     * (e.g. photon emission, scattering, and russian roulette). With
29     * multiprocessing, each subprocess has its own instance of the RNG
30     * state, which is independently seeded for decorellation -- see
31     * distribPhotons() and distribPhotonContrib().
32     * The pmapSeed() and pmapRandom() macros below can be adapted to
33     * platform-specific RNGs if necessary. */
34     #if defined(_WIN32) || defined(_WIN64)
35     /* Use standard RNG without state management; the generated sequences
36     * will be suboptimal */
37     #include "random.h"
38     #define pmapSeed(seed, state) srandom(seed)
39     #define pmapRandom(state) frandom()
40 greg 2.2 #else
41 rschregle 2.8 /* Assume NIX and manage RNG state via erand48() */
42 greg 2.2 #define pmapSeed(seed, state) (state [0] += seed, state [1] += seed, \
43     state [2] += seed)
44 rschregle 2.8 #define pmapRandom(state) erand48(state)
45 greg 2.2 #endif
46 greg 2.1
47 greg 2.9 #ifdef __cplusplus
48     extern "C" {
49     #endif
50 rschregle 2.7
51     extern unsigned short partState [3], emitState [3], cntState [3],
52     mediumState [3], scatterState [3], rouletteState [3],
53     randSeed;
54 greg 2.9
55     #ifdef __cplusplus
56     }
57     #endif
58    
59 greg 2.1 #endif
60 greg 2.2