10 #ifndef MUELU_EMINPFACTORY_DEF_HPP
11 #define MUELU_EMINPFACTORY_DEF_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"
29 template <
class Scalar,
class LocalOrdinal,
class GlobalOrdinal,
class Node>
33 #define SET_VALID_ENTRY(name) validParamList->setEntry(name, MasterList::getEntry(name))
40 #undef SET_VALID_ENTRY
42 validParamList->
set<
RCP<const FactoryBase> >(
"A", Teuchos::null,
"Generating factory for the matrix A used during internal iterations");
46 validParamList->
set<
RCP<Matrix> >(
"P0", Teuchos::null,
"Initial guess at P");
47 validParamList->
set<
bool>(
"Keep P0",
false,
"Keep an initial P0 (for reuse)");
49 validParamList->
set<
RCP<Constraint> >(
"Constraint0", Teuchos::null,
"Initial Constraint");
50 validParamList->
set<
bool>(
"Keep Constraint0",
false,
"Keep an initial Constraint (for reuse)");
52 return validParamList;
55 template <
class Scalar,
class LocalOrdinal,
class GlobalOrdinal,
class Node>
57 Input(fineLevel,
"A");
59 static bool isAvailableP0 =
false;
60 static bool isAvailableConstraint0 =
false;
74 isAvailableP0 = coarseLevel.
IsAvailable(
"P0",
this);
75 isAvailableConstraint0 = coarseLevel.
IsAvailable(
"Constraint0",
this);
78 if (isAvailableP0 ==
false)
79 Input(coarseLevel,
"P");
81 if (isAvailableConstraint0 ==
false)
82 Input(coarseLevel,
"Constraint");
85 template <
class Scalar,
class LocalOrdinal,
class GlobalOrdinal,
class Node>
87 BuildP(fineLevel, coarseLevel);
90 template <
class Scalar,
class LocalOrdinal,
class GlobalOrdinal,
class Node>
99 if (restrictionMode_) {
111 numIts = pL.
get<
int>(
"emin: num reuse iterations");
112 GetOStream(
Runtime0) <<
"Reusing P0" << std::endl;
116 P0 = Get<RCP<Matrix> >(coarseLevel,
"P");
117 numIts = pL.
get<
int>(
"emin: num iterations");
125 if (coarseLevel.
IsAvailable(
"Constraint0",
this)) {
128 GetOStream(
Runtime0) <<
"Reusing Constraint0" << std::endl;
132 X = Get<RCP<Constraint> >(coarseLevel,
"Constraint");
134 GetOStream(
Runtime0) <<
"Number of emin iterations = " << numIts << std::endl;
136 std::string solverType = pL.
get<std::string>(
"emin: iterative method");
138 if (solverType ==
"cg")
140 else if (solverType ==
"sd")
142 else if (solverType ==
"gmres")
146 solver->Iterate(*A, *X, *P0, P);
149 if (!P->IsView(
"stridedMaps")) {
150 if (A->IsView(
"stridedMaps") ==
true) {
151 GetOStream(
Runtime1) <<
"Using A to fillComplete P" << std::endl;
157 std::vector<size_t> stridingInfo(1, 1);
160 P->CreateView(
"stridedMaps", A->getRowMap(
"stridedMaps"), dMap);
163 P->CreateView(
"stridedMaps", P->getRangeMap(), P->getDomainMap());
168 if (!restrictionMode_) {
170 Set(coarseLevel,
"P", P);
172 if (pL.
get<
bool>(
"Keep P0")) {
176 coarseLevel.
Keep(
"P0",
this);
177 Set(coarseLevel,
"P0", P);
179 if (pL.
get<
bool>(
"Keep Constraint0")) {
183 coarseLevel.
Keep(
"Constraint0",
this);
184 Set(coarseLevel,
"Constraint0", X);
189 params->
set(
"printLoadBalancingInfo",
true);
190 params->
set(
"printCommInfo",
true);
203 Set(coarseLevel,
"R", R);
207 params->
set(
"printLoadBalancingInfo",
true);
208 params->
set(
"printCommInfo",
true);
216 #endif // MUELU_EMINPFACTORY_DEF_HPP
void Keep(const std::string &ename, const FactoryBase *factory)
Request to keep variable 'ename' generated by 'factory' after the setup phase.
#define SET_VALID_ENTRY(name)
T & Get(const std::string &ename, const FactoryBase *factory=NoFactory::get())
Get data without decrementing associated storage counter (i.e., read-only access). Usage: Level->Get< RCP<Matrix> >("A", factory) if factory == NULL => use default factory.
void Build(Level &fineLevel, Level &coarseLevel) const
Build method.
void setValidator(RCP< const ParameterEntryValidator > const &validator)
T & get(const std::string &name, T def_value)
Implements conjugate gradient algorithm for energy-minimization.
void BuildP(Level &fineLevel, Level &coarseLevel) const
Abstract Build method.
Timer to be used in factories. Similar to Monitor but with additional timers.
One-liner description of what is happening.
ParameterList & set(std::string const &name, T &&value, std::string const &docString="", RCP< const ParameterEntryValidator > const &validator=null)
RCP< const CrsGraph > GetPattern() const
Print even more statistics.
RequestMode GetRequestMode() const
Implements conjugate gradient algorithm for energy-minimization.
TEUCHOS_DEPRECATED RCP< T > rcp(T *p, Dealloc_T dealloc, bool owns_mem)
Class that holds all level-specific information.
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)
static std::string PrintMatrixInfo(const Matrix &A, const std::string &msgTag, RCP< const Teuchos::ParameterList > params=Teuchos::null)
void DeclareInput(Level &fineLevel, Level &coarseLevel) const
Input.
Implements steepest descent algorithm for energy-minimization.
Description of what is happening (more verbose)
ParameterEntry & getEntry(const std::string &name)
bool IsAvailable(const std::string &ename, const FactoryBase *factory=NoFactory::get()) const
Test whether a need's value has been saved.
RCP< const ParameterList > GetValidParameterList() const
Return a const parameter list of valid parameters that setParameterList() will accept.