70 void rotatePV(
const Vi& _src, Vi& dst,
bool forward)
const {
74 typedef typename Vi::scalar_type Coeff_t;
75 int Ls = dst.Grid()->_fdimensions[0];
78 double phase =
M_PI / (double)Ls;
79 Coeff_t bzero(0.0,0.0);
85 for (
int s=0;s<Ls;s++) {
102 for (
int s=0;s<Ls;s++) {
113 void pvInv(
const Vi& _src, Vi& _dst)
const {
115 std::cout <<
GridLogMessage <<
"Fourier-Accelerated Outer Pauli Villars"<<std::endl;
117 typedef typename Vi::scalar_type Coeff_t;
118 int Ls = _dst.Grid()->_fdimensions[0];
129 Vi _src_diag(_dst.Grid());
130 Vi _src_diag_slice(
dwfPV.GaugeGrid());
131 Vi _dst_diag_slice(
dwfPV.GaugeGrid());
132 Vi _src_diag_slices(
grid5D);
133 Vi _dst_diag_slices(
grid5D);
134 Vi _dst_diag(_dst.Grid());
139 Gamma G5(Gamma::Algebra::Gamma5);
145 typedef typename M::Impl_t Impl;
147 std::vector<RealD> vmass(
grid5D->_fdimensions[0],0.0);
148 std::vector<RealD> vmu(
grid5D->_fdimensions[0],0.0);
156 SchurRedBlackDiagMooeeSolve<Vi> sol(
cg);
161 for (
int sgroup=0;sgroup<Ls/2/
group_in_s;sgroup++) {
171 RealD denom = b*b + c*c + 2.0*b*c*cosp;
172 RealD mass = -(b*b*M5 + c*(1.0 - cosp + c*M5) + b*(-1.0 + cosp + 2.0*c*cosp*M5))/denom;
173 RealD mu = (b+c)*sinp/denom;
175 vmass[2*sidx + 0] = mass;
176 vmass[2*sidx + 1] = mass;
177 vmu[2*sidx + 0] = mu;
178 vmu[2*sidx + 1] = -mu;
190 InsertSlice(_src_diag_slice,_src_diag_slices,2*sidx + 0,0);
193 InsertSlice(_src_diag_slice,_src_diag_slices,2*sidx + 1,0);
199 _dst_diag_slices =
Zero();
200 sol(tm,_src_diag_slices,_dst_diag_slices);
214 Coeff_t pA = b + c*cosp;
215 Coeff_t pB = - Coeff_t(0.0,1.0)*Coeff_t(c*sinp);
216 Coeff_t pABden = pA*pA - pB*pB;
219 ExtractSlice(_dst_diag_slice,_dst_diag_slices,2*sidx + 0,0);
220 _dst_diag_slice = (pA/pABden) * _dst_diag_slice - (pB/pABden) * (G5 * _dst_diag_slice);
223 ExtractSlice(_dst_diag_slice,_dst_diag_slices,2*sidx + 1,0);
224 _dst_diag_slice = (pA/pABden) * _dst_diag_slice + (pB/pABden) * (G5 * _dst_diag_slice);