| 51 | 
  | 
 | 
| 52 | 
  | 
ParallelRandNumGen::ParallelRandNumGen( const uint32& oneSeed) { | 
| 53 | 
  | 
 | 
| 54 | 
+ | 
    const int masterNode = 0; | 
| 55 | 
+ | 
    int seed = oneSeed; | 
| 56 | 
+ | 
    MPI_Bcast(&seed, 1, MPI_UNSIGNED_LONG, masterNode, MPI_COMM_WORLD);  | 
| 57 | 
+ | 
 | 
| 58 | 
+ | 
    if (seed != oneSeed) { | 
| 59 | 
+ | 
        sprintf(painCave.errMsg, | 
| 60 | 
+ | 
                "Using different seed to initialize ParallelRandNumGen.\n"); | 
| 61 | 
+ | 
        painCave.isFatal = 1;; | 
| 62 | 
+ | 
        simError(); | 
| 63 | 
+ | 
    } | 
| 64 | 
+ | 
 | 
| 65 | 
  | 
    int nProcessors; | 
| 66 | 
  | 
    MPI_Comm_size(MPI_COMM_WORLD, &nProcessors); | 
| 67 | 
< | 
    int newSeed = oneSeed +nCreatedRNG_; | 
| 68 | 
< | 
    mtRand_ = new MTRand(newSeed, nProcessors, worldRank); | 
| 67 | 
> | 
    MPI_Comm_rank( MPI_COMM_WORLD, &myRank_); | 
| 68 | 
> | 
    //In order to generate independent random number stream, the actual seed used by random  | 
| 69 | 
> | 
    //number generator is the seed passed to the constructor plus the number of random number | 
| 70 | 
> | 
    //generators which are already created.      | 
| 71 | 
> | 
    int newSeed = oneSeed + nCreatedRNG_; | 
| 72 | 
> | 
    mtRand_ = new MTRand(newSeed, nProcessors, myRank_); | 
| 73 | 
  | 
 | 
| 74 | 
  | 
    ++nCreatedRNG_; | 
| 75 | 
  | 
} | 
| 80 | 
  | 
    const int masterNode = 0; | 
| 81 | 
  | 
    int nProcessors; | 
| 82 | 
  | 
    MPI_Comm_size(MPI_COMM_WORLD, &nProcessors); | 
| 83 | 
< | 
    mtRand_ = new MTRand(nProcessors, worldRank); | 
| 83 | 
> | 
    MPI_Comm_rank( MPI_COMM_WORLD, &myRank_); | 
| 84 | 
> | 
    mtRand_ = new MTRand(nProcessors, myRank_); | 
| 85 | 
  | 
 | 
| 86 | 
< | 
    seed();         | 
| 71 | 
< | 
    ++nCreatedRNG_; | 
| 86 | 
> | 
    seed();       /** @todo calling virtual function in constructor is not a good design */ | 
| 87 | 
  | 
} | 
| 88 | 
  | 
 | 
| 89 | 
  | 
 |