19 #ifdef DEAL_II_WITH_TRILINOS 25 # include <Epetra_MultiVector.h> 27 # include <Ifpack_Chebyshev.h> 28 # include <Teuchos_ParameterList.hpp> 29 # include <Teuchos_RCP.hpp> 30 # include <ml_MultiLevelPreconditioner.h> 31 # include <ml_include.h> 41 const bool higher_order_elements,
42 const unsigned int n_cycles,
44 const double aggregation_threshold,
45 const std::vector<std::vector<bool>> &constant_modes,
46 const unsigned int smoother_sweeps,
47 const unsigned int smoother_overlap,
48 const bool output_details,
49 const char * smoother_type,
50 const char * coarse_type)
52 , higher_order_elements(higher_order_elements)
55 , aggregation_threshold(aggregation_threshold)
56 , constant_modes(constant_modes)
57 , smoother_sweeps(smoother_sweeps)
58 , smoother_overlap(smoother_overlap)
59 , output_details(output_details)
60 , smoother_type(smoother_type)
61 , coarse_type(coarse_type)
68 Teuchos::ParameterList & parameter_list,
69 std::unique_ptr<Epetra_MultiVector> &distributed_constant_modes,
70 const Epetra_RowMatrix &
matrix)
const 74 ML_Epetra::SetDefaults(
"SA", parameter_list);
85 parameter_list.set(
"aggregation: type",
"Uncoupled");
89 ML_Epetra::SetDefaults(
"NSSA", parameter_list);
90 parameter_list.set(
"aggregation: type",
"Uncoupled");
91 parameter_list.set(
"aggregation: block scaling",
true);
99 # if DEAL_II_TRILINOS_VERSION_GTE(12, 4, 0) 100 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 & parameter_list,
129 std::unique_ptr<Epetra_MultiVector> &ptr_distributed_constant_modes,
130 const Epetra_RowMatrix &
matrix)
const 132 const Epetra_Map &domain_map = matrix.OperatorDomainMap();
135 ptr_distributed_constant_modes = std_cxx14::make_unique<Epetra_MultiVector>(
136 domain_map, constant_modes_dimension > 0 ? constant_modes_dimension : 1);
138 Epetra_MultiVector &distributed_constant_modes =
139 *ptr_distributed_constant_modes;
141 if (constant_modes_dimension > 0)
147 static_cast<size_type>(
151 distributed_constant_modes)));
152 const bool constant_modes_are_global =
154 const size_type my_size = domain_map.NumMyElements();
159 constant_modes_are_global ? global_size : my_size;
160 for (
size_type d = 0;
d < constant_modes_dimension; ++
d)
164 expected_mode_size));
165 for (
size_type row = 0; row < my_size; ++row)
168 constant_modes_are_global ?
171 distributed_constant_modes[
d][row] =
175 (void)expected_mode_size;
177 parameter_list.set(
"null space: type",
"pre-computed");
178 parameter_list.set(
"null space: dimension",
179 distributed_constant_modes.NumVectors());
180 parameter_list.set(
"null space: vectors",
181 distributed_constant_modes.Values());
189 Teuchos::ParameterList & parameter_list,
190 std::unique_ptr<Epetra_MultiVector> &distributed_constant_modes,
194 distributed_constant_modes,
202 Teuchos::ParameterList & parameter_list,
203 std::unique_ptr<Epetra_MultiVector> &distributed_constant_modes,
207 distributed_constant_modes,
235 Teuchos::ParameterList ml_parameters;
236 std::unique_ptr<Epetra_MultiVector> distributed_constant_modes;
238 distributed_constant_modes,
245 ML_Epetra::MultiLevelPreconditioner *multilevel_operator =
246 dynamic_cast<ML_Epetra::MultiLevelPreconditioner *
>(
248 Assert(multilevel_operator !=
nullptr,
250 multilevel_operator->PrintUnused(0);
258 const Teuchos::ParameterList &ml_parameters)
267 const Teuchos::ParameterList &ml_parameters)
270 new ML_Epetra::MultiLevelPreconditioner(matrix, ml_parameters));
275 template <
typename number>
278 const ::SparseMatrix<number> &deal_ii_sparse_matrix,
280 const double drop_tolerance,
281 const ::SparsityPattern * use_this_sparsity)
284 const size_type n_rows = deal_ii_sparse_matrix.m();
291 distributor.
add_range(my_id * n_rows / n_mpi_processes,
292 (my_id + 1) * n_rows / n_mpi_processes);
299 deal_ii_sparse_matrix,
313 ML_Epetra::MultiLevelPreconditioner *multilevel_operator =
314 dynamic_cast<ML_Epetra::MultiLevelPreconditioner *
>(
preconditioner.get());
315 multilevel_operator->ReComputePreconditioner();
332 unsigned int memory =
sizeof(*this);
349 const ::SparsityPattern *);
354 const ::SparsityPattern *);
363 #endif // DEAL_II_WITH_TRILINOS AdditionalData(const bool elliptic=true, const bool higher_order_elements=false, const unsigned int n_cycles=1, const bool w_cyle=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")
Contents is actually a matrix.
double aggregation_threshold
std::vector< std::vector< bool > > constant_modes
void set_parameters(Teuchos::ParameterList ¶meter_list, std::unique_ptr< Epetra_MultiVector > &distributed_constant_modes, const Epetra_RowMatrix &matrix) const
TrilinosWrappers::types::int_type global_length(const Epetra_MultiVector &vector)
unsigned int smoother_overlap
static ::ExceptionBase & ExcNotInitialized()
unsigned int smoother_sweeps
static ::ExceptionBase & ExcMessage(std::string arg1)
TrilinosWrappers::types::int_type n_global_rows(const Epetra_CrsGraph &graph)
const char * smoother_type
#define Assert(cond, exc)
static ::ExceptionBase & ExcDimensionMismatch(std::size_t arg1, std::size_t arg2)
#define DEAL_II_NAMESPACE_CLOSE
const Epetra_CrsMatrix & trilinos_matrix() const
size_type memory_consumption() const
~PreconditionAMG() override
std::shared_ptr< SparseMatrix > trilinos_matrix
SymmetricTensor< 2, dim, Number > d(const Tensor< 2, dim, Number > &F, const Tensor< 2, dim, Number > &dF_dt)
unsigned int n_mpi_processes(const MPI_Comm &mpi_communicator)
void add_range(const size_type begin, const size_type end)
void initialize(const SparseMatrix &matrix, const AdditionalData &additional_data=AdditionalData())
#define DEAL_II_NAMESPACE_OPEN
void set_operator_null_space(Teuchos::ParameterList ¶meter_list, std::unique_ptr< Epetra_MultiVector > &distributed_constant_modes, const Epetra_RowMatrix &matrix) const
TrilinosWrappers::types::int_type global_index(const Epetra_BlockMap &map, const ::types::global_dof_index i)
Epetra_MpiComm communicator
Teuchos::RCP< Epetra_Operator > preconditioner
bool higher_order_elements