46 #ifndef MUELU_STRUCTUREDAGGREGATIONFACTORY_DEF_HPP_ 47 #define MUELU_STRUCTUREDAGGREGATIONFACTORY_DEF_HPP_ 49 #include <Xpetra_Map.hpp> 50 #include <Xpetra_CrsGraph.hpp> 52 #include "MueLu_AggregationStructuredAlgorithm.hpp" 55 #include "MueLu_Aggregates.hpp" 58 #include "MueLu_Utilities.hpp" 59 #include "MueLu_UncoupledIndexManager.hpp" 60 #include "MueLu_LocalLexicographicIndexManager.hpp" 61 #include "MueLu_GlobalLexicographicIndexManager.hpp" 67 template <
class Scalar,
class LocalOrdinal,
class GlobalOrdinal,
class Node>
72 template <
class Scalar,
class LocalOrdinal,
class GlobalOrdinal,
class Node>
77 #define SET_VALID_ENTRY(name) validParamList->setEntry(name, MasterList::getEntry(name)) 80 SET_VALID_ENTRY(
"aggregation: error on nodes with no on-rank neighbors");
81 #undef SET_VALID_ENTRY 84 validParamList->
set<std::string> (
"aggregation: mesh layout",
"Global Lexicographic",
85 "Type of mesh ordering");
86 validParamList->
set<std::string> (
"aggregation: coupling",
"coupled",
87 "aggregation coupling mode: coupled or uncoupled");
88 validParamList->
set<std::string> (
"aggregation: output type",
"Aggregates",
89 "Type of object holding the aggregation data: Aggregtes or CrsGraph");
90 validParamList->
set<std::string> (
"aggregation: coarsening rate",
"{3}",
91 "Coarsening rate per spatial dimensions");
92 validParamList->
set<
int> (
"aggregation: number of spatial dimensions", 3,
93 "The number of spatial dimensions in the problem");
94 validParamList->
set<
int> (
"aggregation: coarsening order", 0,
95 "The interpolation order used to construct grid transfer operators based off these aggregates.");
98 "Mesh ordering associated data");
101 "Graph of the matrix after amalgamation but without dropping.");
103 "Number of nodes per spatial dimmension provided by CoordinatesTransferFactory.");
105 "Number of nodes per spatial dimmension provided by CoordinatesTransferFactory.");
107 return validParamList;
110 template <
class Scalar,
class LocalOrdinal,
class GlobalOrdinal,
class Node>
113 Input(currentLevel,
"Graph");
116 std::string coupling = pL.
get<std::string>(
"aggregation: coupling");
117 const bool coupled = (coupling ==
"coupled" ? true :
false);
126 "gNodesPerDim was not provided by the user on level0!");
129 Input(currentLevel,
"gNodesPerDim");
140 "lNodesPerDim was not provided by the user on level0!");
143 Input(currentLevel,
"lNodesPerDim");
147 template <
class Scalar,
class LocalOrdinal,
class GlobalOrdinal,
class Node>
153 if(
const char* dbg = std::getenv(
"MUELU_STRUCTUREDAGGREGATION_DEBUG")) {
154 out = Teuchos::fancyOStream(Teuchos::rcpFromRef(std::cout));
160 *out <<
"Entering structured aggregation" << std::endl;
163 bDefinitionPhase_ =
false;
168 const int myRank = fineMap->getComm()->getRank();
169 const int numRanks = fineMap->getComm()->getSize();
170 const GO minGlobalIndex = fineMap->getMinGlobalIndex();
174 const int numDimensions = pL.
get<
int>(
"aggregation: number of spatial dimensions");
175 const int interpolationOrder = pL.
get<
int>(
"aggregation: coarsening order");
176 std::string meshLayout = pL.
get<std::string>(
"aggregation: mesh layout");
177 std::string coupling = pL.
get<std::string>(
"aggregation: coupling");
178 const bool coupled = (coupling ==
"coupled" ? true :
false);
179 std::string outputType = pL.
get<std::string>(
"aggregation: output type");
180 const bool outputAggregates = (outputType ==
"Aggregates" ? true :
false);
183 if(currentLevel.GetLevelID() == 0) {
192 gFineNodesPerDir = Get<Array<GO> >(currentLevel,
"gNodesPerDim");
194 lFineNodesPerDir = Get<Array<LO> >(currentLevel,
"lNodesPerDim");
199 for(
int dim = 0; dim < 3; ++dim) {
200 if(dim >= numDimensions) {
201 gFineNodesPerDir[dim] = 1;
202 lFineNodesPerDir[dim] = 1;
207 std::string coarseningRate = pL.
get<std::string>(
"aggregation: coarsening rate");
210 coarseRate = Teuchos::fromStringToArray<LO>(coarseningRate);
212 GetOStream(
Errors,-1) <<
" *** \"aggregation: coarsening rate\" must be a string convertible into an array! *** " 218 "\"aggregation: coarsening rate\" must have at least as many" 219 " components as the number of spatial dimensions in the problem.");
233 }
else if(meshLayout ==
"Local Lexicographic") {
235 if(currentLevel.GetLevelID() == 0) {
239 "The meshData array is empty, somehow the input for structured" 240 " aggregation are not captured correctly.");
243 meshData = Get<Array<GO> >(currentLevel,
"aggregation: mesh data");
259 }
else if(meshLayout ==
"Global Lexicographic") {
275 *out <<
"The index manager has now been built" << std::endl;
279 "The local number of elements in the graph's map is not equal to " 280 "the number of nodes given by: lNodesPerDim!");
285 "The global number of elements in the graph's map is not equal to " 286 "the number of nodes given by: gNodesPerDim!");
289 *out <<
"Compute coarse mesh data" << std::endl;
299 if(interpolationOrder == 0 && outputAggregates){
308 myStructuredAlgorithm->BuildAggregates(pL, *graph, *aggregates, aggStat,
309 numNonAggregatedNodes);
312 "MueLu::StructuredAggregationFactory::Build: Leftover nodes found! Error!");
315 Set(currentLevel,
"Aggregates", aggregates);
320 myStructuredAlgorithm->BuildGraph(*graph, geoData, myGraph, coarseCoordinatesFineMap,
321 coarseCoordinatesMap);
322 Set(currentLevel,
"prolongatorGraph", myGraph);
329 Set(currentLevel,
"coarseCoordinatesFineMap", coarseCoordinatesFineMap);
330 Set(currentLevel,
"coarseCoordinatesMap", coarseCoordinatesMap);
331 Set(currentLevel,
"interpolationOrder", interpolationOrder);
332 Set(currentLevel,
"numDimensions", numDimensions);
std::string description() const
Return a simple one-line description of this object.
GO getNumGlobalFineNodes() const
void Build(Level ¤tLevel) const
Build aggregates.
Container class for aggregation information.
basic_FancyOStream & setShowProcRank(const bool showProcRank)
T & get(const std::string &name, T def_value)
ParameterList & set(std::string const &name, T const &value, std::string const &docString="", RCP< const ParameterEntryValidator > const &validator=null)
Timer to be used in factories. Similar to Monitor but with additional timers.
#define TEUCHOS_TEST_FOR_EXCEPTION(throw_exception_test, Exception, msg)
Algorithm for coarsening a graph with structured aggregation.
void DeclareInput(Level ¤tLevel) const
Input.
virtual const RCP< const Map > GetDomainMap() const =0
LO getNumLocalCoarseNodes() const
Namespace for MueLu classes and methods.
void SetIndexManager(RCP< IndexManager > &geoData)
Get the index manager used by structured aggregation algorithms.
StructuredAggregationFactory()
Constructor.
static const NoFactory * get()
Array< LO > getLocalCoarseNodesPerDir() const
LO getNumLocalFineNodes() const
int GetLevelID() const
Return level number.
TEUCHOS_DEPRECATED RCP< T > rcp(T *p, Dealloc_T dealloc, bool owns_mem)
RCP< const ParameterList > GetValidParameterList() const
Return a const parameter list of valid parameters that setParameterList() will accept.
Class that holds all level-specific information.
virtual void setObjectLabel(const std::string &objectLabel)
basic_FancyOStream & setShowAllFrontMatter(const bool showAllFrontMatter)
virtual std::vector< std::vector< GO > > getCoarseMeshData() const =0
Array< GO > getGlobalCoarseNodesPerDir() const
bool IsAvailable(const std::string &ename, const FactoryBase *factory=NoFactory::get()) const
Test whether a need's value has been saved.
Exception throws to report errors in the internal logical of the program.
void AggregatesCrossProcessors(const bool &flag)
Record whether aggregates include DOFs from other processes.
void DeclareInput(const std::string &ename, const FactoryBase *factory, const FactoryBase *requestedBy=NoFactory::get())
Callback from FactoryBase::CallDeclareInput() and FactoryBase::DeclareInput()
#define SET_VALID_ENTRY(name)
Teuchos::ArrayRCP< LO > ComputeAggregateSizes(bool forceRecompute=false) const
Compute sizes of aggregates.
void SetNumAggregates(LO nAggregates)
Set number of local aggregates on current processor.