Teko  Version of the Day
 All Classes Files Functions Variables Pages
Teko_LU2x2InverseOp.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 
52 #ifndef __Teko_LU2x2InverseOp_hpp__
53 #define __Teko_LU2x2InverseOp_hpp__
54 
55 #include "Teko_Utilities.hpp"
56 #include "Teko_BlockImplicitLinearOp.hpp"
57 
58 namespace Teko {
59 
102 public:
113  LU2x2InverseOp(const BlockedLinearOp & A,
114  const LinearOp & invA00,
115  const LinearOp & invS);
116 
128  LU2x2InverseOp(const BlockedLinearOp & A,
129  const LinearOp & hatInvA00,
130  const LinearOp & tildeInvA00,
131  const LinearOp & invS);
132 
134 
135 
137  virtual VectorSpace range() const { return productRange_; }
138 
140  virtual VectorSpace domain() const { return productDomain_; }
141 
154  virtual void implicitApply(const BlockedMultiVector & x, BlockedMultiVector & y,
155  const double alpha = 1.0, const double beta = 0.0) const;
157 
158  virtual void describe(Teuchos::FancyOStream & out_arg,
159  const Teuchos::EVerbosityLevel verbLevel) const;
160 
161 protected:
163 
164  // fundamental operators to use
165  const BlockedLinearOp A_;
166  const LinearOp hatInvA00_;
167  const LinearOp tildeInvA00_;
168  const LinearOp invS_;
169 
170  // some blocks of A
171  const LinearOp A10_;
172  const LinearOp A01_;
173 
174  Teuchos::RCP<const Thyra::ProductVectorSpaceBase<double> > productRange_;
175  Teuchos::RCP<const Thyra::ProductVectorSpaceBase<double> > productDomain_;
176 
177 private:
178  // hide me!
179  LU2x2InverseOp();
181 };
182 
196 inline LinearOp createLU2x2InverseOp(BlockedLinearOp & A,LinearOp & invA00,LinearOp & invS)
197 {
198  return Teuchos::rcp(new LU2x2InverseOp(A,invA00,invS));
199 }
200 
215 inline LinearOp createLU2x2InverseOp(BlockedLinearOp & A,LinearOp & invA00,LinearOp & invS,const std::string & str)
216 {
217  Teuchos::RCP<Thyra::LinearOpBase<double> > result = Teuchos::rcp(new LU2x2InverseOp(A,invA00,invS));
218  result->setObjectLabel(str);
219 
220  return result;
221 }
222 
237 inline LinearOp createLU2x2InverseOp(BlockedLinearOp & A,LinearOp & hatInvA00,LinearOp & tildeInvA00,LinearOp & invS)
238 {
239  return Teuchos::rcp(new LU2x2InverseOp(A,hatInvA00,tildeInvA00,invS));
240 }
241 
257 inline LinearOp createLU2x2InverseOp(BlockedLinearOp & A,LinearOp & hatInvA00,LinearOp & tildeInvA00,LinearOp & invS,const std::string & str)
258 {
259  Teuchos::RCP<Thyra::LinearOpBase<double> > result = Teuchos::rcp(new LU2x2InverseOp(A,hatInvA00,tildeInvA00,invS));
260  result->setObjectLabel(str);
261 
262  return result;
263 }
264 
265 } // end namespace Teko
266 
267 #endif
virtual void implicitApply(const BlockedMultiVector &x, BlockedMultiVector &y, const double alpha=1.0, const double beta=0.0) const =0
Perform a matrix vector multiply with this implicitly defined blocked operator.
This linear operator approximates the inverse of a block operator using a block decomposition...
const LinearOp hatInvA00_
inverse of
Teuchos::RCP< const Thyra::ProductVectorSpaceBase< double > > productRange_
Range vector space.
const LinearOp A01_
operator
LinearOp createLU2x2InverseOp(BlockedLinearOp &A, LinearOp &hatInvA00, LinearOp &tildeInvA00, LinearOp &invS)
Constructor method for building LU2x2InverseOp.
Teuchos::RCP< const Thyra::ProductVectorSpaceBase< double > > productDomain_
Domain vector space.
virtual VectorSpace domain() const
Domain space of this operator.
LinearOp createLU2x2InverseOp(BlockedLinearOp &A, LinearOp &hatInvA00, LinearOp &tildeInvA00, LinearOp &invS, const std::string &str)
Constructor method for building LU2x2InverseOp.
LinearOp createLU2x2InverseOp(BlockedLinearOp &A, LinearOp &invA00, LinearOp &invS, const std::string &str)
Constructor method for building LU2x2InverseOp.
const BlockedLinearOp A_
operator
virtual void implicitApply(const BlockedMultiVector &x, BlockedMultiVector &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.
const LinearOp invS_
inverse of
LinearOp createLU2x2InverseOp(BlockedLinearOp &A, LinearOp &invA00, LinearOp &invS)
Constructor method for building LU2x2InverseOp.
virtual VectorSpace range() const
Range space of this operator.
const LinearOp A10_
operator
const LinearOp tildeInvA00_
inverse of