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 <GradGEvaluator.h>
00035 #include <Matrix.h>
00036 #include <ReliabilityDomain.h>
00037 #include <tcl.h>
00038
00039 GradGEvaluator::GradGEvaluator(ReliabilityDomain *passedReliabilityDomain,
00040 Tcl_Interp *passedTclInterp)
00041 {
00042 theTclInterp = passedTclInterp;
00043 theReliabilityDomain = passedReliabilityDomain;
00044 DgDpar = 0;
00045 }
00046
00047 GradGEvaluator::~GradGEvaluator()
00048 {
00049 if (DgDpar != 0)
00050 delete DgDpar;
00051 }
00052
00053
00054
00055 Matrix
00056 GradGEvaluator::getDgDdispl()
00057 {
00058 opserr << "GradGEvaluator::getDgDdispl() -- This method is not " << endln
00059 << " implemented for the chosen type of GradGEvaluator." << endln;
00060
00061 Matrix dummy(1,1);
00062 return dummy;
00063 }
00064
00065
00066
00067
00068
00069
00070
00071 int
00072 GradGEvaluator::computeParameterDerivatives(double g)
00073 {
00074
00075 if (DgDpar != 0) {
00076 delete DgDpar;
00077 DgDpar = 0;
00078 }
00079
00080
00081
00082 char separators[5] = "}{";
00083 char tclAssignment[500];
00084 double onedgdpar;
00085 int i;
00086
00087
00088
00089 int lsf = theReliabilityDomain->getTagOfActiveLimitStateFunction();
00090 LimitStateFunction *theLimitStateFunction =
00091 theReliabilityDomain->getLimitStateFunctionPtr(lsf);
00092 char *theExpression = theLimitStateFunction->getExpression();
00093 char *lsf_copy = new char[500];
00094 strcpy(lsf_copy,theExpression);
00095 char *tokenPtr = strtok( lsf_copy, separators);
00096
00097 while ( tokenPtr != NULL ) {
00098
00099 if ( strncmp(tokenPtr, "par", 3) == 0) {
00100
00101
00102 int parameterNumber;
00103 sscanf(tokenPtr,"par_%i",¶meterNumber);
00104
00105
00106 double originalValue;
00107 sprintf(tclAssignment , "($par_%d)",parameterNumber);
00108 Tcl_ExprDouble( theTclInterp, tclAssignment, &originalValue );
00109
00110
00111 sprintf(tclAssignment,"set par_%d [ expr ($par_%d*1.001) ]",parameterNumber,parameterNumber);
00112 Tcl_Eval( theTclInterp, tclAssignment);
00113
00114
00115 double g_perturbed;
00116 char *theTokenizedExpression = theLimitStateFunction->getTokenizedExpression();
00117 Tcl_ExprDouble( theTclInterp, theTokenizedExpression, &g_perturbed );
00118
00119
00120 onedgdpar = (g_perturbed-g)/(originalValue*0.001);
00121
00122
00123 sprintf(tclAssignment,"set par_%d %35.20f",parameterNumber,originalValue);
00124 Tcl_Eval( theTclInterp, tclAssignment);
00125
00126
00127 if (DgDpar == 0) {
00128 DgDpar = new Matrix(1, 2);
00129 (*DgDpar)(0,0) = (double)parameterNumber;
00130 (*DgDpar)(0,1) = onedgdpar;
00131 }
00132 else {
00133 int oldSize = DgDpar->noRows();
00134 Matrix tempMatrix = *DgDpar;
00135 delete DgDpar;
00136 DgDpar = new Matrix(oldSize+1, 2);
00137 for (i=0; i<oldSize; i++) {
00138 (*DgDpar)(i,0) = tempMatrix(i,0);
00139 (*DgDpar)(i,1) = tempMatrix(i,1);
00140 }
00141 (*DgDpar)(oldSize,0) = (double)parameterNumber;
00142 (*DgDpar)(oldSize,1) = onedgdpar;
00143 }
00144 }
00145
00146 tokenPtr = strtok( NULL, separators);
00147 }
00148
00149 delete [] lsf_copy;
00150
00151 return 0;
00152 }
00153
00154
00155
00156 Matrix
00157 GradGEvaluator::getDgDpar()
00158 {
00159 return (*DgDpar);
00160 }