46 #ifndef MUELU_SHIFTEDLAPLACIAN_DEF_HPP
47 #define MUELU_SHIFTEDLAPLACIAN_DEF_HPP
51 #if defined(HAVE_MUELU_IFPACK2) and defined(HAVE_MUELU_TPETRA)
53 #include <MueLu_AmalgamationFactory.hpp>
54 #include <MueLu_CoalesceDropFactory.hpp>
55 #include <MueLu_CoarseMapFactory.hpp>
56 #include <MueLu_CoupledRBMFactory.hpp>
57 #include <MueLu_DirectSolver.hpp>
58 #include <MueLu_GenericRFactory.hpp>
59 #include <MueLu_Hierarchy.hpp>
60 #include <MueLu_Ifpack2Smoother.hpp>
61 #include <MueLu_PFactory.hpp>
62 #include <MueLu_PgPFactory.hpp>
63 #include <MueLu_RAPFactory.hpp>
64 #include <MueLu_RAPShiftFactory.hpp>
65 #include <MueLu_SaPFactory.hpp>
66 #include <MueLu_ShiftedLaplacian.hpp>
67 #include <MueLu_ShiftedLaplacianOperator.hpp>
68 #include <MueLu_SmootherFactory.hpp>
69 #include <MueLu_SmootherPrototype.hpp>
70 #include <MueLu_TentativePFactory.hpp>
71 #include <MueLu_TransPFactory.hpp>
72 #include <MueLu_UncoupledAggregationFactory.hpp>
73 #include <MueLu_Utilities.hpp>
78 template <
class Scalar,
class LocalOrdinal,
class GlobalOrdinal,
class Node>
82 template <
class Scalar,
class LocalOrdinal,
class GlobalOrdinal,
class Node>
85 coarseGridSize_ = paramList->
get(
"MueLu: coarse size", 1000);
86 numLevels_ = paramList->
get(
"MueLu: levels", 3);
87 int stype = paramList->
get(
"MueLu: smoother", 8);
90 }
else if (stype == 2) {
91 Smoother_ =
"gauss-seidel";
92 }
else if (stype == 3) {
93 Smoother_ =
"symmetric gauss-seidel";
94 }
else if (stype == 4) {
95 Smoother_ =
"chebyshev";
96 }
else if (stype == 5) {
98 }
else if (stype == 6) {
100 }
else if (stype == 7) {
102 }
else if (stype == 8) {
103 Smoother_ =
"schwarz";
104 }
else if (stype == 9) {
105 Smoother_ =
"superilu";
106 }
else if (stype == 10) {
107 Smoother_ =
"superlu";
109 Smoother_ =
"schwarz";
111 smoother_sweeps_ = paramList->
get(
"MueLu: sweeps", 5);
112 smoother_damping_ = paramList->
get(
"MueLu: relax val", 1.0);
113 ncycles_ = paramList->
get(
"MueLu: cycles", 1);
114 iters_ = paramList->
get(
"MueLu: iterations", 500);
115 solverType_ = paramList->
get(
"MueLu: solver type", 1);
116 restart_size_ = paramList->
get(
"MueLu: restart size", 100);
117 recycle_size_ = paramList->
get(
"MueLu: recycle size", 25);
118 isSymmetric_ = paramList->
get(
"MueLu: symmetric",
true);
119 ilu_leveloffill_ = paramList->
get(
"MueLu: level-of-fill", 5);
120 ilu_abs_thresh_ = paramList->
get(
"MueLu: abs thresh", 0.0);
121 ilu_rel_thresh_ = paramList->
get(
"MueLu: rel thresh", 1.0);
122 ilu_diagpivotthresh_ = paramList->
get(
"MueLu: piv thresh", 0.1);
123 ilu_drop_tol_ = paramList->
get(
"MueLu: drop tol", 0.01);
124 ilu_fill_tol_ = paramList->
get(
"MueLu: fill tol", 0.01);
125 schwarz_overlap_ = paramList->
get(
"MueLu: overlap", 0);
126 schwarz_usereorder_ = paramList->
get(
"MueLu: use reorder",
true);
127 int combinemode = paramList->
get(
"MueLu: combine mode", 1);
128 if (combinemode == 0) {
133 tol_ = paramList->
get(
"MueLu: tolerance", 0.001);
136 template <
class Scalar,
class LocalOrdinal,
class GlobalOrdinal,
class Node>
139 if (A_ != Teuchos::null)
141 #ifdef HAVE_MUELU_TPETRA_INST_INT_INT
142 if (LinearProblem_ != Teuchos::null)
143 LinearProblem_->setOperator(TpetraA_);
149 template <
class Scalar,
class LocalOrdinal,
class GlobalOrdinal,
class Node>
152 #ifdef HAVE_MUELU_TPETRA_INST_INT_INT
153 if (LinearProblem_ != Teuchos::null)
154 LinearProblem_->setOperator(TpetraA_);
158 template <
class Scalar,
class LocalOrdinal,
class GlobalOrdinal,
class Node>
161 GridTransfersExist_ =
false;
164 template <
class Scalar,
class LocalOrdinal,
class GlobalOrdinal,
class Node>
168 GridTransfersExist_ =
false;
171 template <
class Scalar,
class LocalOrdinal,
class GlobalOrdinal,
class Node>
176 template <
class Scalar,
class LocalOrdinal,
class GlobalOrdinal,
class Node>
182 template <
class Scalar,
class LocalOrdinal,
class GlobalOrdinal,
class Node>
187 template <
class Scalar,
class LocalOrdinal,
class GlobalOrdinal,
class Node>
193 template <
class Scalar,
class LocalOrdinal,
class GlobalOrdinal,
class Node>
198 template <
class Scalar,
class LocalOrdinal,
class GlobalOrdinal,
class Node>
200 NullSpace_ = NullSpace;
203 template <
class Scalar,
class LocalOrdinal,
class GlobalOrdinal,
class Node>
205 levelshifts_ = levelshifts;
206 numLevels_ = levelshifts_.size();
210 template <
class Scalar,
class LocalOrdinal,
class GlobalOrdinal,
class Node>
224 Manager_->SetFactory(
"UnAmalgamationInfo", Amalgfact_);
226 params.
set(
"lightweight wrap",
true);
227 params.
set(
"aggregation: drop scheme",
"classical");
228 Dropfact_->SetParameterList(params);
229 Manager_->SetFactory(
"Graph", Dropfact_);
230 Manager_->SetFactory(
"Aggregates", UCaggfact_);
231 Manager_->SetFactory(
"CoarseMap", CoarseMapfact_);
232 Manager_->SetFactory(
"Ptent", TentPfact_);
233 if (isSymmetric_ ==
true) {
234 Manager_->SetFactory(
"P", Pfact_);
235 Manager_->SetFactory(
"R", TransPfact_);
237 Manager_->SetFactory(
"P", PgPfact_);
238 Manager_->SetFactory(
"R", Rfact_);
243 if (Smoother_ ==
"jacobi") {
244 precType_ =
"RELAXATION";
245 precList_.
set(
"relaxation: type",
"Jacobi");
246 precList_.
set(
"relaxation: sweeps", smoother_sweeps_);
247 precList_.
set(
"relaxation: damping factor", smoother_damping_);
248 }
else if (Smoother_ ==
"gauss-seidel") {
249 precType_ =
"RELAXATION";
250 precList_.
set(
"relaxation: type",
"Gauss-Seidel");
251 precList_.
set(
"relaxation: sweeps", smoother_sweeps_);
252 precList_.
set(
"relaxation: damping factor", smoother_damping_);
253 }
else if (Smoother_ ==
"symmetric gauss-seidel") {
254 precType_ =
"RELAXATION";
255 precList_.
set(
"relaxation: type",
"Symmetric Gauss-Seidel");
256 precList_.
set(
"relaxation: sweeps", smoother_sweeps_);
257 precList_.
set(
"relaxation: damping factor", smoother_damping_);
258 }
else if (Smoother_ ==
"chebyshev") {
259 precType_ =
"CHEBYSHEV";
260 }
else if (Smoother_ ==
"krylov") {
261 precType_ =
"KRYLOV";
262 precList_.
set(
"krylov: iteration type", krylov_type_);
263 precList_.
set(
"krylov: number of iterations", krylov_iterations_);
264 precList_.
set(
"krylov: residual tolerance", 1.0e-8);
265 precList_.
set(
"krylov: block size", 1);
266 precList_.
set(
"krylov: preconditioner type", krylov_preconditioner_);
267 precList_.
set(
"relaxation: sweeps", 1);
269 }
else if (Smoother_ ==
"ilut") {
271 precList_.
set(
"fact: ilut level-of-fill", ilu_leveloffill_);
272 precList_.
set(
"fact: absolute threshold", ilu_abs_thresh_);
273 precList_.
set(
"fact: relative threshold", ilu_rel_thresh_);
274 precList_.
set(
"fact: drop tolerance", ilu_drop_tol_);
275 precList_.
set(
"fact: relax value", ilu_relax_val_);
276 }
else if (Smoother_ ==
"riluk") {
278 precList_.
set(
"fact: iluk level-of-fill", ilu_leveloffill_);
279 precList_.
set(
"fact: absolute threshold", ilu_abs_thresh_);
280 precList_.
set(
"fact: relative threshold", ilu_rel_thresh_);
281 precList_.
set(
"fact: drop tolerance", ilu_drop_tol_);
282 precList_.
set(
"fact: relax value", ilu_relax_val_);
283 }
else if (Smoother_ ==
"schwarz") {
284 precType_ =
"SCHWARZ";
285 precList_.
set(
"schwarz: overlap level", schwarz_overlap_);
286 precList_.
set(
"schwarz: combine mode", schwarz_combinemode_);
287 precList_.
set(
"schwarz: use reordering", schwarz_usereorder_);
289 precList_.
set(
"order_method", schwarz_ordermethod_);
290 precList_.
sublist(
"schwarz: reordering list").
set(
"order_method", schwarz_ordermethod_);
291 precList_.
sublist(
"schwarz: subdomain solver parameters").
set(
"fact: ilut level-of-fill", ilu_leveloffill_);
292 precList_.
sublist(
"schwarz: subdomain solver parameters").
set(
"fact: absolute threshold", ilu_abs_thresh_);
293 precList_.
sublist(
"schwarz: subdomain solver parameters").
set(
"fact: relative threshold", ilu_rel_thresh_);
294 precList_.
sublist(
"schwarz: subdomain solver parameters").
set(
"fact: drop tolerance", ilu_drop_tol_);
295 precList_.
sublist(
"schwarz: subdomain solver parameters").
set(
"fact: relax value", ilu_relax_val_);
296 }
else if (Smoother_ ==
"superilu") {
297 precType_ =
"superlu";
298 precList_.
set(
"RowPerm", ilu_rowperm_);
299 precList_.
set(
"ColPerm", ilu_colperm_);
300 precList_.
set(
"DiagPivotThresh", ilu_diagpivotthresh_);
301 precList_.
set(
"ILU_DropRule", ilu_drop_rule_);
302 precList_.
set(
"ILU_DropTol", ilu_drop_tol_);
303 precList_.
set(
"ILU_FillFactor", ilu_leveloffill_);
304 precList_.
set(
"ILU_Norm", ilu_normtype_);
305 precList_.
set(
"ILU_MILU", ilu_milutype_);
306 precList_.
set(
"ILU_FillTol", ilu_fill_tol_);
307 precList_.
set(
"ILU_Flag",
true);
308 }
else if (Smoother_ ==
"superlu") {
309 precType_ =
"superlu";
310 precList_.
set(
"ColPerm", ilu_colperm_);
311 precList_.
set(
"DiagPivotThresh", ilu_diagpivotthresh_);
313 #ifdef HAVE_MUELU_TPETRA_INST_INT_INT
317 #if defined(HAVE_MUELU_AMESOS2) and defined(HAVE_AMESOS2_SUPERLU)
318 coarsestSmooProto_ =
rcp(
new DirectSolver(
"Superlu", coarsestSmooList_));
319 #elif defined(HAVE_MUELU_AMESOS2) and defined(HAVE_AMESOS2_KLU2)
321 #elif defined(HAVE_MUELU_AMESOS2) and defined(HAVE_AMESOS2_SUPERLUDIST)
322 coarsestSmooProto_ =
rcp(
new DirectSolver(
"Superludist", coarsestSmooList_));
334 if (K_ != Teuchos::null) {
335 Manager_->SetFactory(
"Smoother", Teuchos::null);
336 Manager_->SetFactory(
"CoarseSolver", Teuchos::null);
338 if (NullSpace_ != Teuchos::null)
339 Hierarchy_->GetLevel(0)->Set(
"Nullspace", NullSpace_);
340 if (isSymmetric_ ==
true) {
341 Hierarchy_->Keep(
"P", Pfact_.get());
342 Hierarchy_->Keep(
"R", TransPfact_.get());
343 Hierarchy_->SetImplicitTranspose(
true);
345 Hierarchy_->Keep(
"P", PgPfact_.get());
346 Hierarchy_->Keep(
"R", Rfact_.get());
348 Hierarchy_->Keep(
"Ptent", TentPfact_.get());
349 Hierarchy_->SetMaxCoarseSize(coarseGridSize_);
350 Hierarchy_->Setup(*Manager_, 0, numLevels_);
351 GridTransfersExist_ =
true;
355 Manager_->SetFactory(
"Smoother", smooFact_);
356 Manager_->SetFactory(
"CoarseSolver", coarsestSmooFact_);
358 if (NullSpace_ != Teuchos::null)
359 Hierarchy_->GetLevel(0)->Set(
"Nullspace", NullSpace_);
360 if (isSymmetric_ ==
true)
361 Hierarchy_->SetImplicitTranspose(
true);
362 Hierarchy_->SetMaxCoarseSize(coarseGridSize_);
363 Hierarchy_->Setup(*Manager_, 0, numLevels_);
364 GridTransfersExist_ =
true;
369 BelosList_->set(
"Maximum Iterations", iters_);
370 BelosList_->set(
"Convergence Tolerance", tol_);
372 BelosList_->set(
"Output Frequency", 1);
373 BelosList_->set(
"Output Style", Belos::Brief);
374 BelosList_->set(
"Num Blocks", restart_size_);
375 BelosList_->set(
"Num Recycled Blocks", recycle_size_);
382 template <
class Scalar,
class LocalOrdinal,
class GlobalOrdinal,
class Node>
384 int numLevels = Hierarchy_->GetNumLevels();
385 Manager_->SetFactory(
"Smoother", smooFact_);
386 Manager_->SetFactory(
"CoarseSolver", coarsestSmooFact_);
387 Hierarchy_->GetLevel(0)->Set(
"A", P_);
388 Hierarchy_->Setup(*Manager_, 0, numLevels);
393 template <
class Scalar,
class LocalOrdinal,
class GlobalOrdinal,
class Node>
395 int numLevels = Hierarchy_->GetNumLevels();
396 Acshift_->SetShifts(levelshifts_);
397 Manager_->SetFactory(
"Smoother", smooFact_);
398 Manager_->SetFactory(
"CoarseSolver", coarsestSmooFact_);
399 Manager_->SetFactory(
"A", Acshift_);
400 Manager_->SetFactory(
"K", Acshift_);
401 Manager_->SetFactory(
"M", Acshift_);
402 Hierarchy_->GetLevel(0)->Set(
"A", P_);
403 Hierarchy_->GetLevel(0)->Set(
"K", K_);
404 Hierarchy_->GetLevel(0)->Set(
"M", M_);
405 Hierarchy_->Setup(*Manager_, 0, numLevels);
410 template <
class Scalar,
class LocalOrdinal,
class GlobalOrdinal,
class Node>
413 if (GridTransfersExist_ ==
false) {
415 if (NullSpace_ != Teuchos::null)
416 Hierarchy_->GetLevel(0)->Set(
"Nullspace", NullSpace_);
417 if (isSymmetric_ ==
true)
418 Hierarchy_->SetImplicitTranspose(
true);
419 Hierarchy_->SetMaxCoarseSize(coarseGridSize_);
420 Hierarchy_->Setup(*Manager_, 0, numLevels_);
421 GridTransfersExist_ =
true;
426 template <
class Scalar,
class LocalOrdinal,
class GlobalOrdinal,
class Node>
428 #ifdef HAVE_MUELU_TPETRA_INST_INT_INT
432 if (LinearProblem_ == Teuchos::null)
433 LinearProblem_ =
rcp(
new LinearProblem);
434 LinearProblem_->setOperator(TpetraA_);
435 LinearProblem_->setRightPrec(MueLuOp_);
436 if (SolverManager_ == Teuchos::null) {
437 std::string solverName;
438 SolverFactory_ =
rcp(
new SolverFactory());
439 if (solverType_ == 1) {
440 solverName =
"Block GMRES";
441 }
else if (solverType_ == 2) {
442 solverName =
"Recycling GMRES";
444 solverName =
"Flexible GMRES";
446 SolverManager_ = SolverFactory_->create(solverName, BelosList_);
447 SolverManager_->setProblem(LinearProblem_);
454 template <
class Scalar,
class LocalOrdinal,
class GlobalOrdinal,
class Node>
456 #ifdef HAVE_MUELU_TPETRA_INST_INT_INT
457 LinearProblem_->setOperator(TpetraA_);
464 template <
class Scalar,
class LocalOrdinal,
class GlobalOrdinal,
class Node>
466 #ifdef HAVE_MUELU_TPETRA_INST_INT_INT
468 LinearProblem_->setProblem(X, B);
470 SolverManager_->solve();
478 template <
class Scalar,
class LocalOrdinal,
class GlobalOrdinal,
class Node>
482 Hierarchy_->Iterate(*B, *X, 1,
true, 0);
486 template <
class Scalar,
class LocalOrdinal,
class GlobalOrdinal,
class Node>
492 Hierarchy_->Iterate(*XpetraB, *XpetraX, 1,
true, 0);
496 template <
class Scalar,
class LocalOrdinal,
class GlobalOrdinal,
class Node>
498 #ifdef HAVE_MUELU_TPETRA_INST_INT_INT
499 int numiters = SolverManager_->getNumIters();
508 template <
class Scalar,
class LocalOrdinal,
class GlobalOrdinal,
class Node>
512 #ifdef HAVE_MUELU_TPETRA_INST_INT_INT
513 MT
residual = SolverManager_->achievedTol();
523 #define MUELU_SHIFTEDLAPLACIAN_SHORT
525 #endif // if defined(HAVE_MUELU_IFPACK2)
526 #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)
ParameterList & set(std::string const &name, T const &value, std::string const &docString="", RCP< const ParameterEntryValidator > const &validator=null)
#define TEUCHOS_TEST_FOR_EXCEPTION(throw_exception_test, Exception, msg)
void setmass(RCP< Matrix > &M)
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)