PlayaSolverState.hpp

00001 /* @HEADER@ */
00002 //   
00003  /* @HEADER@ */
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

doxygen