15#ifdef DEAL_II_WITH_TRILINOS
22# include <Epetra_MultiVector.h>
24# include <Ifpack_Chebyshev.h>
25# include <Teuchos_ParameterList.hpp>
26# include <Teuchos_RCP.hpp>
34#ifdef DEAL_II_WITH_TRILINOS
39 : communicator(MPI_COMM_SELF)
62 ExcMessage(
"Trying to dereference a null pointer."));
84 const double min_diagonal,
85 const unsigned int n_sweeps)
87 , min_diagonal(min_diagonal)
100 Ifpack().Create(
"point relaxation",
101 const_cast<Epetra_CrsMatrix *
>(&matrix.trilinos_matrix()),
104 Ifpack_Preconditioner *ifpack =
112 Teuchos::ParameterList parameter_list;
113 parameter_list.set(
"relaxation: sweeps",
114 static_cast<int>(additional_data.
n_sweeps));
115 parameter_list.set(
"relaxation: type",
"Jacobi");
116 parameter_list.set(
"relaxation: damping factor", additional_data.
omega);
117 parameter_list.set(
"relaxation: min diagonal value",
120 ierr = ifpack->SetParameters(parameter_list);
123 ierr = ifpack->Initialize();
126 ierr = ifpack->Compute();
135 const double min_diagonal,
136 const unsigned int overlap,
137 const unsigned int n_sweeps)
139 , min_diagonal(min_diagonal)
152 Ifpack().Create(
"point relaxation",
153 const_cast<Epetra_CrsMatrix *
>(&matrix.trilinos_matrix()),
156 Ifpack_Preconditioner *ifpack =
164 Teuchos::ParameterList parameter_list;
165 parameter_list.set(
"relaxation: sweeps",
166 static_cast<int>(additional_data.
n_sweeps));
167 parameter_list.set(
"relaxation: type",
"symmetric Gauss-Seidel");
168 parameter_list.set(
"relaxation: damping factor", additional_data.
omega);
169 parameter_list.set(
"relaxation: min diagonal value",
171 parameter_list.set(
"schwarz: combine mode",
"Add");
173 ierr = ifpack->SetParameters(parameter_list);
176 ierr = ifpack->Initialize();
179 ierr = ifpack->Compute();
188 const double min_diagonal,
189 const unsigned int overlap,
190 const unsigned int n_sweeps)
192 , min_diagonal(min_diagonal)
205 Ifpack().Create(
"point relaxation",
206 const_cast<Epetra_CrsMatrix *
>(&matrix.trilinos_matrix()),
209 Ifpack_Preconditioner *ifpack =
217 Teuchos::ParameterList parameter_list;
218 parameter_list.set(
"relaxation: sweeps",
219 static_cast<int>(additional_data.
n_sweeps));
220 parameter_list.set(
"relaxation: type",
"Gauss-Seidel");
221 parameter_list.set(
"relaxation: damping factor", additional_data.
omega);
222 parameter_list.set(
"relaxation: min diagonal value",
224 parameter_list.set(
"schwarz: combine mode",
"Add");
226 ierr = ifpack->SetParameters(parameter_list);
229 ierr = ifpack->Initialize();
232 ierr = ifpack->Compute();
241 const unsigned int block_size,
242 const std::string &block_creation_type,
244 const double min_diagonal,
245 const unsigned int n_sweeps)
246 : block_size(block_size)
247 , block_creation_type(block_creation_type)
249 , min_diagonal(min_diagonal)
265 Ifpack().Create((matrix.trilinos_matrix().NumMyRows() == 0) ?
268 const_cast<Epetra_CrsMatrix *
>(&matrix.trilinos_matrix()),
271 Ifpack_Preconditioner *ifpack =
279 Teuchos::ParameterList parameter_list;
280 parameter_list.set(
"relaxation: sweeps",
281 static_cast<int>(additional_data.
n_sweeps));
282 parameter_list.set(
"relaxation: type",
"Jacobi");
283 parameter_list.set(
"relaxation: damping factor", additional_data.
omega);
284 parameter_list.set(
"relaxation: min diagonal value",
286 parameter_list.set(
"partitioner: type",
289 (matrix.trilinos_matrix().NumMyRows() + additional_data.
block_size - 1) /
291 parameter_list.set(
"partitioner: local parts", n_local_parts);
293 ierr = ifpack->SetParameters(parameter_list);
296 ierr = ifpack->Initialize();
299 ierr = ifpack->Compute();
308 const unsigned int block_size,
309 const std::string &block_creation_type,
311 const double min_diagonal,
312 const unsigned int overlap,
313 const unsigned int n_sweeps)
314 : block_size(block_size)
315 , block_creation_type(block_creation_type)
317 , min_diagonal(min_diagonal)
333 Ifpack().Create((matrix.trilinos_matrix().NumMyRows() == 0) ?
336 const_cast<Epetra_CrsMatrix *
>(&matrix.trilinos_matrix()),
339 Ifpack_Preconditioner *ifpack =
347 Teuchos::ParameterList parameter_list;
348 parameter_list.set(
"relaxation: sweeps",
349 static_cast<int>(additional_data.
n_sweeps));
350 parameter_list.set(
"relaxation: type",
"symmetric Gauss-Seidel");
351 parameter_list.set(
"relaxation: damping factor", additional_data.
omega);
352 parameter_list.set(
"relaxation: min diagonal value",
354 parameter_list.set(
"schwarz: combine mode",
"Add");
355 parameter_list.set(
"partitioner: type",
358 (matrix.trilinos_matrix().NumMyRows() + additional_data.
block_size - 1) /
360 parameter_list.set(
"partitioner: local parts", n_local_parts);
362 ierr = ifpack->SetParameters(parameter_list);
365 ierr = ifpack->Initialize();
368 ierr = ifpack->Compute();
377 const unsigned int block_size,
378 const std::string &block_creation_type,
380 const double min_diagonal,
381 const unsigned int overlap,
382 const unsigned int n_sweeps)
383 : block_size(block_size)
384 , block_creation_type(block_creation_type)
386 , min_diagonal(min_diagonal)
402 Ifpack().Create((matrix.trilinos_matrix().NumMyRows() == 0) ?
405 const_cast<Epetra_CrsMatrix *
>(&matrix.trilinos_matrix()),
408 Ifpack_Preconditioner *ifpack =
416 Teuchos::ParameterList parameter_list;
417 parameter_list.set(
"relaxation: sweeps",
418 static_cast<int>(additional_data.
n_sweeps));
419 parameter_list.set(
"relaxation: type",
"Gauss-Seidel");
420 parameter_list.set(
"relaxation: damping factor", additional_data.
omega);
421 parameter_list.set(
"relaxation: min diagonal value",
423 parameter_list.set(
"schwarz: combine mode",
"Add");
424 parameter_list.set(
"partitioner: type",
427 (matrix.trilinos_matrix().NumMyRows() + additional_data.
block_size - 1) /
429 parameter_list.set(
"partitioner: local parts", n_local_parts);
431 ierr = ifpack->SetParameters(parameter_list);
434 ierr = ifpack->Initialize();
437 ierr = ifpack->Compute();
446 const double ic_atol,
447 const double ic_rtol,
448 const unsigned int overlap)
463 Ifpack().Create(
"IC",
464 const_cast<Epetra_CrsMatrix *
>(&matrix.trilinos_matrix()),
467 Ifpack_Preconditioner *ifpack =
475 Teuchos::ParameterList parameter_list;
476 parameter_list.set(
"fact: level-of-fill", additional_data.
ic_fill);
477 parameter_list.set(
"fact: absolute threshold", additional_data.
ic_atol);
478 parameter_list.set(
"fact: relative threshold", additional_data.
ic_rtol);
479 parameter_list.set(
"schwarz: combine mode",
"Add");
481 ierr = ifpack->SetParameters(parameter_list);
484 ierr = ifpack->Initialize();
487 ierr = ifpack->Compute();
496 const double ilu_atol,
497 const double ilu_rtol,
498 const unsigned int overlap)
513 Ifpack().Create(
"ILU",
514 const_cast<Epetra_CrsMatrix *
>(&matrix.trilinos_matrix()),
517 Ifpack_Preconditioner *ifpack =
525 Teuchos::ParameterList parameter_list;
526 parameter_list.set(
"fact: level-of-fill",
527 static_cast<int>(additional_data.
ilu_fill));
528 parameter_list.set(
"fact: absolute threshold", additional_data.
ilu_atol);
529 parameter_list.set(
"fact: relative threshold", additional_data.
ilu_rtol);
530 parameter_list.set(
"schwarz: combine mode",
"Add");
532 ierr = ifpack->SetParameters(parameter_list);
535 ierr = ifpack->Initialize();
538 ierr = ifpack->Compute();
547 const unsigned int ilut_fill,
548 const double ilut_atol,
549 const double ilut_rtol,
550 const unsigned int overlap)
551 : ilut_drop(ilut_drop)
552 , ilut_fill(ilut_fill)
553 , ilut_atol(ilut_atol)
554 , ilut_rtol(ilut_rtol)
566 Ifpack().Create(
"ILUT",
567 const_cast<Epetra_CrsMatrix *
>(&matrix.trilinos_matrix()),
570 Ifpack_Preconditioner *ifpack =
578 Teuchos::ParameterList parameter_list;
579 parameter_list.set(
"fact: drop value", additional_data.
ilut_drop);
580 parameter_list.set(
"fact: level-of-fill",
581 static_cast<int>(additional_data.
ilut_fill));
582 parameter_list.set(
"fact: absolute threshold", additional_data.
ilut_atol);
583 parameter_list.set(
"fact: relative threshold", additional_data.
ilut_rtol);
584 parameter_list.set(
"schwarz: combine mode",
"Add");
586 ierr = ifpack->SetParameters(parameter_list);
589 ierr = ifpack->Initialize();
592 ierr = ifpack->Compute();
601 const unsigned int overlap)
613 Ifpack().Create(
"Amesos",
614 const_cast<Epetra_CrsMatrix *
>(&matrix.trilinos_matrix()),
617 Ifpack_Preconditioner *ifpack =
625 Teuchos::ParameterList parameter_list;
626 parameter_list.set(
"schwarz: combine mode",
"Add");
628 ierr = ifpack->SetParameters(parameter_list);
631 ierr = ifpack->Initialize();
634 ierr = ifpack->Compute();
643 const unsigned int degree,
644 const double max_eigenvalue,
645 const double eigenvalue_ratio,
646 const double min_eigenvalue,
647 const double min_diagonal,
648 const bool nonzero_starting)
650 , max_eigenvalue(max_eigenvalue)
651 , eigenvalue_ratio(eigenvalue_ratio)
652 , min_eigenvalue(min_eigenvalue)
653 , min_diagonal(min_diagonal)
654 , nonzero_starting(nonzero_starting)
664 Teuchos::rcp(
new Ifpack_Chebyshev(&matrix.trilinos_matrix()));
666 Ifpack_Chebyshev *ifpack =
674 Teuchos::ParameterList parameter_list;
675 parameter_list.set(
"chebyshev: ratio eigenvalue",
677 parameter_list.set(
"chebyshev: min eigenvalue",
679 parameter_list.set(
"chebyshev: max eigenvalue",
681 parameter_list.set(
"chebyshev: degree",
682 static_cast<int>(additional_data.
degree));
683 parameter_list.set(
"chebyshev: min diagonal value",
685 parameter_list.set(
"chebyshev: zero starting solution",
688 ierr = ifpack->SetParameters(parameter_list);
691 ierr = ifpack->Initialize();
694 ierr = ifpack->Compute();
718 Ifpack().Create(
"point relaxation",
719 const_cast<Epetra_CrsMatrix *
>(&matrix.trilinos_matrix()),
722 Ifpack_Preconditioner *ifpack =
730 Teuchos::ParameterList parameter_list;
731 parameter_list.set(
"relaxation: sweeps", 1);
732 parameter_list.set(
"relaxation: type",
"Jacobi");
733 parameter_list.set(
"relaxation: damping factor", 1.0);
734 parameter_list.set(
"relaxation: min diagonal value", 0.0);
736 ierr = ifpack->SetParameters(parameter_list);
739 ierr = ifpack->Initialize();
742 ierr = ifpack->Compute();
760 const ::Vector<double> &src)
const
767 const ::Vector<double> &src)
const
IndexSet locally_owned_range_indices() const
Epetra_MpiComm communicator
Epetra_Operator & trilinos_operator() const
Teuchos::RCP< Epetra_Operator > preconditioner
MPI_Comm get_mpi_communicator() const
IndexSet locally_owned_domain_indices() const
void initialize(const SparseMatrix &matrix, const AdditionalData &additional_data=AdditionalData())
void initialize(const SparseMatrix &matrix, const AdditionalData &additional_data=AdditionalData())
void initialize(const SparseMatrix &matrix, const AdditionalData &additional_data=AdditionalData())
void initialize(const SparseMatrix &matrix, const AdditionalData &additional_data=AdditionalData())
void initialize(const SparseMatrix &matrix, const AdditionalData &additional_data=AdditionalData())
void initialize(const SparseMatrix &matrix, const AdditionalData &additional_data=AdditionalData())
void initialize(const SparseMatrix &matrix, const AdditionalData &additional_data=AdditionalData())
void initialize(const SparseMatrix &matrix, const AdditionalData &additional_data=AdditionalData())
void vmult(MPI::Vector &dst, const MPI::Vector &src) const override
void Tvmult(MPI::Vector &dst, const MPI::Vector &src) const override
void initialize(const SparseMatrix &matrix, const AdditionalData &additional_data=AdditionalData())
void initialize(const SparseMatrix &matrix, const AdditionalData &additional_data=AdditionalData())
void initialize(const SparseMatrix &matrix, const AdditionalData &additional_data=AdditionalData())
void initialize(const SparseMatrix &matrix, const AdditionalData &additional_data=AdditionalData())
#define DEAL_II_NAMESPACE_OPEN
#define DEAL_II_DISABLE_EXTRA_DIAGNOSTICS
#define DEAL_II_NAMESPACE_CLOSE
#define DEAL_II_ENABLE_EXTRA_DIAGNOSTICS
#define Assert(cond, exc)
static ::ExceptionBase & ExcTrilinosError(int arg1)
static ::ExceptionBase & ExcMessage(std::string arg1)
#define AssertThrow(cond, exc)
std::string block_creation_type
AdditionalData(const unsigned int block_size=1, const std::string &block_creation_type="linear", const double omega=1, const double min_diagonal=0, const unsigned int n_sweeps=1)
std::string block_creation_type
AdditionalData(const unsigned int block_size=1, const std::string &block_creation_type="linear", const double omega=1, const double min_diagonal=0, const unsigned int overlap=0, const unsigned int n_sweeps=1)
AdditionalData(const unsigned int block_size=1, const std::string &block_creation_type="linear", const double omega=1, const double min_diagonal=0, const unsigned int overlap=0, const unsigned int n_sweeps=1)
std::string block_creation_type
AdditionalData(const unsigned int overlap=0)
AdditionalData(const unsigned int degree=1, const double max_eigenvalue=10., const double eigenvalue_ratio=30., const double min_eigenvalue=1., const double min_diagonal=1e-12, const bool nonzero_starting=false)
AdditionalData(const unsigned int ic_fill=0, const double ic_atol=0., const double ic_rtol=1., const unsigned int overlap=0)
AdditionalData(const double ilut_drop=0., const unsigned int ilut_fill=0, const double ilut_atol=0., const double ilut_rtol=1., const unsigned int overlap=0)
AdditionalData(const unsigned int ilu_fill=0, const double ilu_atol=0., const double ilu_rtol=1., const unsigned int overlap=0)
AdditionalData(const double omega=1, const double min_diagonal=0, const unsigned int n_sweeps=1)
AdditionalData(const double omega=1, const double min_diagonal=0, const unsigned int overlap=0, const unsigned int n_sweeps=1)
AdditionalData(const double omega=1, const double min_diagonal=0, const unsigned int overlap=0, const unsigned int n_sweeps=1)