10#ifndef MUELU_EMINPFACTORY_DEF_HPP
11#define MUELU_EMINPFACTORY_DEF_HPP
13#include <Xpetra_Matrix.hpp>
14#include <Xpetra_StridedMapFactory.hpp>
18#include "MueLu_CGSolver.hpp"
19#include "MueLu_Constraint.hpp"
20#include "MueLu_GMRESSolver.hpp"
23#include "MueLu_PerfUtils.hpp"
25#include "MueLu_SteepestDescentSolver.hpp"
29template <
class Scalar,
class LocalOrdinal,
class GlobalOrdinal,
class Node>
30typename Teuchos::ScalarTraits<Scalar>::magnitudeType
33 RCP<Xpetra::Matrix<Scalar, LocalOrdinal, GlobalOrdinal, Node>>& P,
34 Teuchos::FancyOStream& out) {
35 using MagnitudeType =
typename Teuchos::ScalarTraits<Scalar>::magnitudeType;
37 AP = Xpetra::MatrixMatrix<Scalar, LocalOrdinal, GlobalOrdinal, Node>::Multiply(*A,
false, *P,
false, AP, out,
true,
true);
39 PtAP = Xpetra::MatrixMatrix<Scalar, LocalOrdinal, GlobalOrdinal, Node>::Multiply(*P,
true, *AP,
false, PtAP, out,
true,
true);
40 RCP<Vector> diag = Xpetra::VectorFactory<Scalar, LocalOrdinal, GlobalOrdinal, Node>::Build(PtAP->getRowMap());
41 PtAP->getLocalDiagCopy(*diag);
42 MagnitudeType norm = diag->norm1();
43 norm = Teuchos::ScalarTraits<MagnitudeType>::squareroot(norm);
47template <
class Scalar,
class LocalOrdinal,
class GlobalOrdinal,
class Node>
49 RCP<ParameterList> validParamList = rcp(
new ParameterList());
51#define SET_VALID_ENTRY(name) validParamList->setEntry(name, MasterList::getEntry(name))
56 validParamList->getEntry(
"emin: iterative method").setValidator(rcp(
new Teuchos::StringValidator(Teuchos::tuple<std::string>(
"cg",
"sd",
"gmres"))));
60 validParamList->set<RCP<const FactoryBase>>(
"A", Teuchos::null,
"Generating factory for the matrix A used during internal iterations");
61 validParamList->set<RCP<const FactoryBase>>(
"P", Teuchos::null,
"Generating factory for the initial guess");
62 validParamList->set<RCP<const FactoryBase>>(
"Constraint", Teuchos::null,
"Generating factory for constraints");
64 validParamList->set<RCP<Matrix>>(
"P0", Teuchos::null,
"Initial guess at P");
65 validParamList->set<
bool>(
"Keep P0",
false,
"Keep an initial P0 (for reuse)");
67 validParamList->set<RCP<Constraint>>(
"Constraint0", Teuchos::null,
"Initial Constraint");
68 validParamList->set<
bool>(
"Keep Constraint0",
false,
"Keep an initial Constraint (for reuse)");
70 return validParamList;
73template <
class Scalar,
class LocalOrdinal,
class GlobalOrdinal,
class Node>
75 Input(fineLevel,
"A");
77 static bool isAvailableP0 =
false;
78 static bool isAvailableConstraint0 =
false;
92 isAvailableP0 = coarseLevel.
IsAvailable(
"P0",
this);
93 isAvailableConstraint0 = coarseLevel.
IsAvailable(
"Constraint0",
this);
96 if (isAvailableP0 ==
false)
97 Input(coarseLevel,
"P");
99 if (isAvailableConstraint0 ==
false)
100 Input(coarseLevel,
"Constraint");
103template <
class Scalar,
class LocalOrdinal,
class GlobalOrdinal,
class Node>
105 BuildP(fineLevel, coarseLevel);
108template <
class Scalar,
class LocalOrdinal,
class GlobalOrdinal,
class Node>
112 const ParameterList& pL = GetParameterList();
115 RCP<Matrix> A = Get<RCP<Matrix>>(fineLevel,
"A");
117 if (restrictionMode_) {
128 P0 = coarseLevel.
Get<RCP<Matrix>>(
"P0",
this);
129 numIts = pL.get<
int>(
"emin: num reuse iterations");
130 GetOStream(
Runtime0) <<
"Reusing P0" << std::endl;
134 P0 = Get<RCP<Matrix>>(coarseLevel,
"P");
135 numIts = pL.get<
int>(
"emin: num iterations");
143 if (coarseLevel.
IsAvailable(
"Constraint0",
this)) {
145 X = coarseLevel.
Get<RCP<Constraint>>(
"Constraint0",
this);
146 GetOStream(
Runtime0) <<
"Reusing Constraint0" << std::endl;
150 X = Get<RCP<Constraint>>(coarseLevel,
"Constraint");
152 GetOStream(
Runtime0) <<
"Number of emin iterations = " << numIts << std::endl;
154 std::string solverType = pL.get<std::string>(
"emin: iterative method");
155 RCP<SolverBase> solver;
156 if (solverType ==
"cg")
158 else if (solverType ==
"sd")
160 else if (solverType ==
"gmres")
164 solver->Iterate(*A, *X, *P0, P);
167 if (!P->IsView(
"stridedMaps")) {
168 if (A->IsView(
"stridedMaps") ==
true) {
169 GetOStream(
Runtime1) <<
"Using A to fillComplete P" << std::endl;
175 std::vector<size_t> stridingInfo(1, 1);
176 RCP<const StridedMap> dMap = StridedMapFactory::Build(X->GetPattern()->getDomainMap(), stridingInfo);
178 P->CreateView(
"stridedMaps", A->getRowMap(
"stridedMaps"), dMap);
181 P->CreateView(
"stridedMaps", P->getRangeMap(), P->getDomainMap());
186 if (!restrictionMode_) {
188 Set(coarseLevel,
"P", P);
190 if (pL.get<
bool>(
"Keep P0")) {
194 coarseLevel.
Keep(
"P0",
this);
195 Set(coarseLevel,
"P0", P);
197 if (pL.get<
bool>(
"Keep Constraint0")) {
201 coarseLevel.
Keep(
"Constraint0",
this);
202 Set(coarseLevel,
"Constraint0", X);
206 RCP<ParameterList> params = rcp(
new ParameterList());
207 params->set(
"printLoadBalancingInfo",
true);
208 params->set(
"printCommInfo",
true);
221 Set(coarseLevel,
"R", R);
224 RCP<ParameterList> params = rcp(
new ParameterList());
225 params->set(
"printLoadBalancingInfo",
true);
226 params->set(
"printCommInfo",
true);
#define SET_VALID_ENTRY(name)
Implements conjugate gradient algorithm for energy-minimization.
void Build(Level &fineLevel, Level &coarseLevel) const
Build method.
void BuildP(Level &fineLevel, Level &coarseLevel) const
Abstract Build method.
static Teuchos::ScalarTraits< Scalar >::magnitudeType ComputeProlongatorEnergyNorm(RCP< Xpetra::Matrix< Scalar, LocalOrdinal, GlobalOrdinal, Node > > &A, RCP< Xpetra::Matrix< Scalar, LocalOrdinal, GlobalOrdinal, Node > > &P, Teuchos::FancyOStream &out)
RCP< const ParameterList > GetValidParameterList() const
Return a const parameter list of valid parameters that setParameterList() will accept.
void DeclareInput(Level &fineLevel, Level &coarseLevel) const
Input.
Timer to be used in factories. Similar to Monitor but with additional timers.
Implements conjugate gradient algorithm for energy-minimization.
Class that holds all level-specific information.
bool IsAvailable(const std::string &ename, const FactoryBase *factory=NoFactory::get()) const
Test whether a need's value has been saved.
T & Get(const std::string &ename, const FactoryBase *factory=NoFactory::get())
Get data without decrementing associated storage counter (i.e., read-only access)....
RequestMode GetRequestMode() const
void Keep(const std::string &ename, const FactoryBase *factory)
Request to keep variable 'ename' generated by 'factory' after the setup phase.
static std::string PrintMatrixInfo(const Matrix &A, const std::string &msgTag, RCP< const Teuchos::ParameterList > params=Teuchos::null)
Implements steepest descent algorithm for energy-minimization.
Timer to be used in factories. Similar to SubMonitor but adds a timer level by level.
static RCP< Xpetra::Matrix< Scalar, LocalOrdinal, GlobalOrdinal, Node > > Transpose(Xpetra::Matrix< Scalar, LocalOrdinal, GlobalOrdinal, Node > &Op, bool optimizeTranspose=false, const std::string &label=std::string(), const Teuchos::RCP< Teuchos::ParameterList > ¶ms=Teuchos::null)
Namespace for MueLu classes and methods.
@ Statistics2
Print even more statistics.
@ Runtime0
One-liner description of what is happening.
@ Runtime1
Description of what is happening (more verbose)