mirror of
https://github.com/paboyle/Grid.git
synced 2026-08-24 19:39:35 +01:00
Verbose options
This commit is contained in:
@@ -236,4 +236,5 @@ public:
|
|||||||
}
|
}
|
||||||
};
|
};
|
||||||
NAMESPACE_END(Grid);
|
NAMESPACE_END(Grid);
|
||||||
|
#undef GCRLogLevel
|
||||||
#endif
|
#endif
|
||||||
|
|||||||
@@ -38,13 +38,14 @@ Author: Peter Boyle <paboyle@ph.ed.ac.uk>
|
|||||||
///////////////////////////////////////////////////////////////////////////////////////////////////////
|
///////////////////////////////////////////////////////////////////////////////////////////////////////
|
||||||
NAMESPACE_BEGIN(Grid);
|
NAMESPACE_BEGIN(Grid);
|
||||||
|
|
||||||
#define GCRLogLevel std::cout << GridLogMessage <<std::string(level,'\t')<< " Level "<<level<<" "
|
#define GCRLogLevel std::cout << GridLogMessage <<std::string(level,'\t')<< name<<" "
|
||||||
|
|
||||||
template<class Field>
|
template<class Field>
|
||||||
class PrecGeneralisedConjugateResidualNonHermitian : public LinearFunction<Field> {
|
class PrecGeneralisedConjugateResidualNonHermitian : public LinearFunction<Field> {
|
||||||
public:
|
public:
|
||||||
using LinearFunction<Field>::operator();
|
using LinearFunction<Field>::operator();
|
||||||
RealD Tolerance;
|
RealD Tolerance;
|
||||||
|
RealD SSQ;
|
||||||
Integer MaxIterations;
|
Integer MaxIterations;
|
||||||
int verbose;
|
int verbose;
|
||||||
int mmax;
|
int mmax;
|
||||||
@@ -54,11 +55,18 @@ public:
|
|||||||
GridStopWatch PrecTimer;
|
GridStopWatch PrecTimer;
|
||||||
GridStopWatch MatTimer;
|
GridStopWatch MatTimer;
|
||||||
GridStopWatch LinalgTimer;
|
GridStopWatch LinalgTimer;
|
||||||
|
std::string name;
|
||||||
|
int ZeroGuess = 0; // caller contract: guess is always zero => first-cycle r0 = src, skip the apply
|
||||||
|
int FirstCycle = 0;
|
||||||
|
|
||||||
LinearFunction<Field> &Preconditioner;
|
LinearFunction<Field> &Preconditioner;
|
||||||
LinearOperatorBase<Field> &Linop;
|
LinearOperatorBase<Field> &Linop;
|
||||||
|
|
||||||
void Level(int lv) { level=lv; };
|
void Name(std::string _name) { name = _name; };
|
||||||
|
|
||||||
|
void Level(int n) { Name("Level " + std::to_string(n)); level = n; }
|
||||||
|
|
||||||
|
void SetZeroGuess(int z) { ZeroGuess = z; };
|
||||||
|
|
||||||
PrecGeneralisedConjugateResidualNonHermitian(RealD tol,Integer maxit,LinearOperatorBase<Field> &_Linop,LinearFunction<Field> &Prec,int _mmax,int _nstep) :
|
PrecGeneralisedConjugateResidualNonHermitian(RealD tol,Integer maxit,LinearOperatorBase<Field> &_Linop,LinearFunction<Field> &Prec,int _mmax,int _nstep) :
|
||||||
Tolerance(tol),
|
Tolerance(tol),
|
||||||
@@ -68,7 +76,7 @@ public:
|
|||||||
mmax(_mmax),
|
mmax(_mmax),
|
||||||
nstep(_nstep)
|
nstep(_nstep)
|
||||||
{
|
{
|
||||||
level=1;
|
Level(1);
|
||||||
verbose=1;
|
verbose=1;
|
||||||
};
|
};
|
||||||
|
|
||||||
@@ -77,6 +85,7 @@ public:
|
|||||||
// psi=Zero();
|
// psi=Zero();
|
||||||
RealD cp, ssq,rsq;
|
RealD cp, ssq,rsq;
|
||||||
ssq=norm2(src);
|
ssq=norm2(src);
|
||||||
|
SSQ=ssq;
|
||||||
rsq=Tolerance*Tolerance*ssq;
|
rsq=Tolerance*Tolerance*ssq;
|
||||||
|
|
||||||
Field r(src.Grid());
|
Field r(src.Grid());
|
||||||
@@ -89,11 +98,12 @@ public:
|
|||||||
SolverTimer.Start();
|
SolverTimer.Start();
|
||||||
|
|
||||||
steps=0;
|
steps=0;
|
||||||
|
FirstCycle=1;
|
||||||
for(int k=0;k<MaxIterations;k++){
|
for(int k=0;k<MaxIterations;k++){
|
||||||
|
|
||||||
cp=GCRnStep(src,psi,rsq);
|
cp=GCRnStep(src,psi,rsq);
|
||||||
|
|
||||||
GCRLogLevel <<"PGCR("<<mmax<<","<<nstep<<") "<< steps <<" steps cp = "<<cp<<" target "<<rsq <<std::endl;
|
GCRLogLevel <<"PGCR("<<mmax<<","<<nstep<<") "<< steps <<" steps cp = "<<sqrt(cp/ssq)<<" target "<<sqrt(rsq/ssq) <<std::endl;
|
||||||
|
|
||||||
if(cp<rsq) {
|
if(cp<rsq) {
|
||||||
|
|
||||||
@@ -142,20 +152,24 @@ public:
|
|||||||
GCRLogLevel<< "PGCR nStep("<<nstep<<")"<<std::endl;
|
GCRLogLevel<< "PGCR nStep("<<nstep<<")"<<std::endl;
|
||||||
|
|
||||||
//////////////////////////////////
|
//////////////////////////////////
|
||||||
// initial guess x0 is taken as nonzero.
|
// r0 = src - A x0. ZeroGuess: on the first cycle x0==0 by caller
|
||||||
// r0=src-A x0 = src
|
// contract (enforced here), so r0 = src exactly; skip the apply.
|
||||||
|
// Restart cycles (psi!=0) always do the full computation.
|
||||||
//////////////////////////////////
|
//////////////////////////////////
|
||||||
MatTimer.Start();
|
if (ZeroGuess && FirstCycle) {
|
||||||
Linop.Op(psi,Az);
|
psi = Zero();
|
||||||
// zAz = innerProduct(Az,psi);
|
LinalgTimer.Start();
|
||||||
zAAz= norm2(Az);
|
r = src;
|
||||||
MatTimer.Stop();
|
LinalgTimer.Stop();
|
||||||
|
} else {
|
||||||
|
MatTimer.Start();
|
||||||
LinalgTimer.Start();
|
Linop.Op(psi,Az);
|
||||||
r=src-Az;
|
MatTimer.Stop();
|
||||||
LinalgTimer.Stop();
|
LinalgTimer.Start();
|
||||||
GCRLogLevel<< "PGCR true residual r = src - A psi "<<norm2(r) <<std::endl;
|
r=src-Az;
|
||||||
|
LinalgTimer.Stop();
|
||||||
|
}
|
||||||
|
FirstCycle=0;
|
||||||
|
|
||||||
/////////////////////
|
/////////////////////
|
||||||
// p = Prec(r)
|
// p = Prec(r)
|
||||||
@@ -181,6 +195,7 @@ public:
|
|||||||
|
|
||||||
cp =norm2(r);
|
cp =norm2(r);
|
||||||
LinalgTimer.Stop();
|
LinalgTimer.Stop();
|
||||||
|
GCRLogLevel<< "PGCR true residual "<< sqrt(cp/SSQ) <<std::endl;
|
||||||
|
|
||||||
for(int k=0;k<nstep;k++){
|
for(int k=0;k<nstep;k++){
|
||||||
|
|
||||||
@@ -199,13 +214,12 @@ public:
|
|||||||
cp = axpy_norm(r,-a,q[peri_k],r);
|
cp = axpy_norm(r,-a,q[peri_k],r);
|
||||||
LinalgTimer.Stop();
|
LinalgTimer.Stop();
|
||||||
|
|
||||||
GCRLogLevel<< "PGCR step["<<steps<<"] resid " << cp << " target " <<rsq<<std::endl;
|
GCRLogLevel<< "PGCR step["<<steps<<"] resid " << sqrt(cp/SSQ)<<std::endl;
|
||||||
|
|
||||||
if((k==nstep-1)||(cp<rsq)){
|
if((k==nstep-1)||(cp<rsq)){
|
||||||
return cp;
|
return cp;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
PrecTimer.Start();
|
PrecTimer.Start();
|
||||||
Preconditioner(r,z);// solve Az = r
|
Preconditioner(r,z);// solve Az = r
|
||||||
PrecTimer.Stop();
|
PrecTimer.Stop();
|
||||||
@@ -239,4 +253,6 @@ public:
|
|||||||
}
|
}
|
||||||
};
|
};
|
||||||
NAMESPACE_END(Grid);
|
NAMESPACE_END(Grid);
|
||||||
|
|
||||||
|
#undef GCRLogLevel
|
||||||
#endif
|
#endif
|
||||||
|
|||||||
Reference in New Issue
Block a user