46 #ifndef MUELU_STRUCTUREDAGGREGATIONFACTORY_DEF_HPP_ 
   47 #define MUELU_STRUCTUREDAGGREGATIONFACTORY_DEF_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");
 
   89 #undef  SET_VALID_ENTRY 
   91                                                  "Graph of the matrix after amalgamation but without dropping.");
 
   93                                                  "Number of spatial dimension provided by CoordinatesTransferFactory.");
 
   95                                                  "Global number of nodes per spatial dimension provided by CoordinatesTransferFactory.");
 
   97                                                  "Local number of nodes per spatial dimension provided by CoordinatesTransferFactory.");
 
   99                                                  "Generating factory for variable \'DofsPerNode\', usually the same as the \'Graph\' factory");
 
  101     return validParamList;
 
  104   template <
class Scalar, 
class LocalOrdinal, 
class GlobalOrdinal, 
class Node>
 
  107     Input(currentLevel, 
"Graph");
 
  108     Input(currentLevel, 
"DofsPerNode");
 
  111     std::string coupling = pL.
get<std::string>(
"aggregation: mode");
 
  112     const bool coupled = (coupling == 
"coupled" ? 
true : 
false);
 
  121                                      "gNodesPerDim was not provided by the user on level0!");
 
  124         Input(currentLevel, 
"gNodesPerDim");
 
  135                                    "numDimensions was not provided by the user on level0!");
 
  142                                    "lNodesPerDim was not provided by the user on level0!");
 
  145       Input(currentLevel, 
"numDimensions");
 
  146       Input(currentLevel, 
"lNodesPerDim");
 
  150   template <
