46 #ifndef MUELU_UNCOUPLEDAGGREGATIONFACTORY_DEF_HPP_ 47 #define MUELU_UNCOUPLEDAGGREGATIONFACTORY_DEF_HPP_ 51 #include <Xpetra_Map.hpp> 52 #include <Xpetra_Vector.hpp> 53 #include <Xpetra_VectorFactory.hpp> 57 #include "MueLu_OnePtAggregationAlgorithm.hpp" 58 #include "MueLu_PreserveDirichletAggregationAlgorithm.hpp" 59 #include "MueLu_IsolatedNodeAggregationAlgorithm.hpp" 61 #include "MueLu_AggregationPhase1Algorithm.hpp" 62 #include "MueLu_AggregationPhase2aAlgorithm.hpp" 63 #include "MueLu_AggregationPhase2bAlgorithm.hpp" 64 #include "MueLu_AggregationPhase3Algorithm.hpp" 68 #include "MueLu_Aggregates.hpp" 71 #include "MueLu_AmalgamationInfo.hpp" 72 #include "MueLu_Utilities.hpp" 76 template <
class LocalOrdinal,
class GlobalOrdinal,
class Node>
78 : bDefinitionPhase_(true)
81 template <
class LocalOrdinal,
class GlobalOrdinal,
class Node>
83 RCP<ParameterList> validParamList = rcp(
new ParameterList());
88 typedef Teuchos::StringToIntegralParameterEntryValidator<int> validatorType;
89 #define SET_VALID_ENTRY(name) validParamList->setEntry(name, MasterList::getEntry(name)) 94 validParamList->getEntry(
"aggregation: ordering").setValidator(
95 rcp(
new validatorType(Teuchos::tuple<std::string>(
"natural",
"graph",
"random"),
"aggregation: ordering")));
102 #undef SET_VALID_ENTRY 105 validParamList->set< RCP<const FactoryBase> >(
"Graph", null,
"Generating factory of the graph");
106 validParamList->set< RCP<const FactoryBase> >(
"DofsPerNode", null,
"Generating factory for variable \'DofsPerNode\', usually the same as for \'Graph\'");
109 validParamList->set< std::string > (
"OnePt aggregate map name",
"",
"Name of input map for single node aggregates. (default='')");
110 validParamList->set< std::string > (
"OnePt aggregate map factory",
"",
"Generating factory of (DOF) map for single node aggregates.");
113 return validParamList;
116 template <
class LocalOrdinal,
class GlobalOrdinal,
class Node>
118 Input(currentLevel,
"Graph");
119 Input(currentLevel,
"DofsPerNode");
124 std::string mapOnePtName = pL.get<std::string>(
"OnePt aggregate map name");
125 if (mapOnePtName.length() > 0) {
126 std::string mapOnePtFactName = pL.get<std::string>(
"OnePt aggregate map factory");
127 if (mapOnePtFactName ==
"" || mapOnePtFactName ==
"NoFactory") {
130 RCP<const FactoryBase> mapOnePtFact =
GetFactory(mapOnePtFactName);
131 currentLevel.
DeclareInput(mapOnePtName, mapOnePtFact.get());
136 template <
class LocalOrdinal,
class GlobalOrdinal,
class Node>
143 if (pL.get<
int>(
"aggregation: max agg size") == -1)
144 pL.set(
"aggregation: max agg size", INT_MAX);
147 RCP<const FactoryBase> graphFact =
GetFactory(
"Graph");
164 std::string mapOnePtName = pL.get<std::string>(
"OnePt aggregate map name");
165 RCP<Map> OnePtMap = Teuchos::null;
166 if (mapOnePtName.length()) {
167 std::string mapOnePtFactName = pL.get<std::string>(
"OnePt aggregate map factory");
168 if (mapOnePtFactName ==
"" || mapOnePtFactName ==
"NoFactory") {
171 RCP<const FactoryBase> mapOnePtFact =
GetFactory(mapOnePtFactName);
172 OnePtMap = currentLevel.
Get<RCP<Map> >(mapOnePtName, mapOnePtFact.get());
176 RCP<const GraphBase> graph = Get< RCP<GraphBase> >(currentLevel,
"Graph");
179 RCP<Aggregates> aggregates = rcp(
new Aggregates(*graph));
180 aggregates->setObjectLabel(
"UC");
182 const LO numRows = graph->GetNodeNumVertices();
185 std::vector<unsigned> aggStat(numRows,
READY);
187 ArrayRCP<const bool> dirichletBoundaryMap = graph->GetBoundaryNodeMap();
188 if (dirichletBoundaryMap != Teuchos::null)
189 for (LO i = 0; i < numRows; i++)
190 if (dirichletBoundaryMap[i] ==
true)
193 LO nDofsPerNode = Get<LO>(currentLevel,
"DofsPerNode");
194 GO indexBase = graph->GetDomainMap()->getIndexBase();
195 if (OnePtMap != Teuchos::null) {
196 for (LO i = 0; i < numRows; i++) {
198 GO grid = (graph->GetDomainMap()->getGlobalElement(i)-indexBase) * nDofsPerNode + indexBase;
200 for (LO kr = 0; kr < nDofsPerNode; kr++)
201 if (OnePtMap->isNodeGlobalElement(grid + kr))
207 const RCP<const Teuchos::Comm<int> > comm = graph->GetComm();
208 GO numGlobalRows = 0;
212 LO numNonAggregatedNodes = numRows;
213 GO numGlobalAggregatedPrev = 0, numGlobalAggsPrev = 0;
214 for (
size_t a = 0; a <
algos_.size(); a++) {
215 std::string phase =
algos_[a]->description();
219 algos_[a]->BuildAggregates(pL, *graph, *aggregates, aggStat, numNonAggregatedNodes);
220 algos_[a]->SetProcRankVerbose(oldRank);
223 GO numLocalAggregated = numRows - numNonAggregatedNodes, numGlobalAggregated = 0;
224 GO numLocalAggs = aggregates->GetNumAggregates(), numGlobalAggs = 0;
225 MueLu_sumAll(comm, numLocalAggregated, numGlobalAggregated);
228 double aggPercent = 100*as<double>(numGlobalAggregated)/as<double>(numGlobalRows);
229 if (aggPercent > 99.99 && aggPercent < 100.00) {
236 GetOStream(
Statistics1) <<
" aggregated : " << (numGlobalAggregated - numGlobalAggregatedPrev) <<
" (phase), " << std::fixed
237 << std::setprecision(2) << numGlobalAggregated <<
"/" << numGlobalRows <<
" [" << aggPercent <<
"%] (total)\n" 238 <<
" remaining : " << numGlobalRows - numGlobalAggregated <<
"\n" 239 <<
" aggregates : " << numGlobalAggs-numGlobalAggsPrev <<
" (phase), " << numGlobalAggs <<
" (total)" << std::endl;
240 numGlobalAggregatedPrev = numGlobalAggregated;
241 numGlobalAggsPrev = numGlobalAggs;
245 TEUCHOS_TEST_FOR_EXCEPTION(numNonAggregatedNodes,
Exceptions::RuntimeError,
"MueLu::UncoupledAggregationFactory::Build: Leftover nodes found! Error!");
247 aggregates->AggregatesCrossProcessors(
false);
249 Set(currentLevel,
"Aggregates", aggregates);
std::vector< RCP< MueLu::AggregationAlgorithmBase< LocalOrdinal, GlobalOrdinal, Node > > > algos_
Append a new aggregation algorithm to list of aggregation algorithms.
Algorithm for coarsening a graph with uncoupled aggregation. keep special marked nodes as singleton n...
#define MueLu_sumAll(rcpComm, in, out)
T & Get(const std::string &ename, const FactoryBase *factory=NoFactory::get())
Get data without decrementing associated storage counter (i.e., read-only access). Usage: Level->Get< RCP<Matrix> >("A", factory) if factory == NULL => use default factory.
Container class for aggregation information.
Timer to be used in factories. Similar to Monitor but with additional timers.
Namespace for MueLu classes and methods.
virtual const Teuchos::ParameterList & GetParameterList() const
void DeclareInput(Level ¤tLevel) const
Input.
static const NoFactory * get()
Print statistics that do not involve significant additional computation.
Builds one-to-one aggregates for all Dirichlet boundary nodes. For some applications this might be ne...
Class that holds all level-specific information.
Timer to be used in factories. Similar to SubMonitor but adds a timer level by level.
void Set(Level &level, const std::string &varName, const T &data) const
RCP< const ParameterList > GetValidParameterList() const
Return a const parameter list of valid parameters that setParameterList() will accept.
Teuchos::FancyOStream & GetOStream(MsgType type, int thisProcRankOnly=0) const
Get an output stream for outputting the input message type.
bool IsPrint(MsgType type, int thisProcRankOnly=-1) const
Find out whether we need to print out information for a specific message type.
#define SET_VALID_ENTRY(name)
UncoupledAggregationFactory()
Constructor.
Among unaggregated points, see if we can make a reasonable size aggregate out of it.IdeaAmong unaggregated points, see if we can make a reasonable size aggregate out of it. We do this by looking at neighbors and seeing how many are unaggregated and on my processor. Loosely, base the number of new aggregates created on the percentage of unaggregated nodes.
void Build(Level ¤tLevel) const
Build aggregates.
Add leftovers to existing aggregatesIdeaIn phase 2b non-aggregated nodes are added to existing aggreg...
Algorithm for coarsening a graph with uncoupled aggregation.
Exception throws to report errors in the internal logical of the program.
Handle leftover nodes. Try to avoid singleton nodesIdeaIn phase 3 we try to stick unaggregated nodes ...
void DeclareInput(const std::string &ename, const FactoryBase *factory, const FactoryBase *requestedBy=NoFactory::get())
Callback from FactoryBase::CallDeclareInput() and FactoryBase::DeclareInput()
void Input(Level &level, const std::string &varName) const
int GetProcRankVerbose() const
Get proc rank used for printing. Do not use this information for any other purpose.
const RCP< const FactoryBase > GetFactory(const std::string &varName) const
Default implementation of FactoryAcceptor::GetFactory()