MueLu Version of the Day
Loading...
Searching...
No Matches
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>
19#include <Teuchos_DefaultMpiComm.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
27namespace MueLu {
28
29template <class Scalar, class LocalOrdinal, class GlobalOrdinal, class Node>
31
32template <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
48template <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
56template <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
65 RCP<Xpetra::Vector<GO, LO, GO, NO> > decomposition = Xpetra::VectorFactory<GO, LO, GO, NO>::Build(rowMap, true);
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).
80 RCP<Xpetra::Vector<GO, LO, GO, NO> > decomposition = Xpetra::VectorFactory<GO, LO, GO, NO>::Build(rowMap, false);
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
#define SET_VALID_ENTRY(name)
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.
Class that holds all level-specific information.
RCP< const ParameterList > GetValidParameterList() const
Return a const parameter list of valid parameters that setParameterList() will accept.
void DeclareInput(Level &currentLevel) const
Specifies the data that this class needs, and the factories that generate that data.
void Build(Level &currentLevel) const
Build an object with this factory.
Namespace for MueLu classes and methods.