--- trunk/mdtools/md_code/randomSPRNG.cpp 2002/12/30 16:20:42 220 +++ trunk/mdtools/md_code/randomSPRNG.cpp 2003/01/28 22:16:55 252 @@ -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); +} -#endif +randomSPRNG::~randomSPRNG(){ + if ( thisStream != NULL){ + // free_sprng(*thisStream); + nStreamsInitialized--; + } } -randomStreamSPRNG::~randomStreamSPRNG(){ - free_sprng(int *thisStream); - nSPRNGStreams--; +double randomSPRNG::getRandom(){ + return sprng(thisStream); +} -} +// Gaussian SPRNG class... +double gaussianSPRNG::getGaussian(){ + double ranNum1; + double ranNum2; + double gaussianNumber; -double getRanStreamSPRNG(){ - double ranNum; - nanNum = sprng(thisStream); - return ranNum; + ranNum1 = getRandom(); + ranNum2 = getRandom(); + + gaussianNumber = sqrt(-2.0 * log(ranNum1)) * cos(2 * M_PI * ranNum2); + + return gaussianNumber; }