20 Solver(param, profile), mat(mat)
31 for(
int i=1; i<=(2*nsteps); ++i){
32 mat(pr[i], pr[i-1], temp);
37 for(
int i=(2*nsteps+2); i<(4*nsteps+1); ++i){
38 mat(pr[i], pr[i-1], temp);
43 static void print(
const double d[],
int n){
44 for(
int i=0; i<n; ++i){
45 std::cout << d[i] <<
" ";
47 std::cout << std::endl;
51 for(
int i=0; i<n; ++i){
52 std::cout <<
"(" << real(d[i]) <<
"," << imag(d[i]) <<
") ";
54 std::cout << std::endl;
59 static void zero(T d[],
int N){
60 for(
int i=0; i<N; ++i) d[i] = static_cast<T>(0);
64 static void computeGramMatrix(
Complex** G, std::vector<cudaColorSpinorField>& v){
66 const int dim = v.size();
68 for(
int i=0; i<
dim; ++i){
69 for(
int j=0; j<
dim; ++j){
76 static void computeGramVector(
Complex* g, cudaColorSpinorField& r0, std::vector<cudaColorSpinorField>& pr){
78 const int dim = pr.size();
80 for(
int i=0; i<
dim; ++i){
113 static T zip(T a[], T b[],
int dim){
115 for(
int i=0; i<
dim; ++i){
125 for(
int i=0; i<
dim; ++i){
126 for(
int j=0; j<
dim; ++j){
127 result +=
conj(u[i])*v[j]*M[i][j];
140 const double b2 =
norm2(b);
143 printfQuda(
"Warning: inverting on zero-field source\n");
181 for(
int i=0; i<(4*s+2); ++i){
191 for(
int i=0; i<(2*s+1); ++i){
209 computeMatrixPowers(PR, p, r, s);
210 computeGramVector(g, r0, PR);
211 computeGramMatrix(G, PR);
214 for(
int i=0; i<(2*s+1); ++i){
217 a[i][i] =
static_cast<Complex>(1);
218 c[i][i + (2*s+1)] = static_cast<Complex>(1);
227 alpha = zip(g,c[0],4*s+2)/zip(g,a[1],4*s+2);
229 Complex omega_num = computeUdaggerMV(c[0],G,c[1],(4*s+2))
230 - alpha*computeUdaggerMV(c[0],G,a[2],(4*s+2))
231 -
conj(alpha)*computeUdaggerMV(a[1],G,c[1],(4*s+2))
232 +
conj(alpha)*alpha*computeUdaggerMV(a[1],G,a[2],(4*s+2));
234 Complex omega_denom = computeUdaggerMV(c[1],G,c[1],(4*s+2))
235 - alpha*computeUdaggerMV(c[1],G,a[2],(4*s+2))
236 -
conj(alpha)*computeUdaggerMV(a[2],G,c[1],(4*s+2))
237 +
conj(alpha)*alpha*computeUdaggerMV(a[2],G,a[2],(4*s+2));
239 omega = omega_num/omega_denom;
241 for(
int i=0; i<(4*s+2); ++i){
242 e[i] += alpha*a[0][i] + omega*c[0][i] - alpha*omega*a[1][i];
246 for(
int k=0; k<=(2*(s - j - 1)); ++k){
247 for(
int i=0; i<(4*s+2); ++i){
248 c_new[k][i] = c[k][i] - alpha*a[k+1][i] - omega*c[k+1][i] + alpha*omega*a[k+2][i];
253 beta = (zip(g,c_new[0],(4*s+2))/zip(g,c[0],(4*s+2)))*(alpha/omega);
255 for(
int k=0; k<=(2*(s - j - 1)); ++k){
256 for(
int i=0; i<(4*s+2); ++i){
257 a_new[k][i] = c_new[k][i] + beta*a[k][i] - beta*omega*a[k+1][i];
260 for(
int i=0; i<(4*s+2); ++i){
261 a[k][i] = a_new[k][i];
262 c[k][i] = c_new[k][i];
266 for(
int i=0; i<(4*s+2); ++i){
275 for(
int i=0; i<(4*s+2); ++i){
294 for(
int i=0; i<(4*s+2); ++i){
303 for(
int i=0; i<(2*s+1); ++i){
bool convergence(const double &r2, const double &hq2, const double &r2_tol, const double &hq_tol)
void caxpyCuda(const Complex &a, cudaColorSpinorField &x, cudaColorSpinorField &y)
static double stopping(const double &tol, const double &b2, QudaResidualType residual_type)
__host__ __device__ ValueType sqrt(ValueType x)
std::complex< double > Complex
void mat(void *out, void **fatlink, void **longlink, void *in, double kappa, int dagger_bit, QudaPrecision sPrecision, QudaPrecision gPrecision)
__host__ __device__ void zero(double &x)
void PrintSummary(const char *name, int k, const double &r2, const double &b2)
QudaResidualType residual_type
Complex cDotProductCuda(cudaColorSpinorField &, cudaColorSpinorField &)
void Stop(QudaProfileType idx)
MPBiCGstab(DiracMatrix &mat, SolverParam ¶m, TimeProfile &profile)
void PrintStats(const char *, int k, const double &r2, const double &b2, const double &hq2)
void zeroCuda(cudaColorSpinorField &a)
void print(const double d[], int n)
__host__ __device__ ValueType conj(ValueType x)
double norm2(const ColorSpinorField &)
double xmyNormCuda(cudaColorSpinorField &a, cudaColorSpinorField &b)
void operator()(cudaColorSpinorField &out, cudaColorSpinorField &in)