MueLu  Version of the Day
 All Classes Namespaces Files Functions Variables Typedefs Enumerations Enumerator Friends Macros Groups Pages
MueLu_TwoLevelFactoryBase.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 
12 namespace MueLu {
13 
15 
18 
19 void TwoLevelFactoryBase::CallDeclareInput(Level& requestedLevel) const {
20  if (requestedLevel.GetPreviousLevel() == Teuchos::null) {
21  std::ostringstream errStr;
22  errStr << "LevelID = " << requestedLevel.GetLevelID();
23  throw Exceptions::DependencyError(errStr.str());
24  }
25  DeclareInput(*requestedLevel.GetPreviousLevel(), requestedLevel);
26 }
27 
28 void TwoLevelFactoryBase::CallBuild(Level& requestedLevel) const {
29  int levelID = requestedLevel.GetLevelID();
30 
31 #ifdef HAVE_MUELU_DEBUG
32  // We cannot call Build method twice for the same level, but we can call it multiple times for different levels
33  TEUCHOS_TEST_FOR_EXCEPTION((multipleCallCheck_ == ENABLED) && (multipleCallCheckGlobal_ == ENABLED) && (lastLevelID_ == levelID),
35  this->ShortClassName() << "::Build() called twice for the same level (levelID=" << levelID
36  << "). This is likely due to a configuration error, or calling hierarchy setup multiple times "
37  << "without resetting debug info through FactoryManager::ResetDebugData().");
38  if (multipleCallCheck_ == FIRSTCALL)
39  multipleCallCheck_ = ENABLED;
40 
41  lastLevelID_ = levelID;
42 #endif
43  TEUCHOS_TEST_FOR_EXCEPTION(requestedLevel.GetPreviousLevel() == Teuchos::null, Exceptions::RuntimeError, "LevelID = " << levelID);
44 
45  RCP<const Teuchos::Comm<int> > comm = requestedLevel.GetComm();
46  if (comm.is_null()) {
47  // Some factories are called before we constructed Ac, and therefore,
48  // before we set the level communicator. For such factories we can get
49  // the comm from the previous level, as all processes go there
50  RCP<Level>& prevLevel = requestedLevel.GetPreviousLevel();
51  if (!prevLevel.is_null())
52  comm = prevLevel->GetComm();
53  }
54 
55  int oldRank = -1;
56  if (!comm.is_null())
57  oldRank = SetProcRankVerbose(comm->getRank());
58 
59  // Synchronization timer
60  std::string syncTimer = this->ShortClassName() + ": Build sync (level=" + toString(requestedLevel.GetLevelID()) + ")";
61  if (this->timerSync_ && !comm.is_null()) {
62  TimeMonitor timer(*this, syncTimer);
63  comm->barrier();
64  }
65 
66  Build(*requestedLevel.GetPreviousLevel(), requestedLevel);
67 
68  if (this->timerSync_ && !comm.is_null()) {
69  TimeMonitor timer(*this, syncTimer);
70  comm->barrier();
71  }
72 
73  if (IsPrint(Test1))
75  else
76  RemoveFactoriesFromList(GetParameterList())->print(GetOStream(Test0), Teuchos::ParameterList::PrintOptions().indent(0).showFlags(true).showDefault(false));
77 
78  if (oldRank != -1)
79  SetProcRankVerbose(oldRank);
80 }
81 
82 } // namespace MueLu
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 CallDeclareInput(Level &requestedLevel) const
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.
static bool timerSync_
virtual void Build(Level &fineLevel, Level &coarseLevel) const =0
Build an object with this factory.
virtual ~TwoLevelFactoryBase()
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.
TwoLevelFactoryBase()
Constructor.
int GetLevelID() const
Return level number.
Definition: MueLu_Level.cpp:51
Exception throws to report errors in the internal logical of the program.
RCP< const Teuchos::Comm< int > > GetComm() const
virtual void DeclareInput(Level &fineLevel, Level &coarseLevel) const =0
Input.
virtual void CallBuild(Level &requestedLevel) const
Exception throws to report data dependency problems between factories.
bool is_null() const