IFPACK  Development
 All Classes Namespaces Files Functions Variables Enumerations Friends Pages
Ifpack_TriDiContainer.h
1 /*@HEADER
2 // ***********************************************************************
3 //
4 // Ifpack: Object-Oriented Algebraic Preconditioner Package
5 // Copyright (2002) Sandia Corporation
6 //
7 // Under terms of Contract DE-AC04-94AL85000, there is a non-exclusive
8 // license for use of this work by or on behalf of the U.S. Government.
9 //
10 // Redistribution and use in source and binary forms, with or without
11 // modification, are permitted provided that the following conditions are
12 // met:
13 //
14 // 1. Redistributions of source code must retain the above copyright
15 // notice, this list of conditions and the following disclaimer.
16 //
17 // 2. Redistributions in binary form must reproduce the above copyright
18 // notice, this list of conditions and the following disclaimer in the
19 // documentation and/or other materials provided with the distribution.
20 //
21 // 3. Neither the name of the Corporation nor the names of the
22 // contributors may be used to endorse or promote products derived from
23 // this software without specific prior written permission.
24 //
25 // THIS SOFTWARE IS PROVIDED BY SANDIA CORPORATION "AS IS" AND ANY
26 // EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
27 // IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
28 // PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL SANDIA CORPORATION OR THE
29 // CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
30 // EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
31 // PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
32 // PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF
33 // LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
34 // NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
35 // SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
36 //
37 // Questions? Contact Michael A. Heroux (maherou@sandia.gov)
38 //
39 // ***********************************************************************
40 //@HEADER
41 */
42 
43 #ifndef IFPACK_TRIDICONTAINER_H
44 #define IFPACK_TRIDICONTAINER_H
45 
46 #include "Ifpack_ConfigDefs.h"
47 #include "Ifpack_Container.h"
48 #include "Ifpack_SerialTriDiMatrix.h"
49 #include "Ifpack_SerialTriDiSolver.h"
50 #include "Epetra_IntSerialDenseVector.h" // Is this needed \cbl
51 #include "Epetra_SerialDenseVector.h"
52 class Epetra_RowMatrix;
53 
55 
119 
120 public:
121 
123 
125  Ifpack_TriDiContainer(const int NumRows_in, const int NumVectors_in = 1) :
126  NumRows_(NumRows_in),
127  NumVectors_(NumVectors_in),
128  KeepNonFactoredMatrix_(false),
129  IsInitialized_(false),
130  IsComputed_(false),
131  ComputeFlops_(0.0),
132  ApplyFlops_(0.0),
133  ApplyInverseFlops_(0.0)
134  {}
135 
138  NumRows_(rhs.NumRows()),
139  NumVectors_(rhs.NumVectors()),
140  KeepNonFactoredMatrix_(rhs.KeepNonFactoredMatrix()),
141  IsInitialized_(rhs.IsInitialized()),
142  IsComputed_(rhs.IsComputed())
143  {
144  Matrix_ = rhs.Matrix();
145  if (KeepNonFactoredMatrix_)
146  NonFactoredMatrix_ = rhs.NonFactoredMatrix();
147  LHS_ = rhs.LHS();
148  RHS_ = rhs.RHS();
149  ID_ = rhs.ID();
150  }
151 
154  {}
156 
158 
161  {
162  if (&rhs == this)
163  return(*this);
164 
165  NumRows_ = rhs.NumRows();
166  NumVectors_ = rhs.NumVectors();
167  IsComputed_ = rhs.IsComputed();
168  KeepNonFactoredMatrix_ = rhs.KeepNonFactoredMatrix();
169  Matrix_ = rhs.Matrix();
170  if (KeepNonFactoredMatrix_)
171  NonFactoredMatrix_ = rhs.NonFactoredMatrix();
172  LHS_ = rhs.LHS();
173  RHS_ = rhs.RHS();
174  ID_ = rhs.ID();
175 
176  return(*this);
177  }
178 
180 
182 
184  virtual int NumRows() const;
185 
187  virtual int NumVectors() const
188  {
189  return(NumVectors_);
190  }
191 
193  virtual int SetNumVectors(const int NumVectors_in)
194  {
195  if (NumVectors_ == NumVectors_in)
196  return(0);
197 
198  NumVectors_ = NumVectors_in;
199  IFPACK_CHK_ERR(RHS_.Reshape(NumRows_,NumVectors_));
200  IFPACK_CHK_ERR(LHS_.Reshape(NumRows_,NumVectors_));
201  // zero out vector elements
202  for (int i = 0 ; i < NumRows_ ; ++i)
203  for (int j = 0 ; j < NumVectors_ ; ++j) {
204  LHS_(i,j) = 0.0;
205  RHS_(i,j) = 0.0;
206  }
207  if (NumRows_!=0)
208  {
209  IFPACK_CHK_ERR(Solver_.SetVectors(LHS_,RHS_));
210  }
211  return(0);
212  }
213 
215  virtual double& LHS(const int i, const int Vector = 0);
216 
218  virtual double& RHS(const int i, const int Vector = 0);
219 
221 
230  virtual int& ID(const int i);
231 
233  virtual int SetMatrixElement(const int row, const int col,
234  const double value);
235 
237  virtual int SetParameters(Teuchos::ParameterList& /* List */)
238  {
239  return(0);
240  }
241 
243  virtual bool IsInitialized() const
244  {
245  return(IsInitialized_);
246  }
247 
249  virtual bool IsComputed() const
250  {
251  return(IsComputed_);
252  }
253 
255  virtual const char* Label() const
256  {
257  return(Label_.c_str());
258  }
259 
261  virtual int SetKeepNonFactoredMatrix(const bool flag)
262  {
263  KeepNonFactoredMatrix_ = flag;
264  return(0);
265  }
266 
268  virtual bool KeepNonFactoredMatrix() const
269  {
270  return(KeepNonFactoredMatrix_);
271  }
272 
274  virtual const Epetra_SerialDenseMatrix& LHS() const
275  {
276  return(LHS_);
277  }
278 
280  virtual const Epetra_SerialDenseMatrix& RHS() const
281  {
282  return(RHS_);
283  }
284 
286  virtual const Ifpack_SerialTriDiMatrix& Matrix() const
287  {
288  return(Matrix_);
289  }
290 
293  {
294  return(NonFactoredMatrix_);
295  }
296 
298  virtual const Epetra_IntSerialDenseVector& ID() const
299  {
300  return(ID_);
301  }
302 
304 
306  virtual int Initialize();
308 
310  virtual int Compute(const Epetra_RowMatrix& Matrix_in);
311 
313  virtual int Apply();
314 
316  virtual int ApplyInverse();
317 
319 
320  virtual double InitializeFlops() const
321  {
322  return(0.0);
323  }
324 
325  virtual double ComputeFlops() const
326  {
327  return(ComputeFlops_);
328  }
329 
330  virtual double ApplyFlops() const
331  {
332  return(ApplyFlops_);
333  }
334 
335  virtual double ApplyInverseFlops() const
336  {
337  return(ApplyInverseFlops_);
338  }
339 
341  virtual std::ostream& Print(std::ostream& os) const;
342 
343 private:
344 
346  virtual int Extract(const Epetra_RowMatrix& Matrix_in);
347 
349  int NumRows_;
351  int NumVectors_;
353  Ifpack_SerialTriDiMatrix NonFactoredMatrix_;
355  Ifpack_SerialTriDiMatrix Matrix_;
361  Ifpack_SerialTriDiSolver Solver_;
365  bool KeepNonFactoredMatrix_;
367  bool IsInitialized_;
369  bool IsComputed_;
371  std::string Label_;
372 
374  double ComputeFlops_;
376  double ApplyFlops_;
378  double ApplyInverseFlops_;
379 };
380 
381 #endif
virtual int NumRows() const
Returns the number of rows of the matrix and LHS/RHS.
virtual std::ostream & Print(std::ostream &os) const
Prints basic information on iostream. This function is used by operator&lt;&lt;.
Ifpack_TriDiContainer(const Ifpack_TriDiContainer &rhs)
Copy constructor.
virtual int NumVectors() const
Returns the number of vectors in LHS/RHS.
Ifpack_TriDiContainer: a class to define containers for dense matrices.
virtual const Epetra_IntSerialDenseVector & ID() const
Returns the integer dense vector of IDs.
virtual int SetMatrixElement(const int row, const int col, const double value)
Set the matrix element (row,col) to value.
virtual const Epetra_SerialDenseMatrix & RHS() const
Returns the dense vector containing the RHS.
virtual double InitializeFlops() const
Returns the flops in Initialize().
virtual double & LHS(const int i, const int Vector=0)
Returns the i-th component of the vector Vector of LHS.
Ifpack_SerialTriDiSolver: A class for solving TriDi linear problems.
virtual const char * Label() const
Returns the label of this container.
virtual const Epetra_SerialDenseMatrix & LHS() const
Returns the dense vector containing the LHS.
virtual int SetParameters(Teuchos::ParameterList &)
Sets all necessary parameters.
virtual int SetKeepNonFactoredMatrix(const bool flag)
If flag is true, keeps a copy of the non-factored matrix.
virtual int & ID(const int i)
Returns the ID associated to local row i.
virtual const Ifpack_SerialTriDiMatrix & Matrix() const
Returns the dense matrix or its factors.
virtual double & RHS(const int i, const int Vector=0)
Returns the i-th component of the vector Vector of RHS.
virtual ~Ifpack_TriDiContainer()
Destructor.
virtual double ComputeFlops() const
Returns the flops in Compute().
virtual double ApplyFlops() const
Returns the flops in Apply().
virtual int SetNumVectors(const int NumVectors_in)
Sets the number of vectors for LHS/RHS.
virtual const Ifpack_SerialTriDiMatrix & NonFactoredMatrix() const
Returns the non-factored dense matrix (only if stored).
Ifpack_TriDiContainer & operator=(const Ifpack_TriDiContainer &rhs)
Operator=.
int Reshape(int NumRows, int NumCols)
virtual int Apply()
Apply the matrix to RHS, results are stored in LHS.
virtual double ApplyInverseFlops() const
Returns the flops in ApplyInverse().
virtual int Compute(const Epetra_RowMatrix &Matrix_in)
Finalizes the linear system matrix and prepares for the application of the inverse.
Ifpack_SerialTriDiMatrix: A class for constructing and using real double precision general TriDi matr...
virtual int ApplyInverse()
Apply the inverse of the matrix to RHS, results are stored in LHS.
virtual int Initialize()
Initialize the container.
int SetVectors(Epetra_SerialDenseMatrix &X, Epetra_SerialDenseMatrix &B)
Sets the pointers for left and right hand side vector(s).
Ifpack_Container: a pure virtual class for creating and solving local linear problems.
virtual bool IsInitialized() const
Returns true is the container has been successfully initialized.
virtual bool KeepNonFactoredMatrix() const
Returns KeepNonFactoredMatrix_.
virtual bool IsComputed() const
Returns true is the container has been successfully computed.
Ifpack_TriDiContainer(const int NumRows_in, const int NumVectors_in=1)
Default constructor.