// update void do_hb_update(su3_matrix* links, const gsl_rng* r, const su3_matrix* rands, int* site, int dir){ if(verbose) {printf("Updating {%d, %d, %d, %d} direction %d",site[0],site[1],site[2],site[3],dir);getchar();} double dS,action_old; su3_matrix link_old; for(int times=0; times<Nk; times++){ action_old = action(links,site,dir); link_old = links[index(site,dir)]; links[index(site,dir)]=su3_mul(links[index(site,dir)],rands[gsl_rng_uniform_int(r, 50)]); dS = action(links,site,dir)-action_old; if(verbose) {printf("Old action = %f, ",action_old); su3_print(link_old); getchar();} if(verbose) {printf("New action = %f, ",action_old+dS); su3_print(links[index(site,dir)]); getchar();} acc++;tot++; if(dS>0){ if(exp(-dS)<gsl_rng_uniform(r)){ acc--; links[index(site,dir)]=link_old; // revert update if(verbose) {printf("Reverted"); getchar();} } } } }
//take also the TA THREADABLE_FUNCTION_3ARG(compute_gluonic_force_lx_conf, quad_su3*,F, quad_su3*,conf, theory_pars_t*,physics) { GET_THREAD_ID(); START_TIMING(gluon_force_time,ngluon_force); #ifdef DEBUG vector_reset(F); double eps=1e-5; //store initial link and compute action su3 sto; su3_copy(sto,conf[0][0]); double act_ori; gluonic_action(&act_ori,conf,physics->gauge_action_name,physics->beta); //store derivative su3 nu_plus,nu_minus; su3_put_to_zero(nu_plus); su3_put_to_zero(nu_minus); for(int igen=0;igen<NCOL*NCOL-1;igen++) { //prepare increment and change su3 ba; su3_prod_double(ba,gell_mann_matr[igen],eps/2); su3 exp_mod; safe_hermitian_exact_i_exponentiate(exp_mod,ba); //change -, compute action unsafe_su3_dag_prod_su3(conf[0][0],exp_mod,sto); double act_minus; gluonic_action(&act_minus,conf,physics->gauge_action_name,physics->beta); //change +, compute action unsafe_su3_prod_su3(conf[0][0],exp_mod,sto); double act_plus; gluonic_action(&act_plus,conf,physics->gauge_action_name,physics->beta); //set back everything su3_copy(conf[0][0],sto); //printf("plus: %+016.016le, ori: %+016.016le, minus: %+016.016le, eps: %lg\n",act_plus,act_ori,act_minus,eps); double gr_plus=-(act_plus-act_ori)/eps; double gr_minus=-(act_ori-act_minus)/eps; su3_summ_the_prod_idouble(nu_plus,gell_mann_matr[igen],gr_plus); su3_summ_the_prod_idouble(nu_minus,gell_mann_matr[igen],gr_minus); } //take the average su3 nu; su3_summ(nu,nu_plus,nu_minus); su3_prodassign_double(nu,0.5); vector_reset(F); #endif compute_gluonic_force_lx_conf_do_not_finish(F,conf,physics); //finish the calculation gluonic_force_finish_computation(F,conf); #ifdef DEBUG master_printf("checking pure gauge force\n"); master_printf("an\n"); su3_print(F[0][0]); master_printf("nu\n"); su3_print(nu); master_printf("nu_plus\n"); su3_print(nu_plus); master_printf("nu_minus\n"); su3_print(nu_minus); //crash("anna"); #endif //print the intensity of the force if(VERBOSITY_LV2) { double norm=0; norm+=double_vector_glb_norm2(F,loc_vol); master_printf(" Gluonic force average norm: %lg\n",sqrt(norm/glb_vol)); } STOP_TIMING(gluon_force_time); }
THREADABLE_FUNCTION_END //same but with acceleration THREADABLE_FUNCTION_8ARG(evolve_momenta_and_FACC_momenta, quad_su3*,H, su3**,pi, quad_su3*,conf, su3**,phi, theory_pars_t*,theory_pars, pure_gauge_evol_pars_t*,simul, double,dt, quad_su3*,ext_F) { verbosity_lv2_master_printf("Evolving momenta and FACC momenta, dt=%lg\n",dt); quad_su3 *F=(ext_F==NULL)?nissa_malloc("F",loc_vol,quad_su3):ext_F; #ifdef DEBUG vector_reset(F); double eps=1e-5; //store initial link and compute action su3 sto; su3_copy(sto,conf[0][0]); double act_ori=pure_gauge_action(conf,*theory_pars,*simul,H,phi,pi); //store derivative su3 nu_plus,nu_minus; su3_put_to_zero(nu_plus); su3_put_to_zero(nu_minus); for(int igen=0;igen<NCOL*NCOL-1;igen++) { //prepare increment and change su3 ba; su3_prod_double(ba,gell_mann_matr[igen],eps/2); su3 exp_mod; safe_hermitian_exact_i_exponentiate(exp_mod,ba); //change -, compute action unsafe_su3_dag_prod_su3(conf[0][0],exp_mod,sto); double act_minus=pure_gauge_action(conf,*theory_pars,*simul,H,phi,pi); //change +, compute action unsafe_su3_prod_su3(conf[0][0],exp_mod,sto); double act_plus=pure_gauge_action(conf,*theory_pars,*simul,H,phi,pi); //set back everything su3_copy(conf[0][0],sto); //printf("plus: %+016.016le, ori: %+016.016le, minus: %+016.016le, eps: %lg\n",act_plus,act_ori,act_minus,eps); double gr_plus=-(act_plus-act_ori)/eps; double gr_minus=-(act_ori-act_minus)/eps; su3_summ_the_prod_idouble(nu_plus,gell_mann_matr[igen],gr_plus); su3_summ_the_prod_idouble(nu_minus,gell_mann_matr[igen],gr_minus); } //take the average su3 nu; su3_summ(nu,nu_plus,nu_minus); su3_prodassign_double(nu,0.5); vector_reset(F); #endif //compute the various contribution to the QCD force if(evolve_SU3) { //compute without TA vector_reset(F); compute_gluonic_force_lx_conf_do_not_finish(F,conf,theory_pars); summ_the_MFACC_momenta_QCD_force(F,conf,simul->kappa,pi,simul->naux_fields); summ_the_MFACC_QCD_momenta_QCD_force(F,conf,simul->kappa,100000,simul->residue,H); //finish the calculation gluonic_force_finish_computation(F,conf); evolve_lx_momenta_with_force(H,F,dt); } #ifdef DEBUG master_printf("checking TOTAL gauge force\n"); master_printf("an\n"); su3_print(F[0][0]); master_printf("nu\n"); su3_print(nu); master_printf("nu_plus\n"); su3_print(nu_plus); master_printf("nu_minus\n"); su3_print(nu_minus); //crash("anna"); #endif //evolve FACC momenta if(evolve_FACC) evolve_MFACC_momenta(pi,phi,simul->naux_fields,dt); if(ext_F==NULL) nissa_free(F); }
// Evolve momenta according to the rooted staggered force THREADABLE_FUNCTION_7ARG(evolve_momenta_with_quark_force, quad_su3**,H, quad_su3**,conf, std::vector<std::vector<pseudofermion_t> >*,pf, theory_pars_t*,theory_pars, hmc_evol_pars_t*,simul_pars, std::vector<rat_approx_t>*,rat_appr, double,dt) { GET_THREAD_ID(); verbosity_lv2_master_printf("Evolving momenta with quark force, dt=%lg\n",dt); //allocate forces quad_su3 *F[2]={nissa_malloc("F0",loc_volh,quad_su3),nissa_malloc("F1",loc_volh,quad_su3)}; //compute the force compute_quark_force(F,conf,pf,theory_pars,rat_appr,simul_pars->md_residue); //#define DEBUG #ifdef DEBUG int par=1,ieo=1,mu=1; double eps=1e-5; //store initial link su3 sto; su3_copy(sto,conf[par][ieo][mu]); //allocate smeared conf quad_su3 *sme_conf[2]; for(int eo=0;eo<2;eo++) sme_conf[eo]=nissa_malloc("sme_conf",loc_volh+bord_volh+edge_volh,quad_su3); //compute action before double act_ori; stout_smear(sme_conf,conf,&(theory_pars->stout_pars)); rootst_eoimpr_quark_action(&act_ori,sme_conf,theory_pars->nflavs,theory_pars->backfield,pf,simul_pars); //store derivative su3 nu_plus,nu_minus; su3_put_to_zero(nu_plus); su3_put_to_zero(nu_minus); for(int igen=0;igen<NCOL*NCOL-1;igen++) { //prepare increment and change su3 ba; su3_prod_double(ba,gell_mann_matr[igen],eps/2); su3 exp_mod; safe_hermitian_exact_i_exponentiate(exp_mod,ba); //change -, compute action unsafe_su3_dag_prod_su3(conf[par][ieo][mu],exp_mod,sto); double act_minus; stout_smear(sme_conf,conf,&(theory_pars->stout_pars)); rootst_eoimpr_quark_action(&act_minus,sme_conf,theory_pars->nflavs,theory_pars->backfield,pf,simul_pars); //change +, compute action unsafe_su3_prod_su3(conf[par][ieo][mu],exp_mod,sto); double act_plus; stout_smear(sme_conf,conf,&(theory_pars->stout_pars)); rootst_eoimpr_quark_action(&act_plus,sme_conf,theory_pars->nflavs,theory_pars->backfield,pf,simul_pars); //set back everything su3_copy(conf[par][ieo][mu],sto); //printf("plus: %+016.016le, ori: %+016.016le, minus: %+016.016le, eps: %lg\n",act_plus,act_ori,act_minus,eps); double gr_plus=-(act_plus-act_ori)/eps; double gr_minus=-(act_ori-act_minus)/eps; su3_summ_the_prod_idouble(nu_plus,gell_mann_matr[igen],gr_plus); su3_summ_the_prod_idouble(nu_minus,gell_mann_matr[igen],gr_minus); } //take the average su3 nu; su3_summ(nu,nu_plus,nu_minus); su3_prodassign_double(nu,0.5); master_printf("checking pure gauge force\n"); master_printf("an\n"); su3_print(F[par][ieo][mu]); master_printf("nu\n"); su3_print(nu); master_printf("nu_plus\n"); su3_print(nu_plus); master_printf("nu_minus\n"); su3_print(nu_minus); //crash("anna"); #endif //evolve for(int par=0;par<2;par++) { NISSA_PARALLEL_LOOP(ivol,0,loc_volh) for(int mu=0;mu<NDIM;mu++) for(int ic1=0;ic1<NCOL;ic1++) for(int ic2=0;ic2<NCOL;ic2++) complex_subt_the_prod_idouble(H[par][ivol][mu][ic1][ic2],F[par][ivol][mu][ic1][ic2],dt); nissa_free(F[par]); } }