Grid 0.7.0
PartialFractionFermion5DImplementation.h
Go to the documentation of this file.
1/*************************************************************************************
2
3 Grid physics library, www.github.com/paboyle/Grid
4
5 Source file: ./lib/qcd/action/fermion/PartialFractionFermion5D.cc
6
7 Copyright (C) 2015
8
9Author: Peter Boyle <pabobyle@ph.ed.ac.uk>
10Author: Peter Boyle <paboyle@ph.ed.ac.uk>
11
12 This program is free software; you can redistribute it and/or modify
13 it under the terms of the GNU General Public License as published by
14 the Free Software Foundation; either version 2 of the License, or
15 (at your option) any later version.
16
17 This program is distributed in the hope that it will be useful,
18 but WITHOUT ANY WARRANTY; without even the implied warranty of
19 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
20 GNU General Public License for more details.
21
22 You should have received a copy of the GNU General Public License along
23 with this program; if not, write to the Free Software Foundation, Inc.,
24 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
25
26 See the full license in the file "LICENSE" in the top level distribution directory
27*************************************************************************************/
28/* END LEGAL */
31
33
34 template<class Impl>
35void PartialFractionFermion5D<Impl>::Mdir (const FermionField &psi, FermionField &chi,int dir,int disp){
36 // this does both dag and undag but is trivial; make a common helper routing
37 int Ls = this->Ls;
38
39 this->DhopDir(psi,chi,dir,disp);
40
41 int nblock=(Ls-1)/2;
42 for(int b=0;b<nblock;b++){
43 int s = 2*b;
44 ag5xpby_ssp(chi,-scale,chi,0.0,chi,s,s);
45 ag5xpby_ssp(chi, scale,chi,0.0,chi,s+1,s+1);
46 }
47 ag5xpby_ssp(chi,p[nblock]*scale/amax,chi,0.0,chi,Ls-1,Ls-1);
48}
49template<class Impl>
50void PartialFractionFermion5D<Impl>::MdirAll (const FermionField &psi, std::vector<FermionField> &chi){
51 // this does both dag and undag but is trivial; make a common helper routing
52 int Ls = this->Ls;
53
54 this->DhopDirAll(psi,chi);
56 for(int point=0;point<chi.size();point++){
57 int nblock=(Ls-1)/2;
58 for(int b=0;b<nblock;b++){
59 int s = 2*b;
60 ag5xpby_ssp(chi[point],-scale,chi[point],0.0,chi[point],s,s);
61 ag5xpby_ssp(chi[point], scale,chi[point],0.0,chi[point],s+1,s+1);
62 }
63 ag5xpby_ssp(chi[point],p[nblock]*scale/amax,chi[point],0.0,chi[point],Ls-1,Ls-1);
64 }
65}
66
67template<class Impl>
68void PartialFractionFermion5D<Impl>::Meooe_internal(const FermionField &psi, FermionField &chi,int dag)
70 int Ls = this->Ls;
71 if ( psi.Checkerboard() == Odd ) {
72 this->DhopEO(psi,chi,DaggerNo);
73 } else {
74 this->DhopOE(psi,chi,DaggerNo);
75 }
77 int nblock=(Ls-1)/2;
78 for(int b=0;b<nblock;b++){
79 int s = 2*b;
80 ag5xpby_ssp(chi,-scale,chi,0.0,chi,s,s);
81 ag5xpby_ssp(chi, scale,chi,0.0,chi,s+1,s+1);
82 }
83 ag5xpby_ssp(chi,p[nblock]*scale/amax,chi,0.0,chi,Ls-1,Ls-1);
84}
85
86template<class Impl>
87void PartialFractionFermion5D<Impl>::Mooee_internal(const FermionField &psi, FermionField &chi,int dag)
88{
89 // again dag and undag are trivially related
90 int sign = dag ? (-1) : 1;
91 int Ls = this->Ls;
92
93 int nblock=(Ls-1)/2;
94 for(int b=0;b<nblock;b++){
95
96 int s = 2*b;
97 RealD pp = p[nblock-1-b];
98 RealD qq = q[nblock-1-b];
99
100 // Do each 2x2 block aligned at s and multiplies Dw site diagonal by G5 so Hw
101 ag5xpby_ssp(chi,-dw_diag*scale,psi,amax*sqrt(qq)*scale,psi, s ,s+1);
102 ag5xpby_ssp(chi, dw_diag*scale,psi,amax*sqrt(qq)*scale,psi, s+1,s);
103 axpby_ssp (chi, 1.0, chi,sqrt(amax*pp)*scale*sign,psi,s+1,Ls-1);
104 }
105
106 {
107 RealD R=(1+mass)/(1-mass);
108 //R g5 psi[Ls-1] + p[0] H
109 ag5xpbg5y_ssp(chi,R*scale,psi,p[nblock]*scale*dw_diag/amax,psi,Ls-1,Ls-1);
110
111 for(int b=0;b<nblock;b++){
112 int s = 2*b+1;
113 RealD pp = p[nblock-1-b];
114 axpby_ssp(chi,1.0,chi,-sqrt(amax*pp)*scale*sign,psi,Ls-1,s);
115 }
116 }
117}
118
119template<class Impl>
120void PartialFractionFermion5D<Impl>::MooeeInv_internal(const FermionField &psi, FermionField &chi,int dag)
121{
122 int sign = dag ? (-1) : 1;
123 int Ls = this->Ls;
124
125 FermionField tmp(psi.Grid());
126
128 //Linv
130 int nblock=(Ls-1)/2;
131
132 axpy(chi,0.0,psi,psi); // Identity piece
133
134 for(int b=0;b<nblock;b++){
135 int s = 2*b;
136 RealD pp = p[nblock-1-b];
137 RealD qq = q[nblock-1-b];
138 RealD coeff1=sign*sqrt(amax*amax*amax*pp*qq) / ( dw_diag*dw_diag + amax*amax* qq);
139 RealD coeff2=sign*sqrt(amax*pp)*dw_diag / ( dw_diag*dw_diag + amax*amax* qq); // Implicit g5 here
140 axpby_ssp (chi,1.0,chi,coeff1,psi,Ls-1,s);
141 axpbg5y_ssp(chi,1.0,chi,coeff2,psi,Ls-1,s+1);
142 }
143
145 //Dinv (note D isn't really diagonal -- just diagonal enough that we can still invert)
146 // Compute Seeinv (coeff of gamma5)
148 RealD R=(1+mass)/(1-mass);
149 RealD Seeinv = R + p[nblock]*dw_diag/amax;
150 for(int b=0;b<nblock;b++){
151 Seeinv += p[nblock-1-b]*dw_diag/amax / ( dw_diag*dw_diag/amax/amax + q[nblock-1-b]);
152 }
153 Seeinv = 1.0/Seeinv;
154
155 for(int b=0;b<nblock;b++){
156 int s = 2*b;
157 RealD pp = p[nblock-1-b];
158 RealD qq = q[nblock-1-b];
159 RealD coeff1=dw_diag / ( dw_diag*dw_diag + amax*amax* qq); // Implicit g5 here
160 RealD coeff2=amax*sqrt(qq) / ( dw_diag*dw_diag + amax*amax* qq);
161 ag5xpby_ssp (tmp,-coeff1,chi,coeff2,chi,s,s+1);
162 ag5xpby_ssp (tmp, coeff1,chi,coeff2,chi,s+1,s);
163 }
164 ag5xpby_ssp (tmp, Seeinv,chi,0.0,chi,Ls-1,Ls-1);
165
167 // Uinv
169 for(int b=0;b<nblock;b++){
170 int s = 2*b;
171 RealD pp = p[nblock-1-b];
172 RealD qq = q[nblock-1-b];
173 RealD coeff1=-sign*sqrt(amax*amax*amax*pp*qq) / ( dw_diag*dw_diag + amax*amax* qq);
174 RealD coeff2=-sign*sqrt(amax*pp)*dw_diag / ( dw_diag*dw_diag + amax*amax* qq); // Implicit g5 here
175 axpby_ssp (chi,1.0/scale,tmp,coeff1/scale,tmp,s,Ls-1);
176 axpbg5y_ssp(chi,1.0/scale,tmp,coeff2/scale,tmp,s+1,Ls-1);
177 }
178 axpby_ssp (chi, 1.0/scale,tmp,0.0,tmp,Ls-1,Ls-1);
179}
180
181template<class Impl>
182void PartialFractionFermion5D<Impl>::M_internal(const FermionField &psi, FermionField &chi,int dag)
183{
184 FermionField D(psi.Grid());
185
186 int Ls = this->Ls;
187 int sign = dag ? (-1) : 1;
188
189 // For partial frac Hw case (b5=c5=1) chroma quirkily computes
190 //
191 // Conventions for partfrac appear to be a mess.
192 // Tony's Nara lectures have
193 //
194 // BlockDiag( H/p_i 1 | 1 )
195 // ( 1 p_i H / q_i^2 | 0 )
196 // ---------------------------------
197 // ( -1 0 | R +p0 H )
198 //
199 //Chroma ( -2H 2sqrt(q_i) | 0 )
200 // (2 sqrt(q_i) 2H | 2 sqrt(p_i) )
201 // ---------------------------------
202 // ( 0 -2 sqrt(p_i) | 2 R gamma_5 + p0 2H
203 //
204 // Edwards/Joo/Kennedy/Wenger
205 //
206 // Here, the "beta's" selected by chroma to scale the unphysical bulk constraint fields
207 // incorporate the approx scale factor. This is obtained by propagating the
208 // scale on "H" out to the off diagonal elements as follows:
209 //
210 // BlockDiag( H/p_i 1 | 1 )
211 // ( 1 p_i H / q_i^2 | 0 )
212 // ---------------------------------
213 // ( -1 0 | R + p_0 H )
214 //
215 // becomes:
216 // BlockDiag( H/ sp_i 1 | 1 )
217 // ( 1 sp_i H / s^2q_i^2 | 0 )
218 // ---------------------------------
219 // ( -1 0 | R + p_0/s H )
220 //
221 //
222 // This is implemented in Chroma by
223 // p0' = p0/approxMax
224 // p_i' = p_i*approxMax
225 // q_i' = q_i*approxMax*approxMax
226 //
227 // After the equivalence transform is applied the matrix becomes
228 //
229 //Chroma ( -2H sqrt(q'_i) | 0 )
230 // (sqrt(q'_i) 2H | sqrt(p'_i) )
231 // ---------------------------------
232 // ( 0 -sqrt(p'_i) | 2 R gamma_5 + p'0 2H
233 //
234 // = ( -2H sqrt(q_i)amax | 0 )
235 // (sqrt(q_i)amax 2H | sqrt(p_i*amax) )
236 // ---------------------------------
237 // ( 0 -sqrt(p_i)*amax | 2 R gamma_5 + p0/amax 2H
238 //
239
240 this->DW(psi,D,DaggerNo);
241
242 // DW - DW+iqslash
243 // (g5 Dw)^dag = g5 Dw
244 // (iqmu g5 gmu)^dag = (-i qmu gmu^dag g5^dag) = i qmu g5 gmu
245 if ( qmu.size() ) {
246
247 std::cout<< "Mat" << "qmu ("<<qmu[0]<<","<<qmu[1]<<","<<qmu[2]<<","<<qmu[3]<<")"<<std::endl;
248 assert(qmu.size()==Nd);
249
250 FermionField qslash_psi(psi.Grid());
251
252 Gamma::Algebra Gmu [] = {
253 Gamma::Algebra::GammaX,
254 Gamma::Algebra::GammaY,
255 Gamma::Algebra::GammaZ,
256 Gamma::Algebra::GammaT
257 };
258 qslash_psi = qmu[0]*(Gamma(Gmu[0])*psi);
259 for(int mu=1;mu<Nd;mu++){
260 qslash_psi = qslash_psi + qmu[mu]*(Gamma(Gmu[mu])*psi);
261 }
262 ComplexD ci(0.0,1.0);
263 qslash_psi = ci*qslash_psi ; // i qslash
264 D = D + qslash_psi;
265 }
266
267 int nblock=(Ls-1)/2;
268 for(int b=0;b<nblock;b++){
269
270 int s = 2*b;
271 double pp = p[nblock-1-b];
272 double qq = q[nblock-1-b];
273
274 // Do each 2x2 block aligned at s and
275 ag5xpby_ssp(chi,-1.0*scale,D,amax*sqrt(qq)*scale,psi, s ,s+1); // Multiplies Dw by G5 so Hw
276 ag5xpby_ssp(chi, 1.0*scale,D,amax*sqrt(qq)*scale,psi, s+1,s);
277
278 // Pick up last column
279 axpby_ssp (chi, 1.0, chi,sqrt(amax*pp)*scale*sign,psi,s+1,Ls-1);
280 }
281
282 {
283 // The 'conventional' Cayley overlap operator is
284 //
285 // Dov = (1+m)/2 + (1-m)/2 g5 sgn Hw
286 //
287 //
288 // With massless limit 1/2(1+g5 sgnHw)
289 //
290 // Luscher shows quite neatly that 1+g5 sgn Hw has tree level propagator i qslash +O(a^2)
291 //
292 // However, the conventional normalisation has both a leading order factor of 2 in Zq
293 // at tree level AND a mass dependent (1-m) that are convenient to absorb.
294 //
295 // In WilsonFermion5DImplementation.h, the tree level propagator for Hw is
296 //
297 // num = -i sin kmu gmu
298 //
299 // denom ( sqrt(sk^2 + (2shk^2 - 1)^2
300 // b_k = sk2 - M5;
301 //
302 // w_k = sqrt(sk + b_k*b_k);
303 //
304 // denom= ( w_k + b_k + mass*mass) ;
305 //
306 // denom= one/denom;
307 // out = num*denom;
308 //
309 // Chroma, and Grid define partial fraction via 4d operator
310 //
311 // Dpf = 2/(1-m) x Dov = (1+m)/(1-m) + g5 sgn Hw
312 //
313 // Now since:
314 //
315 // (1+m)/(1-m) = (1-m)/(1-m) + 2m/(1-m) = 1 + 2m/(1-m)
316 //
317 // This corresponds to a modified mass parameter
318 //
319 // It has an annoying
320 //
321 //
322 double R=(1+this->mass)/(1-this->mass);
323 //R g5 psi[Ls] + p[0] Hw
324 ag5xpbg5y_ssp(chi,R*scale,psi,p[nblock]*scale/amax,D,Ls-1,Ls-1);
325
326 for(int b=0;b<nblock;b++){
327 int s = 2*b+1;
328 double pp = p[nblock-1-b];
329 axpby_ssp(chi,1.0,chi,-sqrt(amax*pp)*scale*sign,psi,Ls-1,s);
330 }
331
332 }
333
334}
335
336template<class Impl>
337void PartialFractionFermion5D<Impl>::M (const FermionField &in, FermionField &out)
338{
339 M_internal(in,out,DaggerNo);
340}
341template<class Impl>
342void PartialFractionFermion5D<Impl>::Mdag (const FermionField &in, FermionField &out)
343{
344 M_internal(in,out,DaggerYes);
345}
346
347template<class Impl>
348void PartialFractionFermion5D<Impl>::Meooe (const FermionField &in, FermionField &out)
349{
350 Meooe_internal(in,out,DaggerNo);
351}
352template<class Impl>
353void PartialFractionFermion5D<Impl>::MeooeDag (const FermionField &in, FermionField &out)
354{
356}
357template<class Impl>
358void PartialFractionFermion5D<Impl>::Mooee (const FermionField &in, FermionField &out)
359{
360 Mooee_internal(in,out,DaggerNo);
361}
362template<class Impl>
363void PartialFractionFermion5D<Impl>::MooeeDag (const FermionField &in, FermionField &out)
364{
366}
367
368template<class Impl>
369void PartialFractionFermion5D<Impl>::MooeeInv (const FermionField &in, FermionField &out)
370{
372}
373template<class Impl>
374void PartialFractionFermion5D<Impl>::MooeeInvDag (const FermionField &in, FermionField &out)
375{
377}
378
379
380// force terms; five routines; default to Dhop on diagonal
381template<class Impl>
382void PartialFractionFermion5D<Impl>::MDeriv (GaugeField &mat,const FermionField &U,const FermionField &V,int dag)
383{
384 int Ls = this->Ls;
385
386 FermionField D(V.Grid());
387
388 int nblock=(Ls-1)/2;
389 for(int b=0;b<nblock;b++){
390 int s = 2*b;
391 ag5xpby_ssp(D,-scale,U,0.0,U,s,s);
392 ag5xpby_ssp(D, scale,U,0.0,U,s+1,s+1);
393 }
394 ag5xpby_ssp(D,p[nblock]*scale/amax,U,0.0,U,Ls-1,Ls-1);
395
396 this->DhopDeriv(mat,D,V,DaggerNo);
397};
398template<class Impl>
399void PartialFractionFermion5D<Impl>::MoeDeriv(GaugeField &mat,const FermionField &U,const FermionField &V,int dag)
400{
401 int Ls = this->Ls;
402
403 FermionField D(V.Grid());
404
405 int nblock=(Ls-1)/2;
406 for(int b=0;b<nblock;b++){
407 int s = 2*b;
408 ag5xpby_ssp(D,-scale,U,0.0,U,s,s);
409 ag5xpby_ssp(D, scale,U,0.0,U,s+1,s+1);
410 }
411 ag5xpby_ssp(D,p[nblock]*scale/amax,U,0.0,U,Ls-1,Ls-1);
412
413 this->DhopDerivOE(mat,D,V,DaggerNo);
414};
415template<class Impl>
416void PartialFractionFermion5D<Impl>::MeoDeriv(GaugeField &mat,const FermionField &U,const FermionField &V,int dag)
417{
418 int Ls = this->Ls;
419
420 FermionField D(V.Grid());
421
422 int nblock=(Ls-1)/2;
423 for(int b=0;b<nblock;b++){
424 int s = 2*b;
425 ag5xpby_ssp(D,-scale,U,0.0,U,s,s);
426 ag5xpby_ssp(D, scale,U,0.0,U,s+1,s+1);
427 }
428 ag5xpby_ssp(D,p[nblock]*scale/amax,U,0.0,U,Ls-1,Ls-1);
429
430 this->DhopDerivEO(mat,D,V,DaggerNo);
431};
432
433template<class Impl>
436}
437template<class Impl>
438void PartialFractionFermion5D<Impl>::SetCoefficientsZolotarev(RealD zolo_hi,Approx::zolotarev_data *zdata){
439
440 // check on degree matching
441 // std::cout<<GridLogMessage << Ls << " Ls"<<std::endl;
442 // std::cout<<GridLogMessage << zdata->n << " - n"<<std::endl;
443 // std::cout<<GridLogMessage << zdata->da << " -da "<<std::endl;
444 // std::cout<<GridLogMessage << zdata->db << " -db"<<std::endl;
445 // std::cout<<GridLogMessage << zdata->dn << " -dn"<<std::endl;
446 // std::cout<<GridLogMessage << zdata->dd << " -dd"<<std::endl;
447 int Ls = this->Ls;
448
449 assert(Ls == (2*zdata->da -1) );
450
451 // Part frac
452 // RealD R;
453 R=(1+mass)/(1-mass);
454 dw_diag = (4.0-this->M5);
455
456 // std::vector<RealD> p;
457 // std::vector<RealD> q;
458 p.resize(zdata->da);
459 q.resize(zdata->dd);
460
461 for(int n=0;n<zdata->da;n++){
462 p[n] = zdata -> alpha[n];
463 }
464 for(int n=0;n<zdata->dd;n++){
465 q[n] = -zdata -> ap[n];
466 }
467
468 scale= part_frac_chroma_convention ? 2.0 : 1.0; // Chroma conventions annoy me
469
470 amax=zolo_hi;
471}
472
473 template<class Impl>
474 void PartialFractionFermion5D<Impl>::ExportPhysicalFermionSolution(const FermionField &solution5d,FermionField &exported4d)
475 {
476 int Ls = this->Ls;
477 conformable(solution5d.Grid(),this->FermionGrid());
478 conformable(exported4d.Grid(),this->GaugeGrid());
479 ExtractSlice(exported4d, solution5d, Ls-1, 0);
480 }
481 template<class Impl>
482 void PartialFractionFermion5D<Impl>::ImportPhysicalFermionSource(const FermionField &input4d,FermionField &imported5d)
483 {
484 //void InsertSlice(const Lattice<vobj> &lowDim,Lattice<vobj> & higherDim,int slice, int orthog)
485 int Ls = this->Ls;
486 conformable(imported5d.Grid(),this->FermionGrid());
487 conformable(input4d.Grid() ,this->GaugeGrid());
488 FermionField tmp(this->FermionGrid());
489 tmp=Zero();
490 InsertSlice(input4d, tmp, Ls-1, 0);
491 tmp=Gamma(Gamma::Algebra::Gamma5)*tmp;
492 this->Dminus(tmp,imported5d);
493 }
494
495// Constructors
496template<class Impl>
498 GridCartesian &FiveDimGrid,
499 GridRedBlackCartesian &FiveDimRedBlackGrid,
500 GridCartesian &FourDimGrid,
501 GridRedBlackCartesian &FourDimRedBlackGrid,
502 RealD _mass,RealD M5,
503 const ImplParams &p) :
504 WilsonFermion5D<Impl>(_Umu,
505 FiveDimGrid, FiveDimRedBlackGrid,
506 FourDimGrid, FourDimRedBlackGrid,M5,p),
507 mass(_mass)
508
509{
510 int Ls = this->Ls;
511 qmu.resize(0);
512 assert((Ls&0x1)==1); // Odd Ls required
513 int nrational=Ls-1;
514
515
516 Approx::zolotarev_data *zdata = Approx::higham(1.0,nrational);
517
518 // NB: chroma uses a cast to "float" for the zolotarev range(!?).
519 // this creates a real difference in the operator which I do not like but we can replicate here
520 // to demonstrate compatibility
521 // RealD eps = (zolo_lo / zolo_hi);
522 // zdata = bfm_zolotarev(eps,nrational,0);
523
524 SetCoefficientsTanh(zdata,1.0);
525
526 Approx::zolotarev_free(zdata);
527
528}
529template<class Impl>
531 GridCartesian &FiveDimGrid,
532 GridRedBlackCartesian &FiveDimRedBlackGrid,
533 GridCartesian &FourDimGrid,
534 GridRedBlackCartesian &FourDimRedBlackGrid,
535 RealD _mass,RealD M5,
536 std::vector<RealD> &_qmu,
537 const ImplParams &p)
538 : PartialFractionFermion5D<Impl>(_Umu,
539 FiveDimGrid,FiveDimRedBlackGrid,
540 FourDimGrid,FourDimRedBlackGrid,
541 _mass,M5,p)
542{
543 qmu=_qmu;
544}
545
547
static const int Odd
accelerator_inline Grid_simd< S, V > sqrt(const Grid_simd< S, V > &r)
void axpy(Lattice< vobj > &ret, sobj a, const Lattice< vobj > &x, const Lattice< vobj > &y)
void conformable(const Lattice< obj1 > &lhs, const Lattice< obj2 > &rhs)
void InsertSlice(const Lattice< vobj > &lowDim, Lattice< vobj > &higherDim, int slice, int orthog)
void ExtractSlice(Lattice< vobj > &lowDim, const Lattice< vobj > &higherDim, int slice, int orthog)
void ag5xpby_ssp(Lattice< vobj > &z, Coeff a, const Lattice< vobj > &x, Coeff b, const Lattice< vobj > &y, int s, int sp)
Definition LinalgUtils.h:80
void ag5xpbg5y_ssp(Lattice< vobj > &z, Coeff a, const Lattice< vobj > &x, Coeff b, const Lattice< vobj > &y, int s, int sp)
void axpby_ssp(Lattice< vobj > &z, Coeff a, const Lattice< vobj > &x, Coeff b, const Lattice< vobj > &y, int s, int sp)
Definition LinalgUtils.h:59
void axpbg5y_ssp(Lattice< vobj > &z, Coeff a, const Lattice< vobj > &x, Coeff b, const Lattice< vobj > &y, int s, int sp)
#define NAMESPACE_BEGIN(A)
Definition Namespace.h:35
#define NAMESPACE_END(A)
Definition Namespace.h:36
static constexpr int DaggerYes
Definition QCD.h:70
static constexpr int Nd
Definition QCD.h:52
static constexpr int DaggerNo
Definition QCD.h:69
std::complex< RealD > ComplexD
Definition Simd.h:79
double RealD
Definition Simd.h:61
static INTERNAL_PRECISION U
Definition Zolotarev.cc:230
virtual void Dminus(const FermionField &psi, FermionField &chi)
Definition Gamma.h:10
virtual void MDeriv(GaugeField &mat, const FermionField &U, const FermionField &V, int dag)
void Meooe_internal(const FermionField &in, FermionField &out, int dag)
virtual void MeooeDag(const FermionField &in, FermionField &out)
virtual void MooeeDag(const FermionField &in, FermionField &out)
void M_internal(const FermionField &in, FermionField &out, int dag)
virtual void MdirAll(const FermionField &in, std::vector< FermionField > &out)
void MooeeInv_internal(const FermionField &in, FermionField &out, int dag)
virtual void MooeeInvDag(const FermionField &in, FermionField &out)
virtual void SetCoefficientsTanh(Approx::zolotarev_data *zdata, RealD scale)
PartialFractionFermion5D(GaugeField &_Umu, GridCartesian &FiveDimGrid, GridRedBlackCartesian &FiveDimRedBlackGrid, GridCartesian &FourDimGrid, GridRedBlackCartesian &FourDimRedBlackGrid, RealD _mass, RealD M5, const ImplParams &p=ImplParams())
virtual void Mooee(const FermionField &in, FermionField &out)
virtual void M(const FermionField &in, FermionField &out)
virtual void MoeDeriv(GaugeField &mat, const FermionField &U, const FermionField &V, int dag)
virtual void MeoDeriv(GaugeField &mat, const FermionField &U, const FermionField &V, int dag)
virtual void Mdir(const FermionField &in, FermionField &out, int dir, int disp)
virtual void ExportPhysicalFermionSolution(const FermionField &solution5d, FermionField &exported4d)
virtual void Meooe(const FermionField &in, FermionField &out)
virtual void SetCoefficientsZolotarev(RealD zolo_hi, Approx::zolotarev_data *zdata)
void Mooee_internal(const FermionField &in, FermionField &out, int dag)
virtual void MooeeInv(const FermionField &in, FermionField &out)
virtual void Mdag(const FermionField &in, FermionField &out)
virtual void ImportPhysicalFermionSource(const FermionField &input4d, FermionField &imported5d)
FermionField & tmp(void)
GridBase * FermionGrid(void)
virtual void DhopDerivEO(GaugeField &mat, const FermionField &U, const FermionField &V, int dag)
void DW(const FermionField &in, FermionField &out, int dag)
void DhopDir(const FermionField &in, FermionField &out, int dir, int disp)
void DhopDirAll(const FermionField &in, std::vector< FermionField > &out)
WilsonFermion5D(GaugeField &_Umu, GridCartesian &FiveDimGrid, GridRedBlackCartesian &FiveDimRedBlackGrid, GridCartesian &FourDimGrid, GridRedBlackCartesian &FourDimRedBlackGrid, double _M5, const ImplParams &p=ImplParams())
virtual void DhopDeriv(GaugeField &mat, const FermionField &U, const FermionField &V, int dag)
void DhopEO(const FermionField &in, FermionField &out, int dag)
virtual void DhopDerivOE(GaugeField &mat, const FermionField &U, const FermionField &V, int dag)
Definition Simd.h:194