19 int Naction0,
int Naction1,
int Naction2,
30 m_Naction0 = Naction0;
31 m_Naction1 = Naction1;
32 m_Naction2 = Naction2;
36 assert(
m_action.size() == m_Naction0 + m_Naction1 + m_Naction2);
58 for (
int i = 0; i <
m_action.size(); ++i) {
95 double diff_H = H_tot1 - H_tot0;
96 double Arprob = exp(-diff_H);
120 int NcA = Nc * Nc - 1;
122 int size_iP = NcA * Lvol * Ndim;
126 for (
int i = 0; i <
m_action.size(); ++i) {
135 double H_iP = langevin_P(iP);
141 double H_actions = 0.0;
142 for (
int i = 0; i <
m_action.size(); ++i) {
146 double H_tot = H_iP + H_actions;
152 double HMC_General::langevin_P(
Field_G& iP)
155 int Nvol = iP.
nvol();
159 int NcA = Nc * Nc - 1;
164 Field Hrand(NcA, Nvol, Nex);
168 double sq3r = 1.0 / sqrt(3.0);
169 double sq3r2 = 2.0 * sq3r;
171 for (
int ex = 0; ex < Nex; ++ex) {
172 for (
int site = 0; site < Nvol; ++site) {
174 double hc1 = Hrand.cmp(0, site, ex);
175 double hc2 = Hrand.cmp(1, site, ex);
176 double hc3 = Hrand.cmp(2, site, ex);
177 double hc4 = Hrand.cmp(3, site, ex);
178 double hc5 = Hrand.cmp(4, site, ex);
179 double hc6 = Hrand.cmp(5, site, ex);
180 double hc7 = Hrand.cmp(6, site, ex);
181 double hc8 = Hrand.cmp(7, site, ex);
182 iP.
set(0, site, ex, 0.0);
183 iP.
set(1, site, ex, hc3 + hc8 * sq3r);
184 iP.
set(2, site, ex, hc2);
185 iP.
set(3, site, ex, hc1);
186 iP.
set(4, site, ex, hc5);
187 iP.
set(5, site, ex, hc4);
188 iP.
set(6, site, ex, -hc2);
189 iP.
set(7, site, ex, hc1);
190 iP.
set(8, site, ex, 0.0);
191 iP.
set(9, site, ex, -hc3 + hc8 * sq3r);
192 iP.
set(10, site, ex, hc7);
193 iP.
set(11, site, ex, hc6);
194 iP.
set(12, site, ex, -hc5);
195 iP.
set(13, site, ex, hc4);
196 iP.
set(14, site, ex, -hc7);
197 iP.
set(15, site, ex, hc6);
198 iP.
set(16, site, ex, 0.0);
199 iP.
set(17, site, ex, -hc8 * sq3r2);
203 double iP2 = iP.
norm();
204 iP2 = 0.5 * iP2 * iP2;
222 int NcA = Nc * Nc - 1;
224 int size_iP = NcA * Lvol * Nex;
225 int size_U = Lvol * 6.0;
226 int size_psf = Lvol * Nc * Nd;
234 double H_actions = 0.0;
235 for (
int i = 0; i <
m_action.size(); ++i) {
239 double H_tot = H_iP + H_actions;
247 double hn = iP.
norm();
248 double H_iP = 0.5 * hn * hn;
264 double estep = m_Estep;
265 double esteph = 0.5 * estep;
268 Field force(Nin, Nvol, Nex), force1(Nin, Nvol, Nex);
275 for (
int i = 0; i < m_Naction0; ++i) {
277 force += esteph * force1;
283 for (
int imdc = 1; imdc < m_Nmdc + 1; imdc++) {
289 if (imdc == m_Nmdc) estep2 = esteph;
292 for (
int i = 0; i < m_Naction0; ++i) {
294 force += estep2 * force1;
313 double estep = m_Estep / ((double)m_Nmd1);
314 double esteph = 0.5 * estep;
317 Field force(Nin, Nvol, Nex), force1(Nin, Nvol, Nex);
324 for (
int i = 0; i < m_Naction1; ++i) {
325 int i2 = i + m_Naction0;
327 force += esteph * force1;
333 for (
int imd1 = 1; imd1 < m_Nmd1 + 1; imd1++) {
339 if (imd1 == m_Nmd1) estep2 = esteph;
342 for (
int i = 0; i < m_Naction1; ++i) {
343 int i2 = i + m_Naction0;
345 force += estep2 * force1;
364 double estep = m_Estep / ((double)(m_Nmd1 * m_Nmd2));
365 double esteph = 0.5 * estep;
368 Field force(Nin, Nvol, Nex), force1(Nin, Nvol, Nex);
375 for (
int i = 0; i < m_Naction2; ++i) {
376 int i2 = i + m_Naction0 + m_Naction1;
378 force += esteph * force1;
384 for (
int imd2 = 1; imd2 < m_Nmd2 + 1; imd2++) {
387 update_U(estep, iP, U);
390 if (imd2 == m_Nmd2) estep2 = esteph;
393 for (
int i = 0; i < m_Naction2; ++i) {
394 int i2 = i + m_Naction0 + m_Naction1;
396 force += estep2 * force1;
406 void HMC_General::update_U(
double estep,
416 for (
int ex = 0; ex < Nex; ++ex) {
417 for (
int site = 0; site < Nvol; ++site) {
418 u0 = U.
mat(site, ex);
419 u1 = U.
mat(site, ex);
420 h1 = iP.
mat(site, ex);
422 for (
int iprec = 0; iprec < m_Nprec; ++iprec) {
423 double exf = estep / (m_Nprec - iprec);
435 for (
int i = 0; i <
m_action.size(); ++i) {
void set(const int jin, const int site, const int jex, double v)
double calc_Hamiltonian(Field_G &iP, Field_G &U)
void set_parameters(const Parameters ¶ms)
void general(const char *format,...)
int m_Mtpl_test
Metropolis test: Mtpl_test=0: no test, !=0: test.
Container of Field-type object.
Bridge::VerboseLevel m_vl
double plaquette(const Field_G &)
calculates plaquette value.
RandomNumbers * m_rand
random number generator
double calcH_P(Field_G &iP)
valarray< Action * > m_action
actions
virtual void gauss_lex_global(Field &)
gaussian random number defined on global lattice.
double langevin(Field_G &iP, Field_G &U)
valarray< Director * > m_director
directors
void set_mat(const int site, const int mn, const Mat_SU_N &U)
Mat_SU_N mat(const int site, const int mn=0) const