29#ifndef QCD_PSEUDOFERMION_ONE_FLAVOUR_EVEN_ODD_RATIONAL_H
30#define QCD_PSEUDOFERMION_ONE_FLAVOUR_EVEN_ODD_RATIONAL_H
71 PhiEven(Op.FermionRedBlackGrid()),
72 PhiOdd(Op.FermionRedBlackGrid()),
78 <<
" for x^(1/2)" << std::endl;
85 <<
" for x^(1/4)" << std::endl;
91 virtual std::string
action_name(){
return "OneFlavourEvenOddRationalPseudoFermionAction";}
94 std::stringstream sstream;
101 return sstream.str();
115 RealD scale = std::sqrt(0.5);
117 FermionField eta(
FermOp.FermionGrid());
118 FermionField etaOdd(
FermOp.FermionRedBlackGrid());
119 FermionField etaEven(
FermOp.FermionRedBlackGrid());
132 msCG(Mpc, etaOdd,
PhiOdd);
138 assert(
FermOp.ConstEE() == 1);
148 FermionField Y(
FermOp.FermionRedBlackGrid());
157 auto grid =
FermOp.FermionGrid();
159 grid->Broadcast(0,r);
160 if ( (r%
param.BoundsCheckFreq)==0 ) {
161 FermionField gauss(
FermOp.FermionRedBlackGrid());
168 std::cout <<
GridLogMessage <<
"Pseudofermion action FIXME -- is -1/4 "
169 "solve or -1/2 solve faster??? "
170 << action << std::endl;
198 virtual void deriv(
const GaugeField &
U, GaugeField &dSdU) {
201 std::vector<FermionField> MPhi_k(Npole,
FermOp.FermionRedBlackGrid());
203 FermionField X(
FermOp.FermionRedBlackGrid());
204 FermionField Y(
FermOp.FermionRedBlackGrid());
206 GaugeField tmp(
FermOp.GaugeGrid());
214 msCG(Mpc,
PhiOdd, MPhi_k);
217 for (
int k = 0; k < Npole; k++) {
224 dSdU = dSdU + ak * tmp;
226 dSdU = dSdU + ak * tmp;
void InverseSqrtBoundsCheck(int MaxIter, double tol, LinearOperatorBase< Field > &HermOp, Field &GaussNoise, MultiShiftFunction &PowerNegHalf)
void HighBoundCheck(LinearOperatorBase< Field > &HermOp, Field &Phi, RealD hi)
RealD norm2(const Lattice< vobj > &arg)
void gaussian(GridParallelRNG &rng, Lattice< vobj > &l)
void pickCheckerboard(int cb, Lattice< vobj > &half, const Lattice< vobj > &full)
GridLogger GridLogMessage(1, "Message", GridLogColours, "NORMAL")
#define NAMESPACE_BEGIN(A)
static INTERNAL_PRECISION U
Base class for all actions.
double generateApprox(int num_degree, int den_degree, unsigned long power_num, unsigned long power_den, int a_len, double *a_param, int *a_pow)
MultiShiftFunction PowerNegQuarter
OneFlavourRationalParams Params
MultiShiftFunction PowerHalf
virtual RealD S(const GaugeField &U)
Evaluate this action with the given gauge field.
FermionOperator< Impl > & FermOp
OneFlavourEvenOddRationalPseudoFermionAction(FermionOperator< Impl > &Op, Params &p)
virtual void refresh(const GaugeField &U, GridSerialRNG &sRNG, GridParallelRNG &pRNG)
Refresh pseudofermion fields.
virtual void deriv(const GaugeField &U, GaugeField &dSdU)
virtual std::string action_name()
Report the name of the action.
MultiShiftFunction PowerQuarter
virtual std::string LogParameters()
Print the parameters of the action.
MultiShiftFunction PowerNegHalf
virtual void Mpc(const Field &in, Field &out)
void MpcDagDeriv(GaugeField &Force, const FermionField &U, const FermionField &V)
void MpcDeriv(GaugeField &Force, const FermionField &U, const FermionField &V)