MueLu Version of the Day
Loading...
Searching...
No Matches
MueLu_MutuallyExclusiveTime.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_MUTUALLYEXCLUSIVETIME_HPP
47#define MUELU_MUTUALLYEXCLUSIVETIME_HPP
48
49#include <string>
50#include <stack>
51#include "Teuchos_RCPDecl.hpp" // for RCP
52
53// types for explicit instantiation
55#include "MueLu_Level_fwd.hpp"
56#include "MueLu_BaseClass.hpp"
57
58namespace MueLu {
59
74 template<class TagName>
76
77 public:
78
80
81
82 MutuallyExclusiveTime(const std::string &name, bool startFlag=false);
83
87
91 void start(bool reset=false);
92
94
95
99 double stop();
100
102 void pause();
103
107
108 void resume();
109
111
112
114
115
116 bool isRunning();
117
118 bool isPaused();
119
121
123 // Note: this function is provided by the timer class, not by a monitor (!= Teuchos)
124 static RCP<MutuallyExclusiveTime<TagName> > getNewTimer(const std::string& name);
125
127 void incrementNumCalls();
128
130 std::string name_;
131
138 static void PrintParentChildPairs();
139
140 private:
141
144 MutuallyExclusiveTime(RCP<Teuchos::Time> timer);
145
146 // MutuallyExclusiveTime() { }
147
149 RCP<Teuchos::Time> timer_;
151
153 // - empty when no active timer
154 // - head is the active timer
155 // - other timers are timers paused to enforce the mutually exclusive property of the timer set.
156 static std::stack<MutuallyExclusiveTime<TagName>*> timerStack_;
157 //static std::map<std::string,std::string> myParent_;
158
160 void TopOfTheStack();
161
162 //TODO: test integrity of the stack:
163 // Head = running or paused
164 // Other timers of the stack = paused
165
166 };
167
168 extern template class MutuallyExclusiveTime<FactoryBase>;
169 extern template class MutuallyExclusiveTime<Level>;
170 extern template class MutuallyExclusiveTime<BaseClass>;
171
172} // namespace MueLu
173
174#endif // MUELU_MUTUALLYEXCLUSIVETIME_HPP
175
176
Base class for MueLu classes.
This class wraps a Teuchos::Time and maintains a mutually exclusive property between wrapped timers.
void pause()
Pause running timer. Used internally by start().
void resume()
Resume paused timer. Used internally by stop(). Timer is not reset.
std::string name_
Name of this mutually exclusive timer.
MutuallyExclusiveTime(const std::string &name, bool startFlag=false)
Constructor.
static std::stack< MutuallyExclusiveTime< TagName > * > timerStack_
Stack of created timers (active or paused timers).
void TopOfTheStack()
Check if 'this' is the head of the stack.
double stop()
Stops the timer. The previous MutuallyExclusiveTime that has been paused when this timer was started ...
static void PrintParentChildPairs()
Print std::map of (child,parent) pairs for post-run analysis.
static RCP< MutuallyExclusiveTime< TagName > > getNewTimer(const std::string &name)
Return a new MutuallyExclusiveTime that is registered with the Teuchos::TimeMonitor (for timer summar...
void incrementNumCalls()
Increment the number of times this timer has been called.
void start(bool reset=false)
Starts the timer. If a MutuallyExclusiveTime timer is running, it will be stopped.
RCP< Teuchos::Time > timer_
Using an RCP allows to use Teuchos::TimeMonitor to keep track of the timer.
Namespace for MueLu classes and methods.