Rational Hybrid Monte Carlo

The rational hybrid Monte Carlo (rhmc) algorithm is a way of updating gauge fields when simulating dynamical fermions. At the end of the rhmc process, usually called a trajectory, there is a typical Metropolis accept/reject step. During the trajectory, a proposal gauge field is generated by integrating some ficitious, Hamiltonian equations of motion in Monte Carlo time.

The trajectory is pushed by a fictious driving force. There comes contributions from the gauge part of the action as well as the fermion part. Schematically, it comes out to something of the form

\( F \sim -\phi^\dagger \left(D D^{\dagger}\right)^{-1} \left(\partial D D^{\dagger}\right) \left(D D^{\dagger}\right)^{-1}\phi, \)

where \(\phi\) is a pseudo-fermion field, and where the \(\partial\) indicates a Lie group derivative. Hence we need to spend some effort finding the vector \(X=\left(D D^{\dagger}\right)^{-1}\phi\). Since \(D\) depends on the gauge field, we have to solve for \(X\) at each step in the rhmc trajectory, which makes it an important bottleneck in the rhmc algorithm. Hence it is important that the inversion carried out in that equation is very fast.

The inverter is a conjugate gradient, with possibilities for multiple RHS and multiple shifts to boost performance. The integrator uses a leapfrog by default, but it can use an Omelyan on the largest scale. We use the HISQ/tree action, which is a tree-level improved Lüscher-Weisz action in the gauge sector. The relative weights of the plaquette and rectangle terms are

\( c_\text{plaq} = 5/4, \)

\( c_\text{rect} = -1/6. \)

To use the rhmc class, the user will only have to call the constructor and two functions

rhmc(RhmcParameters rhmc_param, Gaugefield<floatT,onDevice,All,HaloDepth> &gaugeField, uint4* rand_state)
void init_ratapprox(RationalCoeff rat)
int update(bool metro=true, bool reverse=false)

The constructor has to be called with the usual template arguments and passed an instance of RhmcParameters, the gauge field, and an uint4 array with the RNG state. The function init_ratapprox will set the coefficients for all the rational approximations and has to be called before updating. The function update will generate one molecular dynamics (MD) trajectory. If no arguments are passed to update() it will also perform a Metropolis step after the trajectory. The Metropolis step can also be omitted by passing the argument false to update. This is handy in the beginning of thermalization. The second argument is false by default; passing true to update will make the updater run the trajectory forward and backwards for testing if the integration is reversible.

Generating rational approximation input files

A tool to generate rational approximation files written by K. Clark can be found in SIMULATeQCD/src/tools/rational_approx. One can find a document explainRatApprox.pdf by Q. Yuan explaining the idea behind the rational approximation for the fermion determinant, as well as some of the following notation. The makefile makeRatApprox will compile the executable ratApprox, which will generate you a rational approximation file for use with the rhmc of SIMULATeQCD. You can call it with

ratApprox input.dat out.rational 

The input file input.dat should be structured as

npff        // Number of pseudo-fermion flavors

y1
y2
mprec       // Pre-conditioner mass (reduces the condition number in CG)
mq
order1
order2
lambda_low
lambda_high
precision

One block will generate three rational approximations according to

\( f(x) = x^{y_1/8} (x+ m_\text{prec}^2 -m_q^2 )^{y_2/8} \)

\( g(x) = x^{-y_1/8} (x+ m_\text{prec}^2 -m_q^2 )^{-y_2/8} \)

\( h(x) = x^{-y_1/4} (x+ m_\text{prec}^2 -m_q^2 )^{-y_2/4} \)

with \(m^2 = m_\text{prec}^2 - m_q^2\). An example input file for \(N_f=2+1\) with standard Hasenbusch preconditioning for the light flavors is given in exampleInput.dat. This input file has a light block and a strange block, which together generate six rational approximations. The light approximations are

\( f(x) = x^{1/4} (x + m_s^2 - m_l^2 )^{-1/4} \)

\( g(x) = x^{-1/4} (x + m_s^2 - m_l^2 )^{1/4} \)

\( h(x) = x^{-1/2} (x + m_s^2 + m_l^2 )^{-1/2} \)

while the strange are

\( f(x) = x^{3/8} \)

\( g(x) = x^{-3/8} \)

\( h(x) = x^{-3/4} \)

Update

The update routine saves a copy of the gauge field, applies the smearing to the gauge field, builds the pseudo-fermion fields, generates the conjugate momenta and calculates the Hamiltonian. Then it starts the MD evolution by calling integrate() from the integrator class (the integrator object is instantiated by the rhmc constructor). After the MD trajectory the new Hamiltonian is calculated and - depending on the arguments - the Metropolis step is done. You can learn more about the smearing here.

Multiple pseudo-fermions

When you want to use multiple pseudo-fermion fields, set no_pf in the rhmc input file to the respective number. Be aware that this changes the way you have to construct your ratapprox: In the remez input.dat, if you want to generate \(N_f\) flavors using \(N_{pf}\) pseudo-fermion fields, you have to use \(N_f/N_{pf}\) as an input, (which is then used \(N_{pf}\) times). Note that \(N_f/N_{pf}\) must be < 4. no_pf is 1 per default.

Imaginary chemical potential

The rhmc has the option to generate HISQ lattices with \(\mu_B=i\mu_I\). This can be accomplished by setting the rhmc parameter mu0 to your desired value. (The default value is 0.) This can be accomplished straightforwardly in lattice calculations by multiplying time-facing staggered phases by an appropriate function of \(\mu_I\); see for instance this work.

In our code we implement the imaginary phase corresponding to the chemical potential chmp in staggeredPhases.h as:

img_chmp.cREAL = cos(chmp);
img_chmp.cIMAG = sin(chmp);