MueLu  Version of the Day
 All Classes Namespaces Files Functions Variables Typedefs Enumerations Enumerator Friends Macros Groups Pages
MueLu_SingleLevelFactoryBase.cpp
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 
11 #include "MueLu_TimeMonitor.hpp"
12 #include "MueLu_Level.hpp"
13 
14 namespace MueLu {
15 
17 
19 
20 void SingleLevelFactoryBase::CallBuild(Level& requestedLevel) const {
21 #ifdef HAVE_MUELU_DEBUG
22  // We cannot call Build method twice for the same level, but we can call it multiple times for different levels
23  int levelID = requestedLevel.GetLevelID();
24  TEUCHOS_TEST_FOR_EXCEPTION((multipleCallCheck_ == ENABLED) && (multipleCallCheckGlobal_ == ENABLED) && (lastLevelID_ == levelID),
26  this->ShortClassName() << "::Build() called twice for the same level (levelID=" << levelID
27  << "). This is likely due to a configuration error, or calling hierarchy setup multiple times "
28  << "without resetting debug info through FactoryManager::ResetDebugData().");
29  if (multipleCallCheck_ == FIRSTCALL)
30  multipleCallCheck_ = ENABLED;
31 
32  lastLevelID_ = levelID;
33 #endif
34 
35  RCP<const Teuchos::Comm<int> > comm = requestedLevel.GetComm();
36  if (comm.is_null()) {
37  // Some factories are called before we constructed Ac, and therefore,
38  // before we set the level communicator. For such factories we can get
39  // the comm from the previous level, as all processes go there
40  RCP<Level>& prevLevel = requestedLevel.GetPreviousLevel();
41  if (!prevLevel.is_null())
42  comm = prevLevel->GetComm();
43  }
44 
45  int oldRank = -1;
46  if (!comm.is_null())
47  oldRank = SetProcRankVerbose(comm->getRank());
48 
49  // Synchronization timer
50  std::string syncTimer = this->ShortClassName() + ": Build sync (level=" + toString(requestedLevel.GetLevelID()) + ")";
51  if (this->timerSync_ && !comm.is_null()) {
52  TimeMonitor timer(*this, syncTimer);
53  comm->barrier();
54  }
55 
56  Build(requestedLevel);
57 
58  if (this->timerSync_ && !comm.is_null()) {
59  TimeMonitor timer(*this, syncTimer);
60  comm->barrier();
61  }
62 
63  if (IsPrint(Test1))
65  else
66  RemoveFactoriesFromList(GetParameterList())->print(GetOStream(Test0), Teuchos::ParameterList::PrintOptions().indent(0).showFlags(true).showDefault(false));
67 
68  if (oldRank != -1)
69  SetProcRankVerbose(oldRank);
70 }
71 
72 void SingleLevelFactoryBase::CallDeclareInput(Level& requestedLevel) const {
73  DeclareInput(requestedLevel);
74 }
75 
76 } // namespace MueLu
77 
78 // TODO: code factorization between SingleLevelFactoryBase and TwoLevelFactoryBase
virtual const Teuchos::ParameterList & GetParameterList() const
Teuchos::FancyOStream & GetOStream(MsgType type, int thisProcRankOnly=0) const
Get an output stream for outputting the input message type.
Print factory calls.
std::string toString(const T &what)
Little helper function to convert non-string types to strings.
#define TEUCHOS_TEST_FOR_EXCEPTION(throw_exception_test, Exception, msg)
RCP< ParameterList > RemoveFactoriesFromList(const ParameterList &list) const
Integrates Teuchos::TimeMonitor with MueLu verbosity system.
virtual std::string ShortClassName() const
Return the class name of the object, without template parameters and without namespace.
virtual void DeclareInput(Level &currentLevel) const =0
Specifies the data that this class needs, and the factories that generate that data.
Class that holds all level-specific information.
Definition: MueLu_Level.hpp:63
bool IsPrint(MsgType type, int thisProcRankOnly=-1) const
Find out whether we need to print out information for a specific message type.
virtual void CallBuild(Level &requestedLevel) const
static bool timerSync_
SingleLevelFactoryBase()
Constructor.
virtual ~SingleLevelFactoryBase()
Destructor.
Print used parameters.
RCP< Level > & GetPreviousLevel()
Previous level.
Definition: MueLu_Level.cpp:60
int SetProcRankVerbose(int procRank) const
Set proc rank used for printing.
int GetLevelID() const
Return level number.
Definition: MueLu_Level.cpp:51
Exception throws to report errors in the internal logical of the program.
virtual void CallDeclareInput(Level &requestedLevel) const
RCP< const Teuchos::Comm< int > > GetComm() const
virtual void Build(Level &currentLevel) const =0
Build an object with this factory.
bool is_null() const