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#ifdef HAVE_MUELU_EXPERIMENTAL
82#include "MueLu_StructuredRAPFactory.hpp"
83#endif
84#include "MueLu_StructuredLineDetectionFactory.hpp"
85#include "MueLu_SubBlockAFactory.hpp"
86#ifdef HAVE_MUELU_TEKO
87#include "MueLu_TekoSmoother.hpp"
88#endif
89#include "MueLu_TentativePFactory.hpp"
90#include "MueLu_ToggleCoordinatesTransferFactory.hpp"
91#include "MueLu_TogglePFactory.hpp"
92#include "MueLu_TrilinosSmoother.hpp"
93#include "MueLu_TransPFactory.hpp"
94#include "MueLu_RfromP_Or_TransP.hpp"
95#include "MueLu_UncoupledAggregationFactory.hpp"
96#include "MueLu_HybridAggregationFactory.hpp"
97#include "MueLu_UnsmooshFactory.hpp"
98#include "MueLu_UserAggregationFactory.hpp"
99#include "MueLu_UserPFactory.hpp"
100#include "MueLu_UzawaSmoother.hpp"
101#include "MueLu_VariableDofLaplacianFactory.hpp"
102#include "MueLu_ZeroSubBlockAFactory.hpp"
103#include "MueLu_ZoltanInterface.hpp"
104#include "MueLu_Zoltan2Interface.hpp"
105#include "MueLu_NodePartitionInterface.hpp"
106
107#include "MueLu_CoalesceDropFactory_kokkos.hpp"
108#include "MueLu_GeometricInterpolationPFactory_kokkos.hpp"
109#include "MueLu_SemiCoarsenPFactory_kokkos.hpp"
110#include "MueLu_StructuredAggregationFactory_kokkos.hpp"
111#include "MueLu_TentativePFactory_kokkos.hpp"
112#include "MueLu_MatrixFreeTentativePFactory.hpp"
113#include "MueLu_RegionRFactory_kokkos.hpp"
114
115#ifdef HAVE_MUELU_MATLAB
116#include "MueLu_SingleLevelMatlabFactory.hpp"
117#include "MueLu_TwoLevelMatlabFactory.hpp"
118#include "MueLu_MatlabSmoother.hpp"
119#endif
120
121#if defined(HAVE_MUELU_INTREPID2) && defined(HAVE_MUELU_EXPERIMENTAL)
122#include "MueLu_IntrepidPCoarsenFactory.hpp"
123#endif
124
125namespace MueLu {
126
127template <class Scalar, class LocalOrdinal, class GlobalOrdinal, class Node>
128RCP<const FactoryBase> FactoryFactory<Scalar, LocalOrdinal, GlobalOrdinal, Node>::BuildFactory(const Teuchos::ParameterEntry& param, const FactoryMap& factoryMapIn, const FactoryManagerMap& factoryManagersIn) const {
129 // Find factory
130 std::string factoryName;
131 Teuchos::ParameterList paramList;
132 if (!param.isList()) {
133 factoryName = Teuchos::getValue<std::string>(param);
134 } else {
135 paramList = Teuchos::getValue<Teuchos::ParameterList>(param);
136 factoryName = paramList.get<std::string>("factory");
137 }
138
139 // TODO: see how Teko handles this (=> register factories).
140 if (factoryName == "AggregateQualityEstimateFactory") return Build2<AggregateQualityEstimateFactory>(paramList, factoryMapIn, factoryManagersIn);
141 if (factoryName == "AggregationExportFactory") return Build2<AggregationExportFactory>(paramList, factoryMapIn, factoryManagersIn);
142 if (factoryName == "AmalgamationFactory") return Build2<AmalgamationFactory>(paramList, factoryMapIn, factoryManagersIn);
143 if (factoryName == "BlockedCoarseMapFactory") return Build2<BlockedCoarseMapFactory>(paramList, factoryMapIn, factoryManagersIn);
144 if (factoryName == "BlockedRAPFactory") return BuildRAPFactory<BlockedRAPFactory>(paramList, factoryMapIn, factoryManagersIn);
145 if (factoryName == "BrickAggregationFactory") return Build2<BrickAggregationFactory>(paramList, factoryMapIn, factoryManagersIn);
146 if (factoryName == "ClassicalMapFactory") return Build2<ClassicalMapFactory>(paramList, factoryMapIn, factoryManagersIn);
147 if (factoryName == "ClassicalPFactory") return Build2<ClassicalPFactory>(paramList, factoryMapIn, factoryManagersIn);
148 if (factoryName == "CloneRepartitionInterface") return Build2<CloneRepartitionInterface>(paramList, factoryMapIn, factoryManagersIn);
149 if (factoryName == "CoarseMapFactory") return Build2<CoarseMapFactory>(paramList, factoryMapIn, factoryManagersIn);
150 if (factoryName == "CoarseningVisualizationFactory") return Build2<CoarseningVisualizationFactory>(paramList, factoryMapIn, factoryManagersIn);
151 if (factoryName == "CoalesceDropFactory") return Build2<CoalesceDropFactory>(paramList, factoryMapIn, factoryManagersIn);
152 if (factoryName == "SmooVecCoalesceDropFactory") return Build2<SmooVecCoalesceDropFactory>(paramList, factoryMapIn, factoryManagersIn);
153 if (factoryName == "ConstraintFactory") return Build2<ConstraintFactory>(paramList, factoryMapIn, factoryManagersIn);
154 if (factoryName == "CoordinatesTransferFactory") return Build2<CoordinatesTransferFactory>(paramList, factoryMapIn, factoryManagersIn);
155 if (factoryName == "DirectSolver") return BuildDirectSolver(paramList, factoryMapIn, factoryManagersIn);
156 if (factoryName == "DropNegativeEntriesFactory") return Build2<DropNegativeEntriesFactory>(paramList, factoryMapIn, factoryManagersIn);
157 if (factoryName == "EminPFactory") return Build2<EminPFactory>(paramList, factoryMapIn, factoryManagersIn);
158 if (factoryName == "FilteredAFactory") return Build2<FilteredAFactory>(paramList, factoryMapIn, factoryManagersIn);
159 if (factoryName == "FineLevelInputDataFactory") return Build2<FineLevelInputDataFactory>(paramList, factoryMapIn, factoryManagersIn);
160 if (factoryName == "GeneralGeometricPFactory") return Build2<GeneralGeometricPFactory>(paramList, factoryMapIn, factoryManagersIn);
161 if (factoryName == "ReplicatePFactory") return Build2<ReplicatePFactory>(paramList, factoryMapIn, factoryManagersIn);
162 if (factoryName == "CombinePFactory") return Build2<CombinePFactory>(paramList, factoryMapIn, factoryManagersIn);
163 if (factoryName == "GenericRFactory") return Build2<GenericRFactory>(paramList, factoryMapIn, factoryManagersIn);
164 if (factoryName == "GeometricInterpolationPFactory") return Build2<GeometricInterpolationPFactory>(paramList, factoryMapIn, factoryManagersIn);
165 if (factoryName == "HybridAggregationFactory") return Build2<HybridAggregationFactory>(paramList, factoryMapIn, factoryManagersIn);
166 if (factoryName == "InterfaceAggregationFactory") return Build2<InterfaceAggregationFactory>(paramList, factoryMapIn, factoryManagersIn);
167 if (factoryName == "InterfaceMappingTransferFactory") return Build2<InterfaceMappingTransferFactory>(paramList, factoryMapIn, factoryManagersIn);
168 if (factoryName == "InverseApproximationFactory") return Build2<InverseApproximationFactory>(paramList, factoryMapIn, factoryManagersIn);
169 if (factoryName == "InitialBlockNumberFactory") return Build2<InitialBlockNumberFactory>(paramList, factoryMapIn, factoryManagersIn);
170 if (factoryName == "LineDetectionFactory") return Build2<LineDetectionFactory>(paramList, factoryMapIn, factoryManagersIn);
171 // LocalOrdinalTransferFactory is a utility factory that can be used for multiple things, so there is no default
172 // if (factoryName == "LocalOrdinalTransferFactory") return Build2<LocalOrdinalTransferFactory> (paramList, factoryMapIn, factoryManagersIn);
173 if (factoryName == "MapTransferFactory") return Build2<MapTransferFactory>(paramList, factoryMapIn, factoryManagersIn);
174 if (factoryName == "MatrixAnalysisFactory") return Build2<MatrixAnalysisFactory>(paramList, factoryMapIn, factoryManagersIn);
175 if (factoryName == "MultiVectorTransferFactory") return Build2<MultiVectorTransferFactory>(paramList, factoryMapIn, factoryManagersIn);
176 if (factoryName == "NoFactory") return MueLu::NoFactory::getRCP();
177 if (factoryName == "NoSmoother") return rcp(new SmootherFactory(Teuchos::null));
178 if (factoryName == "NotayAggregationFactory") return Build2<NotayAggregationFactory>(paramList, factoryMapIn, factoryManagersIn);
179 if (factoryName == "NullspaceFactory") return Build2<NullspaceFactory>(paramList, factoryMapIn, factoryManagersIn);
180 if (factoryName == "NullspacePresmoothFactory") return Build2<NullspacePresmoothFactory>(paramList, factoryMapIn, factoryManagersIn);
181 if (factoryName == "PatternFactory") return Build2<PatternFactory>(paramList, factoryMapIn, factoryManagersIn);
182 if (factoryName == "PgPFactory") return Build2<PgPFactory>(paramList, factoryMapIn, factoryManagersIn);
183 if (factoryName == "SaPFactory") return Build2<SaPFactory>(paramList, factoryMapIn, factoryManagersIn);
184 if (factoryName == "RAPFactory") return BuildRAPFactory<RAPFactory>(paramList, factoryMapIn, factoryManagersIn);
185 if (factoryName == "RAPShiftFactory") return BuildRAPFactory<RAPShiftFactory>(paramList, factoryMapIn, factoryManagersIn);
186 if (factoryName == "RebalanceAcFactory") return Build2<RebalanceAcFactory>(paramList, factoryMapIn, factoryManagersIn);
187 if (factoryName == "RebalanceTransferFactory") return Build2<RebalanceTransferFactory>(paramList, factoryMapIn, factoryManagersIn);
188 if (factoryName == "RegionRFactory") return Build2<RegionRFactory>(paramList, factoryMapIn, factoryManagersIn);
189 if (factoryName == "RegionRFactory_kokkos") return Build2<RegionRFactory_kokkos>(paramList, factoryMapIn, factoryManagersIn);
190 if (factoryName == "ReorderBlockAFactory") return Build2<ReorderBlockAFactory>(paramList, factoryMapIn, factoryManagersIn);
191 if (factoryName == "RepartitionInterface") return Build2<RepartitionInterface>(paramList, factoryMapIn, factoryManagersIn);
192 if (factoryName == "ScaledNullspaceFactory") return Build2<ScaledNullspaceFactory>(paramList, factoryMapIn, factoryManagersIn);
193 if (factoryName == "SegregatedAFactory") return Build2<SegregatedAFactory>(paramList, factoryMapIn, factoryManagersIn);
194 if (factoryName == "SemiCoarsenPFactory") return Build2<SemiCoarsenPFactory>(paramList, factoryMapIn, factoryManagersIn);
195 if (factoryName == "StructuredAggregationFactory") return Build2<StructuredAggregationFactory>(paramList, factoryMapIn, factoryManagersIn);
196 if (factoryName == "StructuredLineDetectionFactory") return Build2<StructuredLineDetectionFactory>(paramList, factoryMapIn, factoryManagersIn);
197#ifdef HAVE_MUELU_EXPERIMENTAL
198 if (factoryName == "StructuredRAPFactory") return Build2<StructuredRAPFactory>(paramList, factoryMapIn, factoryManagersIn);
199#endif
200 if (factoryName == "SubBlockAFactory") return Build2<SubBlockAFactory>(paramList, factoryMapIn, factoryManagersIn);
201 if (factoryName == "TentativePFactory") return Build2<TentativePFactory>(paramList, factoryMapIn, factoryManagersIn);
202 if (factoryName == "ToggleCoordinatesTransferFactory") return BuildToggleCoordinatesTransferFactory(paramList, factoryMapIn, factoryManagersIn);
203 if (factoryName == "TogglePFactory") return BuildTogglePFactory<TogglePFactory>(paramList, factoryMapIn, factoryManagersIn);
204 if (factoryName == "TransPFactory") return Build2<TransPFactory>(paramList, factoryMapIn, factoryManagersIn);
205 if (factoryName == "RfromP_Or_TransP") return Build2<RfromP_Or_TransP>(paramList, factoryMapIn, factoryManagersIn);
206 if (factoryName == "TrilinosSmoother") return BuildTrilinosSmoother(paramList, factoryMapIn, factoryManagersIn);
207 if (factoryName == "UncoupledAggregationFactory") return Build2<UncoupledAggregationFactory>(paramList, factoryMapIn, factoryManagersIn);
208 if (factoryName == "UnsmooshFactory") return Build2<UnsmooshFactory>(paramList, factoryMapIn, factoryManagersIn);
209 if (factoryName == "UserAggregationFactory") return Build2<UserAggregationFactory>(paramList, factoryMapIn, factoryManagersIn);
210 if (factoryName == "UserPFactory") return Build2<UserPFactory>(paramList, factoryMapIn, factoryManagersIn);
211 if (factoryName == "VariableDofLaplacianFactory") return Build2<VariableDofLaplacianFactory>(paramList, factoryMapIn, factoryManagersIn);
212 if (factoryName == "ZeroSubBlockAFactory") return Build2<ZeroSubBlockAFactory>(paramList, factoryMapIn, factoryManagersIn);
213 if (factoryName == "CoalesceDropFactory_kokkos") return Build2<CoalesceDropFactory_kokkos>(paramList, factoryMapIn, factoryManagersIn);
214 if (factoryName == "GeometricInterpolationPFactory_kokkos") return Build2<GeometricInterpolationPFactory_kokkos>(paramList, factoryMapIn, factoryManagersIn);
215 if (factoryName == "SemiCoarsenPFactory_kokkos") return Build2<SemiCoarsenPFactory_kokkos>(paramList, factoryMapIn, factoryManagersIn);
216 if (factoryName == "StructuredAggregationFactory_kokkos") return Build2<StructuredAggregationFactory_kokkos>(paramList, factoryMapIn, factoryManagersIn);
217 if (factoryName == "TentativePFactory_kokkos") return Build2<TentativePFactory_kokkos>(paramList, factoryMapIn, factoryManagersIn);
218 if (factoryName == "MatrixFreeTentativePFactory") return Build2<MatrixFreeTentativePFactory>(paramList, factoryMapIn, factoryManagersIn);
219
220 // Handle removed Kokkos factories
221 if (factoryName == "CoarseMapFactory_kokkos") return Build2<CoarseMapFactory>(paramList, factoryMapIn, factoryManagersIn);
222 if (factoryName == "CoordinatesTransferFactory_kokkos") return Build2<CoordinatesTransferFactory>(paramList, factoryMapIn, factoryManagersIn);
223
224 if (factoryName == "ZoltanInterface") {
225#if defined(HAVE_MUELU_ZOLTAN) && defined(HAVE_MPI)
226 return Build2<ZoltanInterface>(paramList, factoryMapIn, factoryManagersIn);
227#else
228 TEUCHOS_TEST_FOR_EXCEPTION(true, Exceptions::RuntimeError, "MueLu::FactoryFactory:BuildFactory(): Cannot create a ZoltanInterface object: Zoltan is disabled: HAVE_MUELU_ZOLTAN && HAVE_MPI == false.");
229#endif // HAVE_MUELU_ZOLTAN && HAVE_MPI
230 }
231 if (factoryName == "Zoltan2Interface") {
232#if defined(HAVE_MUELU_ZOLTAN2) && defined(HAVE_MPI)
233 return Build2<Zoltan2Interface>(paramList, factoryMapIn, factoryManagersIn);
234#else
235 TEUCHOS_TEST_FOR_EXCEPTION(true, Exceptions::RuntimeError, "MueLu::FactoryFactory:BuildFactory(): Cannot create a Zoltan2Interface object: Zoltan2 is disabled: HAVE_MUELU_ZOLTAN2 && HAVE_MPI == false.");
236#endif // HAVE_MUELU_ZOLTAN2 && HAVE_MPI
237 }
238
239 if (factoryName == "NodePartitionInterface") {
240#if defined(HAVE_MPI)
241 return Build2<NodePartitionInterface>(paramList, factoryMapIn, factoryManagersIn);
242#else
243 TEUCHOS_TEST_FOR_EXCEPTION(true, Exceptions::RuntimeError, "MueLu::FactoryFactory:BuildFactory(): Cannot create a NodePartitionInterface object: HAVE_MPI == false.");
244#endif // HAVE_MPI
245 }
246
247 if (factoryName == "RepartitionFactory") {
248#ifdef HAVE_MPI
249 return Build2<RepartitionFactory>(paramList, factoryMapIn, factoryManagersIn);
250#else
251 TEUCHOS_TEST_FOR_EXCEPTION(true, Exceptions::RuntimeError, "MueLu::FactoryFactory:BuildFactory(): Cannot create a RepartitionFactory object: HAVE_MPI == false.");
252#endif // HAVE_MPI
253 }
254 if (factoryName == "RepartitionHeuristicFactory") {
255#ifdef HAVE_MPI
256 return Build2<RepartitionHeuristicFactory>(paramList, factoryMapIn, factoryManagersIn);
257#else
258 TEUCHOS_TEST_FOR_EXCEPTION(true, Exceptions::RuntimeError, "MueLu::FactoryFactory:BuildFactory(): Cannot create a RepartitionHeuristicFactory object: HAVE_MPI == false.");
259#endif // HAVE_MPI
260 }
261 // Blocked factories
262 if (factoryName == "BlockedCoordinatesTransferFactory") return BuildBlockedCoordFactory<BlockedCoordinatesTransferFactory>(paramList, factoryMapIn, factoryManagersIn);
263 if (factoryName == "BlockedDirectSolver") return BuildBlockedDirectSolver(paramList, factoryMapIn, factoryManagersIn);
264 if (factoryName == "BlockedGaussSeidelSmoother") return BuildBlockedSmoother<BlockedGaussSeidelSmoother>(paramList, factoryMapIn, factoryManagersIn);
265 if (factoryName == "BlockedJacobiSmoother") return BuildBlockedSmoother<BlockedJacobiSmoother>(paramList, factoryMapIn, factoryManagersIn);
266 if (factoryName == "BlockedPFactory") return BuildBlockedFactory<BlockedPFactory>(paramList, factoryMapIn, factoryManagersIn);
267 if (factoryName == "BraessSarazinSmoother") return BuildBlockedSmoother<BraessSarazinSmoother>(paramList, factoryMapIn, factoryManagersIn);
268 if (factoryName == "IndefiniteBlockDiagonalSmoother") return BuildBlockedSmoother<IndefBlockedDiagonalSmoother>(paramList, factoryMapIn, factoryManagersIn);
269 if (factoryName == "SimpleSmoother") return BuildBlockedSmoother<SimpleSmoother>(paramList, factoryMapIn, factoryManagersIn);
270 if (factoryName == "SchurComplementFactory") return Build2<SchurComplementFactory>(paramList, factoryMapIn, factoryManagersIn);
271 if (factoryName == "RebalanceBlockRestrictionFactory") return BuildBlockedFactory<RebalanceBlockRestrictionFactory>(paramList, factoryMapIn, factoryManagersIn);
272 if (factoryName == "RebalanceBlockAcFactory") return BuildBlockedFactory<RebalanceBlockAcFactory>(paramList, factoryMapIn, factoryManagersIn);
273 if (factoryName == "RebalanceBlockInterpolationFactory") return BuildBlockedFactory<RebalanceBlockInterpolationFactory>(paramList, factoryMapIn, factoryManagersIn);
274#ifdef HAVE_MPI
275 if (factoryName == "RepartitionBlockDiagonalFactory") return Build2<RepartitionBlockDiagonalFactory>(paramList, factoryMapIn, factoryManagersIn);
276#endif
277#ifdef HAVE_MUELU_TEKO
278 if (factoryName == "TekoSmoother") return BuildTekoSmoother(paramList, factoryMapIn, factoryManagersIn);
279#endif
280 if (factoryName == "UzawaSmoother") return BuildBlockedSmoother<UzawaSmoother>(paramList, factoryMapIn, factoryManagersIn);
281
282 // Matlab factories
283#ifdef HAVE_MUELU_MATLAB
284 if (factoryName == "SingleLevelMatlabFactory") return Build2<SingleLevelMatlabFactory>(paramList, factoryMapIn, factoryManagersIn);
285 if (factoryName == "TwoLevelMatlabFactory") return Build2<TwoLevelMatlabFactory>(paramList, factoryMapIn, factoryManagersIn);
286 if (factoryName == "MatlabSmoother") return BuildMatlabSmoother(paramList, factoryMapIn, factoryManagersIn);
287#endif
288
289#if defined(HAVE_MUELU_INTREPID2) && defined(HAVE_MUELU_EXPERIMENTAL)
290 if (factoryName == "IntrepidPCoarsenFactory") return Build2<IntrepidPCoarsenFactory>(paramList, factoryMapIn, factoryManagersIn);
291#endif
292
293 // Use a user defined factories (in <Factories> node)
294 if (factoryMapIn.find(factoryName) != factoryMapIn.end()) {
295 TEUCHOS_TEST_FOR_EXCEPTION((param.isList() && (++paramList.begin() != paramList.end())), Exceptions::RuntimeError,
296 "MueLu::FactoryFactory: Error during the parsing of: " << std::endl
297 << paramList << std::endl
298 << "'" << factoryName << "' is not a factory name but an existing instance of a factory." << std::endl
299 << "Extra parameters cannot be specified after the creation of the object." << std::endl
300 << std::endl
301 << "Correct syntaxes includes:" << std::endl
302 << " <Parameter name=\"...\" type=\"string\" value=\"" << factoryName << "\"/>" << std::endl
303 << "or" << std::endl
304 << " <ParameterList name=\"...\"><Parameter name=\"factory\" type=\"string\" value=\"" << factoryName << "\"/></ParameterList>" << std::endl);
305
306 return factoryMapIn.find(factoryName)->second;
307 }
308
309 TEUCHOS_TEST_FOR_EXCEPTION(true, Exceptions::RuntimeError, "MueLu::FactoryFactory: unknown factory name : " << factoryName);
310
311 TEUCHOS_UNREACHABLE_RETURN(Teuchos::null);
312}
313
314template <class Scalar, class LocalOrdinal, class GlobalOrdinal, class Node>
315template <class T>
316RCP<T> FactoryFactory<Scalar, LocalOrdinal, GlobalOrdinal, Node>::Build(const Teuchos::ParameterList& paramList, const FactoryMap& factoryMapIn, const FactoryManagerMap& factoryManagersIn) const {
317 RCP<T> factory = rcp(new T());
318
319 const char* strarray[] = {"A", "P", "R", "Graph", "UnAmalgamationInfo", "Aggregates", "Nullspace", "TransferFactory", "DofsPerNode"};
320#define arraysize(ar) (sizeof(ar) / sizeof(ar[0]))
321 std::vector<std::string> v(strarray, strarray + arraysize(strarray));
322 for (size_t i = 0; i < v.size(); ++i)
323 if (paramList.isParameter(v[i]))
324 factory->SetFactory(v[i], BuildFactory(paramList.getEntry(v[i]), factoryMapIn, factoryManagersIn));
325
326 return factory;
327}
328
329template <class Scalar, class LocalOrdinal, class GlobalOrdinal, class Node>
330template <class T> // T must implement the Factory interface
331RCP<T> FactoryFactory<Scalar, LocalOrdinal, GlobalOrdinal, Node>::Build2(const Teuchos::ParameterList& paramList, const FactoryMap& factoryMapIn, const FactoryManagerMap& factoryManagersIn) const {
332 RCP<T> factory = rcp(new T());
333
334 ParameterList paramListWithFactories;
335
336 // Read the RCP<Factory> parameters of the class T
337 RCP<const ParameterList> validParamList = factory->GetValidParameterList(); // TODO check for Teuchos::null (no parameter list validation)
338 TEUCHOS_TEST_FOR_EXCEPTION(validParamList == Teuchos::null, Exceptions::RuntimeError, "FactoryFactory::Build2: default parameter list is null. Please fix this.");
339 for (ParameterList::ConstIterator param = validParamList->begin(); param != validParamList->end(); ++param) {
340 const std::string& pName = validParamList->name(param);
341
342 if (!paramList.isParameter(pName)) {
343 // Ignore unknown parameters
344 continue;
345 }
346
347 if (validParamList->isType<RCP<const FactoryBase> >(pName)) {
348 // Generate or get factory described by param
349 RCP<const FactoryBase> generatingFact = BuildFactory(paramList.getEntry(pName), factoryMapIn, factoryManagersIn);
350 paramListWithFactories.set(pName, generatingFact);
351 } else if (validParamList->isType<RCP<const ParameterList> >(pName)) {
352 if (pName == "ParameterList") {
353 // NOTE: we cannot use
354 // subList = sublist(rcpFromRef(paramList), pName)
355 // here as that would result in sublist also being a reference to a temporary object.
356 // The resulting dereferencing in the corresponding factory would then segfault
357 RCP<const ParameterList> subList = Teuchos::sublist(rcp(new ParameterList(paramList)), pName);
358 paramListWithFactories.set(pName, subList);
359 }
360 } else {
361 paramListWithFactories.setEntry(pName, paramList.getEntry(pName));
362 }
363 }
364
365 // Configure the factory
366 factory->SetParameterList(paramListWithFactories);
367
368 return factory;
369}
370
371template <class Scalar, class LocalOrdinal, class GlobalOrdinal, class Node>
372template <class T> // T must implement the Factory interface
373RCP<T> FactoryFactory<Scalar, LocalOrdinal, GlobalOrdinal, Node>::BuildRAPFactory(const Teuchos::ParameterList& paramList, const FactoryMap& factoryMapIn, const FactoryManagerMap& factoryManagersIn) const {
374 RCP<T> factory;
375 if (paramList.isSublist("TransferFactories") == false) {
376 factory = Build2<T>(paramList, factoryMapIn, factoryManagersIn);
377
378 } else {
379 RCP<Teuchos::ParameterList> paramListNonConst = rcp(new Teuchos::ParameterList(paramList));
380 RCP<const Teuchos::ParameterList> transferFactories = rcp(new Teuchos::ParameterList(*sublist(paramListNonConst, "TransferFactories")));
381
382 paramListNonConst->remove("TransferFactories");
383
384 factory = Build2<T>(*paramListNonConst, factoryMapIn, factoryManagersIn);
385
386 for (Teuchos::ParameterList::ConstIterator param = transferFactories->begin(); param != transferFactories->end(); ++param) {
387 RCP<const FactoryBase> p = BuildFactory(transferFactories->entry(param), factoryMapIn, factoryManagersIn);
388 factory->AddTransferFactory(p);
389 }
390 }
391
392 return factory;
393}
394
395template <class Scalar, class LocalOrdinal, class GlobalOrdinal, class Node>
396template <class T> // T must implement the Factory interface
397RCP<T> FactoryFactory<Scalar, LocalOrdinal, GlobalOrdinal, Node>::BuildTogglePFactory(const Teuchos::ParameterList& paramList, const FactoryMap& factoryMapIn, const FactoryManagerMap& factoryManagersIn) const {
398 RCP<T> factory;
399 if (paramList.isSublist("TransferFactories") == false) {
400 // TODO put in an error message: the TogglePFactory needs a TransferFactories sublist!
401 factory = Build2<T>(paramList, factoryMapIn, factoryManagersIn);
402
403 } else {
404 RCP<Teuchos::ParameterList> paramListNonConst = rcp(new Teuchos::ParameterList(paramList));
405 RCP<const Teuchos::ParameterList> transferFactories = rcp(new Teuchos::ParameterList(*sublist(paramListNonConst, "TransferFactories")));
406
407 paramListNonConst->remove("TransferFactories");
408
409 // build TogglePFactory
410 factory = Build2<T>(*paramListNonConst, factoryMapIn, factoryManagersIn);
411
412 // count how many prolongation factories and how many coarse null space factories have been declared.
413 // the numbers must match!
414 int numProlongatorFactories = 0;
415 int numPtentFactories = 0;
416 int numCoarseNspFactories = 0;
417 for (Teuchos::ParameterList::ConstIterator param = transferFactories->begin(); param != transferFactories->end(); ++param) {
418 size_t foundNsp = transferFactories->name(param).find("Nullspace");
419 if (foundNsp != std::string::npos && foundNsp == 0 && transferFactories->name(param).length() == 10) {
420 numCoarseNspFactories++;
421 continue;
422 }
423 size_t foundPtent = transferFactories->name(param).find("Ptent");
424 if (foundPtent != std::string::npos && foundPtent == 0 && transferFactories->name(param).length() == 6) {
425 numPtentFactories++;
426 continue;
427 }
428 size_t foundP = transferFactories->name(param).find("P");
429 if (foundP != std::string::npos && foundP == 0 && transferFactories->name(param).length() == 2) {
430 numProlongatorFactories++;
431 continue;
432 }
433 }
434 TEUCHOS_TEST_FOR_EXCEPTION(numProlongatorFactories != numCoarseNspFactories, Exceptions::RuntimeError, "FactoryFactory::BuildToggleP: The user has to provide the same number of prolongator and coarse nullspace factories!");
435 TEUCHOS_TEST_FOR_EXCEPTION(numPtentFactories != numCoarseNspFactories, Exceptions::RuntimeError, "FactoryFactory::BuildToggleP: The user has to provide the same number of ptent and coarse nullspace factories!");
436 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.");
437
438 // create empty vectors with data
439 std::vector<Teuchos::ParameterEntry> prolongatorFactoryNames(numProlongatorFactories);
440 std::vector<Teuchos::ParameterEntry> coarseNspFactoryNames(numProlongatorFactories);
441 std::vector<Teuchos::ParameterEntry> ptentFactoryNames(numProlongatorFactories);
442
443 for (Teuchos::ParameterList::ConstIterator param = transferFactories->begin(); param != transferFactories->end(); ++param) {
444 size_t foundNsp = transferFactories->name(param).find("Nullspace");
445 if (foundNsp != std::string::npos && foundNsp == 0 && transferFactories->name(param).length() == 10) {
446 int number = atoi(&(transferFactories->name(param).at(9)));
447 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!");
448 coarseNspFactoryNames[number - 1] = transferFactories->entry(param);
449 continue;
450 }
451 size_t foundPtent = transferFactories->name(param).find("Ptent");
452 if (foundPtent != std::string::npos && foundPtent == 0 && transferFactories->name(param).length() == 6) {
453 int number = atoi(&(transferFactories->name(param).at(5)));
454 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!");
455 ptentFactoryNames[number - 1] = transferFactories->entry(param);
456 continue;
457 }
458 size_t foundP = transferFactories->name(param).find("P");
459 if (foundP != std::string::npos && foundP == 0 && transferFactories->name(param).length() == 2) {
460 int number = atoi(&(transferFactories->name(param).at(1)));
461 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!");
462 prolongatorFactoryNames[number - 1] = transferFactories->entry(param);
463 continue;
464 }
465 }
466
467 // register all prolongation factories in TogglePFactory
468 for (std::vector<Teuchos::ParameterEntry>::const_iterator it = prolongatorFactoryNames.begin(); it != prolongatorFactoryNames.end(); ++it) {
469 RCP<const FactoryBase> p = BuildFactory(*it, factoryMapIn, factoryManagersIn);
470 factory->AddProlongatorFactory(p);
471 }
472
473 // register all tentative prolongation factories in TogglePFactory
474 for (std::vector<Teuchos::ParameterEntry>::const_iterator it = ptentFactoryNames.begin(); it != ptentFactoryNames.end(); ++it) {
475 RCP<const FactoryBase> p = BuildFactory(*it, factoryMapIn, factoryManagersIn);
476 factory->AddPtentFactory(p);
477 }
478
479 // register all coarse nullspace factories in TogglePFactory
480 for (std::vector<Teuchos::ParameterEntry>::const_iterator it = coarseNspFactoryNames.begin(); it != coarseNspFactoryNames.end(); ++it) {
481 RCP<const FactoryBase> p = BuildFactory(*it, factoryMapIn, factoryManagersIn);
482 factory->AddCoarseNullspaceFactory(p);
483 }
484 }
485 return factory;
486}
487
488template <class Scalar, class LocalOrdinal, class GlobalOrdinal, class Node>
489RCP<MueLu::ToggleCoordinatesTransferFactory<Scalar, LocalOrdinal, GlobalOrdinal, Node> > FactoryFactory<Scalar, LocalOrdinal, GlobalOrdinal, Node>::BuildToggleCoordinatesTransferFactory(const Teuchos::ParameterList& paramList, const FactoryMap& factoryMapIn, const FactoryManagerMap& factoryManagersIn) const {
490 RCP<ToggleCoordinatesTransferFactory> factory;
491 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!");
492
493 RCP<Teuchos::ParameterList> paramListNonConst = rcp(new Teuchos::ParameterList(paramList));
494 RCP<const Teuchos::ParameterList> transferFactories = rcp(new Teuchos::ParameterList(*sublist(paramListNonConst, "TransferFactories")));
495 paramListNonConst->remove("TransferFactories");
496
497 // build CoordinatesTransferFactory
498 factory = Build2<ToggleCoordinatesTransferFactory>(*paramListNonConst, factoryMapIn, factoryManagersIn);
499
500 // count how many coordinate transfer factories have been declared.
501 // the numbers must match!
502 int numCoordTransferFactories = 0;
503 for (Teuchos::ParameterList::ConstIterator param = transferFactories->begin(); param != transferFactories->end(); ++param) {
504 size_t foundCoordinates = transferFactories->name(param).find("Coordinates");
505 if (foundCoordinates != std::string::npos && foundCoordinates == 0 && transferFactories->name(param).length() == 12) {
506 numCoordTransferFactories++;
507 continue;
508 }
509 }
510 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.");
511
512 // create empty vectors with data
513 std::vector<Teuchos::ParameterEntry> coarseCoordsFactoryNames(numCoordTransferFactories);
514
515 for (Teuchos::ParameterList::ConstIterator param = transferFactories->begin(); param != transferFactories->end(); ++param) {
516 size_t foundCoords = transferFactories->name(param).find("Coordinates");
517 if (foundCoords != std::string::npos && foundCoords == 0 && transferFactories->name(param).length() == 12) {
518 int number = atoi(&(transferFactories->name(param).at(11)));
519 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!");
520 coarseCoordsFactoryNames[number - 1] = transferFactories->entry(param);
521 continue;
522 }
523 }
524
525 // register all coarse nullspace factories in TogglePFactory
526 for (std::vector<Teuchos::ParameterEntry>::const_iterator it = coarseCoordsFactoryNames.begin(); it != coarseCoordsFactoryNames.end(); ++it) {
527 RCP<const FactoryBase> p = BuildFactory(*it, factoryMapIn, factoryManagersIn);
528 factory->AddCoordTransferFactory(p);
529 }
530
531 return factory;
532}
533
534template <class Scalar, class LocalOrdinal, class GlobalOrdinal, class Node>
535RCP<FactoryBase> FactoryFactory<Scalar, LocalOrdinal, GlobalOrdinal, Node>::BuildTrilinosSmoother(const Teuchos::ParameterList& paramList, const FactoryMap& factoryMapIn, const FactoryManagerMap& factoryManagersIn) const {
536 if (paramList.begin() == paramList.end())
537 return rcp(new SmootherFactory(rcp(new TrilinosSmoother())));
538
539 TEUCHOS_TEST_FOR_EXCEPTION(paramList.get<std::string>("factory") != "TrilinosSmoother", Exceptions::RuntimeError, "");
540
541 // Is it true? TEUCHOS_TEST_FOR_EXCEPTION(!paramList.isParameter("type"), Exceptions::RuntimeError, "TrilinosSmoother: parameter 'type' is mandatory");
542 // type="" is default in TrilinosSmoother, but what happen then?
543
544 std::string type = "";
545 if (paramList.isParameter("type")) type = paramList.get<std::string>("type");
546 int overlap = 0;
547 if (paramList.isParameter("overlap")) overlap = paramList.get<int>("overlap");
548 // std::string verbose; if(paramList.isParameter("verbose")) verbose = paramList.get<std::string>("verbose");
549 Teuchos::ParameterList params;
550 if (paramList.isParameter("ParameterList")) params = paramList.get<Teuchos::ParameterList>("ParameterList");
551
552 // parameters from SmootherFactory
553 // bool bKeepSmootherData = false; if(paramList.isParameter("keep smoother data")) bKeepSmootherData = paramList.get<bool>("keep smoother data");
554
555 // Read in factory information for smoothers (if available...)
556 // NOTE: only a selected number of factories can be used with the Trilinos smoother
557 // smoothers usually work with the global data available (which is A and the transfers P and R)
558
559 Teuchos::RCP<TrilinosSmoother> trilSmoo = Teuchos::rcp(new TrilinosSmoother(type, params, overlap));
560
561 if (paramList.isParameter("LineDetection_Layers")) {
562 RCP<const FactoryBase> generatingFact = BuildFactory(paramList.getEntry("LineDetection_Layers"), factoryMapIn, factoryManagersIn);
563 trilSmoo->SetFactory("LineDetection_Layers", generatingFact);
564 }
565 if (paramList.isParameter("LineDetection_VertLineIds")) {
566 RCP<const FactoryBase> generatingFact = BuildFactory(paramList.getEntry("LineDetection_Layers"), factoryMapIn, factoryManagersIn);
567 trilSmoo->SetFactory("LineDetection_Layers", generatingFact);
568 }
569 if (paramList.isParameter("CoarseNumZLayers")) {
570 RCP<const FactoryBase> generatingFact = BuildFactory(paramList.getEntry("CoarseNumZLayers"), factoryMapIn, factoryManagersIn);
571 trilSmoo->SetFactory("CoarseNumZLayers", generatingFact);
572 }
573
574 RCP<SmootherFactory> smooFact = rcp(new SmootherFactory(Teuchos::null));
575 Teuchos::ParameterList smooFactParams;
576 // smooFactParams.setEntry("keep smoother data", paramList.getEntry("keep smoother data"));
577 smooFact->SetParameterList(smooFactParams);
578 smooFact->SetSmootherPrototypes(trilSmoo);
579 return smooFact;
580}
581
582#ifdef HAVE_MUELU_MATLAB
583template <class Scalar, class LocalOrdinal, class GlobalOrdinal, class Node>
584RCP<FactoryBase>
585FactoryFactory<Scalar, LocalOrdinal, GlobalOrdinal, Node>::BuildMatlabSmoother(const Teuchos::ParameterList& paramList, const FactoryMap& factoryMapIn, const FactoryManagerMap& factoryManagersIn) const {
586 if (paramList.begin() == paramList.end())
587 return rcp(new SmootherFactory(rcp(new MatlabSmoother())));
588
589 TEUCHOS_TEST_FOR_EXCEPTION(paramList.get<std::string>("factory") != "MatlabSmoother", Exceptions::RuntimeError, "");
590
591 // Read in factory information for smoothers (if available...)
592 // NOTE: only a selected number of factories can be used with the Trilinos smoother
593 // smoothers usually work with the global data available (which is A and the transfers P and R)
594
595 Teuchos::RCP<MatlabSmoother> matSmoo = Teuchos::rcp(new MatlabSmoother(paramList));
596
597 return rcp(new SmootherFactory(matSmoo));
598}
599#endif
600
601template <class Scalar, class LocalOrdinal, class GlobalOrdinal, class Node>
602RCP<FactoryBase> FactoryFactory<Scalar, LocalOrdinal, GlobalOrdinal, Node>::BuildDirectSolver(const Teuchos::ParameterList& paramList, const FactoryMap& /* factoryMapIn */, const FactoryManagerMap& /* factoryManagersIn */) const {
603 if (paramList.begin() == paramList.end())
604 return rcp(new SmootherFactory(rcp(new DirectSolver()), Teuchos::null));
605
606 TEUCHOS_TEST_FOR_EXCEPTION(paramList.get<std::string>("factory") != "DirectSolver", Exceptions::RuntimeError, "");
607
608 std::string type;
609 if (paramList.isParameter("type")) type = paramList.get<std::string>("type");
610 // std::string verbose; if(paramList.isParameter("verbose")) verbose = paramList.get<std::string>("verbose");
611 Teuchos::ParameterList params;
612 if (paramList.isParameter("ParameterList")) params = paramList.get<Teuchos::ParameterList>("ParameterList");
613
614 return rcp(new SmootherFactory(rcp(new DirectSolver(type, params)), Teuchos::null));
615}
616
617template <class Scalar, class LocalOrdinal, class GlobalOrdinal, class Node>
618template <class T> // T must implement the Factory interface
619RCP<FactoryBase> FactoryFactory<Scalar, LocalOrdinal, GlobalOrdinal, Node>::BuildBlockedSmoother(const Teuchos::ParameterList& paramList, const FactoryMap& factoryMapIn, const FactoryManagerMap& factoryManagersIn) const {
620 // read in sub lists
621 RCP<ParameterList> paramListNonConst = rcp(new ParameterList(paramList));
622
623 // internal vector of factory managers
624 std::vector<RCP<FactoryManager> > facManagers;
625
626 // loop over all "block%i" sublists in parameter list
627 int blockid = 1;
628 bool blockExists = true;
629 while (blockExists == true) {
630 std::stringstream ss;
631 ss << "block" << blockid;
632
633 if (paramList.isSublist(ss.str()) == true) {
634 // we either have a parameter group or we have a list of factories in here
635 RCP<const ParameterList> b = rcp(new ParameterList(*sublist(paramListNonConst, ss.str())));
636
637 RCP<FactoryManager> M = Teuchos::null;
638
639 if (b->isParameter("group")) {
640 // use a factory manager
641 std::string facManagerName = b->get<std::string>("group");
642 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.");
643 RCP<FactoryManagerBase> Mb = factoryManagersIn.find(facManagerName)->second;
644 M = Teuchos::rcp_dynamic_cast<FactoryManager>(Mb);
645 TEUCHOS_TEST_FOR_EXCEPTION(M == Teuchos::null, Exceptions::RuntimeError, "Failed to cast FactoryManagerBase object to FactoryManager.");
646 } else {
647 // read in the list of factories
648 M = rcp(new FactoryManager());
649 for (ParameterList::ConstIterator param = b->begin(); param != b->end(); ++param) {
650 RCP<const FactoryBase> p = BuildFactory(b->entry(param), factoryMapIn, factoryManagersIn);
651 M->SetFactory(b->name(param), p);
652 }
653 }
654
655 // add factory manager to internal vector of factory managers
656 M->SetIgnoreUserData(true);
657 facManagers.push_back(M);
658 paramListNonConst->remove(ss.str());
659 blockid++;
660 } else {
661 blockExists = false;
662 break;
663 }
664 }
665
666 // create a new blocked smoother
667 RCP<T> bs = Build2<T>(*paramListNonConst, factoryMapIn, factoryManagersIn);
668
669 // important: set block factory for A here!
670 // TAW: 7/6/2016: We should not need to set/hardcode the blocked operator here.
671 // The user might want to overwrite this in the xml file, so just
672 // use what is declared as "A"
673 // bs->SetFactory("A", MueLu::NoFactory::getRCP());
674
675 for (int i = 0; i < Teuchos::as<int>(facManagers.size()); i++) {
676 bs->AddFactoryManager(facManagers[i], i);
677 }
678
679 return rcp(new SmootherFactory(bs));
680}
681
682#ifdef HAVE_MUELU_TEKO
683template <class Scalar, class LocalOrdinal, class GlobalOrdinal, class Node>
684RCP<FactoryBase> FactoryFactory<Scalar, LocalOrdinal, GlobalOrdinal, Node>::BuildTekoSmoother(const Teuchos::ParameterList& paramList, const FactoryMap& factoryMapIn, const FactoryManagerMap& factoryManagersIn) const {
685 // read in sub lists
686 RCP<ParameterList> paramListNonConst = rcp(new ParameterList(paramList));
687 RCP<ParameterList> tekoParams = rcp(new ParameterList(paramListNonConst->sublist("Inverse Factory Library")));
688 paramListNonConst->remove("Inverse Factory Library");
689
690 // create a new blocked smoother
691 RCP<TekoSmoother> bs = Build2<TekoSmoother>(*paramListNonConst, factoryMapIn, factoryManagersIn);
692
693 // important: set block factory for A here!
694 // TAW: 7/6/2016: We should not need to set/hardcode the blocked operator here.
695 // The user might want to overwrite this in the xml file, so just
696 // use what is declared as "A"
697 // bs->SetFactory("A", MueLu::NoFactory::getRCP());
698
699 // Set Teko parameters ("Inverse Factory Library")
700 bs->SetTekoParameters(tekoParams);
701
702 return rcp(new SmootherFactory(bs));
703}
704#endif
705
706template <class Scalar, class LocalOrdinal, class GlobalOrdinal, class Node>
707RCP<FactoryBase> FactoryFactory<Scalar, LocalOrdinal, GlobalOrdinal, Node>::BuildBlockedDirectSolver(const Teuchos::ParameterList& paramList, const FactoryMap& /* factoryMapIn */, const FactoryManagerMap& /* factoryManagersIn */) const {
708 if (paramList.numParams() == 0)
709 return rcp(new SmootherFactory(rcp(new BlockedDirectSolver())));
710
711 TEUCHOS_TEST_FOR_EXCEPTION(paramList.get<std::string>("factory") != "BlockedDirectSolver", Exceptions::RuntimeError, "FactoryFactory::BuildBlockedDirectSolver: Generating factory needs to be a BlockedDirectSolver.");
712
713 std::string type;
714 if (paramList.isParameter("type")) type = paramList.get<std::string>("type");
715 // std::string verbose; if(paramList.isParameter("verbose")) verbose = paramList.get<std::string>("verbose");
716 Teuchos::ParameterList params;
717 if (paramList.isParameter("ParameterList")) params = paramList.get<Teuchos::ParameterList>("ParameterList");
718
719 return rcp(new SmootherFactory(rcp(new BlockedDirectSolver(type, params))));
720}
721
722template <class Scalar, class LocalOrdinal, class GlobalOrdinal, class Node>
723template <class T> // T must implement the Factory interface
724RCP<T> FactoryFactory<Scalar, LocalOrdinal, GlobalOrdinal, Node>::BuildBlockedFactory(const Teuchos::ParameterList& paramList, const FactoryMap& factoryMapIn, const FactoryManagerMap& factoryManagersIn) const {
725 RCP<T> pfac = Teuchos::null;
726
727 // read in sub lists
728 RCP<ParameterList> paramListNonConst = rcp(new ParameterList(paramList));
729
730 // internal vector of factory managers
731 std::vector<RCP<FactoryManager> > facManagers;
732
733 // loop over all "block%i" sublists in parameter list
734 int blockid = 1;
735 bool blockExists = true;
736 while (blockExists == true) {
737 std::stringstream ss;
738 ss << "block" << blockid;
739
740 if (paramList.isSublist(ss.str()) == true) {
741 // we either have a parameter group or we have a list of factories in here
742 RCP<const ParameterList> b = rcp(new ParameterList(*sublist(paramListNonConst, ss.str())));
743
744 RCP<FactoryManager> M = Teuchos::null;
745
746 if (b->isParameter("group")) {
747 // use a factory manager
748 std::string facManagerName = b->get<std::string>("group");
749 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.");
750 RCP<FactoryManagerBase> Mb = factoryManagersIn.find(facManagerName)->second;
751 M = Teuchos::rcp_dynamic_cast<FactoryManager>(Mb);
752 TEUCHOS_TEST_FOR_EXCEPTION(M == Teuchos::null, Exceptions::RuntimeError, "Failed to cast FactoryManagerBase object to FactoryManager.");
753 } else {
754 // read in the list of factories
755 M = rcp(new FactoryManager());
756 for (ParameterList::ConstIterator param = b->begin(); param != b->end(); ++param) {
757 RCP<const FactoryBase> p = BuildFactory(b->entry(param), factoryMapIn, factoryManagersIn);
758 M->SetFactory(b->name(param), p);
759 }
760 }
761
762 // add factory manager to internal vector of factory managers
763 M->SetIgnoreUserData(true);
764 facManagers.push_back(M);
765 paramListNonConst->remove(ss.str());
766 blockid++;
767 } else {
768 blockExists = false;
769 break;
770 }
771 }
772
773 // build BlockedPFactory (without sub block information)
774 pfac = Build2<T>(*paramListNonConst, factoryMapIn, factoryManagersIn);
775
776 // add FactoryManager objects
777 for (size_t i = 0; i < facManagers.size(); i++) {
778 pfac->AddFactoryManager(facManagers[i]); // add factory manager
779 }
780
781 return pfac;
782}
783
784template <class Scalar, class LocalOrdinal, class GlobalOrdinal, class Node>
785template <class T> // T must implement the Factory interface
786RCP<T> FactoryFactory<Scalar, LocalOrdinal, GlobalOrdinal, Node>::BuildBlockedCoordFactory(const Teuchos::ParameterList& paramList, const FactoryMap& factoryMapIn, const FactoryManagerMap& factoryManagersIn) const {
787 RCP<T> pfac = Teuchos::null;
788
789 // read in sub lists
790 RCP<ParameterList> paramListNonConst = rcp(new ParameterList(paramList));
791
792 // internal vector of factory managers
793 std::vector<RCP<const FactoryBase> > facBase;
794
795 // loop over all "block%i" sublists in parameter list
796 int blockid = 1;
797 bool blockExists = true;
798 while (blockExists == true) {
799 std::stringstream ss;
800 ss << "block" << blockid;
801
802 if (paramList.isSublist(ss.str()) == true) {
803 // we either have a parameter group or we have a list of factories in here
804 RCP<const ParameterList> b = rcp(new ParameterList(*sublist(paramListNonConst, ss.str())));
805
806 // read in the list of factories
807 for (ParameterList::ConstIterator param = b->begin(); param != b->end(); ++param) {
808 RCP<const FactoryBase> p = BuildFactory(b->entry(param), factoryMapIn, factoryManagersIn);
809 facBase.push_back(p);
810 }
811
812 // add factory manager to internal vector of factory managers
813 paramListNonConst->remove(ss.str());
814 blockid++;
815 } else {
816 blockExists = false;
817 break;
818 }
819 }
820
821 // build BlockedPFactory (without sub block information)
822 pfac = Build2<T>(*paramListNonConst, factoryMapIn, factoryManagersIn);
823
824 // add FactoryManager objects
825 for (size_t i = 0; i < facBase.size(); i++) {
826 pfac->AddFactory(facBase[i]); // add factory manager
827 }
828
829 return pfac;
830}
831} // namespace MueLu
832
833#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.