30#ifndef GRID_CHEBYSHEV_H
31#define GRID_CHEBYSHEV_H
58 void csv(std::ostream &out){
64 out<< x<<
" "<<f<<std::endl;
71 out<<
"Polynomial approx ["<<
lo<<
","<<
hi<<
"]"<<std::endl;
73 out <<x<<
"\t"<<
approx(x)<<std::endl;
92 if(
order < 2) exit(-1);
105 if(
order < 2) exit(-1);
107 for(
int j=0;j<
order;j++){
121 if(
order < 2) exit(-1);
123 for(
int j=0;j<
order;j++){
125 for(
int k=0;k<
order;k++){
134 template<
class functor>
141 if(
order < 2) exit(-1);
143 for(
int j=0;j<
order;j++){
145 for(
int k=0;k<
order;k++){
159 RealD lmax = std::cos(alpha);
161 std::vector<RealD>
U(M);
162 std::vector<RealD> a(M);
163 std::vector<RealD> g(M);
164 for(
int n=0;n<=M;n++){
165 U[n] = std::sin((n+1)*std::acos(lmax))/std::sin(std::acos(lmax));
168 sumUsq = std::sqrt(sumUsq);
170 for(
int i=1;i<=M;i++){
174 for(
int m=1;m<=M;m++){
176 for(
int i=0;i<=M-m;i++){
180 for(
int m=1;m<=M;m++){
201 for(
int i=2;i<
order;i++){
227 for(
int i=2;i<
order-1;i++){
241 for (i=0;i<maxiter;i++) {
243 if (fabs(eps / z) < resid)
248 return std::numeric_limits<double>::quiet_NaN();
257 typedef typename Field::vector_type vector_type;
259 Field
T0(grid);
T0 = in;
279 for(
int n=2;n<
order;n++){
282 axpby(y,xscale,mscale,y,(*Tn));
283 axpby(*Tnp,2.0,-1.0,y,(*Tnm));
289 Field *swizzle = Tnm;
316 for(
int i=0;i<_order;i++){
322 void csv(std::ostream &out){
325 out<< x<<
" "<<f<<std::endl;
338 RealD x = ( 2.0 * (xx-
mu)*(xx-
mu) - (aa+bb) ) / (aa-bb);
351 for(
int i=2;i<
order;i++){
373 tmp = tmp -
mu * out;
375 out = (2.0/ (aa-bb) ) * tmp - ((aa+bb)/(aa-bb))*in;
384 Field
T0(grid);
T0 = in;
398 for(
int n=2;n<
order;n++){
404 out=out+
Coeffs[n]* (*Tnp);
407 Field *swizzle = Tnm;
constexpr Real delta(int a, int b)
void axpy(Lattice< vobj > &ret, sobj a, const Lattice< vobj > &x, const Lattice< vobj > &y)
void axpby(Lattice< vobj > &ret, sobj a, sobj b, const Lattice< vobj > &x, const Lattice< vobj > &y)
vobj::scalar_object sum(const vobj *arg, Integer osites)
#define NAMESPACE_BEGIN(A)
static INTERNAL_PRECISION U
void csv(std::ostream &out)
void operator()(LinearOperatorBase< Field > &Linop, const Field &in, Field &out)
void AminusMuSq(LinearOperatorBase< Field > &Linop, const Field &in, Field &out)
ChebyshevLanczos(RealD _alpha, RealD _beta, RealD _mu, int _order)
std::vector< RealD > Coeffs
void Init(RealD _lo, RealD _hi, int _order, RealD(*func)(RealD))
Chebyshev(RealD _lo, RealD _hi, int _order)
void PlotApprox(std::ostream &out)
void Init(RealD _lo, RealD _hi, int _order, functor &func)
RealD approxInv(RealD z, RealD x0, int maxiter, RealD resid)
std::vector< RealD > Coeffs
void Init(RealD _lo, RealD _hi, int _order)
Chebyshev(RealD _lo, RealD _hi, int _order, RealD(*func)(RealD))
void operator()(LinearOperatorBase< Field > &Linop, const Field &in, Field &out)
void InitLowPass(RealD _lo, RealD _hi, int _order)
void csv(std::ostream &out)
int64_t gSites(void) const
virtual void HermOp(const Field &in, Field &out)=0
GRID_SERIALIZABLE_CLASS_MEMBERS(ChebyParams, RealD, alpha, RealD, beta, int, Npoly)