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)
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.