15#ifndef dealii_trilinos_tpetra_precondition_h
16#define dealii_trilinos_tpetra_precondition_h
26#ifdef DEAL_II_TRILINOS_WITH_TPETRA
33# include <Teuchos_BLAS_types.hpp>
34# include <Teuchos_ConfigDefs.hpp>
35# include <Teuchos_ParameterList.hpp>
36# include <Teuchos_RCPDecl.hpp>
37# include <Tpetra_Operator.hpp>
44 namespace TpetraWrappers
53 template <
typename Number,
typename MemorySpace = ::MemorySpace::Host>
131 Teuchos::RCP<TpetraTypes::LinearOperator<Number, MemorySpace>>
171 <<
"The sparse matrix the preconditioner is based on "
172 <<
"uses a map that is not compatible to the one in vector " << arg1
173 <<
". Check preconditioner and matrix setup.");
180 "The chosen preconditioner does not support transposing the matrix.");
188 Teuchos::RCP<TpetraTypes::LinearOperator<Number, MemorySpace>>
207# ifdef DEAL_II_TRILINOS_WITH_IFPACK2
217 template <
typename Number,
typename MemorySpace = ::MemorySpace::Host>
248 template <
typename Number,
typename MemorySpace = ::MemorySpace::Host>
249 class PreconditionIfpackBase :
public PreconditionBase<Number, MemorySpace>
261 PreconditionIfpackBase(
const std::string &preconditioner_type);
275 ExcTrilinosIpack2PreconditionerUnsupported,
277 <<
"You tried to select the preconditioner type <" << arg1 <<
">\n"
278 <<
"but this preconditioner is not supported by Trilinos/Ifpack22\n"
279 <<
"due to one of the following reasons:\n"
280 <<
"* This preconditioner does not exist\n"
281 <<
"* This preconditioner has a specialized constructor not supported by the Ifpack2 Factory.\n"
282 <<
"* This preconditioner is not (yet) supported by Trilinos/Ifpack2\n"
283 <<
"* Trilinos/Ifpack2 was not configured for its use.");
290 std::string preconditioner_type;
308 template <
typename Number,
typename MemorySpace = ::MemorySpace::Host>
309 class PreconditionIfpack
310 :
public PreconditionIfpackBase<Number, MemorySpace>
329 PreconditionIfpack(
const std::string &preconditioner_type);
341 set_parameter_list(Teuchos::ParameterList ¶meter_list);
353 template <
typename Number,
typename MemorySpace = ::MemorySpace::Host>
355 :
public PreconditionIfpackBase<Number, MemorySpace>
362 struct AdditionalData
375 AdditionalData(
const double omega = 1.,
376 const bool fix_diagonal =
false,
377 const double min_diagonal = 0.,
378 const int n_sweeps = 1);
422 const AdditionalData &additional_data = AdditionalData());
437 template <
typename Number,
typename MemorySpace = ::MemorySpace::Host>
438 class PreconditionL1Jacobi
439 :
public PreconditionIfpackBase<Number, MemorySpace>
446 struct AdditionalData
460 AdditionalData(
const double omega = 1.,
461 const bool fix_diagonal =
false,
462 const double min_diagonal = 0.,
463 const int n_sweeps = 1);
498 PreconditionL1Jacobi();
508 const AdditionalData &additional_data = AdditionalData());
524 template <
typename Number,
typename MemorySpace = ::MemorySpace::Host>
525 class PreconditionL1GaussSeidel
526 :
public PreconditionIfpackBase<Number, MemorySpace>
533 struct AdditionalData
548 AdditionalData(
const double omega = 1,
549 const double eta = 1.5,
550 const bool fix_diagonal =
false,
551 const double min_diagonal = 0,
552 const int n_sweeps = 1);
596 PreconditionL1GaussSeidel();
606 const AdditionalData &additional_data = AdditionalData());
620 template <
typename Number,
typename MemorySpace = ::MemorySpace::Host>
621 class PreconditionSOR :
public PreconditionIfpackBase<Number, MemorySpace>
628 struct AdditionalData
642 AdditionalData(
const double omega = 1.,
643 const int overlap = 0,
644 const bool fix_diagonal =
false,
645 const double min_diagonal = 0.,
646 const int n_sweeps = 1);
701 const AdditionalData &additional_data = AdditionalData());
712 template <
typename Number,
typename MemorySpace = ::MemorySpace::Host>
720 struct AdditionalData
734 AdditionalData(
const double omega = 1.,
735 const int overlap = 0,
736 const bool fix_diagonal =
false,
737 const double min_diagonal = 0.,
738 const int n_sweeps = 1);
794 const AdditionalData &additional_data = AdditionalData());
805 template <
typename Number,
typename MemorySpace = ::MemorySpace::Host>
807 :
public PreconditionIfpackBase<Number, MemorySpace>
814 struct AdditionalData
826 AdditionalData(
const int degree = 1,
827 const double max_eigenvalue = 10.,
828 const double min_eigenvalue = 1.,
829 const double eigenvalue_ratio = 30.,
830 const double min_diagonal = 1e-12,
831 const bool nonzero_starting =
false);
847 double max_eigenvalue;
852 double min_eigenvalue;
857 double eigenvalue_ratio;
878 bool nonzero_starting;
895 const AdditionalData &additional_data = AdditionalData());
917 template <
typename Number,
typename MemorySpace = ::MemorySpace::Host>
918 class PreconditionILU :
public PreconditionIfpackBase<Number, MemorySpace>
925 struct AdditionalData
940 AdditionalData(
const int ilu_fill = 0,
941 const double ilu_atol = 0.,
942 const double ilu_rtol = 1.,
943 const int overlap = 0);
989 const AdditionalData &additional_data = AdditionalData());
1001 template <
typename Number,
typename MemorySpace = ::MemorySpace::Host>
1002 class PreconditionILUT :
public PreconditionIfpackBase<Number, MemorySpace>
1009 struct AdditionalData
1025 AdditionalData(
const double ilut_drop = 0.,
1026 const double ilut_fill = 0.,
1027 const double ilut_atol = 0.,
1028 const double ilut_rtol = 1.,
1029 const int overlap = 0);
1086 const AdditionalData &additional_data = AdditionalData());
1104 template <
typename Number,
typename MemorySpace = ::MemorySpace::Host>
1106 :
public PreconditionIfpackBase<Number, MemorySpace>
1113 struct AdditionalData
1126 AdditionalData(
const int n_local_parts = 1,
1127 const double omega = 1.,
1128 const int block_overlap = 0,
1129 const int n_sweeps = 1);
1170 const AdditionalData &additional_data = AdditionalData());
1184 template <
typename Number,
typename MemorySpace = ::MemorySpace::Host>
1186 :
public PreconditionIfpackBase<Number, MemorySpace>
1193 struct AdditionalData
1205 AdditionalData(
const int n_local_parts = 1,
1206 const double omega = 1,
1207 const int overlap = 0,
1208 const int n_sweeps = 1);
1243 const AdditionalData &additional_data = AdditionalData());
1257 template <
typename Number,
typename MemorySpace = ::MemorySpace::Host>
1259 :
public PreconditionIfpackBase<Number, MemorySpace>
1266 struct AdditionalData
1278 AdditionalData(
const int n_local_parts = 1,
1279 const double omega = 1,
1280 const int overlap = 1,
1281 const int n_sweeps = 1);
1315 const AdditionalData &additional_data = AdditionalData());
IndexSet locally_owned_range_indices() const
virtual void Tvmult(Vector< Number, MemorySpace > &dst, const Vector< Number, MemorySpace > &src) const
Apply the transpose preconditioner.
IndexSet locally_owned_domain_indices() const
Teuchos::ParameterList parameter_list
The list of preconditioner parameters.
void clear()
Destructor. Destroys the preconditioner, leaving an object like just after having called the construc...
virtual void vmult(::Vector< Number > &dst, ::Vector< Number > &src) const
Apply the preconditioner.
Teuchos::RCP< TpetraTypes::LinearOperator< Number, MemorySpace > > preconditioner
Teuchos::RCP< TpetraTypes::LinearOperator< Number, MemorySpace > > trilinos_rcp() const
Access to underlying Trilinos data.
virtual void Tvmult(::Vector< Number > &dst, ::Vector< Number > &src) const
Apply the transpose preconditioner.
PreconditionBase()=default
Constructor. Does not do anything. The initialize function of the derived classes will have to create...
const TpetraTypes::LinearOperator< Number, MemorySpace > & trilinos_operator() const
Access to underlying Trilinos data.
virtual void vmult(Vector< Number, MemorySpace > &dst, const Vector< Number, MemorySpace > &src) const
Apply the preconditioner.
#define DEAL_II_NAMESPACE_OPEN
#define DEAL_II_NAMESPACE_CLOSE
static ::ExceptionBase & ExcNonMatchingMaps(std::string arg1)
#define DeclExceptionMsg(Exception, defaulttext)
#define DeclException1(Exception1, type1, outsequence)
static ::ExceptionBase & ExcTransposeNotSupported()
PETScWrappers::PreconditionILU PreconditionILU
Tpetra::Operator< Number, LO, GO, NodeType< MemorySpace > > LinearOperator
Standardized data struct to pipe additional flags to the preconditioner.