84 Teuchos::ParameterList paramList = paramList_in;
86 RCP<Teuchos::FancyOStream> out = Teuchos::fancyOStream(Teuchos::rcpFromRef(std::cout));
99 MUELU_READ_PARAM(paramList,
"aggregation: type", std::string,
"Uncoupled", agg_type);
101 MUELU_READ_PARAM(paramList,
"aggregation: damping factor",
double, (
double)4/(
double)3, agg_damping);
103 MUELU_READ_PARAM(paramList,
"aggregation: nodes per aggregate",
int, 1, minPerAgg);
105 MUELU_READ_PARAM(paramList,
"null space: type", std::string,
"default vectors", nullspaceType);
106 MUELU_READ_PARAM(paramList,
"null space: dimension",
int, -1, nullspaceDim);
107 MUELU_READ_PARAM(paramList,
"null space: vectors",
double*, NULL, nullspaceVec);
109 MUELU_READ_PARAM(paramList,
"energy minimization: enable",
bool,
false, bEnergyMinimization);
118 ParameterList paramListWithSubList;
120 paramList = paramListWithSubList;
125 int maxNbrAlreadySelected = 0;
128 this->blksize_ = nDofsPerNode;
131 Teuchos::EVerbosityLevel eVerbLevel = Teuchos::VERB_NONE;
132 if (verbosityLevel == 0) eVerbLevel = Teuchos::VERB_NONE;
133 if (verbosityLevel > 0) eVerbLevel = Teuchos::VERB_LOW;
134 if (verbosityLevel > 4) eVerbLevel = Teuchos::VERB_MEDIUM;
135 if (verbosityLevel > 7) eVerbLevel = Teuchos::VERB_HIGH;
136 if (verbosityLevel > 9) eVerbLevel = Teuchos::VERB_EXTREME;
138 TEUCHOS_TEST_FOR_EXCEPTION(agg_type !=
"Uncoupled" && agg_type !=
"Coupled",
Exceptions::RuntimeError,
"MueLu::MLParameterListInterpreter::Setup(): parameter \"aggregation: type\": only 'Uncoupled' or 'Coupled' aggregation is supported.");
145 RCP<FactoryBase> CoupledAggFact = Teuchos::null;
146 if(agg_type ==
"Uncoupled") {
149 CoupledAggFact2->SetMinNodesPerAggregate(minPerAgg);
150 CoupledAggFact2->SetMaxNeighAlreadySelected(maxNbrAlreadySelected);
151 CoupledAggFact2->SetOrdering(
"natural");
152 CoupledAggFact = CoupledAggFact2;
156 CoupledAggFact2->SetMinNodesPerAggregate(minPerAgg);
157 CoupledAggFact2->SetMaxNeighAlreadySelected(maxNbrAlreadySelected);
158 CoupledAggFact2->SetOrdering(
"natural");
159 CoupledAggFact2->SetPhase3AggCreation(0.5);
160 CoupledAggFact = CoupledAggFact2;
162 if (verbosityLevel > 3) {
163 *out <<
"========================= Aggregate option summary =========================" << std::endl;
164 *out <<
"min Nodes per aggregate : " << minPerAgg << std::endl;
165 *out <<
"min # of root nbrs already aggregated : " << maxNbrAlreadySelected << std::endl;
166 *out <<
"aggregate ordering : natural" << std::endl;
167 *out <<
"=============================================================================" << std::endl;
173 if (agg_damping == 0.0 && bEnergyMinimization ==
false) {
177 }
else if (agg_damping != 0.0 && bEnergyMinimization ==
false) {
179 RCP<SaPFactory> SaPFact = rcp(
new SaPFactory() );
180 SaPFact->SetParameter(
"sa: damping factor", ParameterEntry(agg_damping));
183 }
else if (bEnergyMinimization ==
true) {
189 RCP<RAPFactory> AcFact = rcp(
new RAPFactory() );
190 for (
size_t i = 0; i<TransferFacts_.size(); i++) {
191 AcFact->AddTransferFactory(TransferFacts_[i]);
201 if (nullspaceType !=
"default vectors") {
202 TEUCHOS_TEST_FOR_EXCEPTION(nullspaceType !=
"pre-computed",
Exceptions::RuntimeError,
"MueLu::MLParameterListInterpreter: no valid nullspace (no pre-computed null space). error.");
203 TEUCHOS_TEST_FOR_EXCEPTION(nullspaceDim == -1,
Exceptions::RuntimeError,
"MueLu::MLParameterListInterpreter: no valid nullspace (nullspace dim == -1). error.");
204 TEUCHOS_TEST_FOR_EXCEPTION(nullspaceVec == NULL,
Exceptions::RuntimeError,
"MueLu::MLParameterListInterpreter: no valid nullspace (nullspace == NULL). You have to provide a valid fine-level nullspace in \'null space: vectors\'");
206 nullspaceDim_ = nullspaceDim;
207 nullspace_ = nullspaceVec;
210 Teuchos::RCP<NullspaceFactory> nspFact = Teuchos::rcp(
new NullspaceFactory());
211 nspFact->SetFactory(
"Nullspace", PtentFact);
219 this->numDesiredLevel_ = maxLevels;
220 this->maxCoarseSize_ = maxCoarseSize;
223 RCP<SmootherFactory> initSmootherFact = Teuchos::null;
224 if(paramList.isSublist(
"init smoother")) {
225 ParameterList& initList = paramList.sublist(
"init smoother");
228 std::string ifpackType =
"RELAXATION";
229 Teuchos::ParameterList smootherParamList;
230 smootherParamList.set(
"relaxation: type",
"symmetric Gauss-Seidel");
231 smootherParamList.set(
"smoother: sweeps", 1);
232 smootherParamList.set(
"smoother: damping factor", 1.0);
233 RCP<SmootherPrototype> smooProto = rcp(
new TrilinosSmoother(ifpackType, smootherParamList, 0) );
236 initSmootherFact->SetSmootherPrototypes(smooProto, smooProto);
242 ParameterList& coarseList = paramList.sublist(
"coarse: list");
258 for (
int levelID=0; levelID < maxLevels; levelID++) {
275 ParameterList levelSmootherParam =
GetMLSubList(paramList,
"smoother", levelID);
282 manager->SetFactory(
"Smoother", smootherFact);
283 smootherFact->DisableMultipleCallCheck();
285 initmanager->SetFactory(
"Smoother", initSmootherFact);
286 initmanager->SetFactory(
"CoarseSolver", initSmootherFact);
287 initSmootherFact->DisableMultipleCallCheck();
295 Teuchos::rcp_dynamic_cast<PFactory>(PFact)->DisableMultipleCallCheck();
296 Teuchos::rcp_dynamic_cast<PFactory>(PtentFact)->DisableMultipleCallCheck();
297 Teuchos::rcp_dynamic_cast<TwoLevelFactoryBase>(RFact)->DisableMultipleCallCheck();
298 Teuchos::rcp_dynamic_cast<SingleLevelFactoryBase>(coarseFact)->DisableMultipleCallCheck();
299 Teuchos::rcp_dynamic_cast<SingleLevelFactoryBase>(dropFact)->DisableMultipleCallCheck();
300 Teuchos::rcp_dynamic_cast<SingleLevelFactoryBase>(CoupledAggFact)->DisableMultipleCallCheck();
301 Teuchos::rcp_dynamic_cast<TwoLevelFactoryBase>(AcFact)->DisableMultipleCallCheck();
302 Teuchos::rcp_dynamic_cast<SingleLevelFactoryBase>(nspFact)->DisableMultipleCallCheck();
304 manager->SetFactory(
"CoarseSolver", coarseFact);
305 manager->SetFactory(
"Graph", dropFact);
306 manager->SetFactory(
"Aggregates", CoupledAggFact);
307 manager->SetFactory(
"DofsPerNode", dropFact);
308 manager->SetFactory(
"A", AcFact);
309 manager->SetFactory(
"P", PFact);
310 manager->SetFactory(
"Ptent", PtentFact);
311 manager->SetFactory(
"R", RFact);
312 manager->SetFactory(
"Nullspace", nspFact);
315 initmanager->SetFactory(
"Graph", dropFact);
316 initmanager->SetFactory(
"Aggregates", CoupledAggFact);
317 initmanager->SetFactory(
"DofsPerNode", dropFact);
318 initmanager->SetFactory(
"A", AcFact);
319 initmanager->SetFactory(
"P", PtentFact);
320 initmanager->SetFactory(
"Ptent", PtentFact);
321 initmanager->SetFactory(
"R", RFact);
322 initmanager->SetFactory(
"Nullspace", nspFact);
324 this->AddFactoryManager(levelID, 1, manager);
325 this->AddInitFactoryManager(levelID, 1, initmanager);
362 if (this->nullspace_ != NULL) {
363 RCP<Level> fineLevel = H.
GetLevel(0);
364 const RCP<const Map> rowMap = fineLevel->Get< RCP<Matrix> >(
"A")->getRowMap();
365 RCP<MultiVector> nullspace = MultiVectorFactory::Build(rowMap, nullspaceDim_,
true);
367 for (
size_t i=0; i < Teuchos::as<size_t>(nullspaceDim_); i++) {
368 Teuchos::ArrayRCP<Scalar> nullspacei = nullspace->getDataNonConst(i);
369 const size_t myLength = nullspace->getLocalLength();
371 for (
size_t j = 0; j < myLength; j++) {
372 nullspacei[j] = nullspace_[i*myLength + j];
376 fineLevel->Set(
"Nullspace", nullspace);
385 SetupInitHierarchy(H);
389 Teuchos::RCP<MueLu::Level> Finest = H.
GetLevel(0);
390 Teuchos::RCP<MultiVector> nspVector2 = Finest->Get<Teuchos::RCP<MultiVector> >(
"Nullspace");
392 Xpetra::IO<Scalar,LocalOrdinal,GlobalOrdinal,Node>::Write(
"orig_nsp.vec", *nspVector2);
394 RCP<Matrix> Op = Finest->Get<RCP<Matrix> >(
"A");
395 Xpetra::IO<Scalar,LocalOrdinal,GlobalOrdinal,Node>::Write(
"A.mat", *Op);
398 Teuchos::RCP<MultiVector> homogRhsVec = MultiVectorFactory::Build(nspVector2->getMap(),nspVector2->getNumVectors(),
true);
399 homogRhsVec->putScalar(0.0);
404 H.
Iterate(*homogRhsVec, *nspVector2, 1,
false);
407 Finest->Set(
"Nullspace",nspVector2);
409 Xpetra::IO<Scalar,LocalOrdinal,GlobalOrdinal,Node>::Write(
"new_nsp.vec", *nspVector2);