MueLu  Version of the Day
 All Classes Namespaces Files Functions Variables Typedefs Enumerations Enumerator Friends Macros Groups Pages
MueLu_SingleLevelFactoryBase.hpp
Go to the documentation of this file.
1 // @HEADER
2 //
3 // ***********************************************************************
4 //
5 // MueLu: A package for multigrid based preconditioning
6 // Copyright 2012 Sandia Corporation
7 //
8 // Under the terms of Contract DE-AC04-94AL85000 with Sandia Corporation,
9 // the U.S. Government retains certain rights in this software.
10 //
11 // Redistribution and use in source and binary forms, with or without
12 // modification, are permitted provided that the following conditions are
13 // met:
14 //
15 // 1. Redistributions of source code must retain the above copyright
16 // notice, this list of conditions and the following disclaimer.
17 //
18 // 2. Redistributions in binary form must reproduce the above copyright
19 // notice, this list of conditions and the following disclaimer in the
20 // documentation and/or other materials provided with the distribution.
21 //
22 // 3. Neither the name of the Corporation nor the names of the
23 // contributors may be used to endorse or promote products derived from
24 // this software without specific prior written permission.
25 //
26 // THIS SOFTWARE IS PROVIDED BY SANDIA CORPORATION "AS IS" AND ANY
27 // EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
28 // IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
29 // PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL SANDIA CORPORATION OR THE
30 // CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
31 // EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
32 // PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
33 // PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF
34 // LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
35 // NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
36 // SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
37 //
38 // Questions? Contact
39 // Jonathan Hu (jhu@sandia.gov)
40 // Andrey Prokopenko (aprokop@sandia.gov)
41 // Ray Tuminaro (rstumin@sandia.gov)
42 //
43 // ***********************************************************************
44 //
45 // @HEADER
46 #ifndef MUELU_SINGLELEVELFACTORY_HPP
47 #define MUELU_SINGLELEVELFACTORY_HPP
48 
49 #include "MueLu_ConfigDefs.hpp"
50 
51 #include "MueLu_Factory.hpp"
52 #include "MueLu_Level_fwd.hpp"
53 #include "MueLu_TimeMonitor.hpp"
54 #include "MueLu_Utilities.hpp"
55 
56 namespace MueLu {
57 
65  public:
67 
68 
71 
74 
76 
78 
79 
85  virtual void DeclareInput(Level& currentLevel) const = 0;
86 
88 
90 
91 
93  virtual void Build(Level& currentLevel) const = 0;
94 
96  virtual void CallBuild(Level& requestedLevel) const {
97 #ifdef HAVE_MUELU_DEBUG
98  // We cannot call Build method twice for the same level, but we can call it multiple times for different levels
99  int levelID = requestedLevel.GetLevelID();
100  TEUCHOS_TEST_FOR_EXCEPTION((multipleCallCheck_ == ENABLED) && (multipleCallCheckGlobal_ == ENABLED) && (lastLevelID_ == levelID),
102  this->ShortClassName() << "::Build() called twice for the same level (levelID=" << levelID
103  << "). This is likely due to a configuration error, or calling hierarchy setup multiple times "
104  << "without resetting debug info through FactoryManager::ResetDebugData().");
105  if (multipleCallCheck_ == FIRSTCALL)
106  multipleCallCheck_ = ENABLED;
107 
108  lastLevelID_ = levelID;
109 #endif
110 
111  RCP<const Teuchos::Comm<int> > comm = requestedLevel.GetComm();
112  if (comm.is_null()) {
113  // Some factories are called before we constructed Ac, and therefore,
114  // before we set the level communicator. For such factories we can get
115  // the comm from the previous level, as all processes go there
116  RCP<Level>& prevLevel = requestedLevel.GetPreviousLevel();
117  if (!prevLevel.is_null())
118  comm = prevLevel->GetComm();
119  }
120 
121  int oldRank = -1;
122  if (!comm.is_null())
123  oldRank = SetProcRankVerbose(comm->getRank());
124 
125  // Synchronization timer
126  std::string syncTimer = this->ShortClassName() + ": Build sync (level=" + toString(requestedLevel.GetLevelID()) + ")";
127  if (this->timerSync_ && !comm.is_null()) {
128  TimeMonitor timer(*this, syncTimer);
129  comm->barrier();
130  }
131 
132  Build(requestedLevel);
133 
134  if (this->timerSync_ && !comm.is_null()) {
135  TimeMonitor timer(*this, syncTimer);
136  comm->barrier();
137  }
138 
139  if (IsPrint(Test1))
140  GetOStream(Test1) << *RemoveFactoriesFromList(GetParameterList()) << std::endl;
141  else
142  RemoveFactoriesFromList(GetParameterList())->print(GetOStream(Test0), Teuchos::ParameterList::PrintOptions().indent(0).showFlags(true).showDefault(false));
143 
144  if (oldRank != -1)
145  SetProcRankVerbose(oldRank);
146  }
147 
149  virtual void CallDeclareInput(Level& requestedLevel) const {
150  DeclareInput(requestedLevel);
151  }
153 
154 }; // class SingleLevelFactoryBase
155 
156 } // namespace MueLu
157 
158 #define MUELU_SINGLELEVELFACTORY_SHORT
159 #endif // ifndef MUELU_SINGLELEVELFACTORY_HPP
160 
161 // TODO: code factorization between SingleLevelFactoryBase and TwoLevelFactoryBase
virtual const Teuchos::ParameterList & GetParameterList() const
RCP< Level > & GetPreviousLevel()
Previous level.
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.
virtual void CallBuild(Level &requestedLevel) const
#define TEUCHOS_TEST_FOR_EXCEPTION(throw_exception_test, Exception, msg)
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:99
virtual void CallDeclareInput(Level &requestedLevel) const
bool IsPrint(MsgType type, int thisProcRankOnly=-1) const
Find out whether we need to print out information for a specific message type.
Print used parameters.
int SetProcRankVerbose(int procRank) const
Set proc rank used for printing.
int GetLevelID() const
Return level number.
Definition: MueLu_Level.cpp:76
Exception throws to report errors in the internal logical of the program.
RCP< const Teuchos::Comm< int > > GetComm() const
Base class for factories that use one level (currentLevel).
virtual void Build(Level &currentLevel) const =0
Build an object with this factory.
bool is_null() const