MueLu  Version of the Day
 All Classes Namespaces Files Functions Variables Typedefs Enumerations Enumerator Friends Macros Groups Pages
MueLu_NodePartitionInterface_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_NODEPARTITIONINTERFACE_DEF_HPP
11 #define MUELU_NODEPARTITIONINTERFACE_DEF_HPP
12 
13 #include <sstream>
14 #include <set>
15 
17 #if defined(HAVE_MPI)
18 #include <Teuchos_Utils.hpp>
20 #include <Teuchos_OpaqueWrapper.hpp>
21 
22 #include "MueLu_Level.hpp"
23 #include "MueLu_Exceptions.hpp"
24 #include "MueLu_Monitor.hpp"
25 #include "MueLu_MasterList.hpp"
26 
27 namespace MueLu {
28 
29 template <class Scalar, class LocalOrdinal, class GlobalOrdinal, class Node>
31 
32 template <class Scalar, class LocalOrdinal, class GlobalOrdinal, class Node>
34  RCP<ParameterList> validParamList = rcp(new ParameterList());
35 #define SET_VALID_ENTRY(name) validParamList->setEntry(name, MasterList::getEntry(name))
36  SET_VALID_ENTRY("repartition: node id");
37 #undef SET_VALID_ENTRY
38 
39  validParamList->set<RCP<const FactoryBase> >("A", Teuchos::null, "Factory of the matrix A");
40  validParamList->set<RCP<const FactoryBase> >("number of partitions", Teuchos::null, "Instance of RepartitionHeuristicFactory.");
41  validParamList->set<RCP<const FactoryBase> >("Node Comm", Teuchos::null, "Generating factory of the node level communicator");
42 
43  // We don't really need this, but we might need it on coarser levels
44  validParamList->set<RCP<const FactoryBase> >("Coordinates", Teuchos::null, "Factory of the coordinates");
45  return validParamList;
46 }
47 
48 template <class Scalar, class LocalOrdinal, class GlobalOrdinal, class Node>
50  Input(currentLevel, "A");
51  Input(currentLevel, "number of partitions");
52  Input(currentLevel, "Node Comm");
53  Input(currentLevel, "Coordinates");
54 }
55 
56 template <class Scalar, class LocalOrdinal, class GlobalOrdinal, class Node>
58  FactoryMonitor m(*this, "Build", level);
59  RCP<Matrix> A = Get<RCP<Matrix> >(level, "A");
60  RCP<const Map> rowMap = A->getRowMap();
61 
62  int numParts = Get<int>(level, "number of partitions");
63  if (numParts == 1 || numParts == -1) {
64  // Single processor, decomposition is trivial: all zeros
66  Set(level, "Partition", decomposition);
67  return;
68  }
69 
70  // Let us repartition nodally
71  RCP<const Teuchos::Comm<int> > NodeComm = Get<RCP<const Teuchos::Comm<int> > >(level, "Node Comm");
72  TEUCHOS_TEST_FOR_EXCEPTION(NodeComm.is_null(), Exceptions::RuntimeError, "MueLu::NodePartitionInterface::Build(): NodeComm is null.");
73 
74  // Get the rank (in current comm) of rank 0 in my NodeComm
75  int nodeZeroRank = A->getMap()->getComm()->getRank();
76  Teuchos::broadcast<int, int>(*NodeComm, 0, Teuchos::inOutArg(nodeZeroRank));
77 
78  // A "Partition" from a *Interface is supposed to be is a vector of length # of my rows with the partition number to which the unknown is assigned
79  // BUT, since we're bypassing remap for NodePartition, we'll return a *rank* of the guy who gets each unknown (which is what remap outputs).
81  decomposition->putScalar(Teuchos::as<GO>(nodeZeroRank));
82 
83  Set(level, "Partition", decomposition);
84 }
85 
86 } // namespace MueLu
87 
88 #endif // if defined(HAVE_MPI)
89 
90 #endif // MUELU_NODEPARTITIONINTERFACE_DEF_HPP
void DeclareInput(Level &currentLevel) const
Specifies the data that this class needs, and the factories that generate that data.
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)
RCP< const ParameterList > GetValidParameterList() const
Return a const parameter list of valid parameters that setParameterList() will accept.
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
static RCP< Vector > Build(const Teuchos::RCP< const Map > &map, bool zeroOut=true)
#define SET_VALID_ENTRY(name)
Exception throws to report errors in the internal logical of the program.
void Build(Level &currentLevel) const
Build an object with this factory.
bool is_null() const