void CGeoSmoother(spinor * const P, spinor * const Q, const int Ncy, const int dummy) { spinor ** solver_field = NULL; const int nr_sf = 5; double musave = g_mu; g_mu = g_mu1; init_solver_field(&solver_field, VOLUMEPLUSRAND/2, nr_sf); convert_lexic_to_eo(solver_field[0], solver_field[1], Q); if(g_c_sw > 0) assign_mul_one_sw_pm_imu_inv(EE,solver_field[2], solver_field[0], g_mu); else assign_mul_one_pm_imu_inv(solver_field[2], solver_field[0], +1., VOLUME/2); Hopping_Matrix(OE, solver_field[4], solver_field[2]); /* The sign is plus, since in Hopping_Matrix */ /* the minus is missing */ assign_mul_add_r(solver_field[4], +1., solver_field[1], VOLUME/2); /* Do the inversion with the preconditioned */ /* matrix to get the odd sites */ gamma5(solver_field[4], solver_field[4], VOLUME/2); if(g_c_sw > 0) { cg_her(solver_field[3], solver_field[4], Ncy, 1.e-8, 1, VOLUME/2, &Qsw_pm_psi); Qsw_minus_psi(solver_field[3], solver_field[3]); /* Reconstruct the even sites */ Hopping_Matrix(EO, solver_field[2], solver_field[3]); assign_mul_one_sw_pm_imu_inv(EE,solver_field[4],solver_field[2], g_mu); } else { cg_her(solver_field[3], solver_field[4], Ncy, 1.e-8, 1, VOLUME/2, &Qtm_pm_psi); Qtm_minus_psi(solver_field[3], solver_field[3]); /* Reconstruct the even sites */ Hopping_Matrix(EO, solver_field[4], solver_field[3]); mul_one_pm_imu_inv(solver_field[4], +1., VOLUME/2); } /* The sign is plus, since in Hopping_Matrix */ /* the minus is missing */ assign_add_mul_r(solver_field[2], solver_field[4], +1., VOLUME/2); convert_eo_to_lexic(P, solver_field[2], solver_field[3]); g_mu = musave; finalize_solver(solver_field, nr_sf); return; }
int invert_clover_eo(spinor * const Even_new, spinor * const Odd_new, spinor * const Even, spinor * const Odd, const double precision, const int max_iter, const int solver_flag, const int rel_prec,solver_params_t solver_params, su3 *** gf, matrix_mult Qsq, matrix_mult Qm) { int iter; if(g_proc_id == 0 && g_debug_level > 0) { printf("# Using even/odd preconditioning!\n"); fflush(stdout); } assign_mul_one_sw_pm_imu_inv(EE, Even_new, Even, +g_mu); Hopping_Matrix(OE, g_spinor_field[DUM_DERI], Even_new); /* The sign is plus, since in Hopping_Matrix */ /* the minus is missing */ assign_mul_add_r(g_spinor_field[DUM_DERI], +1., Odd, VOLUME/2); /* Do the inversion with the preconditioned */ /* matrix to get the odd sites */ /* Here we invert the hermitean operator squared */ gamma5(g_spinor_field[DUM_DERI], g_spinor_field[DUM_DERI], VOLUME/2); if(g_proc_id == 0) { //printf("# Using CG!\n"); printf("# mu = %f, kappa = %f, csw = %f\n", g_mu/2./g_kappa, g_kappa, g_c_sw); fflush(stdout); } if(solver_flag == CG) { if(g_proc_id == 0) { printf("# Using CG!\n"); fflush(stdout); } iter = cg_her(Odd_new, g_spinor_field[DUM_DERI], max_iter, precision, rel_prec, VOLUME/2, Qsq); Qm(Odd_new, Odd_new); } else if(solver_flag == INCREIGCG) { if(g_proc_id == 0) { printf("# Using Incremental Eig-CG!\n"); fflush(stdout); } iter = incr_eigcg(VOLUME/2,solver_params.eigcg_nrhs, solver_params.eigcg_nrhs1, Odd_new, g_spinor_field[DUM_DERI], solver_params.eigcg_ldh, Qsq, solver_params.eigcg_tolsq1, solver_params.eigcg_tolsq, solver_params.eigcg_restolsq , solver_params.eigcg_rand_guess_opt, rel_prec, max_iter, solver_params.eigcg_nev, solver_params.eigcg_vmax); Qm(Odd_new, Odd_new); } else { if(g_proc_id == 0) { printf("# This solver is not available for this operator. Exisiting!\n"); fflush(stdout); } return 0; } /* Reconstruct the even sites */ Hopping_Matrix(EO, g_spinor_field[DUM_DERI], Odd_new); clover_inv(g_spinor_field[DUM_DERI], +1, g_mu); /* The sign is plus, since in Hopping_Matrix */ /* the minus is missing */ assign_add_mul_r(Even_new, g_spinor_field[DUM_DERI], +1., VOLUME/2); return(iter); }