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 <OptimalityConditionReliabilityConvergenceCheck.h>
00035 #include <ReliabilityConvergenceCheck.h>
00036 #include <math.h>
00037 #include <Vector.h>
00038
00039 #include <fstream>
00040 #include <iomanip>
00041 #include <iostream>
00042 using std::ifstream;
00043 using std::ios;
00044 using std::setw;
00045 using std::setprecision;
00046 using std::setiosflags;
00047
00048
00049 OptimalityConditionReliabilityConvergenceCheck::OptimalityConditionReliabilityConvergenceCheck(double passedE1, double passedE2, double pscaleValue, int print)
00050 :ReliabilityConvergenceCheck()
00051 {
00052 e1 = passedE1;
00053 e2 = passedE2;
00054 criterium1 = 0.0;
00055 criterium2 = 0.0;
00056 scaleValue = pscaleValue;
00057 printFlag = print;
00058 }
00059
00060 OptimalityConditionReliabilityConvergenceCheck::~OptimalityConditionReliabilityConvergenceCheck()
00061 {
00062 }
00063
00064
00065
00066 int
00067 OptimalityConditionReliabilityConvergenceCheck::setScaleValue(double passedScaleValue)
00068 {
00069 if (scaleValue == 0.0) {
00070 scaleValue = passedScaleValue;
00071 }
00072
00073 return 0;
00074 }
00075
00076
00077 int
00078 OptimalityConditionReliabilityConvergenceCheck::check(Vector u, double g, Vector gradG)
00079 {
00080 if (scaleValue == 0.0) {
00081 opserr << "OptimalityConditionReliabilityConvergenceCheck::check() --" << endln
00082 << " scale value has not been set!" << endln;
00083 }
00084
00085
00086 criterium1 = fabs(g / scaleValue);
00087 criterium2 = 1.0-1.0/(gradG.Norm()*u.Norm()) * (gradG^u);
00088
00089
00090
00091 static ofstream logfile( "SearchLog.out", ios::out );
00092 char outputString[100];
00093 sprintf(outputString,"check1=(%11.3e), check2=(%10.3e), dist=%16.14f",criterium1,criterium2,u.Norm());
00094 if (printFlag!=0) {
00095 opserr << outputString << endln;
00096 }
00097 logfile << outputString << endln;
00098
00099
00100
00101 if ( ( criterium1 < e1 ) && ( criterium2 < e2 ) ) {
00102 return 1;
00103 }
00104 else {
00105 return -1;
00106 }
00107 }
00108
00109 int
00110 OptimalityConditionReliabilityConvergenceCheck::getNumberOfCriteria()
00111 {
00112 return 2;
00113 }
00114
00115 double
00116 OptimalityConditionReliabilityConvergenceCheck::getCriteriaValue(int whichCriteria)
00117 {
00118 if (whichCriteria == 1) {
00119 return criterium1;
00120 }
00121 else if (whichCriteria == 2) {
00122 return criterium2;
00123 }
00124 else {
00125 opserr << "OptimalityConditionReliabilityConvergenceCheck::getCriteriaValue() -- " << endln
00126 << " criterium number " << whichCriteria << " does not exist!" << endln;
00127 return 0.0;
00128 }
00129
00130 }