CStdLibRandGenerator.cpp

Go to the documentation of this file.
00001 /* ****************************************************************** **
00002 **    OpenSees - Open System for Earthquake Engineering Simulation    **
00003 **          Pacific Earthquake Engineering Research Center            **
00004 **                                                                    **
00005 **                                                                    **
00006 ** (C) Copyright 2001, The Regents of the University of California    **
00007 ** All Rights Reserved.                                               **
00008 **                                                                    **
00009 ** Commercial use of this program without express permission of the   **
00010 ** University of California, Berkeley, is strictly prohibited.  See   **
00011 ** file 'COPYRIGHT'  in main directory for information on usage and   **
00012 ** redistribution,  and for a DISCLAIMER OF ALL WARRANTIES.           **
00013 **                                                                    **
00014 ** Developed by:                                                      **
00015 **   Frank McKenna (fmckenna@ce.berkeley.edu)                         **
00016 **   Gregory L. Fenves (fenves@ce.berkeley.edu)                       **
00017 **   Filip C. Filippou (filippou@ce.berkeley.edu)                     **
00018 **                                                                    **
00019 ** Reliability module developed by:                                   **
00020 **   Terje Haukaas (haukaas@ce.berkeley.edu)                          **
00021 **   Armen Der Kiureghian (adk@ce.berkeley.edu)                       **
00022 **                                                                    **
00023 ** ****************************************************************** */
00024                                                                         
00025 // $Revision: 1.7 $
00026 // $Date: 2005/03/21 21:35:56 $
00027 // $Source: /usr/local/cvs/OpenSees/SRC/reliability/analysis/randomNumber/CStdLibRandGenerator.cpp,v $
00028 
00029 
00030 //
00031 // Written by Terje Haukaas (haukaas@ce.berkeley.edu)
00032 //
00033 
00034 #include <RandomNumberGenerator.h>
00035 #include <CStdLibRandGenerator.h>
00036 #include <NormalRV.h>
00037 #include <Vector.h>
00038 
00039 
00040 CStdLibRandGenerator::CStdLibRandGenerator()
00041 :RandomNumberGenerator()
00042 {
00043         generatedNumbers = 0;
00044 }
00045 
00046 CStdLibRandGenerator::~CStdLibRandGenerator()
00047 {
00048         if (generatedNumbers != 0)
00049                 delete generatedNumbers;
00050 }
00051 
00052 
00053 
00054 
00055 
00056 int
00057 CStdLibRandGenerator::generate_nIndependentUniformNumbers(int n, double lower, double upper, int seedIn)
00058 {
00059         // Initial declarations
00060         int j;
00061         int randomNumberBetween0AndRAND_MAX;
00062         double randomNumberBetween0And1;
00063         Vector randomArray(n);
00064 
00065 
00066         // Create array of standard normal random numbers
00067         if (seedIn != 0) {
00068                 srand(seedIn);
00069         }
00070         for ( j=0; j<n; j++)
00071         {
00072                 // Generate a number between 0 and RAND_MAX
00073                 randomNumberBetween0AndRAND_MAX = rand();
00074 
00075                 // Modify it so that the value lies between 0 and 1
00076                 randomNumberBetween0And1 = (double)randomNumberBetween0AndRAND_MAX/RAND_MAX;
00077 
00078                 // Transform according to uniform distribution
00079                 randomArray(j) = (upper-lower)*randomNumberBetween0And1 + lower;
00080         }
00081 
00082         seed = randomNumberBetween0AndRAND_MAX;
00083         
00084         if (generatedNumbers == 0) {
00085                 generatedNumbers = new Vector(n);
00086         }
00087         else if (generatedNumbers->Size() != n) {
00088                 delete generatedNumbers;
00089                 generatedNumbers = new Vector(n);
00090         }
00091         (*generatedNumbers) = randomArray;
00092 
00093 
00094         return 0;
00095 }
00096 
00097 
00098 
00099 
00100 int
00101 CStdLibRandGenerator::generate_nIndependentStdNormalNumbers(int n, int seedIn)
00102 {
00103         // Initial declarations
00104         int j;
00105         int randomNumberBetween0AndRAND_MAX;
00106         double randomNumberBetween0And1;
00107         Vector randomArray(n);
00108         NormalRV *aStdNormRV = 0;
00109         aStdNormRV = new NormalRV(1,0.0,1.0,0.0);
00110 
00111 
00112         // Check if computer ran out of memory
00113         if (aStdNormRV==0) {
00114                 opserr << "CStdLibRandGenerator::generate_nIndependentStdNormalNumbers() - " << endln
00115                         << " out of memory while instantiating internal objects." << endln;
00116                 return -1;
00117         }
00118 
00119 
00120         // Create array of standard normal random numbers
00121         if (seedIn != 0) {
00122                 srand(seedIn);
00123         }
00124         for ( j=0; j<n; j++)
00125         {
00126                 // Generate a number between 0 and RAND_MAX
00127                 randomNumberBetween0AndRAND_MAX = rand();
00128 
00129                 // Modify it so that the value lies between 0 and 1
00130                 randomNumberBetween0And1 = (double)randomNumberBetween0AndRAND_MAX/RAND_MAX;
00131 
00132 
00133                 // Treat two special cases
00134                 if (randomNumberBetween0And1 == 0.0) {
00135                         randomNumberBetween0And1 = 0.0000001;
00136                 }
00137                 if (randomNumberBetween0And1 == 1.0) {
00138                         randomNumberBetween0And1 = 0.9999999;
00139                 }
00140 
00141 
00142                 // Transform that number into a standard normal variable
00143                 //    Phi(z) = F(x)
00144                 //    z = invPhi( F(x) )
00145                 //       where F(x) for the uniform distribution 
00146                 //       from 0 to 1 in fact is equal to x itself.
00147                 randomArray(j) = aStdNormRV->getInverseCDFvalue(randomNumberBetween0And1); 
00148         }
00149         seed = randomNumberBetween0AndRAND_MAX;
00150 
00151         if (generatedNumbers == 0) {
00152                 generatedNumbers = new Vector(n);
00153         }
00154         else if (generatedNumbers->Size() != n) {
00155                 delete generatedNumbers;
00156                 generatedNumbers = new Vector(n);
00157         }
00158         (*generatedNumbers) = randomArray;
00159 
00160         delete aStdNormRV;
00161 
00162         return 0;
00163 }
00164 
00165 
00166 
00167 Vector
00168 CStdLibRandGenerator::getGeneratedNumbers()
00169 {
00170         return (*generatedNumbers);
00171 }
00172 
00173 
00174 int
00175 CStdLibRandGenerator::getSeed()
00176 {
00177         return seed;
00178 }

Generated on Mon Oct 23 15:05:25 2006 for OpenSees by doxygen 1.5.0