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>
42template <
class Scalar,
class LocalOrdinal,
class GlobalOrdinal,
class Node>
46template <
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) {
93 schwarz_combinemode_ = Tpetra::ZERO;
95 schwarz_combinemode_ = Tpetra::ADD;
97 tol_ = paramList->get(
"MueLu: tolerance", 0.001);
100template <
class Scalar,
class LocalOrdinal,
class GlobalOrdinal,
class Node>
103 if (A_ != Teuchos::null)
104 TpetraA_ = toTpetra(A_);
105 if (LinearProblem_ != Teuchos::null)
106 LinearProblem_->setOperator(TpetraA_);
109template <
class Scalar,
class LocalOrdinal,
class GlobalOrdinal,
class Node>
112 if (LinearProblem_ != Teuchos::null)
113 LinearProblem_->setOperator(TpetraA_);
116template <
class Scalar,
class LocalOrdinal,
class GlobalOrdinal,
class Node>
119 GridTransfersExist_ =
false;
122template <
class Scalar,
class LocalOrdinal,
class GlobalOrdinal,
class Node>
124 RCP<Xpetra::CrsMatrix<Scalar, LocalOrdinal, GlobalOrdinal, Node> > Atmp = rcp(
new Xpetra::TpetraCrsMatrix<Scalar, LocalOrdinal, GlobalOrdinal, Node>(TpetraP));
125 P_ = rcp(
new Xpetra::CrsMatrixWrap<Scalar, LocalOrdinal, GlobalOrdinal, Node>(Atmp));
126 GridTransfersExist_ =
false;
129template <
class Scalar,
class LocalOrdinal,
class GlobalOrdinal,
class Node>
134template <
class Scalar,
class LocalOrdinal,
class GlobalOrdinal,
class Node>
136 RCP<Xpetra::CrsMatrix<Scalar, LocalOrdinal, GlobalOrdinal, Node> > Atmp = rcp(
new Xpetra::TpetraCrsMatrix<Scalar, LocalOrdinal, GlobalOrdinal, Node>(TpetraK));
137 K_ = rcp(
new Xpetra::CrsMatrixWrap<Scalar, LocalOrdinal, GlobalOrdinal, Node>(Atmp));
140template <
class Scalar,
class LocalOrdinal,
class GlobalOrdinal,
class Node>
145template <
class Scalar,
class LocalOrdinal,
class GlobalOrdinal,
class Node>
147 RCP<Xpetra::CrsMatrix<Scalar, LocalOrdinal, GlobalOrdinal, Node> > Atmp = rcp(
new Xpetra::TpetraCrsMatrix<Scalar, LocalOrdinal, GlobalOrdinal, Node>(TpetraM));
148 M_ = rcp(
new Xpetra::CrsMatrixWrap<Scalar, LocalOrdinal, GlobalOrdinal, Node>(Atmp));
151template <
class Scalar,
class LocalOrdinal,
class GlobalOrdinal,
class Node>
156template <
class Scalar,
class LocalOrdinal,
class GlobalOrdinal,
class Node>
158 NullSpace_ = NullSpace;
161template <
class Scalar,
class LocalOrdinal,
class GlobalOrdinal,
class Node>
163 levelshifts_ = levelshifts;
164 numLevels_ = levelshifts_.size();
168template <
class Scalar,
class LocalOrdinal,
class GlobalOrdinal,
class Node>
182 Manager_->SetFactory(
"UnAmalgamationInfo", Amalgfact_);
183 Teuchos::ParameterList params;
184 params.set(
"lightweight wrap",
true);
185 params.set(
"aggregation: drop scheme",
"classical");
186 Dropfact_->SetParameterList(params);
187 Manager_->SetFactory(
"Graph", Dropfact_);
188 Manager_->SetFactory(
"Aggregates", UCaggfact_);
189 Manager_->SetFactory(
"CoarseMap", CoarseMapfact_);
190 Manager_->SetFactory(
"Ptent", TentPfact_);
191 if (isSymmetric_ ==
true) {
192 Manager_->SetFactory(
"P", Pfact_);
193 Manager_->SetFactory(
"R", TransPfact_);
195 Manager_->SetFactory(
"P", PgPfact_);
196 Manager_->SetFactory(
"R", Rfact_);
201 if (Smoother_ ==
"jacobi") {
202 precType_ =
"RELAXATION";
203 precList_.set(
"relaxation: type",
"Jacobi");
204 precList_.set(
"relaxation: sweeps", smoother_sweeps_);
205 precList_.set(
"relaxation: damping factor", smoother_damping_);
206 }
else if (Smoother_ ==
"gauss-seidel") {
207 precType_ =
"RELAXATION";
208 precList_.set(
"relaxation: type",
"Gauss-Seidel");
209 precList_.set(
"relaxation: sweeps", smoother_sweeps_);
210 precList_.set(
"relaxation: damping factor", smoother_damping_);
211 }
else if (Smoother_ ==
"symmetric gauss-seidel") {
212 precType_ =
"RELAXATION";
213 precList_.set(
"relaxation: type",
"Symmetric Gauss-Seidel");
214 precList_.set(
"relaxation: sweeps", smoother_sweeps_);
215 precList_.set(
"relaxation: damping factor", smoother_damping_);
216 }
else if (Smoother_ ==
"chebyshev") {
217 precType_ =
"CHEBYSHEV";
218 }
else if (Smoother_ ==
"krylov") {
219 precType_ =
"KRYLOV";
220 precList_.set(
"krylov: iteration type", krylov_type_);
221 precList_.set(
"krylov: number of iterations", krylov_iterations_);
222 precList_.set(
"krylov: residual tolerance", 1.0e-8);
223 precList_.set(
"krylov: block size", 1);
224 precList_.set(
"krylov: preconditioner type", krylov_preconditioner_);
225 precList_.set(
"relaxation: sweeps", 1);
227 }
else if (Smoother_ ==
"ilut") {
229 precList_.set(
"fact: ilut level-of-fill", ilu_leveloffill_);
230 precList_.set(
"fact: absolute threshold", ilu_abs_thresh_);
231 precList_.set(
"fact: relative threshold", ilu_rel_thresh_);
232 precList_.set(
"fact: drop tolerance", ilu_drop_tol_);
233 precList_.set(
"fact: relax value", ilu_relax_val_);
234 }
else if (Smoother_ ==
"riluk") {
236 precList_.set(
"fact: iluk level-of-fill", ilu_leveloffill_);
237 precList_.set(
"fact: absolute threshold", ilu_abs_thresh_);
238 precList_.set(
"fact: relative threshold", ilu_rel_thresh_);
239 precList_.set(
"fact: drop tolerance", ilu_drop_tol_);
240 precList_.set(
"fact: relax value", ilu_relax_val_);
241 }
else if (Smoother_ ==
"schwarz") {
242 precType_ =
"SCHWARZ";
243 precList_.set(
"schwarz: overlap level", schwarz_overlap_);
244 precList_.set(
"schwarz: combine mode", schwarz_combinemode_);
245 precList_.set(
"schwarz: use reordering", schwarz_usereorder_);
247 precList_.set(
"order_method", schwarz_ordermethod_);
248 precList_.sublist(
"schwarz: reordering list").set(
"order_method", schwarz_ordermethod_);
249 precList_.sublist(
"schwarz: subdomain solver parameters").set(
"fact: ilut level-of-fill", ilu_leveloffill_);
250 precList_.sublist(
"schwarz: subdomain solver parameters").set(
"fact: absolute threshold", ilu_abs_thresh_);
251 precList_.sublist(
"schwarz: subdomain solver parameters").set(
"fact: relative threshold", ilu_rel_thresh_);
252 precList_.sublist(
"schwarz: subdomain solver parameters").set(
"fact: drop tolerance", ilu_drop_tol_);
253 precList_.sublist(
"schwarz: subdomain solver parameters").set(
"fact: relax value", ilu_relax_val_);
254 }
else if (Smoother_ ==
"superilu") {
255 precType_ =
"superlu";
256 precList_.set(
"RowPerm", ilu_rowperm_);
257 precList_.set(
"ColPerm", ilu_colperm_);
258 precList_.set(
"DiagPivotThresh", ilu_diagpivotthresh_);
259 precList_.set(
"ILU_DropRule", ilu_drop_rule_);
260 precList_.set(
"ILU_DropTol", ilu_drop_tol_);
261 precList_.set(
"ILU_FillFactor", ilu_leveloffill_);
262 precList_.set(
"ILU_Norm", ilu_normtype_);
263 precList_.set(
"ILU_MILU", ilu_milutype_);
264 precList_.set(
"ILU_FillTol", ilu_fill_tol_);
265 precList_.set(
"ILU_Flag",
true);
266 }
else if (Smoother_ ==
"superlu") {
267 precType_ =
"superlu";
268 precList_.set(
"ColPerm", ilu_colperm_);
269 precList_.set(
"DiagPivotThresh", ilu_diagpivotthresh_);
274#if defined(HAVE_MUELU_AMESOS2) and defined(HAVE_AMESOS2_SUPERLU)
275 coarsestSmooProto_ = rcp(
new DirectSolver(
"Superlu", coarsestSmooList_));
276#elif defined(HAVE_MUELU_AMESOS2) and defined(HAVE_AMESOS2_KLU2)
277 coarsestSmooProto_ = rcp(
new DirectSolver(
"Klu", coarsestSmooList_));
278#elif defined(HAVE_MUELU_AMESOS2) and defined(HAVE_AMESOS2_SUPERLUDIST)
279 coarsestSmooProto_ = rcp(
new DirectSolver(
"Superludist", coarsestSmooList_));
283 coarsestSmooFact_ = rcp(
new SmootherFactory(coarsestSmooProto_, Teuchos::null));
291 if (K_ != Teuchos::null) {
292 Manager_->SetFactory(
"Smoother", Teuchos::null);
293 Manager_->SetFactory(
"CoarseSolver", Teuchos::null);
295 if (NullSpace_ != Teuchos::null)
296 Hierarchy_->GetLevel(0)->Set(
"Nullspace", NullSpace_);
297 if (isSymmetric_ ==
true) {
298 Hierarchy_->Keep(
"P", Pfact_.get());
299 Hierarchy_->Keep(
"R", TransPfact_.get());
300 Hierarchy_->SetImplicitTranspose(
true);
302 Hierarchy_->Keep(
"P", PgPfact_.get());
303 Hierarchy_->Keep(
"R", Rfact_.get());
305 Hierarchy_->Keep(
"Ptent", TentPfact_.get());
306 Hierarchy_->SetMaxCoarseSize(coarseGridSize_);
307 Hierarchy_->Setup(*Manager_, 0, numLevels_);
308 GridTransfersExist_ =
true;
312 Manager_->SetFactory(
"Smoother", smooFact_);
313 Manager_->SetFactory(
"CoarseSolver", coarsestSmooFact_);
315 if (NullSpace_ != Teuchos::null)
316 Hierarchy_->GetLevel(0)->Set(
"Nullspace", NullSpace_);
317 if (isSymmetric_ ==
true)
318 Hierarchy_->SetImplicitTranspose(
true);
319 Hierarchy_->SetMaxCoarseSize(coarseGridSize_);
320 Hierarchy_->Setup(*Manager_, 0, numLevels_);
321 GridTransfersExist_ =
true;
325 BelosList_ = rcp(
new Teuchos::ParameterList(
"GMRES"));
326 BelosList_->set(
"Maximum Iterations", iters_);
327 BelosList_->set(
"Convergence Tolerance", tol_);
328 BelosList_->set(
"Verbosity", Belos::Errors + Belos::Warnings + Belos::StatusTestDetails);
329 BelosList_->set(
"Output Frequency", 1);
330 BelosList_->set(
"Output Style", Belos::Brief);
331 BelosList_->set(
"Num Blocks", restart_size_);
332 BelosList_->set(
"Num Recycled Blocks", recycle_size_);
336template <
class Scalar,
class LocalOrdinal,
class GlobalOrdinal,
class Node>
338 int numLevels = Hierarchy_->GetNumLevels();
339 Manager_->SetFactory(
"Smoother", smooFact_);
340 Manager_->SetFactory(
"CoarseSolver", coarsestSmooFact_);
341 Hierarchy_->GetLevel(0)->Set(
"A", P_);
342 Hierarchy_->Setup(*Manager_, 0, numLevels);
347template <
class Scalar,
class LocalOrdinal,
class GlobalOrdinal,
class Node>
349 int numLevels = Hierarchy_->GetNumLevels();
350 Acshift_->SetShifts(levelshifts_);
351 Manager_->SetFactory(
"Smoother", smooFact_);
352 Manager_->SetFactory(
"CoarseSolver", coarsestSmooFact_);
353 Manager_->SetFactory(
"A", Acshift_);
354 Manager_->SetFactory(
"K", Acshift_);
355 Manager_->SetFactory(
"M", Acshift_);
356 Hierarchy_->GetLevel(0)->Set(
"A", P_);
357 Hierarchy_->GetLevel(0)->Set(
"K", K_);
358 Hierarchy_->GetLevel(0)->Set(
"M", M_);
359 Hierarchy_->Setup(*Manager_, 0, numLevels);
364template <
class Scalar,
class LocalOrdinal,
class GlobalOrdinal,
class Node>
367 if (GridTransfersExist_ ==
false) {
369 if (NullSpace_ != Teuchos::null)
370 Hierarchy_->GetLevel(0)->Set(
"Nullspace", NullSpace_);
371 if (isSymmetric_ ==
true)
372 Hierarchy_->SetImplicitTranspose(
true);
373 Hierarchy_->SetMaxCoarseSize(coarseGridSize_);
374 Hierarchy_->Setup(*Manager_, 0, numLevels_);
375 GridTransfersExist_ =
true;
380template <
class Scalar,
class LocalOrdinal,
class GlobalOrdinal,
class Node>
385 if (LinearProblem_ == Teuchos::null)
387 LinearProblem_->setOperator(TpetraA_);
388 LinearProblem_->setRightPrec(MueLuOp_);
389 if (SolverManager_ == Teuchos::null) {
390 std::string solverName;
392 if (solverType_ == 1) {
393 solverName =
"Block GMRES";
394 }
else if (solverType_ == 2) {
395 solverName =
"Recycling GMRES";
397 solverName =
"Flexible GMRES";
399 SolverManager_ = SolverFactory_->create(solverName, BelosList_);
400 SolverManager_->setProblem(LinearProblem_);
404template <
class Scalar,
class LocalOrdinal,
class GlobalOrdinal,
class Node>
406 LinearProblem_->setOperator(TpetraA_);
410template <
class Scalar,
class LocalOrdinal,
class GlobalOrdinal,
class Node>
413 LinearProblem_->setProblem(X, B);
415 return SolverManager_->solve();
419template <
class Scalar,
class LocalOrdinal,
class GlobalOrdinal,
class Node>
421 RCP<MultiVector>& X) {
423 Hierarchy_->Iterate(*B, *X, 1,
true, 0);
427template <
class Scalar,
class LocalOrdinal,
class GlobalOrdinal,
class Node>
429 RCP<Tpetra::MultiVector<SC, LO, GO, NO> >& X) {
430 Teuchos::RCP<Xpetra::MultiVector<Scalar, LocalOrdinal, GlobalOrdinal, Node> > XpetraX = Teuchos::rcp(
new Xpetra::TpetraMultiVector<Scalar, LocalOrdinal, GlobalOrdinal, Node>(X));
431 Teuchos::RCP<Xpetra::MultiVector<Scalar, LocalOrdinal, GlobalOrdinal, Node> > XpetraB = Teuchos::rcp(
new Xpetra::TpetraMultiVector<Scalar, LocalOrdinal, GlobalOrdinal, Node>(B));
433 Hierarchy_->Iterate(*XpetraB, *XpetraX, 1,
true, 0);
437template <
class Scalar,
class LocalOrdinal,
class GlobalOrdinal,
class Node>
439 int numiters = SolverManager_->getNumIters();
444template <
class Scalar,
class LocalOrdinal,
class GlobalOrdinal,
class Node>
445typename Teuchos::ScalarTraits<Scalar>::magnitudeType
447 typedef typename Teuchos::ScalarTraits<Scalar>::magnitudeType MT;
448 MT residual = SolverManager_->achievedTol();
454#define MUELU_SHIFTEDLAPLACIAN_SHORT
AmalgamationFactory for subblocks of strided map based amalgamation data.
Factory for creating a graph based on a given matrix.
Factory for generating coarse level map. Used by TentativePFactory.
Class that encapsulates direct solvers. Autoselection of AmesosSmoother or Amesos2Smoother according ...
This class specifies the default factory that should generate some data on a Level if the data does n...
Factory for building restriction operators using a prolongator factory.
Provides methods to build a multigrid hierarchy and apply multigrid cycles.
Class that encapsulates Ifpack2 smoothers.
Factory for building Petrov-Galerkin Smoothed Aggregation prolongators.
Factory for building coarse matrices.
Factory for building coarse grid matrices, when the matrix is of the form K+a*M. Useful when you want...
Factory for building Smoothed Aggregation prolongators.
Wraps an existing MueLu::Hierarchy as a Tpetra::Operator, with an optional two-level correction....
void setPreconditioningMatrix(RCP< Matrix > &P)
void setmass(RCP< Matrix > &M)
void resetLinearProblem()
void setNullSpace(RCP< MultiVector > NullSpace)
void setcoords(RCP< MultiVector > &Coords)
Belos::LinearProblem< SC, TMV, OP > LinearProblem
Teuchos::ScalarTraits< Scalar >::magnitudeType GetResidual()
void setLevelShifts(std::vector< Scalar > levelshifts)
void setParameters(Teuchos::RCP< Teuchos::ParameterList > paramList)
virtual ~ShiftedLaplacian()
void setstiff(RCP< Matrix > &K)
void setProblemMatrix(RCP< Matrix > &A)
void multigrid_apply(const RCP< MultiVector > B, RCP< MultiVector > &X)
Belos::SolverFactory< SC, TMV, OP > SolverFactory
Belos::ReturnType solve(const RCP< TMV > B, RCP< TMV > &X)
Generic Smoother Factory for generating the smoothers of the MG hierarchy.
Factory for building tentative prolongator.
Factory for building restriction operators.
Factory for building uncoupled aggregates.
Namespace for MueLu classes and methods.