diff --git a/projects/generate_confs/parser.ypp b/projects/generate_confs/parser.ypp index 0b547a382..42f17f1ba 100644 --- a/projects/generate_confs/parser.ypp +++ b/projects/generate_confs/parser.ypp @@ -237,6 +237,10 @@ %token TK_GAUSS_NITER_SNK %type gauss_kappa %type gauss_niter_src gauss_niter_snk +%token TK_APE_ALPHA +%token TK_APE_NITER +%type ape_alpha +%type ape_niter //putpourri %type fermionic_putpourri_meas %token TK_MEAS_PUTPOURRI @@ -609,6 +613,8 @@ meson_corr_meas: TK_MEAS_MESON_CORRS {$$=new meson_corr_meas_pars_t();} | meson_corr_meas gauss_kappa {$$->gauss_kappa=$2;} | meson_corr_meas gauss_niter_src {$$->gauss_niter_src=$2;} | meson_corr_meas gauss_niter_snk {$$->gauss_niter_snk=$2;} + | meson_corr_meas ape_alpha {$$->ape_alpha=$2;} + | meson_corr_meas ape_niter {$$->ape_niter=$2;} ; dir: TK_DIR '=' int_numb {$$=$3;} @@ -623,6 +629,12 @@ gauss_niter_src: TK_GAUSS_NITER_SRC '=' int_numb {$$=$3;} gauss_niter_snk: TK_GAUSS_NITER_SNK '=' int_numb {$$=$3;} ; +ape_alpha: TK_APE_ALPHA '=' double_numb {$$=$3;} +; + +ape_niter: TK_APE_NITER '=' int_numb {$$=$3;} +; + operators: TK_OPERATORS '=' int_pair_list { for(size_t i=0;i<$3->size();i++) { diff --git a/projects/generate_confs/tokenizer.lpp b/projects/generate_confs/tokenizer.lpp index 0560964bb..4274696a7 100644 --- a/projects/generate_confs/tokenizer.lpp +++ b/projects/generate_confs/tokenizer.lpp @@ -134,6 +134,10 @@ GaussKappa DEBUG_PRINTF("Found GaussKappa\n");return TK_GAUSS_KAPPA; GaussNiterSrc DEBUG_PRINTF("Found GaussNiterSrc\n");return TK_GAUSS_NITER_SRC; GaussNiterSnk DEBUG_PRINTF("Found GaussNiterSnk\n");return TK_GAUSS_NITER_SNK; + /* ape smearing (meson corrs) */ +ApeAlpha DEBUG_PRINTF("Found ApeAlpha\n");return TK_APE_ALPHA; +ApeNiter DEBUG_PRINTF("Found ApeNiter\n");return TK_APE_NITER; + /* rendens pars */ MaxOrder DEBUG_PRINTF("Found MaxOrder\n");return TK_MAX_ORDER; diff --git a/src/measures/fermions/mesons.cpp b/src/measures/fermions/mesons.cpp index e97b2808a..4a45b1e1d 100644 --- a/src/measures/fermions/mesons.cpp +++ b/src/measures/fermions/mesons.cpp @@ -16,6 +16,7 @@ #include "routines/mpi_routines.hpp" #include "stag.hpp" #include "operations/smearing/gaussian.hpp" +#include "operations/smearing/APE.hpp" namespace nissa { @@ -26,9 +27,9 @@ namespace nissa int nop; int ncombo; int nflavs; - - /// Compute the index where to store - inline int icombo(const int& iflav_so, + + /// Compute the index where to store + inline int icombo(const int& iflav_so, const int& iflav_si, const int& iop_so, const int& iop_si, @@ -43,26 +44,30 @@ namespace nissa } } - // Reuse gaussian_smearing using lx as buffer + + + // reuse gaussian_smearing using lx as buffer template - void gaussian_smear_eo(EoField& out, - const EoField& in, - LxField& lx_buf, - LxField& lx_temp, - LxField& lx_H, - const LxField& conf_lx, - const double gauss_kappa, - const int gauss_niter) - { - if(gauss_niter<=0) - out=in; - else - { - paste_eo_parts_into_lx_vector(lx_buf,in); - gaussian_smearing(lx_buf,lx_buf,conf_lx,gauss_kappa,gauss_niter,&lx_temp,&lx_H); - split_lx_vector_into_eo_parts(out,lx_buf); - } - } + void gaussian_smear_eo(EoField& out, + const EoField& in, + LxField& lx_buf, + LxField& lx_temp, + LxField& lx_H, + const LxField& conf_lx, + const double gauss_kappa, + const int gauss_niter, + const int corr_dir) + { + if(gauss_niter<=0) + out = in; + else + { + paste_eo_parts_into_lx_vector(lx_buf,in); + gaussian_smearing(lx_buf,lx_buf,conf_lx,gauss_kappa,gauss_niter,corr_dir,&lx_temp,&lx_H); + split_lx_vector_into_eo_parts(out,lx_buf); + } + } + void compute_meson_corr(complex* corr, const EoField& conf, @@ -71,9 +76,12 @@ namespace nissa { const int& dir= meas_pars.dir; - const double gauss_kappa=meas_pars.gauss_kappa; - const int gauss_niter_src=meas_pars.gauss_niter_src; - const int gauss_niter_snk=meas_pars.gauss_niter_snk; + const double gauss_kappa=meas_pars.gauss_kappa; + const int gauss_niter_src=meas_pars.gauss_niter_src; + const int gauss_niter_snk=meas_pars.gauss_niter_snk; + const double ape_alpha=meas_pars.ape_alpha; + const int ape_niter=meas_pars.ape_niter; + //allocate EoField ori_source("ori_source",WITH_HALO); @@ -83,21 +91,21 @@ namespace nissa std::vector> quark(nflavs*nop,{"quark",WITH_HALO}); std::vector> quark0s(nflavs*nop,{"quark0s",WITH_HALO}); - LxField conf_lx("conf_lx",WITH_HALO); - paste_eo_parts_into_lx_vector(conf_lx,conf); - + LxField conf_lx("conf_lx",WITH_HALO_EDGES); + LxField conf_lx_ape("conf_lx_ape",WITH_HALO_EDGES); + paste_eo_parts_into_lx_vector(conf_lx,conf); + ape_orth_dir_smear_conf(conf_lx_ape, conf_lx, ape_alpha, ape_niter, dir); + LxField gauss_lx_buf("gauss_lx_buf",WITH_HALO); LxField gauss_lx_temp("gauss_lx_temp",WITH_HALO); LxField gauss_lx_H("gauss_lx_H",WITH_HALO); - - auto gSmear= - [&](EoField& out, - const int& nIter, - const EoField& in) + + auto gSmear = + [&](EoField& out, const int& nIter, const EoField& in) { - gaussian_smear_eo(out,in,gauss_lx_buf,gauss_lx_temp,gauss_lx_H,conf_lx,gauss_kappa,nIter); + gaussian_smear_eo(out, in, gauss_lx_buf, gauss_lx_temp, gauss_lx_H, conf_lx_ape, gauss_kappa, nIter, dir); }; - + //form the masks int mask[nop],shift[nop]; for(int iop=0;iop smeared_ori_source("smeared_ori_source",WITH_HALO); - gSmear(smeared_ori_source,gauss_niter_src,ori_source); - + gSmear(smeared_ori_source, gauss_niter_src, ori_source); + for(int iflav=0;iflav> mesons; int dir; + + double ape_alpha; + + int ape_niter; double gauss_kappa; @@ -24,7 +28,18 @@ namespace nissa { return 0; } - + + //ape smearing default disabled + double def_ape_alpha() const + { + return 0.5; + } + + int def_ape_niter() const + { + return 0; + } + // Smearing defaults: disabled double def_gauss_kappa() const { @@ -72,15 +87,22 @@ namespace nissa } os<<"}\n"; } + + if(ape_alpha!=def_ape_alpha() or full) + os<<" ApeAlpha\t=\t"<& smear_conf, const LxField& origi_conf, @@ -88,6 +89,17 @@ namespace nissa { ape_smear_conf(smear_conf,origi_conf,alpha,nstep,allOtherDirs[mu]); } + + // - smear only mu != corr_dir + // - staples use only nu != corr_dir + inline void ape_orth_dir_smear_conf(LxField& smear_conf, + const LxField& origi_conf, + const double& alpha, + const int& nstep, + const int& corr_dir) + { + ape_smear_conf(smear_conf,origi_conf,alpha,nstep,allOtherDirs[corr_dir],0,corr_dir); + } inline void ape_temporal_smear_conf(LxField& smear_conf, const LxField& origi_conf, diff --git a/src/operations/smearing/gaussian.hpp b/src/operations/smearing/gaussian.hpp index 8d91870fa..3bd0fe84e 100644 --- a/src/operations/smearing/gaussian.hpp +++ b/src/operations/smearing/gaussian.hpp @@ -67,9 +67,9 @@ namespace nissa if(ext_H==nullptr) _H=new LxField("H",WITH_HALO); \ LxField& H=*_H; \ \ - const double norm_fact=1/(1+2*(kappa[1]+kappa[2]+kappa[3])); \ + const double norm_fact=1/(1+2*(kappa[0]+kappa[1]+kappa[2]+kappa[3])); \ \ - VERBOSITY_LV2_MASTER_PRINTF("GAUSSIAN smearing with kappa={%g,%g,%g}, %d iterations\n",kappa[1],kappa[2],kappa[3],niter); \ + VERBOSITY_LV2_MASTER_PRINTF("GAUSSIAN smearing with kappa={%g,%g,%g,%g}, %d iterations\n",kappa[0],kappa[1],kappa[2],kappa[3],niter); \ \ /*iter 0*/ \ temp=origi_sc; \ @@ -77,7 +77,7 @@ namespace nissa /*loop over gaussian iterations*/ \ for(int iter=0;iter + void gaussian_smearing(LxField& smear_sc, + const LxField& origi_sc, + const LxField& conf, + double kappa_val, + int niter, + int corr_dir, // dir along which the correlator is measured + LxField* ext_temp=nullptr, + LxField* ext_H=nullptr) + { + Momentum kappa = {0.0, 0.0, 0.0, 0.0}; + for(int mu=0; mu