19#ifndef BLOCK_PCG_SOLVER_H
20#define BLOCK_PCG_SOLVER_H
22#include "Epetra_ConfigDefs.h"
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"
34#include "FortranRoutines.h"
37class BlockPCGSolver :
public virtual Epetra_Operator {
41 const Epetra_Comm &MyComm;
42 const Epetra_BLAS callBLAS;
43 const Epetra_LAPACK callLAPACK;
44 const FortranRoutines callFortran;
46 const Epetra_Operator *K;
47 Epetra_Operator *Prec;
49 mutable AztecOO *vectorPCG;
56 mutable double *workSpace;
57 mutable int lWorkSpace;
65 BlockPCGSolver(
const BlockPCGSolver &ref);
66 BlockPCGSolver& operator=(
const BlockPCGSolver &ref);
70 BlockPCGSolver(
const Epetra_Comm& _Com,
const Epetra_Operator *KK,
71 double _tol = 0.0,
int _iMax = 0,
int _verb = 0);
73 BlockPCGSolver(
const Epetra_Comm& _Com,
const Epetra_Operator *KK,
75 double _tol = 0.0,
int _iMax = 0,
int _verb = 0);
79 char * Label()
const {
return "Epetra_Operator for Block PCG solver"; };
81 bool UseTranspose()
const {
return (
false); };
82 int SetUseTranspose(
bool UseTranspose_in) {
return 0; };
84 bool HasNormInf()
const {
return (
false); };
85 double NormInf()
const {
return (-1.0); };
87 int Apply(
const Epetra_MultiVector &X, Epetra_MultiVector &Y)
const;
88 int ApplyInverse(
const Epetra_MultiVector &X, Epetra_MultiVector &Y)
const;
90 const Epetra_Comm& Comm()
const {
return MyComm; };
92 const Epetra_Map& OperatorDomainMap()
const {
return K->OperatorDomainMap(); };
93 const Epetra_Map& OperatorRangeMap()
const {
return K->OperatorRangeMap(); };
95 int Solve(
const Epetra_MultiVector &X, Epetra_MultiVector &Y)
const;
96 int Solve(
const Epetra_MultiVector &X, Epetra_MultiVector &Y,
int blkSize)
const;
98 const Epetra_Operator* getPreconditioner()
const {
return Prec; };
99 void setPreconditioner(Epetra_Operator *PP);
101 void setIterMax(
int _iMax) { iterMax = (_iMax > 0) ? _iMax : 0; };
103 int getMaxIter()
const {
return maxIter; };
104 double getAvgIter()
const {
return sumIter/((double) numSolve); };
105 int getMinIter()
const {
return minIter; };