TSFAmesosSolver.cpp
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 

Site Contact