13#include <util/random/Random.h>
14#include <util/archives/Serializable_includes.h>
24 template <
int D,
class T>
39 template <
int D,
class T>
46 template <
int D,
class T>
55 template <
int D,
class T>
77 template <
int D,
class T>
86 double oldHamiltonian =
simulator().hamiltonian();
99 compressorTimer_.start();
100 int compress =
simulator().compressor().compress();
102 compressorTimer_.stop();
104 bool isConverged =
false;
112 componentTimer_.start();
113 simulator().computeWc();
115 if (simulator().needsCc() || simulator().needsDc()){
121 if (simulator().needsDc()){
122 simulator().computeDc();
124 componentTimer_.stop();
127 hamiltonianTimer_.start();
128 simulator().computeHamiltonian();
129 double newHamiltonian = simulator().hamiltonian();
130 hamiltonianTimer_.stop();
133 decisionTimer_.start();
135 double weight = exp(-(newHamiltonian - oldHamiltonian));
136 if (newHamiltonian - oldHamiltonian <= 1e-10){
139 accept = random().metropolis(weight);
143 simulator().clearState();
145 simulator().restoreState();
147 decisionTimer_.stop();
158 template <
int D,
class T>
165 template<
int D,
class T>
170 out <<
" time contributions:\n";
177 template<
int D,
class T>
181 double total = totalTimer_.time();
182 out <<
" " <<
"Total"
183 << std::setw(17) <<
"Per Move"
184 << std::setw(14) <<
"Fraction" <<
"\n";
185 out <<
"Attempt Move: "
189 out <<
"Compressor: "
190 <<
Dbl(compressorTimer_.time(), 9, 3) <<
" s, "
191 <<
Dbl(compressorTimer_.time()/nAttempt_, 9, 3) <<
" s, "
192 <<
Dbl(compressorTimer_.time()/total, 9, 3) <<
"\n";
193 out <<
"Compute eigen-components: "
194 <<
Dbl(componentTimer_.time(), 9, 3) <<
" s, "
195 <<
Dbl(componentTimer_.time()/nAttempt_, 9, 3) <<
" s, "
196 <<
Dbl(componentTimer_.time()/total, 9, 3) <<
"\n";
197 out <<
"Compute Hamiltonian: "
198 <<
Dbl(hamiltonianTimer_.time(), 9, 3) <<
" s, "
199 <<
Dbl(hamiltonianTimer_.time()/nAttempt_, 9, 3) <<
" s, "
200 <<
Dbl(hamiltonianTimer_.time()/total, 9, 3) <<
"\n";
201 out <<
"Accept or Reject: "
202 <<
Dbl(decisionTimer_.time(), 9, 3) <<
" s, "
203 <<
Dbl(decisionTimer_.time()/nAttempt_, 9, 3) <<
" s, "
204 <<
Dbl(decisionTimer_.time()/total, 9, 3) <<
"\n";
205 out <<
"total time: "
206 <<
Dbl(total, 9, 3) <<
" s, "
207 <<
Dbl(total/nAttempt_, 9, 3) <<
" s \n";
214 template<
int D,
class T>
218 compressorTimer_.clear();
219 componentTimer_.clear();
220 hamiltonianTimer_.clear();
221 decisionTimer_.clear();
Random & random()
Get the scalar random number generator.
virtual void clearTimers()
Clear timers.
virtual void attemptMove()
T::McSimulator & simulator()
Get parent McSimulator object (non-const ref).
virtual void outputTimers(std::ostream &out)
Write timing results to a file.
void readProbability(std::istream &in)
Read the probability from file.
T::VecRandom & vecRandom()
Get the vector random number generator.
void outputTimerData(std::ostream &out)
Write timing data to a file, without a class label.
McMove(typename T::McSimulator &simulator)
Constructor.
T::System & system()
Get parent System object (non-const ref).
virtual void output()
Output statistics for this move (at the end of simulation)
virtual bool needsCc()
Decide whether cc fields need to be saved for move.
virtual void setup()
Setup before the beginning of each simulation run.
Timer attemptMoveTimer_
Timers for McMove.
virtual void readParameters(std::istream &in)
Read required parameters from file.
virtual bool move()
Generate, attempt, and accept or reject a Monte Carlo move.
virtual bool needsDc()
Decide whether dc fields need to be saved for move.
void incrementNAttempt()
Increment the number of attempted moves.
Wrapper for a double precision number, for formatted ostream output.
ScalarParam< Type > & read(std::istream &in, const char *label, Type &value)
Add and read a new required ScalarParam < Type > object.
std::string className() const
Get class name string.
#define UTIL_CHECK(condition)
Assertion macro suitable for serial or parallel production code.
Class templates for real-valued periodic fields.
PSCF package top-level namespace.