MueLu Version of the Day
Loading...
Searching...
No Matches
MueLu_FacadeSimple_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
10#ifndef PACKAGES_MUELU_SRC_INTERFACE_FACADECLASSES_Simple_DEF_HPP_
11#define PACKAGES_MUELU_SRC_INTERFACE_FACADECLASSES_Simple_DEF_HPP_
12
13#include <Teuchos_XMLParameterListHelpers.hpp>
14#include <Teuchos_XMLParameterListCoreHelpers.hpp>
15
16#include "MueLu_Exceptions.hpp"
17
19
20namespace MueLu {
21
22template <class Scalar, class LocalOrdinal, class GlobalOrdinal, class Node>
25
26template <class Scalar, class LocalOrdinal, class GlobalOrdinal, class Node>
27Teuchos::RCP<Teuchos::ParameterList> FacadeSimple<Scalar, LocalOrdinal, GlobalOrdinal, Node>::SetParameterList(const ParameterList& paramList) {
28 // obtain ParameterList with default input parameters for this facade class
29 // Note all parameters are of type string (we use it for string replacement)
30 std::string defaultString =
31 "<ParameterList name=\"Input\">"
32 "<Parameter name=\"MueLu preconditioner\" type=\"string\" value=\"undefined\"/>"
33 "<Parameter name=\"Block 1: dofs per node\" type=\"int\" value=\"1\"/>"
34 "<Parameter name=\"Block 2: dofs per node\" type=\"int\" value=\"1\"/>"
35 "<Parameter name=\"Block 1: smoother\" type=\"string\" value=\"Symmetric Gauss-Seidel\"/>"
36 "<Parameter name=\"Block 1: level-of-fill\" type=\"int\" value=\"0\"/>"
37 "<Parameter name=\"Block 1: relaxation: sweeps\" type=\"int\" value=\"1\"/>"
38 "<Parameter name=\"Block 1: relaxation: damping factor\" type=\"double\" value=\"1.0\"/>"
39 "<Parameter name=\"Block 1: transfer smoothing\" type=\"bool\" value=\"true\"/>"
40 "<Parameter name=\"Block 2: smoother\" type=\"string\" value=\"Symmetric Gauss-Seidel\"/>"
41 "<Parameter name=\"Block 2: level-of-fill\" type=\"int\" value=\"0\"/>"
42 "<Parameter name=\"Block 2: relaxation: sweeps\" type=\"int\" value=\"1\"/>"
43 "<Parameter name=\"Block 2: relaxation: damping factor\" type=\"double\" value=\"1.0\"/>"
44 "<Parameter name=\"Block 2: transfer smoothing\" type=\"bool\" value=\"true\"/>"
45 "<Parameter name=\"Simple: damping factor\" type=\"double\" value=\"1.0\"/>"
46 "<Parameter name=\"max levels\" type=\"int\" value=\"5\"/>"
47 "<Parameter name=\"coarse: max size\" type=\"int\" value=\"25000\"/>"
48 "<Parameter name=\"verbosity\" type=\"string\" value=\"High\"/>"
49 "</ParameterList>";
50 Teuchos::RCP<ParameterList> defaultList = Teuchos::getParametersFromXmlString(defaultString);
51 // validate user input parameters (and set defaults if necessary)
52 Teuchos::ParameterList inputParameters = paramList;
53 inputParameters.validateParametersAndSetDefaults(*defaultList);
54 TEUCHOS_TEST_FOR_EXCEPTION(inputParameters.get<std::string>("MueLu preconditioner") == "undefined", MueLu::Exceptions::RuntimeError, "FacadeSimple: undefined MueLu preconditioner. Set the \"MueLu preconditioner\" parameter correctly in your input file.");
55
56 // create copy of template string which is updated with in-place string replacements
57 // template string for preconditioner layout (factory based parameters)
58 std::string finalString =
59
60 "<ParameterList name=\"MueLu\">"
61 " <ParameterList name=\"Factories\">"
62 " <ParameterList name=\"mySubBlockAFactory1\">"
63 " <Parameter name=\"factory\" type=\"string\" value=\"SubBlockAFactory\"/>"
64 " <Parameter name=\"block row\" type=\"int\" value=\"0\"/>"
65 " <Parameter name=\"block col\" type=\"int\" value=\"0\"/>"
66 " <Parameter name=\"Range map: Striding info\" type=\"string\" value=\"{ XXXBlock 1: dofs per nodeYYY }\"/>"
67 " <Parameter name=\"Domain map: Striding info\" type=\"string\" value=\"{ XXXBlock 1: dofs per nodeYYY }\"/>"
68 " </ParameterList>"
69 ""
70 " <ParameterList name=\"myAggFact1\">"
71 " <Parameter name=\"factory\" type=\"string\" value=\"UncoupledAggregationFactory\"/>"
72 " <Parameter name=\"aggregation: min agg size\" type=\"int\" value=\"5\"/>"
73 " <Parameter name=\"aggregation: max selected neighbors\" type=\"int\" value=\"1\"/>"
74 " </ParameterList>"
75 ""
76 " <!-- tell the tentative prolongator that we have 2 DOFs per node on the coarse levels -->"
77 " <ParameterList name=\"myCoarseMap1\">"
78 " <Parameter name=\"factory\" type=\"string\" value=\"CoarseMapFactory\"/>"
79 " <Parameter name=\"Striding info\" type=\"string\" value=\"{ XXXBlock 1: dofs per nodeYYY }\"/>"
80 " <Parameter name=\"Strided block id\" type=\"int\" value=\"-1\"/>"
81 " </ParameterList>"
82 ""
83 " <ParameterList name=\"myTentativePFact1\">"
84 " <Parameter name=\"factory\" type=\"string\" value=\"TentativePFactory\"/>"
85 " <Parameter name=\"A\" type=\"string\" value=\"mySubBlockAFactory1\"/>"
86 " <Parameter name=\"Aggregates\" type=\"string\" value=\"myAggFact1\"/>"
87 " <Parameter name=\"CoarseMap\" type=\"string\" value=\"myCoarseMap1\"/>"
88 " </ParameterList>"
89 ""
90 " <ParameterList name=\"myPFact1\">"
91 " <Parameter name=\"factory\" type=\"string\" value=\"PgPFactory\"/>"
92 " <Parameter name=\"A\" type=\"string\" value=\"mySubBlockAFactory1\"/>"
93 " <Parameter name=\"P\" type=\"string\" value=\"myTentativePFact1\"/>"
94 " </ParameterList>"
95 ""
96 " <ParameterList name=\"myRFact1\">"
97 " <Parameter name=\"factory\" type=\"string\" value=\"GenericRFactory\"/>"
98 " <Parameter name=\"P\" type=\"string\" value=\"myPFact1\"/>"
99 " </ParameterList>"
100 ""
101 " <!-- We have to use Nullspace1 here. If \"Nullspace1\" is not set the"
102 " Factory creates the default null space containing of constant"
103 " vectors -->"
104 " <ParameterList name=\"myNspFact1\">"
105 " <Parameter name=\"factory\" type=\"string\" value=\"NullspaceFactory\"/>"
106 " <Parameter name=\"Fine level nullspace\" type=\"string\" value=\"Nullspace1\"/>"
107 " <Parameter name=\"Nullspace1\" type=\"string\" value=\"myTentativePFact1\"/>"
108 " </ParameterList>"
109 ""
110 " <!-- BLOCK 2 (for submatrix A_{11}) PRESSURE PART -->"
111 " <ParameterList name=\"mySubBlockAFactory2\">"
112 " <Parameter name=\"factory\" type=\"string\" value=\"SubBlockAFactory\"/>"
113 " <Parameter name=\"block row\" type=\"int\" value=\"1\"/>"
114 " <Parameter name=\"block col\" type=\"int\" value=\"1\"/>"
115 " <Parameter name=\"Range map: Striding info\" type=\"string\" value=\"{ XXXBlock 2: dofs per nodeYYY }\"/>"
116 " <Parameter name=\"Domain map: Striding info\" type=\"string\" value=\"{ XXXBlock 2: dofs per nodeYYY }\"/>"
117 " </ParameterList>"
118 ""
119 " <!-- tell the tentative prolongator that we have 2 DOFs per node on the coarse levels -->"
120 " <ParameterList name=\"myCoarseMap2\">"
121 " <Parameter name=\"factory\" type=\"string\" value=\"CoarseMapFactory\"/>"
122 " <Parameter name=\"Striding info\" type=\"string\" value=\"{ XXXBlock 2: dofs per nodeYYY }\"/>"
123 " <Parameter name=\"Strided block id\" type=\"int\" value=\"-1\"/>"
124 " </ParameterList>"
125 ""
126 " <ParameterList name=\"myTentativePFact2\">"
127 " <Parameter name=\"factory\" type=\"string\" value=\"TentativePFactory\"/>"
128 " <Parameter name=\"A\" type=\"string\" value=\"mySubBlockAFactory2\"/>"
129 " <Parameter name=\"Aggregates\" type=\"string\" value=\"myAggFact1\"/>"
130 " <Parameter name=\"CoarseMap\" type=\"string\" value=\"myCoarseMap2\"/>"
131 " </ParameterList>"
132 ""
133 " <ParameterList name=\"myPFact2\">"
134 " <Parameter name=\"factory\" type=\"string\" value=\"SaPFactory\"/>"
135 " <Parameter name=\"A\" type=\"string\" value=\"mySubBlockAFactory2\"/>"
136 " <Parameter name=\"P\" type=\"string\" value=\"myTentativePFact2\"/>"
137 " </ParameterList>"
138 ""
139 " <ParameterList name=\"myRFact2\">"
140 " <Parameter name=\"factory\" type=\"string\" value=\"TransPFactory\"/>"
141 " <Parameter name=\"P\" type=\"string\" value=\"myPFact2\"/>"
142 " </ParameterList>"
143 ""
144 " <ParameterList name=\"myNspFact2\">"
145 " <Parameter name=\"factory\" type=\"string\" value=\"NullspaceFactory\"/>"
146 " <Parameter name=\"Fine level nullspace\" type=\"string\" value=\"Nullspace2\"/>"
147 " <Parameter name=\"Nullspace2\" type=\"string\" value=\"myTentativePFact2\"/>"
148 " </ParameterList>"
149 ""
150 " <!-- FACTORY MANAGERS -->"
151 ""
152 " <!-- Multigrid setup for velocity block (A_{00}) -->"
153 " <ParameterList name=\"myFirstGroup\">"
154 " <Parameter name=\"group\" type=\"string\" value=\"FactoryManager\"/>"
155 " <Parameter name=\"A\" type=\"string\" value=\"mySubBlockAFactory1\"/>"
156 " <Parameter name=\"P\" type=\"string\" value=\"myPFact1\"/>"
157 " <Parameter name=\"R\" type=\"string\" value=\"myRFact1\"/>"
158 " <Parameter name=\"Aggregates\" type=\"string\" value=\"myAggFact1\"/>"
159 " <Parameter name=\"Nullspace\" type=\"string\" value=\"myNspFact1\"/>"
160 " <Parameter name=\"CoarseMap\" type=\"string\" value=\"myCoarseMap1\"/>"
161 " </ParameterList>"
162 ""
163 " <!-- Multigrid setup for pressure block (A_{11}) -->"
164 " <ParameterList name=\"mySecondGroup\">"
165 " <Parameter name=\"group\" type=\"string\" value=\"FactoryManager\"/>"
166 " <Parameter name=\"A\" type=\"string\" value=\"mySubBlockAFactory2\"/>"
167 " <Parameter name=\"P\" type=\"string\" value=\"myPFact2\"/>"
168 " <Parameter name=\"R\" type=\"string\" value=\"myRFact2\"/>"
169 " <Parameter name=\"Aggregates\" type=\"string\" value=\"myAggFact1\"/><!-- reuse aggs from PRESSURE block! -->"
170 " <Parameter name=\"Nullspace\" type=\"string\" value=\"myNspFact2\"/>"
171 " <Parameter name=\"CoarseMap\" type=\"string\" value=\"myCoarseMap2\"/>"
172 " </ParameterList>"
173 ""
174 " <!-- BLOCK TRANSFER operators -->"
175 ""
176 " <ParameterList name=\"myBlockedPFact\">"
177 " <Parameter name=\"factory\" type=\"string\" value=\"BlockedPFactory\"/>"
178 " <!-- factory manager for block 1 -->"
179 " <ParameterList name=\"block1\">"
180 " <Parameter name=\"group\" type=\"string\" value=\"myFirstGroup\"/>"
181 " </ParameterList>"
182 " <!-- factory manager for block 2 -->"
183 " <ParameterList name=\"block2\">"
184 " <Parameter name=\"group\" type=\"string\" value=\"mySecondGroup\"/>"
185 " </ParameterList>"
186 " </ParameterList>"
187 ""
188 " <ParameterList name=\"myBlockedRFact\">"
189 " <Parameter name=\"factory\" type=\"string\" value=\"GenericRFactory\"/>"
190 " <Parameter name=\"P\" type=\"string\" value=\"myBlockedPFact\"/>"
191 " </ParameterList>"
192 ""
193 " <ParameterList name=\"myBlockedRAPFact\">"
194 " <Parameter name=\"factory\" type=\"string\" value=\"BlockedRAPFactory\"/>"
195 " <Parameter name=\"P\" type=\"string\" value=\"myBlockedPFact\"/>"
196 " <Parameter name=\"R\" type=\"string\" value=\"myBlockedRFact\"/>"
197 " </ParameterList>"
198 ""
199 " <!-- BLOCK SMOOTHERS -->"
200 " <ParameterList name=\"mySmooFact1\">"
201 " <Parameter name=\"factory\" type=\"string\" value=\"TrilinosSmoother\"/>"
202 " <Parameter name=\"type\" type=\"string\" value=\"RELAXATION\"/>"
203 " <ParameterList name=\"ParameterList\">"
204 " <Parameter name=\"relaxation: type\" type=\"string\" value=\"XXXBlock 1: relaxation: typeYYY\"/>"
205 " <Parameter name=\"relaxation: sweeps\" type=\"int\" value=\"XXXBlock 1: relaxation: sweepsYYY\"/>"
206 " <Parameter name=\"relaxation: damping factor\" type=\"double\" value=\"XXXBlock 1: relaxation: damping factorYYY\"/>"
207 " </ParameterList>"
208 " </ParameterList>"
209 ""
210 " <ParameterList name=\"mySmooILUFact1\">"
211 " <Parameter name=\"factory\" type=\"string\" value=\"TrilinosSmoother\"/>"
212 " <Parameter name=\"type\" type=\"string\" value=\"ILU\"/>"
213 " <ParameterList name=\"ParameterList\">"
214 " <Parameter name=\"fact: level-of-fill\" type=\"int\" value=\"XXXBlock 1: level-of-fillYYY\"/>"
215 " </ParameterList>"
216 " </ParameterList>"
217 ""
218 " <ParameterList name=\"mySmooDirectFact1\">"
219 " <Parameter name=\"factory\" type=\"string\" value=\"DirectSolver\"/>"
220 " </ParameterList>"
221 ""
222 " <ParameterList name=\"mySmooFact2\">"
223 " <Parameter name=\"factory\" type=\"string\" value=\"TrilinosSmoother\"/>"
224 " <Parameter name=\"type\" type=\"string\" value=\"RELAXATION\"/>"
225 " <ParameterList name=\"ParameterList\">"
226 " <Parameter name=\"relaxation: type\" type=\"string\" value=\"XXXBlock 2: relaxation: typeYYY\"/>"
227 " <Parameter name=\"relaxation: sweeps\" type=\"int\" value=\"XXXBlock 2: relaxation: sweepsYYY\"/>"
228 " <Parameter name=\"relaxation: damping factor\" type=\"double\" value=\"XXXBlock 2: relaxation: damping factorYYY\"/>"
229 " </ParameterList>"
230 " </ParameterList>"
231 ""
232 " <ParameterList name=\"mySmooILUFact2\">"
233 " <Parameter name=\"factory\" type=\"string\" value=\"TrilinosSmoother\"/>"
234 " <Parameter name=\"type\" type=\"string\" value=\"ILU\"/>"
235 " <ParameterList name=\"ParameterList\">"
236 " <Parameter name=\"fact: level-of-fill\" type=\"int\" value=\"XXXBlock 2: level-of-fillYYY\"/>"
237 " </ParameterList>"
238 " </ParameterList>"
239 ""
240 " <ParameterList name=\"mySmooDirectFact2\">"
241 " <Parameter name=\"factory\" type=\"string\" value=\"DirectSolver\"/>"
242 " </ParameterList>"
243 ""
244 " <ParameterList name=\"myNSSchurCompFact\">"
245 " <Parameter name=\"factory\" type=\"string\" value=\"SchurComplementFactory\"/>"
246 " <Parameter name=\"omega\" type=\"double\" value=\"1.0\"/>"
247 " <Parameter name=\"lumping\" type=\"bool\" value=\"false\"/>"
248 " </ParameterList>"
249 ""
250 " <ParameterList name=\"myBlockSmoother\">"
251 " <Parameter name=\"factory\" type=\"string\" value=\"SimpleSmoother\"/>"
252 " <Parameter name=\"Sweeps\" type=\"int\" value=\"1\"/>"
253 " <Parameter name=\"Damping factor\" type=\"double\" value=\"XXXSimple: damping factorYYY\"/>"
254 " <!-- factory manager for block 1 -->"
255 " <ParameterList name=\"block1\">"
256 " <Parameter name=\"A\" type=\"string\" value=\"mySubBlockAFactory1\"/>"
257 " <Parameter name=\"Smoother\" type=\"string\" value=\"XYZSmoother1XYZ\"/>"
258 " </ParameterList>"
259 " <!-- factory manager for block 2 -->"
260 " <ParameterList name=\"block2\">"
261 " <Parameter name=\"A\" type=\"string\" value=\"myNSSchurCompFact\"/>"
262 " <Parameter name=\"Smoother\" type=\"string\" value=\"XYZSmoother2XYZ\"/>"
263 " </ParameterList>"
264 " </ParameterList>"
265 ""
266 " </ParameterList>"
267 " <!-- end Factories -->"
268 ""
269 " <!-- Definition of the multigrid preconditioner -->"
270 " <ParameterList name=\"Hierarchy\">"
271 ""
272 " <Parameter name=\"max levels\" type=\"int\" value=\"XXXmax levelsYYY\"/>"
273 " <Parameter name=\"coarse: max size\" type=\"int\" value=\"XXXcoarse: max sizeYYY\"/>"
274 " <Parameter name=\"verbosity\" type=\"string\" value=\"XXXverbosityYYY\"/>"
275 ""
276 " <ParameterList name=\"AllLevel\">"
277 " <Parameter name=\"startLevel\" type=\"int\" value=\"0\"/>"
278 " <Parameter name=\"Smoother\" type=\"string\" value=\"myBlockSmoother\"/>"
279 " <Parameter name=\"CoarseSolver\" type=\"string\" value=\"myBlockSmoother\"/>"
280 " <Parameter name=\"P\" type=\"string\" value=\"myBlockedPFact\"/>"
281 " <Parameter name=\"R\" type=\"string\" value=\"myBlockedRFact\"/>"
282 " <Parameter name=\"A\" type=\"string\" value=\"myBlockedRAPFact\"/>"
283 " </ParameterList>"
284 ""
285 " </ParameterList>"
286 "</ParameterList>";
287
288 // logical code for more complicated distinctions
289
290 std::string smoother1 = inputParameters.get<std::string>("Block 1: smoother");
291 if (smoother1 == "ILU") {
292 this->ReplaceString(finalString, "XYZSmoother1XYZ", "mySmooILUFact1");
293 } else if (smoother1 == "Symmetric Gauss-Seidel" || smoother1 == "SGS") {
294 this->ReplaceString(finalString, "XXXBlock 1: relaxation: typeYYY", "Symmetric Gauss-Seidel");
295 this->ReplaceString(finalString, "XYZSmoother1XYZ", "mySmooFact1");
296 } else if (smoother1 == "Symmetric Gauss-Seidel" || smoother1 == "GS") {
297 this->ReplaceString(finalString, "XXXBlock 1: relaxation: typeYYY", "Gauss-Seidel");
298 this->ReplaceString(finalString, "XYZSmoother1XYZ", "mySmooFact1");
299 } else if (smoother1 == "Jacobi") {
300 this->ReplaceString(finalString, "XXXBlock 1: relaxation: typeYYY", "Jacobi");
301 this->ReplaceString(finalString, "XYZSmoother1XYZ", "mySmooFact1");
302 } else if (smoother1 == "Direct") {
303 this->ReplaceString(finalString, "XYZSmoother1XYZ", "mySmooDirectFact1");
304 } else {
305 this->GetOStream(Errors) << "Invalid smoother type for block 1: " << smoother1 << ". Valid options are: \"SGS\", \"GS\", \"Jacobi\", \"ILU\" or \"Direct\"." << std::endl;
306 }
307
308 std::string smoother2 = inputParameters.get<std::string>("Block 2: smoother");
309 if (smoother2 == "ILU") {
310 this->ReplaceString(finalString, "XYZSmoother2XYZ", "mySmooILUFact2");
311 } else if (smoother2 == "Symmetric Gauss-Seidel" || smoother2 == "SGS") {
312 this->ReplaceString(finalString, "XXXBlock 2: relaxation: typeYYY", "Symmetric Gauss-Seidel");
313 this->ReplaceString(finalString, "XYZSmoother2XYZ", "mySmooFact2");
314 } else if (smoother2 == "Symmetric Gauss-Seidel" || smoother2 == "GS") {
315 this->ReplaceString(finalString, "XXXBlock 2: relaxation: typeYYY", "Gauss-Seidel");
316 this->ReplaceString(finalString, "XYZSmoother2XYZ", "mySmooFact2");
317 } else if (smoother2 == "Jacobi") {
318 this->ReplaceString(finalString, "XXXBlock 2: relaxation: typeYYY", "Jacobi");
319 this->ReplaceString(finalString, "XYZSmoother2XYZ", "mySmooFact2");
320 } else if (smoother2 == "Direct") {
321 this->ReplaceString(finalString, "XYZSmoother2XYZ", "mySmooDirectFact2");
322 } else {
323 this->GetOStream(Errors) << "Invalid smoother type for block 2: " << smoother2 << ". Valid options are: \"SGS\", \"GS\", \"Jacobi\", \"ILU\" or \"Direct\"." << std::endl;
324 }
325
326 if (inputParameters.get<bool>("Block 1: transfer smoothing") == true) {
327 this->ReplaceString(finalString, "XXXBlock 1: prolongatorYYY", "myPFact1");
328 this->ReplaceString(finalString, "XXXBlock 1: restrictor YYY", "myRFact1");
329 } else {
330 this->ReplaceString(finalString, "XXXBlock 1: prolongatorYYY", "myTentativePFact1");
331 this->ReplaceString(finalString, "XXXBlock 1: restrictor YYY", "myTransPFact1");
332 }
333 if (inputParameters.get<bool>("Block 2: transfer smoothing") == true) {
334 this->ReplaceString(finalString, "XXXBlock 2: prolongatorYYY", "myPFact2");
335 this->ReplaceString(finalString, "XXXBlock 2: restrictor YYY", "myRFact2");
336 } else {
337 this->ReplaceString(finalString, "XXXBlock 2: prolongatorYYY", "myTentativePFact2");
338 this->ReplaceString(finalString, "XXXBlock 2: restrictor YYY", "myTransPFact2");
339 }
340
341 // end logical code
342
343 // loop over all input parameters
344 for (Teuchos::ParameterList::ConstIterator it = inputParameters.begin(); it != inputParameters.end(); it++) {
345 // form replacement string
346 std::string par_name = inputParameters.name(it);
347 std::stringstream ss;
348 ss << "XXX" << par_name << "YYY";
349
350 // update final string with parameters
351 Teuchos::ParameterEntry par_entry = inputParameters.entry(it);
352 this->ReplaceString(finalString,
353 ss.str(), Teuchos::toString(par_entry.getAny()));
354 }
355
356 Teuchos::RCP<ParameterList> ret = Teuchos::getParametersFromXmlString(finalString);
357 return ret;
358}
359
360} // end namespace MueLu
361#endif // PACKAGES_MUELU_SRC_INTERFACE_FACADECLASSES_Simple_DEF_HPP_
Exception throws to report errors in the internal logical of the program.
Teuchos::RCP< Teuchos::ParameterList > SetParameterList(const Teuchos::ParameterList &paramList)
Set parameter list for FacadeClass interpreter.
Namespace for MueLu classes and methods.