45 #ifndef THYRA_GENERAL_SOLVE_CRITERIA_BELOS_STATUS_TEST_DEF_HPP 46 #define THYRA_GENERAL_SOLVE_CRITERIA_BELOS_STATUS_TEST_DEF_HPP 48 #include "Thyra_GeneralSolveCriteriaBelosStatusTest.hpp" 49 #include "Thyra_VectorSpaceBase.hpp" 50 #include "Thyra_MultiVectorBase.hpp" 51 #include "Thyra_VectorBase.hpp" 52 #include "Thyra_MultiVectorStdOps.hpp" 53 #include "Thyra_VectorStdOps.hpp" 55 #include "Teuchos_DebugDefaultAsserts.hpp" 56 #include "Teuchos_VerbosityLevel.hpp" 57 #include "Teuchos_as.hpp" 66 template<
class Scalar>
68 :convergenceTestFrequency_(-1),
78 template<
class Scalar>
81 const int convergenceTestFrequency
86 typedef ScalarTraits<ScalarMag> SMT;
97 solveCriteria_ = solveCriteria;
98 convergenceTestFrequency_ = convergenceTestFrequency;
104 compute_x_ = (compute_r_ ||
110 template<
class Scalar>
111 ArrayView<const typename ScalarTraits<Scalar>::magnitudeType>
114 return lastAchievedTol_;
121 template <
class Scalar>
136 if (currIter == 0 || currIter % convergenceTestFrequency_ != 0) {
138 return Belos::Undefined;
145 const int numRhs = lp.
getRHS()->domain()->dim();
167 R = createMembers(lp.
getOperator()->range(), X->domain());
173 lastNumerator_.resize(numRhs);
174 lastDenominator_.resize(numRhs);
176 for (
int j = 0; j < numRhs; ++j) {
179 lastNumerator_[j] = computeReductionFunctional(
180 solveCriteria_.solveMeasureType.numerator,
181 solveCriteria_.numeratorReductionFunc.ptr(),
183 lastDenominator_[j] = computeReductionFunctional(
184 solveCriteria_.solveMeasureType.denominator,
185 solveCriteria_.denominatorReductionFunc.ptr(),
191 bool systemsAreConverged =
true;
192 lastAchievedTol_.resize(numRhs);
194 for (
int j = 0; j < numRhs; ++j) {
195 const ScalarMag convRatio = lastNumerator_[j] / lastDenominator_[j];
196 lastAchievedTol_[j] = convRatio;
197 const bool sys_converged_j = (convRatio <= solveCriteria_.requestedTol);
199 printRhsStatus(currIter, j, *out);
201 if (!sys_converged_j) {
202 systemsAreConverged =
false;
206 lastRtnStatus_ = (systemsAreConverged ? Belos::Passed : Belos::Failed);
207 lastCurrIter_ = currIter;
209 return lastRtnStatus_;
213 template <
class Scalar>
217 return lastRtnStatus_;
221 template <
class Scalar>
226 lastNumerator_.clear();
227 lastDenominator_.clear();
228 lastAchievedTol_.clear();
230 lastRtnStatus_ = Belos::Undefined;
234 template <
class Scalar>
236 std::ostream& os,
int indent
239 const int numRhs = lastNumerator_.size();
240 for (
int j = 0; j < numRhs; ++j) {
241 printRhsStatus(lastCurrIter_, j, os, indent);
249 template <
class Scalar>
258 typedef ScalarTraits<ScalarMag> SMT;
259 ScalarMag rtn = -SMT::one();
260 Ptr<const VectorBase<Scalar> > v;
261 switch(measureType) {
274 TEUCHOS_TEST_FOR_EXCEPT_MSG(true, "ToDo: Handle ||b||!)");
277 if (rtn >= SMT::zero()) {
280 else if (
nonnull(v) && rtn < SMT::zero()) {
282 rtn = reductFunc->reduce(*v);
293 template <
class Scalar>
295 GeneralSolveCriteriaBelosStatusTest<Scalar>::printRhsStatus(
296 const int currIter,
const int j, std::ostream &out,
300 const ScalarMag convRatio = lastNumerator_[j] / lastDenominator_[j];
301 const bool sys_converged_j = (convRatio <= solveCriteria_.requestedTol);
302 for (
int i = 0; i < indent; ++i) { out <<
" "; }
304 <<
"["<<currIter<<
"] " 305 <<
"gN(vN("<<j<<
"))/gD(vD("<<j<<
")) = " 306 << lastNumerator_[j] <<
"/" << lastDenominator_[j] <<
" = " 307 << convRatio <<
" <= " << solveCriteria_.requestedTol <<
" : " 308 << (sys_converged_j ?
" true" :
"false")
316 #endif // THYRA_GENERAL_SOLVE_CRITERIA_BELOS_STATUS_TEST_DEF_HPP Teuchos::RCP< const MV > getRHS() const
GeneralSolveCriteriaBelosStatusTest()
SOLVE_MEASURE_NORM_SOLUTION
Subclass of Belos::StatusTest that implements every possible form of SolveCriteria that exists by for...
#define TEUCHOS_SWITCH_DEFAULT_DEBUG_ASSERT()
virtual Belos::StatusType getStatus() const
Teuchos::RCP< MV > updateSolution(const Teuchos::RCP< MV > &update=Teuchos::null, bool updateLP=false, ScalarType scale=Teuchos::ScalarTraits< ScalarType >::one())
#define TEUCHOS_ASSERT_INEQUALITY(val1, comp, val2)
ArrayView< const ScalarMag > achievedTol() const
virtual Teuchos::RCP< MV > getCurrentUpdate() const=0
Thyra specializations of MultiVecTraits and OperatorTraits.
virtual Belos::StatusType checkStatus(Belos::Iteration< Scalar, MV, OP > *iSolver)
ESolveMeasureNormType numerator
#define TEUCHOS_TEST_FOR_EXCEPT_MSG(throw_exception_test, msg)
bool contains(ESolveMeasureNormType measure) const
#define TEUCHOS_IF_ELSE_DEBUG_ASSERT()
virtual int getNumIters() const=0
virtual void print(std::ostream &os, int indent) const
ScalarTraits< Scalar >::magnitudeType ScalarMag
virtual const LinearProblem< ScalarType, MV, OP > & getProblem() const=0
TEUCHOSCORE_LIB_DLL_EXPORT bool includesVerbLevel(const EVerbosityLevel verbLevel, const EVerbosityLevel requestedVerbLevel, const bool isDefaultLevel=false)
bool nonnull(const boost::shared_ptr< T > &p)
RCP< const ReductionFunctional< Scalar > > numeratorReductionFunc
void setSolveCriteria(const SolveCriteria< Scalar > &solveCriteria, const int convergenceTestFrequency)
TypeTo as(const TypeFrom &t)
RCP< const ReductionFunctional< Scalar > > denominatorReductionFunc
void computeCurrResVec(MV *R, const MV *X=0, const MV *B=0) const
SolveMeasureType solveMeasureType
Teuchos::RCP< const OP > getOperator() const
#define TEUCHOS_ASSERT(assertion_test)
SOLVE_MEASURE_NORM_INIT_RESIDUAL
SOLVE_MEASURE_NORM_RESIDUAL