16#ifndef dealii_trilinos_solver_h
17#define dealii_trilinos_solver_h
22#ifdef DEAL_II_WITH_TRILINOS
32# include <Epetra_LinearProblem.h>
33# include <Epetra_Operator.h>
36# ifdef DEAL_II_TRILINOS_WITH_BELOS
37# include <BelosBlockCGSolMgr.hpp>
38# include <BelosBlockGmresSolMgr.hpp>
39# include <BelosEpetraAdapter.hpp>
40# include <BelosIteration.hpp>
41# include <BelosMultiVec.hpp>
42# include <BelosOperator.hpp>
43# include <BelosSolverManager.hpp>
56 class PreconditionBase;
210 Epetra_MultiVector &
x,
211 const Epetra_MultiVector &b,
226 Epetra_MultiVector &
x,
227 const Epetra_MultiVector &b,
245 const ::Vector<double> &b,
262 const ::Vector<double> &b,
274 const ::LinearAlgebra::distributed::Vector<double> &b,
287 const ::LinearAlgebra::distributed::Vector<double> &b,
302 <<
"An error with error number " <<
arg1
303 <<
" occurred while calling a Trilinos function");
319 template <
typename Preconditioner>
326 template <
typename Preconditioner>
561 const ::LinearAlgebra::distributed::Vector<double> &b);
582 const ::Vector<double> &b);
593 const ::LinearAlgebra::distributed::Vector<double> &b);
606 <<
"An error with error number " <<
arg1
607 <<
" occurred while calling a Trilinos function");
636 std::unique_ptr<Amesos_BaseSolver>
solver;
646# ifdef DEAL_II_TRILINOS_WITH_BELOS
653 template <
typename VectorType>
710 template <
typename OperatorType,
typename PreconditionerType>
714 const VectorType & b,
715 const PreconditionerType &p);
730# ifdef DEAL_II_TRILINOS_WITH_BELOS
741 template <
class VectorType>
749 using value_type =
typename VectorType::value_type;
765 this->vectors.resize(1);
766 this->vectors[0].reset(
776 this->vectors.resize(1);
777 this->vectors[0].reset(
778 &
const_cast<VectorType &
>(vector),
799 vec = std::make_shared<VectorType>();
823 CloneCopy(
const std::vector<int> &index)
const
829 for (
unsigned int i = 0; i < index.size(); ++i)
832 this->vectors.size(),
856 for (
unsigned int i = 0; i < index.size(); ++i)
859 this->vectors.size(),
863 this->vectors[index[i]].get(),
878 CloneView(
const std::vector<int> &index)
const
884 for (
unsigned int i = 0; i < index.size(); ++i)
887 this->vectors.size(),
891 this->vectors[index[i]].get(),
908 for (
unsigned int i = 1; i < this->vectors.size(); ++i)
911 return this->vectors[0]->
size();
920 return vectors.
size();
930 const value_type
beta)
934 const unsigned int n_rows =
B.numRows();
935 const unsigned int n_cols =
B.numCols();
937 AssertThrow(n_rows ==
static_cast<unsigned int>(A.GetNumberVecs()),
942 for (
unsigned int i = 0; i < n_cols; ++i)
943 (*this->vectors[i]) *=
beta;
945 for (
unsigned int i = 0; i < n_cols; ++i)
946 for (
unsigned int j = 0;
j < n_rows; ++
j)
947 this->vectors[i]->add(
alpha *
B(
j, i), *A.vectors[
j]);
956 const value_type
beta,
962 AssertThrow(this->vectors.size() == A.vectors.size(),
967 for (
unsigned int i = 0; i < this->vectors.size(); ++i)
969 this->vectors[i]->equ(
alpha, *A.vectors[i]);
970 this->vectors[i]->add(
beta, *
B.vectors[i]);
980 for (
unsigned int i = 0; i < this->vectors.size(); ++i)
981 (*this->vectors[i]) *=
alpha;
1005 const unsigned int n_rows =
B.numRows();
1006 const unsigned int n_cols =
B.numCols();
1008 AssertThrow(n_rows ==
static_cast<unsigned int>(A.GetNumberVecs()),
1013 for (
unsigned int i = 0; i < n_rows; ++i)
1014 for (
unsigned int j = 0;
j < n_cols; ++
j)
1015 B(i,
j) =
alpha * ((*A.vectors[i]) * (*this->vectors[
j]));
1024 std::vector<value_type> & b)
const
1028 AssertThrow(this->vectors.size() == A.vectors.size(),
1032 for (
unsigned int i = 0; i < this->vectors.size(); ++i)
1033 b[i] = (*this->vectors[i]) * (*A.vectors[i]);
1041 std::vector<
typename Teuchos::ScalarTraits<value_type>::magnitudeType>
1048 for (
unsigned int i = 0; i < this->vectors.size(); ++i)
1049 normvec[i] = this->vectors[i]->l2_norm();
1057 const std::vector<int> & index)
1087 MvPrint(std::ostream &os)
const
1142# ifdef HAVE_BELOS_TSQR
1154 const typename Teuchos::ScalarTraits<value_type>::magnitudeType &)
1165 std::vector<std::shared_ptr<VectorType>> vectors;
1180 template <
class OperatorType,
class VectorType>
1188 using value_type =
typename VectorType::value_type;
1249 template <
typename VectorType>
1252 const AdditionalData & additional_data,
1253 const Teuchos::RCP<Teuchos::ParameterList> &belos_parameters)
1254 : solver_control(solver_control)
1255 , additional_data(additional_data)
1256 , belos_parameters(belos_parameters)
1261 template <
typename VectorType>
1262 template <
typename OperatorType,
typename PreconditionerType>
1267 const PreconditionerType &
P_dealii)
1269 using value_type =
typename VectorType::value_type;
1275 new internal::OperatorWrapper<OperatorType, VectorType>(
A_dealii));
1277 new internal::OperatorWrapper<PreconditionerType, VectorType>(
P_dealii));
1286 if (additional_data.right_preconditioning ==
false)
1299 const auto norm_0 = r.l2_norm();
1305 solver_control.tolerance() /
norm_0;
1306 const unsigned int max_steps = solver_control.max_steps();
1320 static_cast<int>(max_steps));
1324 if (additional_data.solver_name == SolverName::cg)
1328 else if (additional_data.solver_name == SolverName::gmres)
1335 const auto flag = solver->solve();
1337 solver_control.check(solver->getNumIters(), solver->achievedTol() *
norm_0);
1339 AssertThrow(flag == Belos::ReturnType::Converged ||
1342 (solver_control.last_step() == max_steps)),
1344 solver_control.last_value()));
void reinit(value_type *starting_element, const std::size_t n_elements)
@ iterate
Continue iteration.
virtual ~SolverBase()=default
SolverControl & control() const
void solve(const SparseMatrix &A, MPI::Vector &x, const MPI::Vector &b, const PreconditionBase &preconditioner)
const AdditionalData additional_data
std::unique_ptr< AztecOO_StatusTest > status_test
void set_preconditioner(AztecOO &solver, const Preconditioner &preconditioner)
SolverControl & solver_control
void do_solve(const Preconditioner &preconditioner)
void solve(Epetra_Operator &A, ::LinearAlgebra::distributed::Vector< double > &x, const ::LinearAlgebra::distributed::Vector< double > &b, const PreconditionBase &preconditioner)
std::unique_ptr< Epetra_LinearProblem > linear_problem
enum TrilinosWrappers::SolverBase::SolverName solver_name
void solve(const SparseMatrix &A, ::LinearAlgebra::distributed::Vector< double > &x, const ::LinearAlgebra::distributed::Vector< double > &b, const PreconditionBase &preconditioner)
SolverBelos(SolverControl &solver_control, const AdditionalData &additional_data, const Teuchos::RCP< Teuchos::ParameterList > &belos_parameters)
const AdditionalData additional_data
enum TrilinosWrappers::SolverBelos::SolverName solver_name
void solve(const OperatorType &a, VectorType &x, const VectorType &b, const PreconditionerType &p)
SolverControl & solver_control
const Teuchos::RCP< Teuchos::ParameterList > & belos_parameters
void solve(const SparseMatrix &A, ::LinearAlgebra::distributed::Vector< double > &x, const ::LinearAlgebra::distributed::Vector< double > &b)
const AdditionalData additional_data
virtual ~SolverDirect()=default
void initialize(const SparseMatrix &A)
std::unique_ptr< Amesos_BaseSolver > solver
SolverControl & solver_control
void solve(MPI::Vector &x, const MPI::Vector &b)
std::unique_ptr< Epetra_LinearProblem > linear_problem
SolverControl & control() const
#define DEAL_II_NAMESPACE_OPEN
#define DEAL_II_NAMESPACE_CLOSE
static ::ExceptionBase & ExcTrilinosError(int arg1)
static ::ExceptionBase & ExcTrilinosError(int arg1)
static ::ExceptionBase & ExcNotImplemented()
#define Assert(cond, exc)
#define AssertDimension(dim1, dim2)
#define AssertIndexRange(index, range)
static ::ExceptionBase & ExcInternalError()
#define DeclException1(Exception1, type1, outsequence)
#define AssertThrow(cond, exc)
::VectorizedArray< Number, width > max(const ::VectorizedArray< Number, width > &, const ::VectorizedArray< Number, width > &)
const unsigned int gmres_restart_parameter
const bool output_solver_details
AdditionalData(const SolverName solver_name=SolverName::cg, const bool right_preconditioning=false)
bool right_preconditioning
bool output_solver_details