28#ifndef QCD_PSEUDOFERMION_ONE_FLAVOUR_RATIONAL_RATIO_H
29#define QCD_PSEUDOFERMION_ONE_FLAVOUR_RATIONAL_RATIO_H
89 std::stringstream sstream;
90 sstream<<
"OneFlavourRatioRationalPseudoFermionAction("
96 std::stringstream sstream;
103 return sstream.str();
122 RealD scale = std::sqrt(0.5);
124 FermionField tmp(
NumOp.FermionGrid());
125 FermionField eta(
NumOp.FermionGrid());
135 msCG_M(MdagM,eta,tmp);
140 msCG_V(VdagV,tmp,
Phi);
154 FermionField X(
NumOp.FermionGrid());
155 FermionField Y(
NumOp.FermionGrid());
168 auto grid =
NumOp.FermionGrid();
170 grid->Broadcast(0,r);
171 if ( (r%
param.BoundsCheckFreq)==0 ) {
172 FermionField gauss(
NumOp.FermionGrid());
214 virtual void deriv(
const GaugeField &
U,GaugeField & dSdU) {
219 std::vector<FermionField> MpvPhi_k (n_pv,
NumOp.FermionGrid());
220 std::vector<FermionField> MpvMfMpvPhi_k(n_pv,
NumOp.FermionGrid());
221 std::vector<FermionField> MfMpvPhi_k (n_f,
NumOp.FermionGrid());
223 FermionField MpvPhi(
NumOp.FermionGrid());
224 FermionField MfMpvPhi(
NumOp.FermionGrid());
225 FermionField MpvMfMpvPhi(
NumOp.FermionGrid());
226 FermionField Y(
NumOp.FermionGrid());
228 GaugeField tmp(
NumOp.GaugeGrid());
239 msCG_V(VdagV,
Phi,MpvPhi_k,MpvPhi);
240 msCG_M(MdagM,MpvPhi,MfMpvPhi_k,MfMpvPhi);
241 msCG_V(VdagV,MfMpvPhi,MpvMfMpvPhi_k,MpvMfMpvPhi);
255 for(
int k=0;k<n_f;k++){
257 DenOp.M(MfMpvPhi_k[k],Y);
258 DenOp.MDeriv(tmp , MfMpvPhi_k[k], Y,
DaggerYes ); dSdU=dSdU+ak*tmp;
259 DenOp.MDeriv(tmp , Y, MfMpvPhi_k[k],
DaggerNo ); dSdU=dSdU+ak*tmp;
264 for(
int k=0;k<n_pv;k++){
268 NumOp.M(MpvPhi_k[k],Y);
270 NumOp.MDeriv(tmp,Y,MpvMfMpvPhi_k[k],
DaggerNo); dSdU=dSdU+ak*tmp;
272 NumOp.M(MpvMfMpvPhi_k[k],Y);
273 NumOp.MDeriv(tmp,Y, MpvPhi_k[k],
DaggerNo); 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)
GridLogger GridLogMessage(1, "Message", GridLogColours, "NORMAL")
#define NAMESPACE_BEGIN(A)
static constexpr int DaggerYes
static constexpr int DaggerNo
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)
FermionOperator< Impl > & NumOp
virtual std::string LogParameters()
Print the parameters of the action.
MultiShiftFunction MDPowerNegHalf
OneFlavourRationalParams Params
virtual std::string action_name()
Report the name of the action.
FermionOperator< Impl > & DenOp
MultiShiftFunction PowerNegQuarter
MultiShiftFunction PowerNegHalf
OneFlavourRatioRationalPseudoFermionAction(FermionOperator< Impl > &_NumOp, FermionOperator< Impl > &_DenOp, Params &p)
MultiShiftFunction PowerQuarter
MultiShiftFunction MDPowerQuarter
virtual RealD S(const GaugeField &U)
Evaluate this action with the given gauge field.
virtual void deriv(const GaugeField &U, GaugeField &dSdU)
MultiShiftFunction PowerHalf
virtual void refresh(const GaugeField &U, GridSerialRNG &sRNG, GridParallelRNG &pRNG)
Refresh pseudofermion fields.