46 #ifndef MUELU_MHDRAPFACTORY_DEF_HPP
47 #define MUELU_MHDRAPFACTORY_DEF_HPP
51 #include <Xpetra_Map.hpp>
52 #include <Xpetra_MapFactory.hpp>
54 #include <Xpetra_CrsMatrixWrap.hpp>
63 template <
class Scalar,
class LocalOrdinal,
class GlobalOrdinal,
class Node>
65 : implicitTranspose_(true) {}
67 template <
class Scalar,
class LocalOrdinal,
class GlobalOrdinal,
class Node>
69 if (implicitTranspose_ ==
false) {
70 Input(coarseLevel,
"R");
71 Input(coarseLevel,
"RV");
72 Input(coarseLevel,
"RP");
73 Input(coarseLevel,
"RM");
76 Input(fineLevel,
"A");
77 Input(fineLevel,
"A00");
78 Input(fineLevel,
"A01");
79 Input(fineLevel,
"A02");
80 Input(fineLevel,
"A10");
81 Input(fineLevel,
"A11");
82 Input(fineLevel,
"A12");
83 Input(fineLevel,
"A20");
84 Input(fineLevel,
"A21");
85 Input(fineLevel,
"A22");
87 Input(coarseLevel,
"P");
88 Input(coarseLevel,
"PV");
89 Input(coarseLevel,
"PP");
90 Input(coarseLevel,
"PM");
93 template <
class Scalar,
class LocalOrdinal,
class GlobalOrdinal,
class Node>
107 RCP<Matrix> A00 = Get<RCP<Matrix> >(fineLevel,
"A00");
108 RCP<Matrix> A01 = Get<RCP<Matrix> >(fineLevel,
"A01");
109 RCP<Matrix> A02 = Get<RCP<Matrix> >(fineLevel,
"A02");
110 RCP<Matrix> A10 = Get<RCP<Matrix> >(fineLevel,
"A10");
111 RCP<Matrix> A11 = Get<RCP<Matrix> >(fineLevel,
"A11");
112 RCP<Matrix> A12 = Get<RCP<Matrix> >(fineLevel,
"A12");
113 RCP<Matrix> A20 = Get<RCP<Matrix> >(fineLevel,
"A20");
114 RCP<Matrix> A21 = Get<RCP<Matrix> >(fineLevel,
"A21");
115 RCP<Matrix> A22 = Get<RCP<Matrix> >(fineLevel,
"A22");
117 RCP<Matrix> P = Get<RCP<Matrix> >(coarseLevel,
"P");
118 RCP<Matrix> PV = Get<RCP<Matrix> >(coarseLevel,
"PV");
119 RCP<Matrix> PP = Get<RCP<Matrix> >(coarseLevel,
"PP");
120 RCP<Matrix> PM = Get<RCP<Matrix> >(coarseLevel,
"PM");
140 AP = Utils::Multiply(*A,
false, *P,
false, AP, GetOStream(
Statistics2));
141 AP00 = Utils::Multiply(*A00,
false, *PV,
false, AP00, GetOStream(
Statistics2));
142 AP01 = Utils::Multiply(*A01,
false, *PP,
false, AP01, GetOStream(
Statistics2));
143 AP02 = Utils::Multiply(*A02,
false, *PM,
false, AP02, GetOStream(
Statistics2));
144 AP10 = Utils::Multiply(*A10,
false, *PV,
false, AP10, GetOStream(
Statistics2));
145 AP11 = Utils::Multiply(*A11,
false, *PP,
false, AP11, GetOStream(
Statistics2));
146 AP12 = Utils::Multiply(*A12,
false, *PM,
false, AP12, GetOStream(
Statistics2));
147 AP20 = Utils::Multiply(*A20,
false, *PV,
false, AP20, GetOStream(
Statistics2));
148 AP21 = Utils::Multiply(*A21,
false, *PP,
false, AP21, GetOStream(
Statistics2));
149 AP22 = Utils::Multiply(*A22,
false, *PM,
false, AP22, GetOStream(
Statistics2));
163 if (implicitTranspose_) {
166 Ac = Utils::Multiply(*P,
true, *AP,
false, Ac, GetOStream(
Statistics2));
167 Ac00 = Utils::Multiply(*PV,
true, *AP00,
false, Ac00, GetOStream(
Statistics2));
168 Ac01 = Utils::Multiply(*PV,
true, *AP01,
false, Ac01, GetOStream(
Statistics2));
169 Ac02 = Utils::Multiply(*PV,
true, *AP02,
false, Ac02, GetOStream(
Statistics2));
170 Ac10 = Utils::Multiply(*PP,
true, *AP10,
false, Ac10, GetOStream(
Statistics2));
171 Ac11 = Utils::Multiply(*PP,
true, *AP11,
false, Ac11, GetOStream(
Statistics2));
172 Ac12 = Utils::Multiply(*PP,
true, *AP12,
false, Ac12, GetOStream(
Statistics2));
173 Ac20 = Utils::Multiply(*PM,
true, *AP20,
false, Ac20, GetOStream(
Statistics2));
174 Ac21 = Utils::Multiply(*PM,
true, *AP21,
false, Ac21, GetOStream(
Statistics2));
175 Ac22 = Utils::Multiply(*PM,
true, *AP22,
false, Ac22, GetOStream(
Statistics2));
180 RCP<Matrix> R = Get<RCP<Matrix> >(coarseLevel,
"R");
181 RCP<Matrix> RV = Get<RCP<Matrix> >(coarseLevel,
"RV");
182 RCP<Matrix> RP = Get<RCP<Matrix> >(coarseLevel,
"RP");
183 RCP<Matrix> RM = Get<RCP<Matrix> >(coarseLevel,
"RM");
185 Ac = Utils::Multiply(*R,
false, *AP,
false, Ac, GetOStream(
Statistics2));
186 Ac00 = Utils::Multiply(*RV,
false, *AP00,
false, Ac00, GetOStream(
Statistics2));
187 Ac01 = Utils::Multiply(*RV,
false, *AP01,
false, Ac01, GetOStream(
Statistics2));
188 Ac02 = Utils::Multiply(*RV,
false, *AP02,
false, Ac02, GetOStream(
Statistics2));
189 Ac10 = Utils::Multiply(*RP,
false, *AP10,
false, Ac10, GetOStream(
Statistics2));
190 Ac11 = Utils::Multiply(*RP,
false, *AP11,
false, Ac11, GetOStream(
Statistics2));
191 Ac12 = Utils::Multiply(*RP,
false, *AP12,
false, Ac12, GetOStream(
Statistics2));
192 Ac20 = Utils::Multiply(*RM,
false, *AP20,
false, Ac20, GetOStream(
Statistics2));
193 Ac21 = Utils::Multiply(*RM,
false, *AP21,
false, Ac21, GetOStream(
Statistics2));
194 Ac22 = Utils::Multiply(*RM,
false, *AP22,
false, Ac22, GetOStream(
Statistics2));
198 Set(coarseLevel,
"A", Ac);
199 Set(coarseLevel,
"A00", Ac00);
200 Set(coarseLevel,
"A01", Ac01);
201 Set(coarseLevel,
"A02", Ac02);
202 Set(coarseLevel,
"A10", Ac10);
203 Set(coarseLevel,
"A11", Ac11);
204 Set(coarseLevel,
"A12", Ac12);
205 Set(coarseLevel,
"A20", Ac20);
206 Set(coarseLevel,
"A21", Ac21);
207 Set(coarseLevel,
"A22", Ac22);
223 template <
class Scalar,
class LocalOrdinal,
class GlobalOrdinal,
class Node>
225 std::stringstream ss(std::stringstream::out);
231 size_t numMyNnz = Ac.getLocalNumEntries();
236 MueLu_minAll(comm, (
GO)((numMyNnz > 0) ? numMyNnz : maxNnz), minNnz);
237 double imbalance = ((double)maxNnz) / minNnz;
239 size_t numMyRows = Ac.getLocalNumRows();
241 GO numActiveProcesses = 0;
242 MueLu_sumAll(comm, (
GO)((numMyRows > 0) ? 1 : 0), numActiveProcesses);
245 GO minNumRows, maxNumRows;
248 MueLu_minAll(comm, (
GO)((numMyRows > 0) ? numMyRows : maxNumRows), minNumRows);
249 assert(numActiveProcesses > 0);
250 avgNumRows = Ac.getGlobalNumRows() / numActiveProcesses;
252 ss << msgTag <<
" # processes with rows = " << numActiveProcesses << std::endl;
253 ss << msgTag <<
" min # rows per proc = " << minNumRows <<
", max # rows per proc = " << maxNumRows <<
", avg # rows per proc = " << avgNumRows << std::endl;
254 ss << msgTag <<
" nonzero imbalance = " << imbalance << std::endl;
261 #define MUELU_MHDRAPFACTORY_SHORT
262 #endif // MUELU_MHDRAPFACTORY_DEF_HPP
#define MueLu_sumAll(rcpComm, in, out)
#define MueLu_maxAll(rcpComm, in, out)
Timer to be used in factories. Similar to Monitor but with additional timers.
void Build(Level &fineLevel, Level &coarseLevel) const
Build an object with this factory.
#define MueLu_minAll(rcpComm, in, out)
Print even more statistics.
Class that holds all level-specific information.
static std::string PrintLoadBalancingInfo(const Matrix &Ac, const std::string &msgTag)
Timer to be used in factories. Similar to SubMonitor but adds a timer level by level.
void DeclareInput(Level &fineLevel, Level &coarseLevel) const
Input.