Grid 0.7.0
JacobiPolynomial.h
Go to the documentation of this file.
1#ifndef GRID_JACOBIPOLYNOMIAL_H
2#define GRID_JACOBIPOLYNOMIAL_H
3
5
7
8template<class Field>
9class JacobiPolynomial : public OperatorFunction<Field> {
10 private:
11 using OperatorFunction<Field>::operator();
12
13 int order;
18
19 public:
20 void csv(std::ostream &out){
21 csv(out,lo,hi);
22 }
23 void csv(std::ostream &out,RealD llo,RealD hhi){
24 RealD diff = hhi-llo;
25 RealD delta = diff*1.0e-5;
26 for (RealD x=llo-delta; x<=hhi; x+=delta) {
27 RealD f = approx(x);
28 out<< x<<" "<<f <<std::endl;
29 }
30 return;
31 }
32
34 JacobiPolynomial(RealD _lo,RealD _hi,int _order,RealD _alpha, RealD _beta)
35 {
36 lo=_lo;
37 hi=_hi;
38 alpha=_alpha;
39 beta=_beta;
40 order=_order;
41 };
42
43 RealD approx(RealD x) // Convenience for plotting the approximation
44 {
45 RealD Tn;
46 RealD Tnm;
47 RealD Tnp;
48
49 RealD y=( x-0.5*(hi+lo))/(0.5*(hi-lo));
50
51 RealD T0=1.0;
52 RealD T1=(alpha-beta)*0.5+(alpha+beta+2.0)*0.5*y;
53
54 Tn =T1;
55 Tnm=T0;
56 for(int n=2;n<=order;n++){
57 RealD cnp = 2.0*n*(n+alpha+beta)*(2.0*n-2.0+alpha+beta);
58 RealD cny = (2.0*n-2.0+alpha+beta)*(2.0*n-1.0+alpha+beta)*(2.0*n+alpha+beta);
59 RealD cn1 = (2.0*n+alpha+beta-1.0)*(alpha*alpha-beta*beta);
60 RealD cnm = - 2.0*(n+alpha-1.0)*(n+beta-1.0)*(2.0*n+alpha+beta);
61 Tnp= ( cny * y *Tn + cn1 * Tn + cnm * Tnm )/ cnp;
62 Tnm=Tn;
63 Tn =Tnp;
64 }
65 return Tnp;
66 };
67
68 // Implement the required interface
69 void operator() (LinearOperatorBase<Field> &Linop, const Field &in, Field &out) {
70 GridBase *grid=in.Grid();
71
72 int vol=grid->gSites();
73
74 Field T0(grid);
75 Field T1(grid);
76 Field T2(grid);
77 Field y(grid);
78
79
80 Field *Tnm = &T0;
81 Field *Tn = &T1;
82 Field *Tnp = &T2;
83
84 // RealD T0=1.0;
85 T0=in;
86
87 // RealD y=( x-0.5*(hi+lo))/(0.5*(hi-lo));
88 // = x * 2/(hi-lo) - (hi+lo)/(hi-lo)
89 Linop.HermOp(T0,y);
90 RealD xscale = 2.0/(hi-lo);
91 RealD mscale = -(hi+lo)/(hi-lo);
92 Linop.HermOp(T0,y);
93 y=y*xscale+in*mscale;
94
95 // RealD T1=(alpha-beta)*0.5+(alpha+beta+2.0)*0.5*y;
96 RealD halfAmB = (alpha-beta)*0.5;
97 RealD halfApBp2= (alpha+beta+2.0)*0.5;
98 T1 = halfAmB * in + halfApBp2*y;
99
100 for(int n=2;n<=order;n++){
101
102 Linop.HermOp(*Tn,y);
103 y=xscale*y+mscale*(*Tn);
104
105 RealD cnp = 2.0*n*(n+alpha+beta)*(2.0*n-2.0+alpha+beta);
106 RealD cny = (2.0*n-2.0+alpha+beta)*(2.0*n-1.0+alpha+beta)*(2.0*n+alpha+beta);
107 RealD cn1 = (2.0*n+alpha+beta-1.0)*(alpha*alpha-beta*beta);
108 RealD cnm = - 2.0*(n+alpha-1.0)*(n+beta-1.0)*(2.0*n+alpha+beta);
109
110 // Tnp= ( cny * y *Tn + cn1 * Tn + cnm * Tnm )/ cnp;
111 cny=cny/cnp;
112 cn1=cn1/cnp;
113 cn1=cn1/cnp;
114 cnm=cnm/cnp;
115
116 *Tnp=cny*y + cn1 *(*Tn) + cnm * (*Tnm);
117
118 // Cycle pointers to avoid copies
119 Field *swizzle = Tnm;
120 Tnm =Tn;
121 Tn =Tnp;
122 Tnp =swizzle;
123 }
124 out=*Tnp;
125
126 }
127};
129#endif
constexpr Real delta(int a, int b)
#define NAMESPACE_BEGIN(A)
Definition Namespace.h:35
#define NAMESPACE_END(A)
Definition Namespace.h:36
double RealD
Definition Simd.h:61
#define T2
#define T1
#define T0
int64_t gSites(void) const
void operator()(LinearOperatorBase< Field > &Linop, const Field &in, Field &out)
JacobiPolynomial(RealD _lo, RealD _hi, int _order, RealD _alpha, RealD _beta)
RealD approx(RealD x)
void csv(std::ostream &out, RealD llo, RealD hhi)
void csv(std::ostream &out)
virtual void HermOp(const Field &in, Field &out)=0