double det_acc(const int id, hamiltonian_field_t * const hf) { monomial * mnl = &monomial_list[id]; int save_sloppy = g_sloppy_precision_flag; double atime, etime; atime = gettime(); g_mu = mnl->mu; boundary(mnl->kappa); if(mnl->even_odd_flag) { chrono_guess(mnl->w_fields[0], mnl->pf, mnl->csg_field, mnl->csg_index_array, mnl->csg_N, mnl->csg_n, VOLUME/2, mnl->Qsq); g_sloppy_precision_flag = 0; mnl->iter0 += solve_degenerate(mnl->w_fields[0], mnl->pf, mnl->solver_params, mnl->maxiter, mnl->accprec, g_relative_precision_flag,VOLUME/2, mnl->Qsq, mnl->solver); mnl->Qm(mnl->w_fields[1], mnl->w_fields[0]); g_sloppy_precision_flag = save_sloppy; /* Compute the energy contr. from first field */ mnl->energy1 = square_norm(mnl->w_fields[1], VOLUME/2, 1); } else { if((mnl->solver == CG) || (mnl->solver == MIXEDCG)) { chrono_guess(mnl->w_fields[1], mnl->pf, mnl->csg_field, mnl->csg_index_array, mnl->csg_N, mnl->csg_n, VOLUME/2, &Q_pm_psi); mnl->iter0 += solve_degenerate(mnl->w_fields[1], mnl->pf, mnl->solver_params, mnl->maxiter, mnl->accprec, g_relative_precision_flag, VOLUME, &Q_pm_psi, mnl->solver); Q_minus_psi(mnl->w_fields[0], mnl->w_fields[1]); /* Compute the energy contr. from first field */ mnl->energy1 = square_norm(mnl->w_fields[0], VOLUME, 1); } else { chrono_guess(mnl->w_fields[0], mnl->pf, mnl->csg_field, mnl->csg_index_array, mnl->csg_N, mnl->csg_n, VOLUME/2, &Q_plus_psi); mnl->iter0 += solve_degenerate(mnl->w_fields[0], mnl->pf, mnl->solver_params, mnl->maxiter, mnl->forceprec, g_relative_precision_flag, VOLUME, &Q_plus_psi, mnl->solver); mnl->energy1 = square_norm(mnl->w_fields[0], VOLUME, 1); } } g_mu = g_mu1; boundary(g_kappa); etime = gettime(); if(g_proc_id == 0) { if(g_debug_level > 1) { printf("# Time for %s monomial acc step: %e s\n", mnl->name, etime-atime); } if(g_debug_level > 3) { printf("called det_acc for id %d dH = %1.10e\n", id, mnl->energy1 - mnl->energy0); } } return(mnl->energy1 - mnl->energy0); }
double cloverdetratio_rwacc(const int id, hamiltonian_field_t * const hf) { monomial * mnl = &monomial_list[id]; int save_sloppy = g_sloppy_precision_flag; double atime, etime; atime = gettime(); g_mu = mnl->mu2; boundary(mnl->kappa2); init_sw_fields(); sw_term( (const su3**) hf->gaugefield, mnl->kappa2, mnl->c_sw); sw_invert(EE, mnl->mu2); g_mu3 = 0.; mnl->Qp(mnl->w_fields[1], mnl->pf); g_mu3 = 0.; g_mu = mnl->mu; boundary(mnl->kappa); sw_term( (const su3**) hf->gaugefield, mnl->kappa, mnl->c_sw); sw_invert(EE, mnl->mu); chrono_guess(mnl->w_fields[0], mnl->w_fields[1], mnl->csg_field, mnl->csg_index_array, mnl->csg_N, mnl->csg_n, VOLUME/2, &Qtm_plus_psi); g_sloppy_precision_flag = 0; mnl->iter0 += solve_degenerate(mnl->w_fields[0], mnl->w_fields[1], mnl->solver_params, mnl->maxiter, mnl->accprec, g_relative_precision_flag, VOLUME/2, mnl->Qsq, mnl->solver); mnl->Qm(mnl->w_fields[0], mnl->w_fields[0]); g_sloppy_precision_flag = save_sloppy; /* Compute the energy contr. from second field */ mnl->energy1 = square_norm(mnl->w_fields[0], VOLUME/2, 1); g_mu = g_mu1; g_mu3 = 0.; boundary(g_kappa); etime = gettime(); if(g_proc_id == 0) { if(g_debug_level > 1) { printf("# Time for %s monomial rwacc step: %e s\n", mnl->name, etime-atime); } if(g_debug_level > 3) { printf("called cloverdetratio_rwacc for id %d dH = %1.10e\n", id, mnl->energy1 - mnl->energy0); } } return(mnl->energy1 - mnl->energy0); }
void det_derivative(const int id, hamiltonian_field_t * const hf) { monomial * mnl = &monomial_list[id]; double atime, etime; atime = gettime(); mnl->forcefactor = 1.; if(mnl->even_odd_flag) { /********************************************************************* * * even/odd version * * This a term is det(\hat Q^2(\mu)) * *********************************************************************/ g_mu = mnl->mu; boundary(mnl->kappa); /* Invert Q_{+} Q_{-} */ /* X_o -> w_fields[1] */ chrono_guess(mnl->w_fields[1], mnl->pf, mnl->csg_field, mnl->csg_index_array, mnl->csg_N, mnl->csg_n, VOLUME/2, mnl->Qsq); if(mnl->solver==BICGSTAB) { fprintf(stderr, "Bicgstab currently not implemented, using CG instead! (det_monomial.c)\n"); mnl->iter1 += solve_degenerate(mnl->w_fields[1], mnl->pf, mnl->solver_params, mnl->maxiter, mnl->forceprec, g_relative_precision_flag, VOLUME/2, mnl->Qsq, CG); } else{ mnl->iter1 += solve_degenerate(mnl->w_fields[1], mnl->pf, mnl->solver_params, mnl->maxiter, mnl->forceprec, g_relative_precision_flag, VOLUME/2, mnl->Qsq, mnl->solver); } chrono_add_solution(mnl->w_fields[1], mnl->csg_field, mnl->csg_index_array, mnl->csg_N, &mnl->csg_n, VOLUME/2); /* Y_o -> w_fields[0] */ mnl->Qm(mnl->w_fields[0], mnl->w_fields[1]); /* apply Hopping Matrix M_{eo} */ /* to get the even sites of X_e */ H_eo_tm_inv_psi(mnl->w_fields[2], mnl->w_fields[1], EO, -1.); /* \delta Q sandwitched by Y_o^\dagger and X_e */ deriv_Sb(OE, mnl->w_fields[0], mnl->w_fields[2], hf, mnl->forcefactor); /* to get the even sites of Y_e */ H_eo_tm_inv_psi(mnl->w_fields[3], mnl->w_fields[0], EO, +1); /* \delta Q sandwitched by Y_e^\dagger and X_o */ deriv_Sb(EO, mnl->w_fields[3], mnl->w_fields[1], hf, mnl->forcefactor); } else { /********************************************************************* * non even/odd version * * This term is det(Q^2 + \mu_1^2) * *********************************************************************/ g_mu = mnl->mu; boundary(mnl->kappa); if((mnl->solver == CG) || (mnl->solver == MIXEDCG) || (mnl->solver == RGMIXEDCG)) { /* Invert Q_{+} Q_{-} */ /* X -> w_fields[1] */ chrono_guess(mnl->w_fields[1], mnl->pf, mnl->csg_field, mnl->csg_index_array, mnl->csg_N, mnl->csg_n, VOLUME/2, &Q_pm_psi); mnl->iter1 += solve_degenerate(mnl->w_fields[1], mnl->pf, mnl->solver_params, mnl->maxiter, mnl->forceprec, g_relative_precision_flag, VOLUME, &Q_pm_psi, mnl->solver); chrono_add_solution(mnl->w_fields[1], mnl->csg_field, mnl->csg_index_array, mnl->csg_N, &mnl->csg_n, VOLUME/2); /* Y -> w_fields[0] */ Q_minus_psi(mnl->w_fields[0], mnl->w_fields[1]); } else { /* Invert first Q_+ */ /* Y -> w_fields[0] */ chrono_guess(mnl->w_fields[0], mnl->pf, mnl->csg_field, mnl->csg_index_array, mnl->csg_N, mnl->csg_n, VOLUME/2, &Q_plus_psi); mnl->iter1 += solve_degenerate(mnl->w_fields[0], mnl->pf, mnl->solver_params, mnl->maxiter, mnl->forceprec, g_relative_precision_flag, VOLUME, &Q_plus_psi, mnl->solver); chrono_add_solution(mnl->w_fields[0], mnl->csg_field, mnl->csg_index_array, mnl->csg_N, &mnl->csg_n, VOLUME/2); /* Now Q_- */ /* X -> w_fields[1] */ chrono_guess(mnl->w_fields[1], mnl->w_fields[0], mnl->csg_field2, mnl->csg_index_array2, mnl->csg_N2, mnl->csg_n2, VOLUME/2, &Q_minus_psi); mnl->iter1 += solve_degenerate(mnl->w_fields[1], mnl->w_fields[0], mnl->solver_params, mnl->maxiter, mnl->forceprec, g_relative_precision_flag, VOLUME, &Q_minus_psi, mnl->solver); chrono_add_solution(mnl->w_fields[1], mnl->csg_field2, mnl->csg_index_array2, mnl->csg_N2, &mnl->csg_n2, VOLUME/2); } /* \delta Q sandwitched by Y^\dagger and X */ deriv_Sb_D_psi(mnl->w_fields[0], mnl->w_fields[1], hf, mnl->forcefactor); } g_mu = g_mu1; boundary(g_kappa); etime = gettime(); if(g_debug_level > 1 && g_proc_id == 0) { printf("# Time for %s monomial derivative: %e s\n", mnl->name, etime-atime); } return; }
void cloverdet_derivative(const int id, hamiltonian_field_t * const hf) { monomial * mnl = &monomial_list[id]; double atime, etime; int N = VOLUME/2; atime = gettime(); for(int i = 0; i < VOLUME; i++) { for(int mu = 0; mu < 4; mu++) { _su3_zero(swm[i][mu]); _su3_zero(swp[i][mu]); } } mnl->forcefactor = 1.; /********************************************************************* * * * This a term is det(\hat Q^2(\mu)) * *********************************************************************/ g_mu = mnl->mu; g_mu3 = mnl->rho; boundary(mnl->kappa); // we compute the clover term (1 + T_ee(oo)) for all sites x sw_term( (const su3**) hf->gaugefield, mnl->kappa, mnl->c_sw); // we invert it for the even sites only if(!mnl->even_odd_flag) { N = VOLUME; } else { sw_invert(EE, mnl->mu); } if(mnl->solver != CG && g_proc_id == 0) { fprintf(stderr, "Bicgstab currently not implemented, using CG instead! (cloverdet_monomial.c)\n"); } // Invert Q_{+} Q_{-} // X_o -> w_fields[1] chrono_guess(mnl->w_fields[1], mnl->pf, mnl->csg_field, mnl->csg_index_array, mnl->csg_N, mnl->csg_n, VOLUME/2, mnl->Qsq); mnl->iter1 += solve_degenerate(mnl->w_fields[1], mnl->pf, mnl->solver_params, mnl->maxiter, mnl->forceprec, g_relative_precision_flag, VOLUME/2, mnl->Qsq, mnl->solver); chrono_add_solution(mnl->w_fields[1], mnl->csg_field, mnl->csg_index_array, mnl->csg_N, &mnl->csg_n, N); // Y_o -> w_fields[0] mnl->Qm(mnl->w_fields[0], mnl->w_fields[1]); if(mnl->even_odd_flag) { // apply Hopping Matrix M_{eo} // to get the even sites of X_e H_eo_sw_inv_psi(mnl->w_fields[2], mnl->w_fields[1], EO, -1, mnl->mu); // \delta Q sandwitched by Y_o^\dagger and X_e deriv_Sb(OE, mnl->w_fields[0], mnl->w_fields[2], hf, mnl->forcefactor); // to get the even sites of Y_e H_eo_sw_inv_psi(mnl->w_fields[3], mnl->w_fields[0], EO, +1, mnl->mu); // \delta Q sandwitched by Y_e^\dagger and X_o // uses the gauge field in hf and changes the derivative fields in hf deriv_Sb(EO, mnl->w_fields[3], mnl->w_fields[1], hf, mnl->forcefactor); // here comes the clover term... // computes the insertion matrices for S_eff // result is written to swp and swm // even/even sites sandwiched by gamma_5 Y_e and gamma_5 X_e sw_spinor_eo(EE, mnl->w_fields[2], mnl->w_fields[3], mnl->forcefactor); // odd/odd sites sandwiched by gamma_5 Y_o and gamma_5 X_o sw_spinor_eo(OO, mnl->w_fields[0], mnl->w_fields[1], mnl->forcefactor); // compute the contribution for the det-part // we again compute only the insertion matrices for S_det // the result is added to swp and swm // even sites only! sw_deriv(EE, mnl->mu); } else { /* \delta Q sandwitched by Y^\dagger and X */ deriv_Sb_D_psi(mnl->w_fields[0], mnl->w_fields[1], hf, mnl->forcefactor); sw_spinor(mnl->w_fields[0], mnl->w_fields[1], mnl->forcefactor); } // now we compute // finally, using the insertion matrices stored in swm and swp // we compute the terms F^{det} and F^{sw} at once // uses the gaugefields in hf and changes the derivative field in hf sw_all(hf, mnl->kappa, mnl->c_sw); g_mu = g_mu1; g_mu3 = 0.; boundary(g_kappa); etime = gettime(); if(g_debug_level > 1 && g_proc_id == 0) { printf("# Time for %s monomial derivative: %e s\n", mnl->name, etime-atime); } return; }