00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021
00022
00023
00024
00025
00026
00027
00028
00029
00030
00031
00032
00033
00034
00035 #include <DiscretizedRandomProcessSeries.h>
00036 #include <Vector.h>
00037 #include <Channel.h>
00038 #include <ModulatingFunction.h>
00039 #include <Filter.h>
00040 #include <classTags.h>
00041 #include <Parameter.h>
00042
00043 DiscretizedRandomProcessSeries::DiscretizedRandomProcessSeries(int num,
00044 ModulatingFunction **theModFuncs,
00045 double p_mean,
00046 double p_maxStdv)
00047 :TimeSeries(TSERIES_TAG_DiscretizedRandomProcessSeries)
00048 {
00049 randomVariables = 0;
00050 kickInTimes = 0;
00051 theModulatingFunctions = theModFuncs;
00052 numModFuncs = num;
00053 mean = p_mean;
00054 maxStdv = p_maxStdv;
00055
00056 c = 0.0;
00057 }
00058
00059
00060 DiscretizedRandomProcessSeries::~DiscretizedRandomProcessSeries()
00061 {
00062 if (randomVariables != 0)
00063 delete randomVariables;
00064
00065 if (kickInTimes != 0)
00066 delete kickInTimes;
00067 }
00068
00069
00070 double
00071 DiscretizedRandomProcessSeries::getFactor(double time)
00072 {
00073 if (time == 0.0) {
00074 return 0.0;
00075 }
00076 else if (randomVariables == 0 || kickInTimes == 0) {
00077 opserr << "ERROR in DiscretizedRandomProcessSeries::getFactor(): " << endln
00078 << " random variables or kick-in times vector(s) do not exist. " << endln;
00079 return 0.0;
00080 }
00081 else if (kickInTimes->Size() != randomVariables->Size() ) {
00082 opserr << "ERROR in DiscretizedRandomProcessSeries::getFactor(): " << endln
00083 << " number of random variables is not the same as kick-in times. " << endln;
00084 return 0.0;
00085 }
00086 else {
00087 double sum1;
00088 double sum2;
00089 int nrv = 0;
00090 double modFuncAmplitude, filterAmplitude;
00091 Filter *theFilter;
00092
00093
00094 sum1 = 0.0;
00095 for (int k=0; k<numModFuncs; k++) {
00096
00097
00098 modFuncAmplitude = theModulatingFunctions[k]->getAmplitude(time);
00099 theFilter = theModulatingFunctions[k]->getFilter();
00100
00101
00102 nrv = randomVariables->Size();
00103
00104
00105 sum2 = 0.0;
00106 for (int i=0; i<nrv; i++) {
00107
00108
00109 filterAmplitude = theFilter->getAmplitude(time-(*kickInTimes)(i));
00110
00111
00112 sum2 += (*randomVariables)(i) * filterAmplitude;
00113
00114
00115 if (time-(*kickInTimes)(i) < 0.0) {
00116 break;
00117 }
00118 }
00119
00120 sum1 += sum2*modFuncAmplitude;
00121 }
00122
00123 double result = mean + c*sum1;
00124 return result;
00125 }
00126 }
00127
00128
00129 double
00130 DiscretizedRandomProcessSeries::getFactorSensitivity(double time)
00131 {
00132
00133
00134
00135
00136
00137
00138 if (time == 0.0) {
00139 return 0.0;
00140 }
00141 else if (randomVariables == 0 || kickInTimes == 0) {
00142 opserr << "ERROR in DiscretizedRandomProcessSeries::getFactorSensitivity(): " << endln
00143 << " random variables or kick-in times vector(s) do not exist. " << endln;
00144 return 0.0;
00145 }
00146 else if (kickInTimes->Size() != randomVariables->Size() ) {
00147 opserr << "ERROR in DiscretizedRandomProcessSeries::getFactorSensitivity(): " << endln
00148 << " number of random variables is not the same as kick-in times. " << endln;
00149 return 0.0;
00150 }
00151 else {
00152
00153 double sum1;
00154 double sum2;
00155 int nrv = 0;
00156 double modFuncAmplitude;
00157 Filter *theFilter;
00158
00159
00160 sum1 = 0.0;
00161 for (int k=0; k<numModFuncs; k++) {
00162
00163
00164 modFuncAmplitude = theModulatingFunctions[k]->getAmplitude(time);
00165 theFilter = theModulatingFunctions[k]->getFilter();
00166
00167
00168 nrv = randomVariables->Size();
00169
00170
00171 sum2 = theFilter->getAmplitude(time-(*kickInTimes)(parameterID-1));
00172 sum1 += sum2*modFuncAmplitude;
00173 }
00174
00175 double result = mean + c*sum1;
00176 return result;
00177 }
00178 }
00179
00180
00181 int
00182 DiscretizedRandomProcessSeries::sendSelf(int commitTag, Channel &theChannel)
00183 {
00184 return 0;
00185 }
00186
00187
00188 int
00189 DiscretizedRandomProcessSeries::recvSelf(int commitTag, Channel &theChannel, FEM_ObjectBroker &theBroker)
00190 {
00191 return 0;
00192 }
00193
00194
00195 void
00196 DiscretizedRandomProcessSeries::Print(OPS_Stream &s, int flag)
00197 {
00198 }
00199
00200 int
00201 DiscretizedRandomProcessSeries::setParameter(const char **argv, int argc,
00202 Parameter ¶m)
00203 {
00204 if (argc < 1)
00205 return -1;
00206
00207
00208
00209 int rvNumber = 1;
00210
00211
00212
00213
00214
00215 if (kickInTimes == 0) {
00216 kickInTimes = new Vector(rvNumber);
00217 (*kickInTimes)(rvNumber-1) = (double)atof(argv[0]);
00218
00219
00220
00221 }
00222
00223 else if (kickInTimes->Size() < rvNumber) {
00224
00225
00226 Vector temp(*kickInTimes);
00227
00228
00229 delete kickInTimes;
00230 kickInTimes = new Vector(rvNumber);
00231
00232
00233 for (int i=0; i<temp.Size(); i++) {
00234 (*kickInTimes)(i) = temp(i);
00235 }
00236
00237
00238 (*kickInTimes)(rvNumber-1) = (double)atof(argv[0]);
00239
00240
00242
00243
00244 int nrv = kickInTimes->Size();
00245
00246 double new_c;
00247 double denominator;
00248
00249
00250 for (int t=1; t<=nrv; t++) {
00251
00252 denominator = 0.0;
00253
00254
00255 for (int k=0; k<numModFuncs; k++) {
00256
00257
00258 Filter *theFilter_k = theModulatingFunctions[k]->getFilter();
00259 double modFuncAmplitude_k = theModulatingFunctions[k]->getAmplitude((*kickInTimes)(t-1));
00260
00261
00262
00263 for (int l=0; l<numModFuncs; l++) {
00264
00265
00266
00267 Filter *theFilter_l = theModulatingFunctions[l]->getFilter();
00268 double modFuncAmplitude_l = theModulatingFunctions[l]->getAmplitude((*kickInTimes)(t-1));
00269
00270
00271
00272 for (int i=0; i<nrv; i++) {
00273
00274
00275 double filterAmplitude_k = theFilter_k->getAmplitude(((*kickInTimes)(t-1))-(*kickInTimes)(i));
00276 double filterAmplitude_l = theFilter_l->getAmplitude(((*kickInTimes)(t-1))-(*kickInTimes)(i));
00277
00278
00279 denominator += filterAmplitude_k*filterAmplitude_l
00280 * modFuncAmplitude_k*modFuncAmplitude_l;
00281 }
00282 }
00283 }
00284 }
00285
00286 new_c = sqrt(maxStdv*maxStdv/denominator);
00287
00288 if (c==0.0) {
00289 c = new_c;
00290 }
00291 else if (new_c < c) {
00292 c = new_c;
00293 }
00294
00295 c = maxStdv;
00296 opserr << "c: " << c << endln;
00297
00299 }
00300 else {
00301 (*kickInTimes)(rvNumber-1) = (double)atof(argv[0]);
00302 }
00303
00304
00305 return param.addObject(rvNumber, this);
00306 }
00307
00308 int
00309 DiscretizedRandomProcessSeries::updateParameter(int parameterID, Information &info)
00310 {
00311
00312 if (randomVariables == 0) {
00313 randomVariables = new Vector(parameterID);
00314 (*randomVariables)(parameterID-1) = info.theDouble;
00315 }
00316
00317 else if (randomVariables->Size() < parameterID) {
00318
00319
00320 Vector temp(*randomVariables);
00321
00322
00323 delete randomVariables;
00324 randomVariables = new Vector(parameterID);
00325
00326
00327 for (int i=0; i<temp.Size(); i++) {
00328 (*randomVariables)(i) = temp(i);
00329 }
00330
00331
00332 (*randomVariables)(parameterID-1) = info.theDouble;
00333 }
00334 else {
00335 (*randomVariables)(parameterID-1) = info.theDouble;
00336 }
00337
00338 return 0;
00339 }
00340
00341 int
00342 DiscretizedRandomProcessSeries::activateParameter(int passedParameterID)
00343 {
00344 parameterID = passedParameterID;
00345
00346 return 0;
00347 }