deal.II version GIT relicensing-6839-g338455934c 2026-10-02 12:10:01+00:00
\(\newcommand{\dealvcentcolon}{\mathrel{\mathop{:}}}\) \(\newcommand{\dealcoloneq}{\dealvcentcolon\mathrel{\mkern-1.2mu}=}\) \(\newcommand{\jump}[1]{\left[\!\left[ #1 \right]\!\right]}\) \(\newcommand{\average}[1]{\left\{\!\left\{ #1 \right\}\!\right\}}\)
Loading...
Searching...
No Matches
trilinos_precondition.h
Go to the documentation of this file.
1// -----------------------------------------------------------------------------
2//
3// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception OR LGPL-2.1-or-later
4// Copyright (C) 2008 - 2026 by the deal.II authors
5//
6// This file is part of the deal.II library.
7//
8// Detailed license information governing the source code and contributions
9// can be found in LICENSE.md and CONTRIBUTING.md at the top level directory.
10//
11// -----------------------------------------------------------------------------
12
13#ifndef dealii_trilinos_precondition_h
14#define dealii_trilinos_precondition_h
15
16
17#include <deal.II/base/config.h>
18
19#ifndef DEAL_II_TRILINOS_WITH_EPETRA
20
23
24#endif
25
26#ifdef DEAL_II_TRILINOS_WITH_EPETRA
28
31
33# include <Epetra_Map.h>
34# include <Epetra_MpiComm.h>
35# include <Epetra_MultiVector.h>
36# include <Epetra_RowMatrix.h>
37# include <Epetra_Vector.h>
38# include <Teuchos_ParameterList.hpp>
40
41# include <memory>
42
43// forward declarations
44# ifndef DOXYGEN
45class Ifpack_Preconditioner;
46class Ifpack_Chebyshev;
47namespace ML_Epetra
48{
49 class MultiLevelPreconditioner;
50}
51# endif
52
53#endif
54
56
57#ifdef DEAL_II_TRILINOS_WITH_EPETRA
58// forward declarations
59# ifndef DOXYGEN
60template <typename number>
61class SparseMatrix;
62template <typename number>
63class Vector;
64class SparsityPattern;
65# endif
66
72namespace TrilinosWrappers
73{
74 // forward declarations
75 class SparseMatrix;
77 class SolverBase;
78
86 {
87 public:
92
98 {};
99
106
111 void
112 clear();
113
118 get_mpi_communicator() const;
119
129 void
131
135 virtual void
136 vmult(MPI::Vector &dst, const MPI::Vector &src) const;
137
141 virtual void
142 Tvmult(MPI::Vector &dst, const MPI::Vector &src) const;
143
148 virtual void
149 vmult(::Vector<double> &dst, const ::Vector<double> &src) const;
150
155 virtual void
157 const ::Vector<double> &src) const;
158
163 virtual void
165 const ::LinearAlgebra::distributed::Vector<double> &src) const;
166
171 virtual void
173 const ::LinearAlgebra::distributed::Vector<double> &src) const;
174
185 trilinos_operator() const;
199
207
218 std::string,
219 << "The sparse matrix the preconditioner is based on "
220 << "uses a map that is not compatible to the one in vector "
221 << arg1 << ". Check preconditioner and matrix setup.");
224 friend class SolverBase;
225
226 protected:
231 Teuchos::RCP<Epetra_Operator> preconditioner;
232
237 Epetra_MpiComm communicator;
238 };
239
240
257 {
258 public:
271 {
276 AdditionalData(const double omega = 1,
277 const double min_diagonal = 0,
278 const unsigned int n_sweeps = 1);
279
283 double omega;
284
293
298 unsigned int n_sweeps;
299 };
300
305 void
306 initialize(const SparseMatrix &matrix,
307 const AdditionalData &additional_data = AdditionalData());
308 };
309
310
311
338 {
339 public:
354 {
361 AdditionalData(const double omega = 1,
362 const double min_diagonal = 0,
363 const unsigned int overlap = 0,
364 const unsigned int n_sweeps = 1);
365
370 double omega;
371
380
385 unsigned int overlap;
386
391 unsigned int n_sweeps;
392 };
393
399 void
400 initialize(const SparseMatrix &matrix,
401 const AdditionalData &additional_data = AdditionalData());
402 };
403
404
405
432 {
433 public:
448 {
455 AdditionalData(const double omega = 1,
456 const double min_diagonal = 0,
457 const unsigned int overlap = 0,
458 const unsigned int n_sweeps = 1);
459
464 double omega;
465
474
479 unsigned int overlap;
480
485 unsigned int n_sweeps;
486 };
487
493 void
494 initialize(const SparseMatrix &matrix,
495 const AdditionalData &additional_data = AdditionalData());
496 };
497
498
499
517 {
518 public:
535 {
541 AdditionalData(const unsigned int block_size = 1,
542 const std::string &block_creation_type = "linear",
543 const double omega = 1,
544 const double min_diagonal = 0,
545 const unsigned int n_sweeps = 1);
546
550 unsigned int block_size;
551
560
565 double omega;
566
575
580 unsigned int n_sweeps;
581 };
582
587 void
588 initialize(const SparseMatrix &matrix,
589 const AdditionalData &additional_data = AdditionalData());
590 };
591
592
593
616 {
617 public:
636 {
644 AdditionalData(const unsigned int block_size = 1,
645 const std::string &block_creation_type = "linear",
646 const double omega = 1,
647 const double min_diagonal = 0,
648 const unsigned int overlap = 0,
649 const unsigned int n_sweeps = 1);
650
654 unsigned int block_size;
655
664
669 double omega;
670
679
684 unsigned int overlap;
685
690 unsigned int n_sweeps;
691 };
692
698 void
699 initialize(const SparseMatrix &matrix,
700 const AdditionalData &additional_data = AdditionalData());
701 };
702
703
704
727 {
728 public:
747 {
755 AdditionalData(const unsigned int block_size = 1,
756 const std::string &block_creation_type = "linear",
757 const double omega = 1,
758 const double min_diagonal = 0,
759 const unsigned int overlap = 0,
760 const unsigned int n_sweeps = 1);
761
765 unsigned int block_size;
766
775
780 double omega;
781
790
795 unsigned int overlap;
796
801 unsigned int n_sweeps;
802 };
803
809 void
810 initialize(const SparseMatrix &matrix,
811 const AdditionalData &additional_data = AdditionalData());
812 };
813
814
815
851 {
852 public:
870 {
880 AdditionalData(const unsigned int ic_fill = 0,
881 const double ic_atol = 0.,
882 const double ic_rtol = 1.,
883 const unsigned int overlap = 0);
884
893 unsigned int ic_fill;
894
900 double ic_atol;
901
906 double ic_rtol;
907
912 unsigned int overlap;
913 };
914
919 void
920 initialize(const SparseMatrix &matrix,
921 const AdditionalData &additional_data = AdditionalData());
922 };
923
924
925
955 {
956 public:
995 {
999 AdditionalData(const unsigned int ilu_fill = 0,
1000 const double ilu_atol = 0.,
1001 const double ilu_rtol = 1.,
1002 const unsigned int overlap = 0);
1003
1007 unsigned int ilu_fill;
1008
1013 double ilu_atol;
1014
1019 double ilu_rtol;
1020
1024 unsigned int overlap;
1025 };
1026
1031 void
1032 initialize(const SparseMatrix &matrix,
1033 const AdditionalData &additional_data = AdditionalData());
1034 };
1035
1036
1037
1073 {
1074 public:
1093 {
1104 AdditionalData(const double ilut_drop = 0.,
1105 const unsigned int ilut_fill = 0,
1106 const double ilut_atol = 0.,
1107 const double ilut_rtol = 1.,
1108 const unsigned int overlap = 0);
1109
1115
1124 unsigned int ilut_fill;
1125
1132
1138
1143 unsigned int overlap;
1144 };
1145
1150 void
1151 initialize(const SparseMatrix &matrix,
1152 const AdditionalData &additional_data = AdditionalData());
1153 };
1154
1155
1156
1175 {
1176 public:
1182 {
1186 AdditionalData(const unsigned int overlap = 0);
1187
1188
1193 unsigned int overlap;
1194 };
1195
1200 void
1201 initialize(const SparseMatrix &matrix,
1202 const AdditionalData &additional_data = AdditionalData());
1203 };
1204
1205
1206
1216 {
1217 public:
1223 {
1227 AdditionalData(const unsigned int degree = 1,
1228 const double max_eigenvalue = 10.,
1229 const double eigenvalue_ratio = 30.,
1230 const double min_eigenvalue = 1.,
1231 const double min_diagonal = 1e-12,
1232 const bool nonzero_starting = false);
1233
1239 unsigned int degree;
1240
1246
1251
1257
1263
1275 };
1276
1281 void
1282 initialize(const SparseMatrix &matrix,
1283 const AdditionalData &additional_data = AdditionalData());
1284 };
1285
1286
1287
1330 {
1331 public:
1339 {
1363 AdditionalData(const bool elliptic = true,
1364 const bool higher_order_elements = false,
1365 const unsigned int n_cycles = 1,
1366 const bool w_cycle = false,
1367 const double aggregation_threshold = 1e-4,
1368 const std::vector<std::vector<bool>> &constant_modes =
1369 std::vector<std::vector<bool>>(0),
1370 const unsigned int smoother_sweeps = 2,
1371 const unsigned int smoother_overlap = 0,
1372 const bool output_details = false,
1373 const char *smoother_type = "Chebyshev",
1374 const char *coarse_type = "Amesos-KLU");
1375
1406 void
1408 Teuchos::ParameterList &parameter_list,
1409 std::unique_ptr<Epetra_MultiVector> &distributed_constant_modes,
1410 const Epetra_RowMatrix &matrix) const;
1411
1419 void
1421 Teuchos::ParameterList &parameter_list,
1422 std::unique_ptr<Epetra_MultiVector> &distributed_constant_modes,
1423 const SparseMatrix &matrix) const;
1424
1430 void
1432 Teuchos::ParameterList &parameter_list,
1433 std::unique_ptr<Epetra_MultiVector> &distributed_constant_modes,
1434 const Epetra_RowMatrix &matrix) const;
1435
1441 void
1443 Teuchos::ParameterList &parameter_list,
1444 std::unique_ptr<Epetra_MultiVector> &distributed_constant_modes,
1445 const SparseMatrix &matrix) const;
1446
1455
1461
1466 unsigned int n_cycles;
1467
1473
1484
1509 std::vector<std::vector<bool>> constant_modes;
1510
1518 std::vector<std::vector<double>> constant_modes_values;
1519
1530 unsigned int smoother_sweeps;
1531
1536 unsigned int smoother_overlap;
1537
1544
1579 const char *smoother_type;
1580
1585 const char *coarse_type;
1586 };
1587
1591 ~PreconditionAMG() override;
1592
1593
1599 void
1600 initialize(const SparseMatrix &matrix,
1601 const AdditionalData &additional_data = AdditionalData());
1602
1621 void
1622 initialize(const Epetra_RowMatrix &matrix,
1623 const AdditionalData &additional_data = AdditionalData());
1624
1639 void
1640 initialize(const SparseMatrix &matrix,
1641 const Teuchos::ParameterList &ml_parameters);
1642
1650 void
1651 initialize(const Epetra_RowMatrix &matrix,
1652 const Teuchos::ParameterList &ml_parameters);
1653
1660 template <typename number>
1661 void
1662 initialize(const ::SparseMatrix<number> &deal_ii_sparse_matrix,
1663 const AdditionalData &additional_data = AdditionalData(),
1664 const double drop_tolerance = 1e-13,
1665 const ::SparsityPattern *use_this_sparsity = nullptr);
1666
1679 void
1680 reinit();
1681
1686 void
1687 clear();
1688
1692 size_type
1693 memory_consumption() const;
1694
1695 private:
1699 std::shared_ptr<SparseMatrix> trilinos_matrix;
1700 };
1701
1702
1703
1704# if defined(DOXYGEN) || defined(DEAL_II_TRILINOS_WITH_MUELU)
1732 {
1733 public:
1741 {
1746 AdditionalData(const bool elliptic = true,
1747 const unsigned int n_cycles = 1,
1748 const bool w_cycle = false,
1749 const double aggregation_threshold = 1e-4,
1750 const std::vector<std::vector<bool>> &constant_modes =
1751 std::vector<std::vector<bool>>(0),
1752 const unsigned int smoother_sweeps = 2,
1753 const unsigned int smoother_overlap = 0,
1754 const bool output_details = false,
1755 const char *smoother_type = "Chebyshev",
1756 const char *coarse_type = "Amesos-KLU");
1757
1766
1771 unsigned int n_cycles;
1772
1778
1789
1796 std::vector<std::vector<bool>> constant_modes;
1797
1808 unsigned int smoother_sweeps;
1809
1814 unsigned int smoother_overlap;
1815
1822
1857 const char *smoother_type;
1858
1863 const char *coarse_type;
1864 };
1865
1870
1874 virtual ~PreconditionAMGMueLu() override = default;
1875
1881 void
1882 initialize(const SparseMatrix &matrix,
1883 const AdditionalData &additional_data = AdditionalData());
1884
1891 void
1892 initialize(const Epetra_CrsMatrix &matrix,
1893 const AdditionalData &additional_data = AdditionalData());
1894
1908 void
1909 initialize(const SparseMatrix &matrix,
1910 Teuchos::ParameterList &muelu_parameters);
1911
1917 void
1918 initialize(const Epetra_CrsMatrix &matrix,
1919 Teuchos::ParameterList &muelu_parameters);
1920
1927 template <typename number>
1928 void
1929 initialize(const ::SparseMatrix<number> &deal_ii_sparse_matrix,
1930 const AdditionalData &additional_data = AdditionalData(),
1931 const double drop_tolerance = 1e-13,
1932 const ::SparsityPattern *use_this_sparsity = nullptr);
1933
1938 void
1939 clear();
1940
1944 size_type
1945 memory_consumption() const;
1946
1947 private:
1951 std::shared_ptr<SparseMatrix> trilinos_matrix;
1952 };
1953# endif
1954
1955
1956
1964 {
1965 public:
1971 {};
1972
1979 void
1980 initialize(const SparseMatrix &matrix,
1981 const AdditionalData &additional_data = AdditionalData());
1982
1986 void
1987 vmult(MPI::Vector &dst, const MPI::Vector &src) const override;
1988
1992 void
1993 Tvmult(MPI::Vector &dst, const MPI::Vector &src) const override;
1994
1999 void
2001 const ::Vector<double> &src) const override;
2002
2007 void
2009 const ::Vector<double> &src) const override;
2010
2015 void
2017 const ::LinearAlgebra::distributed::Vector<double> &src)
2018 const override;
2019
2025 void
2027 const ::LinearAlgebra::distributed::Vector<double> &src)
2028 const override;
2029 };
2030
2031
2032
2033 // ----------------------- inline and template functions --------------------
2034
2035
2036# ifndef DOXYGEN
2037
2038
2039 inline void
2041 {
2042 // This only flips a flag that tells
2043 // Trilinos that any vmult operation
2044 // should be done with the
2045 // transpose. However, the matrix
2046 // structure is not reset.
2047 int ierr;
2048
2049 if (!preconditioner->UseTranspose())
2050 {
2051 ierr = preconditioner->SetUseTranspose(true);
2052 AssertThrow(ierr == 0, ExcTrilinosError(ierr));
2053 }
2054 else
2055 {
2056 ierr = preconditioner->SetUseTranspose(false);
2057 AssertThrow(ierr == 0, ExcTrilinosError(ierr));
2058 }
2059 }
2060
2061
2062 inline void
2063 PreconditionBase::vmult(MPI::Vector &dst, const MPI::Vector &src) const
2064 {
2065 Assert(dst.trilinos_partitioner().SameAs(
2066 preconditioner->OperatorRangeMap()),
2067 ExcNonMatchingMaps("dst"));
2068 Assert(src.trilinos_partitioner().SameAs(
2069 preconditioner->OperatorDomainMap()),
2070 ExcNonMatchingMaps("src"));
2071
2072 const int ierr = preconditioner->ApplyInverse(src.trilinos_vector(),
2073 dst.trilinos_vector());
2074 AssertThrow(ierr == 0, ExcTrilinosError(ierr));
2075 }
2076
2077 inline void
2078 PreconditionBase::Tvmult(MPI::Vector &dst, const MPI::Vector &src) const
2079 {
2080 Assert(dst.trilinos_partitioner().SameAs(
2081 preconditioner->OperatorRangeMap()),
2082 ExcNonMatchingMaps("dst"));
2083 Assert(src.trilinos_partitioner().SameAs(
2084 preconditioner->OperatorDomainMap()),
2085 ExcNonMatchingMaps("src"));
2086
2087 preconditioner->SetUseTranspose(true);
2088 const int ierr = preconditioner->ApplyInverse(src.trilinos_vector(),
2089 dst.trilinos_vector());
2090 AssertThrow(ierr == 0, ExcTrilinosError(ierr));
2091 preconditioner->SetUseTranspose(false);
2092 }
2093
2094
2095 // For the implementation of the <code>vmult</code> function with deal.II
2096 // data structures we note that invoking a call of the Trilinos
2097 // preconditioner requires us to use Epetra vectors as well. We do this by
2098 // providing a view, i.e., feed Trilinos with a pointer to the data, so we
2099 // avoid copying the content of the vectors during the iteration (this
2100 // function is only useful when used in serial anyway). In the declaration
2101 // of the right hand side, we need to cast the source vector (that is
2102 // <code>const</code> in all deal.II calls) to non-constant value, as this
2103 // is the way Trilinos wants to have them.
2104 inline void
2106 const ::Vector<double> &src) const
2107 {
2108 AssertDimension(dst.size(),
2109 preconditioner->OperatorDomainMap().NumMyElements());
2110 AssertDimension(src.size(),
2111 preconditioner->OperatorRangeMap().NumMyElements());
2112 Epetra_Vector tril_dst(View,
2113 preconditioner->OperatorDomainMap(),
2114 dst.begin());
2115 Epetra_Vector tril_src(View,
2116 preconditioner->OperatorRangeMap(),
2117 const_cast<double *>(src.begin()));
2118
2119 const int ierr = preconditioner->ApplyInverse(tril_src, tril_dst);
2120 AssertThrow(ierr == 0, ExcTrilinosError(ierr));
2121 }
2122
2123
2124 inline void
2126 const ::Vector<double> &src) const
2127 {
2128 AssertDimension(dst.size(),
2129 preconditioner->OperatorDomainMap().NumMyElements());
2130 AssertDimension(src.size(),
2131 preconditioner->OperatorRangeMap().NumMyElements());
2132 Epetra_Vector tril_dst(View,
2133 preconditioner->OperatorDomainMap(),
2134 dst.begin());
2135 Epetra_Vector tril_src(View,
2136 preconditioner->OperatorRangeMap(),
2137 const_cast<double *>(src.begin()));
2138
2139 preconditioner->SetUseTranspose(true);
2140 const int ierr = preconditioner->ApplyInverse(tril_src, tril_dst);
2141 AssertThrow(ierr == 0, ExcTrilinosError(ierr));
2142 preconditioner->SetUseTranspose(false);
2143 }
2144
2145
2146
2147 inline void
2151 {
2153 preconditioner->OperatorDomainMap().NumMyElements());
2155 preconditioner->OperatorRangeMap().NumMyElements());
2156 Epetra_Vector tril_dst(View,
2157 preconditioner->OperatorDomainMap(),
2158 dst.begin());
2159 Epetra_Vector tril_src(View,
2160 preconditioner->OperatorRangeMap(),
2161 const_cast<double *>(src.begin()));
2162
2163 const int ierr = preconditioner->ApplyInverse(tril_src, tril_dst);
2164 AssertThrow(ierr == 0, ExcTrilinosError(ierr));
2165 }
2166
2167 inline void
2171 {
2173 preconditioner->OperatorDomainMap().NumMyElements());
2175 preconditioner->OperatorRangeMap().NumMyElements());
2176 Epetra_Vector tril_dst(View,
2177 preconditioner->OperatorDomainMap(),
2178 dst.begin());
2179 Epetra_Vector tril_src(View,
2180 preconditioner->OperatorRangeMap(),
2181 const_cast<double *>(src.begin()));
2182
2183 preconditioner->SetUseTranspose(true);
2184 const int ierr = preconditioner->ApplyInverse(tril_src, tril_dst);
2185 AssertThrow(ierr == 0, ExcTrilinosError(ierr));
2186 preconditioner->SetUseTranspose(false);
2187 }
2188
2189# endif
2190
2191} // namespace TrilinosWrappers
2192
2193
2196#endif
2197
2199
2200#endif
size_type locally_owned_size() const
std::shared_ptr< SparseMatrix > trilinos_matrix
virtual ~PreconditionAMGMueLu() override=default
void initialize(const SparseMatrix &matrix, const AdditionalData &additional_data=AdditionalData())
std::shared_ptr< SparseMatrix > trilinos_matrix
void initialize(const SparseMatrix &matrix, const AdditionalData &additional_data=AdditionalData())
virtual void Tvmult(::LinearAlgebra::distributed::Vector< double > &dst, const ::LinearAlgebra::distributed::Vector< double > &src) const
virtual void Tvmult(MPI::Vector &dst, const MPI::Vector &src) const
virtual void vmult(MPI::Vector &dst, const MPI::Vector &src) const
Epetra_Operator & trilinos_operator() const
Teuchos::RCP< Epetra_Operator > preconditioner
virtual void Tvmult(::Vector< double > &dst, const ::Vector< double > &src) const
virtual void vmult(::Vector< double > &dst, const ::Vector< double > &src) const
virtual void vmult(::LinearAlgebra::distributed::Vector< double > &dst, const ::LinearAlgebra::distributed::Vector< double > &src) 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(LinearAlgebra::distributed::Vector< double > &dst, const ::LinearAlgebra::distributed::Vector< double > &src) const override
void vmult(MPI::Vector &dst, const MPI::Vector &src) const override
void Tvmult(MPI::Vector &dst, const MPI::Vector &src) const override
void Tvmult(LinearAlgebra::distributed::Vector< double > &dst, const ::LinearAlgebra::distributed::Vector< double > &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())
virtual size_type size() const override
iterator begin()
#define DEAL_II_NAMESPACE_OPEN
Definition config.h:38
#define DEAL_II_DISABLE_EXTRA_DIAGNOSTICS
Definition config.h:636
#define DEAL_II_NAMESPACE_CLOSE
Definition config.h:39
#define DEAL_II_ENABLE_EXTRA_DIAGNOSTICS
Definition config.h:680
static ::ExceptionBase & ExcNonMatchingMaps(std::string arg1)
#define Assert(cond, exc)
#define AssertDimension(dim1, dim2)
#define DeclException1(Exception1, type1, outsequence)
static ::ExceptionBase & ExcTrilinosError(int arg1)
#define AssertThrow(cond, exc)
unsigned int global_dof_index
Definition types.h:92
std::vector< std::vector< double > > constant_modes_values
void set_operator_null_space(Teuchos::ParameterList &parameter_list, std::unique_ptr< Epetra_MultiVector > &distributed_constant_modes, const Epetra_RowMatrix &matrix) const
void set_parameters(Teuchos::ParameterList &parameter_list, std::unique_ptr< Epetra_MultiVector > &distributed_constant_modes, const Epetra_RowMatrix &matrix) const