MueLu Version of the Day
Loading...
Searching...
No Matches
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
14namespace MueLu {
15
17
19
20void 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
73 DeclareInput(requestedLevel);
74}
75
76} // namespace MueLu
77
78// TODO: code factorization between SingleLevelFactoryBase and TwoLevelFactoryBase
virtual std::string ShortClassName() const
Return the class name of the object, without template parameters and without namespace.
Exception throws to report errors in the internal logical of the program.
static bool timerSync_
RCP< ParameterList > RemoveFactoriesFromList(const ParameterList &list) const
Class that holds all level-specific information.
RCP< Level > & GetPreviousLevel()
Previous level.
RCP< const Teuchos::Comm< int > > GetComm() const
int GetLevelID() const
Return level number.
virtual const Teuchos::ParameterList & GetParameterList() const
virtual void DeclareInput(Level &currentLevel) const =0
Specifies the data that this class needs, and the factories that generate that data.
virtual ~SingleLevelFactoryBase()
Destructor.
virtual void Build(Level &currentLevel) const =0
Build an object with this factory.
SingleLevelFactoryBase()
Constructor.
virtual void CallDeclareInput(Level &requestedLevel) const
virtual void CallBuild(Level &requestedLevel) const
Integrates Teuchos::TimeMonitor with MueLu verbosity system.
Teuchos::FancyOStream & GetOStream(MsgType type, int thisProcRankOnly=0) const
Get an output stream for outputting the input message type.
int SetProcRankVerbose(int procRank) const
Set proc rank used for printing.
bool IsPrint(MsgType type, int thisProcRankOnly=-1) const
Find out whether we need to print out information for a specific message type.
Namespace for MueLu classes and methods.
@ Test0
Print factory calls.
@ Test1
Print used parameters.
std::string toString(const T &what)
Little helper function to convert non-string types to strings.