PlayaSolverState.hpp
00001
00002
00003
00004
00005 #ifndef PLAYA_SOLVERSTATE_HPP
00006 #define PLAYA_SOLVERSTATE_HPP
00007
00008 #include "PlayaDefs.hpp"
00009 #include "PlayaVectorDecl.hpp"
00010 #include "PlayaLinearOperatorDecl.hpp"
00011 #include "Teuchos_ParameterList.hpp"
00012
00013 namespace Playa
00014 {
00015 using namespace Teuchos;
00016
00020 enum SolverStatusCode {SolveCrashed, SolveFailedToConverge, SolveConverged};
00021
00022
00026 template <class Scalar>
00027 class SolverState
00028 {
00029 public:
00031 SolverState(SolverStatusCode finalState, const std::string& msg,
00032 int finalIters, const Scalar& finalResid)
00033 : finalState_(finalState),
00034 finalResid_(finalResid),
00035 finalIters_(finalIters),
00036 msg_(msg)
00037 {;}
00038
00040 SolverState() {;}
00041
00043 const Scalar& finalResid() const {return finalResid_;}
00044
00046 int finalIters() const {return finalIters_;}
00047
00049 const SolverStatusCode& finalState() const {return finalState_;}
00050
00052 const std::string& finalMsg() const {return msg_;}
00053
00055 std::string stateDescription() const
00056 {
00057 switch (finalState_)
00058 {
00059 case SolveCrashed:
00060 return "Crashed";
00061 case SolveFailedToConverge:
00062 return "Failed to converge";
00063 case SolveConverged:
00064 return "Converged";
00065 }
00066 return "Crashed";
00067 }
00068
00069 private:
00070
00071 SolverStatusCode finalState_;
00072
00073 Scalar finalResid_;
00074
00075 int finalIters_;
00076
00077 std::string msg_;
00078 };
00079
00080
00081 template <class Scalar> inline
00082 std::ostream& operator<<(std::ostream& os,
00083 const Playa::SolverState<Scalar>& state)
00084 {
00085 os << "Solver final state: " << state.stateDescription() << std::endl;
00086 os << "message: " << state.finalMsg() << std::endl;
00087 os << "iters taken: " << state.finalIters() << std::endl;
00088 os << "final residual: " << state.finalResid() << std::endl;
00089 return os;
00090 }
00091
00092 }
00093
00094
00095 #endif