10 #ifndef MUELU_SHIFTEDLAPLACIAN_DEF_HPP
11 #define MUELU_SHIFTEDLAPLACIAN_DEF_HPP
15 #if defined(HAVE_MUELU_IFPACK2) and defined(HAVE_MUELU_TPETRA)
17 #include <MueLu_AmalgamationFactory.hpp>
18 #include <MueLu_CoalesceDropFactory.hpp>
19 #include <MueLu_CoarseMapFactory.hpp>
20 #include <MueLu_CoupledRBMFactory.hpp>
21 #include <MueLu_DirectSolver.hpp>
22 #include <MueLu_GenericRFactory.hpp>
23 #include <MueLu_Hierarchy.hpp>
24 #include <MueLu_Ifpack2Smoother.hpp>
25 #include <MueLu_PFactory.hpp>
26 #include <MueLu_PgPFactory.hpp>
27 #include <MueLu_RAPFactory.hpp>
28 #include <MueLu_RAPShiftFactory.hpp>
29 #include <MueLu_SaPFactory.hpp>
30 #include <MueLu_ShiftedLaplacian.hpp>
31 #include <MueLu_ShiftedLaplacianOperator.hpp>
32 #include <MueLu_SmootherFactory.hpp>
33 #include <MueLu_SmootherPrototype.hpp>
34 #include <MueLu_TentativePFactory.hpp>
35 #include <MueLu_TransPFactory.hpp>
36 #include <MueLu_UncoupledAggregationFactory.hpp>
37 #include <MueLu_Utilities.hpp>
42 template <
class Scalar,
class LocalOrdinal,
class GlobalOrdinal,
class Node>
46 template <
class Scalar,
class LocalOrdinal,
class GlobalOrdinal,
class Node>
49 coarseGridSize_ = paramList->
get(
"MueLu: coarse size", 1000);
50 numLevels_ = paramList->
get(
"MueLu: levels", 3);
51 int stype = paramList->
get(
"MueLu: smoother", 8);
54 }
else if (stype == 2) {
55 Smoother_ =
"gauss-seidel";
56 }
else if (stype == 3) {
57 Smoother_ =
"symmetric gauss-seidel";
58 }
else if (stype == 4) {
59 Smoother_ =
"chebyshev";
60 }
else if (stype == 5) {
62 }
else if (stype == 6) {
64 }
else if (stype == 7) {
66 }
else if (stype == 8) {
67 Smoother_ =
"schwarz";
68 }
else if (stype == 9) {
69 Smoother_ =
"superilu";
70 }
else if (stype == 10) {
71 Smoother_ =
"superlu";
73 Smoother_ =
"schwarz";
75 smoother_sweeps_ = paramList->
get(
"MueLu: sweeps", 5);
76 smoother_damping_ = paramList->
get(
"MueLu: relax val", 1.0);
77 ncycles_ = paramList->
get(
"MueLu: cycles", 1);
78 iters_ = paramList->
get(
"MueLu: iterations", 500);
79 solverType_ = paramList->
get(
"MueLu: solver type", 1);
80 restart_size_ = paramList->
get(
"MueLu: restart size", 100);
81 recycle_size_ = paramList->
get(
"MueLu: recycle size", 25);
82 isSymmetric_ = paramList->
get(
"MueLu: symmetric",
true);
83 ilu_leveloffill_ = paramList->
get(
"MueLu: level-of-fill", 5);
84 ilu_abs_thresh_ = paramList->
get(
"MueLu: abs thresh", 0.0);
85 ilu_rel_thresh_ = paramList->
get(
"MueLu: rel thresh", 1.0);
86 ilu_diagpivotthresh_ = paramList->
get(
"MueLu: piv thresh", 0.1);
87 ilu_drop_tol_ = paramList->
get(
"MueLu: drop tol", 0.01);
88 ilu_fill_tol_ = paramList->
get(
"MueLu: fill tol", 0.01);
89 schwarz_overlap_ = paramList->
get(
"MueLu: overlap", 0);
90 schwarz_usereorder_ = paramList->
get(
"MueLu: use reorder",
true);
91 int combinemode = paramList->
get(
"MueLu: combine mode", 1);
92 if (combinemode == 0) {
97 tol_ = paramList->
get(
"MueLu: tolerance", 0.001);
100 template <
class Scalar,
class LocalOrdinal,
class GlobalOrdinal,
class Node>
103 if (A_ != Teuchos::null)
105 #ifdef HAVE_MUELU_TPETRA_INST_INT_INT
106 if (LinearProblem_ != Teuchos::null)
107 LinearProblem_->setOperator(TpetraA_);
113 template <
class Scalar,
class LocalOrdinal,
class GlobalOrdinal,
class Node>
116 #ifdef HAVE_MUELU_TPETRA_INST_INT_INT
117 if (LinearProblem_ != Teuchos::null)
118 LinearProblem_->setOperator(TpetraA_);
122 template <
class Scalar,
class LocalOrdinal,
class GlobalOrdinal,
class Node>
125 GridTransfersExist_ =
false;
128 template <
class Scalar,
class LocalOrdinal,
class GlobalOrdinal,
class Node>
132 GridTransfersExist_ =
false;
135 template <
class Scalar,
class LocalOrdinal,
class GlobalOrdinal,
class Node>
140 template <
class Scalar,
class LocalOrdinal,
class GlobalOrdinal,
class Node>
146 template <
class Scalar,
class LocalOrdinal,
class GlobalOrdinal,
class Node>
151 template <
class Scalar,
class LocalOrdinal,
class GlobalOrdinal,
class Node>
157 template <
class Scalar,
class LocalOrdinal,
class GlobalOrdinal,
class Node>
162 template <
class Scalar,
class LocalOrdinal,
class GlobalOrdinal,
class Node>
164 NullSpace_ = NullSpace;
167 template <
class Scalar,
class LocalOrdinal,
class GlobalOrdinal,
class Node>
169 levelshifts_ = levelshifts;
170 numLevels_ = levelshifts_.size();
174 template <
class Scalar,
class LocalOrdinal,
class GlobalOrdinal,
class Node>
188 Manager_->SetFactory(
"UnAmalgamationInfo", Amalgfact_);
190 params.
set(
"lightweight wrap",
true);
191 params.
set(
"aggregation: drop scheme",
"classical");
192 Dropfact_->SetParameterList(params);
193 Manager_->SetFactory(
"Graph", Dropfact_);
194 Manager_->SetFactory(
"Aggregates", UCaggfact_);
195 Manager_->SetFactory(
"CoarseMap", CoarseMapfact_);
196 Manager_->SetFactory(
"Ptent", TentPfact_);
197 if (isSymmetric_ ==
true) {
198 Manager_->SetFactory(
"P", Pfact_);
199 Manager_->SetFactory(
"R", TransPfact_);
201 Manager_->SetFactory(
"P", PgPfact_);
202 Manager_->SetFactory(
"R", Rfact_);
207 if (Smoother_ ==
"jacobi") {
208 precType_ =
"RELAXATION";
209 precList_.
set(
"relaxation: type",
"Jacobi");
210 precList_.
set(
"relaxation: sweeps", smoother_sweeps_);
211 precList_.
set(
"relaxation: damping factor", smoother_damping_);
212 }
else if (Smoother_ ==
"gauss-seidel") {
213 precType_ =
"RELAXATION";
214 precList_.
set(
"relaxation: type",
"Gauss-Seidel");
215 precList_.
set(
"relaxation: sweeps", smoother_sweeps_);
216 precList_.
set(
"relaxation: damping factor", smoother_damping_);
217 }
else if (Smoother_ ==
"symmetric gauss-seidel") {
218 precType_ =
"RELAXATION";
219 precList_.
set(
"relaxation: type",
"Symmetric Gauss-Seidel");
220 precList_.
set(
"relaxation: sweeps", smoother_sweeps_);
221 precList_.
set(
"relaxation: damping factor", smoother_damping_);
222 }
else if (Smoother_ ==
"chebyshev") {
223 precType_ =
"CHEBYSHEV";
224 }
else if (Smoother_ ==
"krylov") {
225 precType_ =
"KRYLOV";
226 precList_.
set(
"krylov: iteration type", krylov_type_);
227 precList_.
set(
"krylov: number of iterations", krylov_iterations_);
228 precList_.
set(
"krylov: residual tolerance", 1.0e-8);
229 precList_.
set(
"krylov: block size", 1);
230 precList_.
set(
"krylov: preconditioner type", krylov_preconditioner_);
231 precList_.
set(
"relaxation: sweeps", 1);
233 }
else if (Smoother_ ==
"ilut") {
235 precList_.
set(
"fact: ilut level-of-fill", ilu_leveloffill_);
236 precList_.
set(
"fact: absolute threshold", ilu_abs_thresh_);
237 precList_.
set(
"fact: relative threshold", ilu_rel_thresh_);
238 precList_.
set(
"fact: drop tolerance", ilu_drop_tol_);
239 precList_.
set(
"fact: relax value", ilu_relax_val_);
240 }
else if (Smoother_ ==
"riluk") {
242 precList_.
set(
"fact: iluk level-of-fill", ilu_leveloffill_);
243 precList_.
set(
"fact: absolute threshold", ilu_abs_thresh_);
244 precList_.
set(
"fact: relative threshold", ilu_rel_thresh_);
245 precList_.
set(
"fact: drop tolerance", ilu_drop_tol_);
246 precList_.
set(
"fact: relax value", ilu_relax_val_);
247 }
else if (Smoother_ ==
"schwarz") {
248 precType_ =
"SCHWARZ";
249 precList_.
set(
"schwarz: overlap level", schwarz_overlap_);
250 precList_.
set(
"schwarz: combine mode", schwarz_combinemode_);
251 precList_.
set(
"schwarz: use reordering", schwarz_usereorder_);
253 precList_.
set(
"order_method", schwarz_ordermethod_);
254 precList_.
sublist(
"schwarz: reordering list").
set(
"order_method", schwarz_ordermethod_);
255 precList_.
sublist(
"schwarz: subdomain solver parameters").
set(
"fact: ilut level-of-fill", ilu_leveloffill_);
256 precList_.
sublist(
"schwarz: subdomain solver parameters").
set(
"fact: absolute threshold", ilu_abs_thresh_);
257 precList_.
sublist(
"schwarz: subdomain solver parameters").
set(
"fact: relative threshold", ilu_rel_thresh_);
258 precList_.
sublist(
"schwarz: subdomain solver parameters").
set(
"fact: drop tolerance", ilu_drop_tol_);
259 precList_.
sublist(
"schwarz: subdomain solver parameters").
set(
"fact: relax value", ilu_relax_val_);
260 }
else if (Smoother_ ==
"superilu") {
261 precType_ =
"superlu";
262 precList_.
set(
"RowPerm", ilu_rowperm_);
263 precList_.
set(
"ColPerm", ilu_colperm_);
264 precList_.
set(
"DiagPivotThresh", ilu_diagpivotthresh_);
265 precList_.
set(
"ILU_DropRule", ilu_drop_rule_);
266 precList_.
set(
"ILU_DropTol", ilu_drop_tol_);
267 precList_.
set(
"ILU_FillFactor", ilu_leveloffill_);
268 precList_.
set(
"ILU_Norm", ilu_normtype_);
269 precList_.
set(
"ILU_MILU", ilu_milutype_);
270 precList_.
set(
"ILU_FillTol", ilu_fill_tol_);
271 precList_.
set(
"ILU_Flag",
true);
272 }
else if (Smoother_ ==
"superlu") {
273 precType_ =
"superlu";
274 precList_.
set(
"ColPerm", ilu_colperm_);
275 precList_.
set(
"DiagPivotThresh", ilu_diagpivotthresh_);
277 #ifdef HAVE_MUELU_TPETRA_INST_INT_INT
281 #if defined(HAVE_MUELU_AMESOS2) and defined(HAVE_AMESOS2_SUPERLU)
282 coarsestSmooProto_ =
rcp(
new DirectSolver(
"Superlu", coarsestSmooList_));
283 #elif defined(HAVE_MUELU_AMESOS2) and defined(HAVE_AMESOS2_KLU2)
285 #elif defined(HAVE_MUELU_AMESOS2) and defined(HAVE_AMESOS2_SUPERLUDIST)
286 coarsestSmooProto_ =
rcp(
new DirectSolver(
"Superludist", coarsestSmooList_));
298 if (K_ != Teuchos::null) {
299 Manager_->SetFactory(
"Smoother", Teuchos::null);
300 Manager_->SetFactory(
"CoarseSolver", Teuchos::null);
302 if (NullSpace_ != Teuchos::null)
303 Hierarchy_->GetLevel(0)->Set(
"Nullspace", NullSpace_);
304 if (isSymmetric_ ==
true) {
305 Hierarchy_->Keep(
"P", Pfact_.get());
306 Hierarchy_->Keep(
"R", TransPfact_.get());
307 Hierarchy_->SetImplicitTranspose(
true);
309 Hierarchy_->Keep(
"P", PgPfact_.get());
310 Hierarchy_->Keep(
"R", Rfact_.get());
312 Hierarchy_->Keep(
"Ptent", TentPfact_.get());
313 Hierarchy_->SetMaxCoarseSize(coarseGridSize_);
314 Hierarchy_->Setup(*Manager_, 0, numLevels_);
315 GridTransfersExist_ =
true;
319 Manager_->SetFactory(
"Smoother", smooFact_);
320 Manager_->SetFactory(
"CoarseSolver", coarsestSmooFact_);
322 if (NullSpace_ != Teuchos::null)
323 Hierarchy_->GetLevel(0)->Set(
"Nullspace", NullSpace_);
324 if (isSymmetric_ ==
true)
325 Hierarchy_->SetImplicitTranspose(
true);
326 Hierarchy_->SetMaxCoarseSize(coarseGridSize_);
327 Hierarchy_->Setup(*Manager_, 0, numLevels_);
328 GridTransfersExist_ =
true;
333 BelosList_->set(
"Maximum Iterations", iters_);
334 BelosList_->set(
"Convergence Tolerance", tol_);
336 BelosList_->set(
"Output Frequency", 1);
337 BelosList_->set(
"Output Style", Belos::Brief);
338 BelosList_->set(
"Num Blocks", restart_size_);
339 BelosList_->set(
"Num Recycled Blocks", recycle_size_);
346 template <
class Scalar,
class LocalOrdinal,
class GlobalOrdinal,
class Node>
348 int numLevels = Hierarchy_->GetNumLevels();
349 Manager_->SetFactory(
"Smoother", smooFact_);
350 Manager_->SetFactory(
"CoarseSolver", coarsestSmooFact_);
351 Hierarchy_->GetLevel(0)->Set(
"A", P_);
352 Hierarchy_->Setup(*Manager_, 0, numLevels);
357 template <
class Scalar,
class LocalOrdinal,
class GlobalOrdinal,
class Node>
359 int numLevels = Hierarchy_->GetNumLevels();
360 Acshift_->SetShifts(levelshifts_);
361 Manager_->SetFactory(
"Smoother", smooFact_);
362 Manager_->SetFactory(
"CoarseSolver", coarsestSmooFact_);
363 Manager_->SetFactory(
"A", Acshift_);
364 Manager_->SetFactory(
"K", Acshift_);
365 Manager_->SetFactory(
"M", Acshift_);
366 Hierarchy_->GetLevel(0)->Set(
"A", P_);
367 Hierarchy_->GetLevel(0)->Set(
"K", K_);
368 Hierarchy_->GetLevel(0)->Set(
"M", M_);
369 Hierarchy_->Setup(*Manager_, 0, numLevels);
374 template <
class Scalar,
class LocalOrdinal,
class GlobalOrdinal,
class Node>
377 if (GridTransfersExist_ ==
false) {
379 if (NullSpace_ != Teuchos::null)
380 Hierarchy_->GetLevel(0)->Set(
"Nullspace", NullSpace_);
381 if (isSymmetric_ ==
true)
382 Hierarchy_->SetImplicitTranspose(
true);
383 Hierarchy_->SetMaxCoarseSize(coarseGridSize_);
384 Hierarchy_->Setup(*Manager_, 0, numLevels_);
385 GridTransfersExist_ =
true;
390 template <
class Scalar,
class LocalOrdinal,
class GlobalOrdinal,
class Node>
392 #ifdef HAVE_MUELU_TPETRA_INST_INT_INT
396 if (LinearProblem_ == Teuchos::null)
397 LinearProblem_ =
rcp(
new LinearProblem);
398 LinearProblem_->setOperator(TpetraA_);
399 LinearProblem_->setRightPrec(MueLuOp_);
400 if (SolverManager_ == Teuchos::null) {
401 std::string solverName;
402 SolverFactory_ =
rcp(
new SolverFactory());
403 if (solverType_ == 1) {
404 solverName =
"Block GMRES";
405 }
else if (solverType_ == 2) {
406 solverName =
"Recycling GMRES";
408 solverName =
"Flexible GMRES";
410 SolverManager_ = SolverFactory_->create(solverName, BelosList_);
411 SolverManager_->setProblem(LinearProblem_);
418 template <
class Scalar,
class LocalOrdinal,
class GlobalOrdinal,
class Node>
420 #ifdef HAVE_MUELU_TPETRA_INST_INT_INT
421 LinearProblem_->setOperator(TpetraA_);
428 template <
class Scalar,
class LocalOrdinal,
class GlobalOrdinal,
class Node>
430 #ifdef HAVE_MUELU_TPETRA_INST_INT_INT
432 LinearProblem_->setProblem(X, B);
434 SolverManager_->solve();
442 template <
class Scalar,
class LocalOrdinal,
class GlobalOrdinal,
class Node>
446 Hierarchy_->Iterate(*B, *X, 1,
true, 0);
450 template <
class Scalar,
class LocalOrdinal,
class GlobalOrdinal,
class Node>
456 Hierarchy_->Iterate(*XpetraB, *XpetraX, 1,
true, 0);
460 template <
class Scalar,
class LocalOrdinal,
class GlobalOrdinal,
class Node>
462 #ifdef HAVE_MUELU_TPETRA_INST_INT_INT
463 int numiters = SolverManager_->getNumIters();
472 template <
class Scalar,
class LocalOrdinal,
class GlobalOrdinal,
class Node>
476 #ifdef HAVE_MUELU_TPETRA_INST_INT_INT
477 MT
residual = SolverManager_->achievedTol();
487 #define MUELU_SHIFTEDLAPLACIAN_SHORT
489 #endif // if defined(HAVE_MUELU_IFPACK2)
490 #endif // MUELU_SHIFTEDLAPLACIAN_DEF_HPP
Generic Smoother Factory for generating the smoothers of the MG hierarchy.
This class specifies the default factory that should generate some data on a Level if the data does n...
Factory for generating coarse level map. Used by TentativePFactory.
Factory for building coarse grid matrices, when the matrix is of the form K+a*M. Useful when you want...
void multigrid_apply(const RCP< MultiVector > B, RCP< MultiVector > &X)
T & get(const std::string &name, T def_value)
#define TEUCHOS_TEST_FOR_EXCEPTION(throw_exception_test, Exception, msg)
void setmass(RCP< Matrix > &M)
ParameterList & set(std::string const &name, T &&value, std::string const &docString="", RCP< const ParameterEntryValidator > const &validator=null)
void resetLinearProblem()
Factory for building tentative prolongator.
void setParameters(Teuchos::RCP< Teuchos::ParameterList > paramList)
Class that encapsulates direct solvers. Autoselection of AmesosSmoother or Amesos2Smoother according ...
Factory for building restriction operators using a prolongator factory.
Teuchos::ScalarTraits< Scalar >::magnitudeType GetResidual()
TEUCHOS_DEPRECATED RCP< T > rcp(T *p, Dealloc_T dealloc, bool owns_mem)
void setLevelShifts(std::vector< Scalar > levelshifts)
virtual ~ShiftedLaplacian()
AmalgamationFactory for subblocks of strided map based amalgamation data.
void setcoords(RCP< MultiVector > &Coords)
Wraps an existing MueLu::Hierarchy as a Tpetra::Operator, with an optional two-level correction...
int solve(const RCP< TMV > B, RCP< TMV > &X)
Factory for creating a graph based on a given matrix.
void setProblemMatrix(RCP< Matrix > &A)
void setstiff(RCP< Matrix > &K)
Factory for building restriction operators.
ParameterList & sublist(const std::string &name, bool mustAlreadyExist=false, const std::string &docString="")
void residual(const Operator< SC, LO, GO, NO > &Aop, const MultiVector< SC, LO, GO, NO > &X_in, const MultiVector< SC, LO, GO, NO > &B_in, MultiVector< SC, LO, GO, NO > &R_in)
Exception throws to report errors in the internal logical of the program.
Print all warning messages.
Factory for building coarse matrices.
Factory for building Petrov-Galerkin Smoothed Aggregation prolongators.
Class that encapsulates Ifpack2 smoothers.
Factory for building Smoothed Aggregation prolongators.Input/output of SaPFactory
Factory for building uncoupled aggregates.
static RCP< Tpetra::CrsMatrix< Scalar, LocalOrdinal, GlobalOrdinal, Node > > Op2NonConstTpetraCrs(RCP< Xpetra::Matrix< Scalar, LocalOrdinal, GlobalOrdinal, Node >> Op)
void setNullSpace(RCP< MultiVector > NullSpace)
Provides methods to build a multigrid hierarchy and apply multigrid cycles.
void setPreconditioningMatrix(RCP< Matrix > &P)