127 std::string factoryName;
128 Teuchos::ParameterList paramList;
129 if (!param.isList()) {
130 factoryName = Teuchos::getValue<std::string>(param);
132 paramList = Teuchos::getValue<Teuchos::ParameterList>(param);
133 factoryName = paramList.get<std::string>(
"factory");
137 if (factoryName ==
"AggregateQualityEstimateFactory")
return Build2<AggregateQualityEstimateFactory>(paramList, factoryMapIn, factoryManagersIn);
138 if (factoryName ==
"AggregationExportFactory")
return Build2<AggregationExportFactory>(paramList, factoryMapIn, factoryManagersIn);
139 if (factoryName ==
"AmalgamationFactory")
return Build2<AmalgamationFactory>(paramList, factoryMapIn, factoryManagersIn);
140 if (factoryName ==
"BlockedCoarseMapFactory")
return Build2<BlockedCoarseMapFactory>(paramList, factoryMapIn, factoryManagersIn);
141 if (factoryName ==
"BlockedRAPFactory")
return BuildRAPFactory<BlockedRAPFactory>(paramList, factoryMapIn, factoryManagersIn);
142 if (factoryName ==
"BrickAggregationFactory")
return Build2<BrickAggregationFactory>(paramList, factoryMapIn, factoryManagersIn);
143 if (factoryName ==
"ClassicalMapFactory")
return Build2<ClassicalMapFactory>(paramList, factoryMapIn, factoryManagersIn);
144 if (factoryName ==
"ClassicalPFactory")
return Build2<ClassicalPFactory>(paramList, factoryMapIn, factoryManagersIn);
145 if (factoryName ==
"CloneRepartitionInterface")
return Build2<CloneRepartitionInterface>(paramList, factoryMapIn, factoryManagersIn);
146 if (factoryName ==
"CoarseMapFactory")
return Build2<CoarseMapFactory>(paramList, factoryMapIn, factoryManagersIn);
147 if (factoryName ==
"CoarseningVisualizationFactory")
return Build2<CoarseningVisualizationFactory>(paramList, factoryMapIn, factoryManagersIn);
148 if (factoryName ==
"CoalesceDropFactory")
return Build2<CoalesceDropFactory>(paramList, factoryMapIn, factoryManagersIn);
149 if (factoryName ==
"SmooVecCoalesceDropFactory")
return Build2<SmooVecCoalesceDropFactory>(paramList, factoryMapIn, factoryManagersIn);
150 if (factoryName ==
"ConstraintFactory")
return Build2<ConstraintFactory>(paramList, factoryMapIn, factoryManagersIn);
151 if (factoryName ==
"CoordinatesTransferFactory")
return Build2<CoordinatesTransferFactory>(paramList, factoryMapIn, factoryManagersIn);
152 if (factoryName ==
"DirectSolver")
return BuildDirectSolver(paramList, factoryMapIn, factoryManagersIn);
153 if (factoryName ==
"DropNegativeEntriesFactory")
return Build2<DropNegativeEntriesFactory>(paramList, factoryMapIn, factoryManagersIn);
154 if (factoryName ==
"EminPFactory")
return Build2<EminPFactory>(paramList, factoryMapIn, factoryManagersIn);
155 if (factoryName ==
"FilteredAFactory")
return Build2<FilteredAFactory>(paramList, factoryMapIn, factoryManagersIn);
156 if (factoryName ==
"FineLevelInputDataFactory")
return Build2<FineLevelInputDataFactory>(paramList, factoryMapIn, factoryManagersIn);
157 if (factoryName ==
"GeneralGeometricPFactory")
return Build2<GeneralGeometricPFactory>(paramList, factoryMapIn, factoryManagersIn);
158 if (factoryName ==
"ReplicatePFactory")
return Build2<ReplicatePFactory>(paramList, factoryMapIn, factoryManagersIn);
159 if (factoryName ==
"CombinePFactory")
return Build2<CombinePFactory>(paramList, factoryMapIn, factoryManagersIn);
160 if (factoryName ==
"GenericRFactory")
return Build2<GenericRFactory>(paramList, factoryMapIn, factoryManagersIn);
161 if (factoryName ==
"GeometricInterpolationPFactory")
return Build2<GeometricInterpolationPFactory>(paramList, factoryMapIn, factoryManagersIn);
162 if (factoryName ==
"HybridAggregationFactory")
return Build2<HybridAggregationFactory>(paramList, factoryMapIn, factoryManagersIn);
163 if (factoryName ==
"InterfaceAggregationFactory")
return Build2<InterfaceAggregationFactory>(paramList, factoryMapIn, factoryManagersIn);
164 if (factoryName ==
"InterfaceMappingTransferFactory")
return Build2<InterfaceMappingTransferFactory>(paramList, factoryMapIn, factoryManagersIn);
165 if (factoryName ==
"InverseApproximationFactory")
return Build2<InverseApproximationFactory>(paramList, factoryMapIn, factoryManagersIn);
166 if (factoryName ==
"InitialBlockNumberFactory")
return Build2<InitialBlockNumberFactory>(paramList, factoryMapIn, factoryManagersIn);
167 if (factoryName ==
"LineDetectionFactory")
return Build2<LineDetectionFactory>(paramList, factoryMapIn, factoryManagersIn);
170 if (factoryName ==
"MapTransferFactory")
return Build2<MapTransferFactory>(paramList, factoryMapIn, factoryManagersIn);
171 if (factoryName ==
"MatrixAnalysisFactory")
return Build2<MatrixAnalysisFactory>(paramList, factoryMapIn, factoryManagersIn);
172 if (factoryName ==
"MultiVectorTransferFactory")
return Build2<MultiVectorTransferFactory>(paramList, factoryMapIn, factoryManagersIn);
174 if (factoryName ==
"NoSmoother")
return rcp(
new SmootherFactory(Teuchos::null));
175 if (factoryName ==
"NotayAggregationFactory")
return Build2<NotayAggregationFactory>(paramList, factoryMapIn, factoryManagersIn);
176 if (factoryName ==
"NullspaceFactory")
return Build2<NullspaceFactory>(paramList, factoryMapIn, factoryManagersIn);
177 if (factoryName ==
"NullspacePresmoothFactory")
return Build2<NullspacePresmoothFactory>(paramList, factoryMapIn, factoryManagersIn);
178 if (factoryName ==
"PatternFactory")
return Build2<PatternFactory>(paramList, factoryMapIn, factoryManagersIn);
179 if (factoryName ==
"PgPFactory")
return Build2<PgPFactory>(paramList, factoryMapIn, factoryManagersIn);
180 if (factoryName ==
"SaPFactory")
return Build2<SaPFactory>(paramList, factoryMapIn, factoryManagersIn);
181 if (factoryName ==
"RAPFactory")
return BuildRAPFactory<RAPFactory>(paramList, factoryMapIn, factoryManagersIn);
182 if (factoryName ==
"RAPShiftFactory")
return BuildRAPFactory<RAPShiftFactory>(paramList, factoryMapIn, factoryManagersIn);
183 if (factoryName ==
"RebalanceAcFactory")
return Build2<RebalanceAcFactory>(paramList, factoryMapIn, factoryManagersIn);
184 if (factoryName ==
"RebalanceTransferFactory")
return Build2<RebalanceTransferFactory>(paramList, factoryMapIn, factoryManagersIn);
185 if (factoryName ==
"RegionRFactory")
return Build2<RegionRFactory>(paramList, factoryMapIn, factoryManagersIn);
186 if (factoryName ==
"RegionRFactory_kokkos")
return Build2<RegionRFactory_kokkos>(paramList, factoryMapIn, factoryManagersIn);
187 if (factoryName ==
"ReorderBlockAFactory")
return Build2<ReorderBlockAFactory>(paramList, factoryMapIn, factoryManagersIn);
188 if (factoryName ==
"RepartitionInterface")
return Build2<RepartitionInterface>(paramList, factoryMapIn, factoryManagersIn);
189 if (factoryName ==
"ScaledNullspaceFactory")
return Build2<ScaledNullspaceFactory>(paramList, factoryMapIn, factoryManagersIn);
190 if (factoryName ==
"SegregatedAFactory")
return Build2<SegregatedAFactory>(paramList, factoryMapIn, factoryManagersIn);
191 if (factoryName ==
"SemiCoarsenPFactory")
return Build2<SemiCoarsenPFactory>(paramList, factoryMapIn, factoryManagersIn);
192 if (factoryName ==
"StructuredAggregationFactory")
return Build2<StructuredAggregationFactory>(paramList, factoryMapIn, factoryManagersIn);
193 if (factoryName ==
"StructuredLineDetectionFactory")
return Build2<StructuredLineDetectionFactory>(paramList, factoryMapIn, factoryManagersIn);
194 if (factoryName ==
"SubBlockAFactory")
return Build2<SubBlockAFactory>(paramList, factoryMapIn, factoryManagersIn);
195 if (factoryName ==
"TentativePFactory")
return Build2<TentativePFactory>(paramList, factoryMapIn, factoryManagersIn);
196 if (factoryName ==
"ToggleCoordinatesTransferFactory")
return BuildToggleCoordinatesTransferFactory(paramList, factoryMapIn, factoryManagersIn);
197 if (factoryName ==
"TogglePFactory")
return BuildTogglePFactory<TogglePFactory>(paramList, factoryMapIn, factoryManagersIn);
198 if (factoryName ==
"TransPFactory")
return Build2<TransPFactory>(paramList, factoryMapIn, factoryManagersIn);
199 if (factoryName ==
"RfromP_Or_TransP")
return Build2<RfromP_Or_TransP>(paramList, factoryMapIn, factoryManagersIn);
200 if (factoryName ==
"TrilinosSmoother")
return BuildTrilinosSmoother(paramList, factoryMapIn, factoryManagersIn);
201 if (factoryName ==
"UncoupledAggregationFactory")
return Build2<UncoupledAggregationFactory>(paramList, factoryMapIn, factoryManagersIn);
202 if (factoryName ==
"UnsmooshFactory")
return Build2<UnsmooshFactory>(paramList, factoryMapIn, factoryManagersIn);
203 if (factoryName ==
"UserAggregationFactory")
return Build2<UserAggregationFactory>(paramList, factoryMapIn, factoryManagersIn);
204 if (factoryName ==
"UserPFactory")
return Build2<UserPFactory>(paramList, factoryMapIn, factoryManagersIn);
205 if (factoryName ==
"VariableDofLaplacianFactory")
return Build2<VariableDofLaplacianFactory>(paramList, factoryMapIn, factoryManagersIn);
206 if (factoryName ==
"ZeroSubBlockAFactory")
return Build2<ZeroSubBlockAFactory>(paramList, factoryMapIn, factoryManagersIn);
207 if (factoryName ==
"CoalesceDropFactory_kokkos")
return Build2<CoalesceDropFactory_kokkos>(paramList, factoryMapIn, factoryManagersIn);
208 if (factoryName ==
"GeometricInterpolationPFactory_kokkos")
return Build2<GeometricInterpolationPFactory_kokkos>(paramList, factoryMapIn, factoryManagersIn);
209 if (factoryName ==
"SemiCoarsenPFactory_kokkos")
return Build2<SemiCoarsenPFactory_kokkos>(paramList, factoryMapIn, factoryManagersIn);
210 if (factoryName ==
"StructuredAggregationFactory_kokkos")
return Build2<StructuredAggregationFactory_kokkos>(paramList, factoryMapIn, factoryManagersIn);
211 if (factoryName ==
"TentativePFactory_kokkos")
return Build2<TentativePFactory_kokkos>(paramList, factoryMapIn, factoryManagersIn);
212 if (factoryName ==
"MatrixFreeTentativePFactory")
return Build2<MatrixFreeTentativePFactory>(paramList, factoryMapIn, factoryManagersIn);
215 if (factoryName ==
"CoarseMapFactory_kokkos")
return Build2<CoarseMapFactory>(paramList, factoryMapIn, factoryManagersIn);
216 if (factoryName ==
"CoordinatesTransferFactory_kokkos")
return Build2<CoordinatesTransferFactory>(paramList, factoryMapIn, factoryManagersIn);
218 if (factoryName ==
"ZoltanInterface") {
219#if defined(HAVE_MUELU_ZOLTAN) && defined(HAVE_MPI)
220 return Build2<ZoltanInterface>(paramList, factoryMapIn, factoryManagersIn);
222 TEUCHOS_TEST_FOR_EXCEPTION(
true,
Exceptions::RuntimeError,
"MueLu::FactoryFactory:BuildFactory(): Cannot create a ZoltanInterface object: Zoltan is disabled: HAVE_MUELU_ZOLTAN && HAVE_MPI == false.");
225 if (factoryName ==
"Zoltan2Interface") {
226#if defined(HAVE_MUELU_ZOLTAN2) && defined(HAVE_MPI)
227 return Build2<Zoltan2Interface>(paramList, factoryMapIn, factoryManagersIn);
229 TEUCHOS_TEST_FOR_EXCEPTION(
true,
Exceptions::RuntimeError,
"MueLu::FactoryFactory:BuildFactory(): Cannot create a Zoltan2Interface object: Zoltan2 is disabled: HAVE_MUELU_ZOLTAN2 && HAVE_MPI == false.");
233 if (factoryName ==
"NodePartitionInterface") {
235 return Build2<NodePartitionInterface>(paramList, factoryMapIn, factoryManagersIn);
237 TEUCHOS_TEST_FOR_EXCEPTION(
true,
Exceptions::RuntimeError,
"MueLu::FactoryFactory:BuildFactory(): Cannot create a NodePartitionInterface object: HAVE_MPI == false.");
241 if (factoryName ==
"RepartitionFactory") {
243 return Build2<RepartitionFactory>(paramList, factoryMapIn, factoryManagersIn);
245 TEUCHOS_TEST_FOR_EXCEPTION(
true,
Exceptions::RuntimeError,
"MueLu::FactoryFactory:BuildFactory(): Cannot create a RepartitionFactory object: HAVE_MPI == false.");
248 if (factoryName ==
"RepartitionHeuristicFactory") {
250 return Build2<RepartitionHeuristicFactory>(paramList, factoryMapIn, factoryManagersIn);
252 TEUCHOS_TEST_FOR_EXCEPTION(
true,
Exceptions::RuntimeError,
"MueLu::FactoryFactory:BuildFactory(): Cannot create a RepartitionHeuristicFactory object: HAVE_MPI == false.");
256 if (factoryName ==
"BlockedCoordinatesTransferFactory")
return BuildBlockedCoordFactory<BlockedCoordinatesTransferFactory>(paramList, factoryMapIn, factoryManagersIn);
257 if (factoryName ==
"BlockedDirectSolver")
return BuildBlockedDirectSolver(paramList, factoryMapIn, factoryManagersIn);
258 if (factoryName ==
"BlockedGaussSeidelSmoother")
return BuildBlockedSmoother<BlockedGaussSeidelSmoother>(paramList, factoryMapIn, factoryManagersIn);
259 if (factoryName ==
"BlockedJacobiSmoother")
return BuildBlockedSmoother<BlockedJacobiSmoother>(paramList, factoryMapIn, factoryManagersIn);
260 if (factoryName ==
"BlockedPFactory")
return BuildBlockedFactory<BlockedPFactory>(paramList, factoryMapIn, factoryManagersIn);
261 if (factoryName ==
"BraessSarazinSmoother")
return BuildBlockedSmoother<BraessSarazinSmoother>(paramList, factoryMapIn, factoryManagersIn);
262 if (factoryName ==
"IndefiniteBlockDiagonalSmoother")
return BuildBlockedSmoother<IndefBlockedDiagonalSmoother>(paramList, factoryMapIn, factoryManagersIn);
263 if (factoryName ==
"SimpleSmoother")
return BuildBlockedSmoother<SimpleSmoother>(paramList, factoryMapIn, factoryManagersIn);
264 if (factoryName ==
"SchurComplementFactory")
return Build2<SchurComplementFactory>(paramList, factoryMapIn, factoryManagersIn);
265 if (factoryName ==
"RebalanceBlockRestrictionFactory")
return BuildBlockedFactory<RebalanceBlockRestrictionFactory>(paramList, factoryMapIn, factoryManagersIn);
266 if (factoryName ==
"RebalanceBlockAcFactory")
return BuildBlockedFactory<RebalanceBlockAcFactory>(paramList, factoryMapIn, factoryManagersIn);
267 if (factoryName ==
"RebalanceBlockInterpolationFactory")
return BuildBlockedFactory<RebalanceBlockInterpolationFactory>(paramList, factoryMapIn, factoryManagersIn);
269 if (factoryName ==
"RepartitionBlockDiagonalFactory")
return Build2<RepartitionBlockDiagonalFactory>(paramList, factoryMapIn, factoryManagersIn);
271#ifdef HAVE_MUELU_TEKO
272 if (factoryName ==
"TekoSmoother")
return BuildTekoSmoother(paramList, factoryMapIn, factoryManagersIn);
274 if (factoryName ==
"UzawaSmoother")
return BuildBlockedSmoother<UzawaSmoother>(paramList, factoryMapIn, factoryManagersIn);
277#ifdef HAVE_MUELU_MATLAB
278 if (factoryName ==
"SingleLevelMatlabFactory")
return Build2<SingleLevelMatlabFactory>(paramList, factoryMapIn, factoryManagersIn);
279 if (factoryName ==
"TwoLevelMatlabFactory")
return Build2<TwoLevelMatlabFactory>(paramList, factoryMapIn, factoryManagersIn);
280 if (factoryName ==
"MatlabSmoother")
return BuildMatlabSmoother(paramList, factoryMapIn, factoryManagersIn);
283#if defined(HAVE_MUELU_INTREPID2) && defined(HAVE_MUELU_EXPERIMENTAL)
284 if (factoryName ==
"IntrepidPCoarsenFactory")
return Build2<IntrepidPCoarsenFactory>(paramList, factoryMapIn, factoryManagersIn);
288 if (factoryMapIn.find(factoryName) != factoryMapIn.end()) {
290 "MueLu::FactoryFactory: Error during the parsing of: " << std::endl
291 << paramList << std::endl
292 <<
"'" << factoryName <<
"' is not a factory name but an existing instance of a factory." << std::endl
293 <<
"Extra parameters cannot be specified after the creation of the object." << std::endl
295 <<
"Correct syntaxes includes:" << std::endl
296 <<
" <Parameter name=\"...\" type=\"string\" value=\"" << factoryName <<
"\"/>" << std::endl
298 <<
" <ParameterList name=\"...\"><Parameter name=\"factory\" type=\"string\" value=\"" << factoryName <<
"\"/></ParameterList>" << std::endl);
300 return factoryMapIn.find(factoryName)->second;
303 TEUCHOS_TEST_FOR_EXCEPTION(
true,
Exceptions::RuntimeError,
"MueLu::FactoryFactory: unknown factory name : " << factoryName);
305 TEUCHOS_UNREACHABLE_RETURN(Teuchos::null);
393 if (paramList.isSublist(
"TransferFactories") ==
false) {
395 factory = Build2<T>(paramList, factoryMapIn, factoryManagersIn);
398 RCP<Teuchos::ParameterList> paramListNonConst = rcp(
new Teuchos::ParameterList(paramList));
399 RCP<const Teuchos::ParameterList> transferFactories = rcp(
new Teuchos::ParameterList(*sublist(paramListNonConst,
"TransferFactories")));
401 paramListNonConst->remove(
"TransferFactories");
404 factory = Build2<T>(*paramListNonConst, factoryMapIn, factoryManagersIn);
408 int numProlongatorFactories = 0;
409 int numPtentFactories = 0;
410 int numCoarseNspFactories = 0;
411 for (Teuchos::ParameterList::ConstIterator param = transferFactories->begin(); param != transferFactories->end(); ++param) {
412 size_t foundNsp = transferFactories->name(param).find(
"Nullspace");
413 if (foundNsp != std::string::npos && foundNsp == 0 && transferFactories->name(param).length() == 10) {
414 numCoarseNspFactories++;
417 size_t foundPtent = transferFactories->name(param).find(
"Ptent");
418 if (foundPtent != std::string::npos && foundPtent == 0 && transferFactories->name(param).length() == 6) {
422 size_t foundP = transferFactories->name(param).find(
"P");
423 if (foundP != std::string::npos && foundP == 0 && transferFactories->name(param).length() == 2) {
424 numProlongatorFactories++;
428 TEUCHOS_TEST_FOR_EXCEPTION(numProlongatorFactories != numCoarseNspFactories,
Exceptions::RuntimeError,
"FactoryFactory::BuildToggleP: The user has to provide the same number of prolongator and coarse nullspace factories!");
429 TEUCHOS_TEST_FOR_EXCEPTION(numPtentFactories != numCoarseNspFactories,
Exceptions::RuntimeError,
"FactoryFactory::BuildToggleP: The user has to provide the same number of ptent and coarse nullspace factories!");
430 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.");
433 std::vector<Teuchos::ParameterEntry> prolongatorFactoryNames(numProlongatorFactories);
434 std::vector<Teuchos::ParameterEntry> coarseNspFactoryNames(numProlongatorFactories);
435 std::vector<Teuchos::ParameterEntry> ptentFactoryNames(numProlongatorFactories);
437 for (Teuchos::ParameterList::ConstIterator param = transferFactories->begin(); param != transferFactories->end(); ++param) {
438 size_t foundNsp = transferFactories->name(param).find(
"Nullspace");
439 if (foundNsp != std::string::npos && foundNsp == 0 && transferFactories->name(param).length() == 10) {
440 int number = atoi(&(transferFactories->name(param).at(9)));
441 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!");
442 coarseNspFactoryNames[number - 1] = transferFactories->entry(param);
445 size_t foundPtent = transferFactories->name(param).find(
"Ptent");
446 if (foundPtent != std::string::npos && foundPtent == 0 && transferFactories->name(param).length() == 6) {
447 int number = atoi(&(transferFactories->name(param).at(5)));
448 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!");
449 ptentFactoryNames[number - 1] = transferFactories->entry(param);
452 size_t foundP = transferFactories->name(param).find(
"P");
453 if (foundP != std::string::npos && foundP == 0 && transferFactories->name(param).length() == 2) {
454 int number = atoi(&(transferFactories->name(param).at(1)));
455 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!");
456 prolongatorFactoryNames[number - 1] = transferFactories->entry(param);
462 for (std::vector<Teuchos::ParameterEntry>::const_iterator it = prolongatorFactoryNames.begin(); it != prolongatorFactoryNames.end(); ++it) {
463 RCP<const FactoryBase> p = BuildFactory(*it, factoryMapIn, factoryManagersIn);
464 factory->AddProlongatorFactory(p);
468 for (std::vector<Teuchos::ParameterEntry>::const_iterator it = ptentFactoryNames.begin(); it != ptentFactoryNames.end(); ++it) {
469 RCP<const FactoryBase> p = BuildFactory(*it, factoryMapIn, factoryManagersIn);
470 factory->AddPtentFactory(p);
474 for (std::vector<Teuchos::ParameterEntry>::const_iterator it = coarseNspFactoryNames.begin(); it != coarseNspFactoryNames.end(); ++it) {
475 RCP<const FactoryBase> p = BuildFactory(*it, factoryMapIn, factoryManagersIn);
476 factory->AddCoarseNullspaceFactory(p);