1 #ifndef MUELU_CREATE_EPETRA_PRECONDITIONER_CPP
2 #define MUELU_CREATE_EPETRA_PRECONDITIONER_CPP
4 #include <Teuchos_XMLParameterListHelpers.hpp>
5 #include <Xpetra_CrsMatrix.hpp>
6 #include <Xpetra_MultiVector.hpp>
7 #include <Xpetra_MultiVectorFactory.hpp>
13 #include <MueLu_Hierarchy.hpp>
16 #include <MueLu_MLParameterListInterpreter.hpp>
17 #include <MueLu_ParameterListInterpreter.hpp>
18 #include <MueLu_Utilities.hpp>
19 #include <MueLu_HierarchyUtils.hpp>
23 #if defined(HAVE_MUELU_EPETRA)
33 Teuchos::RCP<MueLu::EpetraOperator>
36 Teuchos::ParameterList& paramListIn)
43 using Teuchos::ParameterList;
45 using MultiVector = Xpetra::MultiVector<SC, LO, GO, NO>;
46 using Matrix = Xpetra::Matrix<SC, LO, GO, NO>;
50 Teuchos::ParameterList& userList = paramListIn.sublist(
"user data");
51 if (userList.isParameter(
"Coordinates")) {
52 RCP<Xpetra::MultiVector<typename Teuchos::ScalarTraits<SC>::coordinateType,LO,GO,NO> > coordinates = Teuchos::null;
54 coordinates = EpetraMultiVector_To_XpetraMultiVector<typename Teuchos::ScalarTraits<SC>::coordinateType,LO,GO,NO>(userList.get<RCP<Epetra_MultiVector> >(
"Coordinates"));
55 }
catch(Teuchos::Exceptions::InvalidParameterType&) {
56 coordinates = userList.get<RCP<Xpetra::MultiVector<typename Teuchos::ScalarTraits<SC>::coordinateType, LO, GO, NO> > >(
"Coordinates");
58 if(Teuchos::nonnull(coordinates)){
59 userList.set<RCP<Xpetra::MultiVector<typename Teuchos::ScalarTraits<SC>::coordinateType,LO,GO,NO> > >(
"Coordinates", coordinates);
62 if (userList.isParameter(
"Nullspace")) {
63 RCP<Xpetra::MultiVector<typename Teuchos::ScalarTraits<SC>::coordinateType,LO,GO,NO> > nullspace = Teuchos::null;
65 nullspace = EpetraMultiVector_To_XpetraMultiVector<SC,LO,GO,NO>(userList.get<RCP<Epetra_MultiVector> >(
"Nullspace"));
66 }
catch(Teuchos::Exceptions::InvalidParameterType&) {
67 nullspace = userList.get<RCP<Xpetra::MultiVector<SC, LO, GO, NO> > >(
"Nullspace");
69 if(Teuchos::nonnull(nullspace)){
70 userList.set<RCP<Xpetra::MultiVector<typename Teuchos::ScalarTraits<SC>::coordinateType,LO,GO,NO> > >(
"Nullspace", nullspace);
74 RCP<Matrix> A = EpetraCrs_To_XpetraMatrix<SC, LO, GO, NO>(inA);
75 RCP<Hierarchy> H = MueLu::CreateXpetraPreconditioner<SC,LO,GO,NO>(A, paramListIn);
76 return rcp(
new EpetraOperator(H));
86 Teuchos::RCP<MueLu::EpetraOperator>
88 const std::string& xmlFileName)
90 Teuchos::ParameterList paramList;
91 Teuchos::updateParametersFromXmlFileAndBroadcast(xmlFileName, Teuchos::Ptr<Teuchos::ParameterList>(¶mList), *Xpetra::toXpetra(A->Comm()));
102 Teuchos::RCP<MueLu::EpetraOperator>
105 Teuchos::ParameterList paramList;
115 using Teuchos::ParameterList;
117 using Matrix = Xpetra::Matrix<SC, LO, GO, NO>;
120 RCP<Hierarchy> H = Op.GetHierarchy();
121 RCP<Matrix> A = EpetraCrs_To_XpetraMatrix<SC,LO,GO,NO>(inA);
123 MueLu::ReuseXpetraPreconditioner<SC,LO,GO,NO>(A, H);
126 #ifdef HAVE_MUELU_DEPRECATED_CODE
138 Teuchos::RCP<MueLu::EpetraOperator>
141 Teuchos::ParameterList& paramListIn,
142 const Teuchos::RCP<Epetra_MultiVector>& inCoords,
143 const Teuchos::RCP<Epetra_MultiVector>& inNullspace)
150 using Teuchos::ParameterList;
152 using MultiVector = Xpetra::MultiVector<SC, LO, GO, NO>;
153 using Matrix = Xpetra::Matrix<SC, LO, GO, NO>;
154 using Hierarchy = Hierarchy<SC,LO,GO,NO>;
155 using HierarchyManager = HierarchyManager<SC,LO,GO,NO>;
157 RCP<Matrix> A = EpetraCrs_To_XpetraMatrix<SC, LO, GO, NO>(inA);
159 Teuchos::ParameterList& userParamList = paramListIn.sublist(
"user data");
160 RCP<MultiVector> coordinates = Teuchos::null;
161 if (Teuchos::nonnull(inCoords)) {
162 coordinates = EpetraMultiVector_To_XpetraMultiVector<SC,LO,GO,NO>(inCoords);
164 if (Teuchos::nonnull(coordinates)) {
165 userParamList.set<RCP<MultiVector> >(
"Coordinates", coordinates);
167 RCP<MultiVector> nullspace = Teuchos::null;
168 if (Teuchos::nonnull(inNullspace)) {
169 nullspace = EpetraMultiVector_To_XpetraMultiVector<SC, LO, GO, NO>(inNullspace);
171 if (Teuchos::nonnull(nullspace)) {
172 userParamList.set<RCP<MultiVector> >(
"Nullspace", nullspace);
175 RCP<Hierarchy> H = MueLu::CreateXpetraPreconditioner<SC,LO,GO,NO>(A, paramListIn);
176 return rcp(
new EpetraOperator(H));
188 Teuchos::RCP<MueLu::EpetraOperator>
191 Teuchos::ParameterList& paramListIn,
192 const Teuchos::RCP<Epetra_MultiVector>& inCoords)
199 using Teuchos::ParameterList;
201 using MultiVector = Xpetra::MultiVector<SC, LO, GO, NO>;
202 using Matrix = Xpetra::Matrix<SC, LO, GO, NO>;
203 using Hierarchy = Hierarchy<SC,LO,GO,NO>;
204 using HierarchyManager = HierarchyManager<SC,LO,GO,NO>;
206 RCP<Matrix> A = EpetraCrs_To_XpetraMatrix<SC, LO, GO, NO>(inA);
208 Teuchos::ParameterList& userParamList = paramListIn.sublist(
"user data");
209 RCP<MultiVector> coordinates = Teuchos::null;
210 if (Teuchos::nonnull(inCoords)) {
211 coordinates = EpetraMultiVector_To_XpetraMultiVector<SC,LO,GO,NO>(inCoords);
213 if (Teuchos::nonnull(coordinates)) {
214 userParamList.set<RCP<MultiVector> >(
"Coordinates", coordinates);
217 RCP<Hierarchy> H = MueLu::CreateXpetraPreconditioner<SC,LO,GO,NO>(A, paramListIn);
218 return rcp(
new EpetraOperator(H));
230 Teuchos::RCP<MueLu::EpetraOperator>
232 const Teuchos::RCP<Epetra_MultiVector>& inCoords,
233 const Teuchos::RCP<Epetra_MultiVector>& inNullspace) {
239 using MultiVector = Xpetra::MultiVector<SC, LO, GO, NO>;
241 Teuchos::ParameterList paramList;
242 Teuchos::ParameterList& userParamList = paramList.sublist(
"user data");
244 RCP<MultiVector> coordinates = Teuchos::null;
245 if (Teuchos::nonnull(inCoords)) {
246 coordinates = EpetraMultiVector_To_XpetraMultiVector<SC,LO,GO,NO>(inCoords);
248 if (Teuchos::nonnull(coordinates)) {
249 userParamList.set<RCP<MultiVector> >(
"Coordinates", coordinates);
252 RCP<MultiVector> nullspace = Teuchos::null;
253 if (Teuchos::nonnull(inNullspace)) {
254 nullspace = EpetraMultiVector_To_XpetraMultiVector<SC,LO,GO,NO>(inNullspace);
256 if (Teuchos::nonnull(nullspace)) {
257 userParamList.set<
const Teuchos::RCP<MultiVector> >(
"Nullspace", nullspace);
272 Teuchos::RCP<MueLu::EpetraOperator>
274 const Teuchos::RCP<Epetra_MultiVector>& inCoords) {
280 using MultiVector = Xpetra::MultiVector<SC, LO, GO, NO>;
282 Teuchos::ParameterList paramList;
283 Teuchos::ParameterList& userParamList = paramList.sublist(
"user data");
285 RCP<MultiVector> coordinates = Teuchos::null;
286 if (Teuchos::nonnull(inCoords)) {
287 coordinates = EpetraMultiVector_To_XpetraMultiVector<SC,LO,GO,NO>(inCoords);
289 if (Teuchos::nonnull(coordinates)) {
290 userParamList.set<RCP<MultiVector> >(
"Coordinates", coordinates);
306 Teuchos::RCP<MueLu::EpetraOperator>
308 const std::string& xmlFileName,
309 const Teuchos::RCP<Epetra_MultiVector>& inCoords,
310 const Teuchos::RCP<Epetra_MultiVector>& inNullspace)
317 using MultiVector = Xpetra::MultiVector<SC, LO, GO, NO>;
319 Teuchos::ParameterList paramList;
320 Teuchos::updateParametersFromXmlFileAndBroadcast(xmlFileName, Teuchos::Ptr<Teuchos::ParameterList>(¶mList), *Xpetra::toXpetra(A->Comm()));
321 Teuchos::ParameterList& userParamList = paramList.sublist(
"user data");
323 RCP<MultiVector> coordinates = Teuchos::null;
324 if (inCoords != Teuchos::null) {
325 coordinates = EpetraMultiVector_To_XpetraMultiVector<SC,LO,GO,NO>(inCoords);
327 if (Teuchos::nonnull(coordinates)) {
328 userParamList.set<RCP<MultiVector> >(
"Coordinates", coordinates);
331 RCP<MultiVector> nullspace = Teuchos::null;
332 if (inCoords != Teuchos::null) {
333 nullspace = EpetraMultiVector_To_XpetraMultiVector<SC,LO,GO,NO>(inNullspace);
335 if (Teuchos::nonnull(nullspace)) {
336 userParamList.set<
const Teuchos::RCP<MultiVector> >(
"Nullspace", nullspace);
351 Teuchos::RCP<MueLu::EpetraOperator>
353 const std::string& xmlFileName,
354 const Teuchos::RCP<Epetra_MultiVector>& inCoords)
361 using MultiVector = Xpetra::MultiVector<SC, LO, GO, NO>;
363 Teuchos::ParameterList paramList;
364 Teuchos::updateParametersFromXmlFileAndBroadcast(xmlFileName, Teuchos::Ptr<Teuchos::ParameterList>(¶mList), *Xpetra::toXpetra(A->Comm()));
365 Teuchos::ParameterList& userParamList = paramList.sublist(
"user data");
367 RCP<MultiVector> coordinates = Teuchos::null;
368 if (inCoords != Teuchos::null) {
369 coordinates = EpetraMultiVector_To_XpetraMultiVector<SC,LO,GO,NO>(inCoords);
371 if (Teuchos::nonnull(coordinates)) {
372 userParamList.set<RCP<MultiVector> >(
"Coordinates", coordinates);
Various adapters that will create a MueLu preconditioner that is an Xpetra::Matrix.
Kokkos::Compat::KokkosSerialWrapperNode EpetraNode
Provides methods to build a multigrid hierarchy and apply multigrid cycles.
Namespace for MueLu classes and methods.
void ReuseEpetraPreconditioner(const Teuchos::RCP< Epetra_CrsMatrix > &inA, MueLu::EpetraOperator &Op)
Teuchos::RCP< MueLu::EpetraOperator > CreateEpetraPreconditioner(const Teuchos::RCP< Epetra_CrsMatrix > &inA, Teuchos::ParameterList ¶mListIn)
Helper function to create a MueLu preconditioner that can be used by Epetra.Given a EpetraCrs_Matrix,...