MueLu Version of the Day
Loading...
Searching...
No Matches
MueLu_FactoryFactory_def.hpp
Go to the documentation of this file.
1// @HEADER
2// *****************************************************************************
3// MueLu: A package for multigrid based preconditioning
4//
5// Copyright 2012 NTESS and the MueLu contributors.
6// SPDX-License-Identifier: BSD-3-Clause
7// *****************************************************************************
8// @HEADER
9#ifndef MUELU_FACTORYFACTORY_DEF_HPP
10#define MUELU_FACTORYFACTORY_DEF_HPP
12
13#include "MueLu_AggregateQualityEstimateFactory.hpp"
14#include "MueLu_AggregationExportFactory.hpp"
15#include "MueLu_AmalgamationFactory.hpp"
16#include "MueLu_BlackBoxPFactory.hpp"
17#include "MueLu_BlockedCoarseMapFactory.hpp"
18#include "MueLu_BlockedCoordinatesTransferFactory.hpp"
19#include "MueLu_BlockedDirectSolver.hpp"
20#include "MueLu_BlockedGaussSeidelSmoother.hpp"
21#include "MueLu_BlockedJacobiSmoother.hpp"
22#include "MueLu_BlockedPFactory.hpp"
23#include "MueLu_BlockedRAPFactory.hpp"
24#include "MueLu_BraessSarazinSmoother.hpp"
25#include "MueLu_BrickAggregationFactory.hpp"
26#include "MueLu_ClassicalMapFactory.hpp"
27#include "MueLu_ClassicalPFactory.hpp"
28#include "MueLu_CloneRepartitionInterface.hpp"
29#include "MueLu_CoalesceDropFactory.hpp"
30#include "MueLu_SmooVecCoalesceDropFactory.hpp"
31#include "MueLu_CoarseMapFactory.hpp"
32#include "MueLu_CoarseningVisualizationFactory.hpp"
33#include "MueLu_ConstraintFactory.hpp"
34#include "MueLu_CoordinatesTransferFactory.hpp"
35#include "MueLu_DirectSolver.hpp"
36#include "MueLu_DropNegativeEntriesFactory.hpp"
37#include "MueLu_EminPFactory.hpp"
38#include "MueLu_FilteredAFactory.hpp"
39#include "MueLu_FineLevelInputDataFactory.hpp"
40#include "MueLu_GeneralGeometricPFactory.hpp"
41#include "MueLu_ReplicatePFactory.hpp"
42#include "MueLu_CombinePFactory.hpp"
43#include "MueLu_GenericRFactory.hpp"
44#include "MueLu_GeometricInterpolationPFactory.hpp"
45#include "MueLu_InterfaceAggregationFactory.hpp"
46#include "MueLu_InterfaceMappingTransferFactory.hpp"
47#include "MueLu_InitialBlockNumberFactory.hpp"
48#include "MueLu_IndefBlockedDiagonalSmoother.hpp"
49#include "MueLu_InverseApproximationFactory.hpp"
50#include "MueLu_LineDetectionFactory.hpp"
51#include "MueLu_LocalOrdinalTransferFactory.hpp"
52#include "MueLu_RepartitionInterface.hpp"
53#include "MueLu_RepartitionBlockDiagonalFactory.hpp"
54#include "MueLu_MapTransferFactory.hpp"
55#include "MueLu_MatrixAnalysisFactory.hpp"
56#include "MueLu_MultiVectorTransferFactory.hpp"
57#include "MueLu_NotayAggregationFactory.hpp"
58#include "MueLu_NullspaceFactory.hpp"
59#include "MueLu_NullspacePresmoothFactory.hpp"
60#include "MueLu_PatternFactory.hpp"
61#include "MueLu_PgPFactory.hpp"
62#include "MueLu_RebalanceBlockInterpolationFactory.hpp"
63#include "MueLu_RebalanceBlockRestrictionFactory.hpp"
64#include "MueLu_RebalanceBlockAcFactory.hpp"
65#include "MueLu_RebalanceTransferFactory.hpp"
66#include "MueLu_RegionRFactory.hpp"
67#include "MueLu_RepartitionFactory.hpp"
68#include "MueLu_RepartitionHeuristicFactory.hpp"
69#include "MueLu_RAPFactory.hpp"
70#include "MueLu_RAPShiftFactory.hpp"
71#include "MueLu_RebalanceAcFactory.hpp"
72#include "MueLu_ReorderBlockAFactory.hpp"
73#include "MueLu_SaPFactory.hpp"
74#include "MueLu_ScaledNullspaceFactory.hpp"
75#include "MueLu_SegregatedAFactory.hpp"
76#include "MueLu_SemiCoarsenPFactory.hpp"
77#include "MueLu_SchurComplementFactory.hpp"
78#include "MueLu_SimpleSmoother.hpp"
79#include "MueLu_SmootherFactory.hpp"
80#include "MueLu_StructuredAggregationFactory.hpp"
81#include "MueLu_StructuredLineDetectionFactory.hpp"
82#include "MueLu_SubBlockAFactory.hpp"
83#ifdef HAVE_MUELU_TEKO
84#include "MueLu_TekoSmoother.hpp"
85#endif
86#include "MueLu_TentativePFactory.hpp"
87#include "MueLu_ToggleCoordinatesTransferFactory.hpp"
88#include "MueLu_TogglePFactory.hpp"
89#include "MueLu_TrilinosSmoother.hpp"
90#include "MueLu_TransPFactory.hpp"
91#include "MueLu_RfromP_Or_TransP.hpp"
92#include "MueLu_UncoupledAggregationFactory.hpp"
93#include "MueLu_HybridAggregationFactory.hpp"
94#include "MueLu_UnsmooshFactory.hpp"
95#include "MueLu_UserAggregationFactory.hpp"
96#include "MueLu_UserPFactory.hpp"
97#include "MueLu_UzawaSmoother.hpp"
98#include "MueLu_VariableDofLaplacianFactory.hpp"
99#include "MueLu_ZeroSubBlockAFactory.hpp"
100#include "MueLu_ZoltanInterface.hpp"
101#include "MueLu_Zoltan2Interface.hpp"
102#include "MueLu_NodePartitionInterface.hpp"
103
104#include "MueLu_CoalesceDropFactory_kokkos.hpp"
105#include "MueLu_GeometricInterpolationPFactory_kokkos.hpp"
106#include "MueLu_SemiCoarsenPFactory_kokkos.hpp"
107#include "MueLu_StructuredAggregationFactory_kokkos.hpp"
108#include "MueLu_TentativePFactory_kokkos.hpp"
109#include "MueLu_MatrixFreeTentativePFactory.hpp"
110#include "MueLu_RegionRFactory_kokkos.hpp"
111
112#ifdef HAVE_MUELU_MATLAB
113#include "MueLu_SingleLevelMatlabFactory.hpp"
114#include "MueLu_TwoLevelMatlabFactory.hpp"
115#include "MueLu_MatlabSmoother.hpp"
116#endif
117
118#if defined(HAVE_MUELU_INTREPID2) && defined(HAVE_MUELU_EXPERIMENTAL)
119#include "MueLu_IntrepidPCoarsenFactory.hpp"
120#endif
121
122namespace MueLu {
123
124template <class Scalar, class LocalOrdinal, class GlobalOrdinal, class Node>
125RCP<const FactoryBase> FactoryFactory<Scalar, LocalOrdinal, GlobalOrdinal, Node>::BuildFactory(const Teuchos::ParameterEntry& param, const FactoryMap& factoryMapIn, const FactoryManagerMap& factoryManagersIn) const {
126 // Find factory
127 std::string factoryName;
128 Teuchos::ParameterList paramList;
129 if (!param.isList()) {
130 factoryName = Teuchos::getValue<std::string>(param);
131 } else {
132 paramList = Teuchos::getValue<Teuchos::ParameterList>(param);
133 factoryName = paramList.get<std::string>("factory");
134 }
135
136 // TODO: see how Teko handles this (=> register factories).
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);
168 // LocalOrdinalTransferFactory is a utility factory that can be used for multiple things, so there is no default
169 // if (factoryName == "LocalOrdinalTransferFactory") return Build2<LocalOrdinalTransferFactory> (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);
173 if (factoryName == "NoFactory") return MueLu::NoFactory::getRCP();
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);
213
214 // Handle removed Kokkos factories
215 if (factoryName == "CoarseMapFactory_kokkos") return Build2<CoarseMapFactory>(paramList, factoryMapIn, factoryManagersIn);
216 if (factoryName == "CoordinatesTransferFactory_kokkos") return Build2<CoordinatesTransferFactory>(paramList, factoryMapIn, factoryManagersIn);
217
218 if (factoryName == "ZoltanInterface") {
219#if defined(HAVE_MUELU_ZOLTAN) && defined(HAVE_MPI)
220 return Build2<ZoltanInterface>(paramList, factoryMapIn, factoryManagersIn);
221#else
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.");
223#endif // HAVE_MUELU_ZOLTAN && HAVE_MPI
224 }
225 if (factoryName == "Zoltan2Interface") {
226#if defined(HAVE_MUELU_ZOLTAN2) && defined(HAVE_MPI)
227 return Build2<Zoltan2Interface>(paramList, factoryMapIn, factoryManagersIn);
228#else
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.");
230#endif // HAVE_MUELU_ZOLTAN2 && HAVE_MPI
231 }
232
233 if (factoryName == "NodePartitionInterface") {
234#if defined(HAVE_MPI)
235 return Build2<NodePartitionInterface>(paramList, factoryMapIn, factoryManagersIn);
236#else
237 TEUCHOS_TEST_FOR_EXCEPTION(true, Exceptions::RuntimeError, "MueLu::FactoryFactory:BuildFactory(): Cannot create a NodePartitionInterface object: HAVE_MPI == false.");
238#endif // HAVE_MPI
239 }
240
241 if (factoryName == "RepartitionFactory") {
242#ifdef HAVE_MPI
243 return Build2<RepartitionFactory>(paramList, factoryMapIn, factoryManagersIn);
244#else
245 TEUCHOS_TEST_FOR_EXCEPTION(true, Exceptions::RuntimeError, "MueLu::FactoryFactory:BuildFactory(): Cannot create a RepartitionFactory object: HAVE_MPI == false.");
246#endif // HAVE_MPI
247 }
248 if (factoryName == "RepartitionHeuristicFactory") {
249#ifdef HAVE_MPI
250 return Build2<RepartitionHeuristicFactory>(paramList, factoryMapIn, factoryManagersIn);
251#else
252 TEUCHOS_TEST_FOR_EXCEPTION(true, Exceptions::RuntimeError, "MueLu::FactoryFactory:BuildFactory(): Cannot create a RepartitionHeuristicFactory object: HAVE_MPI == false.");
253#endif // HAVE_MPI
254 }
255 // Blocked factories
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);
268#ifdef HAVE_MPI
269 if (factoryName == "RepartitionBlockDiagonalFactory") return Build2<RepartitionBlockDiagonalFactory>(paramList, factoryMapIn, factoryManagersIn);
270#endif
271#ifdef HAVE_MUELU_TEKO
272 if (factoryName == "TekoSmoother") return BuildTekoSmoother(paramList, factoryMapIn, factoryManagersIn);
273#endif
274 if (factoryName == "UzawaSmoother") return BuildBlockedSmoother<UzawaSmoother>(paramList, factoryMapIn, factoryManagersIn);
275
276 // Matlab factories
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);
281#endif
282
283#if defined(HAVE_MUELU_INTREPID2) && defined(HAVE_MUELU_EXPERIMENTAL)
284 if (factoryName == "IntrepidPCoarsenFactory") return Build2<IntrepidPCoarsenFactory>(paramList, factoryMapIn, factoryManagersIn);
285#endif
286
287 // Use a user defined factories (in <Factories> node)
288 if (factoryMapIn.find(factoryName) != factoryMapIn.end()) {
289 TEUCHOS_TEST_FOR_EXCEPTION((param.isList() && (++paramList.begin() != paramList.end())), Exceptions::RuntimeError,
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
294 << std::endl
295 << "Correct syntaxes includes:" << std::endl
296 << " <Parameter name=\"...\" type=\"string\" value=\"" << factoryName << "\"/>" << std::endl
297 << "or" << std::endl
298 << " <ParameterList name=\"...\"><Parameter name=\"factory\" type=\"string\" value=\"" << factoryName << "\"/></ParameterList>" << std::endl);
299
300 return factoryMapIn.find(factoryName)->second;
301 }
302
303 TEUCHOS_TEST_FOR_EXCEPTION(true, Exceptions::RuntimeError, "MueLu::FactoryFactory: unknown factory name : " << factoryName);
304
305 TEUCHOS_UNREACHABLE_RETURN(Teuchos::null);
306}
307
308template <class Scalar, class LocalOrdinal, class GlobalOrdinal, class Node>
309template <class T>
310RCP<T> FactoryFactory<Scalar, LocalOrdinal, GlobalOrdinal, Node>::Build(const Teuchos::ParameterList& paramList, const FactoryMap& factoryMapIn, const FactoryManagerMap& factoryManagersIn) const {
311 RCP<T> factory = rcp(new T());
312
313 const char* strarray[] = {"A", "P", "R", "Graph", "UnAmalgamationInfo", "Aggregates", "Nullspace", "TransferFactory", "DofsPerNode"};
314#define arraysize(ar) (sizeof(ar) / sizeof(ar[0]))
315 std::vector<std::string> v(strarray, strarray + arraysize(strarray));
316 for (size_t i = 0; i < v.size(); ++i)
317 if (paramList.isParameter(v[i]))
318 factory->SetFactory(v[i], BuildFactory(paramList.getEntry(v[i]), factoryMapIn, factoryManagersIn));
319
320 return factory;
321}
322
323template <class Scalar, class LocalOrdinal, class GlobalOrdinal, class Node>
324template <class T> // T must implement the Factory interface
325RCP<T> FactoryFactory<Scalar, LocalOrdinal, GlobalOrdinal, Node>::Build2(const Teuchos::ParameterList& paramList, const FactoryMap& factoryMapIn, const FactoryManagerMap& factoryManagersIn) const {
326 RCP<T> factory = rcp(new T());
327
328 ParameterList paramListWithFactories;
329
330 // Read the RCP<Factory> parameters of the class T
331 RCP<const ParameterList> validParamList = factory->GetValidParameterList(); // TODO check for Teuchos::null (no parameter list validation)
332 TEUCHOS_TEST_FOR_EXCEPTION(validParamList == Teuchos::null, Exceptions::RuntimeError, "FactoryFactory::Build2: default parameter list is null. Please fix this.");
333 for (ParameterList::ConstIterator param = validParamList->begin(); param != validParamList->end(); ++param) {
334 const std::string& pName = validParamList->name(param);
335
336 if (!paramList.isParameter(pName)) {
337 // Ignore unknown parameters
338 continue;
339 }
340
341 if (validParamList->isType<RCP<const FactoryBase> >(pName)) {
342 // Generate or get factory described by param
343 RCP<const FactoryBase> generatingFact = BuildFactory(paramList.getEntry(pName), factoryMapIn, factoryManagersIn);
344 paramListWithFactories.set(pName, generatingFact);
345 } else if (validParamList->isType<RCP<const ParameterList> >(pName)) {
346 if (pName == "ParameterList") {
347 // NOTE: we cannot use
348 // subList = sublist(rcpFromRef(paramList), pName)
349 // here as that would result in sublist also being a reference to a temporary object.
350 // The resulting dereferencing in the corresponding factory would then segfault
351 RCP<const ParameterList> subList = Teuchos::sublist(rcp(new ParameterList(paramList)), pName);
352 paramListWithFactories.set(pName, subList);
353 }
354 } else {
355 paramListWithFactories.setEntry(pName, paramList.getEntry(pName));
356 }
357 }
358
359 // Configure the factory
360 factory->SetParameterList(paramListWithFactories);
361
362 return factory;
363}
364
365template <class Scalar, class LocalOrdinal, class GlobalOrdinal, class Node>
366template <class T> // T must implement the Factory interface
367RCP<T> FactoryFactory<Scalar, LocalOrdinal, GlobalOrdinal, Node>::BuildRAPFactory(const Teuchos::ParameterList& paramList, const FactoryMap& factoryMapIn, const FactoryManagerMap& factoryManagersIn) const {
368 RCP<T> factory;
369 if (paramList.isSublist("TransferFactories") == false) {
370 factory = Build2<T>(paramList, factoryMapIn, factoryManagersIn);
371
372 } else {
373 RCP<Teuchos::ParameterList> paramListNonConst = rcp(new Teuchos::ParameterList(paramList));
374 RCP<const Teuchos::ParameterList> transferFactories = rcp(new Teuchos::ParameterList(*sublist(paramListNonConst, "TransferFactories")));
375
376 paramListNonConst->remove("TransferFactories");
377
378 factory = Build2<T>(*paramListNonConst, factoryMapIn, factoryManagersIn);
379
380 for (Teuchos::ParameterList::ConstIterator param = transferFactories->begin(); param != transferFactories->end(); ++param) {
381 RCP<const FactoryBase> p = BuildFactory(transferFactories->entry(param), factoryMapIn, factoryManagersIn);
382 factory->AddTransferFactory(p);
383 }
384 }
385
386 return factory;
387}
388
389template <class Scalar, class LocalOrdinal, class GlobalOrdinal, class Node>
390template <class T> // T must implement the Factory interface
391RCP<T> FactoryFactory<Scalar, LocalOrdinal, GlobalOrdinal, Node>::BuildTogglePFactory(const Teuchos::ParameterList& paramList, const FactoryMap& factoryMapIn, const FactoryManagerMap& factoryManagersIn) const {
392 RCP<T> factory;
393 if (paramList.isSublist("TransferFactories") == false) {
394 // TODO put in an error message: the TogglePFactory needs a TransferFactories sublist!
395 factory = Build2<T>(paramList, factoryMapIn, factoryManagersIn);
396
397 } else {
398 RCP<Teuchos::ParameterList> paramListNonConst = rcp(new Teuchos::ParameterList(paramList));
399 RCP<const Teuchos::ParameterList> transferFactories = rcp(new Teuchos::ParameterList(*sublist(paramListNonConst, "TransferFactories")));
400
401 paramListNonConst->remove("TransferFactories");
402
403 // build TogglePFactory
404 factory = Build2<T>(*paramListNonConst, factoryMapIn, factoryManagersIn);
405
406 // count how many prolongation factories and how many coarse null space factories have been declared.
407 // the numbers must match!
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++;
415 continue;
416 }
417 size_t foundPtent = transferFactories->name(param).find("Ptent");
418 if (foundPtent != std::string::npos && foundPtent == 0 && transferFactories->name(param).length() == 6) {
419 numPtentFactories++;
420 continue;
421 }
422 size_t foundP = transferFactories->name(param).find("P");
423 if (foundP != std::string::npos && foundP == 0 && transferFactories->name(param).length() == 2) {
424 numProlongatorFactories++;
425 continue;
426 }
427 }
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.");
431
432 // create empty vectors with data
433 std::vector<Teuchos::ParameterEntry> prolongatorFactoryNames(numProlongatorFactories);
434 std::vector<Teuchos::ParameterEntry> coarseNspFactoryNames(numProlongatorFactories);
435 std::vector<Teuchos::ParameterEntry> ptentFactoryNames(numProlongatorFactories);
436
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);
443 continue;
444 }
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);
450 continue;
451 }
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);
457 continue;
458 }
459 }
460
461 // register all prolongation factories in TogglePFactory
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);
465 }
466
467 // register all tentative prolongation factories in TogglePFactory
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);
471 }
472
473 // register all coarse nullspace factories in TogglePFactory
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);
477 }
478 }
479 return factory;
480}
481
482template <class Scalar, class LocalOrdinal, class GlobalOrdinal, class Node>
483RCP<MueLu::ToggleCoordinatesTransferFactory<Scalar, LocalOrdinal, GlobalOrdinal, Node> > FactoryFactory<Scalar, LocalOrdinal, GlobalOrdinal, Node>::BuildToggleCoordinatesTransferFactory(const Teuchos::ParameterList& paramList, const FactoryMap& factoryMapIn, const FactoryManagerMap& factoryManagersIn) const {
484 RCP<ToggleCoordinatesTransferFactory> factory;
485 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!");
486
487 RCP<Teuchos::ParameterList> paramListNonConst = rcp(new Teuchos::ParameterList(paramList));
488 RCP<const Teuchos::ParameterList> transferFactories = rcp(new Teuchos::ParameterList(*sublist(paramListNonConst, "TransferFactories")));
489 paramListNonConst->remove("TransferFactories");
490
491 // build CoordinatesTransferFactory
492 factory = Build2<ToggleCoordinatesTransferFactory>(*paramListNonConst, factoryMapIn, factoryManagersIn);
493
494 // count how many coordinate transfer factories have been declared.
495 // the numbers must match!
496 int numCoordTransferFactories = 0;
497 for (Teuchos::ParameterList::ConstIterator param = transferFactories->begin(); param != transferFactories->end(); ++param) {
498 size_t foundCoordinates = transferFactories->name(param).find("Coordinates");
499 if (foundCoordinates != std::string::npos && foundCoordinates == 0 && transferFactories->name(param).length() == 12) {
500 numCoordTransferFactories++;
501 continue;
502 }
503 }
504 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.");
505
506 // create empty vectors with data
507 std::vector<Teuchos::ParameterEntry> coarseCoordsFactoryNames(numCoordTransferFactories);
508
509 for (Teuchos::ParameterList::ConstIterator param = transferFactories->begin(); param != transferFactories->end(); ++param) {
510 size_t foundCoords = transferFactories->name(param).find("Coordinates");
511 if (foundCoords != std::string::npos && foundCoords == 0 && transferFactories->name(param).length() == 12) {
512 int number = atoi(&(transferFactories->name(param).at(11)));
513 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!");
514 coarseCoordsFactoryNames[number - 1] = transferFactories->entry(param);
515 continue;
516 }
517 }
518
519 // register all coarse nullspace factories in TogglePFactory
520 for (std::vector<Teuchos::ParameterEntry>::const_iterator it = coarseCoordsFactoryNames.begin(); it != coarseCoordsFactoryNames.end(); ++it) {
521 RCP<const FactoryBase> p = BuildFactory(*it, factoryMapIn, factoryManagersIn);
522 factory->AddCoordTransferFactory(p);
523 }
524
525 return factory;
526}
527
528template <class Scalar, class LocalOrdinal, class GlobalOrdinal, class Node>
529RCP<FactoryBase> FactoryFactory<Scalar, LocalOrdinal, GlobalOrdinal, Node>::BuildTrilinosSmoother(const Teuchos::ParameterList& paramList, const FactoryMap& factoryMapIn, const FactoryManagerMap& factoryManagersIn) const {
530 if (paramList.begin() == paramList.end())
531 return rcp(new SmootherFactory(rcp(new TrilinosSmoother())));
532
533 TEUCHOS_TEST_FOR_EXCEPTION(paramList.get<std::string>("factory") != "TrilinosSmoother", Exceptions::RuntimeError, "");
534
535 // Is it true? TEUCHOS_TEST_FOR_EXCEPTION(!paramList.isParameter("type"), Exceptions::RuntimeError, "TrilinosSmoother: parameter 'type' is mandatory");
536 // type="" is default in TrilinosSmoother, but what happen then?
537
538 std::string type = "";
539 if (paramList.isParameter("type")) type = paramList.get<std::string>("type");
540 int overlap = 0;
541 if (paramList.isParameter("overlap")) overlap = paramList.get<int>("overlap");
542 // std::string verbose; if(paramList.isParameter("verbose")) verbose = paramList.get<std::string>("verbose");
543 Teuchos::ParameterList params;
544 if (paramList.isParameter("ParameterList")) params = paramList.get<Teuchos::ParameterList>("ParameterList");
545
546 // parameters from SmootherFactory
547 // bool bKeepSmootherData = false; if(paramList.isParameter("keep smoother data")) bKeepSmootherData = paramList.get<bool>("keep smoother data");
548
549 // Read in factory information for smoothers (if available...)
550 // NOTE: only a selected number of factories can be used with the Trilinos smoother
551 // smoothers usually work with the global data available (which is A and the transfers P and R)
552
553 Teuchos::RCP<TrilinosSmoother> trilSmoo = Teuchos::rcp(new TrilinosSmoother(type, params, overlap));
554
555 if (paramList.isParameter("LineDetection_Layers")) {
556 RCP<const FactoryBase> generatingFact = BuildFactory(paramList.getEntry("LineDetection_Layers"), factoryMapIn, factoryManagersIn);
557 trilSmoo->SetFactory("LineDetection_Layers", generatingFact);
558 }
559 if (paramList.isParameter("LineDetection_VertLineIds")) {
560 RCP<const FactoryBase> generatingFact = BuildFactory(paramList.getEntry("LineDetection_Layers"), factoryMapIn, factoryManagersIn);
561 trilSmoo->SetFactory("LineDetection_Layers", generatingFact);
562 }
563 if (paramList.isParameter("CoarseNumZLayers")) {
564 RCP<const FactoryBase> generatingFact = BuildFactory(paramList.getEntry("CoarseNumZLayers"), factoryMapIn, factoryManagersIn);
565 trilSmoo->SetFactory("CoarseNumZLayers", generatingFact);
566 }
567
568 RCP<SmootherFactory> smooFact = rcp(new SmootherFactory(Teuchos::null));
569 Teuchos::ParameterList smooFactParams;
570 // smooFactParams.setEntry("keep smoother data", paramList.getEntry("keep smoother data"));
571 smooFact->SetParameterList(smooFactParams);
572 smooFact->SetSmootherPrototypes(trilSmoo);
573 return smooFact;
574}
575
576#ifdef HAVE_MUELU_MATLAB
577template <class Scalar, class LocalOrdinal, class GlobalOrdinal, class Node>
578RCP<FactoryBase>
579FactoryFactory<Scalar, LocalOrdinal, GlobalOrdinal, Node>::BuildMatlabSmoother(const Teuchos::ParameterList& paramList, const FactoryMap& factoryMapIn, const FactoryManagerMap& factoryManagersIn) const {
580 if (paramList.begin() == paramList.end())
581 return rcp(new SmootherFactory(rcp(new MatlabSmoother())));
582
583 TEUCHOS_TEST_FOR_EXCEPTION(paramList.get<std::string>("factory") != "MatlabSmoother", Exceptions::RuntimeError, "");
584
585 // Read in factory information for smoothers (if available...)
586 // NOTE: only a selected number of factories can be used with the Trilinos smoother
587 // smoothers usually work with the global data available (which is A and the transfers P and R)
588
589 Teuchos::RCP<MatlabSmoother> matSmoo = Teuchos::rcp(new MatlabSmoother(paramList));
590
591 return rcp(new SmootherFactory(matSmoo));
592}
593#endif
594
595template <class Scalar, class LocalOrdinal, class GlobalOrdinal, class Node>
596RCP<FactoryBase> FactoryFactory<Scalar, LocalOrdinal, GlobalOrdinal, Node>::BuildDirectSolver(const Teuchos::ParameterList& paramList, const FactoryMap& /* factoryMapIn */, const FactoryManagerMap& /* factoryManagersIn */) const {
597 if (paramList.begin() == paramList.end())
598 return rcp(new SmootherFactory(rcp(new DirectSolver()), Teuchos::null));
599
600 TEUCHOS_TEST_FOR_EXCEPTION(paramList.get<std::string>("factory") != "DirectSolver", Exceptions::RuntimeError, "");
601
602 std::string type;
603 if (paramList.isParameter("type")) type = paramList.get<std::string>("type");
604 // std::string verbose; if(paramList.isParameter("verbose")) verbose = paramList.get<std::string>("verbose");
605 Teuchos::ParameterList params;
606 if (paramList.isParameter("ParameterList")) params = paramList.get<Teuchos::ParameterList>("ParameterList");
607
608 return rcp(new SmootherFactory(rcp(new DirectSolver(type, params)), Teuchos::null));
609}
610
611template <class Scalar, class LocalOrdinal, class GlobalOrdinal, class Node>
612template <class T> // T must implement the Factory interface
613RCP<FactoryBase> FactoryFactory<Scalar, LocalOrdinal, GlobalOrdinal, Node>::BuildBlockedSmoother(const Teuchos::ParameterList& paramList, const FactoryMap& factoryMapIn, const FactoryManagerMap& factoryManagersIn) const {
614 // read in sub lists
615 RCP<ParameterList> paramListNonConst = rcp(new ParameterList(paramList));
616
617 // internal vector of factory managers
618 std::vector<RCP<FactoryManager> > facManagers;
619
620 // loop over all "block%i" sublists in parameter list
621 int blockid = 1;
622 bool blockExists = true;
623 while (blockExists == true) {
624 std::stringstream ss;
625 ss << "block" << blockid;
626
627 if (paramList.isSublist(ss.str()) == true) {
628 // we either have a parameter group or we have a list of factories in here
629 RCP<const ParameterList> b = rcp(new ParameterList(*sublist(paramListNonConst, ss.str())));
630
631 RCP<FactoryManager> M = Teuchos::null;
632
633 if (b->isParameter("group")) {
634 // use a factory manager
635 std::string facManagerName = b->get<std::string>("group");
636 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.");
637 RCP<FactoryManagerBase> Mb = factoryManagersIn.find(facManagerName)->second;
638 M = Teuchos::rcp_dynamic_cast<FactoryManager>(Mb);
639 TEUCHOS_TEST_FOR_EXCEPTION(M == Teuchos::null, Exceptions::RuntimeError, "Failed to cast FactoryManagerBase object to FactoryManager.");
640 } else {
641 // read in the list of factories
642 M = rcp(new FactoryManager());
643 for (ParameterList::ConstIterator param = b->begin(); param != b->end(); ++param) {
644 RCP<const FactoryBase> p = BuildFactory(b->entry(param), factoryMapIn, factoryManagersIn);
645 M->SetFactory(b->name(param), p);
646 }
647 }
648
649 // add factory manager to internal vector of factory managers
650 M->SetIgnoreUserData(true);
651 facManagers.push_back(M);
652 paramListNonConst->remove(ss.str());
653 blockid++;
654 } else {
655 blockExists = false;
656 break;
657 }
658 }
659
660 // create a new blocked smoother
661 RCP<T> bs = Build2<T>(*paramListNonConst, factoryMapIn, factoryManagersIn);
662
663 // important: set block factory for A here!
664 // TAW: 7/6/2016: We should not need to set/hardcode the blocked operator here.
665 // The user might want to overwrite this in the xml file, so just
666 // use what is declared as "A"
667 // bs->SetFactory("A", MueLu::NoFactory::getRCP());
668
669 for (int i = 0; i < Teuchos::as<int>(facManagers.size()); i++) {
670 bs->AddFactoryManager(facManagers[i], i);
671 }
672
673 return rcp(new SmootherFactory(bs));
674}
675
676#ifdef HAVE_MUELU_TEKO
677template <class Scalar, class LocalOrdinal, class GlobalOrdinal, class Node>
678RCP<FactoryBase> FactoryFactory<Scalar, LocalOrdinal, GlobalOrdinal, Node>::BuildTekoSmoother(const Teuchos::ParameterList& paramList, const FactoryMap& factoryMapIn, const FactoryManagerMap& factoryManagersIn) const {
679 // read in sub lists
680 RCP<ParameterList> paramListNonConst = rcp(new ParameterList(paramList));
681 RCP<ParameterList> tekoParams = rcp(new ParameterList(paramListNonConst->sublist("Inverse Factory Library")));
682 paramListNonConst->remove("Inverse Factory Library");
683
684 // create a new blocked smoother
685 RCP<TekoSmoother> bs = Build2<TekoSmoother>(*paramListNonConst, factoryMapIn, factoryManagersIn);
686
687 // important: set block factory for A here!
688 // TAW: 7/6/2016: We should not need to set/hardcode the blocked operator here.
689 // The user might want to overwrite this in the xml file, so just
690 // use what is declared as "A"
691 // bs->SetFactory("A", MueLu::NoFactory::getRCP());
692
693 // Set Teko parameters ("Inverse Factory Library")
694 bs->SetTekoParameters(tekoParams);
695
696 return rcp(new SmootherFactory(bs));
697}
698#endif
699
700template <class Scalar, class LocalOrdinal, class GlobalOrdinal, class Node>
701RCP<FactoryBase> FactoryFactory<Scalar, LocalOrdinal, GlobalOrdinal, Node>::BuildBlockedDirectSolver(const Teuchos::ParameterList& paramList, const FactoryMap& /* factoryMapIn */, const FactoryManagerMap& /* factoryManagersIn */) const {
702 if (paramList.numParams() == 0)
703 return rcp(new SmootherFactory(rcp(new BlockedDirectSolver())));
704
705 TEUCHOS_TEST_FOR_EXCEPTION(paramList.get<std::string>("factory") != "BlockedDirectSolver", Exceptions::RuntimeError, "FactoryFactory::BuildBlockedDirectSolver: Generating factory needs to be a BlockedDirectSolver.");
706
707 std::string type;
708 if (paramList.isParameter("type")) type = paramList.get<std::string>("type");
709 // std::string verbose; if(paramList.isParameter("verbose")) verbose = paramList.get<std::string>("verbose");
710 Teuchos::ParameterList params;
711 if (paramList.isParameter("ParameterList")) params = paramList.get<Teuchos::ParameterList>("ParameterList");
712
713 return rcp(new SmootherFactory(rcp(new BlockedDirectSolver(type, params))));
714}
715
716template <class Scalar, class LocalOrdinal, class GlobalOrdinal, class Node>
717template <class T> // T must implement the Factory interface
718RCP<T> FactoryFactory<Scalar, LocalOrdinal, GlobalOrdinal, Node>::BuildBlockedFactory(const Teuchos::ParameterList& paramList, const FactoryMap& factoryMapIn, const FactoryManagerMap& factoryManagersIn) const {
719 RCP<T> pfac = Teuchos::null;
720
721 // read in sub lists
722 RCP<ParameterList> paramListNonConst = rcp(new ParameterList(paramList));
723
724 // internal vector of factory managers
725 std::vector<RCP<FactoryManager> > facManagers;
726
727 // loop over all "block%i" sublists in parameter list
728 int blockid = 1;
729 bool blockExists = true;
730 while (blockExists == true) {
731 std::stringstream ss;
732 ss << "block" << blockid;
733
734 if (paramList.isSublist(ss.str()) == true) {
735 // we either have a parameter group or we have a list of factories in here
736 RCP<const ParameterList> b = rcp(new ParameterList(*sublist(paramListNonConst, ss.str())));
737
738 RCP<FactoryManager> M = Teuchos::null;
739
740 if (b->isParameter("group")) {
741 // use a factory manager
742 std::string facManagerName = b->get<std::string>("group");
743 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.");
744 RCP<FactoryManagerBase> Mb = factoryManagersIn.find(facManagerName)->second;
745 M = Teuchos::rcp_dynamic_cast<FactoryManager>(Mb);
746 TEUCHOS_TEST_FOR_EXCEPTION(M == Teuchos::null, Exceptions::RuntimeError, "Failed to cast FactoryManagerBase object to FactoryManager.");
747 } else {
748 // read in the list of factories
749 M = rcp(new FactoryManager());
750 for (ParameterList::ConstIterator param = b->begin(); param != b->end(); ++param) {
751 RCP<const FactoryBase> p = BuildFactory(b->entry(param), factoryMapIn, factoryManagersIn);
752 M->SetFactory(b->name(param), p);
753 }
754 }
755
756 // add factory manager to internal vector of factory managers
757 M->SetIgnoreUserData(true);
758 facManagers.push_back(M);
759 paramListNonConst->remove(ss.str());
760 blockid++;
761 } else {
762 blockExists = false;
763 break;
764 }
765 }
766
767 // build BlockedPFactory (without sub block information)
768 pfac = Build2<T>(*paramListNonConst, factoryMapIn, factoryManagersIn);
769
770 // add FactoryManager objects
771 for (size_t i = 0; i < facManagers.size(); i++) {
772 pfac->AddFactoryManager(facManagers[i]); // add factory manager
773 }
774
775 return pfac;
776}
777
778template <class Scalar, class LocalOrdinal, class GlobalOrdinal, class Node>
779template <class T> // T must implement the Factory interface
780RCP<T> FactoryFactory<Scalar, LocalOrdinal, GlobalOrdinal, Node>::BuildBlockedCoordFactory(const Teuchos::ParameterList& paramList, const FactoryMap& factoryMapIn, const FactoryManagerMap& factoryManagersIn) const {
781 RCP<T> pfac = Teuchos::null;
782
783 // read in sub lists
784 RCP<ParameterList> paramListNonConst = rcp(new ParameterList(paramList));
785
786 // internal vector of factory managers
787 std::vector<RCP<const FactoryBase> > facBase;
788
789 // loop over all "block%i" sublists in parameter list
790 int blockid = 1;
791 bool blockExists = true;
792 while (blockExists == true) {
793 std::stringstream ss;
794 ss << "block" << blockid;
795
796 if (paramList.isSublist(ss.str()) == true) {
797 // we either have a parameter group or we have a list of factories in here
798 RCP<const ParameterList> b = rcp(new ParameterList(*sublist(paramListNonConst, ss.str())));
799
800 // read in the list of factories
801 for (ParameterList::ConstIterator param = b->begin(); param != b->end(); ++param) {
802 RCP<const FactoryBase> p = BuildFactory(b->entry(param), factoryMapIn, factoryManagersIn);
803 facBase.push_back(p);
804 }
805
806 // add factory manager to internal vector of factory managers
807 paramListNonConst->remove(ss.str());
808 blockid++;
809 } else {
810 blockExists = false;
811 break;
812 }
813 }
814
815 // build BlockedPFactory (without sub block information)
816 pfac = Build2<T>(*paramListNonConst, factoryMapIn, factoryManagersIn);
817
818 // add FactoryManager objects
819 for (size_t i = 0; i < facBase.size(); i++) {
820 pfac->AddFactory(facBase[i]); // add factory manager
821 }
822
823 return pfac;
824}
825} // namespace MueLu
826
827#endif
#define arraysize(ar)
direct solver for nxn blocked matrices
Class that encapsulates direct solvers. Autoselection of AmesosSmoother or Amesos2Smoother according ...
Exception throws to report errors in the internal logical of the program.
std::map< std::string, RCP< const FactoryBase > > FactoryMap
RCP< FactoryBase > BuildBlockedDirectSolver(const Teuchos::ParameterList &paramList, const FactoryMap &, const FactoryManagerMap &) const
std::map< std::string, RCP< FactoryManagerBase > > FactoryManagerMap
RCP< T > BuildBlockedFactory(const Teuchos::ParameterList &paramList, const FactoryMap &factoryMapIn, const FactoryManagerMap &factoryManagersIn) const
RCP< FactoryBase > BuildBlockedSmoother(const Teuchos::ParameterList &paramList, const FactoryMap &factoryMapIn, const FactoryManagerMap &factoryManagersIn) const
virtual RCP< const FactoryBase > BuildFactory(const Teuchos::ParameterEntry &param, const FactoryMap &factoryMapIn, const FactoryManagerMap &factoryManagersIn) const
: Interpret Factory parameter list and build new factory
RCP< FactoryBase > BuildTekoSmoother(const Teuchos::ParameterList &paramList, const FactoryMap &factoryMapIn, const FactoryManagerMap &factoryManagersIn) const
RCP< T > BuildTogglePFactory(const Teuchos::ParameterList &paramList, const FactoryMap &factoryMapIn, const FactoryManagerMap &factoryManagersIn) const
RCP< ToggleCoordinatesTransferFactory > BuildToggleCoordinatesTransferFactory(const Teuchos::ParameterList &paramList, const FactoryMap &factoryMapIn, const FactoryManagerMap &factoryManagersIn) const
RCP< T > BuildRAPFactory(const Teuchos::ParameterList &paramList, const FactoryMap &factoryMapIn, const FactoryManagerMap &factoryManagersIn) const
RCP< T > BuildBlockedCoordFactory(const Teuchos::ParameterList &paramList, const FactoryMap &factoryMapIn, const FactoryManagerMap &factoryManagersIn) const
RCP< FactoryBase > BuildDirectSolver(const Teuchos::ParameterList &paramList, const FactoryMap &, const FactoryManagerMap &) const
RCP< T > Build(const Teuchos::ParameterList &paramList, const FactoryMap &factoryMapIn, const FactoryManagerMap &factoryManagersIn) const
RCP< T > Build2(const Teuchos::ParameterList &paramList, const FactoryMap &factoryMapIn, const FactoryManagerMap &factoryManagersIn) const
RCP< FactoryBase > BuildTrilinosSmoother(const Teuchos::ParameterList &paramList, const FactoryMap &factoryMapIn, const FactoryManagerMap &factoryManagersIn) const
TrilinosSmoother.
RCP< FactoryBase > BuildMatlabSmoother(const Teuchos::ParameterList &paramList, const FactoryMap &factoryMapIn, const FactoryManagerMap &factoryManagersIn) const
MatlabSmoother.
This class specifies the default factory that should generate some data on a Level if the data does n...
Class that encapsulates Matlab smoothers.
static const RCP< const NoFactory > getRCP()
Static Get() functions.
Generic Smoother Factory for generating the smoothers of the MG hierarchy.
Class that encapsulates external library smoothers.
Namespace for MueLu classes and methods.