16 #include <deal.II/lac/trilinos_precondition.h> 18 #ifdef DEAL_II_WITH_TRILINOS 19 #if DEAL_II_TRILINOS_VERSION_GTE(11,14,0) 21 # include <deal.II/lac/vector.h> 22 # include <deal.II/lac/sparse_matrix.h> 23 # include <deal.II/lac/trilinos_sparse_matrix.h> 25 DEAL_II_DISABLE_EXTRA_DIAGNOSTICS
26 # include <Teuchos_ParameterList.hpp> 27 # include <Teuchos_RCP.hpp> 28 # include <Epetra_MultiVector.h> 29 # include <ml_include.h> 30 # include <ml_MultiLevelPreconditioner.h> 33 # include <MueLu_EpetraOperator.hpp> 34 # include <MueLu_MLParameterListInterpreter.hpp> 37 DEAL_II_NAMESPACE_OPEN
43 #ifndef DEAL_II_WITH_64BIT_INDICES 44 int n_global_rows (
const Epetra_RowMatrix &matrix)
46 return matrix.NumGlobalRows();
49 int global_length (
const Epetra_MultiVector &vector)
51 return vector.GlobalLength();
54 int gid(
const Epetra_Map &map,
unsigned int i)
59 long long int n_global_rows (
const Epetra_RowMatrix &matrix)
61 return matrix.NumGlobalRows64();
64 long long int global_length (
const Epetra_MultiVector &vector)
66 return vector.GlobalLength64();
80 const unsigned int n_cycles,
82 const double aggregation_threshold,
83 const std::vector<std::vector<bool> > &constant_modes,
84 const unsigned int smoother_sweeps,
85 const unsigned int smoother_overlap,
86 const bool output_details,
87 const char *smoother_type,
88 const char *coarse_type)
93 aggregation_threshold (aggregation_threshold),
94 constant_modes (constant_modes),
95 smoother_sweeps (smoother_sweeps),
96 smoother_overlap (smoother_overlap),
97 output_details (output_details),
98 smoother_type (smoother_type),
99 coarse_type (coarse_type)
113 const AdditionalData &additional_data)
115 initialize(matrix.trilinos_matrix(), additional_data);
122 const AdditionalData &additional_data)
125 Teuchos::ParameterList parameter_list;
127 if (additional_data.elliptic ==
true)
128 ML_Epetra::SetDefaults(
"SA",parameter_list);
131 ML_Epetra::SetDefaults(
"NSSA",parameter_list);
132 parameter_list.set(
"aggregation: block scaling",
true);
137 parameter_list.set(
"aggregation: type",
"Uncoupled");
139 parameter_list.set(
"smoother: type", additional_data.smoother_type);
140 parameter_list.set(
"coarse: type", additional_data.coarse_type);
142 parameter_list.set(
"smoother: sweeps",
143 static_cast<int>(additional_data.smoother_sweeps));
144 parameter_list.set(
"cycle applications",
145 static_cast<int>(additional_data.n_cycles));
146 if (additional_data.w_cycle ==
true)
147 parameter_list.set(
"prec type",
"MGW");
149 parameter_list.set(
"prec type",
"MGV");
151 parameter_list.set(
"smoother: Chebyshev alpha",10.);
152 parameter_list.set(
"smoother: ifpack overlap",
153 static_cast<int>(additional_data.smoother_overlap));
154 parameter_list.set(
"aggregation: threshold",
155 additional_data.aggregation_threshold);
156 parameter_list.set(
"coarse: max size", 2000);
158 if (additional_data.output_details)
159 parameter_list.set(
"ML output", 10);
161 parameter_list.set(
"ML output", 0);
163 const Epetra_Map &domain_map = matrix.OperatorDomainMap();
165 const size_type constant_modes_dimension =
166 additional_data.constant_modes.size();
167 Epetra_MultiVector distributed_constant_modes (domain_map,
168 constant_modes_dimension > 0 ?
169 constant_modes_dimension : 1);
170 std::vector<double> dummy (constant_modes_dimension);
172 if (constant_modes_dimension > 0)
174 const size_type n_rows = n_global_rows(matrix);
175 const bool constant_modes_are_global =
176 additional_data.constant_modes[0].size() == n_rows;
178 constant_modes_are_global ? n_rows : additional_data.constant_modes[0].size();
179 const size_type my_size = domain_map.NumMyElements();
180 if (constant_modes_are_global ==
false)
181 Assert (n_relevant_rows == my_size,
182 ExcDimensionMismatch(n_relevant_rows, my_size));
184 static_cast<size_type>(global_length(distributed_constant_modes)),
185 ExcDimensionMismatch(n_rows,
186 global_length(distributed_constant_modes)));
188 (void)n_relevant_rows;
193 for (
size_type d=0; d<constant_modes_dimension; ++d)
194 for (
size_type row=0; row<my_size; ++row)
196 TrilinosWrappers::types::int_type global_row_id =
197 constant_modes_are_global ? gid(domain_map,row) : row;
198 distributed_constant_modes[d][row] =
199 additional_data.constant_modes[d][global_row_id];
202 parameter_list.set(
"null space: type",
"pre-computed");
203 parameter_list.set(
"null space: dimension",
204 distributed_constant_modes.NumVectors());
206 parameter_list.set(
"null space: vectors",
207 distributed_constant_modes.Values());
211 parameter_list.set(
"null space: vectors",
222 Teuchos::ParameterList &muelu_parameters)
224 initialize(matrix.trilinos_matrix(), muelu_parameters);
231 Teuchos::ParameterList &muelu_parameters)
238 typedef KokkosClassic::DefaultNode::DefaultNodeType node;
243 Teuchos::RCP<Epetra_CrsMatrix> rcp_matrix = Teuchos::rcpFromRef(
244 *(const_cast<Epetra_CrsMatrix *>(&matrix)));
245 Teuchos::RCP<Xpetra::CrsMatrix<double,int,int,node> > muelu_crs_matrix =
246 Teuchos::rcp(
new Xpetra::EpetraCrsMatrix (rcp_matrix));
247 Teuchos::RCP<Xpetra::Matrix<double,int,int,node> > muelu_matrix =
248 Teuchos::rcp(
new Xpetra::CrsMatrixWrap<double,int,int,node> (muelu_crs_matrix));
251 Teuchos::RCP<MueLu::HierarchyManager<double,int,int,node> > hierarchy_factory;
252 hierarchy_factory = Teuchos::rcp(
253 new MueLu::MLParameterListInterpreter<double,int,int,node> (muelu_parameters));
254 Teuchos::RCP<MueLu::Hierarchy<double,int,int,node> > hierarchy = hierarchy_factory->CreateHierarchy();
255 hierarchy->GetLevel(0)->Set(
"A",muelu_matrix);
256 hierarchy_factory->SetupHierarchy(*hierarchy);
265 template <
typename number>
268 initialize (const ::SparseMatrix<number> &deal_ii_sparse_matrix,
269 const AdditionalData &additional_data,
270 const double drop_tolerance,
271 const ::SparsityPattern *use_this_sparsity)
274 const size_type n_rows = deal_ii_sparse_matrix.m();
280 vector_distributor.reset (
new Epetra_Map(static_cast<TrilinosWrappers::types::int_type>(n_rows),
287 deal_ii_sparse_matrix, drop_tolerance,
true,
306 unsigned int memory =
sizeof(
this);
319 const AdditionalData &,
const double,
320 const ::SparsityPattern *);
322 const AdditionalData &,
const double,
323 const ::SparsityPattern *);
327 DEAL_II_NAMESPACE_CLOSE
329 #endif // DEAL_II_TRILINOS_VERSION_GTE(11,14,0) 330 #endif // DEAL_II_WITH_TRILINOS void initialize(const SparseMatrix &matrix, const AdditionalData &additional_data=AdditionalData())
AdditionalData(const bool elliptic=true, 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")
size_type memory_consumption() const
std_cxx11::shared_ptr< SparseMatrix > trilinos_matrix
std_cxx11::shared_ptr< Epetra_Map > vector_distributor
std_cxx11::shared_ptr< Epetra_Operator > preconditioner
unsigned int global_dof_index
#define Assert(cond, exc)
void initialize(const SparseMatrix &matrix, const AdditionalData &additional_data=AdditionalData())
::types::global_dof_index size_type
Epetra_MpiComm communicator