40 const bool higher_order_elements,
41 const unsigned int n_cycles,
43 const double aggregation_threshold,
44 const std::vector<std::vector<bool>> &constant_modes,
45 const unsigned int smoother_sweeps,
46 const unsigned int smoother_overlap,
47 const bool output_details,
48 const char *smoother_type,
49 const char *coarse_type)
51 , higher_order_elements(higher_order_elements)
54 , aggregation_threshold(aggregation_threshold)
55 , constant_modes(constant_modes)
56 , smoother_sweeps(smoother_sweeps)
57 , smoother_overlap(smoother_overlap)
58 , output_details(output_details)
59 , smoother_type(smoother_type)
60 , coarse_type(coarse_type)
67 Teuchos::ParameterList ¶meter_list,
68 std::unique_ptr<Epetra_MultiVector> &distributed_constant_modes,
69 const Epetra_RowMatrix &matrix)
const
73 ML_Epetra::SetDefaults(
"SA", parameter_list);
83 if (higher_order_elements)
84 parameter_list.set(
"aggregation: type",
"Uncoupled");
88 ML_Epetra::SetDefaults(
"NSSA", parameter_list);
89 parameter_list.set(
"aggregation: type",
"Uncoupled");
90 parameter_list.set(
"aggregation: block scaling",
true);
93 parameter_list.set(
"smoother: type", smoother_type);
94 parameter_list.set(
"coarse: type", coarse_type);
98# if DEAL_II_TRILINOS_VERSION_GTE(12, 4, 0)
99 parameter_list.set(
"initialize random seed",
true);
102 parameter_list.set(
"smoother: sweeps",
static_cast<int>(smoother_sweeps));
103 parameter_list.set(
"cycle applications",
static_cast<int>(n_cycles));
105 parameter_list.set(
"prec type",
"MGW");
107 parameter_list.set(
"prec type",
"MGV");
109 parameter_list.set(
"smoother: Chebyshev alpha", 10.);
110 parameter_list.set(
"smoother: ifpack overlap",
111 static_cast<int>(smoother_overlap));
112 parameter_list.set(
"aggregation: threshold", aggregation_threshold);
113 parameter_list.set(
"coarse: max size", 2000);
116 parameter_list.set(
"ML output", 10);
118 parameter_list.set(
"ML output", 0);
120 set_operator_null_space(parameter_list, distributed_constant_modes, matrix);
127 Teuchos::ParameterList ¶meter_list,
128 std::unique_ptr<Epetra_MultiVector> &ptr_distributed_constant_modes,
129 const Epetra_RowMatrix &matrix)
const
131 const auto run = [&](
const auto &constant_modes) {
132 const Epetra_Map &domain_map = matrix.OperatorDomainMap();
134 const size_type constant_modes_dimension = constant_modes.size();
135 ptr_distributed_constant_modes =
136 std::make_unique<Epetra_MultiVector>(domain_map,
137 constant_modes_dimension > 0 ?
138 constant_modes_dimension :
141 Epetra_MultiVector &distributed_constant_modes =
142 *ptr_distributed_constant_modes;
144 if (constant_modes_dimension > 0)
151 distributed_constant_modes)),
154 distributed_constant_modes)));
155 const bool constant_modes_are_global =
156 constant_modes[0].size() == global_size;
157 const size_type my_size = domain_map.NumMyElements();
162 constant_modes_are_global ? global_size : my_size;
163 for (
size_type d = 0; d < constant_modes_dimension; ++d)
165 Assert(constant_modes[d].
size() == expected_mode_size,
167 expected_mode_size));
168 for (
size_type row = 0; row < my_size; ++row)
171 constant_modes_are_global ?
174 distributed_constant_modes[d][row] =
175 static_cast<double>(constant_modes[d][mode_index]);
178 (void)expected_mode_size;
180 parameter_list.set(
"null space: type",
"pre-computed");
181 parameter_list.set(
"null space: dimension",
182 distributed_constant_modes.NumVectors());
183 parameter_list.set(
"null space: vectors",
184 distributed_constant_modes.Values());
188 if (!constant_modes_values.empty())
191 run(constant_modes_values);
201 Teuchos::ParameterList ¶meter_list,
202 std::unique_ptr<Epetra_MultiVector> &distributed_constant_modes,
205 return set_parameters(parameter_list,
206 distributed_constant_modes,
207 matrix.trilinos_matrix());
214 Teuchos::ParameterList ¶meter_list,
215 std::unique_ptr<Epetra_MultiVector> &distributed_constant_modes,
218 return set_operator_null_space(parameter_list,
219 distributed_constant_modes,
220 matrix.trilinos_matrix());
247 Teuchos::ParameterList ml_parameters;
248 std::unique_ptr<Epetra_MultiVector> distributed_constant_modes;
250 distributed_constant_modes,
257 ML_Epetra::MultiLevelPreconditioner *multilevel_operator =
258 dynamic_cast<ML_Epetra::MultiLevelPreconditioner *
>(
260 Assert(multilevel_operator !=
nullptr,
262 multilevel_operator->PrintUnused(0);
290 const ::SparseMatrix<number> &deal_ii_sparse_matrix,
292 const double drop_tolerance,
293 const ::SparsityPattern *use_this_sparsity)
296 const size_type n_rows = deal_ii_sparse_matrix.m();
301 const unsigned int n_mpi_processes =
communicator.NumProc();
303 distributor.
add_range(my_id * n_rows / n_mpi_processes,
304 (my_id + 1) * n_rows / n_mpi_processes);
311 deal_ii_sparse_matrix,
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")