Teko  Version of the Day
Teko_DiagnosticLinearOp.hpp
Go to the documentation of this file.
1 /*
2 // @HEADER
3 //
4 // ***********************************************************************
5 //
6 // Teko: A package for block and physics based preconditioning
7 // Copyright 2010 Sandia Corporation
8 //
9 // Under the terms of Contract DE-AC04-94AL85000 with Sandia Corporation,
10 // the U.S. Government retains certain rights in this software.
11 //
12 // Redistribution and use in source and binary forms, with or without
13 // modification, are permitted provided that the following conditions are
14 // met:
15 //
16 // 1. Redistributions of source code must retain the above copyright
17 // notice, this list of conditions and the following disclaimer.
18 //
19 // 2. Redistributions in binary form must reproduce the above copyright
20 // notice, this list of conditions and the following disclaimer in the
21 // documentation and/or other materials provided with the distribution.
22 //
23 // 3. Neither the name of the Corporation nor the names of the
24 // contributors may be used to endorse or promote products derived from
25 // this software without specific prior written permission.
26 //
27 // THIS SOFTWARE IS PROVIDED BY SANDIA CORPORATION "AS IS" AND ANY
28 // EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
29 // IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
30 // PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL SANDIA CORPORATION OR THE
31 // CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
32 // EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
33 // PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
34 // PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF
35 // LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
36 // NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
37 // SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
38 //
39 // Questions? Contact Eric C. Cyr (eccyr@sandia.gov)
40 //
41 // ***********************************************************************
42 //
43 // @HEADER
44 
45 */
46 
53 #ifndef __Teko_DiagnosticLinearOp_hpp__
54 #define __Teko_DiagnosticLinearOp_hpp__
55 
56 #include <iostream>
57 
58 #include "Teko_Utilities.hpp"
59 #include "Teko_ImplicitLinearOp.hpp"
60 
61 #include "Teuchos_Time.hpp"
62 
63 namespace Teko {
64 
70 public:
75  DiagnosticLinearOp(const Teuchos::RCP<std::ostream> & ostrm,const ModifiableLinearOp & A,const std::string & diagnosticString);
76 
81  DiagnosticLinearOp(const Teuchos::RCP<std::ostream> & ostrm,const LinearOp & A,const std::string & diagnosticString);
82 
87  DiagnosticLinearOp(const Teuchos::RCP<std::ostream> & ostrm,const LinearOp & fwdOp,const ModifiableLinearOp & A,const std::string & diagnosticString);
88 
91  virtual ~DiagnosticLinearOp();
92 
94 
95 
97  virtual VectorSpace range() const { return wrapOpA_lo_->range(); }
98 
100  virtual VectorSpace domain() const { return wrapOpA_lo_->domain(); }
101 
114  virtual void implicitApply(const MultiVector & x, MultiVector & y,
115  const double alpha = 1.0, const double beta = 0.0) const;
117 
118  virtual void describe(Teuchos::FancyOStream & out_arg,
119  const Teuchos::EVerbosityLevel verbLevel) const
120  { wrapOpA_lo_->describe(out_arg,verbLevel); }
121 
122  int numApplications() const { return timer_.numCalls(); }
123  double totalTime() const { return timer_.totalElapsedTime(); }
124 
125  ModifiableLinearOp getModifiableOp() const
126  { return wrapOpA_; }
127 
128  void setLinearOp(const LinearOp & lo)
129  { wrapOpA_lo_ = lo; wrapOpA_ = Teuchos::null; }
130 
131  LinearOp getLinearOp() const
132  { return wrapOpA_lo_; }
133 
134  void setForwardOp(const Teko::LinearOp & lo)
135  { fwdOp_ = lo; }
136 
137  /* Get the residual norm. Used purely for testing.
138  */
139  double getResidualNorm() const
140  { return residualNorm_; }
141 
142 protected:
143  // fundamental operators to use
144  Teuchos::RCP<std::ostream> outputStream_;
145  ModifiableLinearOp wrapOpA_;
146  LinearOp wrapOpA_lo_;
147  LinearOp fwdOp_;
148  std::string diagString_;
149 
150  mutable double residualNorm_; // for testing purposes
151  mutable Teuchos::Time timer_;
152 
153 private:
154  // hide me!
156  DiagnosticLinearOp(const DiagnosticLinearOp &);
157 };
158 
172 inline ModifiableLinearOp createDiagnosticLinearOp(const Teuchos::RCP<std::ostream> & os,const ModifiableLinearOp & A,const std::string & label)
173 {
174  return Teuchos::rcp(new DiagnosticLinearOp(os,A,label));
175 }
176 
190 inline ModifiableLinearOp createDiagnosticLinearOp(const Teuchos::RCP<std::ostream> & os,const LinearOp & A,const std::string & label)
191 {
192  return Teuchos::rcp(new DiagnosticLinearOp(os,A,label));
193 }
194 
209 inline ModifiableLinearOp createDiagnosticLinearOp(const Teuchos::RCP<std::ostream> & os,const Teko::LinearOp & fwdOp,const ModifiableLinearOp & A,const std::string & label)
210 {
211  return Teuchos::rcp(new DiagnosticLinearOp(os,fwdOp,A,label));
212 }
213 
214 } // end namespace Teko
215 
216 #endif
ModifiableLinearOp createDiagnosticLinearOp(const Teuchos::RCP< std::ostream > &os, const LinearOp &A, const std::string &label)
Constructor method for building DiagnosticLinearOp.
virtual ~DiagnosticLinearOp()
Destructor prints out timing information about this operator.
DiagnosticLinearOp(const Teuchos::RCP< std::ostream > &ostrm, const ModifiableLinearOp &A, const std::string &diagnosticString)
This constructor explicitly takes the linear operator that needs to be wrapped and a string for outpu...
virtual VectorSpace domain() const
Domain space of this operator.
virtual void implicitApply(const MultiVector &x, MultiVector &y, const double alpha=1.0, const double beta=0.0) const
Perform a matrix vector multiply with this operator.
A virtual class that simplifies the construction of custom operators.
ModifiableLinearOp createDiagnosticLinearOp(const Teuchos::RCP< std::ostream > &os, const ModifiableLinearOp &A, const std::string &label)
Constructor method for building DiagnosticLinearOp.
This linear operator prints diagnostics about operator application and creation times. It is useful for debugging problems and determining bottle necks.
ModifiableLinearOp createDiagnosticLinearOp(const Teuchos::RCP< std::ostream > &os, const Teko::LinearOp &fwdOp, const ModifiableLinearOp &A, const std::string &label)
Constructor method for building DiagnosticLinearOp.
virtual VectorSpace range() const
Range space of this operator.