Reference documentation for deal.II version 9.1.0-pre
trilinos_solver.h
1 // ---------------------------------------------------------------------
2 //
3 // Copyright (C) 2008 - 2018 by the deal.II authors
4 //
5 // This file is part of the deal.II library.
6 //
7 // The deal.II library is free software; you can use it, redistribute
8 // it, and/or modify it under the terms of the GNU Lesser General
9 // Public License as published by the Free Software Foundation; either
10 // version 2.1 of the License, or (at your option) any later version.
11 // The full text of the license can be found in the file LICENSE.md at
12 // the top level directory of deal.II.
13 //
14 // ---------------------------------------------------------------------
15 
16 #ifndef dealii_trilinos_solver_h
17 # define dealii_trilinos_solver_h
18 
19 
20 # include <deal.II/base/config.h>
21 
22 # ifdef DEAL_II_WITH_TRILINOS
23 
24 # include <deal.II/lac/exceptions.h>
25 # include <deal.II/lac/la_parallel_vector.h>
26 # include <deal.II/lac/solver_control.h>
27 # include <deal.II/lac/vector.h>
28 
29 # include <Amesos.h>
30 # include <AztecOO.h>
31 # include <Epetra_LinearProblem.h>
32 # include <Epetra_Operator.h>
33 
34 # include <memory>
35 
36 
37 DEAL_II_NAMESPACE_OPEN
38 
39 namespace TrilinosWrappers
40 {
41  // forward declarations
42  class SparseMatrix;
43  class PreconditionBase;
44 
45 
65  class SolverBase
66  {
67  public:
76  {
80  cg,
84  cgs,
97  } solver_name;
98 
104  {
113  explicit AdditionalData(const bool output_solver_details = false,
114  const unsigned int gmres_restart_parameter = 30);
115 
121 
125  const unsigned int gmres_restart_parameter;
126  };
127 
132  const AdditionalData &data = AdditionalData());
133 
138  SolverBase(const enum SolverName solver_name,
139  SolverControl & cn,
140  const AdditionalData &data = AdditionalData());
141 
145  virtual ~SolverBase() = default;
146 
152  void
153  solve(const SparseMatrix & A,
154  MPI::Vector & x,
155  const MPI::Vector & b,
156  const PreconditionBase &preconditioner);
157 
165  void
166  solve(const Epetra_Operator & A,
167  MPI::Vector & x,
168  const MPI::Vector & b,
169  const PreconditionBase &preconditioner);
170 
180  void
181  solve(const Epetra_Operator &A,
182  MPI::Vector & x,
183  const MPI::Vector & b,
184  const Epetra_Operator &preconditioner);
185 
195  void
196  solve(const Epetra_Operator & A,
197  Epetra_MultiVector & x,
198  const Epetra_MultiVector &b,
199  const PreconditionBase & preconditioner);
200 
211  void
212  solve(const Epetra_Operator & A,
213  Epetra_MultiVector & x,
214  const Epetra_MultiVector &b,
215  const Epetra_Operator & preconditioner);
216 
217 
218 
229  void
230  solve(const SparseMatrix & A,
231  ::Vector<double> & x,
232  const ::Vector<double> &b,
233  const PreconditionBase & preconditioner);
234 
246  void
247  solve(Epetra_Operator & A,
248  ::Vector<double> & x,
249  const ::Vector<double> &b,
250  const PreconditionBase & preconditioner);
251 
258  void
259  solve(const SparseMatrix & A,
261  const ::LinearAlgebra::distributed::Vector<double> &b,
262  const PreconditionBase &preconditioner);
263 
271  void
272  solve(Epetra_Operator & A,
274  const ::LinearAlgebra::distributed::Vector<double> &b,
275  const PreconditionBase &preconditioner);
276 
277 
281  SolverControl &
282  control() const;
283 
288  int,
289  << "An error with error number " << arg1
290  << " occurred while calling a Trilinos function");
291 
292  protected:
300 
301  private:
306  template <typename Preconditioner>
307  void
308  do_solve(const Preconditioner &preconditioner);
309 
313  template <typename Preconditioner>
314  void
315  set_preconditioner(AztecOO &solver, const Preconditioner &preconditioner);
316 
322  std::unique_ptr<Epetra_LinearProblem> linear_problem;
323 
328  std::unique_ptr<AztecOO_StatusTest> status_test;
329 
334  AztecOO solver;
335 
340  };
341 
342 
343  // provide a declaration for two explicit specializations
344  template <>
345  void
347  const PreconditionBase &preconditioner);
348 
349  template <>
350  void
352  const Epetra_Operator &preconditioner);
353 
354 
355 
362  class SolverCG : public SolverBase
363  {
364  public:
370  {
374  explicit AdditionalData(const bool output_solver_details = false);
375  };
376 
384  SolverCG(SolverControl &cn, const AdditionalData &data = AdditionalData());
385 
386  protected:
391  };
392 
393 
394 
401  class SolverCGS : public SolverBase
402  {
403  public:
408  {
412  explicit AdditionalData(const bool output_solver_details = false);
413  };
414 
423 
424  protected:
429  };
430 
431 
432 
439  class SolverGMRES : public SolverBase
440  {
441  public:
446  {
451  explicit AdditionalData(const bool output_solver_details = false,
452  const unsigned int restart_parameter = 30);
453  };
454 
463  const AdditionalData &data = AdditionalData());
464 
465  protected:
470  };
471 
472 
473 
481  class SolverBicgstab : public SolverBase
482  {
483  public:
488  {
492  explicit AdditionalData(const bool output_solver_details = false);
493  };
494 
503  const AdditionalData &data = AdditionalData());
504 
505  protected:
510  };
511 
512 
513 
521  class SolverTFQMR : public SolverBase
522  {
523  public:
528  {
532  explicit AdditionalData(const bool output_solver_details = false);
533  };
534 
543  const AdditionalData &data = AdditionalData());
544 
545  protected:
550  };
551 
552 
553 
568  {
569  public:
575  {
579  explicit AdditionalData(const bool output_solver_details = false,
580  const std::string &solver_type = "Amesos_Klu");
581 
587 
606  std::string solver_type;
607  };
608 
613  const AdditionalData &data = AdditionalData());
614 
618  virtual ~SolverDirect() = default;
619 
626  void
627  initialize(const SparseMatrix &A);
628 
634  void
635  solve(MPI::Vector &x, const MPI::Vector &b);
636 
642  void
644  const ::LinearAlgebra::distributed::Vector<double> &b);
645 
652  void
653  solve(const SparseMatrix &A, MPI::Vector &x, const MPI::Vector &b);
654 
662  void
663  solve(const SparseMatrix & A,
664  ::Vector<double> & x,
665  const ::Vector<double> &b);
666 
673  void
674  solve(const SparseMatrix & A,
676  const ::LinearAlgebra::distributed::Vector<double> &b);
677 
681  SolverControl &
682  control() const;
683 
688  int,
689  << "An error with error number " << arg1
690  << " occurred while calling a Trilinos function");
691 
692  private:
697  void
698  do_solve();
699 
707 
713  std::unique_ptr<Epetra_LinearProblem> linear_problem;
714 
719  std::unique_ptr<Amesos_BaseSolver> solver;
720 
725  };
726 
727 } // namespace TrilinosWrappers
728 
729 DEAL_II_NAMESPACE_CLOSE
730 
731 # endif // DEAL_II_WITH_TRILINOS
732 
733 /*---------------------------- trilinos_solver.h ---------------------------*/
734 
735 #endif
736 /*---------------------------- trilinos_solver.h ---------------------------*/
void set_preconditioner(AztecOO &solver, const Preconditioner &preconditioner)
std::unique_ptr< Amesos_BaseSolver > solver
const AdditionalData additional_data
std::unique_ptr< AztecOO_StatusTest > status_test
const AdditionalData additional_data
const AdditionalData additional_data
static::ExceptionBase & ExcTrilinosError(int arg1)
const AdditionalData additional_data
void do_solve(const Preconditioner &preconditioner)
virtual ~SolverBase()=default
#define DeclException1(Exception1, type1, outsequence)
Definition: exceptions.h:408
SolverControl & control() const
std::unique_ptr< Epetra_LinearProblem > linear_problem
void solve(const SparseMatrix &A, MPI::Vector &x, const MPI::Vector &b, const PreconditionBase &preconditioner)
std::unique_ptr< Epetra_LinearProblem > linear_problem
SolverBase(SolverControl &cn, const AdditionalData &data=AdditionalData())
const AdditionalData additional_data
const AdditionalData additional_data
AdditionalData(const bool output_solver_details=false, const unsigned int gmres_restart_parameter=30)
const AdditionalData additional_data