19#ifndef JACOBI_DAVIDSON_PCG_H
20#define JACOBI_DAVIDSON_PCG_H
22#include "Epetra_ConfigDefs.h"
24#include "Epetra_BLAS.h"
25#include "Epetra_Comm.h"
26#include "Epetra_LAPACK.h"
27#include "Epetra_Operator.h"
28#include "Epetra_Time.h"
30#include "CheckingTools.h"
31#include "FortranRoutines.h"
32#include "ModalAnalysisSolver.h"
34#include "ModalTools.h"
35#include "SortingTools.h"
37class JDPCG :
public ModalAnalysisSolver {
41 const CheckingTools myVerify;
42 const Epetra_BLAS callBLAS;
43 const FortranRoutines callFortran;
44 const Epetra_LAPACK callLAPACK;
46 const SortingTools mySort;
48 const Epetra_Comm &MyComm;
49 const Epetra_Operator *K;
50 const Epetra_Operator *M;
51 const Epetra_Operator *Prec;
52 const Epetra_Time MyWatch;
55 int maxIterEigenSolve;
57 int maxIterLinearSolve;
71 int *spaceSizeHistory;
81 int numCorrectionPrec;
82 int numCorrectionSolve;
91 double timeBuildQtMPMQ;
92 double timeCorrectionPrec;
93 double timeCorrectionSolve;
95 double timeLocalSolve;
96 double timeLocalUpdate;
100 double timeOuterLoop;
101 double timePCGEigCheck;
103 double timePCGOpMult;
105 double timePostProce;
112 void accuracyCheck(
const Epetra_MultiVector *X,
const Epetra_MultiVector *MX,
113 const Epetra_MultiVector *Q)
const;
116 JDPCG(
const JDPCG &ref);
117 JDPCG& operator=(
const JDPCG &ref);
121 int jacobiPreconditioner(
const Epetra_MultiVector &B, Epetra_MultiVector &PrecB,
122 const Epetra_MultiVector *U,
const Epetra_MultiVector *Q,
123 double *invQtMPMQ,
int ldQtMPMQ,
double *PMQ,
double *work,
double *WS);
124 int jacobiPCG(Epetra_MultiVector &Rlin, Epetra_MultiVector &Y,
125 const Epetra_MultiVector *U,
const Epetra_MultiVector *Q,
126 double eta,
double tolCG,
int iterMax,
127 double *invQtMPMQ,
int ldQtMPMQ,
double *PMQ,
128 double *work,
double *workSpace,
129 const Epetra_Vector *vectWeight,
const Epetra_MultiVector *orthoVec = 0);
133 JDPCG(
const Epetra_Comm &_Comm,
const Epetra_Operator *KK,
134 const Epetra_Operator *MM,
const Epetra_Operator *PP,
int _blk,
int _numBlk,
135 double _tol = 1.0e-08,
int _maxIterES = 100,
int _maxIterLS = 100,
int _verb = 0,
136 double *_weight = 0);
140 int solve(
int numEigen, Epetra_MultiVector &Q,
double *lambda);
142 int reSolve(
int numEigen, Epetra_MultiVector &Q,
double *lambda,
int startingEV = 0);
144 int minimumSpaceDimension(
int nev)
const;
146 void initializeCounters();
148 void algorithmInfo()
const;
149 void historyInfo()
const;
150 void memoryInfo()
const;
151 void operationInfo()
const;
152 void timeInfo()
const;