mirror of
https://github.com/paboyle/Grid.git
synced 2025-04-09 21:50:45 +01:00
CG improvements for smoother
This commit is contained in:
parent
0ac85fa70b
commit
14e9d8ed9f
@ -54,11 +54,14 @@ public:
|
|||||||
ConjugateGradient(RealD tol, Integer maxit, bool err_on_no_conv = true)
|
ConjugateGradient(RealD tol, Integer maxit, bool err_on_no_conv = true)
|
||||||
: Tolerance(tol),
|
: Tolerance(tol),
|
||||||
MaxIterations(maxit),
|
MaxIterations(maxit),
|
||||||
ErrorOnNoConverge(err_on_no_conv){};
|
ErrorOnNoConverge(err_on_no_conv)
|
||||||
|
{};
|
||||||
|
|
||||||
void operator()(LinearOperatorBase<Field> &Linop, const Field &src, Field &psi) {
|
void operator()(LinearOperatorBase<Field> &Linop, const Field &src, Field &psi) {
|
||||||
|
|
||||||
GRID_TRACE("ConjugateGradient");
|
GRID_TRACE("ConjugateGradient");
|
||||||
|
GridStopWatch PreambleTimer;
|
||||||
|
PreambleTimer.Start();
|
||||||
psi.Checkerboard() = src.Checkerboard();
|
psi.Checkerboard() = src.Checkerboard();
|
||||||
|
|
||||||
conformable(psi, src);
|
conformable(psi, src);
|
||||||
@ -66,22 +69,26 @@ public:
|
|||||||
RealD cp, c, a, d, b, ssq, qq;
|
RealD cp, c, a, d, b, ssq, qq;
|
||||||
//RealD b_pred;
|
//RealD b_pred;
|
||||||
|
|
||||||
Field p(src);
|
// Was doing copies
|
||||||
Field mmp(src);
|
Field p(src.Grid());
|
||||||
Field r(src);
|
Field mmp(src.Grid());
|
||||||
|
Field r(src.Grid());
|
||||||
|
|
||||||
// Initial residual computation & set up
|
// Initial residual computation & set up
|
||||||
|
ssq = norm2(src);
|
||||||
RealD guess = norm2(psi);
|
RealD guess = norm2(psi);
|
||||||
assert(std::isnan(guess) == 0);
|
assert(std::isnan(guess) == 0);
|
||||||
|
if ( guess == 0.0 ) {
|
||||||
Linop.HermOpAndNorm(psi, mmp, d, b);
|
r = src;
|
||||||
|
p = r;
|
||||||
r = src - mmp;
|
a = ssq;
|
||||||
p = r;
|
} else {
|
||||||
|
Linop.HermOpAndNorm(psi, mmp, d, b);
|
||||||
a = norm2(p);
|
r = src - mmp;
|
||||||
|
p = r;
|
||||||
|
a = norm2(p);
|
||||||
|
}
|
||||||
cp = a;
|
cp = a;
|
||||||
ssq = norm2(src);
|
|
||||||
|
|
||||||
// Handle trivial case of zero src
|
// Handle trivial case of zero src
|
||||||
if (ssq == 0.){
|
if (ssq == 0.){
|
||||||
@ -103,7 +110,7 @@ public:
|
|||||||
// Check if guess is really REALLY good :)
|
// Check if guess is really REALLY good :)
|
||||||
if (cp <= rsq) {
|
if (cp <= rsq) {
|
||||||
TrueResidual = std::sqrt(a/ssq);
|
TrueResidual = std::sqrt(a/ssq);
|
||||||
std::cout << GridLogMessage << "ConjugateGradient guess is converged already : cp " << cp <<" rsq "<<rsq <<" ssq "<<ssq<< std::endl;
|
std::cout << GridLogMessage << "ConjugateGradient guess is converged already " << std::endl;
|
||||||
IterationsToComplete = 0;
|
IterationsToComplete = 0;
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
@ -111,6 +118,7 @@ public:
|
|||||||
std::cout << GridLogIterative << std::setprecision(8)
|
std::cout << GridLogIterative << std::setprecision(8)
|
||||||
<< "ConjugateGradient: k=0 residual " << cp << " target " << rsq << std::endl;
|
<< "ConjugateGradient: k=0 residual " << cp << " target " << rsq << std::endl;
|
||||||
|
|
||||||
|
PreambleTimer.Stop();
|
||||||
GridStopWatch LinalgTimer;
|
GridStopWatch LinalgTimer;
|
||||||
GridStopWatch InnerTimer;
|
GridStopWatch InnerTimer;
|
||||||
GridStopWatch AxpyNormTimer;
|
GridStopWatch AxpyNormTimer;
|
||||||
@ -183,7 +191,8 @@ public:
|
|||||||
<< "\tTrue residual " << true_residual
|
<< "\tTrue residual " << true_residual
|
||||||
<< "\tTarget " << Tolerance << std::endl;
|
<< "\tTarget " << Tolerance << std::endl;
|
||||||
|
|
||||||
std::cout << GridLogMessage << "\tElapsed " << SolverTimer.Elapsed() <<std::endl;
|
// std::cout << GridLogMessage << "\tPreamble " << PreambleTimer.Elapsed() <<std::endl;
|
||||||
|
std::cout << GridLogMessage << "\tSolver Elapsed " << SolverTimer.Elapsed() <<std::endl;
|
||||||
std::cout << GridLogPerformance << "Time breakdown "<<std::endl;
|
std::cout << GridLogPerformance << "Time breakdown "<<std::endl;
|
||||||
std::cout << GridLogPerformance << "\tMatrix " << MatrixTimer.Elapsed() <<std::endl;
|
std::cout << GridLogPerformance << "\tMatrix " << MatrixTimer.Elapsed() <<std::endl;
|
||||||
std::cout << GridLogPerformance << "\tLinalg " << LinalgTimer.Elapsed() <<std::endl;
|
std::cout << GridLogPerformance << "\tLinalg " << LinalgTimer.Elapsed() <<std::endl;
|
||||||
@ -202,13 +211,22 @@ public:
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
// Failed. Calculate true residual before giving up
|
// Failed. Calculate true residual before giving up
|
||||||
Linop.HermOpAndNorm(psi, mmp, d, qq);
|
// Linop.HermOpAndNorm(psi, mmp, d, qq);
|
||||||
p = mmp - src;
|
// p = mmp - src;
|
||||||
|
//TrueResidual = sqrt(norm2(p)/ssq);
|
||||||
TrueResidual = sqrt(norm2(p)/ssq);
|
// TrueResidual = 1;
|
||||||
|
|
||||||
std::cout << GridLogMessage << "ConjugateGradient did NOT converge "<<k<<" / "<< MaxIterations
|
std::cout << GridLogMessage << "ConjugateGradient did NOT converge "<<k<<" / "<< MaxIterations
|
||||||
<<" residual "<< TrueResidual<< std::endl;
|
<<" residual "<< std::sqrt(cp / ssq)<< std::endl;
|
||||||
|
SolverTimer.Stop();
|
||||||
|
std::cout << GridLogMessage << "\tPreamble " << PreambleTimer.Elapsed() <<std::endl;
|
||||||
|
std::cout << GridLogMessage << "\tSolver " << SolverTimer.Elapsed() <<std::endl;
|
||||||
|
std::cout << GridLogMessage << "Solver breakdown "<<std::endl;
|
||||||
|
std::cout << GridLogMessage << "\tMatrix " << MatrixTimer.Elapsed() <<std::endl;
|
||||||
|
std::cout << GridLogMessage<< "\tLinalg " << LinalgTimer.Elapsed() <<std::endl;
|
||||||
|
std::cout << GridLogPerformance << "\t\tInner " << InnerTimer.Elapsed() <<std::endl;
|
||||||
|
std::cout << GridLogPerformance << "\t\tAxpyNorm " << AxpyNormTimer.Elapsed() <<std::endl;
|
||||||
|
std::cout << GridLogPerformance << "\t\tLinearComb " << LinearCombTimer.Elapsed() <<std::endl;
|
||||||
|
|
||||||
if (ErrorOnNoConverge) assert(0);
|
if (ErrorOnNoConverge) assert(0);
|
||||||
IterationsToComplete = k;
|
IterationsToComplete = k;
|
||||||
|
Loading…
x
Reference in New Issue
Block a user