32#ifndef INTEGRATOR_INCLUDED
33#define INTEGRATOR_INCLUDED
43 unsigned int, MDsteps,
50 template <class ReaderClass, typename std::enable_if<isReader<ReaderClass>::value,
int >
::type = 0 >
54 read(Reader,
"Integrator", *
this);
58 std::cout <<
GridLogMessage <<
"[Integrator] Type : " << name << std::endl;
59 std::cout <<
GridLogMessage <<
"[Integrator] Trajectory length : " << trajL << std::endl;
60 std::cout <<
GridLogMessage <<
"[Integrator] Number of MD steps : " << MDsteps << std::endl;
61 std::cout <<
GridLogMessage <<
"[Integrator] Step size : " << trajL/MDsteps << std::endl;
66template <
class FieldImplementation_,
class SmearingPolicy,
class RepresentationPolicy>
72 typedef typename FieldImplementation::Field
Field;
76 std::vector<double>
t_P;
102 std::cout <<
GridLogIntegrator <<
"[" << level <<
"] P " <<
" dt " << ep <<
" : t_P " <<
t_P[level] << std::endl;
109 template <
class FieldType,
class GF,
class Repr>
111 GF& Mom, GF&
U,
double ep) {
112 for (
int a = 0; a < repr_set.size(); ++a) {
113 FieldType forceR(
U.Grid());
115 repr_set.at(a)->deriv(Rep.U, forceR);
116 GF force = Rep.RtoFundamentalProject(forceR);
117 Real force_abs = std::sqrt(
norm2(force)/(
U.Grid()->gSites()));
118 std::cout <<
GridLogIntegrator <<
"Hirep Force average: " << force_abs << std::endl;
131 Field level_force(
U.Grid()); level_force =
Zero();
132 for (
int a = 0; a <
as[level].actions.size(); ++a) {
138 double start_force =
usecond();
140 as[level].actions.at(a)->deriv_timer_start();
141 as[level].actions.at(a)->deriv(
Smearer, force);
142 as[level].actions.at(a)->deriv_timer_stop();
144 auto name =
as[level].actions.at(a)->action_name();
146 force = FieldImplementation::projectForce(force);
151 std::cout <<
GridLogIntegrator <<
" update_P : Level [" << level <<
"]["<<a <<
"] "<<name<<
" dt "<<ep<< std::endl;
154 level_force = level_force+force;
156 Real force_abs = std::sqrt(
norm2(force)/
U.Grid()->gSites());
162 as[level].actions.at(a)->deriv_log(force_abs,force_max,impulse_abs,impulse_max);
164 std::cout <<
GridLogIntegrator<<
"["<<level<<
"]["<<a<<
"] dt : " << ep <<
" "<<name<<std::endl;
165 std::cout <<
GridLogIntegrator<<
"["<<level<<
"]["<<a<<
"] Force average: " << force_abs <<
" "<<name<<std::endl;
166 std::cout <<
GridLogIntegrator<<
"["<<level<<
"]["<<a<<
"] Force max : " << force_max <<
" "<<name<<std::endl;
167 std::cout <<
GridLogIntegrator<<
"["<<level<<
"]["<<a<<
"] Fdt average : " << impulse_abs <<
" "<<name<<std::endl;
168 std::cout <<
GridLogIntegrator<<
"["<<level<<
"]["<<a<<
"] Fdt max : " << impulse_max <<
" "<<name<<std::endl;
172 double time_full = (end_full - start_full) / 1e3;
173 double time_force = (end_force - start_force) / 1e3;
174 std::cout <<
GridLogMessage <<
"["<<level<<
"]["<<a<<
"] P update elapsed time: " << time_full <<
" ms (force: " << time_force <<
" ms)" << std::endl;
180 Real force_abs = std::sqrt(
norm2(level_force)/
U.Grid()->gSites());
185 LevelForces[level].actions.at(0)->deriv_log(force_abs,force_max,impulse_abs,impulse_max);
199 std::cout <<
GridLogIntegrator <<
" " <<
"[" << fl <<
"] U " <<
" dt " << ep <<
" : t_U " <<
t_U << std::endl;
209 FieldImplementation::update_field(MomFiltered,
U, ep);
218 virtual void step(
Field&
U,
int level,
int first,
int last) = 0;
238 for (
int level = 0; level <
as.size(); ++level) {
239 int multiplier =
as.at(level).multiplier;
269 for (
int level = 0; level <
as.size(); ++level) {
270 for (
int actionID = 0; actionID <
as[level].actions.size(); ++actionID) {
271 as[level].actions.at(actionID)->reset_timer();
275 LevelForces.at(level).actions.at(actionID)->reset_timer();
280 std::cout <<
GridLogMessage <<
":::::::::::::::::::::::::::::::::::::::::" << std::endl;
281 std::cout <<
GridLogMessage <<
" Refresh cumulative timings "<<std::endl;
282 std::cout <<
GridLogMessage <<
"--------------------------- "<<std::endl;
283 for (
int level = 0; level <
as.size(); ++level) {
284 for (
int actionID = 0; actionID <
as[level].actions.size(); ++actionID) {
286 <<
as[level].actions.at(actionID)->action_name()
287 <<
"["<<level<<
"]["<< actionID<<
"] "
288 <<
as[level].actions.at(actionID)->refresh_us*1.0e-6<<
" s"<< std::endl;
291 std::cout <<
GridLogMessage <<
"--------------------------- "<<std::endl;
292 std::cout <<
GridLogMessage <<
" Action cumulative timings "<<std::endl;
293 std::cout <<
GridLogMessage <<
"--------------------------- "<<std::endl;
294 for (
int level = 0; level <
as.size(); ++level) {
295 for (
int actionID = 0; actionID <
as[level].actions.size(); ++actionID) {
297 <<
as[level].actions.at(actionID)->action_name()
298 <<
"["<<level<<
"]["<< actionID<<
"] "
299 <<
as[level].actions.at(actionID)->S_us*1.0e-6<<
" s"<< std::endl;
302 std::cout <<
GridLogMessage <<
"--------------------------- "<<std::endl;
303 std::cout <<
GridLogMessage <<
" Force cumulative timings "<<std::endl;
304 std::cout <<
GridLogMessage <<
"------------------------- "<<std::endl;
305 for (
int level = 0; level <
as.size(); ++level) {
306 for (
int actionID = 0; actionID <
as[level].actions.size(); ++actionID) {
308 <<
as[level].actions.at(actionID)->action_name()
309 <<
"["<<level<<
"]["<< actionID<<
"] "
310 <<
as[level].actions.at(actionID)->deriv_us*1.0e-6<<
" s"<< std::endl;
313 std::cout <<
GridLogMessage <<
"--------------------------- "<<std::endl;
315 std::cout <<
GridLogMessage <<
"------------------------- "<<std::endl;
316 uint64_t full, partial, dirichlet;
319 std::cout <<
GridLogMessage <<
" Partial dirichlet BCs : "<<partial<<std::endl;
320 std::cout <<
GridLogMessage <<
" Dirichlet BCs : "<<dirichlet<<std::endl;
322 std::cout <<
GridLogMessage <<
"--------------------------- "<<std::endl;
324 std::cout <<
GridLogMessage <<
"------------------------- "<<std::endl;
325 for (
int level = 0; level <
as.size(); ++level) {
326 for (
int actionID = 0; actionID <
as[level].actions.size(); ++actionID) {
328 <<
as[level].actions.at(actionID)->action_name()
329 <<
"["<<level<<
"]["<< actionID<<
"] :\n\t\t "
330 <<
" force max " <<
as[level].actions.at(actionID)->deriv_max_average()
331 <<
" norm " <<
as[level].actions.at(actionID)->deriv_norm_average()
332 <<
" Fdt max " <<
as[level].actions.at(actionID)->Fdt_max_average()
333 <<
" Fdt norm " <<
as[level].actions.at(actionID)->Fdt_norm_average()
334 <<
" calls " <<
as[level].actions.at(actionID)->deriv_num
339 <<
LevelForces[level].actions.at(actionID)->action_name()
340 <<
"["<<level<<
"]["<< actionID<<
"] :\n\t\t "
341 <<
" force max " <<
LevelForces[level].actions.at(actionID)->deriv_max_average()
342 <<
" norm " <<
LevelForces[level].actions.at(actionID)->deriv_norm_average()
343 <<
" Fdt max " <<
LevelForces[level].actions.at(actionID)->Fdt_max_average()
344 <<
" Fdt norm " <<
LevelForces[level].actions.at(actionID)->Fdt_norm_average()
345 <<
" calls " <<
LevelForces[level].actions.at(actionID)->deriv_num
348 std::cout <<
GridLogMessage <<
":::::::::::::::::::::::::::::::::::::::::"<< std::endl;
354 Params.print_parameters();
359 std::cout <<
GridLogMessage <<
":::::::::::::::::::::::::::::::::::::::::" << std::endl;
360 std::cout <<
GridLogMessage <<
"[Integrator] Action summary: "<<std::endl;
361 for (
int level = 0; level <
as.size(); ++level) {
362 std::cout <<
GridLogMessage <<
"[Integrator] ---- Level: "<< level << std::endl;
363 for (
int actionID = 0; actionID <
as[level].actions.size(); ++actionID) {
364 std::cout <<
GridLogMessage <<
"["<<
as[level].actions.at(actionID)->action_name() <<
"] ID: " << actionID << std::endl;
365 std::cout <<
as[level].actions.at(actionID)->LogParameters();
368 std::cout <<
" [Integrator] Total Force loggers: "<<
LevelForces.size() <<std::endl;
369 for (
int level = 0; level <
LevelForces.size(); ++level) {
370 std::cout <<
GridLogMessage <<
"[Integrator] ---- Level: "<< level << std::endl;
371 for (
int actionID = 0; actionID <
LevelForces[level].actions.size(); ++actionID) {
372 std::cout <<
GridLogMessage <<
"["<<
LevelForces[level].actions.at(actionID)->action_name() <<
"] ID: " << actionID << std::endl;
375 std::cout <<
GridLogMessage <<
":::::::::::::::::::::::::::::::::::::::::"<< std::endl;
386 template <
class FieldType,
class Repr>
388 for (
int a = 0; a < repr_set.size(); ++a){
389 repr_set.at(a)->refresh(Rep.U, sRNG, pRNG);
391 std::cout <<
GridLogDebug <<
"Hirep refreshing pseudofermions" << std::endl;
399 assert(
P.Grid() ==
U.Grid());
403 FieldImplementation::generate_momenta(
P, sRNG, pRNG);
418 for (
int level = 0; level <
as.size(); ++level) {
419 for (
int actionID = 0; actionID <
as[level].actions.size(); ++actionID) {
422 auto name =
as[level].actions.at(actionID)->action_name();
423 std::cout <<
GridLogMessage <<
"refresh [" << level <<
"][" << actionID <<
"] "<<name << std::endl;
425 as[level].actions.at(actionID)->refresh_timer_start();
426 as[level].actions.at(actionID)->refresh(
Smearer, sRNG, pRNG);
427 as[level].actions.at(actionID)->refresh_timer_stop();
440 template <
class FieldType,
class Repr>
443 for (
int a = 0; a < repr_set.size(); ++a) {
444 RealD Hterm = repr_set.at(a)->S(Rep.U);
445 std::cout <<
GridLogMessage <<
"S Level " << level <<
" term " << a <<
" H Hirep = " << Hterm << std::endl;
464 for (
int level = 0; level <
as.size(); ++level) {
465 for (
int actionID = 0; actionID <
as[level].actions.size(); ++actionID) {
469 std::cout <<
GridLogMessage <<
"S [" << level <<
"][" << actionID <<
"] action eval " << std::endl;
470 as[level].actions.at(actionID)->S_timer_start();
471 Hterm =
as[level].actions.at(actionID)->S(
Smearer);
472 as[level].actions.at(actionID)->S_timer_stop();
473 std::cout <<
GridLogMessage <<
"S [" << level <<
"][" << actionID <<
"] H = " << Hterm << std::endl;
484 template <
class FieldType,
class Repr>
487 for (
int a = 0; a < repr_set.size(); ++a) {
489 RealD Hterm = repr_set.at(a)->Sinitial(Rep.U);
491 std::cout <<
GridLogMessage <<
"Sinitial Level " << level <<
" term " << a <<
" H Hirep = " << Hterm << std::endl;
508 for (
int level = 0; level <
as.size(); ++level) {
509 for (
int actionID = 0; actionID <
as[level].actions.size(); ++actionID) {
512 std::cout <<
GridLogMessage <<
"S [" << level <<
"][" << actionID <<
"] action eval " << std::endl;
514 as[level].actions.at(actionID)->S_timer_start();
515 Hterm =
as[level].actions.at(actionID)->S(
Smearer);
516 as[level].actions.at(actionID)->S_timer_stop();
518 std::cout <<
GridLogMessage <<
"S [" << level <<
"][" << actionID <<
"] H = " << Hterm << std::endl;
532 for (
int level = 0; level <
as.size(); ++level) {
536 for (
int stp = 0; stp <
Params.MDsteps; ++stp) {
537 int first_step = (stp == 0);
538 int last_step = (stp ==
Params.MDsteps - 1);
539 this->
step(U, 0, first_step, last_step);
543 for (
int level = 0; level <
as.size(); ++level) {
544 assert(fabs(
t_U -
t_P[level]) < 1.0e-6);
548 FieldImplementation::Project(
U);
551 assert(fabs(
t_U -
Params.trajL) < 1.0e-6);
std::vector< ActionLevel< GaugeField, R > > ActionSet
#define HMC_MOMENTUM_DENOMINATOR
RealD maxLocalNorm2(const Lattice< vobj > &arg)
RealD norm2(const Lattice< vobj > &arg)
GridLogger GridLogDebug(1, "Debug", GridLogColours, "PURPLE")
GridLogger GridLogIntegrator(1, "Integrator", GridLogColours, "BLUE")
GridLogger GridLogMessage(1, "Message", GridLogColours, "NORMAL")
#define NAMESPACE_BEGIN(A)
void DslashGetCounts(uint64_t &dirichlet, uint64_t &partial, uint64_t &full)
static INTERNAL_PRECISION U
Base class for all actions.
A trivial action, which may be used as a placeholder.
GRID_SERIALIZABLE_CLASS_MEMBERS(IntegratorParameters, std::string, name, unsigned int, MDsteps, RealD, trajL) IntegratorParameters(int MDsteps_
IntegratorParameters(ReaderClass &Reader)
void print_parameters() const
MomentumFilterBase< MomentaField > const * MomFilter
void refresh(Field &U, GridSerialRNG &sRNG, GridParallelRNG &pRNG)
virtual void step(Field &U, int level, int first, int last)=0
RepresentationsPolicy Representations
virtual std::string integrator_name()=0
FieldImplementation::Field MomentaField
FieldImplementation::Field Field
const ActionSet< Field, RepresentationsPolicy > as
IntegratorParameters Params
struct Integrator::_S S_hireps
void update_P(MomentaField &Mom, Field &U, int level, double ep)
struct Integrator::_updateP update_P_hireps
ActionSet< Field, RepresentationsPolicy > LevelForces
Implementation FieldImplementation
const MomentaField & getMomentum() const
struct Integrator::_refresh refresh_hireps
Integrator(GridBase *grid, IntegratorParameters Par, ActionSet< Field, RepresentationPolicy > &Aset, SmearingPolicy &Sm)
static MomentumFilterBase< MomentaField > const * getDefaultMomFilter()
std::vector< double > t_P
void setMomentumFilter(const MomentumFilterBase< MomentaField > &filter)
struct Integrator::_Sinitial Sinitial_hireps
void update_U(Field &U, double ep)
void update_P(Field &U, int level, double ep)
void update_U(MomentaField &Mom, Field &U, double ep)
void push_back(Action< GenField > *ptr)
void operator()(std::vector< Action< FieldType > * > repr_set, Repr &Rep, int level, RealD &H)
void operator()(std::vector< Action< FieldType > * > repr_set, Repr &Rep, int level, RealD &H)
void operator()(std::vector< Action< FieldType > * > repr_set, Repr &Rep, GridSerialRNG &sRNG, GridParallelRNG &pRNG)
void operator()(std::vector< Action< FieldType > * > repr_set, Repr &Rep, GF &Mom, GF &U, double ep)