Anasazi Version of the Day
Loading...
Searching...
No Matches
BlockPCGSolver.h
1// @HEADER
2// *****************************************************************************
3// Anasazi: Block Eigensolvers Package
4//
5// Copyright 2004 NTESS and the Anasazi contributors.
6// SPDX-License-Identifier: BSD-3-Clause
7// *****************************************************************************
8// @HEADER
9
10// This software is a result of the research described in the report
11//
12// "A comparison of algorithms for modal analysis in the absence
13// of a sparse direct method", P. Arbenz, R. Lehoucq, and U. Hetmaniuk,
14// Sandia National Laboratories, Technical report SAND2003-1028J.
15//
16// It is based on the Epetra, AztecOO, and ML packages defined in the Trilinos
17// framework ( http://trilinos.org/ ).
18
19#ifndef BLOCK_PCG_SOLVER_H
20#define BLOCK_PCG_SOLVER_H
21
22#include "Epetra_ConfigDefs.h"
23
24#include "AztecOO.h"
25
26#include "Epetra_BLAS.h"
27#include "Epetra_Comm.h"
28#include "Epetra_LAPACK.h"
29#include "Epetra_Map.h"
30#include "Epetra_MultiVector.h"
31#include "Epetra_Operator.h"
32#include "Epetra_RowMatrix.h"
33
34#include "FortranRoutines.h"
35
36
37class BlockPCGSolver : public virtual Epetra_Operator {
38
39 private:
40
41 const Epetra_Comm &MyComm;
42 const Epetra_BLAS callBLAS;
43 const Epetra_LAPACK callLAPACK;
44 const FortranRoutines callFortran;
45
46 const Epetra_Operator *K;
47 Epetra_Operator *Prec;
48
49 mutable AztecOO *vectorPCG;
50
51 double tolCG;
52 int iterMax;
53
54 int verbose;
55
56 mutable double *workSpace;
57 mutable int lWorkSpace;
58
59 mutable int numSolve;
60 mutable int maxIter;
61 mutable int sumIter;
62 mutable int minIter;
63
64 // Don't define these functions
65 BlockPCGSolver(const BlockPCGSolver &ref);
66 BlockPCGSolver& operator=(const BlockPCGSolver &ref);
67
68 public:
69
70 BlockPCGSolver(const Epetra_Comm& _Com, const Epetra_Operator *KK,
71 double _tol = 0.0, int _iMax = 0, int _verb = 0);
72
73 BlockPCGSolver(const Epetra_Comm& _Com, const Epetra_Operator *KK,
74 Epetra_Operator *PP,
75 double _tol = 0.0, int _iMax = 0, int _verb = 0);
76
77 ~BlockPCGSolver();
78
79 char * Label() const { return "Epetra_Operator for Block PCG solver"; };
80
81 bool UseTranspose() const { return (false); };
82 int SetUseTranspose(bool UseTranspose_in) { return 0; };
83
84 bool HasNormInf() const { return (false); };
85 double NormInf() const { return (-1.0); };
86
87 int Apply(const Epetra_MultiVector &X, Epetra_MultiVector &Y) const;
88 int ApplyInverse(const Epetra_MultiVector &X, Epetra_MultiVector &Y) const;
89
90 const Epetra_Comm& Comm() const { return MyComm; };
91
92 const Epetra_Map& OperatorDomainMap() const { return K->OperatorDomainMap(); };
93 const Epetra_Map& OperatorRangeMap() const { return K->OperatorRangeMap(); };
94
95 int Solve(const Epetra_MultiVector &X, Epetra_MultiVector &Y) const;
96 int Solve(const Epetra_MultiVector &X, Epetra_MultiVector &Y, int blkSize) const;
97
98 const Epetra_Operator* getPreconditioner() const { return Prec; };
99 void setPreconditioner(Epetra_Operator *PP);
100
101 void setIterMax(int _iMax) { iterMax = (_iMax > 0) ? _iMax : 0; };
102
103 int getMaxIter() const { return maxIter; };
104 double getAvgIter() const { return sumIter/((double) numSolve); };
105 int getMinIter() const { return minIter; };
106
107};
108
109#endif