MueLu  Version of the Day
 All Classes Namespaces Files Functions Variables Typedefs Enumerations Enumerator Friends Macros Groups Pages
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 
22 namespace MueLu {
23 
24 template <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 
44 template <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 
57 template <class Scalar, class LocalOrdinal, class GlobalOrdinal, class Node>
59  return BuildP(fineLevel, coarseLevel);
60 }
61 
62 template <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 
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
T & get(const std::string &name, T def_value)
Matrix-free tentative restrictor operator.
Timer to be used in factories. Similar to Monitor but with additional timers.
#define TEUCHOS_TEST_FOR_EXCEPTION(throw_exception_test, Exception, msg)
ParameterList & set(std::string const &name, T &&value, std::string const &docString="", RCP< const ParameterEntryValidator > const &validator=null)
bool isParameter(const std::string &name) const
TEUCHOS_DEPRECATED RCP< T > rcp(T *p, Dealloc_T dealloc, bool owns_mem)
Class that holds all level-specific information.
Definition: MueLu_Level.hpp:63
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.
void DeclareInput(Level &fineLevel, Level &coarseLevel) const
Input.
Exception throws to report errors in the internal logical of the program.
void Build(Level &fineLevel, Level &coarseLevel) const
Build an object with this factory.