18#ifdef DEAL_II_WITH_TRILINOS
26# include <AztecOO_StatusTest.h>
27# include <AztecOO_StatusTestCombo.h>
28# include <AztecOO_StatusTestMaxIters.h>
29# include <AztecOO_StatusTestResNorm.h>
30# include <AztecOO_StatusType.h>
41 const bool output_solver_details,
42 const unsigned int gmres_restart_parameter)
43 : output_solver_details(output_solver_details)
44 , gmres_restart_parameter(gmres_restart_parameter)
60 : solver_name(solver_name)
62 , additional_data(data)
86 const_cast<Epetra_MultiVector *
>(&b.trilinos_vector()));
104 std::make_unique<Epetra_LinearProblem>(
const_cast<Epetra_Operator *
>(&A),
105 &
x.trilinos_vector(),
106 const_cast<Epetra_MultiVector *
>(
107 &b.trilinos_vector()));
125 std::make_unique<Epetra_LinearProblem>(
const_cast<Epetra_Operator *
>(&A),
126 &
x.trilinos_vector(),
127 const_cast<Epetra_MultiVector *
>(
128 &b.trilinos_vector()));
139 Epetra_MultiVector &
x,
140 const Epetra_MultiVector &b,
146 std::make_unique<Epetra_LinearProblem>(
const_cast<Epetra_Operator *
>(&A),
148 const_cast<Epetra_MultiVector *
>(
160 Epetra_MultiVector &
x,
161 const Epetra_MultiVector &b,
167 std::make_unique<Epetra_LinearProblem>(
const_cast<Epetra_Operator *
>(&A),
169 const_cast<Epetra_MultiVector *
>(
180 const ::Vector<double> &b,
188 ExcMessage(
"Can only work in serial when using deal.II vectors."));
190 ExcMessage(
"Matrix is not compressed. Call compress() method."));
195 const_cast<double *
>(b.
begin()));
210 const ::Vector<double> &b,
215 A.OperatorRangeMap(),
216 const_cast<double *
>(b.
begin()));
230 const ::LinearAlgebra::distributed::Vector<double> &b,
243 const_cast<double *
>(b.
begin()));
258 const ::LinearAlgebra::distributed::Vector<double> &b,
259 const PreconditionBase &preconditioner)
266 A.OperatorRangeMap(),
267 const_cast<double *
>(b.
begin()));
285 ExcMessage(
"Residual multivector holds more than one vector"));
292 class TrilinosReductionControl :
public AztecOO_StatusTest
295 TrilinosReductionControl(
const int max_steps,
296 const double tolerance,
297 const double reduction,
298 const Epetra_LinearProblem &linear_problem);
300 virtual ~TrilinosReductionControl()
override =
default;
334 virtual std::ostream &
335 Print(std::ostream &stream,
int indent = 0)
const override
362 TrilinosReductionControl::TrilinosReductionControl(
364 const double tolerance,
365 const double reduction,
366 const Epetra_LinearProblem &linear_problem)
377 std::make_unique<AztecOO_StatusTestMaxIters>(max_steps);
380 Assert(linear_problem.GetRHS()->NumVectors() == 1,
381 ExcMessage(
"RHS multivector holds more than one vector"));
385 *linear_problem.GetOperator(),
386 *(linear_problem.GetLHS()->operator()(0)),
387 *(linear_problem.GetRHS()->operator()(0)),
397 *linear_problem.GetOperator(),
398 *(linear_problem.GetLHS()->operator()(0)),
399 *(linear_problem.GetRHS()->operator()(0)),
413 template <
typename Preconditioner>
420 solver.SetProblem(*linear_problem);
434 additional_data.gmres_restart_parameter);
447 set_preconditioner(solver, preconditioner);
451 additional_data.output_solver_details ?
AZ_all :
473 status_test = std::make_unique<internal::TrilinosReductionControl>(
478 solver.SetStatusTest(status_test.get());
484 solver.Iterate(solver_control.max_steps(), solver_control.tolerance());
494 "option not implemented"));
499 "numerical breakdown"));
504 "loss of precision"));
509 "GMRES Hessenberg ill-conditioned"));
522 if (
const internal::TrilinosReductionControl
524 dynamic_cast<const internal::TrilinosReductionControl *
const>(
533 if (solver.NumIters() > 0)
538 solver_control.check(
540 solver_control.check(
545 solver_control.check(
552 solver_control.check(solver.NumIters(), solver.TrueResidual());
558 solver_control.last_value()));
565 SolverBase::set_preconditioner(AztecOO & solver,
572 const int ierr = solver.SetPrecOperator(
583 SolverBase::set_preconditioner(AztecOO & solver,
587 solver.SetPrecOperator(
const_cast<Epetra_Operator *
>(&preconditioner));
631 const std::string &solver_type)
632 : output_solver_details(output_solver_details)
633 , solver_type(solver_type)
679 std::string(
"You tried to select the solver type <") +
681 "> but this solver is not supported by Trilinos either "
682 "because it does not exist, or because Trilinos was not "
683 "configured for its use."));
688 verbose_cout <<
"Starting symbolic factorization" << std::endl;
692 verbose_cout <<
"Starting numeric factorization" << std::endl;
706 const_cast<Epetra_MultiVector *
>(&b.trilinos_vector()));
729 const ::LinearAlgebra::distributed::Vector<double> &b)
736 const_cast<double *
>(b.
begin()));
779 std::string(
"You tried to select the solver type <") +
781 "> but this solver is not supported by Trilinos either "
782 "because it does not exist, or because Trilinos was not "
783 "configured for its use."));
788 verbose_cout <<
"Starting symbolic factorization" << std::endl;
792 verbose_cout <<
"Starting numeric factorization" << std::endl;
821 &
x.trilinos_vector(),
822 const_cast<Epetra_MultiVector *
>(&b.trilinos_vector()));
832 const ::Vector<double> &b)
839 ExcMessage(
"Can only work in serial when using deal.II vectors."));
843 const_cast<double *
>(b.
begin()));
859 const ::LinearAlgebra::distributed::Vector<double> &b)
868 const_cast<double *
>(b.
begin()));
SolverCG(SolverControl &cn, VectorMemory< VectorType > &mem, const AdditionalData &data=AdditionalData())
unsigned int last_step() const
double last_value() const
virtual State check(const unsigned int step, const double check_value)
@ success
Stop iteration, goal reached.
Teuchos::RCP< Epetra_Operator > preconditioner
SolverControl & control() const
void solve(const SparseMatrix &A, MPI::Vector &x, const MPI::Vector &b, const PreconditionBase &preconditioner)
const AdditionalData additional_data
SolverControl & solver_control
void do_solve(const Preconditioner &preconditioner)
std::unique_ptr< Epetra_LinearProblem > linear_problem
SolverBase(SolverControl &cn, const AdditionalData &data=AdditionalData())
enum TrilinosWrappers::SolverBase::SolverName solver_name
SolverBicgstab(SolverControl &cn, const AdditionalData &data=AdditionalData())
SolverCGS(SolverControl &cn, const AdditionalData &data=AdditionalData())
const AdditionalData additional_data
SolverDirect(SolverControl &cn, const AdditionalData &data=AdditionalData())
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
SolverGMRES(SolverControl &cn, const AdditionalData &data=AdditionalData())
SolverTFQMR(SolverControl &cn, const AdditionalData &data=AdditionalData())
const Epetra_CrsMatrix & trilinos_matrix() const
std::pair< size_type, size_type > local_range() const
#define DEAL_II_NAMESPACE_OPEN
#define DEAL_II_NAMESPACE_CLOSE
__global__ void reduction(Number *result, const Number *v, const size_type N)
static ::ExceptionBase & ExcTrilinosError(int arg1)
static ::ExceptionBase & ExcNotImplemented()
#define Assert(cond, exc)
#define AssertDimension(dim1, dim2)
static ::ExceptionBase & ExcInternalError()
static ::ExceptionBase & ExcDimensionMismatch(std::size_t arg1, std::size_t arg2)
static ::ExceptionBase & ExcTrilinosError(int arg1)
static ::ExceptionBase & ExcMessage(std::string arg1)
#define AssertThrow(cond, exc)
AdditionalData(const bool output_solver_details=false, const unsigned int gmres_restart_parameter=30)
AdditionalData(const bool output_solver_details=false, const std::string &solver_type="Amesos_Klu")
std::unique_ptr< AztecOO_StatusTestResNorm > status_test_abs_tol
std::unique_ptr< AztecOO_StatusTestResNorm > status_test_rel_tol
std::unique_ptr< AztecOO_StatusTestMaxIters > status_test_max_steps
std::unique_ptr< AztecOO_StatusTestCombo > status_test_collection