Belos Package Browser (Single Doxygen Collection) Development
Loading...
Searching...
No Matches
BelosStatusTestMaxIters.hpp
Go to the documentation of this file.
1//@HEADER
2// ************************************************************************
3//
4// Belos: Block Linear Solvers Package
5// Copyright 2004 Sandia Corporation
6//
7// Under the terms of Contract DE-AC04-94AL85000 with Sandia Corporation,
8// the U.S. Government retains certain rights in this software.
9//
10// Redistribution and use in source and binary forms, with or without
11// modification, are permitted provided that the following conditions are
12// met:
13//
14// 1. Redistributions of source code must retain the above copyright
15// notice, this list of conditions and the following disclaimer.
16//
17// 2. Redistributions in binary form must reproduce the above copyright
18// notice, this list of conditions and the following disclaimer in the
19// documentation and/or other materials provided with the distribution.
20//
21// 3. Neither the name of the Corporation nor the names of the
22// contributors may be used to endorse or promote products derived from
23// this software without specific prior written permission.
24//
25// THIS SOFTWARE IS PROVIDED BY SANDIA CORPORATION "AS IS" AND ANY
26// EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
27// IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
28// PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL SANDIA CORPORATION OR THE
29// CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
30// EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
31// PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
32// PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF
33// LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
34// NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
35// SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
36//
37// Questions? Contact Michael A. Heroux (maherou@sandia.gov)
38//
39// ************************************************************************
40//@HEADER
41//
42
43#ifndef BELOS_STATUS_TEST_MAXITERS_HPP
44#define BELOS_STATUS_TEST_MAXITERS_HPP
45
51#include "BelosStatusTest.hpp"
52
60namespace Belos {
61
62template <class ScalarType, class MV, class OP>
63class StatusTestMaxIters: public StatusTest<ScalarType,MV,OP> {
64
65 public:
66
68
69
71 StatusTestMaxIters(int maxIters);
72
74 virtual ~StatusTestMaxIters() {};
76
78
79
81
85
87 StatusType getStatus() const {return(status_);}
88
90
92
93
95 void reset();
96
98 void setMaxIters(int maxIters) { maxIters_ = maxIters; }
99
101
103
104
106 int getMaxIters() const { return(maxIters_); }
107
109 int getNumIters() const { return(nIters_); }
110
112
114
115
117 void print(std::ostream& os, int indent = 0) const;
118
120 void printStatus(std::ostream& os, StatusType type) const;
121
123
126
128 std::string description() const
129 {
130 std::ostringstream oss;
131 oss << "Belos::StatusTestMaxIters<>: [ " << getNumIters() << " / " << getMaxIters() << " ]";
132 return oss.str();
133 }
135
136private:
137
139
140
142
145
149
150};
151
152 template <class ScalarType, class MV, class OP>
154 {
155 if (maxIters < 1)
156 maxIters_ = 1;
157 else
158 maxIters_ = maxIters;
159
160 nIters_ = 0;
161 status_ = Undefined;
162 }
163
164 template <class ScalarType, class MV, class OP>
166 {
167 status_ = Failed;
168 nIters_ = iSolver->getNumIters();
169 if (nIters_ >= maxIters_)
170 status_ = Passed;
171 return status_;
172 }
173
174 template <class ScalarType, class MV, class OP>
176 {
177 nIters_ = 0;
178 status_ = Undefined;
179 }
180
181 template <class ScalarType, class MV, class OP>
182 void StatusTestMaxIters<ScalarType,MV,OP>::print(std::ostream& os, int indent) const
183 {
184 for (int j = 0; j < indent; j ++)
185 os << ' ';
186 printStatus(os, status_);
187 os << "Number of Iterations = ";
188 os << nIters_;
189 os << ((nIters_ < maxIters_) ? " < " : ((nIters_ == maxIters_) ? " == " : " > "));
190 os << maxIters_;
191 os << std::endl;
192 }
193
194 template <class ScalarType, class MV, class OP>
196 {
197 os << std::left << std::setw(13) << std::setfill('.');
198 switch (type) {
199 case Passed:
200 os << "Failed";
201 break;
202 case Failed:
203 os << "OK";
204 break;
205 case Undefined:
206 default:
207 os << "**";
208 break;
209 }
210 os << std::left << std::setfill(' ');
211 return;
212 }
213
214} // end Belos namespace
215
216#endif /* BELOS_STATUS_TEST_MAXITERS_HPP */
Pure virtual base class for defining the status testing capabilities of Belos.
virtual int getNumIters() const =0
Get the current iteration count.
A Belos::StatusTest class for specifying a maximum number of iterations.
void print(std::ostream &os, int indent=0) const
Output formatted description of stopping test to output stream.
StatusType checkStatus(Iteration< ScalarType, MV, OP > *iSolver)
Check convergence status of the iterative solver: Unconverged, Converged, Failed.
void reset()
Resets the status test to the initial internal state.
StatusTestMaxIters(int maxIters)
Constructor.
int maxIters_
Maximum number of iterations allowed.
std::string description() const
Method to return description of the maximum iteration status test
virtual ~StatusTestMaxIters()
Destructor.
StatusType getStatus() const
Return the result of the most recent CheckStatus call.
void setMaxIters(int maxIters)
Sets the maximum number of iterations allowed.
int getMaxIters() const
Returns the maximum number of iterations set in the constructor.
int getNumIters() const
Returns the current number of iterations from the most recent StatusTest call.
int nIters_
Current number of iterations.
void printStatus(std::ostream &os, StatusType type) const
Print message for each status specific to this stopping test.
A pure virtual class for defining the status tests for the Belos iterative solvers.
StatusType
Whether the StatusTest wants iteration to stop.
Definition: BelosTypes.hpp:189
@ Undefined
Definition: BelosTypes.hpp:191