51 FourDimGrid, FourDimRedBlackGrid, _mq1, _mq2, _mq3,
52 _shift, _pm, _M5,
_b,
_c, p)
57 Approx::zolotarev_data *zdata = Approx::higham(eps, this->Ls);
58 assert(zdata->n == this->Ls);
61 ",c=" <<
_c <<
") with Ls=" <<
Ls << std::endl;
64 ",mq2=" << _mq2 <<
",mq3=" << _mq3 <<
",shift=" << _shift <<
65 ",pm=" << _pm <<
")" << std::endl;
67 Approx::zolotarev_free(zdata);
92 if((sign == 1) && (dag == 0)) {
93 for(
int s=0; s<
Ls; ++s){
96 }
else if((sign == -1) && (dag == 0)) {
97 for(
int s=0; s<
Ls; ++s){
100 }
else if((sign == 1 ) && (dag == 1)) {
101 for(
int sp=0; sp<
Ls; ++sp){
104 }
else if((sign == -1) && (dag == 1)) {
105 for(
int sp=0; sp<
Ls; ++sp){
121 for(
int s=0; s<
Ls; ++s){
125 }
else if(s == (
Ls-1)) {
143 RealD DtInv_p(0.0), DtInv_m(0.0);
144 RealD N = std::pow(c+d,
Ls) + m*std::pow(c-d,
Ls);
147 for(
int s=0; s<
Ls; ++s){
148 for(
int sp=0; sp<
Ls; ++sp){
150 DtInv_p = m * std::pow(-1.0,s-sp+1) * std::pow(c-d,
Ls+s-sp) / std::pow(c+d,s-sp+1) / N;
151 DtInv_p += (s < sp) ? 0.0 : std::pow(-1.0,s-sp) * std::pow(c-d,s-sp) / std::pow(c+d,s-sp+1);
152 DtInv_m = m * std::pow(-1.0,sp-s+1) * std::pow(c-d,
Ls+sp-s) / std::pow(c+d,sp-s+1) / N;
153 DtInv_m += (s > sp) ? 0.0 : std::pow(-1.0,sp-s) * std::pow(c-d,sp-s) / std::pow(c+d,sp-s+1);
171 FermionField Din(psi.Grid());
175 axpby(chi, 1.0, 1.0, chi, psi);
182 FermionField Din(psi.Grid());
187 axpby(chi, 1.0, 1.0, chi, psi);
199 std::vector<Coeff_t> diag(
Ls,1.0);
200 std::vector<Coeff_t> upper(
Ls,-1.0); upper[
Ls-1] = this->
mq1;
201 std::vector<Coeff_t> lower(
Ls,-1.0); lower[0] = this->
mq1;
204 if(this->
shift == 0.0){ this->
M5D(psi, chi, chi, lower, diag, upper); }
215 std::vector<Coeff_t> diag(
Ls,1.0);
216 std::vector<Coeff_t> upper(
Ls,-1.0); upper[
Ls-1] = this->
mq1;
217 std::vector<Coeff_t> lower(
Ls,-1.0); lower[0] = this->
mq1;
220 if(this->
shift == 0.0){ this->
M5Ddag(psi, chi, chi, lower, diag, upper); }
233 std::vector<Coeff_t> diag = this->
bee;
234 std::vector<Coeff_t> upper(
Ls);
235 std::vector<Coeff_t> lower(
Ls);
236 for(
int s=0; s<
Ls; s++){
237 upper[s] = -this->
cee[s];
238 lower[s] = -this->
cee[s];
240 upper[
Ls-1] *= -this->
mq1;
241 lower[0] *= -this->
mq1;
244 if(this->
shift == 0.0){ this->
M5D(psi, psi, chi, lower, diag, upper); }
256 std::vector<Coeff_t> diag = this->
bee;
257 std::vector<Coeff_t> upper(
Ls);
258 std::vector<Coeff_t> lower(
Ls);
259 for(
int s=0; s<
Ls; s++){
261 upper[s] = -this->
cee[s+1];
262 lower[s] = this->
mq1*this->
cee[
Ls-1];
263 }
else if(s==(
Ls-1)) {
264 upper[s] = this->
mq1*this->
cee[0];
265 lower[s] = -this->cee[s-1];
267 upper[s] = -this->
cee[s+1];
268 lower[s] = -this->
cee[s-1];
273 if(this->
shift == 0.0){ this->
M5Ddag(psi, psi, chi, lower, diag, upper); }
307 Coeff_t N = ( (
pm == 1) ? 1.0 : -1.0 ) * (2.0*
shift*
k) *
309 for(
int s=0; s<
Ls; ++s){
310 idx = (
pm == 1) ? (s) : (
Ls-1-s);
318 std::vector<Coeff_t> u(
Ls,0.0);
319 std::vector<Coeff_t> y(
Ls,0.0);
320 std::vector<Coeff_t> q(
Ls,0.0);
321 if(
pm == 1){ u[0] = 1.0; }
322 else{ u[
Ls-1] = 1.0; }
337 for(
int s=1; s<
Ls; ++s){
338 m = -this->
cee[s] / this->
bee[s-1];
345 for(
int s=
Ls-2; s>=0; --s){
347 y[s] = d[s] / this->
bee[s];
348 q[s] = u[s] / this->
bee[s];
350 y[s] = ( d[s] + this->
cee[s]*y[s+1] ) / this->
bee[s];
351 q[s] = ( u[s] + this->
cee[s]*q[s+1] ) / this->
bee[s];
356 for(
int s=0; s<
Ls; ++s){
359 (1.0+
mq1*this->
cee[0]*q[
Ls-1]) * q[s];
362 (1.0+
mq1*this->
cee[
Ls-1]*q[0]) * q[s];
368 for(
int s=0; s<
Ls; ++s){
391 this->
shift = new_shift;
392 if(new_shift != 0.0){
void axpby(Lattice< vobj > &ret, sobj a, sobj b, const Lattice< vobj > &x, const Lattice< vobj > &y)
Lattice< obj > pow(const Lattice< obj > &rhs_i, RealD y)
void axpby_ssp_pplus(Lattice< vobj > &z, Coeff a, const Lattice< vobj > &x, Coeff b, const Lattice< vobj > &y, int s, int sp)
void axpby_ssp_pminus(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)
GridLogger GridLogMessage(1, "Message", GridLogColours, "NORMAL")
#define NAMESPACE_BEGIN(A)
static constexpr int DaggerYes
static constexpr int DaggerNo
AbstractEOFAFermion(GaugeField &_Umu, GridCartesian &FiveDimGrid, GridRedBlackCartesian &FiveDimRedBlackGrid, GridCartesian &FourDimGrid, GridRedBlackCartesian &FourDimRedBlackGrid, RealD _mq1, RealD _mq2, RealD _mq3, RealD _shift, int _pm, RealD _M5, RealD _b, RealD _c, const ImplParams &p=ImplParams())
void Meooe5D(const FermionField &in, FermionField &out)
std::vector< Coeff_t > bee
void MeooeDag5D(const FermionField &in, FermionField &out)
virtual void SetCoefficientsTanh(Approx::zolotarev_data *zdata, RealD b, RealD c)
std::vector< Coeff_t > cee
virtual void DtildeInv(const FermionField &in, FermionField &out)
void M5Ddag_shift(const FermionField &psi, const FermionField &phi, FermionField &chi, std::vector< Coeff_t > &lower, std::vector< Coeff_t > &diag, std::vector< Coeff_t > &upper, std::vector< Coeff_t > &shift_coeffs)
MobiusEOFAFermion(GaugeField &_Umu, GridCartesian &FiveDimGrid, GridRedBlackCartesian &FiveDimRedBlackGrid, GridCartesian &FourDimGrid, GridRedBlackCartesian &FourDimRedBlackGrid, RealD _mq1, RealD _mq2, RealD _mq3, RealD _shift, int pm, RealD _M5, RealD _b, RealD _c, const ImplParams &p=ImplParams())
std::vector< Coeff_t > MooeeInv_shift_lc
std::vector< Coeff_t > MooeeInv_shift_norm
std::vector< Coeff_t > MooeeInvDag_shift_lc
virtual void Omega(const FermionField &in, FermionField &out, int sign, int dag)
virtual void Mooee(const FermionField &in, FermionField &out)
std::vector< Coeff_t > MooeeInvDag_shift_norm
void SetCoefficientsPrecondShiftOps(void)
virtual void MooeeDag(const FermionField &in, FermionField &out)
virtual void Mdag(const FermionField &in, FermionField &out)
virtual void Dtilde(const FermionField &in, FermionField &out)
virtual void RefreshShiftCoefficients(RealD new_shift)
virtual void M(const FermionField &in, FermionField &out)
virtual void M5D(const FermionField &psi, FermionField &chi)
std::vector< Coeff_t > Mooee_shift
virtual void M5Ddag(const FermionField &psi, FermionField &chi)
void M5D_shift(const FermionField &psi, const FermionField &phi, FermionField &chi, std::vector< Coeff_t > &lower, std::vector< Coeff_t > &diag, std::vector< Coeff_t > &upper, std::vector< Coeff_t > &shift_coeffs)
GridBase * FermionGrid(void)
void DW(const FermionField &in, FermionField &out, int dag)