8 #ifndef PACKAGES_MUELU_ADAPTERS_XPETRA_MUELU_CREATEXPETRAPRECONDITIONER_HPP_ 9 #define PACKAGES_MUELU_ADAPTERS_XPETRA_MUELU_CREATEXPETRAPRECONDITIONER_HPP_ 14 #include <Teuchos_XMLParameterListHelpers.hpp> 15 #include <Xpetra_CrsMatrix.hpp> 16 #include <Xpetra_MultiVector.hpp> 17 #include <Xpetra_MultiVectorFactory.hpp> 22 #include <MueLu_Hierarchy.hpp> 24 #include <MueLu_MLParameterListInterpreter.hpp> 25 #include <MueLu_ParameterListInterpreter.hpp> 26 #include <MueLu_Utilities.hpp> 27 #include <MueLu_HierarchyUtils.hpp> 42 template <
class Scalar,
class LocalOrdinal,
class GlobalOrdinal,
class Node>
43 Teuchos::RCP<MueLu::Hierarchy<Scalar,LocalOrdinal,GlobalOrdinal,Node> >
45 const Teuchos::ParameterList& inParamList,
46 Teuchos::RCP<Xpetra::MultiVector<double, LocalOrdinal, GlobalOrdinal, Node> > coords = Teuchos::null,
47 Teuchos::RCP<Xpetra::MultiVector<Scalar, LocalOrdinal, GlobalOrdinal, Node> > nullspace = Teuchos::null) {
53 typedef Xpetra::MultiVectorFactory<Scalar,LocalOrdinal,GlobalOrdinal,Node> MultiVectorFactory;
55 std::string timerName =
"MueLu setup time";
56 RCP<Teuchos::Time> tm = Teuchos::TimeMonitor::getNewTimer(timerName);
59 bool hasParamList = inParamList.numParams();
61 RCP<HierarchyManager> mueLuFactory;
64 Teuchos::ParameterList nonSerialList,paramList;
67 std::string syntaxStr =
"parameterlist: syntax";
68 if (hasParamList && paramList.isParameter(syntaxStr) && paramList.get<std::string>(syntaxStr) ==
"ml") {
69 paramList.remove(syntaxStr);
70 mueLuFactory = rcp(
new MLParameterListInterpreter(paramList));
72 mueLuFactory = rcp(
new ParameterListInterpreter(paramList,op->getDomainMap()->getComm()));
76 RCP<Hierarchy> H = mueLuFactory->CreateHierarchy();
77 H->setlib(op->getDomainMap()->lib());
83 H->GetLevel(0)->Set(
"A", op);
86 if (coords != Teuchos::null) {
87 H->GetLevel(0)->Set(
"Coordinates", coords);
91 if (nullspace == Teuchos::null) {
92 int nPDE = MueLu::MasterList::getDefault<int>(
"number of equations");
93 if (paramList.isSublist(
"Matrix")) {
95 const Teuchos::ParameterList& operatorList = paramList.sublist(
"Matrix");
96 if (operatorList.isParameter(
"PDE equations"))
97 nPDE = operatorList.get<
int>(
"PDE equations");
99 }
else if (paramList.isParameter(
"number of equations")) {
101 nPDE = paramList.get<
int>(
"number of equations");
104 nullspace = MultiVectorFactory::Build(op->getDomainMap(), nPDE);
106 nullspace->putScalar(Teuchos::ScalarTraits<Scalar>::one());
109 for (
int i = 0; i < nPDE; i++) {
110 Teuchos::ArrayRCP<Scalar> nsData = nullspace->getDataNonConst(i);
111 for (
int j = 0; j < nsData.size(); j++) {
112 GlobalOrdinal GID = op->getDomainMap()->getGlobalElement(j) - op->getDomainMap()->getIndexBase();
114 if ((GID-i) % nPDE == 0)
115 nsData[j] = Teuchos::ScalarTraits<Scalar>::one();
120 H->GetLevel(0)->Set(
"Nullspace", nullspace);
123 mueLuFactory->SetupHierarchy(*H);
126 tm->incrementNumCalls();
129 const bool alwaysWriteLocal =
true;
130 const bool writeGlobalStats =
true;
131 const bool writeZeroTimers =
false;
132 const bool ignoreZeroTimers =
true;
133 const std::string filter = timerName;
134 Teuchos::TimeMonitor::summarize(op->getRowMap()->getComm().ptr(), std::cout, alwaysWriteLocal, writeGlobalStats,
135 writeZeroTimers, Teuchos::Union, filter, ignoreZeroTimers);
143 template <
class Scalar,
class LocalOrdinal,
class GlobalOrdinal,
class Node>
144 Teuchos::RCP<MueLu::Hierarchy<Scalar,LocalOrdinal,GlobalOrdinal,Node> >
146 const Teuchos::ParameterList& inParamList,
147 const Teuchos::ParameterList& dummy) {
154 std::string timerName =
"MueLu setup time";
155 RCP<Teuchos::Time> tm = Teuchos::TimeMonitor::getNewTimer(timerName);
158 bool hasParamList = inParamList.numParams();
160 RCP<HierarchyManager> mueLuFactory;
163 Teuchos::ParameterList nonSerialList,paramList;
166 std::string syntaxStr =
"parameterlist: syntax";
167 if (hasParamList && paramList.isParameter(syntaxStr) && paramList.get<std::string>(syntaxStr) ==
"ml") {
168 paramList.remove(syntaxStr);
169 mueLuFactory = rcp(
new MLParameterListInterpreter(paramList));
171 mueLuFactory = rcp(
new ParameterListInterpreter(paramList,op->getDomainMap()->getComm()));
175 RCP<Hierarchy> H = mueLuFactory->CreateHierarchy();
176 H->setlib(op->getDomainMap()->lib());
182 H->GetLevel(0)->Set(
"A", op);
184 mueLuFactory->SetupHierarchy(*H);
187 tm->incrementNumCalls();
190 const bool alwaysWriteLocal =
true;
191 const bool writeGlobalStats =
true;
192 const bool writeZeroTimers =
false;
193 const bool ignoreZeroTimers =
true;
194 const std::string filter = timerName;
195 Teuchos::TimeMonitor::summarize(op->getRowMap()->getComm().ptr(), std::cout, alwaysWriteLocal, writeGlobalStats,
196 writeZeroTimers, Teuchos::Union, filter, ignoreZeroTimers);
211 template <
class Scalar,
class LocalOrdinal,
class GlobalOrdinal,
class Node>
214 std::string timerName =
"MueLu setup time";
215 RCP<Teuchos::Time> tm = Teuchos::TimeMonitor::getNewTimer(timerName);
219 typedef LocalOrdinal LO;
220 typedef GlobalOrdinal GO;
223 typedef Xpetra::Matrix<SC,LO,GO,NO> Matrix;
224 typedef Xpetra::Operator<SC,LO,GO,NO> Operator;
227 "MueLu::ReuseXpetraPreconditioner: Hierarchy has no levels in it");
229 "MueLu::ReuseXpetraPreconditioner: Hierarchy has no fine level operator");
230 RCP<Level> level0 = H->GetLevel(0);
232 RCP<Operator> O0 = level0->Get<RCP<Operator> >(
"A");
233 RCP<Matrix> A0 = Teuchos::rcp_dynamic_cast<Matrix>(O0);
239 A->SetFixedBlockSize(A0->GetFixedBlockSize());
246 tm->incrementNumCalls();
249 const bool alwaysWriteLocal =
true;
250 const bool writeGlobalStats =
true;
251 const bool writeZeroTimers =
false;
252 const bool ignoreZeroTimers =
true;
253 const std::string filter = timerName;
254 Teuchos::TimeMonitor::summarize(A->getRowMap()->getComm().ptr(), std::cout, alwaysWriteLocal, writeGlobalStats,
255 writeZeroTimers, Teuchos::Union, filter, ignoreZeroTimers);
void ReuseXpetraPreconditioner(const Teuchos::RCP< Xpetra::Matrix< Scalar, LocalOrdinal, GlobalOrdinal, Node > > &A, Teuchos::RCP< MueLu::Hierarchy< Scalar, LocalOrdinal, GlobalOrdinal, Node >> &H)
Helper function to reuse an existing MueLu preconditioner.
static void AddNonSerializableDataToHierarchy(HierarchyManager &HM, Hierarchy &H, const ParameterList &nonSerialList)
Teuchos::RCP< MueLu::Hierarchy< Scalar, LocalOrdinal, GlobalOrdinal, Node > > CreateXpetraPreconditioner(Teuchos::RCP< Xpetra::Matrix< Scalar, LocalOrdinal, GlobalOrdinal, Node > > op, const Teuchos::ParameterList &inParamList, Teuchos::RCP< Xpetra::MultiVector< double, LocalOrdinal, GlobalOrdinal, Node > > coords=Teuchos::null, Teuchos::RCP< Xpetra::MultiVector< Scalar, LocalOrdinal, GlobalOrdinal, Node > > nullspace=Teuchos::null)
Helper function to create a MueLu preconditioner that can be used by Xpetra.Given an Xpetra::Matrix...
Namespace for MueLu classes and methods.
Print statistics that do not involve significant additional computation.
Class that accepts ML-style parameters and builds a MueLu preconditioner. This interpreter uses the s...
Exception throws to report errors in the internal logical of the program.
Provides methods to build a multigrid hierarchy and apply multigrid cycles.
long ExtractNonSerializableData(const Teuchos::ParameterList &inList, Teuchos::ParameterList &serialList, Teuchos::ParameterList &nonSerialList)