Teko Version of the Day
Loading...
Searching...
No Matches
Teko_BlockInvDiagonalStrategy.hpp
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
47#ifndef __Teko_BlockInvDiagonalStrategy_hpp__
48#define __Teko_BlockInvDiagonalStrategy_hpp__
49
50#include <vector>
51
52// Teuchos includes
53#include "Teuchos_RCP.hpp"
54
55// Thyra includes
56#include "Thyra_LinearOpBase.hpp"
57
58// Teko includes
59#include "Teko_Utilities.hpp"
60#include "Teko_InverseFactory.hpp"
61#include "Teko_BlockPreconditionerFactory.hpp"
62
63namespace Teko {
64
80public:
81 virtual ~BlockInvDiagonalStrategy() {}
82
84 virtual void getInvD(const BlockedLinearOp & A,BlockPreconditionerState & state,
85 std::vector<LinearOp> & invDiag) const = 0;
86
87};
88
96public:
97 StaticInvDiagStrategy(const LinearOp & invD0,
98 const LinearOp & invD1)
99 { invDiag_.push_back(invD0); invDiag_.push_back(invD1); }
100
101 StaticInvDiagStrategy(const std::vector<LinearOp> & invD)
102 : invDiag_(invD)
103 { }
104
105 virtual ~StaticInvDiagStrategy() {}
106
110 virtual void getInvD(const BlockedLinearOp & /* A */, BlockPreconditionerState & /* state */,
111 std::vector<LinearOp> & invDiag) const
112 { invDiag.clear(); invDiag = invDiag_; }
113
114protected:
115 // stored inverse operators
116 std::vector<Teuchos::RCP<const Thyra::LinearOpBase<double> > > invDiag_;
117};
118
124public:
130 InvFactoryDiagStrategy(const Teuchos::RCP<InverseFactory> & factory);
131
139 InvFactoryDiagStrategy(const std::vector<Teuchos::RCP<InverseFactory> > & factories,
140 const Teuchos::RCP<InverseFactory> & defaultFact=Teuchos::null);
141
142 virtual ~InvFactoryDiagStrategy() {}
143
151 virtual void getInvD(const BlockedLinearOp & A, BlockPreconditionerState & state,
152 std::vector<LinearOp> & invDiag) const;
153
155 const std::vector<Teuchos::RCP<InverseFactory> > & getFactories() const
156 { return invDiagFact_; }
157
158protected:
159 // stored inverse operators
160 std::vector<Teuchos::RCP<InverseFactory> > invDiagFact_;
161 Teuchos::RCP<InverseFactory> defaultInvFact_;
162
164 LinearOp buildInverse(const InverseFactory & invFact,const LinearOp & matrix,
166 const std::string & opPrefix,int i) const;
167
168private:
171};
172
173} // end namespace Teko
174
175#endif
virtual void getInvD(const BlockedLinearOp &A, BlockPreconditionerState &state, std::vector< LinearOp > &invDiag) const =0
returns an (approximate) inverse of the diagonal blocks of A
An implementation of a state object for block preconditioners.
LinearOp buildInverse(const InverseFactory &invFact, const LinearOp &matrix, BlockPreconditionerState &state, const std::string &opPrefix, int i) const
Conveinence function for building inverse operators.
const std::vector< Teuchos::RCP< InverseFactory > > & getFactories() const
Get factories for testing purposes.
virtual void getInvD(const BlockedLinearOp &A, BlockPreconditionerState &state, std::vector< LinearOp > &invDiag) const
Abstract class for building an inverse operator.
virtual void getInvD(const BlockedLinearOp &, BlockPreconditionerState &, std::vector< LinearOp > &invDiag) const