--- trunk/mdtools/md_code/randomSPRNG.cpp 2002/12/30 16:20:42 220 +++ trunk/mdtools/md_code/randomSPRNG.cpp 2003/01/27 22:12:57 250 @@ -3,40 +3,66 @@ #include "randomSPRNG.hpp" #include "simError.h" +#include "sprng.h" +#ifdef IS_MPI +#include "mpiSimulation.hpp" +#endif /* randomStreamSPRNF creates a new SPRNG stream for random numbers */ -int ranStreamSPRNG::nSPRNGStreams; +int randomSPRNG::nStreamsInitialized = 0; -randomStreamSPRNG::randomStreamSPRNG(){ +randomSPRNG::randomSPRNG(int iseed){ + int newSeed; + nStreamsInitialized++; + newSeed = abs(iseed) + nStreamsInitialized; + if( newSeed < 0 ) newSeed = abs( newSeed ); + #ifdef IS_MPI + nSPRNGStreams = mpiSim->getNumberProcessors(); + + myStreamNumber = mpiSim->getMyNode(); + #else - nSPRNGStreams++; - myStreamNumber = nSPRNGStreams; + nSPRNGStreams = 1; + myStreamNumber = nStreamsInitialized; - thisStream = init_sprng(GTYPE,streamnum,nstreams,SEED,SPRNG_DEFAULT); - - #endif + + thisStream = init_sprng(GTYPE,myStreamNumber,nSPRNGStreams, + newSeed,SPRNG_DEFAULT); } -randomStreamSPRNG::~randomStreamSPRNG(){ +randomSPRNG::~randomSPRNG(){ - free_sprng(int *thisStream); - nSPRNGStreams--; + free_sprng(*thisStream); + nStreamsInitialized--; +} + +double randomSPRNG::getRandom(){ + return sprng(thisStream); } -double getRanStreamSPRNG(){ - double ranNum; - nanNum = sprng(thisStream); - return ranNum; +// Gaussian SPRNG class... + +double gaussianSPRNG::getGaussian(){ + double ranNum1; + double ranNum2; + double gaussianNumber; + + ranNum1 = getRandom(); + ranNum2 = getRandom(); + + gaussianNumber = sqrt(-2.0 * log(ranNum1)) * cos(2 * M_PI * ranNum2); + + return gaussianNumber; }