MueLu Version of the Day
Loading...
Searching...
No Matches
MueLu_MatrixFreeTentativePFactory_def.hpp
Go to the documentation of this file.
1// @HEADER
2// *****************************************************************************
3// MueLu: A package for multigrid based preconditioning
4//
5// Copyright 2012 NTESS and the MueLu contributors.
6// SPDX-License-Identifier: BSD-3-Clause
7// *****************************************************************************
8// @HEADER
9
10#ifndef MUELU_MATRIXFREETENTATIVEPFACTORY_DEF_HPP
11#define MUELU_MATRIXFREETENTATIVEPFACTORY_DEF_HPP
12
13#include "Kokkos_UnorderedMap.hpp"
14
16
17#include "MueLu_Aggregates.hpp"
18#include "MueLu_AmalgamationInfo.hpp"
19#include "MueLu_Monitor.hpp"
20#include "MueLu_MatrixFreeTentativeP.hpp"
21
22namespace MueLu {
23
24template <class Scalar, class LocalOrdinal, class GlobalOrdinal, class Node>
26 RCP<ParameterList> validParamList = rcp(new ParameterList());
27
28 validParamList->set<RCP<const FactoryBase>>("A", Teuchos::null, "Generating factory of the matrix A");
29 validParamList->set<RCP<const FactoryBase>>("Aggregates", Teuchos::null, "Generating factory of the aggregates");
30 validParamList->set<RCP<const FactoryBase>>("Nullspace", Teuchos::null, "Generating factory of the nullspace");
31 validParamList->set<RCP<const FactoryBase>>("Scaled Nullspace", Teuchos::null, "Generating factory of the scaled nullspace");
32 validParamList->set<RCP<const FactoryBase>>("UnAmalgamationInfo", Teuchos::null, "Generating factory of UnAmalgamationInfo");
33 validParamList->set<RCP<const FactoryBase>>("CoarseMap", Teuchos::null, "Generating factory of the coarse map");
34 validParamList->set<RCP<const FactoryBase>>("Coordinates", Teuchos::null, "Generating factory of the coordinates");
35
36 // Make sure we don't recursively validate options for the matrixmatrix kernels
37 ParameterList norecurse;
38 norecurse.disableRecursiveValidation();
39 validParamList->set<ParameterList>("matrixmatrix: kernel params", norecurse, "MatrixMatrix kernel parameters");
40
41 return validParamList;
42}
43
44template <class Scalar, class LocalOrdinal, class GlobalOrdinal, class Node>
46 const ParameterList& pL = GetParameterList();
47 // NOTE: This guy can only either be 'Nullspace' or 'Scaled Nullspace' or else the validator above will cause issues
48 std::string nspName = "Nullspace";
49 if (pL.isParameter("Nullspace name")) nspName = pL.get<std::string>("Nullspace name");
50
51 Input(fineLevel, "Aggregates");
52 Input(fineLevel, nspName);
53 Input(fineLevel, "UnAmalgamationInfo");
54 Input(fineLevel, "CoarseMap");
55}
56
57template <class Scalar, class LocalOrdinal, class GlobalOrdinal, class Node>
59 return BuildP(fineLevel, coarseLevel);
60}
61
62template <class Scalar, class LocalOrdinal, class GlobalOrdinal, class Node>
64 FactoryMonitor m(*this, "Build", coarseLevel);
65
66 const ParameterList& pL = GetParameterList();
67 std::string nspName = "Nullspace";
68 if (pL.isParameter("Nullspace name")) nspName = pL.get<std::string>("Nullspace name");
69
70 auto aggregates = Get<RCP<Aggregates>>(fineLevel, "Aggregates");
71 auto amalgInfo = Get<RCP<AmalgamationInfo>>(fineLevel, "UnAmalgamationInfo");
72 auto fineNullspace = Get<RCP<MultiVector>>(fineLevel, nspName);
73 auto coarseMap = Get<RCP<const Map>>(fineLevel, "CoarseMap");
74 Teuchos::RCP<const Map> fineMap = fineNullspace->getMap();
75
76 // Matrix-free should never run with aggregates that cross processors
77 if (aggregates->AggregatesCrossProcessors())
78 TEUCHOS_TEST_FOR_EXCEPTION(true, Exceptions::RuntimeError, "MatrixFreeTentativePFactory does not support aggregates that cross processors!");
79
80 size_t NSDim = fineNullspace->getNumVectors();
81 RCP<MultiVector> coarseNullspace = MultiVectorFactory::Build(coarseMap, NSDim);
82
83 Teuchos::RCP<Operator> P = Teuchos::rcp(new MatrixFreeTentativeP<Scalar, LocalOrdinal, GlobalOrdinal, Node>(coarseMap, fineMap, aggregates));
84 P->apply(*fineNullspace, *coarseNullspace, Teuchos::TRANS, 1.0, 0.0); // coarse = alpha*R*fine + beta*coarse
85
86 Set(coarseLevel, "Nullspace", coarseNullspace);
87 Set(coarseLevel, "P", P);
88}
89
90} // namespace MueLu
91
92#define MUELU_MATRIXFREETENTATIVEPFACTORY_SHORT
93#endif // MUELU_MATRIXFREETENTATIVEPFACTORY_DEF_HPP
Exception throws to report errors in the internal logical of the program.
Timer to be used in factories. Similar to Monitor but with additional timers.
void Input(Level &level, const std::string &varName) const
T Get(Level &level, const std::string &varName) const
void Set(Level &level, const std::string &varName, const T &data) const
Class that holds all level-specific information.
void Build(Level &fineLevel, Level &coarseLevel) const
Build an object with this factory.
void DeclareInput(Level &fineLevel, Level &coarseLevel) const
Input.
void BuildP(Level &fineLevel, Level &coarseLevel) const
Abstract Build method.
RCP< const ParameterList > GetValidParameterList() const
Return a const parameter list of valid parameters that setParameterList() will accept.
Matrix-free tentative restrictor operator.
virtual const Teuchos::ParameterList & GetParameterList() const
Namespace for MueLu classes and methods.