--- trunk/OOPSE-2.0/src/math/randomSPRNG.cpp 2004/09/24 16:27:58 1492 +++ trunk/OOPSE-2.0/src/math/randomSPRNG.cpp 2005/01/12 22:41:40 1930 @@ -1,3 +1,44 @@ + /* + * Copyright (c) 2005 The University of Notre Dame. All Rights Reserved. + * + * The University of Notre Dame grants you ("Licensee") a + * non-exclusive, royalty free, license to use, modify and + * redistribute this software in source and binary code form, provided + * that the following conditions are met: + * + * 1. Acknowledgement of the program authors must be made in any + * publication of scientific results based in part on use of the + * program. An acceptable form of acknowledgement is citation of + * the article in which the program was described (Matthew + * A. Meineke, Charles F. Vardeman II, Teng Lin, Christopher + * J. Fennell and J. Daniel Gezelter, "OOPSE: An Object-Oriented + * Parallel Simulation Engine for Molecular Dynamics," + * J. Comput. Chem. 26, pp. 252-271 (2005)) + * + * 2. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * + * 3. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the + * distribution. + * + * This software is provided "AS IS," without a warranty of any + * kind. All express or implied conditions, representations and + * warranties, including any implied warranty of merchantability, + * fitness for a particular purpose or non-infringement, are hereby + * excluded. The University of Notre Dame and its licensors shall not + * be liable for any damages suffered by licensee as a result of + * using, modifying or distributing the software or its + * derivatives. In no event will the University of Notre Dame or its + * licensors be liable for any lost revenue, profit or data, or for + * direct, indirect, special, consequential, incidental or punitive + * damages, however caused and regardless of the theory of liability, + * arising out of the use of or inability to use software, even if the + * University of Notre Dame has been advised of the possibility of + * such damages. + */ + #include #include @@ -6,66 +47,62 @@ #include #ifdef IS_MPI -#include "brains/mpiSimulation.hpp" + +#include #endif -using namespace std; + /* randomStreamSPRNF creates a new SPRNG stream for random numbers */ int randomSPRNG::nStreamsInitialized = 0; -randomSPRNG::randomSPRNG(int iseed){ - int newSeed; - nStreamsInitialized++; - newSeed = abs(iseed) + nStreamsInitialized; - if( newSeed < 0 ) newSeed = abs( newSeed ); +randomSPRNG::randomSPRNG( int iseed ) { + int newSeed; + nStreamsInitialized++; + newSeed = abs(iseed) + nStreamsInitialized; + if (newSeed < 0) + newSeed = abs(newSeed); + #ifdef IS_MPI - nSPRNGStreams = mpiSim->getNProcessors(); - - myStreamNumber = mpiSim->getMyNode(); + //random number generator should not depend on MpiSimulation + MPI_Comm_size(MPI_COMM_WORLD, &nSPRNGStreams); + myStreamNumber = worldRank; - - #else - nSPRNGStreams = 1; - myStreamNumber = 0; + nSPRNGStreams = 1; + myStreamNumber = 0; #endif - - thisStream = init_sprng(GTYPE,myStreamNumber,nSPRNGStreams, - newSeed,SPRNG_DEFAULT); + thisStream = init_sprng(GTYPE, myStreamNumber, nSPRNGStreams, newSeed, + SPRNG_DEFAULT); } -randomSPRNG::~randomSPRNG(){ - if ( thisStream != NULL){ - free_sprng(thisStream); - nStreamsInitialized--; - } +randomSPRNG::~randomSPRNG() { + if (thisStream != NULL) { + free_sprng(thisStream); + nStreamsInitialized--; + } } +double randomSPRNG::getRandom() { return sprng(thisStream); } -double randomSPRNG::getRandom(){ - return sprng(thisStream); -} - - // Gaussian SPRNG class... -double gaussianSPRNG::getGaussian(){ - double ranNum1; - double ranNum2; - double gaussianNumber; +double gaussianSPRNG::getGaussian() { + double ranNum1; + double ranNum2; + double gaussianNumber; - ranNum1 = getRandom(); - ranNum2 = getRandom(); + ranNum1 = getRandom(); + ranNum2 = getRandom(); - gaussianNumber = sqrt(-2.0 * log(ranNum1)) * cos(2 * M_PI * ranNum2); + gaussianNumber = sqrt(-2.0 * log(ranNum1)) * cos(2 * M_PI * ranNum2); - return gaussianNumber; + return gaussianNumber; }