42 std::vector< std::pair<int, FunctionType> >
functions;
71 void derivative(GaugeField&,
const GaugeField&,
const GaugeField&)
const override{
100template <
class Gimpl>
115 void smear(GaugeField& out,
const GaugeField& in)
const override;
119template <
class Gimpl>
141 void smear(GaugeField& out,
const GaugeField& in)
const override;
155template <
class Gimpl>
158 return 2.0 * t * t *
SG.S(
U)/
U.Grid()->gSites();
162template <
class Gimpl>
164 typedef typename Gimpl::GaugeLinkField GaugeMat;
165 typedef typename Gimpl::GaugeField GaugeLorentz;
171 GaugeMat
F(
U.Grid());
175 for(
int mu=0;mu<3;mu++){
176 for(
int nu=mu+1;nu<4;nu++){
182 out = t*t*out /
RealD(
U.Grid()->gSites());
187template <
class Gimpl>
189 std::vector<RealD> out;
191 addMeasurement(measure_interval, [&out](
int step,
RealD t,
const typename Gimpl::GaugeField &
U){
192 std::cout <<
GridLogMessage <<
"[WilsonFlow] Computing plaquette energy density for step " << step << std::endl;
199template <
class Gimpl>
205template <
class Gimpl>
207 std::vector<RealD> out;
209 addMeasurement(measure_interval, [&out](
int step,
RealD t,
const typename Gimpl::GaugeField &
U){
210 std::cout <<
GridLogMessage <<
"[WilsonFlow] Computing Cloverleaf energy density for step " << step << std::endl;
217template <
class Gimpl>
223template <
class Gimpl>
238template <
class Gimpl>
240 GaugeField Z(
U.Grid());
241 GaugeField tmp(
U.Grid());
242 this->
SG.deriv(
U, Z);
244 Gimpl::update_field(Z,
U, -2.0*
epsilon);
247 this->
SG.deriv(
U, tmp); Z += tmp;
249 Gimpl::update_field(Z,
U, -2.0*
epsilon);
252 this->
SG.deriv(
U, tmp); Z += tmp;
254 Gimpl::update_field(Z,
U, -2.0*
epsilon);
258template <
class Gimpl>
261 <<
"[WilsonFlow] Nstep : " <<
Nstep << std::endl;
263 <<
"[WilsonFlow] epsilon : " <<
epsilon << std::endl;
265 <<
"[WilsonFlow] full trajectory : " <<
Nstep *
epsilon << std::endl;
272 meas.second(0,taus,out);
274 for (
unsigned int step = 1; step <=
Nstep; step++) {
275 auto start = std::chrono::high_resolution_clock::now();
277 auto end = std::chrono::high_resolution_clock::now();
278 std::chrono::duration<double> diff = end - start;
280 std::cout <<
"Time to evolve " << diff.count() <<
" s\n";
283 for(
auto const &meas : this->functions)
284 if( step % meas.first == 0 ) meas.second(step,taus,out);
290template <
class Gimpl>
296 GaugeField Z(
U.Grid());
297 GaugeField Zprime(
U.Grid());
298 GaugeField tmp(
U.Grid()), Uprime(
U.Grid()), Usave(
U.Grid());
302 this->
SG.deriv(
U, Z);
305 Gimpl::update_field(Z,
U, -2.0*eps);
308 this->
SG.deriv(
U, tmp); Z += tmp;
311 Gimpl::update_field(Z,
U, -2.0*eps);
315 this->
SG.deriv(
U, tmp); Z += tmp;
317 Gimpl::update_field(Z,
U, -2.0*eps);
320 Gimpl::update_field(Zprime, Uprime, -2.0*eps);
323 GaugeField diffU =
U - Uprime;
326 for(
int mu=0;mu<
Nd;mu++){
329 max_dist = std::max(max_dist, dist_mu);
340 eps = eps*0.95*std::pow(
tolerance/max_dist,1./3.);
341 std::cout <<
GridLogMessage <<
"Adaptive smearing : Distance: "<< max_dist <<
" Step successful: " << ret <<
" New epsilon: " << eps << std::endl;
346template <
class Gimpl>
349 <<
"[WilsonFlow] initial epsilon : " <<
init_epsilon << std::endl;
351 <<
"[WilsonFlow] full trajectory : " <<
maxTau << std::endl;
353 <<
"[WilsonFlow] tolerance : " <<
tolerance << std::endl;
357 unsigned int step = 0;
361 meas.second(step,taus,out);
365 step += step_success;
369 for(
auto const &meas : this->functions)
370 if( step % meas.first == 0 ) meas.second(step,taus,out);
#define INHERIT_GIMPL_TYPES(GImpl)
accelerator_inline Grid_simd2< S, V > trace(const Grid_simd2< S, V > &arg)
accelerator_inline Grid_simd< S, V > sqrt(const Grid_simd< S, V > &r)
auto PeekIndex(const Lattice< vobj > &lhs, int i) -> Lattice< decltype(peekIndex< Index >(vobj(), i))>
Lattice< vobj > real(const Lattice< vobj > &lhs)
RealD maxLocalNorm2(const Lattice< vobj > &arg)
vobj::scalar_object sum(const vobj *arg, Integer osites)
GridLogger GridLogMessage(1, "Message", GridLogColours, "NORMAL")
#define NAMESPACE_BEGIN(A)
Lattice< vTComplexD > LatticeComplexD
std::complex< RealD > ComplexD
static INTERNAL_PRECISION U
static INTERNAL_PRECISION F
virtual void smear(GaugeField &, const GaugeField &) const =0
int evolve_step_adaptive(typename Gimpl::GaugeField &U, RealD &tau, RealD &eps) const
WilsonFlowAdaptive(const RealD init_epsilon, const RealD maxTau, const RealD tolerance, unsigned int meas_interval=1)
void smear(GaugeField &out, const GaugeField &in) const override
void setDefaultMeasurements(int topq_meas_interval=1)
void addMeasurement(int meas_interval, FunctionType meas)
void derivative(GaugeField &, const GaugeField &, const GaugeField &) const override
static RealD energyDensityCloverleaf(const RealD t, const GaugeField &U)
WilsonGaugeAction< Gimpl > SG
std::vector< std::pair< int, FunctionType > > functions
std::function< void(int, RealD, const typename Gimpl::GaugeField &)> FunctionType
static RealD energyDensityPlaquette(const RealD t, const GaugeField &U)
std::vector< RealD > flowMeasureEnergyDensityCloverleaf(GaugeField &V, const GaugeField &U, int measure_interval=1)
std::vector< RealD > flowMeasureEnergyDensityPlaquette(GaugeField &V, const GaugeField &U, int measure_interval=1)
WilsonFlowBase(unsigned int meas_interval=1)
void smear(GaugeField &out, const GaugeField &in) const override
WilsonFlow(const RealD epsilon, const int Nstep, unsigned int meas_interval=1)
void evolve_step(typename Gimpl::GaugeField &U, RealD &tau) const
The Wilson gauge action, as introduced in Wilson, Phys. Rev. D 10, 2445. See for example Gattringer a...
static void FieldStrength(GaugeMat &FS, const GaugeLorentz &Umu, int mu, int nu)
static Real TopologicalCharge(const GaugeLorentz &U)