class Scalar, 
class LocalOrdinal, 
class GlobalOrdinal, 
class Node>
 
  156     if(
const char* dbg = std::getenv(
"MUELU_STRUCTUREDAGGREGATION_DEBUG")) {
 
  157       out = Teuchos::fancyOStream(Teuchos::rcpFromRef(std::cout));
 
  163     *out << 
"Entering structured aggregation" << std::endl;
 
  166     bDefinitionPhase_ = 
false;  
 
  171     const int myRank           = fineMap->getComm()->getRank();
 
  172     const int numRanks         = fineMap->getComm()->getSize();
 
  173     const GO  minGlobalIndex   = fineMap->getMinGlobalIndex();
 
  174     const LO  dofsPerNode      = Get<LO>(currentLevel, 
"DofsPerNode");
 
  178     const int interpolationOrder = pL.
get<
int>(
"aggregation: coarsening order");
 
  179     std::string meshLayout       = pL.
get<std::string>(
"aggregation: mesh layout");
 
  180     std::string coupling         = pL.
get<std::string>(
"aggregation: mode");
 
  181     const bool coupled           = (coupling == 
"coupled" ? 
true : 
false);
 
  182     std::string outputType       = pL.
get<std::string>(
"aggregation: output type");
 
  183     const bool outputAggregates  = (outputType == 
"Aggregates" ? 
true : 
false);
 
  187     if(currentLevel.GetLevelID() == 0) {
 
  189       numDimensions = currentLevel.Get<
int>(
"numDimensions", 
NoFactory::get());
 
  196       numDimensions = Get<int>(currentLevel, 
"numDimensions");
 
  198         gFineNodesPerDir = Get<Array<GO> >(currentLevel, 
"gNodesPerDim");
 
  200       lFineNodesPerDir = Get<Array<LO> >(currentLevel, 
"lNodesPerDim");
 
  205     for(
int dim = 0; dim < 3; ++dim) {
 
  206       if(dim >= numDimensions) {
 
  207         gFineNodesPerDir[dim] = 1;
 
  208         lFineNodesPerDir[dim] = 1;
 
  213     std::string coarseningRate = pL.
get<std::string>(
"aggregation: coarsening rate");
 
  216       coarseRate = Teuchos::fromStringToArray<LO>(coarseningRate);
 
  218       GetOStream(
Errors,-1) << 
" *** \"aggregation: coarsening rate\" must be a string convertible into an array! *** " 
  224                                "\"aggregation: coarsening rate\" must have at least as many" 
  225                                " components as the number of spatial dimensions in the problem.");
 
  239     } 
else if(meshLayout == 
"Local Lexicographic") {
 
  241       if(currentLevel.GetLevelID() == 0) {
 
  245                                    "The meshData array is empty, somehow the input for structured" 
  246                                    " aggregation are not captured correctly.");
 
  249         meshData = Get<Array<GO> >(currentLevel, 
"aggregation: mesh data");
 
  265     } 
else  if(meshLayout == 
"Global Lexicographic") {
 
  281     *out << 
"The index manager has now been built" << std::endl;
 
  282     *out << 
"graph num nodes: " << fineMap->getNodeNumElements()
 
  287                                "The local number of elements in the graph's map is not equal to " 
  288                                "the number of nodes given by: lNodesPerDim!");
 
  293                                  "The global number of elements in the graph's map is not equal to " 
  294                                  "the number of nodes given by: gNodesPerDim!");
 
  297     *out << 
"Compute coarse mesh data" << std::endl;
 
  307     if(interpolationOrder == 0 && outputAggregates){
 
  316       myStructuredAlgorithm->BuildAggregates(pL, *graph, *aggregates, aggStat,
 
  317                                              numNonAggregatedNodes);
 
  320                                  "MueLu::StructuredAggregationFactory::Build: Leftover nodes found! Error!");
 
  323       Set(currentLevel, 
"Aggregates", aggregates);
 
  328       myStructuredAlgorithm->BuildGraph(*graph, geoData, dofsPerNode, myGraph,
 
  329                                         coarseCoordinatesFineMap, coarseCoordinatesMap);
 
  330       Set(currentLevel, 
"prolongatorGraph", myGraph);
 
  337     Set(currentLevel, 
"coarseCoordinatesFineMap", coarseCoordinatesFineMap);
 
  338     Set(currentLevel, 
"coarseCoordinatesMap", coarseCoordinatesMap);
 
  339     Set(currentLevel, 
"interpolationOrder", interpolationOrder);
 
  340     Set(currentLevel, 
"numDimensions", numDimensions);
 
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. 
virtual const RCP< const Map > GetDomainMap() const =0
void SetIndexManager(RCP< IndexManager > &geoData)
Get the index manager used by structured aggregation algorithms. 
StructuredAggregationFactory()
Constructor. 
Teuchos::ArrayRCP< LO > ComputeAggregateSizes(bool forceRecompute=false) const 
Compute sizes of aggregates. 
static const NoFactory * get()
void DeclareInput(Level ¤tLevel) const 
Input. 
Array< GO > getGlobalCoarseNodesPerDir() const 
TEUCHOS_DEPRECATED RCP< T > rcp(T *p, Dealloc_T dealloc, bool owns_mem)
LO getNumLocalFineNodes() const 
Class that holds all level-specific information. 
RCP< const ParameterList > GetValidParameterList() const 
Return a const parameter list of valid parameters that setParameterList() will accept. 
LO getNumLocalCoarseNodes() const 
virtual void setObjectLabel(const std::string &objectLabel)
basic_FancyOStream & setShowAllFrontMatter(const bool showAllFrontMatter)
virtual std::vector< std::vector< GO > > getCoarseMeshData() const =0
int GetLevelID() const 
Return level number. 
Exception throws to report errors in the internal logical of the program. 
std::string description() const 
Return a simple one-line description of this object. 
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() 
void Build(Level ¤tLevel) const 
Build aggregates. 
#define SET_VALID_ENTRY(name)
Array< LO > getLocalCoarseNodesPerDir() const 
bool IsAvailable(const std::string &ename, const FactoryBase *factory=NoFactory::get()) const 
Test whether a need's value has been saved. 
void SetNumAggregates(LO nAggregates)
Set number of local aggregates on current processor. 
GO getNumGlobalFineNodes() const