46 #ifndef MUELU_FACTORYFACTORY_DECL_HPP 47 #define MUELU_FACTORYFACTORY_DECL_HPP 52 #include <Teuchos_ParameterEntry.hpp> 53 #include <Teuchos_Array.hpp> 61 #include "MueLu_FactoryManager.hpp" 70 #include "MueLu_AggregationExportFactory.hpp" 71 #include "MueLu_AmalgamationFactory.hpp" 72 #ifdef HAVE_MUELU_EXPERIMENTAL 73 #include "MueLu_BlockedCoarseMapFactory.hpp" 74 #include "MueLu_BlockedDirectSolver.hpp" 75 #include "MueLu_BlockedGaussSeidelSmoother.hpp" 76 #include "MueLu_BlockedPFactory.hpp" 77 #include "MueLu_BlockedRAPFactory.hpp" 78 #include "MueLu_BraessSarazinSmoother.hpp" 80 #include "MueLu_BrickAggregationFactory.hpp" 81 #include "MueLu_CoalesceDropFactory.hpp" 82 #include "MueLu_CoarseMapFactory.hpp" 83 #include "MueLu_CoarseningVisualizationFactory.hpp" 84 #include "MueLu_ConstraintFactory.hpp" 85 #include "MueLu_CoupledAggregationFactory.hpp" 86 #include "MueLu_CoordinatesTransferFactory.hpp" 87 #include "MueLu_DirectSolver.hpp" 88 #include "MueLu_EminPFactory.hpp" 89 #include "MueLu_FilteredAFactory.hpp" 90 #include "MueLu_GenericRFactory.hpp" 91 #ifdef HAVE_MUELU_EXPERIMENTAL 92 #include "MueLu_IndefBlockedDiagonalSmoother.hpp" 94 #include "MueLu_IsorropiaInterface.hpp" 95 #include "MueLu_LineDetectionFactory.hpp" 96 #include "MueLu_RepartitionInterface.hpp" 97 #include "MueLu_MapTransferFactory.hpp" 98 #include "MueLu_MatrixAnalysisFactory.hpp" 99 #include "MueLu_MultiVectorTransferFactory.hpp" 100 #include "MueLu_NullspaceFactory.hpp" 101 #include "MueLu_NullspacePresmoothFactory.hpp" 102 #include "MueLu_PatternFactory.hpp" 103 #include "MueLu_PgPFactory.hpp" 104 #include "MueLu_RebalanceTransferFactory.hpp" 105 #include "MueLu_RepartitionFactory.hpp" 106 #include "MueLu_RAPFactory.hpp" 107 #include "MueLu_RebalanceAcFactory.hpp" 108 #include "MueLu_SaPFactory.hpp" 109 #include "MueLu_SegregatedAFactory.hpp" 110 #ifdef HAVE_MUELU_EXPERIMENTAL 111 #include "MueLu_SchurComplementFactory.hpp" 112 #include "MueLu_SimpleSmoother.hpp" 114 #include "MueLu_SmootherFactory.hpp" 115 #ifdef HAVE_MUELU_EXPERIMENTAL 116 #include "MueLu_SubBlockAFactory.hpp" 118 #include "MueLu_TentativePFactory.hpp" 119 #include "MueLu_ToggleCoordinatesTransferFactory.hpp" 120 #include "MueLu_TogglePFactory.hpp" 121 #include "MueLu_TrilinosSmoother.hpp" 122 #include "MueLu_TransPFactory.hpp" 123 #include "MueLu_UncoupledAggregationFactory.hpp" 124 #include "MueLu_UserAggregationFactory.hpp" 125 #include "MueLu_UserPFactory.hpp" 126 #include "MueLu_SemiCoarsenPFactory.hpp" 127 #ifdef HAVE_MUELU_EXPERIMENTAL 128 #include "MueLu_UzawaSmoother.hpp" 130 #include "MueLu_ZoltanInterface.hpp" 131 #include "MueLu_Zoltan2Interface.hpp" 133 #ifdef HAVE_MUELU_MATLAB 135 #include "../matlab/src/MueLu_SingleLevelMatlabFactory_decl.hpp" 136 #include "../matlab/src/MueLu_SingleLevelMatlabFactory_def.hpp" 137 #include "../matlab/src/MueLu_TwoLevelMatlabFactory_decl.hpp" 138 #include "../matlab/src/MueLu_TwoLevelMatlabFactory_def.hpp" 139 #include "../matlab/src/MueLu_MatlabSmoother_decl.hpp" 140 #include "../matlab/src/MueLu_MatlabSmoother_def.hpp" 151 template <
class Scalar =
double,
class LocalOrdinal =
int,
class GlobalOrdinal = LocalOrdinal,
class Node = KokkosClassic::DefaultNode::DefaultNodeType>
153 #undef MUELU_FACTORYFACTORY_SHORT 156 typedef std::map<std::string, RCP<const FactoryBase> >
FactoryMap;
172 virtual RCP<const FactoryBase>
BuildFactory(
const Teuchos::ParameterEntry& param,
const FactoryMap& factoryMapIn,
const FactoryManagerMap& factoryManagersIn)
const {
174 std::string factoryName;
175 Teuchos::ParameterList paramList;
176 if (!param.isList()) {
177 factoryName = Teuchos::getValue<std::string>(param);
179 paramList = Teuchos::getValue<Teuchos::ParameterList>(param);
180 factoryName = paramList.get<std::string>(
"factory");
184 if (factoryName ==
"AggregationExportFactory")
return Build2<AggregationExportFactory> (paramList, factoryMapIn, factoryManagersIn);
185 if (factoryName ==
"AmalgamationFactory")
return Build2<AmalgamationFactory> (paramList, factoryMapIn, factoryManagersIn);
186 #ifdef HAVE_MUELU_EXPERIMENTAL 187 if (factoryName ==
"BlockedCoarseMapFactory")
return Build2<BlockedCoarseMapFactory> (paramList, factoryMapIn, factoryManagersIn);
188 if (factoryName ==
"BlockedRAPFactory")
return BuildRAPFactory<BlockedRAPFactory> (paramList, factoryMapIn, factoryManagersIn);
190 if (factoryName ==
"BrickAggregationFactory")
return Build2<BrickAggregationFactory> (paramList, factoryMapIn, factoryManagersIn);
191 if (factoryName ==
"CoarseMapFactory")
return Build2<CoarseMapFactory> (paramList, factoryMapIn, factoryManagersIn);
192 if (factoryName ==
"CoarseningVisualizationFactory")
return Build2<CoarseningVisualizationFactory>(paramList, factoryMapIn, factoryManagersIn);
193 if (factoryName ==
"CoalesceDropFactory")
return Build2<CoalesceDropFactory> (paramList, factoryMapIn, factoryManagersIn);
194 if (factoryName ==
"ConstraintFactory")
return Build2<ConstraintFactory> (paramList, factoryMapIn, factoryManagersIn);
196 if (factoryName ==
"CoordinatesTransferFactory")
return Build2<CoordinatesTransferFactory> (paramList, factoryMapIn, factoryManagersIn);
197 if (factoryName ==
"DirectSolver")
return BuildDirectSolver (paramList, factoryMapIn, factoryManagersIn);
198 if (factoryName ==
"EminPFactory")
return Build2<EminPFactory> (paramList, factoryMapIn, factoryManagersIn);
199 if (factoryName ==
"FilteredAFactory")
return Build2<FilteredAFactory> (paramList, factoryMapIn, factoryManagersIn);
200 if (factoryName ==
"GenericRFactory")
return Build2<GenericRFactory> (paramList, factoryMapIn, factoryManagersIn);
201 if (factoryName ==
"LineDetectionFactory")
return Build2<LineDetectionFactory> (paramList, factoryMapIn, factoryManagersIn);
202 if (factoryName ==
"MapTransferFactory")
return Build2<MapTransferFactory> (paramList, factoryMapIn, factoryManagersIn);
203 if (factoryName ==
"MatrixAnalysisFactory")
return Build2<MatrixAnalysisFactory> (paramList, factoryMapIn, factoryManagersIn);
204 if (factoryName ==
"MultiVectorTransferFactory")
return Build2<MultiVectorTransferFactory> (paramList, factoryMapIn, factoryManagersIn);
205 if (factoryName ==
"NoFactory")
return Teuchos::null;
206 if (factoryName ==
"NullspaceFactory")
return Build2<NullspaceFactory> (paramList, factoryMapIn, factoryManagersIn);
207 if (factoryName ==
"NullspacePresmoothFactory")
return Build2<NullspacePresmoothFactory> (paramList, factoryMapIn, factoryManagersIn);
208 if (factoryName ==
"PatternFactory")
return Build2<PatternFactory> (paramList, factoryMapIn, factoryManagersIn);
209 if (factoryName ==
"PgPFactory")
return Build2<PgPFactory> (paramList, factoryMapIn, factoryManagersIn);
210 if (factoryName ==
"SaPFactory")
return Build2<SaPFactory> (paramList, factoryMapIn, factoryManagersIn);
211 if (factoryName ==
"RAPFactory")
return BuildRAPFactory<RAPFactory> (paramList, factoryMapIn, factoryManagersIn);
212 if (factoryName ==
"RebalanceAcFactory")
return Build2<RebalanceAcFactory> (paramList, factoryMapIn, factoryManagersIn);
213 if (factoryName ==
"RebalanceTransferFactory")
return Build2<RebalanceTransferFactory> (paramList, factoryMapIn, factoryManagersIn);
214 if (factoryName ==
"SegregatedAFactory")
return Build2<SegregatedAFactory> (paramList, factoryMapIn, factoryManagersIn);
215 #ifdef HAVE_MUELU_EXPERIMENTAL 216 if (factoryName ==
"SubBlockAFactory")
return Build2<SubBlockAFactory> (paramList, factoryMapIn, factoryManagersIn);
218 if (factoryName ==
"TentativePFactory")
return Build2<TentativePFactory> (paramList, factoryMapIn, factoryManagersIn);
220 if (factoryName ==
"TogglePFactory")
return BuildTogglePFactory<TogglePFactory> (paramList, factoryMapIn, factoryManagersIn);
221 if (factoryName ==
"TransPFactory")
return Build2<TransPFactory> (paramList, factoryMapIn, factoryManagersIn);
222 if (factoryName ==
"TrilinosSmoother")
return BuildTrilinosSmoother (paramList, factoryMapIn, factoryManagersIn);
224 if (factoryName ==
"UserAggregationFactory")
return Build2<UserAggregationFactory> (paramList, factoryMapIn, factoryManagersIn);
225 if (factoryName ==
"UserPFactory")
return Build2<UserPFactory> (paramList, factoryMapIn, factoryManagersIn);
226 if (factoryName ==
"SemiCoarsenPFactory")
return Build2<SemiCoarsenPFactory> (paramList, factoryMapIn, factoryManagersIn);
227 if (factoryName ==
"RepartitionInterface")
return Build2<RepartitionInterface> (paramList, factoryMapIn, factoryManagersIn);
229 if (factoryName ==
"ZoltanInterface") {
230 #if defined(HAVE_MUELU_ZOLTAN) && defined(HAVE_MPI) 231 return Build2<ZoltanInterface>(paramList, factoryMapIn, factoryManagersIn);
233 TEUCHOS_TEST_FOR_EXCEPTION(
true,
Exceptions::RuntimeError,
"MueLu::FactoryFactory:BuildFactory(): Cannot create a ZoltanInterface object: Zoltan is disabled: HAVE_MUELU_ZOLTAN && HAVE_MPI == false.");
234 #endif // HAVE_MUELU_ZOLTAN && HAVE_MPI 236 if (factoryName ==
"Zoltan2Interface") {
237 #if defined(HAVE_MUELU_ZOLTAN2) && defined(HAVE_MPI) 238 return Build2<Zoltan2Interface>(paramList, factoryMapIn, factoryManagersIn);
240 TEUCHOS_TEST_FOR_EXCEPTION(
true,
Exceptions::RuntimeError,
"MueLu::FactoryFactory:BuildFactory(): Cannot create a Zoltan2Interface object: Zoltan2 is disabled: HAVE_MUELU_ZOLTAN2 && HAVE_MPI == false.");
241 #endif // HAVE_MUELU_ZOLTAN2 && HAVE_MPI 243 if (factoryName ==
"IsorropiaInterface") {
244 #if defined(HAVE_MUELU_ISORROPIA) && defined(HAVE_MPI) 245 return Build2<IsorropiaInterface>(paramList, factoryMapIn, factoryManagersIn);
247 TEUCHOS_TEST_FOR_EXCEPTION(
true,
Exceptions::RuntimeError,
"MueLu::FactoryFactory:BuildFactory(): Cannot create a IsorropiaInterface object: Isorropia is disabled: HAVE_MUELU_ISORROPIA && HAVE_MPI == false.");
248 #endif // HAVE_MUELU_ZOLTAN2 && HAVE_MPI 251 if (factoryName ==
"RepartitionFactory") {
253 return Build2<RepartitionFactory>(paramList, factoryMapIn, factoryManagersIn);
255 TEUCHOS_TEST_FOR_EXCEPTION(
true,
Exceptions::RuntimeError,
"MueLu::FactoryFactory:BuildFactory(): Cannot create a RepartitionFactory object: HAVE_MPI == false.");
259 #ifdef HAVE_MUELU_EXPERIMENTAL 260 if (factoryName ==
"BlockedDirectSolver")
return BuildBlockedDirectSolver(paramList, factoryMapIn, factoryManagersIn);
261 if (factoryName ==
"BlockedGaussSeidelSmoother")
return BuildBlockedSmoother<BlockedGaussSeidelSmoother>(paramList, factoryMapIn, factoryManagersIn);
262 if (factoryName ==
"BlockedPFactory")
return BuildBlockedPFactory(paramList, factoryMapIn, factoryManagersIn);
263 if (factoryName ==
"BraessSarazinSmoother")
return BuildBlockedSmoother<BraessSarazinSmoother>(paramList, factoryMapIn, factoryManagersIn);
264 if (factoryName ==
"IndefiniteBlockDiagonalSmoother")
return BuildBlockedSmoother<IndefBlockedDiagonalSmoother>(paramList, factoryMapIn, factoryManagersIn);
265 if (factoryName ==
"SimpleSmoother")
return BuildBlockedSmoother<SimpleSmoother>(paramList, factoryMapIn, factoryManagersIn);
266 if (factoryName ==
"SchurComplementFactory")
return Build2<SchurComplementFactory> (paramList, factoryMapIn, factoryManagersIn);
267 if (factoryName ==
"UzawaSmoother")
return BuildBlockedSmoother<UzawaSmoother>(paramList, factoryMapIn, factoryManagersIn);
271 #ifdef HAVE_MUELU_MATLAB 272 if (factoryName ==
"TwoLevelMatlabFactory")
return Build2<TwoLevelMatlabFactory> (paramList, factoryMapIn, factoryManagersIn);
273 if (factoryName ==
"SingleLevelMatlabFactory")
return Build2<SingleLevelMatlabFactory> (paramList, factoryMapIn, factoryManagersIn);
274 if (factoryName ==
"MatlabSmoother")
return BuildMatlabSmoother (paramList, factoryMapIn, factoryManagersIn);
278 if (factoryMapIn.find(factoryName) != factoryMapIn.end()) {
280 "MueLu::FactoryFactory: Error during the parsing of: " << std::endl << paramList << std::endl
281 <<
"'" << factoryName <<
"' is not a factory name but an existing instance of a factory." << std::endl
282 <<
"Extra parameters cannot be specified after the creation of the object." << std::endl << std::endl
283 <<
"Correct syntaxes includes:" << std::endl
284 <<
" <Parameter name=\"...\" type=\"string\" value=\"" << factoryName <<
"\"/>" << std::endl
286 <<
" <ParameterList name=\"...\"><Parameter name=\"factory\" type=\"string\" value=\"" << factoryName <<
"\"/></ParameterList>" << std::endl
289 return factoryMapIn.find(factoryName)->second;
292 TEUCHOS_TEST_FOR_EXCEPTION(
true,
Exceptions::RuntimeError,
"MueLu::FactoryFactory: unknown factory name : " << factoryName);
294 return Teuchos::null;
307 #define arraysize(ar) (sizeof(ar) / sizeof(ar[0])) 310 RCP<T>
Build(
const Teuchos::ParameterList& paramList,
const FactoryMap& factoryMapIn,
const FactoryManagerMap& factoryManagersIn)
const {
311 RCP<T> factory = rcp(
new T());
313 const char* strarray[] = {
"A",
"P",
"R",
"Graph",
"UnAmalgamationInfo",
"Aggregates",
"Nullspace",
"TransferFactory",
"DofsPerNode"};
314 std::vector<std::string> v(strarray, strarray +
arraysize(strarray));
315 for (
size_t i = 0; i < v.size(); ++i)
316 if (paramList.isParameter(v[i]))
317 factory->SetFactory(v[i],
BuildFactory(paramList.getEntry(v[i]), factoryMapIn, factoryManagersIn));
323 RCP<T>
Build2(
const Teuchos::ParameterList& paramList,
const FactoryMap& factoryMapIn,
const FactoryManagerMap& factoryManagersIn)
const {
324 RCP<T> factory = rcp(
new T());
326 ParameterList paramListWithFactories;
329 RCP<const ParameterList> validParamList = factory->GetValidParameterList();
330 for (ParameterList::ConstIterator param = validParamList->begin(); param != validParamList->end(); ++param) {
331 const std::string& pName = validParamList->name(param);
333 if (!paramList.isParameter(pName)) {
338 if (validParamList->isType< RCP<const FactoryBase> >(pName)) {
340 RCP<const FactoryBase> generatingFact =
BuildFactory(paramList.getEntry(pName), factoryMapIn, factoryManagersIn);
341 paramListWithFactories.set(pName, generatingFact);
342 }
else if (validParamList->isType<RCP<const ParameterList> >(pName)) {
343 if (pName ==
"ParameterList") {
348 RCP<const ParameterList> subList = Teuchos::sublist(rcp(
new ParameterList(paramList)), pName);
349 paramListWithFactories.set(pName, subList);
352 paramListWithFactories.setEntry(pName, paramList.getEntry(pName));
357 factory->SetParameterList(paramListWithFactories);
363 RCP<T>
BuildRAPFactory(
const Teuchos::ParameterList & paramList,
const FactoryMap& factoryMapIn,
const FactoryManagerMap& factoryManagersIn)
const {
365 if (paramList.isSublist(
"TransferFactories") ==
false) {
366 factory = Build2<T>(paramList, factoryMapIn, factoryManagersIn);
369 RCP<Teuchos::ParameterList> paramListNonConst = rcp(
new Teuchos::ParameterList(paramList));
370 RCP<const Teuchos::ParameterList> transferFactories = rcp(
new Teuchos::ParameterList(*sublist(paramListNonConst,
"TransferFactories")));
372 paramListNonConst->remove(
"TransferFactories");
374 factory = Build2<T>(*paramListNonConst, factoryMapIn, factoryManagersIn);
376 for (Teuchos::ParameterList::ConstIterator param = transferFactories->begin(); param != transferFactories->end(); ++param) {
377 RCP<const FactoryBase> p =
BuildFactory(transferFactories->entry(param), factoryMapIn, factoryManagersIn);
378 factory->AddTransferFactory(p);
386 RCP<T>
BuildTogglePFactory(
const Teuchos::ParameterList & paramList,
const FactoryMap& factoryMapIn,
const FactoryManagerMap& factoryManagersIn)
const {
388 if (paramList.isSublist(
"TransferFactories") ==
false) {
390 factory = Build2<T>(paramList, factoryMapIn, factoryManagersIn);
393 RCP<Teuchos::ParameterList> paramListNonConst = rcp(
new Teuchos::ParameterList(paramList));
394 RCP<const Teuchos::ParameterList> transferFactories = rcp(
new Teuchos::ParameterList(*sublist(paramListNonConst,
"TransferFactories")));
396 paramListNonConst->remove(
"TransferFactories");
399 factory = Build2<T>(*paramListNonConst, factoryMapIn, factoryManagersIn);
403 int numProlongatorFactories = 0;
404 int numPtentFactories = 0;
405 int numCoarseNspFactories = 0;
406 for (Teuchos::ParameterList::ConstIterator param = transferFactories->begin(); param != transferFactories->end(); ++param) {
407 size_t foundNsp = transferFactories->name(param).find(
"Nullspace");
408 if (foundNsp != std::string::npos && foundNsp == 0 && transferFactories->name(param).length()==10) {
409 numCoarseNspFactories++;
412 size_t foundPtent = transferFactories->name(param).find(
"Ptent");
413 if (foundPtent != std::string::npos && foundPtent == 0 && transferFactories->name(param).length()==6) {
417 size_t foundP = transferFactories->name(param).find(
"P");
418 if (foundP != std::string::npos && foundP == 0 && transferFactories->name(param).length()==2) {
419 numProlongatorFactories++;
423 TEUCHOS_TEST_FOR_EXCEPTION(numProlongatorFactories!=numCoarseNspFactories,
Exceptions::RuntimeError,
"FactoryFactory::BuildToggleP: The user has to provide the same number of prolongator and coarse nullspace factories!");
424 TEUCHOS_TEST_FOR_EXCEPTION(numPtentFactories!=numCoarseNspFactories,
Exceptions::RuntimeError,
"FactoryFactory::BuildToggleP: The user has to provide the same number of ptent and coarse nullspace factories!");
425 TEUCHOS_TEST_FOR_EXCEPTION(numProlongatorFactories < 2,
Exceptions::RuntimeError,
"FactoryFactory::BuildToggleP: The TogglePFactory needs at least two different prolongation operators. The factories have to be provided using the names P%i and Nullspace %i, where %i denotes a number between 1 and 9.");
428 std::vector<Teuchos::ParameterEntry> prolongatorFactoryNames(numProlongatorFactories);
429 std::vector<Teuchos::ParameterEntry> coarseNspFactoryNames(numProlongatorFactories);
430 std::vector<Teuchos::ParameterEntry> ptentFactoryNames(numProlongatorFactories);
432 for (Teuchos::ParameterList::ConstIterator param = transferFactories->begin(); param != transferFactories->end(); ++param) {
433 size_t foundNsp = transferFactories->name(param).find(
"Nullspace");
434 if (foundNsp != std::string::npos && foundNsp == 0 && transferFactories->name(param).length()==10) {
435 int number = atoi(&(transferFactories->name(param).at(9)));
436 TEUCHOS_TEST_FOR_EXCEPTION(number < 1 || number > numProlongatorFactories,
Exceptions::RuntimeError,
"FactoryFactory::BuildToggleP: Please use the format Nullspace%i with %i an integer between 1 and the maximum number of prolongation operators in TogglePFactory!");
437 coarseNspFactoryNames[number-1] = transferFactories->entry(param);
440 size_t foundPtent = transferFactories->name(param).find(
"Ptent");
441 if (foundPtent != std::string::npos && foundPtent == 0 && transferFactories->name(param).length()==6) {
442 int number = atoi(&(transferFactories->name(param).at(5)));
443 TEUCHOS_TEST_FOR_EXCEPTION(number < 1 || number > numPtentFactories,
Exceptions::RuntimeError,
"FactoryFactory::BuildToggleP: Please use the format Ptent%i with %i an integer between 1 and the maximum number of prolongation operators in TogglePFactory!");
444 ptentFactoryNames[number-1] = transferFactories->entry(param);
447 size_t foundP = transferFactories->name(param).find(
"P");
448 if (foundP != std::string::npos && foundP == 0 && transferFactories->name(param).length()==2) {
449 int number = atoi(&(transferFactories->name(param).at(1)));
450 TEUCHOS_TEST_FOR_EXCEPTION(number < 1 || number > numProlongatorFactories,
Exceptions::RuntimeError,
"FactoryFactory::BuildToggleP: Please use the format P%i with %i an integer between 1 and the maximum number of prolongation operators in TogglePFactory!");
451 prolongatorFactoryNames[number-1] = transferFactories->entry(param);
457 for (std::vector<Teuchos::ParameterEntry>::const_iterator it = prolongatorFactoryNames.begin(); it != prolongatorFactoryNames.end(); ++it) {
458 RCP<const FactoryBase> p =
BuildFactory(*it, factoryMapIn, factoryManagersIn);
459 factory->AddProlongatorFactory(p);
463 for (std::vector<Teuchos::ParameterEntry>::const_iterator it = ptentFactoryNames.begin(); it != ptentFactoryNames.end(); ++it) {
464 RCP<const FactoryBase> p =
BuildFactory(*it, factoryMapIn, factoryManagersIn);
465 factory->AddPtentFactory(p);
469 for (std::vector<Teuchos::ParameterEntry>::const_iterator it = coarseNspFactoryNames.begin(); it != coarseNspFactoryNames.end(); ++it) {
470 RCP<const FactoryBase> p =
BuildFactory(*it, factoryMapIn, factoryManagersIn);
471 factory->AddCoarseNullspaceFactory(p);
477 RCP<ToggleCoordinatesTransferFactory>
BuildToggleCoordinatesTransferFactory(
const Teuchos::ParameterList & paramList,
const FactoryMap& factoryMapIn,
const FactoryManagerMap& factoryManagersIn)
const {
478 RCP<ToggleCoordinatesTransferFactory> factory;
479 TEUCHOS_TEST_FOR_EXCEPTION(paramList.isSublist(
"TransferFactories") ==
false,
Exceptions::RuntimeError,
"FactoryFactory::BuildToggleCoordinatesTransferFactory: the ToggleCoordinatesTransferFactory needs a sublist 'TransferFactories' containing information about the subfactories for coordinate transfer!");
481 RCP<Teuchos::ParameterList> paramListNonConst = rcp(
new Teuchos::ParameterList(paramList));
482 RCP<const Teuchos::ParameterList> transferFactories = rcp(
new Teuchos::ParameterList(*sublist(paramListNonConst,
"TransferFactories")));
483 paramListNonConst->remove(
"TransferFactories");
486 factory = Build2<ToggleCoordinatesTransferFactory>(*paramListNonConst, factoryMapIn, factoryManagersIn);
490 int numCoordTransferFactories = 0;
491 for (Teuchos::ParameterList::ConstIterator param = transferFactories->begin(); param != transferFactories->end(); ++param) {
492 size_t foundCoordinates = transferFactories->name(param).find(
"Coordinates");
493 if (foundCoordinates != std::string::npos && foundCoordinates == 0 && transferFactories->name(param).length()==12) {
494 numCoordTransferFactories++;
498 TEUCHOS_TEST_FOR_EXCEPTION(numCoordTransferFactories != 2,
Exceptions::RuntimeError,
"FactoryFactory::BuildToggleCoordinatesTransfer: The ToggleCoordinatesTransferFactory needs two (different) coordinate transfer factories. The factories have to be provided using the names Coordinates%i, where %i denotes a number between 1 and 9.");
501 std::vector<Teuchos::ParameterEntry> coarseCoordsFactoryNames(numCoordTransferFactories);
503 for (Teuchos::ParameterList::ConstIterator param = transferFactories->begin(); param != transferFactories->end(); ++param) {
504 size_t foundCoords = transferFactories->name(param).find(
"Coordinates");
505 if (foundCoords != std::string::npos && foundCoords == 0 && transferFactories->name(param).length()==12) {
506 int number = atoi(&(transferFactories->name(param).at(11)));
507 TEUCHOS_TEST_FOR_EXCEPTION(number < 1 || number > numCoordTransferFactories,
Exceptions::RuntimeError,
"FactoryFactory::BuildToggleCoordinatesTransfer: Please use the format Coordinates%i with %i an integer between 1 and the maximum number of coordinate transfer factories in ToggleCoordinatesTransferFactory!");
508 coarseCoordsFactoryNames[number-1] = transferFactories->entry(param);
514 for (std::vector<Teuchos::ParameterEntry>::const_iterator it = coarseCoordsFactoryNames.begin(); it != coarseCoordsFactoryNames.end(); ++it) {
515 RCP<const FactoryBase> p =
BuildFactory(*it, factoryMapIn, factoryManagersIn);
516 factory->AddCoordTransferFactory(p);
523 RCP<FactoryBase>
BuildCoupledAggregationFactory(
const Teuchos::ParameterList& paramList,
const FactoryMap& factoryMapIn,
const FactoryManagerMap& factoryManagersIn)
const {
524 RCP<CoupledAggregationFactory> factory = Build<CoupledAggregationFactory>(paramList, factoryMapIn, factoryManagersIn);
526 if (paramList.isParameter(
"aggregation: ordering"))
527 factory->SetOrdering(paramList.get<std::string>(
"aggregation: ordering"));
529 if (paramList.isParameter(
"aggregation: max selected neighbors"))
530 factory->SetMaxNeighAlreadySelected(paramList.get<
int>(
"aggregation: max selected neighbors"));
532 if (paramList.isParameter(
"Phase3AggCreation"))
533 factory->SetPhase3AggCreation(paramList.get<
double>(
"Phase3AggCreation"));
535 if(paramList.isParameter(
"aggregation: min agg size"))
536 factory->SetMinNodesPerAggregate(paramList.get<
int>(
"aggregation: min agg size"));
542 RCP<FactoryBase>
BuildUncoupledAggregationFactory(
const Teuchos::ParameterList & paramList,
const FactoryMap & factoryMapIn,
const FactoryManagerMap& factoryManagersIn)
const {
543 RCP<UncoupledAggregationFactory> factory = Build<UncoupledAggregationFactory>(paramList, factoryMapIn, factoryManagersIn);
545 ParameterList paramListWithFactories(paramList);
546 paramListWithFactories.remove(
"factory",
false);
549 RCP<const ParameterList> validParamList = factory->GetValidParameterList();
550 for (ParameterList::ConstIterator param = validParamList->begin(); param != validParamList->end(); ++param) {
551 const std::string & pName = validParamList->name(param);
553 if (validParamList->isType< RCP<const FactoryBase> >(pName) && paramList.isParameter(pName)) {
555 RCP<const FactoryBase> generatingFact =
BuildFactory(paramList.getEntry(pName), factoryMapIn, factoryManagersIn);
558 paramListWithFactories.remove(pName);
559 paramListWithFactories.set(pName, generatingFact);
562 if (pName ==
"ParameterList" && validParamList->isType<RCP<const ParameterList> >(pName) && paramList.isParameter(pName)) {
567 RCP<const ParameterList> subList = Teuchos::sublist(rcp(
new ParameterList(paramList)), pName);
568 paramListWithFactories.set(pName, subList);
573 factory->SetParameterList(paramListWithFactories);
588 RCP<FactoryBase>
BuildTrilinosSmoother(
const Teuchos::ParameterList & paramList,
const FactoryMap & factoryMapIn,
const FactoryManagerMap& factoryManagersIn)
const {
589 if (paramList.begin() == paramList.end())
592 TEUCHOS_TEST_FOR_EXCEPTION(paramList.get<std::string>(
"factory") !=
"TrilinosSmoother",
Exceptions::RuntimeError,
"");
597 std::string type=
"";
if(paramList.isParameter(
"type")) type = paramList.get<std::string>(
"type");
598 int overlap=0;
if(paramList.isParameter(
"overlap")) overlap = paramList.get<
int> (
"overlap");
600 Teuchos::ParameterList params;
if(paramList.isParameter(
"ParameterList")) params = paramList.get<Teuchos::ParameterList>(
"ParameterList");
606 Teuchos::RCP<TrilinosSmoother> trilSmoo = Teuchos::rcp(
new TrilinosSmoother(type, params, overlap));
608 if (paramList.isParameter(
"LineDetection_Layers")) {
609 RCP<const FactoryBase> generatingFact =
BuildFactory(paramList.getEntry(
"LineDetection_Layers"), factoryMapIn, factoryManagersIn);
610 trilSmoo->SetFactory(
"LineDetection_Layers", generatingFact);
612 if (paramList.isParameter(
"LineDetection_VertLineIds")) {
613 RCP<const FactoryBase> generatingFact =
BuildFactory(paramList.getEntry(
"LineDetection_Layers"), factoryMapIn, factoryManagersIn);
614 trilSmoo->SetFactory(
"LineDetection_Layers", generatingFact);
616 if (paramList.isParameter(
"CoarseNumZLayers")) {
617 RCP<const FactoryBase> generatingFact =
BuildFactory(paramList.getEntry(
"CoarseNumZLayers"), factoryMapIn, factoryManagersIn);
618 trilSmoo->SetFactory(
"CoarseNumZLayers", generatingFact);
624 #ifdef HAVE_MUELU_MATLAB 636 RCP<FactoryBase>
BuildMatlabSmoother(
const Teuchos::ParameterList & paramList,
const FactoryMap & factoryMapIn,
const FactoryManagerMap& factoryManagersIn)
const {
637 if (paramList.begin() == paramList.end())
640 TEUCHOS_TEST_FOR_EXCEPTION(paramList.get<std::string>(
"factory") !=
"MatlabSmoother",
Exceptions::RuntimeError,
"");
646 Teuchos::RCP<MatlabSmoother> matSmoo = Teuchos::rcp(
new MatlabSmoother(paramList));
652 RCP<FactoryBase>
BuildDirectSolver(
const Teuchos::ParameterList& paramList,
const FactoryMap& factoryMapIn,
const FactoryManagerMap& factoryManagersIn)
const {
653 if (paramList.begin() == paramList.end())
658 std::string type;
if(paramList.isParameter(
"type")) type = paramList.get<std::string>(
"type");
660 Teuchos::ParameterList params;
if(paramList.isParameter(
"ParameterList")) params = paramList.get<Teuchos::ParameterList>(
"ParameterList");
665 #ifdef HAVE_MUELU_EXPERIMENTAL 667 RCP<FactoryBase>
BuildBlockedSmoother(
const Teuchos::ParameterList& paramList,
const FactoryMap& factoryMapIn,
const FactoryManagerMap& factoryManagersIn)
const {
669 RCP<ParameterList> paramListNonConst = rcp(
new ParameterList(paramList));
672 std::vector<RCP<FactoryManager> > facManagers;
676 bool blockExists =
true;
677 while (blockExists ==
true) {
678 std::stringstream ss;
679 ss <<
"block" << blockid;
681 if(paramList.isSublist(ss.str()) ==
true) {
683 RCP<const ParameterList> b = rcp(
new ParameterList(*sublist(paramListNonConst, ss.str())));
685 RCP<FactoryManager> M = Teuchos::null;
687 if (b->isParameter(
"group")) {
689 std::string facManagerName = b->get< std::string >(
"group");
690 TEUCHOS_TEST_FOR_EXCEPTION(factoryManagersIn.count(facManagerName) != 1,
Exceptions::RuntimeError,
"Factory manager has not been found. Please check the spelling of the factory managers in your xml file.");
691 RCP<FactoryManagerBase> Mb = factoryManagersIn.find(facManagerName)->second;
693 TEUCHOS_TEST_FOR_EXCEPTION(M==Teuchos::null,
Exceptions::RuntimeError,
"Failed to cast FactoryManagerBase object to FactoryManager.");
697 for (ParameterList::ConstIterator param = b->begin(); param != b->end(); ++param) {
698 RCP<const FactoryBase> p =
BuildFactory(b->entry(param), factoryMapIn, factoryManagersIn);
699 M->SetFactory(b->name(param),p);
704 M->SetIgnoreUserData(
true);
705 facManagers.push_back(M);
706 paramListNonConst->remove(ss.str());
716 RCP<T> bs = Build2<T>(*paramListNonConst, factoryMapIn, factoryManagersIn);
721 for (
int i = 0; i<Teuchos::as<int>(facManagers.size()); i++) {
722 bs->AddFactoryManager(facManagers[i],i);
728 RCP<FactoryBase>
BuildBlockedDirectSolver(
const Teuchos::ParameterList& paramList,
const FactoryMap& factoryMapIn,
const FactoryManagerMap& factoryManagersIn)
const {
741 RCP<FactoryBase>
BuildBlockedPFactory(
const Teuchos::ParameterList& paramList,
const FactoryMap& factoryMapIn,
const FactoryManagerMap& factoryManagersIn)
const {
745 RCP<ParameterList> paramListNonConst = rcp(
new ParameterList(paramList));
748 std::vector<RCP<FactoryManager> > facManagers;
752 bool blockExists =
true;
753 while (blockExists ==
true) {
754 std::stringstream ss;
755 ss <<
"block" << blockid;
757 if(paramList.isSublist(ss.str()) ==
true) {
759 RCP<const ParameterList> b = rcp(
new ParameterList(*sublist(paramListNonConst, ss.str())));
761 RCP<FactoryManager> M = Teuchos::null;
763 if (b->isParameter(
"group")) {
765 std::string facManagerName = b->get< std::string >(
"group");
766 TEUCHOS_TEST_FOR_EXCEPTION(factoryManagersIn.count(facManagerName) != 1,
Exceptions::RuntimeError,
"Factory manager has not been found. Please check the spelling of the factory managers in your xml file.");
767 RCP<FactoryManagerBase> Mb = factoryManagersIn.find(facManagerName)->second;
769 TEUCHOS_TEST_FOR_EXCEPTION(M==Teuchos::null,
Exceptions::RuntimeError,
"Failed to cast FactoryManagerBase object to FactoryManager.");
773 for (ParameterList::ConstIterator param = b->begin(); param != b->end(); ++param) {
774 RCP<const FactoryBase> p =
BuildFactory(b->entry(param), factoryMapIn, factoryManagersIn);
775 M->SetFactory(b->name(param),p);
780 M->SetIgnoreUserData(
true);
781 facManagers.push_back(M);
782 paramListNonConst->remove(ss.str());
792 pfac = Build2<BlockedPFactory>(*paramListNonConst, factoryMapIn, factoryManagersIn);
795 for(
size_t i = 0; i<facManagers.size(); i++) {
796 pfac->AddFactoryManager(facManagers[i]);
805 #define MUELU_FACTORYFACTORY_SHORT 806 #endif // MUELU_FACTORYFACTORY_DECL_HPP Generic Smoother Factory for generating the smoothers of the MG hierarchy.
RCP< FactoryBase > BuildBlockedPFactory(const Teuchos::ParameterList ¶mList, const FactoryMap &factoryMapIn, const FactoryManagerMap &factoryManagersIn) const
This class specifies the default factory that should generate some data on a Level if the data does n...
RCP< T > Build(const Teuchos::ParameterList ¶mList, const FactoryMap &factoryMapIn, const FactoryManagerMap &factoryManagersIn) const
Factory for building blocked, segregated prolongation operators.
Factory that can generate other factories from.
RCP< FactoryBase > BuildUncoupledAggregationFactory(const Teuchos::ParameterList ¶mList, const FactoryMap &factoryMapIn, const FactoryManagerMap &factoryManagersIn) const
UncoupledAggregationFactory.
RCP< T > Build2(const Teuchos::ParameterList ¶mList, const FactoryMap &factoryMapIn, const FactoryManagerMap &factoryManagersIn) const
Class that encapsulates external library smoothers.
RCP< ToggleCoordinatesTransferFactory > BuildToggleCoordinatesTransferFactory(const Teuchos::ParameterList ¶mList, const FactoryMap &factoryMapIn, const FactoryManagerMap &factoryManagersIn) const
RCP< FactoryBase > BuildBlockedSmoother(const Teuchos::ParameterList ¶mList, const FactoryMap &factoryMapIn, const FactoryManagerMap &factoryManagersIn) const
Namespace for MueLu classes and methods.
RCP< FactoryBase > BuildMatlabSmoother(const Teuchos::ParameterList ¶mList, const FactoryMap &factoryMapIn, const FactoryManagerMap &factoryManagersIn) const
MatlabSmoother.
virtual RCP< const FactoryBase > BuildFactory(const Teuchos::ParameterEntry ¶m, const FactoryMap &factoryMapIn, const FactoryManagerMap &factoryManagersIn) const
Class that encapsulates direct solvers. Autoselection of AmesosSmoother or Amesos2Smoother according ...
RCP< T > BuildTogglePFactory(const Teuchos::ParameterList ¶mList, const FactoryMap &factoryMapIn, const FactoryManagerMap &factoryManagersIn) const
std::map< std::string, RCP< FactoryManagerBase > > FactoryManagerMap
std::map< std::string, RCP< const FactoryBase > > FactoryMap
RCP< FactoryBase > BuildTrilinosSmoother(const Teuchos::ParameterList ¶mList, const FactoryMap &factoryMapIn, const FactoryManagerMap &factoryManagersIn) const
TrilinosSmoother.
RCP< T > BuildRAPFactory(const Teuchos::ParameterList ¶mList, const FactoryMap &factoryMapIn, const FactoryManagerMap &factoryManagersIn) const
direct solver for nxn blocked matrices
Base class for MueLu classes.
RCP< FactoryBase > BuildBlockedDirectSolver(const Teuchos::ParameterList ¶mList, const FactoryMap &factoryMapIn, const FactoryManagerMap &factoryManagersIn) const
Class that encapsulates Matlab smoothers.
RCP< FactoryBase > BuildDirectSolver(const Teuchos::ParameterList ¶mList, const FactoryMap &factoryMapIn, const FactoryManagerMap &factoryManagersIn) const
Exception throws to report errors in the internal logical of the program.
RCP< FactoryBase > BuildCoupledAggregationFactory(const Teuchos::ParameterList ¶mList, const FactoryMap &factoryMapIn, const FactoryManagerMap &factoryManagersIn) const
CoupledAggregationFactory.
static const RCP< const NoFactory > getRCP()
Static Get() functions.