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 
66  public:
68 
69 
72 
75 
77 
79 
80 
86  virtual void DeclareInput(Level &currentLevel) const = 0;
87 
89 
91 
92 
94  virtual void Build(Level & currentLevel) const = 0;
95 
97  virtual void CallBuild(Level& requestedLevel) const {
98 #ifdef HAVE_MUELU_DEBUG
99  // We cannot call Build method twice for the same level, but we can call it multiple times for different levels
100  int levelID = requestedLevel.GetLevelID();
101  TEUCHOS_TEST_FOR_EXCEPTION((multipleCallCheck_ == ENABLED) && (multipleCallCheckGlobal_ == ENABLED) && (lastLevelID_ == levelID),
103  this->ShortClassName() << "::Build() called twice for the same level (levelID=" << levelID
104  << "). This is likely due to a configuration error, or calling hierarchy setup multiple times "
105  << "without resetting debug info through FactoryManager::ResetDebugData().");
106  if (multipleCallCheck_ == FIRSTCALL)
107  multipleCallCheck_ = ENABLED;
108 
109  lastLevelID_ = levelID;
110 #endif
111 
112  RCP<const Teuchos::Comm<int> > comm = requestedLevel.GetComm();
113  if (comm.is_null()) {
114  // Some factories are called before we constructed Ac, and therefore,
115  // before we set the level communicator. For such factories we can get
116  // the comm from the previous level, as all processes go there
117  RCP<Level>& prevLevel = requestedLevel.GetPreviousLevel();
118  if (!prevLevel.is_null())
119  comm = prevLevel->GetComm();
120  }
121 
122  int oldRank = -1;
123  if (!comm.is_null())
124  oldRank = SetProcRankVerbose(comm->getRank());
125 
126  // Synchronization timer
127  std::string syncTimer = this->ShortClassName() + ": Build sync (level=" + toString(requestedLevel.GetLevelID()) + ")";
128  if (this->timerSync_ && !comm.is_null()) {
129  TimeMonitor timer(*this, syncTimer);
130  comm->barrier();
131  }
132 
133  Build(requestedLevel);
134 
135  if (this->timerSync_ && !comm.is_null()) {
136  TimeMonitor timer(*this, syncTimer);
137  comm->barrier();
138  }
139 
140  GetOStream(Test) << *RemoveFactoriesFromList(GetParameterList()) << std::endl;;
141 
142  if (oldRank != -1)
143  SetProcRankVerbose(oldRank);
144  }
145 
147  virtual void CallDeclareInput(Level & requestedLevel) const {
148  DeclareInput(requestedLevel);
149  }
151 
152  }; //class SingleLevelFactoryBase
153 
154 } //namespace MueLu
155 
156 #define MUELU_SINGLELEVELFACTORY_SHORT
157 #endif //ifndef MUELU_SINGLELEVELFACTORY_HPP
158 
159 //TODO: code factorization between SingleLevelFactoryBase and TwoLevelFactoryBase
virtual const Teuchos::ParameterList & GetParameterList() const
RCP< Level > & GetPreviousLevel()
Previous level.
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.
int SetProcRankVerbose(int procRank) const
Set proc rank used for printing.
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
Teuchos::FancyOStream & GetOStream(MsgType type, int thisProcRankOnly=0) const
Get an output stream for outputting the input message type.
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