mirror of
				https://github.com/paboyle/Grid.git
				synced 2025-10-31 12:04:33 +00:00 
			
		
		
		
	HMC running with new formulation
This commit is contained in:
		| @@ -40,6 +40,29 @@ class Action | ||||
|  | ||||
| public: | ||||
|   bool is_smeared = false; | ||||
|   RealD deriv_norm_sum; | ||||
|   RealD deriv_max_sum; | ||||
|   int   deriv_num; | ||||
|   RealD deriv_us; | ||||
|   RealD S_us; | ||||
|   RealD refresh_us; | ||||
|   void  reset_timer(void)        { | ||||
|     deriv_us = S_us = refresh_us = 0.0; | ||||
|     deriv_num=0; | ||||
|     deriv_norm_sum = deriv_max_sum=0.0; | ||||
|   } | ||||
|   void  deriv_log(RealD nrm, RealD max) { deriv_max_sum+=max; deriv_norm_sum+=nrm; deriv_num++;} | ||||
|   RealD deriv_max_average(void)         { return deriv_max_sum/deriv_num; }; | ||||
|   RealD deriv_norm_average(void)        { return deriv_norm_sum/deriv_num; }; | ||||
|   RealD deriv_timer(void)        { return deriv_us; }; | ||||
|   RealD S_timer(void)            { return deriv_us; }; | ||||
|   RealD refresh_timer(void)      { return deriv_us; }; | ||||
|   void deriv_timer_start(void)   { deriv_us-=usecond(); } | ||||
|   void deriv_timer_stop(void)    { deriv_us+=usecond(); } | ||||
|   void refresh_timer_start(void) { refresh_us-=usecond(); } | ||||
|   void refresh_timer_stop(void)  { refresh_us+=usecond(); } | ||||
|   void S_timer_start(void)       { S_us-=usecond(); } | ||||
|   void S_timer_stop(void)        { S_us+=usecond(); } | ||||
|   // Heatbath? | ||||
|   virtual void refresh(const GaugeField& U, GridSerialRNG &sRNG, GridParallelRNG& pRNG) = 0; // refresh pseudofermions | ||||
|   virtual RealD S(const GaugeField& U) = 0;                             // evaluate the action | ||||
|   | ||||
| @@ -39,6 +39,7 @@ NAMESPACE_CHECK(ActionParams); | ||||
|  | ||||
| #include <Grid/qcd/action/filters/MomentumFilter.h> | ||||
| #include <Grid/qcd/action/filters/DirichletFilter.h> | ||||
| #include <Grid/qcd/action/filters/DDHMCFilter.h> | ||||
|  | ||||
| //////////////////////////////////////////// | ||||
| // Gauge Actions | ||||
|   | ||||
| @@ -129,18 +129,10 @@ public: | ||||
|     Runner(S); | ||||
|   } | ||||
|  | ||||
|   ////////////////////////////////////////////////////////////////// | ||||
|  | ||||
| private: | ||||
|   template <class SmearingPolicy> | ||||
|   void Runner(SmearingPolicy &Smearing) { | ||||
|     auto UGrid = Resources.GetCartesian(); | ||||
|     Resources.AddRNGs(); | ||||
|     Field U(UGrid); | ||||
|  | ||||
|     // Can move this outside? | ||||
|     typedef IntegratorType<SmearingPolicy> TheIntegrator; | ||||
|     TheIntegrator MDynamics(UGrid, Parameters.MD, TheAction, Smearing); | ||||
|   //Use the checkpointer to initialize the RNGs and the gauge field, writing the resulting gauge field into U. | ||||
|   //This is called automatically by Run but may be useful elsewhere, e.g. for integrator tuning experiments | ||||
|   void initializeGaugeFieldAndRNGs(Field &U){ | ||||
|     if(!Resources.haveRNGs()) Resources.AddRNGs(); | ||||
|  | ||||
|     if (Parameters.StartingType == "HotStart") { | ||||
|       // Hot start | ||||
| @@ -167,6 +159,25 @@ private: | ||||
| 	<< "Valid [HotStart, ColdStart, TepidStart, CheckpointStart]\n"; | ||||
|       exit(1); | ||||
|     } | ||||
|   } | ||||
|  | ||||
|  | ||||
|  | ||||
|   ////////////////////////////////////////////////////////////////// | ||||
|  | ||||
| private: | ||||
|   template <class SmearingPolicy> | ||||
|   void Runner(SmearingPolicy &Smearing) { | ||||
|     auto UGrid = Resources.GetCartesian(); | ||||
|     Field U(UGrid); | ||||
|  | ||||
|     initializeGaugeFieldAndRNGs(U); | ||||
|  | ||||
|     typedef IntegratorType<SmearingPolicy> TheIntegrator; | ||||
|     TheIntegrator MDynamics(UGrid, Parameters.MD, TheAction, Smearing); | ||||
|  | ||||
|     // Sets the momentum filter | ||||
|     MDynamics.setMomentumFilter(*(Resources.GetMomentumFilter())); | ||||
|  | ||||
|     Smearing.set_Field(U); | ||||
|  | ||||
|   | ||||
| @@ -34,6 +34,7 @@ directory | ||||
| 			    * @brief Classes for Hybrid Monte Carlo update | ||||
| 			    * | ||||
| 			    * @author Guido Cossu | ||||
| 			    * @author Peter Boyle | ||||
| 			    */ | ||||
| 			   //-------------------------------------------------------------------- | ||||
| #pragma once | ||||
| @@ -115,22 +116,17 @@ private: | ||||
|  | ||||
|     random(sRNG, rn_test); | ||||
|  | ||||
|     std::cout << GridLogMessage | ||||
|               << "--------------------------------------------------\n"; | ||||
|     std::cout << GridLogMessage << "exp(-dH) = " << prob | ||||
|               << "  Random = " << rn_test << "\n"; | ||||
|     std::cout << GridLogMessage | ||||
|               << "Acc. Probability = " << ((prob < 1.0) ? prob : 1.0) << "\n"; | ||||
|     std::cout << GridLogHMC << "--------------------------------------------------\n"; | ||||
|     std::cout << GridLogHMC << "exp(-dH) = " << prob << "  Random = " << rn_test << "\n"; | ||||
|     std::cout << GridLogHMC << "Acc. Probability = " << ((prob < 1.0) ? prob : 1.0) << "\n"; | ||||
|  | ||||
|     if ((prob > 1.0) || (rn_test <= prob)) {  // accepted | ||||
|       std::cout << GridLogMessage << "Metropolis_test -- ACCEPTED\n"; | ||||
|       std::cout << GridLogMessage | ||||
|                 << "--------------------------------------------------\n"; | ||||
|       std::cout << GridLogHMC << "Metropolis_test -- ACCEPTED\n"; | ||||
|       std::cout << GridLogHMC << "--------------------------------------------------\n"; | ||||
|       return true; | ||||
|     } else {  // rejected | ||||
|       std::cout << GridLogMessage << "Metropolis_test -- REJECTED\n"; | ||||
|       std::cout << GridLogMessage | ||||
|                 << "--------------------------------------------------\n"; | ||||
|       std::cout << GridLogHMC << "Metropolis_test -- REJECTED\n"; | ||||
|       std::cout << GridLogHMC << "--------------------------------------------------\n"; | ||||
|       return false; | ||||
|     } | ||||
|   } | ||||
| @@ -139,19 +135,68 @@ private: | ||||
|   // Evolution | ||||
|   ///////////////////////////////////////////////////////// | ||||
|   RealD evolve_hmc_step(Field &U) { | ||||
|     TheIntegrator.refresh(U, sRNG, pRNG);  // set U and initialize P and phi's | ||||
|  | ||||
|     RealD H0 = TheIntegrator.S(U);  // initial state action | ||||
|     GridBase *Grid = U.Grid(); | ||||
|  | ||||
|     ////////////////////////////////////////////////////////////////////////////////////////////////////// | ||||
|     // Mainly for DDHMC perform a random translation of U modulo volume | ||||
|     ////////////////////////////////////////////////////////////////////////////////////////////////////// | ||||
|     std::cout << GridLogMessage << "--------------------------------------------------\n"; | ||||
|     std::cout << GridLogMessage << "Random shifting gauge field by ["; | ||||
|     for(int d=0;d<Grid->Nd();d++) { | ||||
|  | ||||
|       int L = Grid->GlobalDimensions()[d]; | ||||
|  | ||||
|       RealD rn_uniform;  random(sRNG, rn_uniform); | ||||
|  | ||||
|       int shift = (int) (rn_uniform*L); | ||||
|  | ||||
|       std::cout << shift; | ||||
|       if(d<Grid->Nd()-1) std::cout <<","; | ||||
|       else               std::cout <<"]\n"; | ||||
|        | ||||
|       U = Cshift(U,d,shift); | ||||
|     } | ||||
|     std::cout << GridLogMessage << "--------------------------------------------------\n"; | ||||
|  | ||||
|     TheIntegrator.reset_timer(); | ||||
|      | ||||
|     ////////////////////////////////////////////////////////////////////////////////////////////////////// | ||||
|     // set U and initialize P and phi's | ||||
|     ////////////////////////////////////////////////////////////////////////////////////////////////////// | ||||
|     std::cout << GridLogMessage << "--------------------------------------------------\n"; | ||||
|     std::cout << GridLogMessage << "Refresh momenta and pseudofermions"; | ||||
|     TheIntegrator.refresh(U, sRNG, pRNG);   | ||||
|     std::cout << GridLogMessage << "--------------------------------------------------\n"; | ||||
|  | ||||
|     ////////////////////////////////////////////////////////////////////////////////////////////////////// | ||||
|     // initial state action | ||||
|     ////////////////////////////////////////////////////////////////////////////////////////////////////// | ||||
|     std::cout << GridLogMessage << "--------------------------------------------------\n"; | ||||
|     std::cout << GridLogMessage << "Compute initial action"; | ||||
|     RealD H0 = TheIntegrator.S(U);   | ||||
|     std::cout << GridLogMessage << "--------------------------------------------------\n"; | ||||
|  | ||||
|     std::streamsize current_precision = std::cout.precision(); | ||||
|     std::cout.precision(15); | ||||
|     std::cout << GridLogMessage << "Total H before trajectory = " << H0 << "\n"; | ||||
|     std::cout << GridLogHMC << "Total H before trajectory = " << H0 << "\n"; | ||||
|     std::cout.precision(current_precision); | ||||
|  | ||||
|     std::cout << GridLogMessage << "--------------------------------------------------\n"; | ||||
|     std::cout << GridLogMessage << " Molecular Dynamics evolution "; | ||||
|     TheIntegrator.integrate(U); | ||||
|     std::cout << GridLogMessage << "--------------------------------------------------\n"; | ||||
|  | ||||
|     RealD H1 = TheIntegrator.S(U);  // updated state action | ||||
|     ////////////////////////////////////////////////////////////////////////////////////////////////////// | ||||
|     // updated state action | ||||
|     ////////////////////////////////////////////////////////////////////////////////////////////////////// | ||||
|     std::cout << GridLogMessage << "--------------------------------------------------\n"; | ||||
|     std::cout << GridLogMessage << "Compute final action"; | ||||
|     RealD H1 = TheIntegrator.S(U);   | ||||
|     std::cout << GridLogMessage << "--------------------------------------------------\n"; | ||||
|  | ||||
|  | ||||
|      | ||||
|     /////////////////////////////////////////////////////////// | ||||
|     if(0){ | ||||
|       std::cout << "------------------------- Reversibility test" << std::endl; | ||||
| @@ -163,17 +208,16 @@ private: | ||||
|     } | ||||
|     /////////////////////////////////////////////////////////// | ||||
|  | ||||
|  | ||||
|     std::cout.precision(15); | ||||
|     std::cout << GridLogMessage << "Total H after trajectory  = " << H1 | ||||
| 	      << "  dH = " << H1 - H0 << "\n"; | ||||
|  | ||||
|     std::cout << GridLogHMC << "--------------------------------------------------\n"; | ||||
|     std::cout << GridLogHMC << "Total H after trajectory  = " << H1 << "  dH = " << H1 - H0 << "\n"; | ||||
|     std::cout << GridLogHMC << "--------------------------------------------------\n"; | ||||
|  | ||||
|     std::cout.precision(current_precision); | ||||
|      | ||||
|     return (H1 - H0); | ||||
|   } | ||||
|    | ||||
|  | ||||
|    | ||||
|  | ||||
| public: | ||||
|   ///////////////////////////////////////// | ||||
| @@ -195,10 +239,13 @@ public: | ||||
|  | ||||
|     // Actual updates (evolve a copy Ucopy then copy back eventually) | ||||
|     unsigned int FinalTrajectory = Params.Trajectories + Params.NoMetropolisUntil + Params.StartTrajectory; | ||||
|  | ||||
|     for (int traj = Params.StartTrajectory; traj < FinalTrajectory; ++traj) { | ||||
|       std::cout << GridLogMessage << "-- # Trajectory = " << traj << "\n"; | ||||
|  | ||||
|       std::cout << GridLogHMC << "-- # Trajectory = " << traj << "\n"; | ||||
|  | ||||
|       if (traj < Params.StartTrajectory + Params.NoMetropolisUntil) { | ||||
|       	std::cout << GridLogMessage << "-- Thermalization" << std::endl; | ||||
|       	std::cout << GridLogHMC << "-- Thermalization" << std::endl; | ||||
|       } | ||||
|        | ||||
|       double t0=usecond(); | ||||
| @@ -207,20 +254,19 @@ public: | ||||
|       DeltaH = evolve_hmc_step(Ucopy); | ||||
|       // Metropolis-Hastings test | ||||
|       bool accept = true; | ||||
|       if (traj >= Params.StartTrajectory + Params.NoMetropolisUntil) { | ||||
|       if (Params.MetropolisTest && traj >= Params.StartTrajectory + Params.NoMetropolisUntil) { | ||||
|         accept = metropolis_test(DeltaH); | ||||
|       } else { | ||||
|       	std::cout << GridLogMessage << "Skipping Metropolis test" << std::endl; | ||||
|       	std::cout << GridLogHMC << "Skipping Metropolis test" << std::endl; | ||||
|       } | ||||
|  | ||||
|       if (accept) | ||||
|         Ucur = Ucopy;  | ||||
|        | ||||
|       | ||||
|        | ||||
|       double t1=usecond(); | ||||
|       std::cout << GridLogMessage << "Total time for trajectory (s): " << (t1-t0)/1e6 << std::endl; | ||||
|       std::cout << GridLogHMC << "Total time for trajectory (s): " << (t1-t0)/1e6 << std::endl; | ||||
|  | ||||
|       TheIntegrator.print_timer(); | ||||
|  | ||||
|       for (int obs = 0; obs < Observables.size(); obs++) { | ||||
|       	std::cout << GridLogDebug << "Observables # " << obs << std::endl; | ||||
| @@ -228,7 +274,7 @@ public: | ||||
|       	std::cout << GridLogDebug << "Observables pointer " << Observables[obs] << std::endl; | ||||
|         Observables[obs]->TrajectoryComplete(traj + 1, Ucur, sRNG, pRNG); | ||||
|       } | ||||
|       std::cout << GridLogMessage << ":::::::::::::::::::::::::::::::::::::::::::" << std::endl; | ||||
|       std::cout << GridLogHMC << ":::::::::::::::::::::::::::::::::::::::::::" << std::endl; | ||||
|     } | ||||
|   } | ||||
|  | ||||
|   | ||||
| @@ -72,6 +72,8 @@ class HMCResourceManager { | ||||
|   typedef HMCModuleBase< BaseHmcCheckpointer<ImplementationPolicy> > CheckpointerBaseModule; | ||||
|   typedef HMCModuleBase< HmcObservable<typename ImplementationPolicy::Field> > ObservableBaseModule; | ||||
|   typedef ActionModuleBase< Action<typename ImplementationPolicy::Field>, GridModule > ActionBaseModule; | ||||
|   typedef typename ImplementationPolicy::Field MomentaField; | ||||
|   typedef typename ImplementationPolicy::Field Field;   | ||||
|  | ||||
|   // Named storage for grid pairs (std + red-black) | ||||
|   std::unordered_map<std::string, GridModule> Grids; | ||||
| @@ -80,6 +82,9 @@ class HMCResourceManager { | ||||
|   // SmearingModule<ImplementationPolicy> Smearing; | ||||
|   std::unique_ptr<CheckpointerBaseModule> CP; | ||||
|  | ||||
|   // Momentum filter | ||||
|   std::unique_ptr<MomentumFilterBase<typename ImplementationPolicy::Field> > Filter; | ||||
|    | ||||
|   // A vector of HmcObservable modules | ||||
|   std::vector<std::unique_ptr<ObservableBaseModule> > ObservablesList; | ||||
|  | ||||
| @@ -90,6 +95,7 @@ class HMCResourceManager { | ||||
|  | ||||
|   bool have_RNG; | ||||
|   bool have_CheckPointer; | ||||
|   bool have_Filter; | ||||
|  | ||||
|   // NOTE: operator << is not overloaded for std::vector<string>  | ||||
|   // so this function is necessary | ||||
| @@ -101,7 +107,7 @@ class HMCResourceManager { | ||||
|  | ||||
|  | ||||
| public: | ||||
|   HMCResourceManager() : have_RNG(false), have_CheckPointer(false) {} | ||||
|   HMCResourceManager() : have_RNG(false), have_CheckPointer(false), have_Filter(false) {} | ||||
|  | ||||
|   template <class ReaderClass, class vector_type = vComplex > | ||||
|   void initialize(ReaderClass &Read){ | ||||
| @@ -129,6 +135,7 @@ public: | ||||
|     RNGModuleParameters RNGpar(Read); | ||||
|     SetRNGSeeds(RNGpar); | ||||
|  | ||||
|    | ||||
|     // Observables | ||||
|     auto &ObsFactory = HMC_ObservablesModuleFactory<observable_string, typename ImplementationPolicy::Field, ReaderClass>::getInstance();  | ||||
|     Read.push(observable_string);// here must check if existing... | ||||
| @@ -208,6 +215,16 @@ public: | ||||
|     AddGrid(s, Mod); | ||||
|   } | ||||
|  | ||||
|   void SetMomentumFilter( MomentumFilterBase<typename ImplementationPolicy::Field> * MomFilter) { | ||||
|     assert(have_Filter==false); | ||||
|     Filter = std::unique_ptr<MomentumFilterBase<typename ImplementationPolicy::Field> >(MomFilter); | ||||
|     have_Filter = true; | ||||
|   } | ||||
|   MomentumFilterBase<typename ImplementationPolicy::Field> *GetMomentumFilter(void) { | ||||
|     if ( !have_Filter) | ||||
|       SetMomentumFilter(new MomentumFilterNone<typename ImplementationPolicy::Field>()); | ||||
|     return Filter.get(); | ||||
|   } | ||||
|  | ||||
|   GridCartesian* GetCartesian(std::string s = "") { | ||||
|     if (s.empty()) s = Grids.begin()->first; | ||||
| @@ -226,6 +243,9 @@ public: | ||||
|   ////////////////////////////////////////////////////// | ||||
|   // Random number generators | ||||
|   ////////////////////////////////////////////////////// | ||||
|    | ||||
|   //Return true if the RNG objects have been instantiated | ||||
|   bool haveRNGs() const{ return have_RNG; } | ||||
|  | ||||
|   void AddRNGs(std::string s = "") { | ||||
|     // Couple the RNGs to the GridModule tagged by s | ||||
|   | ||||
| @@ -66,6 +66,7 @@ public: | ||||
| template <class FieldImplementation, class SmearingPolicy, class RepresentationPolicy> | ||||
| class Integrator { | ||||
| protected: | ||||
|  | ||||
|   typedef typename FieldImplementation::Field MomentaField;  //for readability | ||||
|   typedef typename FieldImplementation::Field Field; | ||||
|  | ||||
| @@ -118,36 +119,58 @@ protected: | ||||
|     } | ||||
|   } update_P_hireps{}; | ||||
|  | ||||
|   | ||||
|   void update_P(MomentaField& Mom, Field& U, int level, double ep) { | ||||
|     // input U actually not used in the fundamental case | ||||
|     // Fundamental updates, include smearing | ||||
|  | ||||
|     for (int a = 0; a < as[level].actions.size(); ++a) { | ||||
|  | ||||
|       double start_full = usecond(); | ||||
|       Field force(U.Grid()); | ||||
|       conformable(U.Grid(), Mom.Grid()); | ||||
|  | ||||
|       Field& Us = Smearer.get_U(as[level].actions.at(a)->is_smeared); | ||||
|       double start_force = usecond(); | ||||
|       as[level].actions.at(a)->deriv_timer_start(); | ||||
|       as[level].actions.at(a)->deriv(Us, force);  // deriv should NOT include Ta | ||||
|       as[level].actions.at(a)->deriv_timer_stop(); | ||||
|  | ||||
|       std::cout << GridLogIntegrator << "Smearing (on/off): " << as[level].actions.at(a)->is_smeared << std::endl; | ||||
|       auto name = as[level].actions.at(a)->action_name(); | ||||
|       if (as[level].actions.at(a)->is_smeared) Smearer.smeared_force(force); | ||||
|  | ||||
|       force = FieldImplementation::projectForce(force); // Ta for gauge fields | ||||
|       double end_force = usecond(); | ||||
|       Real force_abs = std::sqrt(norm2(force)/U.Grid()->gSites()); | ||||
|       std::cout << GridLogIntegrator << "["<<level<<"]["<<a<<"] Force average: " << force_abs << std::endl; | ||||
|  | ||||
|       MomFilter->applyFilter(force); | ||||
|       std::cout << GridLogIntegrator << " update_P : Level [" << level <<"]["<<a <<"] "<<name<< std::endl; | ||||
|       DumpSliceNorm("force ",force,Nd-1); | ||||
|        | ||||
|       Real force_abs   = std::sqrt(norm2(force)/U.Grid()->gSites()); //average per-site norm.  nb. norm2(latt) = \sum_x norm2(latt[x])  | ||||
|       Real impulse_abs = force_abs * ep * HMC_MOMENTUM_DENOMINATOR;     | ||||
|  | ||||
|       Real force_max   = std::sqrt(maxLocalNorm2(force)); | ||||
|       Real impulse_max = force_max * ep * HMC_MOMENTUM_DENOMINATOR;     | ||||
|  | ||||
|       as[level].actions.at(a)->deriv_log(force_abs,force_max); | ||||
|        | ||||
|       std::cout << GridLogIntegrator<< "["<<level<<"]["<<a<<"] Force average: " << force_abs <<" "<<name<<std::endl; | ||||
|       std::cout << GridLogIntegrator<< "["<<level<<"]["<<a<<"] Force max    : " << force_max <<" "<<name<<std::endl; | ||||
|       std::cout << GridLogIntegrator<< "["<<level<<"]["<<a<<"] Fdt average  : " << impulse_abs <<" "<<name<<std::endl; | ||||
|       std::cout << GridLogIntegrator<< "["<<level<<"]["<<a<<"] Fdt max      : " << impulse_max <<" "<<name<<std::endl; | ||||
|  | ||||
|       Mom -= force * ep* HMC_MOMENTUM_DENOMINATOR;;  | ||||
|       double end_full = usecond(); | ||||
|       double time_full  = (end_full - start_full) / 1e3; | ||||
|       double time_force = (end_force - start_force) / 1e3; | ||||
|       std::cout << GridLogMessage << "["<<level<<"]["<<a<<"] P update elapsed time: " << time_full << " ms (force: " << time_force << " ms)"  << std::endl; | ||||
|  | ||||
|     } | ||||
|  | ||||
|     // Force from the other representations | ||||
|     as[level].apply(update_P_hireps, Representations, Mom, U, ep); | ||||
|  | ||||
|     MomFilter->applyFilter(Mom); | ||||
|   } | ||||
|  | ||||
|   void update_U(Field& U, double ep)  | ||||
| @@ -161,8 +184,12 @@ protected: | ||||
|    | ||||
|   void update_U(MomentaField& Mom, Field& U, double ep)  | ||||
|   { | ||||
|     MomentaField MomFiltered(Mom.Grid()); | ||||
|     MomFiltered = Mom; | ||||
|     MomFilter->applyFilter(MomFiltered); | ||||
|  | ||||
|     // exponential of Mom*U in the gauge fields case | ||||
|     FieldImplementation::update_field(Mom, U, ep); | ||||
|     FieldImplementation::update_field(MomFiltered, U, ep); | ||||
|  | ||||
|     // Update the smeared fields, can be implemented as observer | ||||
|     Smearer.set_Field(U); | ||||
| @@ -205,6 +232,66 @@ public: | ||||
|   const MomentaField & getMomentum() const{ return P; } | ||||
|    | ||||
|  | ||||
|   void reset_timer(void) | ||||
|   { | ||||
|     for (int level = 0; level < as.size(); ++level) { | ||||
|       for (int actionID = 0; actionID < as[level].actions.size(); ++actionID) { | ||||
|         as[level].actions.at(actionID)->reset_timer(); | ||||
|       } | ||||
|     } | ||||
|   } | ||||
|   void print_timer(void) | ||||
|   { | ||||
|     std::cout << GridLogMessage << ":::::::::::::::::::::::::::::::::::::::::" << std::endl; | ||||
|     std::cout << GridLogMessage << " Refresh cumulative timings "<<std::endl; | ||||
|     std::cout << GridLogMessage << "--------------------------- "<<std::endl; | ||||
|     for (int level = 0; level < as.size(); ++level) { | ||||
|       for (int actionID = 0; actionID < as[level].actions.size(); ++actionID) { | ||||
| 	std::cout << GridLogMessage  | ||||
| 		  << as[level].actions.at(actionID)->action_name() | ||||
| 		  <<"["<<level<<"]["<< actionID<<"] " | ||||
| 		  << as[level].actions.at(actionID)->refresh_us*1.0e-6<<" s"<< std::endl; | ||||
|       } | ||||
|     } | ||||
|     std::cout << GridLogMessage << "--------------------------- "<<std::endl; | ||||
|     std::cout << GridLogMessage << " Action cumulative timings "<<std::endl; | ||||
|     std::cout << GridLogMessage << "--------------------------- "<<std::endl; | ||||
|     for (int level = 0; level < as.size(); ++level) { | ||||
|       for (int actionID = 0; actionID < as[level].actions.size(); ++actionID) { | ||||
| 	std::cout << GridLogMessage  | ||||
| 		  << as[level].actions.at(actionID)->action_name() | ||||
| 		  <<"["<<level<<"]["<< actionID<<"] " | ||||
| 		  << as[level].actions.at(actionID)->S_us*1.0e-6<<" s"<< std::endl; | ||||
|       } | ||||
|     } | ||||
|     std::cout << GridLogMessage << "--------------------------- "<<std::endl; | ||||
|     std::cout << GridLogMessage << " Force cumulative timings "<<std::endl; | ||||
|     std::cout << GridLogMessage << "------------------------- "<<std::endl; | ||||
|     for (int level = 0; level < as.size(); ++level) { | ||||
|       for (int actionID = 0; actionID < as[level].actions.size(); ++actionID) { | ||||
| 	std::cout << GridLogMessage  | ||||
| 		  << as[level].actions.at(actionID)->action_name() | ||||
| 		  <<"["<<level<<"]["<< actionID<<"] " | ||||
| 		  << as[level].actions.at(actionID)->deriv_us*1.0e-6<<" s"<< std::endl; | ||||
|       } | ||||
|     } | ||||
|     std::cout << GridLogMessage << "--------------------------- "<<std::endl; | ||||
|     std::cout << GridLogMessage << " Force average size "<<std::endl; | ||||
|     std::cout << GridLogMessage << "------------------------- "<<std::endl; | ||||
|     for (int level = 0; level < as.size(); ++level) { | ||||
|       for (int actionID = 0; actionID < as[level].actions.size(); ++actionID) { | ||||
| 	std::cout << GridLogMessage  | ||||
| 		  << as[level].actions.at(actionID)->action_name() | ||||
| 		  <<"["<<level<<"]["<< actionID<<"] : " | ||||
| 		  <<" force max " << as[level].actions.at(actionID)->deriv_max_average() | ||||
| 		  <<" norm "      << as[level].actions.at(actionID)->deriv_norm_average() | ||||
| 		  <<" calls "     << as[level].actions.at(actionID)->deriv_num | ||||
| 		  << std::endl; | ||||
|       } | ||||
|     } | ||||
|     std::cout << GridLogMessage << ":::::::::::::::::::::::::::::::::::::::::"<< std::endl; | ||||
|   } | ||||
|    | ||||
|   void print_parameters() | ||||
|   { | ||||
|     std::cout << GridLogMessage << "[Integrator] Name : "<< integrator_name() << std::endl; | ||||
| @@ -223,7 +310,6 @@ public: | ||||
|       } | ||||
|     } | ||||
|     std::cout << GridLogMessage << ":::::::::::::::::::::::::::::::::::::::::"<< std::endl; | ||||
|  | ||||
|   } | ||||
|  | ||||
|   void reverse_momenta() | ||||
| @@ -266,15 +352,19 @@ public: | ||||
|       for (int actionID = 0; actionID < as[level].actions.size(); ++actionID) { | ||||
|         // get gauge field from the SmearingPolicy and | ||||
|         // based on the boolean is_smeared in actionID | ||||
| 	auto name = as[level].actions.at(actionID)->action_name(); | ||||
|         std::cout << GridLogMessage << "refresh [" << level << "][" << actionID << "] "<<name << std::endl; | ||||
|  | ||||
|         Field& Us = Smearer.get_U(as[level].actions.at(actionID)->is_smeared); | ||||
| 	as[level].actions.at(actionID)->refresh_timer_start(); | ||||
|         as[level].actions.at(actionID)->refresh(Us, sRNG, pRNG); | ||||
| 	as[level].actions.at(actionID)->refresh_timer_stop(); | ||||
|       } | ||||
|  | ||||
|       // Refresh the higher representation actions | ||||
|       as[level].apply(refresh_hireps, Representations, sRNG, pRNG); | ||||
|     } | ||||
|  | ||||
|     MomFilter->applyFilter(P); | ||||
|   } | ||||
|  | ||||
|   // to be used by the actionlevel class to iterate | ||||
| @@ -309,7 +399,9 @@ public: | ||||
|         // based on the boolean is_smeared in actionID | ||||
|         Field& Us = Smearer.get_U(as[level].actions.at(actionID)->is_smeared); | ||||
|         std::cout << GridLogMessage << "S [" << level << "][" << actionID << "] action eval " << std::endl; | ||||
| 	        as[level].actions.at(actionID)->S_timer_start(); | ||||
|         Hterm = as[level].actions.at(actionID)->S(Us); | ||||
|    	        as[level].actions.at(actionID)->S_timer_stop(); | ||||
|         std::cout << GridLogMessage << "S [" << level << "][" << actionID << "] H = " << Hterm << std::endl; | ||||
|         H += Hterm; | ||||
|       } | ||||
|   | ||||
		Reference in New Issue
	
	Block a user