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 00017 /** 00018 * SolverStatusCode is an enum that encapsulates whether a solver succeeded or failed 00019 */ 00020 enum SolverStatusCode {SolveCrashed, SolveFailedToConverge, SolveConverged}; 00021 00022 00023 /** 00024 * SolverState provides information about the result of a linear or nonlinear solve 00025 */ 00026 template <class Scalar> 00027 class SolverState 00028 { 00029 public: 00030 /** */ 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 00039 /** */ 00040 SolverState() {;} 00041 00042 /** */ 00043 const Scalar& finalResid() const {return finalResid_;} 00044 00045 /** */ 00046 int finalIters() const {return finalIters_;} 00047 00048 /** */ 00049 const SolverStatusCode& finalState() const {return finalState_;} 00050 00051 /** */ 00052 const std::string& finalMsg() const {return msg_;} 00053 00054 /** */ 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