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 <StandardReliabilityConvergenceCheck.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 StandardReliabilityConvergenceCheck::StandardReliabilityConvergenceCheck(double passedE1,
00050 double passedE2,
00051 double pscaleValue,
00052 int print)
00053 :ReliabilityConvergenceCheck()
00054 {
00055 e1 = passedE1;
00056 e2 = passedE2;
00057 criterium1 = 0.0;
00058 criterium2 = 0.0;
00059 scaleValue = pscaleValue;
00060 printFlag = print;
00061 }
00062
00063 StandardReliabilityConvergenceCheck::~StandardReliabilityConvergenceCheck()
00064 {
00065 }
00066
00067
00068
00069 int
00070 StandardReliabilityConvergenceCheck::setScaleValue(double passedScaleValue)
00071 {
00072 if (scaleValue == 0.0) {
00073 scaleValue = passedScaleValue;
00074 }
00075
00076 return 0;
00077 }
00078
00079
00080 int
00081 StandardReliabilityConvergenceCheck::check(Vector u, double g, Vector gradG)
00082 {
00083 if (scaleValue == 0.0) {
00084 opserr << "StandardReliabilityConvergenceCheck::check() --" << endln
00085 << " scale value has not been set!" << endln;
00086 }
00087
00088
00089
00090 Vector alpha = gradG * ( (-1.0) / gradG.Norm() );
00091
00092
00093
00094 double temp0=u.Norm();
00095 if (temp0 < 1.0) {
00096 temp0 = 1.0;
00097 }
00098
00099
00100
00101 Vector u_scaled = (1.0/temp0) * u;
00102
00103
00104
00105 Vector temp1 = u_scaled - (alpha^u_scaled)*alpha;
00106 criterium1 = fabs(g / scaleValue);
00107 criterium2 = temp1.Norm();
00108
00109
00110
00111 static ofstream logfile( "ConvergenceCheckLog.txt", ios::out );
00112 char outputString[100];
00113 sprintf(outputString,"check1=(%11.3e), check2=(%10.3e), dist=%16.14f",criterium1,criterium2,u.Norm());
00114 if (printFlag!=0) {
00115 opserr << outputString << endln;
00116 }
00117 logfile << outputString << endln;
00118 logfile.flush();
00119
00120
00121
00122 if ( ( criterium1 < e1 ) && ( criterium2 < e2 ) ) {
00123 return 1;
00124 }
00125 else {
00126 return -1;
00127 }
00128 }
00129
00130 int
00131 StandardReliabilityConvergenceCheck::getNumberOfCriteria()
00132 {
00133 return 2;
00134 }
00135
00136 double
00137 StandardReliabilityConvergenceCheck::getCriteriaValue(int whichCriteria)
00138 {
00139 if (whichCriteria == 1) {
00140 return criterium1;
00141 }
00142 else if (whichCriteria == 2) {
00143 return criterium2;
00144 }
00145 else {
00146 opserr << "StandardReliabilityConvergenceCheck::getCriteriaValue() -- " << endln
00147 << " criterium number " << whichCriteria << " does not exist!" << endln;
00148 return 0.0;
00149 }
00150
00151 }