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