48 #ifndef AMESOS2_DETAILS_LINEARSOLVERFACTORY_DEF_HPP 49 #define AMESOS2_DETAILS_LINEARSOLVERFACTORY_DEF_HPP 51 #include "Amesos2_config.h" 53 #include "Amesos2_Solver.hpp" 54 #include "Trilinos_Details_LinearSolver.hpp" 55 #include "Trilinos_Details_LinearSolverFactory.hpp" 56 #include <type_traits> 59 #ifdef HAVE_TPETRA_INST_INT_INT 60 #ifdef HAVE_AMESOS2_EPETRA 61 # include "Epetra_CrsMatrix.h" 62 #endif // HAVE_AMESOS2_EPETRA 63 #endif // HAVE_TPETRA_INST_INT_INT 66 #ifndef HAVE_AMESOS2_TPETRA 67 # define HAVE_AMESOS2_TPETRA 68 #endif // HAVE_AMESOS2_TPETRA 70 #ifdef HAVE_AMESOS2_TPETRA 71 # include "Tpetra_CrsMatrix.hpp" 72 #endif // HAVE_AMESOS2_TPETRA 83 struct GetMatrixType {
87 #ifdef HAVE_TPETRA_INST_INT_INT 88 #ifdef HAVE_AMESOS2_EPETRA 89 static_assert(! std::is_same<OP, Epetra_MultiVector>::value,
90 "Amesos2::Details::GetMatrixType: OP = Epetra_MultiVector. " 91 "This probably means that you mixed up MV and OP.");
92 #endif // HAVE_AMESOS2_EPETRA 93 #endif // HAVE_TPETRA_INST_INT_INT 95 #ifdef HAVE_AMESOS2_TPETRA 96 static_assert(! std::is_same<OP, Tpetra::MultiVector<
typename OP::scalar_type,
97 typename OP::local_ordinal_type,
typename OP::global_ordinal_type,
98 typename OP::node_type> >::value,
99 "Amesos2::Details::GetMatrixType: OP = Tpetra::MultiVector. " 100 "This probably means that you mixed up MV and OP.");
101 #endif // HAVE_AMESOS2_TPETRA 104 #ifdef HAVE_TPETRA_INST_INT_INT 105 #ifdef HAVE_AMESOS2_EPETRA 107 struct GetMatrixType<Epetra_Operator> {
108 typedef Epetra_CrsMatrix type;
110 #endif // HAVE_AMESOS2_EPETRA 111 #endif // HAVE_TPETRA_INST_INT_INT 114 #ifdef HAVE_AMESOS2_TPETRA 115 template<
class S,
class LO,
class GO,
class NT>
116 struct GetMatrixType<Tpetra::Operator<S, LO, GO, NT> > {
117 typedef Tpetra::CrsMatrix<S, LO, GO, NT> type;
119 #endif // HAVE_AMESOS2_TPETRA 121 template<
class MV,
class OP,
class NormType>
123 public Trilinos::Details::LinearSolver<MV, OP, NormType>,
124 virtual public Teuchos::Describable
127 #ifdef HAVE_TPETRA_INST_INT_INT 128 #ifdef HAVE_AMESOS2_EPETRA 129 static_assert(! std::is_same<OP, Epetra_MultiVector>::value,
130 "Amesos2::Details::LinearSolver: OP = Epetra_MultiVector. " 131 "This probably means that you mixed up MV and OP.");
132 static_assert(! std::is_same<MV, Epetra_Operator>::value,
133 "Amesos2::Details::LinearSolver: MV = Epetra_Operator. " 134 "This probably means that you mixed up MV and OP.");
135 #endif // HAVE_AMESOS2_EPETRA 136 #endif // HAVE_TPETRA_INST_INT_INT 145 typedef typename GetMatrixType<OP>::type crs_matrix_type;
146 static_assert(! std::is_same<crs_matrix_type, int>::value,
147 "Amesos2::Details::LinearSolver: The given OP type is not " 166 LinearSolver (
const std::string& solverName) :
167 solverName_ (solverName)
175 if (solverName ==
"") {
177 if (Amesos2::query (
"klu2")) {
178 solverName_ =
"klu2";
180 else if (Amesos2::query (
"superlu")) {
181 solverName_ =
"superlu";
183 else if (Amesos2::query (
"superludist")) {
184 solverName_ =
"superludist";
186 else if (Amesos2::query (
"cholmod")) {
187 solverName_ =
"cholmod";
189 else if (Amesos2::query (
"basker")) {
190 solverName_ =
"basker";
192 else if (Amesos2::query (
"shylubasker")) {
193 solverName_ =
"shylubasker";
195 else if (Amesos2::query (
"ShyLUBasker")) {
196 solverName_ =
"shylubasker";
198 else if (Amesos2::query (
"superlumt")) {
199 solverName_ =
"superlumt";
201 else if (Amesos2::query (
"pardiso_mkl")) {
202 solverName_ =
"pardiso_mkl";
204 else if (Amesos2::query (
"mumps")) {
205 solverName_ =
"mumps";
207 else if (Amesos2::query (
"lapack")) {
208 solverName_ =
"lapack";
216 virtual ~LinearSolver () {}
222 void setMatrix (
const Teuchos::RCP<const OP>& A) {
225 using Teuchos::TypeNameTraits;
226 typedef crs_matrix_type MAT;
227 const char prefix[] =
"Amesos2::Details::LinearSolver::setMatrix: ";
230 solver_ = Teuchos::null;
238 RCP<const MAT> A_mat = Teuchos::rcp_dynamic_cast<
const MAT> (A);
239 TEUCHOS_TEST_FOR_EXCEPTION
240 (A_mat.is_null (), std::invalid_argument,
241 "Amesos2::Details::LinearSolver::setMatrix: " 242 "The input matrix A must be a CrsMatrix.");
243 if (solver_.is_null ()) {
250 RCP<solver_type> solver;
252 solver = Amesos2::create<MAT, MV> (solverName_, A_mat, null, null);
254 catch (std::exception& e) {
255 TEUCHOS_TEST_FOR_EXCEPTION
256 (
true, std::invalid_argument, prefix <<
"Failed to create Amesos2 " 257 "solver named \"" << solverName_ <<
"\". " 258 "Amesos2::create<MAT = " << TypeNameTraits<MAT>::name ()
259 <<
", MV = " << TypeNameTraits<MV>::name ()
260 <<
" threw an exception: " << e.what ());
262 TEUCHOS_TEST_FOR_EXCEPTION
263 (solver.is_null (), std::invalid_argument, prefix <<
"Failed to " 264 "create Amesos2 solver named \"" << solverName_ <<
"\". " 265 "Amesos2::create<MAT = " << TypeNameTraits<MAT>::name ()
266 <<
", MV = " << TypeNameTraits<MV>::name ()
267 <<
" returned null.");
270 if (! params_.is_null ()) {
271 solver->setParameters (params_);
274 }
else if (A_ != A) {
275 solver_->setA (A_mat);
284 Teuchos::RCP<const OP> getMatrix ()
const {
289 void solve (MV& X,
const MV& B) {
290 const char prefix[] =
"Amesos2::Details::LinearSolver::solve: ";
291 TEUCHOS_TEST_FOR_EXCEPTION
292 (solver_.is_null (), std::runtime_error, prefix <<
"The solver does not " 293 "exist yet. You must call setMatrix() with a nonnull matrix before you " 294 "may call this method.");
295 TEUCHOS_TEST_FOR_EXCEPTION
296 (A_.is_null (), std::runtime_error, prefix <<
"The matrix has not been " 297 "set yet. You must call setMatrix() with a nonnull matrix before you " 298 "may call this method.");
299 solver_->solve (&X, &B);
303 void setParameters (
const Teuchos::RCP<Teuchos::ParameterList>& params) {
304 if (! solver_.is_null ()) {
305 solver_->setParameters (params);
315 const char prefix[] =
"Amesos2::Details::LinearSolver::symbolic: ";
316 TEUCHOS_TEST_FOR_EXCEPTION
317 (solver_.is_null (), std::runtime_error, prefix <<
"The solver does not " 318 "exist yet. You must call setMatrix() with a nonnull matrix before you " 319 "may call this method.");
320 TEUCHOS_TEST_FOR_EXCEPTION
321 (A_.is_null (), std::runtime_error, prefix <<
"The matrix has not been " 322 "set yet. You must call setMatrix() with a nonnull matrix before you " 323 "may call this method.");
324 solver_->symbolicFactorization ();
330 const char prefix[] =
"Amesos2::Details::LinearSolver::numeric: ";
331 TEUCHOS_TEST_FOR_EXCEPTION
332 (solver_.is_null (), std::runtime_error, prefix <<
"The solver does not " 333 "exist yet. You must call setMatrix() with a nonnull matrix before you " 334 "may call this method.");
335 TEUCHOS_TEST_FOR_EXCEPTION
336 (A_.is_null (), std::runtime_error, prefix <<
"The matrix has not been " 337 "set yet. You must call setMatrix() with a nonnull matrix before you " 338 "may call this method.");
339 solver_->numericFactorization ();
343 std::string description ()
const {
344 using Teuchos::TypeNameTraits;
345 if (solver_.is_null ()) {
346 std::ostringstream os;
347 os <<
"\"Amesos2::Details::LinearSolver\": {" 348 <<
"MV: " << TypeNameTraits<MV>::name ()
349 <<
", OP: " << TypeNameTraits<OP>::name ()
350 <<
", NormType: " << TypeNameTraits<NormType>::name ()
354 return solver_->description ();
360 describe (Teuchos::FancyOStream& out,
361 const Teuchos::EVerbosityLevel verbLevel =
362 Teuchos::Describable::verbLevel_default)
const 364 using Teuchos::TypeNameTraits;
366 if (solver_.is_null ()) {
367 if (verbLevel > Teuchos::VERB_NONE) {
368 Teuchos::OSTab tab0 (out);
369 out <<
"\"Amesos2::Details::LinearSolver\":" << endl;
370 Teuchos::OSTab tab1 (out);
371 out <<
"MV: " << TypeNameTraits<MV>::name () << endl
372 <<
"OP: " << TypeNameTraits<OP>::name () << endl
373 <<
"NormType: " << TypeNameTraits<NormType>::name () << endl;
376 if (! solver_.is_null ()) {
377 solver_->describe (out, verbLevel);
382 std::string solverName_;
383 Teuchos::RCP<solver_type> solver_;
384 Teuchos::RCP<const OP> A_;
385 Teuchos::RCP<Teuchos::ParameterList> params_;
388 template<
class MV,
class OP,
class NormType>
389 Teuchos::RCP<Trilinos::Details::LinearSolver<MV, OP, NormType> >
394 return rcp (
new Amesos2::Details::LinearSolver<MV, OP, NormType> (solverName));
397 template<
class MV,
class OP,
class NormType>
402 #ifdef HAVE_TEUCHOSCORE_CXX11 403 typedef std::shared_ptr<Amesos2::Details::LinearSolverFactory<MV, OP, NormType> > ptr_type;
406 typedef Teuchos::RCP<Amesos2::Details::LinearSolverFactory<MV, OP, NormType> > ptr_type;
408 #endif // HAVE_TEUCHOSCORE_CXX11 411 Trilinos::Details::registerLinearSolverFactory<MV, OP, NormType> (
"Amesos2", factory);
424 #define AMESOS2_DETAILS_LINEARSOLVERFACTORY_INSTANT(SC, LO, GO, NT) \ 425 template class Amesos2::Details::LinearSolverFactory<Tpetra::MultiVector<SC, LO, GO, NT>, \ 426 Tpetra::Operator<SC, LO, GO, NT>, \ 427 typename Tpetra::MultiVector<SC, LO, GO, NT>::mag_type>; 429 #endif // AMESOS2_DETAILS_LINEARSOLVERFACTORY_DEF_HPP Interface for a "factory" that creates Amesos2 solvers.
Definition: Amesos2_Details_LinearSolverFactory_decl.hpp:77
Definition: Amesos2_AbstractConcreteMatrixAdapter.hpp:48
virtual Teuchos::RCP< Trilinos::Details::LinearSolver< MV, OP, NormType > > getLinearSolver(const std::string &solverName)
Get an instance of a Amesos2 solver.
Definition: Amesos2_Details_LinearSolverFactory_def.hpp:391
Interface to Amesos2 solver objects.
Definition: Amesos2_Solver_decl.hpp:78
static void registerLinearSolverFactory()
Register this LinearSolverFactory with the central registry.
Definition: Amesos2_Details_LinearSolverFactory_def.hpp:400
Contains declarations for Amesos2::create and Amesos2::query.