PlayaLinearSolverDecl.hpp

00001 /* @HEADER@ */
00002 //
00003  /* @HEADER@ */
00004 
00005 
00006 #ifndef PLAYA_LINEARSOLVERDECL_HPP
00007 #define PLAYA_LINEARSOLVERDECL_HPP
00008 
00009 #include "PlayaTabs.hpp"
00010 #include "PlayaHandle.hpp"
00011 #include "PlayaHandleable.hpp"
00012 #include "PlayaLinearSolverBaseDecl.hpp"
00013 #include "Teuchos_TimeMonitor.hpp"
00014 
00015 
00016 #ifndef HAVE_TEUCHOS_EXPLICIT_INSTANTIATION
00017 #include "PlayaLinearSolverBaseImpl.hpp"
00018 #include "PlayaLinearOperatorImpl.hpp"
00019 #endif
00020 
00021 inline static Teuchos::Time& solveTimer() 
00022 {
00023   static Teuchos::RCP<Teuchos::Time> rtn 
00024     = Teuchos::TimeMonitor::getNewTimer("linear solve"); 
00025   return *rtn;
00026 }
00027 
00028 namespace Playa
00029 {
00030 using namespace Teuchos;
00031 
00032   
00036 template <class Scalar>
00037 class LinearSolver : public Playa::Handle<LinearSolverBase<Scalar> >
00038 {
00039 public:
00041   LinearSolver() : Playa::Handle<LinearSolverBase<Scalar> >() {;}
00043   LinearSolver( Playa::Handleable<LinearSolverBase<Scalar> >* rawPtr) 
00044     : Playa::Handle<LinearSolverBase<Scalar> >(rawPtr) {;}
00046   LinearSolver(const RCP<LinearSolverBase<Scalar> >& smartPtr)
00047     : Playa::Handle<LinearSolverBase<Scalar> >(smartPtr) {;}
00048 
00049 
00051   void updateTolerance(const double& tol) {this->ptr()->updateTolerance(tol);}
00052 
00054   void setUserPrec(const LinearOperator<Scalar>& op,
00055     const LinearSolver<Scalar>& pSolver) ;
00056 
00058   void setUserPrec(const PreconditionerFactory<Scalar>& pf);
00059 
00060 
00062   SolverState<Scalar> solve(const LinearOperator<Scalar>& op,
00063     const Vector<Scalar>& rhs,
00064     Vector<Scalar>& soln) const ;
00065     
00066     
00067 
00069   const ParameterList& parameters() const ;
00070 
00072   ParameterList& parameters() ;
00073 };
00074 
00075   
00076 template <class Scalar> inline 
00077 SolverState<Scalar> LinearSolver<Scalar>
00078 ::solve(const LinearOperator<Scalar>& op,
00079   const Vector<Scalar>& rhs,
00080   Vector<Scalar>& soln) const
00081 {
00082   Tabs tab;
00083   TEUCHOS_TEST_FOR_EXCEPTION(this->ptr().get()==0, std::runtime_error,
00084     "null pointer in LinearSolver<Scalar>::solve()");
00085 
00086   TEUCHOS_TEST_FOR_EXCEPTION(rhs.ptr().get()==0, std::runtime_error,
00087     "null rhs pointer in LinearSolver<Scalar>::solve()");
00088 
00089   TEUCHOS_TEST_FOR_EXCEPTION(op.ptr().get()==0, std::runtime_error,
00090     "null op pointer in LinearSolver<Scalar>::solve()");
00091 
00092   TimeMonitor timer(solveTimer());
00093 
00094   PLAYA_MSG1(this->ptr()->verb() * (MPIComm::world().getRank()==0), 
00095     tab << "Solver(" << this->description() << ") starting solve");
00096 
00097   SolverState<Scalar> rtn = this->ptr()->solve(op, rhs, soln);
00098 
00099   PLAYA_MSG1(this->ptr()->verb() * (MPIComm::world().getRank()==0), 
00100     tab << "Solver(" << this->description() << ") done solve:");
00101   Tabs tab1;
00102   PLAYA_MSG2(this->ptr()->verb() * (MPIComm::world().getRank()==0), 
00103     tab << "state=" << rtn);
00104 
00105   return rtn;    
00106 }
00107 
00108 template <class Scalar> inline 
00109 const ParameterList& LinearSolver<Scalar>::parameters() const 
00110 {
00111   TEUCHOS_TEST_FOR_EXCEPTION(this->ptr().get()==0, std::runtime_error,
00112     "null pointer in LinearSolver<Scalar>::parameters()");
00113   return this->ptr()->parameters();
00114 }
00115 
00116 template <class Scalar> inline 
00117 ParameterList& LinearSolver<Scalar>::parameters() 
00118 {
00119   TEUCHOS_TEST_FOR_EXCEPTION(this->ptr().get()==0, std::runtime_error,
00120     "null pointer in LinearSolver<Scalar>::parameters()");
00121   return this->ptr()->parameters();
00122 }
00123 
00124   
00125 
00126   
00127 
00128 }
00129 
00130 #endif

doxygen