mirror of
https://github.com/paboyle/Grid.git
synced 2025-06-16 06:47:06 +01:00
Added storage of final true residual in mixed-prec CG and enhanced log output Fixed const correctness of multi-shift constructor Added a mixed precision variant of the multi-shift algorithm that uses a single precision operator and applies periodic reliable update to the residual Added tests/solver/Test_dwf_multishift_mixedprec to test the above Fixed local coherence lanczos using the (large!) max approx to the chebyshev eval as the scale from which to judge the quality of convergence, resulting a test that always passes Added a method to local coherence lanczos class that returns the fine eval/evec pair Added iterative log output to power method Added optional disabling of the plaquette check in Nerscio to support loading old G-parity configs which have a factor of 2 error in the plaquette G-parity Dirac op no longer allows GPBC in the time direction; instead we toggle between periodic and antiperiodic Replaced thread_for G-parity 5D force insertion implementation with accelerator_for version capable of running on GPUs Generalized tests/lanczos/Test_dwf_lanczos to support regular DWF as well as Gparity, with the action chosen by a command line option Modified tests/forces/Test_dwf_gpforce,Test_gpdwf_force,Test_gpwilson_force to use GPBC a spatial direction rather than the t-direction, and antiperiodic BCs for time direction tests/core/Test_gparity now supports using APBC in time direction using command line toggle
48 lines
1.2 KiB
C++
48 lines
1.2 KiB
C++
#pragma once
|
|
namespace Grid {
|
|
template<class Field> class PowerMethod
|
|
{
|
|
public:
|
|
|
|
template<typename T> static RealD normalise(T& v)
|
|
{
|
|
RealD nn = norm2(v);
|
|
nn = sqrt(nn);
|
|
v = v * (1.0/nn);
|
|
return nn;
|
|
}
|
|
|
|
RealD operator()(LinearOperatorBase<Field> &HermOp, const Field &src)
|
|
{
|
|
GridBase *grid = src.Grid();
|
|
|
|
// quickly get an idea of the largest eigenvalue to more properly normalize the residuum
|
|
RealD evalMaxApprox = 0.0;
|
|
auto src_n = src;
|
|
auto tmp = src;
|
|
const int _MAX_ITER_EST_ = 50;
|
|
|
|
for (int i=0;i<_MAX_ITER_EST_;i++) {
|
|
|
|
normalise(src_n);
|
|
HermOp.HermOp(src_n,tmp);
|
|
RealD vnum = real(innerProduct(src_n,tmp)); // HermOp.
|
|
RealD vden = norm2(src_n);
|
|
RealD na = vnum/vden;
|
|
|
|
std::cout << GridLogIterative << "PowerMethod: Current approximation of largest eigenvalue " << na << std::endl;
|
|
|
|
if ( (fabs(evalMaxApprox/na - 1.0) < 0.001) || (i==_MAX_ITER_EST_-1) ) {
|
|
evalMaxApprox = na;
|
|
std::cout << GridLogMessage << " Approximation of largest eigenvalue: " << evalMaxApprox << std::endl;
|
|
return evalMaxApprox;
|
|
}
|
|
evalMaxApprox = na;
|
|
src_n = tmp;
|
|
}
|
|
assert(0);
|
|
return 0;
|
|
}
|
|
};
|
|
}
|