CFD Online Discussion Forums

CFD Online Discussion Forums (http://www.cfd-online.com/Forums/)
-   OpenFOAM Programming & Development (http://www.cfd-online.com/Forums/openfoam-programming-development/)
-   -   Globally instantiated "Random" (http://www.cfd-online.com/Forums/openfoam-programming-development/66974-globally-instantiated-random.html)

andersking July 30, 2009 02:08

Globally instantiated "Random"
 
Hi All,

I have a solver that I have I built that uses random numbers in a number of places. In the existing code, if a new "Random()" object is instantiated in more than one place, the random numbers are re-seeded (usually with the same seed) every time a new object is created.

In 1.5.x I changed Random() to initialise it self, and only reseed if explicitly asked. As follows:

(in Random.H)
Code:

        //- Construct given seed
        Random(const label&);
+      Random();
 
 
    // Member functions

(in Random.C)
Code:

  // construct given seed
 Random::Random(const label& seed)
 {
+   
+    static bool initialised = 0;
+
    if (seed > 1)
    {
        Seed = seed;

...
Code:

+    if (!initialised) {
#      ifdef USE_RANDOM
            srandom((unsigned int)Seed);
#      else
            srand48(Seed);
#      endif
+        initialised = 1;
+    }
 
 }
 
+Random::Random()
+{
+        Random(1);
+}
+
 
 int Random::bit()

I am in the process of testing the solver in 1.6.x (git), and am about to port my changes to it.

But before I do, i need to know if what I am doing is a good idea?
will this have any unforseen side effects? (so far I haven't come across any).

Is it worth including upstream?

It should be entirely compatible with existing code, but allows you to grab a random number anywhere by using

Code:

Random random();
scalar randno = random.scalar01();

where ever you need it.

Am i missing something?

Cheers,
Andrew


All times are GMT -4. The time now is 07:43.