00001
00002
00003
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
00033
00034
00035
00036 template <class Scalar>
00037 class LinearSolver : public Playa::Handle<LinearSolverBase<Scalar> >
00038 {
00039 public:
00040
00041 LinearSolver() : Playa::Handle<LinearSolverBase<Scalar> >() {;}
00042
00043 LinearSolver( Playa::Handleable<LinearSolverBase<Scalar> >* rawPtr)
00044 : Playa::Handle<LinearSolverBase<Scalar> >(rawPtr) {;}
00045
00046 LinearSolver(const RCP<LinearSolverBase<Scalar> >& smartPtr)
00047 : Playa::Handle<LinearSolverBase<Scalar> >(smartPtr) {;}
00048
00049
00050
00051 void updateTolerance(const double& tol) {this->ptr()->updateTolerance(tol);}
00052
00053
00054 void setUserPrec(const LinearOperator<Scalar>& op,
00055 const LinearSolver<Scalar>& pSolver) ;
00056
00057
00058 void setUserPrec(const PreconditionerFactory<Scalar>& pf);
00059
00060
00061
00062 SolverState<Scalar> solve(const LinearOperator<Scalar>& op,
00063 const Vector<Scalar>& rhs,
00064 Vector<Scalar>& soln) const ;
00065
00066
00067
00068
00069 const ParameterList& parameters() const ;
00070
00071
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