81 const bool doTranspose =
true;
82 const bool doFillComplete =
true;
83 const bool doOptimizeStorage =
true;
87 std::ostringstream levelstr;
92 "MueLu::RAPFactory::Build(): CallDeclareInput has not been called before Build!");
99 if (P == Teuchos::null) {
101 Set(coarseLevel,
"A", Ac);
105 bool isEpetra = A->getRowMap()->lib() == Xpetra::UseEpetra;
107#ifdef KOKKOS_ENABLE_CUDA
108 (
typeid(
Node).name() ==
typeid(Tpetra::KokkosCompat::KokkosCudaWrapperNode).name()) ||
110#ifdef KOKKOS_ENABLE_HIP
111 (
typeid(
Node).name() ==
typeid(Tpetra::KokkosCompat::KokkosHIPWrapperNode).name()) ||
113#ifdef KOKKOS_ENABLE_SYCL
114 (
typeid(
Node).name() ==
typeid(Tpetra::KokkosCompat::KokkosSYCLWrapperNode).name()) ||
118 if (pL.get<
bool>(
"rap: triple product") ==
false || isEpetra || isGPU) {
119 if (pL.get<
bool>(
"rap: triple product") && isEpetra)
120 GetOStream(
Warnings1) <<
"Switching from triple product to R x (A x P) since triple product has not been implemented for Epetra.\n";
121#if defined(KOKKOS_ENABLE_CUDA) || defined(KOKKOS_ENABLE_HIP) || defined(KOKKOS_ENABLE_SYCL)
122 if (pL.get<
bool>(
"rap: triple product") && isGPU)
123 GetOStream(
Warnings1) <<
"Switching from triple product to R x (A x P) since triple product has not been implemented for "
124 << Node::execution_space::name() << std::endl;
128 RCP<ParameterList> APparams = rcp(
new ParameterList);
129 if (pL.isSublist(
"matrixmatrix: kernel params"))
130 APparams = rcp(
new ParameterList(pL.sublist(
"matrixmatrix: kernel params")));
133 APparams->set(
"compute global constants: temporaries", APparams->get(
"compute global constants: temporaries",
false));
134 APparams->set(
"compute global constants", APparams->get(
"compute global constants",
false));
136 if (coarseLevel.IsAvailable(
"AP reuse data",
this)) {
139 APparams = coarseLevel.Get<RCP<ParameterList> >(
"AP reuse data",
this);
141 if (APparams->isParameter(
"graph"))
142 AP = APparams->get<RCP<Matrix> >(
"graph");
149 doFillComplete, doOptimizeStorage, labelstr + std::string(
"MueLu::A*P-") + levelstr.str(), APparams);
153 RCP<ParameterList> RAPparams = rcp(
new ParameterList);
154 if (pL.isSublist(
"matrixmatrix: kernel params"))
155 RAPparams = rcp(
new ParameterList(pL.sublist(
"matrixmatrix: kernel params")));
157 if (coarseLevel.IsAvailable(
"RAP reuse data",
this)) {
160 RAPparams = coarseLevel.Get<RCP<ParameterList> >(
"RAP reuse data",
this);
162 if (RAPparams->isParameter(
"graph"))
163 Ac = RAPparams->get<RCP<Matrix> >(
"graph");
167 Ac->SetMaxEigenvalueEstimate(-Teuchos::ScalarTraits<SC>::one());
171 RAPparams->set(
"compute global constants: temporaries", RAPparams->get(
"compute global constants: temporaries",
false));
172 RAPparams->set(
"compute global constants",
true);
178 if (pL.get<
bool>(
"transpose: use implicit") ==
true) {
182 doFillComplete, doOptimizeStorage, labelstr + std::string(
"MueLu::R*(AP)-implicit-") + levelstr.str(), RAPparams);
190 doFillComplete, doOptimizeStorage, labelstr + std::string(
"MueLu::R*(AP)-explicit-") + levelstr.str(), RAPparams);
193 Teuchos::ArrayView<const double> relativeFloor = pL.get<Teuchos::Array<double> >(
"rap: relative diagonal floor")();
194 if (relativeFloor.size() > 0) {
195 Xpetra::MatrixUtils<SC, LO, GO, NO>::RelativeDiagonalBoost(Ac, relativeFloor,
GetOStream(
Statistics2));
198 bool repairZeroDiagonals = pL.get<
bool>(
"RepairMainDiagonal") || pL.get<
bool>(
"rap: fix zero diagonals");
199 bool checkAc = pL.get<
bool>(
"CheckMainDiagonal") || pL.get<
bool>(
"rap: fix zero diagonals");
201 if (checkAc || repairZeroDiagonals) {
202 using magnitudeType =
typename Teuchos::ScalarTraits<Scalar>::magnitudeType;
203 magnitudeType threshold;
204 if (pL.isType<magnitudeType>(
"rap: fix zero diagonals threshold"))
205 threshold = pL.get<magnitudeType>(
"rap: fix zero diagonals threshold");
207 threshold = Teuchos::as<magnitudeType>(pL.get<
double>(
"rap: fix zero diagonals threshold"));
208 Scalar replacement = Teuchos::as<Scalar>(pL.get<
double>(
"rap: fix zero diagonals replacement"));
209 Xpetra::MatrixUtils<SC, LO, GO, NO>::CheckRepairMainDiagonal(Ac, repairZeroDiagonals,
GetOStream(
Warnings1), threshold, replacement);
213 RCP<ParameterList> params = rcp(
new ParameterList());
215 params->set(
"printLoadBalancingInfo",
true);
216 params->set(
"printCommInfo",
true);
221 std::ostringstream oss;
222 oss <<
"A_" << coarseLevel.GetLevelID();
223 Ac->setObjectLabel(oss.str());
225 Set(coarseLevel,
"A", Ac);
228 APparams->set(
"graph", AP);
229 Set(coarseLevel,
"AP reuse data", APparams);
232 RAPparams->set(
"graph", Ac);
233 Set(coarseLevel,
"RAP reuse data", RAPparams);
236 RCP<ParameterList> RAPparams = rcp(
new ParameterList);
237 if (pL.isSublist(
"matrixmatrix: kernel params"))
238 RAPparams->sublist(
"matrixmatrix: kernel params") = pL.sublist(
"matrixmatrix: kernel params");
240 if (coarseLevel.IsAvailable(
"RAP reuse data",
this)) {
243 RAPparams = coarseLevel.Get<RCP<ParameterList> >(
"RAP reuse data",
this);
245 if (RAPparams->isParameter(
"graph"))
246 Ac = RAPparams->get<RCP<Matrix> >(
"graph");
250 Ac->SetMaxEigenvalueEstimate(-Teuchos::ScalarTraits<SC>::one());
254 RAPparams->set(
"compute global constants: temporaries", RAPparams->get(
"compute global constants: temporaries",
false));
255 RAPparams->set(
"compute global constants",
true);
257 if (pL.get<
bool>(
"transpose: use implicit") ==
true) {
258 Ac = MatrixFactory::Build(P->getDomainMap(), Teuchos::as<LO>(0));
262 Xpetra::TripleMatrixMultiply<SC, LO, GO, NO>::
263 MultiplyRAP(*P, doTranspose, *A, !doTranspose, *P, !doTranspose, *Ac, doFillComplete,
264 doOptimizeStorage, labelstr + std::string(
"MueLu::R*A*P-implicit-") + levelstr.str(),
268 Ac = MatrixFactory::Build(R->getRowMap(), Teuchos::as<LO>(0));
272 Xpetra::TripleMatrixMultiply<SC, LO, GO, NO>::
273 MultiplyRAP(*R, !doTranspose, *A, !doTranspose, *P, !doTranspose, *Ac, doFillComplete,
274 doOptimizeStorage, labelstr + std::string(
"MueLu::R*A*P-explicit-") + levelstr.str(),
278 Teuchos::ArrayView<const double> relativeFloor = pL.get<Teuchos::Array<double> >(
"rap: relative diagonal floor")();
279 if (relativeFloor.size() > 0) {
280 Xpetra::MatrixUtils<SC, LO, GO, NO>::RelativeDiagonalBoost(Ac, relativeFloor,
GetOStream(
Statistics2));
283 bool repairZeroDiagonals = pL.get<
bool>(
"RepairMainDiagonal") || pL.get<
bool>(
"rap: fix zero diagonals");
284 bool checkAc = pL.get<
bool>(
"CheckMainDiagonal") || pL.get<
bool>(
"rap: fix zero diagonals");
286 if (checkAc || repairZeroDiagonals) {
287 using magnitudeType =
typename Teuchos::ScalarTraits<Scalar>::magnitudeType;
288 magnitudeType threshold;
289 if (pL.isType<magnitudeType>(
"rap: fix zero diagonals threshold"))
290 threshold = pL.get<magnitudeType>(
"rap: fix zero diagonals threshold");
292 threshold = Teuchos::as<magnitudeType>(pL.get<
double>(
"rap: fix zero diagonals threshold"));
293 Scalar replacement = Teuchos::as<Scalar>(pL.get<
double>(
"rap: fix zero diagonals replacement"));
294 Xpetra::MatrixUtils<SC, LO, GO, NO>::CheckRepairMainDiagonal(Ac, repairZeroDiagonals,
GetOStream(
Warnings1), threshold, replacement);
298 RCP<ParameterList> params = rcp(
new ParameterList());
300 params->set(
"printLoadBalancingInfo",
true);
301 params->set(
"printCommInfo",
true);
306 std::ostringstream oss;
307 oss <<
"A_" << coarseLevel.GetLevelID();
308 Ac->setObjectLabel(oss.str());
310 Set(coarseLevel,
"A", Ac);
313 RAPparams->set(
"graph", Ac);
314 Set(coarseLevel,
"RAP reuse data", RAPparams);
319#ifdef HAVE_MUELU_DEBUG
320 MatrixUtils::checkLocalRowMapMatchesColMap(*Ac);
328 RCP<const FactoryBase> fac = *it;
329 GetOStream(
Runtime0) <<
"RAPFactory: call transfer factory: " << fac->description() << std::endl;
330 fac->CallBuild(coarseLevel);