Teko Version of the Day
Loading...
Searching...
No Matches
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
58namespace Teko {
59
102public:
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
161protected:
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
177private:
178 // hide me!
181};
182
196inline LinearOp createLU2x2InverseOp(BlockedLinearOp & A,LinearOp & invA00,LinearOp & invS)
197{
198 return Teuchos::rcp(new LU2x2InverseOp(A,invA00,invS));
199}
200
215inline 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
237inline LinearOp createLU2x2InverseOp(BlockedLinearOp & A,LinearOp & hatInvA00,LinearOp & tildeInvA00,LinearOp & invS)
238{
239 return Teuchos::rcp(new LU2x2InverseOp(A,hatInvA00,tildeInvA00,invS));
240}
241
257inline 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
A virtual class that simplifies the construction of custom operators.
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.
LinearOp createLU2x2InverseOp(BlockedLinearOp &A, LinearOp &hatInvA00, LinearOp &tildeInvA00, LinearOp &invS)
Constructor method for building LU2x2InverseOp.
const LinearOp hatInvA00_
inverse of
LinearOp createLU2x2InverseOp(BlockedLinearOp &A, LinearOp &invA00, LinearOp &invS, const std::string &str)
Constructor method for building LU2x2InverseOp.
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.
const LinearOp tildeInvA00_
inverse of
Teuchos::RCP< const Thyra::ProductVectorSpaceBase< double > > productDomain_
Domain vector space.
virtual VectorSpace domain() const
Domain space of this operator.
Teuchos::RCP< const Thyra::ProductVectorSpaceBase< double > > productRange_
Range vector space.
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)
Constructor method for building LU2x2InverseOp.
const LinearOp invS_
inverse of
virtual VectorSpace range() const
Range space of this operator.
const LinearOp A01_
operator
const LinearOp A10_
operator
const BlockedLinearOp A_
operator