Stokhos Package Browser (Single Doxygen Collection) Version of the Day
Loading...
Searching...
No Matches
NOX_Epetra_LinearSystem_MPBD.hpp
Go to the documentation of this file.
1/*
2// @HEADER
3// ***********************************************************************
4//
5// Stokhos Package
6// Copyright (2009) Sandia Corporation
7//
8// Under terms of Contract DE-AC04-94AL85000, there is a non-exclusive
9// license for use of this work by or on behalf of the U.S. Government.
10//
11// Redistribution and use in source and binary forms, with or without
12// modification, are permitted provided that the following conditions are
13// met:
14//
15// 1. Redistributions of source code must retain the above copyright
16// notice, this list of conditions and the following disclaimer.
17//
18// 2. Redistributions in binary form must reproduce the above copyright
19// notice, this list of conditions and the following disclaimer in the
20// documentation and/or other materials provided with the distribution.
21//
22// 3. Neither the name of the Corporation nor the names of the
23// contributors may be used to endorse or promote products derived from
24// this software without specific prior written permission.
25//
26// THIS SOFTWARE IS PROVIDED BY SANDIA CORPORATION "AS IS" AND ANY
27// EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
28// IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
29// PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL SANDIA CORPORATION OR THE
30// CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
31// EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
32// PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
33// PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF
34// LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
35// NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
36// SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
37//
38// Questions? Contact Eric T. Phipps (etphipp@sandia.gov).
39//
40// ***********************************************************************
41// @HEADER
42*/
43
44#ifndef NOX_EPETRA_LINEARSYSTEMMPBD_H
45#define NOX_EPETRA_LINEARSYSTEMMPBD_H
46
47#include "Stokhos_ConfigDefs.h"
48
49#ifdef HAVE_STOKHOS_NOX
50
51#include "NOX_Common.H"
52
53#include "NOX_Epetra_LinearSystem.H" // base class
54#include "NOX_Utils.H" // class data element
55
59#include "EpetraExt_BlockVector.h"
60
61namespace NOX {
62 namespace Epetra {
63 namespace Interface {
64 class Required;
65 class Jacobian;
66 class Preconditioner;
67 }
68 }
69}
70
71namespace NOX {
72
73 namespace Epetra {
74
79 class LinearSystemMPBD : public virtual NOX::Epetra::LinearSystem {
80 public:
81
83 LinearSystemMPBD(
84 Teuchos::ParameterList& printingParams,
85 Teuchos::ParameterList& linearSolverParams,
86 const Teuchos::RCP<NOX::Epetra::LinearSystem>& block_solver,
87 const Teuchos::RCP<NOX::Epetra::Interface::Required>& iReq,
88 const Teuchos::RCP<NOX::Epetra::Interface::Jacobian>& iJac,
89 const Teuchos::RCP<Epetra_Operator>& J,
90 const Teuchos::RCP<const Epetra_Map>& base_map,
91 const Teuchos::RCP<NOX::Epetra::Scaling> scalingObject =
92 Teuchos::null);
93
95 virtual ~LinearSystemMPBD();
96
101 virtual bool applyJacobian(const NOX::Epetra::Vector& input,
102 NOX::Epetra::Vector& result) const;
103
108 virtual bool applyJacobianTranspose(const NOX::Epetra::Vector& input,
109 NOX::Epetra::Vector& result) const;
110
115 virtual bool applyJacobianInverse(Teuchos::ParameterList &params,
116 const NOX::Epetra::Vector &input,
117 NOX::Epetra::Vector &result);
118
120 virtual bool applyRightPreconditioning(bool useTranspose,
121 Teuchos::ParameterList& params,
122 const NOX::Epetra::Vector& input,
123 NOX::Epetra::Vector& result) const;
124
126 virtual Teuchos::RCP<NOX::Epetra::Scaling> getScaling();
127
129 virtual void resetScaling(const Teuchos::RCP<NOX::Epetra::Scaling>& s);
130
132 virtual bool computeJacobian(const NOX::Epetra::Vector& x);
133
135 virtual bool createPreconditioner(const NOX::Epetra::Vector& x,
136 Teuchos::ParameterList& p,
137 bool recomputeGraph) const;
138
140 virtual bool destroyPreconditioner() const;
141
143 virtual bool recomputePreconditioner(const NOX::Epetra::Vector& x,
144 Teuchos::ParameterList& linearSolverParams) const;
145
147 virtual PreconditionerReusePolicyType
148 getPreconditionerPolicy(bool advanceReuseCounter=true);
149
151 virtual bool isPreconditionerConstructed() const;
152
154 virtual bool hasPreconditioner() const;
155
157 virtual Teuchos::RCP<const Epetra_Operator>
158 getJacobianOperator() const;
159
161 virtual Teuchos::RCP<Epetra_Operator> getJacobianOperator();
162
164 virtual Teuchos::RCP<const Epetra_Operator>
165 getGeneratedPrecOperator() const;
166
168 virtual Teuchos::RCP<Epetra_Operator> getGeneratedPrecOperator();
169
171 virtual void setJacobianOperatorForSolve(const Teuchos::RCP<const Epetra_Operator>& solveJacOp);
172
174 virtual void setPrecOperatorForSolve(const Teuchos::RCP<const Epetra_Operator>& solvePrecOp);
175
176 protected:
177
178 enum PREC_STRATEGY {
179 STANDARD,
180 MEAN,
181 ON_THE_FLY
182 };
183
185 Teuchos::RCP<NOX::Epetra::LinearSystem> block_solver;
186
188 Teuchos::RCP<NOX::Epetra::Interface::Jacobian> jacInterfacePtr;
189
191 int num_mp_blocks;
192
194 mutable Teuchos::RCP<Stokhos::BlockDiagonalOperator> mp_op;
195
197 mutable Teuchos::RCP<const Stokhos::ProductContainer<Epetra_Operator> > block_ops;
198
200 Teuchos::RCP<const Epetra_Map> base_map;
201
203 Teuchos::RCP<NOX::Epetra::Scaling> scaling;
204
206 NOX::Utils utils;
207
208 PREC_STRATEGY precStrategy;
209
211 mutable Teuchos::Array< Teuchos::RCP<const Epetra_Operator> > precs;
212
214 mutable Teuchos::RCP<EpetraExt::BlockVector> prec_x;
215
216 };
217
218 } // namespace Epetra
219} // namespace NOX
220
221#endif
222
223#endif