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
00036
00037
00038
00039
00040
00041 #include "LOCA_Abstract_Iterator.H"
00042 #include "Teuchos_ParameterList.hpp"
00043
00044 LOCA::Abstract::Iterator::Iterator() :
00045 stepNumber(0),
00046 numFailedSteps(0),
00047 numTotalSteps(0),
00048 maxSteps(100),
00049 iteratorStatus(LOCA::Abstract::Iterator::NotFinished)
00050 {
00051 }
00052
00053 LOCA::Abstract::Iterator::Iterator(Teuchos::ParameterList& p) :
00054 stepNumber(0),
00055 numFailedSteps(0),
00056 numTotalSteps(0),
00057 maxSteps(100),
00058 iteratorStatus(LOCA::Abstract::Iterator::NotFinished)
00059 {
00060 resetIterator(p);
00061 }
00062
00063 LOCA::Abstract::Iterator::Iterator(const LOCA::Abstract::Iterator& it) :
00064 stepNumber(it.stepNumber),
00065 numFailedSteps(it.numFailedSteps),
00066 numTotalSteps(it.numTotalSteps),
00067 maxSteps(it.maxSteps),
00068 iteratorStatus(it.iteratorStatus)
00069 {}
00070
00071 LOCA::Abstract::Iterator::~Iterator() {}
00072
00073 bool
00074 LOCA::Abstract::Iterator::resetIterator(Teuchos::ParameterList& p)
00075 {
00076 stepNumber = 0;
00077 numFailedSteps = 0;
00078 numTotalSteps = 0;
00079 iteratorStatus = LOCA::Abstract::Iterator::NotFinished;
00080
00081 maxSteps = p.get("Max Steps",100);
00082
00083 return true;
00084 }
00085
00086 LOCA::Abstract::Iterator::IteratorStatus
00087 LOCA::Abstract::Iterator::getIteratorStatus() const
00088 {
00089 return iteratorStatus;
00090 }
00091
00092 int
00093 LOCA::Abstract::Iterator::getStepNumber() const
00094 {
00095 return stepNumber;
00096 }
00097
00098 int
00099 LOCA::Abstract::Iterator::getNumFailedSteps() const
00100 {
00101 return numFailedSteps;
00102 }
00103
00104 int
00105 LOCA::Abstract::Iterator::getNumTotalSteps() const
00106 {
00107 return numTotalSteps;
00108 }
00109
00110 LOCA::Abstract::Iterator::IteratorStatus
00111 LOCA::Abstract::Iterator::run()
00112 {
00113 iteratorStatus = start();
00114 if (iteratorStatus == LOCA::Abstract::Iterator::Failed)
00115 return iteratorStatus;
00116
00117 stepNumber++;
00118
00119 iteratorStatus = iterate();
00120
00121 iteratorStatus = finish(iteratorStatus);
00122
00123 return iteratorStatus;
00124 }
00125
00126 LOCA::Abstract::Iterator::IteratorStatus
00127 LOCA::Abstract::Iterator::iterate()
00128 {
00129 LOCA::Abstract::Iterator::StepStatus stepStatus =
00130 LOCA::Abstract::Iterator::Successful;
00131 LOCA::Abstract::Iterator::StepStatus preStatus;
00132 LOCA::Abstract::Iterator::StepStatus compStatus;
00133 LOCA::Abstract::Iterator::StepStatus postStatus;
00134
00135 iteratorStatus = stop(stepStatus);
00136
00137 while (iteratorStatus == LOCA::Abstract::Iterator::NotFinished) {
00138
00139 preStatus = preprocess(stepStatus);
00140
00141 compStatus = compute(preStatus);
00142
00143 postStatus = postprocess(compStatus);
00144
00145 stepStatus = computeStepStatus(preStatus, compStatus, postStatus);
00146
00147 ++numTotalSteps;
00148 if (stepStatus == LOCA::Abstract::Iterator::Successful)
00149 ++stepNumber;
00150 else
00151 ++numFailedSteps;
00152
00153 if (iteratorStatus != LOCA::Abstract::Iterator::Failed)
00154 iteratorStatus = stop(stepStatus);
00155 }
00156
00157 return iteratorStatus;
00158 }
00159
00160 LOCA::Abstract::Iterator::IteratorStatus
00161 LOCA::Abstract::Iterator::stop(LOCA::Abstract::Iterator::StepStatus stepStatus)
00162 {
00163 if (numTotalSteps >= maxSteps)
00164 return LOCA::Abstract::Iterator::Finished;
00165 else
00166 return LOCA::Abstract::Iterator::NotFinished;
00167 }
00168
00169 void
00170 LOCA::Abstract::Iterator::setLastIteration()
00171 {
00172 iteratorStatus = LOCA::Abstract::Iterator::LastIteration;
00173 return;
00174 }
00175
00176 bool
00177 LOCA::Abstract::Iterator::isLastIteration()
00178 {
00179 return (iteratorStatus == LOCA::Abstract::Iterator::LastIteration);
00180 }
00181
00182 LOCA::Abstract::Iterator::StepStatus
00183 LOCA::Abstract::Iterator::computeStepStatus(
00184 LOCA::Abstract::Iterator::StepStatus preStatus,
00185 LOCA::Abstract::Iterator::StepStatus compStatus,
00186 LOCA::Abstract::Iterator::StepStatus postStatus)
00187 {
00188 bool haveProvisional = false;
00189 bool haveUnsuccessful = false;
00190
00191 if (preStatus == LOCA::Abstract::Iterator::Provisional ||
00192 compStatus == LOCA::Abstract::Iterator::Provisional ||
00193 postStatus == LOCA::Abstract::Iterator::Provisional) {
00194 haveProvisional = true;
00195 }
00196
00197 if (preStatus == LOCA::Abstract::Iterator::Unsuccessful ||
00198 compStatus == LOCA::Abstract::Iterator::Unsuccessful ||
00199 postStatus == LOCA::Abstract::Iterator::Unsuccessful) {
00200 haveUnsuccessful = true;
00201 }
00202
00203 if (haveProvisional && haveUnsuccessful) {
00204 iteratorStatus = LOCA::Abstract::Iterator::Failed;
00205 return LOCA::Abstract::Iterator::Unsuccessful;
00206 }
00207 else if (haveUnsuccessful)
00208 return LOCA::Abstract::Iterator::Unsuccessful;
00209 else
00210 return LOCA::Abstract::Iterator::Successful;
00211 }