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 #include <SORMAnalysis.h>
00035 #include <ReliabilityDomain.h>
00036 #include <ReliabilityAnalysis.h>
00037 #include <FindCurvatures.h>
00038 #include <LimitStateFunction.h>
00039 #include <NormalRV.h>
00040 #include <math.h>
00041 #include <Vector.h>
00042
00043 #include <fstream>
00044 #include <iomanip>
00045 #include <iostream>
00046 using std::ifstream;
00047 using std::ios;
00048 using std::setw;
00049 using std::setprecision;
00050 using std::setiosflags;
00051
00052
00053 SORMAnalysis::SORMAnalysis( ReliabilityDomain *passedReliabilityDomain,
00054 FindCurvatures *passedCurvaturesAlgorithm,
00055 TCL_Char *passedFileName)
00056 :ReliabilityAnalysis()
00057 {
00058 theReliabilityDomain = passedReliabilityDomain;
00059 theCurvaturesAlgorithm = passedCurvaturesAlgorithm;
00060 fileName = new char[256];
00061 strcpy(fileName,passedFileName);
00062 }
00063
00064
00065 SORMAnalysis::~SORMAnalysis()
00066 {
00067 if (fileName != 0)
00068 delete [] fileName;
00069 }
00070
00071
00072
00073 int
00074 SORMAnalysis::analyze(void)
00075 {
00076
00077 opserr << "SORM Analysis is running ... " << endln;
00078
00079
00080
00081 Vector curvatures;
00082 int numberOfCurvatures;
00083 double beta;
00084 double pf1;
00085 double psi_beta;
00086 double product;
00087 int i;
00088 double pf2Breitung;
00089 double betaBreitung;
00090 LimitStateFunction *theLimitStateFunction;
00091 NormalRV *aStdNormRV = 0;
00092 aStdNormRV = new NormalRV(1,0.0,1.0,0.0);
00093
00094
00095
00096 if (aStdNormRV==0) {
00097 opserr << "SORMAnalysis::analyze() - out of memory while instantiating internal objects." << endln;
00098 return -1;
00099 }
00100
00101
00102
00103 int numLsf = theReliabilityDomain->getNumberOfLimitStateFunctions();
00104
00105
00106
00107 ofstream outputFile( fileName, ios::out );
00108
00109
00110
00111 for (int lsf=1; lsf<=numLsf; lsf++ ) {
00112
00113
00114
00115 opserr << "Limit-state function number: " << lsf << endln;
00116
00117
00118
00119 theReliabilityDomain->setTagOfActiveLimitStateFunction(lsf);
00120
00121
00122
00123 theLimitStateFunction = 0;
00124 lsf = theReliabilityDomain->getTagOfActiveLimitStateFunction();
00125 theLimitStateFunction = theReliabilityDomain->getLimitStateFunctionPtr(lsf);
00126 if (theLimitStateFunction == 0) {
00127 opserr << "SORMAnalysis::analyze() - could not find" << endln
00128 << " limit-state function with tag #" << lsf << "." << endln;
00129 return -1;
00130 }
00131
00132
00133
00134 if (theCurvaturesAlgorithm->computeCurvatures(theReliabilityDomain) < 0){
00135 opserr << "SORMAnalysis::analyze() - failed while finding " << endln
00136 << " curvatures for limit-state function number " << lsf << "." << endln;
00137 return -1;
00138 }
00139
00140
00141
00142 curvatures = theCurvaturesAlgorithm->getCurvatures();
00143 numberOfCurvatures = curvatures.Size();
00144
00145
00146
00147 beta = theLimitStateFunction->FORMReliabilityIndexBeta;
00148 pf1 = theLimitStateFunction->FORMProbabilityOfFailure_pf1;
00149
00150
00151
00152 double denominator = aStdNormRV->getCDFvalue(-beta);
00153 if (denominator == 0.0) {
00154 opserr << "SORMAnalysis::analyze() - denominator zero " << endln
00155 << " due to too large reliability index value." << endln;
00156 return -1;
00157 }
00158 psi_beta = aStdNormRV->getPDFvalue(beta)/denominator;
00159 product = 1.0;
00160 for (i=0; i<numberOfCurvatures; i++ ) {
00161 product = product / sqrt(1.0+psi_beta*curvatures(i));
00162 }
00163 pf2Breitung = pf1 * product;
00164
00165
00166
00167 betaBreitung = -aStdNormRV->getInverseCDFvalue(pf2Breitung);
00168
00169
00170
00171 theLimitStateFunction->numberOfCurvatauresUsed = numberOfCurvatures;
00172 theLimitStateFunction->SORMUsingSearchPf2Breitung = pf2Breitung;
00173 theLimitStateFunction->SORMUsingSearchBetaBreitung = betaBreitung;
00174
00175
00176
00177 outputFile << "#######################################################################" << endln;
00178 outputFile << "# SORM ANALYSIS RESULTS, LIMIT-STATE FUNCTION NUMBER "
00179 <<setiosflags(ios::left)<<setprecision(1)<<setw(4)<<lsf <<" #" << endln;
00180 outputFile << "# (Curvatures found from search algorithm.) #" << endln;
00181 outputFile << "# #" << endln;
00182 outputFile << "# Number of principal curvatures used: ............... "
00183 <<setiosflags(ios::left)<<setprecision(5)<<setw(12)<<numberOfCurvatures
00184 << " #" << endln;
00185 outputFile << "# Reliability index beta (impr. Breitung's formula):.. "
00186 <<setiosflags(ios::left)<<setprecision(5)<<setw(12)<<betaBreitung
00187 << " #" << endln;
00188 outputFile << "# Corresponding estimated probability of failure pf2:.."
00189 <<setiosflags(ios::left)<<setprecision(5)<<setw(12)<<pf2Breitung
00190 << " #" << endln;
00191 outputFile << "# #" << endln;
00192 outputFile << "#######################################################################" << endln << endln << endln;
00193 }
00194
00195
00196
00197 opserr << "SORM analysis completed. " << endln;
00198
00199
00200 outputFile.close();
00201 delete aStdNormRV;
00202
00203 return 0;
00204 }
00205