Go to the documentation of this file.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
00030
00031
00032
00033
00034
00035
00036
00037
00038
00039
00040
00041
00042
00043 #include "PlayaAmesosSolver.hpp"
00044 #include "PlayaEpetraVector.hpp"
00045 #include "PlayaEpetraMatrix.hpp"
00046
00047
00048
00049 #ifndef HAVE_TEUCHOS_EXPLICIT_INSTANTIATION
00050 #include "PlayaVectorImpl.hpp"
00051 #include "PlayaLinearOperatorImpl.hpp"
00052 #include "PlayaLinearSolverImpl.hpp"
00053 #endif
00054
00055 #include "Amesos.h"
00056 #include "Amesos_BaseSolver.h"
00057
00058
00059 using namespace Teuchos;
00060
00061 namespace Playa
00062 {
00063
00064 AmesosSolver::AmesosSolver(const ParameterList& params)
00065 : LinearSolverBase<double>(params),
00066 kernel_()
00067 {
00068 if (parameters().isParameter("Kernel"))
00069 {
00070 kernel_ = getParameter<string>(parameters(), "Kernel");
00071 }
00072 else
00073 {
00074 kernel_ = "Klu";
00075 }
00076 }
00077
00078
00079
00080 SolverState<double> AmesosSolver::solve(const LinearOperator<double>& op,
00081 const Vector<double>& rhs,
00082 Vector<double>& soln) const
00083 {
00084 Playa::Vector<double> bCopy = rhs.copy();
00085 Playa::Vector<double> xCopy = rhs.copy();
00086
00087 Epetra_Vector* b = EpetraVector::getConcretePtr(bCopy);
00088 Epetra_Vector* x = EpetraVector::getConcretePtr(xCopy);
00089
00090 Epetra_CrsMatrix& A = EpetraMatrix::getConcrete(op);
00091
00092 Epetra_LinearProblem prob(&A, x, b);
00093
00094 Amesos amFactory;
00095 RCP<Amesos_BaseSolver> solver
00096 = rcp(amFactory.Create("Amesos_" + kernel_, prob));
00097 TEUCHOS_TEST_FOR_EXCEPTION(solver.get()==0, std::runtime_error,
00098 "AmesosSolver::solve() failed to instantiate "
00099 << kernel_ << "solver kernel");
00100
00101 int ierr = solver->Solve();
00102
00103 soln = xCopy;
00104
00105 SolverStatusCode state;
00106 std::string msg;
00107
00108 switch(ierr)
00109 {
00110 case 0:
00111 state = SolveConverged;
00112 msg = "converged";
00113 break;
00114 default:
00115 state = SolveCrashed;
00116 msg = "amesos failed: ierr=" + Teuchos::toString(ierr);
00117 }
00118
00119 SolverState<double> rtn(state, "Amesos solver " + msg, 0, 0);
00120 return rtn;
00121 }
00122
00123 }