56 bool, PerformRandomShift,
57 std::string, StartingType,
62 MetropolisTest =
true;
63 NoMetropolisUntil = 10;
66 StartingType =
"HotStart";
67 PerformRandomShift =
true;
71 template <
class ReaderClass >
76 template <
class ReaderClass >
79 read(TheReader,
"HMC", *
this);
84 std::cout <<
GridLogMessage <<
"[HMC parameters] Trajectories : " << Trajectories <<
"\n";
85 std::cout <<
GridLogMessage <<
"[HMC parameters] Start trajectory : " << StartTrajectory <<
"\n";
86 std::cout <<
GridLogMessage <<
"[HMC parameters] Metropolis test (on/off): " << std::boolalpha << MetropolisTest <<
"\n";
87 std::cout <<
GridLogMessage <<
"[HMC parameters] Thermalization trajs : " << NoMetropolisUntil <<
"\n";
88 std::cout <<
GridLogMessage <<
"[HMC parameters] Doing random shift : " << std::boolalpha << PerformRandomShift <<
"\n";
89 std::cout <<
GridLogMessage <<
"[HMC parameters] Starting type : " << StartingType <<
"\n";
90 MD.print_parameters();
95template <
class IntegratorType>
100 typedef typename IntegratorType::Field
Field;
119 RealD prob = std::exp(-DeltaH);
123 std::cout <<
GridLogHMC <<
"--------------------------------------------------\n";
124 std::cout <<
GridLogHMC <<
"exp(-dH) = " << prob <<
" Random = " << rn_test <<
"\n";
125 std::cout <<
GridLogHMC <<
"Acc. Probability = " << ((prob < 1.0) ? prob : 1.0) <<
"\n";
127 if ((prob > 1.0) || (rn_test <= prob)) {
128 std::cout <<
GridLogHMC <<
"Metropolis_test -- ACCEPTED\n";
129 std::cout <<
GridLogHMC <<
"--------------------------------------------------\n";
132 std::cout <<
GridLogHMC <<
"Metropolis_test -- REJECTED\n";
133 std::cout <<
GridLogHMC <<
"--------------------------------------------------\n";
145 if(
Params.PerformRandomShift){
150 std::cout <<
GridLogMessage <<
"--------------------------------------------------\n";
151 std::cout <<
GridLogMessage <<
"Random shifting gauge field by [";
153 std::vector<typename FieldImplementation::GaugeLinkField> Umu(
Grid->Nd(),
U.Grid());
156 for(
int d=0;d<
Grid->Nd();d++) {
158 int L =
Grid->GlobalDimensions()[d];
162 int shift = (int) (rn_uniform*L);
165 if(d<Grid->
Nd()-1) std::cout <<
",";
166 else std::cout <<
"]\n";
169 for(
int mu=0; mu <
Grid->Nd(); mu++)
170 Umu[mu] = FieldImplementation::CshiftLink(Umu[mu],d,shift);
174 std::cout <<
GridLogMessage <<
"--------------------------------------------------\n";
183 std::cout <<
GridLogMessage <<
"--------------------------------------------------\n";
184 std::cout <<
GridLogMessage <<
"Refresh momenta and pseudofermions";
186 std::cout <<
GridLogMessage <<
"--------------------------------------------------\n";
191 std::cout <<
GridLogMessage <<
"--------------------------------------------------\n";
194 std::cout <<
GridLogMessage <<
"--------------------------------------------------\n";
196 std::streamsize current_precision = std::cout.precision();
197 std::cout.precision(15);
198 std::cout <<
GridLogHMC <<
"Total H before trajectory = " << H0 <<
"\n";
199 std::cout.precision(current_precision);
201 std::cout <<
GridLogMessage <<
"--------------------------------------------------\n";
204 std::cout <<
GridLogMessage <<
"--------------------------------------------------\n";
209 std::cout <<
GridLogMessage <<
"--------------------------------------------------\n";
212 std::cout <<
GridLogMessage <<
"--------------------------------------------------\n";
218 std::cout <<
"------------------------- Reversibility test" << std::endl;
223 std::cout <<
"--------------------------------------------" << std::endl;
227 std::cout.precision(15);
229 std::cout <<
GridLogHMC <<
"--------------------------------------------------\n";
230 std::cout <<
GridLogHMC <<
"Total H after trajectory = " << H1 <<
" dH = " << H1 - H0 <<
"\n";
231 std::cout <<
GridLogHMC <<
"--------------------------------------------------\n";
233 std::cout.precision(current_precision);
253 Params.print_parameters();
257 unsigned int FinalTrajectory =
Params.Trajectories +
Params.NoMetropolisUntil +
Params.StartTrajectory;
259 for (
int traj =
Params.StartTrajectory; traj < FinalTrajectory; ++traj) {
261 std::cout <<
GridLogHMC <<
"-- # Trajectory = " << traj <<
"\n";
263 if (traj <
Params.StartTrajectory +
Params.NoMetropolisUntil) {
264 std::cout <<
GridLogHMC <<
"-- Thermalization" << std::endl;
273 if (
Params.MetropolisTest && traj >=
Params.StartTrajectory +
Params.NoMetropolisUntil) {
276 std::cout <<
GridLogHMC <<
"Skipping Metropolis test" << std::endl;
283 std::cout <<
GridLogHMC <<
"Total time for trajectory (s): " << (t1-t0)/1e6 << std::endl;
288 for (
int obs = 0; obs <
Observables.size(); obs++) {
289 std::cout <<
GridLogDebug <<
"Observables # " << obs << std::endl;
294 std::cout <<
GridLogHMC <<
":::::::::::::::::::::::::::::::::::::::::::" << std::endl;
Declaration of classes for the Molecular Dynamics algorithms.
void PokeIndex(Lattice< vobj > &lhs, const Lattice< decltype(peekIndex< Index >(vobj(), 0))> &rhs, int i)
auto PeekIndex(const Lattice< vobj > &lhs, int i) -> Lattice< decltype(peekIndex< Index >(vobj(), i))>
void random(GridParallelRNG &rng, Lattice< vobj > &l)
GridLogger GridLogDebug(1, "Debug", GridLogColours, "PURPLE")
GridLogger GridLogHMC(1, "HMC", GridLogColours, "BLUE")
GridLogger GridLogMessage(1, "Message", GridLogColours, "NORMAL")
#define NAMESPACE_BEGIN(A)
static INTERNAL_PRECISION U
IntegratorType::Field Field
IntegratorType::FieldImplementation FieldImplementation
IntegratorType & TheIntegrator
RealD evolve_hmc_step(Field &U)
const HMCparameters Params
std::vector< HmcObservable< Field > * > ObsListType
HybridMonteCarlo(HMCparameters _Pams, IntegratorType &_Int, GridSerialRNG &_sRNG, GridParallelRNG &_pRNG, ObsListType _Obs, Field &_U)
bool metropolis_test(const RealD DeltaH)
HMCparameters(Reader< ReaderClass > &TheReader)
GRID_SERIALIZABLE_CLASS_MEMBERS(HMCparameters, Integer, StartTrajectory, Integer, Trajectories, bool, MetropolisTest, Integer, NoMetropolisUntil, bool, PerformRandomShift, std::string, StartingType, IntegratorParameters, MD) HMCparameters()
void initialize(Reader< ReaderClass > &TheReader)
void print_parameters() const