Go to the documentation of this file.00001 #include "TSFAmesosSolver.hpp"
00002 #include "TSFEpetraVector.hpp"
00003 #include "TSFEpetraMatrix.hpp"
00004
00005
00006
00007 #ifndef HAVE_TEUCHOS_EXPLICIT_INSTANTIATION
00008 #include "TSFVectorImpl.hpp"
00009 #include "TSFLinearOperatorImpl.hpp"
00010 #include "TSFLinearSolverImpl.hpp"
00011 #endif
00012
00013 #include "Amesos.h"
00014 #include "Amesos_BaseSolver.h"
00015
00016 using namespace TSFExtended;
00017 using namespace Teuchos;
00018
00019
00020 AmesosSolver::AmesosSolver(const ParameterList& params)
00021 : LinearSolverBase<double>(params),
00022 kernel_()
00023 {
00024 setName("AmesosSolver");
00025 if (parameters().isParameter("Kernel"))
00026 {
00027 kernel_ = getParameter<string>(parameters(), "Kernel");
00028 }
00029 else
00030 {
00031 kernel_ = "Klu";
00032 }
00033 }
00034
00035
00036
00037 SolverState<double> AmesosSolver::solve(const LinearOperator<double>& op,
00038 const Vector<double>& rhs,
00039 Vector<double>& soln) const
00040 {
00041 TSFExtended::Vector<double> bCopy = rhs.copy();
00042 TSFExtended::Vector<double> xCopy = rhs.copy();
00043
00044 Epetra_Vector* b = EpetraVector::getConcretePtr(bCopy);
00045 Epetra_Vector* x = EpetraVector::getConcretePtr(xCopy);
00046
00047 Epetra_CrsMatrix& A = EpetraMatrix::getConcrete(op);
00048
00049 Epetra_LinearProblem prob(&A, x, b);
00050
00051 Amesos amFactory;
00052 RCP<Amesos_BaseSolver> solver
00053 = rcp(amFactory.Create("Amesos_" + kernel_, prob));
00054 TEST_FOR_EXCEPTION(solver.get()==0, std::runtime_error,
00055 "AmesosSolver::solve() failed to instantiate "
00056 << kernel_ << "solver kernel");
00057
00058 int ierr = solver->Solve();
00059
00060 soln = xCopy;
00061
00062 SolverStatusCode state;
00063 std::string msg;
00064
00065 switch(ierr)
00066 {
00067 case 0:
00068 state = SolveConverged;
00069 msg = "converged";
00070 break;
00071 default:
00072 state = SolveCrashed;
00073 msg = "amesos failed: ierr=" + Teuchos::toString(ierr);
00074 }
00075
00076 SolverState<double> rtn(state, "Amesos solver " + msg, 0, 0);
00077 return rtn;
00078 }
00079