#ifndef GRID_CHEBYSHEV_H #define GRID_CHEBYSHEV_H #include #include namespace Grid { //////////////////////////////////////////////////////////////////////////////////////////// // Simple general polynomial with user supplied coefficients //////////////////////////////////////////////////////////////////////////////////////////// template class Polynomial : public OperatorFunction { private: std::vector Coeffs; public: Polynomial(std::vector &_Coeffs) : Coeffs(_Coeffs) {}; // Implement the required interface void operator() (LinearOperatorBase &Linop, const Field &in, Field &out) { Field AtoN = in; out = AtoN*Coeffs[0]; for(int n=1;n class Chebyshev : public OperatorFunction { private: std::vector Coeffs; int order; double hi; double lo; public: void csv(std::ostream &out){ for (double x=lo; x &Linop, const Field &in, Field &out) { Field T0 = in; Field T1 = T0; // Field T1(T0._grid); more efficient but hardwires Lattice class Field T2 = T1; // use a pointer trick to eliminate copies Field *Tnm = &T0; Field *Tn = &T1; Field *Tnp = &T2; Field y = in; double xscale = 2.0/(hi-lo); double mscale = -(hi+lo)/(hi-lo); // Tn=T1 = (xscale M + mscale)in Linop.Op(T0,y); T1=y*xscale+in*mscale; // sum = .5 c[0] T0 + c[1] T1 out = (0.5*Coeffs[0])*T0 + Coeffs[1]*T1; for(int n=2;n