18#ifdef DEAL_II_WITH_TRILINOS
26# include <Epetra_MultiVector.h>
28# include <Ifpack_Chebyshev.h>
29# include <Teuchos_ParameterList.hpp>
30# include <Teuchos_RCP.hpp>
31# include <ml_MultiLevelPreconditioner.h>
32# include <ml_include.h>
71 Teuchos::ParameterList ¶meter_list,
72 std::unique_ptr<Epetra_MultiVector> &distributed_constant_modes,
73 const Epetra_RowMatrix &matrix)
const
77 ML_Epetra::SetDefaults(
"SA", parameter_list);
88 parameter_list.set(
"aggregation: type",
"Uncoupled");
92 ML_Epetra::SetDefaults(
"NSSA", parameter_list);
93 parameter_list.set(
"aggregation: type",
"Uncoupled");
94 parameter_list.set(
"aggregation: block scaling",
true);
101 parameter_list.set(
"initialize random seed",
true);
103 parameter_list.set(
"smoother: sweeps",
static_cast<int>(
smoother_sweeps));
104 parameter_list.set(
"cycle applications",
static_cast<int>(
n_cycles));
106 parameter_list.set(
"prec type",
"MGW");
108 parameter_list.set(
"prec type",
"MGV");
110 parameter_list.set(
"smoother: Chebyshev alpha", 10.);
111 parameter_list.set(
"smoother: ifpack overlap",
114 parameter_list.set(
"coarse: max size", 2000);
117 parameter_list.set(
"ML output", 10);
119 parameter_list.set(
"ML output", 0);
128 Teuchos::ParameterList ¶meter_list,
129 std::unique_ptr<Epetra_MultiVector> &ptr_distributed_constant_modes,
130 const Epetra_RowMatrix &matrix)
const
133 const Epetra_Map &domain_map = matrix.OperatorDomainMap();
136 ptr_distributed_constant_modes =
137 std::make_unique<Epetra_MultiVector>(domain_map,
138 constant_modes_dimension > 0 ?
139 constant_modes_dimension :
142 Epetra_MultiVector &distributed_constant_modes =
143 *ptr_distributed_constant_modes;
145 if (constant_modes_dimension > 0)
150 distributed_constant_modes)),
153 distributed_constant_modes)));
154 const bool constant_modes_are_global =
156 const size_type my_size = domain_map.NumMyElements();
161 constant_modes_are_global ? global_size : my_size;
162 for (
size_type d = 0; d < constant_modes_dimension; ++d)
166 expected_mode_size));
167 for (
size_type row = 0; row < my_size; ++row)
170 constant_modes_are_global ?
173 distributed_constant_modes[d][row] =
178 parameter_list.set(
"null space: type",
"pre-computed");
179 parameter_list.set(
"null space: dimension",
180 distributed_constant_modes.NumVectors());
181 parameter_list.set(
"null space: vectors",
182 distributed_constant_modes.Values());
199 Teuchos::ParameterList ¶meter_list,
200 std::unique_ptr<Epetra_MultiVector> &distributed_constant_modes,
204 distributed_constant_modes,
205 matrix.trilinos_matrix());
212 Teuchos::ParameterList ¶meter_list,
213 std::unique_ptr<Epetra_MultiVector> &distributed_constant_modes,
217 distributed_constant_modes,
218 matrix.trilinos_matrix());
235 initialize(matrix.trilinos_matrix(), additional_data);
245 Teuchos::ParameterList ml_parameters;
246 std::unique_ptr<Epetra_MultiVector> distributed_constant_modes;
248 distributed_constant_modes,
255 ML_Epetra::MultiLevelPreconditioner *multilevel_operator =
256 dynamic_cast<ML_Epetra::MultiLevelPreconditioner *
>(
258 Assert(multilevel_operator !=
nullptr,
260 multilevel_operator->PrintUnused(0);
268 const Teuchos::ParameterList &ml_parameters)
270 initialize(matrix.trilinos_matrix(), ml_parameters);
277 const Teuchos::ParameterList &ml_parameters)
280 new ML_Epetra::MultiLevelPreconditioner(matrix, ml_parameters));
285 template <
typename number>
288 const ::SparseMatrix<number> &deal_ii_sparse_matrix,
290 const double drop_tolerance,
291 const ::SparsityPattern *use_this_sparsity)
294 const size_type n_rows = deal_ii_sparse_matrix.m();
299 const unsigned int n_mpi_processes =
communicator.NumProc();
301 distributor.
add_range(my_id * n_rows / n_mpi_processes,
302 (my_id + 1) * n_rows / n_mpi_processes);
309 deal_ii_sparse_matrix,
323 ML_Epetra::MultiLevelPreconditioner *multilevel_operator =
324 dynamic_cast<ML_Epetra::MultiLevelPreconditioner *
>(
preconditioner.get());
325 multilevel_operator->ReComputePreconditioner();
342 unsigned int memory =
sizeof(*this);
357 const AdditionalData &,
359 const ::SparsityPattern *);
362 const AdditionalData &,
364 const ::SparsityPattern *);
void add_range(const size_type begin, const size_type end)
~PreconditionAMG() override
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
::types::global_dof_index size_type
#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)
#define AssertDimension(dim1, dim2)
static ::ExceptionBase & ExcDimensionMismatch(std::size_t arg1, std::size_t arg2)
static ::ExceptionBase & ExcNotInitialized()
static ::ExceptionBase & ExcMessage(std::string arg1)
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)
std::vector< std::vector< bool > > constant_modes
double aggregation_threshold
AdditionalData(const bool elliptic=true, const bool higher_order_elements=false, 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")
std::vector< std::vector< double > > constant_modes_values
unsigned int smoother_sweeps
bool higher_order_elements
unsigned int smoother_overlap
void set_operator_null_space(Teuchos::ParameterList ¶meter_list, std::unique_ptr< Epetra_MultiVector > &distributed_constant_modes, const Epetra_RowMatrix &matrix) const
const char * smoother_type
void set_parameters(Teuchos::ParameterList ¶meter_list, std::unique_ptr< Epetra_MultiVector > &distributed_constant_modes, const Epetra_RowMatrix &matrix) const