46 #ifndef MUELU_FACTORYFACTORY_DECL_HPP
47 #define MUELU_FACTORYFACTORY_DECL_HPP
61 #include "MueLu_FactoryManager.hpp"
70 #include "MueLu_AggregationExportFactory.hpp"
71 #include "MueLu_AmalgamationFactory.hpp"
72 #include "MueLu_BlackBoxPFactory.hpp"
73 #include "MueLu_BlockedCoarseMapFactory.hpp"
74 #include "MueLu_BlockedCoordinatesTransferFactory.hpp"
75 #include "MueLu_BlockedDirectSolver.hpp"
76 #include "MueLu_BlockedGaussSeidelSmoother.hpp"
77 #include "MueLu_BlockedJacobiSmoother.hpp"
78 #include "MueLu_BlockedPFactory.hpp"
79 #include "MueLu_BlockedRAPFactory.hpp"
80 #include "MueLu_BraessSarazinSmoother.hpp"
81 #include "MueLu_BrickAggregationFactory.hpp"
82 #include "MueLu_CloneRepartitionInterface.hpp"
83 #include "MueLu_CoalesceDropFactory.hpp"
84 #include "MueLu_CoarseMapFactory.hpp"
85 #include "MueLu_CoarseningVisualizationFactory.hpp"
86 #include "MueLu_ConstraintFactory.hpp"
87 #include "MueLu_CoupledAggregationFactory.hpp"
88 #include "MueLu_CoordinatesTransferFactory.hpp"
89 #include "MueLu_DirectSolver.hpp"
90 #include "MueLu_DropNegativeEntriesFactory.hpp"
91 #include "MueLu_EminPFactory.hpp"
92 #include "MueLu_FilteredAFactory.hpp"
93 #include "MueLu_FineLevelInputDataFactory.hpp"
94 #include "MueLu_GeneralGeometricPFactory.hpp"
95 #include "MueLu_GenericRFactory.hpp"
96 #include "MueLu_GeometricInterpolationPFactory.hpp"
97 #include "MueLu_IndefBlockedDiagonalSmoother.hpp"
98 #include "MueLu_IsorropiaInterface.hpp"
99 #include "MueLu_LineDetectionFactory.hpp"
100 #include "MueLu_RepartitionInterface.hpp"
101 #include "MueLu_RepartitionBlockDiagonalFactory.hpp"
102 #include "MueLu_MapTransferFactory.hpp"
103 #include "MueLu_MatrixAnalysisFactory.hpp"
104 #include "MueLu_MultiVectorTransferFactory.hpp"
105 #include "MueLu_NullspaceFactory.hpp"
106 #include "MueLu_NullspacePresmoothFactory.hpp"
107 #include "MueLu_PatternFactory.hpp"
108 #include "MueLu_PgPFactory.hpp"
109 #include "MueLu_RebalanceBlockInterpolationFactory.hpp"
110 #include "MueLu_RebalanceBlockRestrictionFactory.hpp"
111 #include "MueLu_RebalanceBlockAcFactory.hpp"
112 #include "MueLu_RebalanceTransferFactory.hpp"
113 #include "MueLu_RepartitionFactory.hpp"
114 #include "MueLu_RepartitionHeuristicFactory.hpp"
115 #include "MueLu_RAPFactory.hpp"
116 #include "MueLu_RAPShiftFactory.hpp"
117 #include "MueLu_RebalanceAcFactory.hpp"
118 #include "MueLu_ReorderBlockAFactory.hpp"
119 #include "MueLu_SaPFactory.hpp"
120 #include "MueLu_SegregatedAFactory.hpp"
121 #include "MueLu_SemiCoarsenPFactory.hpp"
122 #include "MueLu_SchurComplementFactory.hpp"
123 #include "MueLu_SimpleSmoother.hpp"
124 #include "MueLu_SmootherFactory.hpp"
125 #include "MueLu_StructuredAggregationFactory.hpp"
126 #include "MueLu_StructuredLineDetectionFactory.hpp"
127 #include "MueLu_SubBlockAFactory.hpp"
128 #ifdef HAVE_MUELU_TEKO
129 #include "MueLu_TekoSmoother.hpp"
131 #include "MueLu_TentativePFactory.hpp"
132 #include "MueLu_ToggleCoordinatesTransferFactory.hpp"
133 #include "MueLu_TogglePFactory.hpp"
134 #include "MueLu_TrilinosSmoother.hpp"
135 #include "MueLu_TransPFactory.hpp"
136 #include "MueLu_UncoupledAggregationFactory.hpp"
137 #include "MueLu_HybridAggregationFactory.hpp"
138 #include "MueLu_UnsmooshFactory.hpp"
139 #include "MueLu_UserAggregationFactory.hpp"
140 #include "MueLu_UserPFactory.hpp"
141 #include "MueLu_UzawaSmoother.hpp"
142 #include "MueLu_VariableDofLaplacianFactory.hpp"
143 #include "MueLu_ZoltanInterface.hpp"
144 #include "MueLu_Zoltan2Interface.hpp"
145 #include "MueLu_NodePartitionInterface.hpp"
148 #ifdef HAVE_MUELU_KOKKOS_REFACTOR
149 #include "MueLu_CoalesceDropFactory_kokkos.hpp"
150 #include "MueLu_CoarseMapFactory_kokkos.hpp"
151 #include "MueLu_CoordinatesTransferFactory_kokkos.hpp"
152 #include "MueLu_GeometricInterpolationPFactory_kokkos.hpp"
153 #include "MueLu_NullspaceFactory_kokkos.hpp"
154 #include "MueLu_SaPFactory_kokkos.hpp"
155 #include "MueLu_StructuredAggregationFactory_kokkos.hpp"
156 #include "MueLu_TentativePFactory_kokkos.hpp"
157 #include "MueLu_UncoupledAggregationFactory_kokkos.hpp"
160 #ifdef HAVE_MUELU_MATLAB
162 #include "../matlab/src/MueLu_SingleLevelMatlabFactory_decl.hpp"
163 #include "../matlab/src/MueLu_SingleLevelMatlabFactory_def.hpp"
164 #include "../matlab/src/MueLu_TwoLevelMatlabFactory_decl.hpp"
165 #include "../matlab/src/MueLu_TwoLevelMatlabFactory_def.hpp"
166 #include "../matlab/src/MueLu_MatlabSmoother_decl.hpp"
167 #include "../matlab/src/MueLu_MatlabSmoother_def.hpp"
170 #ifdef HAVE_MUELU_INTREPID2
171 #include "MueLu_IntrepidPCoarsenFactory.hpp"
182 template <
class Scalar =
double,
class LocalOrdinal =
int,
class GlobalOrdinal = LocalOrdinal,
class Node = KokkosClassic::DefaultNode::DefaultNodeType>
184 #undef MUELU_FACTORYFACTORY_SHORT
187 typedef std::map<std::string, RCP<const FactoryBase> >
FactoryMap;
211 std::string factoryName;
214 factoryName = Teuchos::getValue<std::string>(param);
216 paramList = Teuchos::getValue<Teuchos::ParameterList>(param);
217 factoryName = paramList.
get<std::string>(
"factory");
221 if (factoryName ==
"AggregationExportFactory")
return Build2<AggregationExportFactory> (paramList, factoryMapIn, factoryManagersIn);
222 if (factoryName ==
"AmalgamationFactory")
return Build2<AmalgamationFactory> (paramList, factoryMapIn, factoryManagersIn);
223 if (factoryName ==
"BlockedCoarseMapFactory")
return Build2<BlockedCoarseMapFactory> (paramList, factoryMapIn, factoryManagersIn);
224 if (factoryName ==
"BlockedCoordinatesTransferFactory")
return Build2<BlockedCoordinatesTransferFactory> (paramList, factoryMapIn, factoryManagersIn);
225 if (factoryName ==
"BlockedRAPFactory")
return BuildRAPFactory<BlockedRAPFactory> (paramList, factoryMapIn, factoryManagersIn);
226 if (factoryName ==
"BrickAggregationFactory")
return Build2<BrickAggregationFactory> (paramList, factoryMapIn, factoryManagersIn);
227 if (factoryName ==
"CloneRepartitionInterface")
return Build2<CloneRepartitionInterface> (paramList, factoryMapIn, factoryManagersIn);
228 if (factoryName ==
"CoarseMapFactory")
return Build2<CoarseMapFactory> (paramList, factoryMapIn, factoryManagersIn);
229 if (factoryName ==
"CoarseningVisualizationFactory")
return Build2<CoarseningVisualizationFactory> (paramList, factoryMapIn, factoryManagersIn);
230 if (factoryName ==
"CoalesceDropFactory")
return Build2<CoalesceDropFactory> (paramList, factoryMapIn, factoryManagersIn);
231 if (factoryName ==
"ConstraintFactory")
return Build2<ConstraintFactory> (paramList, factoryMapIn, factoryManagersIn);
233 if (factoryName ==
"CoordinatesTransferFactory")
return Build2<CoordinatesTransferFactory> (paramList, factoryMapIn, factoryManagersIn);
234 if (factoryName ==
"DirectSolver")
return BuildDirectSolver (paramList, factoryMapIn, factoryManagersIn);
235 if (factoryName ==
"DropNegativeEntriesFactory")
return Build2<DropNegativeEntriesFactory> (paramList, factoryMapIn, factoryManagersIn);
236 if (factoryName ==
"EminPFactory")
return Build2<EminPFactory> (paramList, factoryMapIn, factoryManagersIn);
237 if (factoryName ==
"FilteredAFactory")
return Build2<FilteredAFactory> (paramList, factoryMapIn, factoryManagersIn);
238 if (factoryName ==
"FineLevelInputDataFactory")
return Build2<FineLevelInputDataFactory> (paramList, factoryMapIn, factoryManagersIn);
239 if (factoryName ==
"GeneralGeometricPFactory")
return Build2<GeneralGeometricPFactory> (paramList, factoryMapIn, factoryManagersIn);
240 if (factoryName ==
"GenericRFactory")
return Build2<GenericRFactory> (paramList, factoryMapIn, factoryManagersIn);
241 if (factoryName ==
"GeometricInterpolationPFactory")
return Build2<GeometricInterpolationPFactory> (paramList, factoryMapIn, factoryManagersIn);
242 if (factoryName ==
"LineDetectionFactory")
return Build2<LineDetectionFactory> (paramList, factoryMapIn, factoryManagersIn);
243 if (factoryName ==
"MapTransferFactory")
return Build2<MapTransferFactory> (paramList, factoryMapIn, factoryManagersIn);
244 if (factoryName ==
"MatrixAnalysisFactory")
return Build2<MatrixAnalysisFactory> (paramList, factoryMapIn, factoryManagersIn);
245 if (factoryName ==
"MultiVectorTransferFactory")
return Build2<MultiVectorTransferFactory> (paramList, factoryMapIn, factoryManagersIn);
248 if (factoryName ==
"NullspaceFactory")
return Build2<NullspaceFactory> (paramList, factoryMapIn, factoryManagersIn);
249 if (factoryName ==
"NullspacePresmoothFactory")
return Build2<NullspacePresmoothFactory> (paramList, factoryMapIn, factoryManagersIn);
250 if (factoryName ==
"PatternFactory")
return Build2<PatternFactory> (paramList, factoryMapIn, factoryManagersIn);
251 if (factoryName ==
"PgPFactory")
return Build2<PgPFactory> (paramList, factoryMapIn, factoryManagersIn);
252 if (factoryName ==
"SaPFactory")
return Build2<SaPFactory> (paramList, factoryMapIn, factoryManagersIn);
253 if (factoryName ==
"RAPFactory")
return BuildRAPFactory<RAPFactory> (paramList, factoryMapIn, factoryManagersIn);
254 if (factoryName ==
"RAPShiftFactory")
return BuildRAPFactory<RAPShiftFactory> (paramList, factoryMapIn, factoryManagersIn);
255 if (factoryName ==
"RebalanceAcFactory")
return Build2<RebalanceAcFactory> (paramList, factoryMapIn, factoryManagersIn);
256 if (factoryName ==
"RebalanceTransferFactory")
return Build2<RebalanceTransferFactory> (paramList, factoryMapIn, factoryManagersIn);
257 if (factoryName ==
"ReorderBlockAFactory")
return Build2<ReorderBlockAFactory> (paramList, factoryMapIn, factoryManagersIn);
258 if (factoryName ==
"RepartitionInterface")
return Build2<RepartitionInterface> (paramList, factoryMapIn, factoryManagersIn);
259 if (factoryName ==
"SegregatedAFactory")
return Build2<SegregatedAFactory> (paramList, factoryMapIn, factoryManagersIn);
260 if (factoryName ==
"SemiCoarsenPFactory")
return Build2<SemiCoarsenPFactory> (paramList, factoryMapIn, factoryManagersIn);
261 if (factoryName ==
"StructuredAggregationFactory")
return Build2<StructuredAggregationFactory> (paramList, factoryMapIn, factoryManagersIn);
262 if (factoryName ==
"StructuredLineDetectionFactory")
return Build2<StructuredLineDetectionFactory> (paramList, factoryMapIn, factoryManagersIn);
263 if (factoryName ==
"SubBlockAFactory")
return Build2<SubBlockAFactory> (paramList, factoryMapIn, factoryManagersIn);
264 if (factoryName ==
"TentativePFactory")
return Build2<TentativePFactory> (paramList, factoryMapIn, factoryManagersIn);
266 if (factoryName ==
"TogglePFactory")
return BuildTogglePFactory<TogglePFactory> (paramList, factoryMapIn, factoryManagersIn);
267 if (factoryName ==
"TransPFactory")
return Build2<TransPFactory> (paramList, factoryMapIn, factoryManagersIn);
268 if (factoryName ==
"TrilinosSmoother")
return BuildTrilinosSmoother (paramList, factoryMapIn, factoryManagersIn);
269 if (factoryName ==
"UncoupledAggregationFactory")
return Build2<UncoupledAggregationFactory> (paramList, factoryMapIn, factoryManagersIn);
270 if (factoryName ==
"HybridAggregationFactory")
return Build2<HybridAggregationFactory> (paramList, factoryMapIn, factoryManagersIn);
271 if (factoryName ==
"UnsmooshFactory")
return Build2<UnsmooshFactory> (paramList, factoryMapIn, factoryManagersIn);
272 if (factoryName ==
"UserAggregationFactory")
return Build2<UserAggregationFactory> (paramList, factoryMapIn, factoryManagersIn);
273 if (factoryName ==
"UserPFactory")
return Build2<UserPFactory> (paramList, factoryMapIn, factoryManagersIn);
274 if (factoryName ==
"VariableDofLaplacianFactory")
return Build2<VariableDofLaplacianFactory> (paramList, factoryMapIn, factoryManagersIn);
275 #ifdef HAVE_MUELU_KOKKOS_REFACTOR
276 if (factoryName ==
"CoalesceDropFactory_kokkos")
return Build2<CoalesceDropFactory_kokkos> (paramList, factoryMapIn, factoryManagersIn);
277 if (factoryName ==
"CoarseMapFactory_kokkos")
return Build2<CoarseMapFactory_kokkos> (paramList, factoryMapIn, factoryManagersIn);
278 if (factoryName ==
"CoordinatesTransferFactory_kokkos")
return Build2<CoordinatesTransferFactory_kokkos> (paramList, factoryMapIn, factoryManagersIn);
279 if (factoryName ==
"GeometricInterpolationPFactory_kokkos")
return Build2<GeometricInterpolationPFactory_kokkos> (paramList, factoryMapIn, factoryManagersIn);
280 if (factoryName ==
"NullspaceFactory_kokkos")
return Build2<NullspaceFactory_kokkos> (paramList, factoryMapIn, factoryManagersIn);
281 if (factoryName ==
"SaPFactory_kokkos")
return Build2<SaPFactory_kokkos> (paramList, factoryMapIn, factoryManagersIn);
282 if (factoryName ==
"StructuredAggregationFactory_kokkos")
return Build2<StructuredAggregationFactory_kokkos> (paramList, factoryMapIn, factoryManagersIn);
283 if (factoryName ==
"TentativePFactory_kokkos")
return Build2<TentativePFactory_kokkos> (paramList, factoryMapIn, factoryManagersIn);
284 if (factoryName ==
"UncoupledAggregationFactory_kokkos")
return Build2<UncoupledAggregationFactory_kokkos> (paramList, factoryMapIn, factoryManagersIn);
287 if (factoryName ==
"ZoltanInterface") {
288 #if defined(HAVE_MUELU_ZOLTAN) && defined(HAVE_MPI)
289 return Build2<ZoltanInterface>(paramList, factoryMapIn, factoryManagersIn);
292 #endif // HAVE_MUELU_ZOLTAN && HAVE_MPI
294 if (factoryName ==
"Zoltan2Interface") {
295 #if defined(HAVE_MUELU_ZOLTAN2) && defined(HAVE_MPI)
296 return Build2<Zoltan2Interface>(paramList, factoryMapIn, factoryManagersIn);
299 #endif // HAVE_MUELU_ZOLTAN2 && HAVE_MPI
301 if (factoryName ==
"IsorropiaInterface") {
302 #if defined(HAVE_MUELU_ISORROPIA) && defined(HAVE_MPI)
303 return Build2<IsorropiaInterface>(paramList, factoryMapIn, factoryManagersIn);
306 #endif // HAVE_MUELU_ZOLTAN2 && HAVE_MPI
309 if (factoryName ==
"NodePartitionInterface") {
310 #if defined(HAVE_MPI)
311 return Build2<NodePartitionInterface>(paramList, factoryMapIn, factoryManagersIn);
317 if (factoryName ==
"RepartitionFactory") {
319 return Build2<RepartitionFactory>(paramList, factoryMapIn, factoryManagersIn);
324 if (factoryName ==
"RepartitionHeuristicFactory") {
326 return Build2<RepartitionHeuristicFactory>(paramList, factoryMapIn, factoryManagersIn);
332 if (factoryName ==
"BlockedDirectSolver")
return BuildBlockedDirectSolver(paramList, factoryMapIn, factoryManagersIn);
333 if (factoryName ==
"BlockedGaussSeidelSmoother")
return BuildBlockedSmoother<BlockedGaussSeidelSmoother>(paramList, factoryMapIn, factoryManagersIn);
334 if (factoryName ==
"BlockedJacobiSmoother")
return BuildBlockedSmoother<BlockedJacobiSmoother>(paramList, factoryMapIn, factoryManagersIn);
335 if (factoryName ==
"BlockedPFactory")
return BuildBlockedFactory<BlockedPFactory>(paramList, factoryMapIn, factoryManagersIn);
336 if (factoryName ==
"BraessSarazinSmoother")
return BuildBlockedSmoother<BraessSarazinSmoother>(paramList, factoryMapIn, factoryManagersIn);
337 if (factoryName ==
"IndefiniteBlockDiagonalSmoother")
return BuildBlockedSmoother<IndefBlockedDiagonalSmoother>(paramList, factoryMapIn, factoryManagersIn);
338 if (factoryName ==
"SimpleSmoother")
return BuildBlockedSmoother<SimpleSmoother>(paramList, factoryMapIn, factoryManagersIn);
339 if (factoryName ==
"SchurComplementFactory")
return Build2<SchurComplementFactory> (paramList, factoryMapIn, factoryManagersIn);
340 if (factoryName ==
"RebalanceBlockRestrictionFactory")
return BuildBlockedFactory<RebalanceBlockRestrictionFactory>(paramList, factoryMapIn, factoryManagersIn);
341 if (factoryName ==
"RebalanceBlockAcFactory")
return BuildBlockedFactory<RebalanceBlockAcFactory>(paramList, factoryMapIn, factoryManagersIn);
342 if (factoryName ==
"RebalanceBlockInterpolationFactory")
return BuildBlockedFactory<RebalanceBlockInterpolationFactory>(paramList, factoryMapIn, factoryManagersIn);
344 if (factoryName ==
"RepartitionBlockDiagonalFactory")
return Build2<RepartitionBlockDiagonalFactory> (paramList, factoryMapIn, factoryManagersIn);
346 #ifdef HAVE_MUELU_TEKO
347 if (factoryName ==
"TekoSmoother")
return BuildTekoSmoother(paramList, factoryMapIn, factoryManagersIn);
349 if (factoryName ==
"UzawaSmoother")
return BuildBlockedSmoother<UzawaSmoother>(paramList, factoryMapIn, factoryManagersIn);
352 #ifdef HAVE_MUELU_MATLAB
353 if (factoryName ==
"TwoLevelMatlabFactory")
return Build2<TwoLevelMatlabFactory> (paramList, factoryMapIn, factoryManagersIn);
354 if (factoryName ==
"SingleLevelMatlabFactory")
return Build2<SingleLevelMatlabFactory> (paramList, factoryMapIn, factoryManagersIn);
355 if (factoryName ==
"MatlabSmoother")
return BuildMatlabSmoother (paramList, factoryMapIn, factoryManagersIn);
358 #ifdef HAVE_MUELU_INTREPID2
359 if (factoryName ==
"IntrepidPCoarsenFactory")
return Build2<IntrepidPCoarsenFactory> (paramList, factoryMapIn, factoryManagersIn);
363 if (factoryMapIn.find(factoryName) != factoryMapIn.end()) {
365 "MueLu::FactoryFactory: Error during the parsing of: " << std::endl << paramList << std::endl
366 <<
"'" << factoryName <<
"' is not a factory name but an existing instance of a factory." << std::endl
367 <<
"Extra parameters cannot be specified after the creation of the object." << std::endl << std::endl
368 <<
"Correct syntaxes includes:" << std::endl
369 <<
" <Parameter name=\"...\" type=\"string\" value=\"" << factoryName <<
"\"/>" << std::endl
371 <<
" <ParameterList name=\"...\"><Parameter name=\"factory\" type=\"string\" value=\"" << factoryName <<
"\"/></ParameterList>" << std::endl
374 return factoryMapIn.find(factoryName)->second;
392 #define arraysize(ar) (sizeof(ar) / sizeof(ar[0]))
398 const char* strarray[] = {
"A",
"P",
"R",
"Graph",
"UnAmalgamationInfo",
"Aggregates",
"Nullspace",
"TransferFactory",
"DofsPerNode"};
399 std::vector<std::string> v(strarray, strarray +
arraysize(strarray));
400 for (
size_t i = 0; i < v.size(); ++i)
402 factory->SetFactory(v[i],
BuildFactory(paramList.
getEntry(v[i]), factoryMapIn, factoryManagersIn));
417 const std::string& pName = validParamList->name(param);
427 paramListWithFactories.
set(pName, generatingFact);
429 if (pName ==
"ParameterList") {
435 paramListWithFactories.
set(pName, subList);
443 factory->SetParameterList(paramListWithFactories);
451 if (paramList.
isSublist(
"TransferFactories") ==
false) {
452 factory = Build2<T>(paramList, factoryMapIn, factoryManagersIn);
458 paramListNonConst->
remove(
"TransferFactories");
460 factory = Build2<T>(*paramListNonConst, factoryMapIn, factoryManagersIn);
464 factory->AddTransferFactory(p);
474 if (paramList.
isSublist(
"TransferFactories") ==
false) {
476 factory = Build2<T>(paramList, factoryMapIn, factoryManagersIn);
482 paramListNonConst->
remove(
"TransferFactories");
485 factory = Build2<T>(*paramListNonConst, factoryMapIn, factoryManagersIn);
489 int numProlongatorFactories = 0;
490 int numPtentFactories = 0;
491 int numCoarseNspFactories = 0;
493 size_t foundNsp = transferFactories->
name(param).find(
"Nullspace");
494 if (foundNsp != std::string::npos && foundNsp == 0 && transferFactories->
name(param).length()==10) {
495 numCoarseNspFactories++;
498 size_t foundPtent = transferFactories->
name(param).find(
"Ptent");
499 if (foundPtent != std::string::npos && foundPtent == 0 && transferFactories->
name(param).length()==6) {
503 size_t foundP = transferFactories->
name(param).find(
"P");
504 if (foundP != std::string::npos && foundP == 0 && transferFactories->
name(param).length()==2) {
505 numProlongatorFactories++;
511 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.");
514 std::vector<Teuchos::ParameterEntry> prolongatorFactoryNames(numProlongatorFactories);
515 std::vector<Teuchos::ParameterEntry> coarseNspFactoryNames(numProlongatorFactories);
516 std::vector<Teuchos::ParameterEntry> ptentFactoryNames(numProlongatorFactories);
519 size_t foundNsp = transferFactories->
name(param).find(
"Nullspace");
520 if (foundNsp != std::string::npos && foundNsp == 0 && transferFactories->
name(param).length()==10) {
521 int number = atoi(&(transferFactories->
name(param).at(9)));
522 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!");
523 coarseNspFactoryNames[number-1] = transferFactories->
entry(param);
526 size_t foundPtent = transferFactories->
name(param).find(
"Ptent");
527 if (foundPtent != std::string::npos && foundPtent == 0 && transferFactories->
name(param).length()==6) {
528 int number = atoi(&(transferFactories->
name(param).at(5)));
529 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!");
530 ptentFactoryNames[number-1] = transferFactories->
entry(param);
533 size_t foundP = transferFactories->
name(param).find(
"P");
534 if (foundP != std::string::npos && foundP == 0 && transferFactories->
name(param).length()==2) {
535 int number = atoi(&(transferFactories->
name(param).at(1)));
536 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!");
537 prolongatorFactoryNames[number-1] = transferFactories->
entry(param);
543 for (std::vector<Teuchos::ParameterEntry>::const_iterator it = prolongatorFactoryNames.begin(); it != prolongatorFactoryNames.end(); ++it) {
545 factory->AddProlongatorFactory(p);
549 for (std::vector<Teuchos::ParameterEntry>::const_iterator it = ptentFactoryNames.begin(); it != ptentFactoryNames.end(); ++it) {
551 factory->AddPtentFactory(p);
555 for (std::vector<Teuchos::ParameterEntry>::const_iterator it = coarseNspFactoryNames.begin(); it != coarseNspFactoryNames.end(); ++it) {
557 factory->AddCoarseNullspaceFactory(p);
565 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!");
569 paramListNonConst->remove(
"TransferFactories");
572 factory = Build2<ToggleCoordinatesTransferFactory>(*paramListNonConst, factoryMapIn, factoryManagersIn);
576 int numCoordTransferFactories = 0;
578 size_t foundCoordinates = transferFactories->
name(param).find(
"Coordinates");
579 if (foundCoordinates != std::string::npos && foundCoordinates == 0 && transferFactories->
name(param).length()==12) {
580 numCoordTransferFactories++;
584 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.");
587 std::vector<Teuchos::ParameterEntry> coarseCoordsFactoryNames(numCoordTransferFactories);
590 size_t foundCoords = transferFactories->
name(param).find(
"Coordinates");
591 if (foundCoords != std::string::npos && foundCoords == 0 && transferFactories->
name(param).length()==12) {
592 int number = atoi(&(transferFactories->
name(param).at(11)));
593 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!");
594 coarseCoordsFactoryNames[number-1] = transferFactories->
entry(param);
600 for (std::vector<Teuchos::ParameterEntry>::const_iterator it = coarseCoordsFactoryNames.begin(); it != coarseCoordsFactoryNames.end(); ++it) {
602 factory->AddCoordTransferFactory(p);
612 if (paramList.isParameter(
"aggregation: ordering"))
613 factory->SetOrdering(paramList.get<std::string>(
"aggregation: ordering"));
615 if (paramList.isParameter(
"aggregation: max selected neighbors"))
616 factory->SetMaxNeighAlreadySelected(paramList.get<
int>(
"aggregation: max selected neighbors"));
618 if (paramList.isParameter(
"Phase3AggCreation"))
619 factory->SetPhase3AggCreation(paramList.get<
double>(
"Phase3AggCreation"));
621 if(paramList.isParameter(
"aggregation: min agg size"))
622 factory->SetMinNodesPerAggregate(paramList.get<
int>(
"aggregation: min agg size"));
638 if (paramList.
begin() == paramList.
end())
646 std::string type=
"";
if(paramList.
isParameter(
"type")) type = paramList.
get<std::string>(
"type");
647 int overlap=0;
if(paramList.
isParameter(
"overlap")) overlap = paramList.
get<
int> (
"overlap");
660 if (paramList.
isParameter(
"LineDetection_Layers")) {
662 trilSmoo->SetFactory(
"LineDetection_Layers", generatingFact);
664 if (paramList.
isParameter(
"LineDetection_VertLineIds")) {
666 trilSmoo->SetFactory(
"LineDetection_Layers", generatingFact);
670 trilSmoo->SetFactory(
"CoarseNumZLayers", generatingFact);
676 smooFact->SetParameterList(smooFactParams);
677 smooFact->SetSmootherPrototypes(trilSmoo);
681 #ifdef HAVE_MUELU_MATLAB
694 if (paramList.
begin() == paramList.
end())
710 if (paramList.
begin() == paramList.
end())
715 std::string type;
if(paramList.
isParameter(
"type")) type = paramList.
get<std::string>(
"type");
728 std::vector<RCP<FactoryManager> > facManagers;
732 bool blockExists =
true;
733 while (blockExists ==
true) {
734 std::stringstream ss;
735 ss <<
"block" << blockid;
737 if(paramList.
isSublist(ss.str()) ==
true) {
743 if (b->isParameter(
"group")) {
745 std::string facManagerName = b->
get< std::string >(
"group");
755 M->SetFactory(b->name(param),p);
760 M->SetIgnoreUserData(
true);
761 facManagers.push_back(M);
762 paramListNonConst->remove(ss.str());
772 RCP<T> bs = Build2<T>(*paramListNonConst, factoryMapIn, factoryManagersIn);
780 for (
int i = 0; i<Teuchos::as<int>(facManagers.size()); i++) {
781 bs->AddFactoryManager(facManagers[i],i);
787 #ifdef HAVE_MUELU_TEKO
792 paramListNonConst->remove(
"Inverse Factory Library");
795 RCP<TekoSmoother> bs = Build2<TekoSmoother>(*paramListNonConst, factoryMapIn, factoryManagersIn);
804 bs->SetTekoParameters(tekoParams);
828 RCP<T> pfac = Teuchos::null;
834 std::vector<RCP<FactoryManager> > facManagers;
838 bool blockExists =
true;
839 while (blockExists ==
true) {
840 std::stringstream ss;
841 ss <<
"block" << blockid;
843 if(paramList.
isSublist(ss.str()) ==
true) {
849 if (b->isParameter(
"group")) {
851 std::string facManagerName = b->
get< std::string >(
"group");
861 M->SetFactory(b->name(param),p);
866 M->SetIgnoreUserData(
true);
867 facManagers.push_back(M);
868 paramListNonConst->remove(ss.str());
878 pfac = Build2<T>(*paramListNonConst, factoryMapIn, factoryManagersIn);
881 for(
size_t i = 0; i<facManagers.size(); i++) {
882 pfac->AddFactoryManager(facManagers[i]);
890 #define MUELU_FACTORYFACTORY_SHORT
891 #endif // MUELU_FACTORYFACTORY_DECL_HPP
Generic Smoother Factory for generating the smoothers of the MG hierarchy.
RCP< FactoryBase > BuildDirectSolver(const Teuchos::ParameterList ¶mList, const FactoryMap &, const FactoryManagerMap &) const
const std::string & name() 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
ConstIterator end() const
RCP< FactoryBase > BuildTekoSmoother(const Teuchos::ParameterList ¶mList, const FactoryMap &factoryMapIn, const FactoryManagerMap &factoryManagersIn) const
Factory that can generate other factories from.
T & get(const std::string &name, T def_value)
RCP< T > Build2(const Teuchos::ParameterList ¶mList, const FactoryMap &factoryMapIn, const FactoryManagerMap &factoryManagersIn) const
Class that encapsulates external library smoothers.
ParameterList & set(std::string const &name, T const &value, std::string const &docString="", RCP< const ParameterEntryValidator > const &validator=null)
#define TEUCHOS_TEST_FOR_EXCEPTION(throw_exception_test, Exception, msg)
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
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
: Interpret Factory parameter list and build new factory
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
ParameterList & setEntry(const std::string &name, const ParameterEntry &entry)
bool isParameter(const std::string &name) const
std::map< std::string, RCP< FactoryManagerBase > > FactoryManagerMap
bool remove(std::string const &name, bool throwIfNotExists=true)
TEUCHOS_DEPRECATED RCP< T > rcp(T *p, Dealloc_T dealloc, bool owns_mem)
std::map< std::string, RCP< const FactoryBase > > FactoryMap
bool isSublist(const std::string &name) const
RCP< T > BuildBlockedFactory(const Teuchos::ParameterList ¶mList, const FactoryMap &factoryMapIn, const FactoryManagerMap &factoryManagersIn) const
params_t::ConstIterator ConstIterator
RCP< FactoryBase > BuildBlockedDirectSolver(const Teuchos::ParameterList &, const FactoryMap &, const FactoryManagerMap &) const
ConstIterator begin() const
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
const ParameterEntry & entry(ConstIterator i) const
Base class for MueLu classes.
Class that encapsulates Matlab smoothers.
#define TEUCHOS_UNREACHABLE_RETURN(dummyReturnVal)
Exception throws to report errors in the internal logical of the program.
ParameterEntry & getEntry(const std::string &name)
RCP< FactoryBase > BuildCoupledAggregationFactory(const Teuchos::ParameterList ¶mList, const FactoryMap &factoryMapIn, const FactoryManagerMap &factoryManagersIn) const
CoupledAggregationFactory.
static const RCP< const NoFactory > getRCP()
Static Get() functions.