16#ifdef DEAL_II_WITH_TRILINOS
17# ifdef DEAL_II_TRILINOS_WITH_MUELU
22# include <MueLu_CreateEpetraPreconditioner.hpp>
23# include <ml_MultiLevelPreconditioner.h>
32#ifdef DEAL_II_WITH_TRILINOS
33# ifdef DEAL_II_TRILINOS_WITH_MUELU
39 const unsigned int n_cycles,
41 const double aggregation_threshold,
42 const std::vector<std::vector<bool>> &constant_modes,
43 const unsigned int smoother_sweeps,
44 const unsigned int smoother_overlap,
45 const bool output_details,
46 const char *smoother_type,
47 const char *coarse_type)
51 , aggregation_threshold(aggregation_threshold)
52 , constant_modes(constant_modes)
53 , smoother_sweeps(smoother_sweeps)
54 , smoother_overlap(smoother_overlap)
55 , output_details(output_details)
56 , smoother_type(smoother_type)
57 , coarse_type(coarse_type)
66# ifdef DEAL_II_WITH_64BIT_INDICES
67 constexpr bool enabled =
false;
69 constexpr bool enabled =
true;
73 "PreconditionAMGMueLu does not support 64bit-indices!"));
82 initialize(matrix.trilinos_matrix(), additional_data);
92 Teuchos::ParameterList parameter_list;
94 parameter_list.set(
"parameterlist: syntax",
"ml");
96 if (additional_data.
elliptic ==
true)
97 ML_Epetra::SetDefaults(
"SA", parameter_list);
100 ML_Epetra::SetDefaults(
"NSSA", parameter_list);
101 parameter_list.set(
"aggregation: block scaling",
true);
106 parameter_list.set(
"aggregation: type",
"Uncoupled");
108 parameter_list.set(
"smoother: type", additional_data.
smoother_type);
109 parameter_list.set(
"coarse: type", additional_data.
coarse_type);
111 parameter_list.set(
"smoother: sweeps",
113 parameter_list.set(
"cycle applications",
114 static_cast<int>(additional_data.
n_cycles));
115 if (additional_data.
w_cycle ==
true)
116 parameter_list.set(
"prec type",
"MGW");
118 parameter_list.set(
"prec type",
"MGV");
120 parameter_list.set(
"smoother: Chebyshev alpha", 10.);
121 parameter_list.set(
"smoother: ifpack overlap",
123 parameter_list.set(
"aggregation: threshold",
125 parameter_list.set(
"coarse: max size", 2000);
128 parameter_list.set(
"ML output", 10);
130 parameter_list.set(
"ML output", 0);
132 const Epetra_Map &domain_map = matrix.OperatorDomainMap();
134 const size_type constant_modes_dimension =
136 Epetra_MultiVector distributed_constant_modes(
137 domain_map, constant_modes_dimension > 0 ? constant_modes_dimension : 1);
138 std::vector<double> dummy(constant_modes_dimension);
140 if (constant_modes_dimension > 0)
143 const bool constant_modes_are_global =
146 constant_modes_are_global ? n_rows :
148 const size_type my_size = domain_map.NumMyElements();
149 if (constant_modes_are_global ==
false)
150 Assert(n_relevant_rows == my_size,
153 distributed_constant_modes)),
156 distributed_constant_modes)));
160 for (
size_type d = 0; d < constant_modes_dimension; ++d)
161 for (
size_type row = 0; row < my_size; ++row)
164 constant_modes_are_global ?
167 distributed_constant_modes[d][row] =
static_cast<double>(
171 parameter_list.set(
"null space: type",
"pre-computed");
172 parameter_list.set(
"null space: dimension",
173 distributed_constant_modes.NumVectors());
175 parameter_list.set(
"null space: vectors",
176 distributed_constant_modes.Values());
180 parameter_list.set(
"null space: vectors", dummy.data());
190 Teuchos::ParameterList &muelu_parameters)
192 initialize(matrix.trilinos_matrix(), muelu_parameters);
199 Teuchos::ParameterList &muelu_parameters)
201 const auto teuchos_wrapped_matrix =
202 Teuchos::rcp(
const_cast<Epetra_CrsMatrix *
>(&matrix),
false);
203 preconditioner = MueLu::CreateEpetraPreconditioner(teuchos_wrapped_matrix,
209 template <
typename number>
212 const ::SparseMatrix<number> &deal_ii_sparse_matrix,
214 const double drop_tolerance,
215 const ::SparsityPattern *use_this_sparsity)
218 const size_type n_rows = deal_ii_sparse_matrix.m();
223 const unsigned int n_mpi_processes =
communicator.NumProc();
225 distributor.
add_range(my_id * n_rows / n_mpi_processes,
226 (my_id + 1) * n_rows / n_mpi_processes);
233 deal_ii_sparse_matrix,
256 unsigned int memory =
sizeof(*this);
271 const AdditionalData &,
273 const ::SparsityPattern *);
276 const AdditionalData &,
278 const ::SparsityPattern *);
void add_range(const size_type begin, const size_type end)
std::shared_ptr< SparseMatrix > trilinos_matrix
size_type memory_consumption() const
void initialize(const SparseMatrix &matrix, const AdditionalData &additional_data=AdditionalData())
Epetra_MpiComm communicator
Teuchos::RCP< Epetra_Operator > preconditioner
#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 & ExcDimensionMismatch(std::size_t arg1, std::size_t arg2)
static ::ExceptionBase & ExcMessage(std::string arg1)
#define AssertThrow(cond, exc)
TrilinosWrappers::types::int_type global_index(const Epetra_BlockMap &map, const ::types::global_dof_index i)
TrilinosWrappers::types::int_type n_global_rows(const Epetra_CrsGraph &graph)
TrilinosWrappers::types::int_type global_length(const Epetra_MultiVector &vector)
double aggregation_threshold
std::vector< std::vector< bool > > constant_modes
AdditionalData(const bool elliptic=true, const unsigned int n_cycles=1, const bool w_cycle=false, const double aggregation_threshold=1e-4, const std::vector< std::vector< bool > > &constant_modes=std::vector< std::vector< bool > >(0), const unsigned int smoother_sweeps=2, const unsigned int smoother_overlap=0, const bool output_details=false, const char *smoother_type="Chebyshev", const char *coarse_type="Amesos-KLU")
unsigned int smoother_sweeps
unsigned int smoother_overlap
const char * smoother_type