85 Teuchos::ParameterList parameter_list;
87 parameter_list.set(
"parameterlist: syntax",
"ml");
89 if (additional_data.
elliptic ==
true)
90 ML_Epetra::SetDefaults(
"SA", parameter_list);
93 ML_Epetra::SetDefaults(
"NSSA", parameter_list);
94 parameter_list.set(
"aggregation: block scaling",
true);
99 parameter_list.set(
"aggregation: type",
"Uncoupled");
101 parameter_list.set(
"smoother: type", additional_data.
smoother_type);
102 parameter_list.set(
"coarse: type", additional_data.
coarse_type);
104 parameter_list.set(
"smoother: sweeps",
106 parameter_list.set(
"cycle applications",
107 static_cast<int>(additional_data.
n_cycles));
108 if (additional_data.
w_cycle ==
true)
109 parameter_list.set(
"prec type",
"MGW");
111 parameter_list.set(
"prec type",
"MGV");
113 parameter_list.set(
"smoother: Chebyshev alpha", 10.);
114 parameter_list.set(
"smoother: ifpack overlap",
116 parameter_list.set(
"aggregation: threshold",
118 parameter_list.set(
"coarse: max size", 2000);
121 parameter_list.set(
"ML output", 10);
123 parameter_list.set(
"ML output", 0);
125 const Epetra_Map &domain_map = matrix.OperatorDomainMap();
127 const size_type constant_modes_dimension =
129 Epetra_MultiVector distributed_constant_modes(
130 domain_map, constant_modes_dimension > 0 ? constant_modes_dimension : 1);
131 std::vector<double> dummy(constant_modes_dimension);
133 if (constant_modes_dimension > 0)
136 const bool constant_modes_are_global =
139 constant_modes_are_global ? n_rows :
141 const size_type my_size = domain_map.NumMyElements();
142 if (constant_modes_are_global ==
false)
143 Assert(n_relevant_rows == my_size,
146 distributed_constant_modes)),
149 distributed_constant_modes)));
151 (void)n_relevant_rows;
156 for (
size_type d = 0; d < constant_modes_dimension; ++d)
157 for (
size_type row = 0; row < my_size; ++row)
160 constant_modes_are_global ?
163 distributed_constant_modes[d][row] =
static_cast<double>(
167 parameter_list.set(
"null space: type",
"pre-computed");
168 parameter_list.set(
"null space: dimension",
169 distributed_constant_modes.NumVectors());
171 parameter_list.set(
"null space: vectors",
172 distributed_constant_modes.Values());
176 parameter_list.set(
"null space: vectors", dummy.data());
208 const ::SparseMatrix<number> &deal_ii_sparse_matrix,
210 const double drop_tolerance,
211 const ::SparsityPattern *use_this_sparsity)
214 const size_type n_rows = deal_ii_sparse_matrix.m();
219 const unsigned int n_mpi_processes =
communicator.NumProc();
221 distributor.
add_range(my_id * n_rows / n_mpi_processes,
222 (my_id + 1) * n_rows / n_mpi_processes);
229 deal_ii_sparse_matrix,
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")