19#ifndef KNYAZEV_LOBPCG_H
20#define KNYAZEV_LOBPCG_H
22#include "Epetra_ConfigDefs.h"
24#include "Epetra_BLAS.h"
25#include "Epetra_Comm.h"
26#include "Epetra_Operator.h"
27#include "Epetra_Time.h"
29#include "CheckingTools.h"
30#include "FortranRoutines.h"
31#include "ModalAnalysisSolver.h"
33#include "ModalTools.h"
34#include "SortingTools.h"
36class KnyazevLOBPCG :
public ModalAnalysisSolver {
40 const CheckingTools myVerify;
41 const Epetra_BLAS callBLAS;
42 const FortranRoutines callFortran;
44 const SortingTools mySort;
46 const Epetra_Comm &MyComm;
47 const Epetra_Operator *K;
48 const Epetra_Operator *M;
49 const Epetra_Operator *Prec;
50 const Epetra_Time MyWatch;
53 int maxIterEigenSolve;
75 double timeLocalSolve;
76 double timeLocalUpdate;
86 void accuracyCheck(
const Epetra_MultiVector *X,
const Epetra_MultiVector *MX,
87 const Epetra_MultiVector *R)
const;
90 KnyazevLOBPCG(
const KnyazevLOBPCG &ref);
91 KnyazevLOBPCG& operator=(
const KnyazevLOBPCG &ref);
95 KnyazevLOBPCG(
const Epetra_Comm &_Comm,
const Epetra_Operator *KK,
96 const Epetra_Operator *PP,
97 double _tol = 1.0e-08,
int _maxIter = 100,
int _verb = 0);
99 KnyazevLOBPCG(
const Epetra_Comm &_Comm,
const Epetra_Operator *KK,
100 const Epetra_Operator *MM,
const Epetra_Operator *PP,
101 double _tol = 1.0e-08,
int _maxIter = 100,
int _verb = 0,
double *_weight = 0);
105 int solve(
int numEigen, Epetra_MultiVector &Q,
double *lambda);
107 int reSolve(
int numEigen, Epetra_MultiVector &Q,
double *lambda,
int startingEV = 0);
109 int minimumSpaceDimension(
int nev)
const {
return nev; }
111 void initializeCounters();
113 void algorithmInfo()
const;
114 void historyInfo()
const;
115 void memoryInfo()
const;
116 void operationInfo()
const;
117 void timeInfo()
const;