00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021
00022
00023
00024
00025
00026
00027
00028
00029 #ifndef MEROS_LINEAR_SOLVER_H
00030 #define MEROS_LINEAR_SOLVER_H
00031
00032 #include "Meros_LinearSolveStrategy.hpp"
00033 #include "Meros_InverseOperator.hpp"
00034
00035
00036 namespace Meros
00037 {
00038 using namespace Teuchos;
00039 using namespace Thyra;
00040
00044 template <class Scalar>
00045 class LinearSolver
00046 {
00047 public:
00049 LinearSolver(const LinearSolveStrategy<Scalar>& strategy,
00050 const LinearOperator<Scalar>& op)
00051 : lows_(strategy.getLOWS(op)),
00052 op_(op),
00053 strategy_(strategy)
00054 {;}
00055
00057 SolveStatus<typename PromotionTraits<Scalar, Scalar>::promote> solve(const Vector<Scalar>& rhs,
00058 Vector<Scalar>& soln) const
00059 {
00060
00061 SolveStatus<typename PromotionTraits<Scalar, Scalar>::promote> rtn;
00062
00063 BlockSolveCriteria<typename PromotionTraits<Scalar, Scalar>::promote>* dummy = 0;
00064 if (soln.ptr().get()==0) soln=op_.domain().createMember();
00065 lows_->solve(NONCONJ_ELE, *rhs.constPtr(),
00066 soln.ptr().get(), 1,
00067 dummy,
00068 &rtn);
00069
00070 return rtn;
00071 }
00072
00073 private:
00074 RCP<const LinearOpWithSolveBase<Scalar> > lows_;
00075 LinearOperator<Scalar> op_;
00076 LinearSolveStrategy<Scalar> strategy_;
00077
00078 };
00079
00080
00081 }
00082
00083 #endif // MEROS_PCD_OPERATOR_SOURCE_H