Requests for technical support from the VASP group should be posted in the VASP-forum.

# Constrained molecular dynamics

In general, constrained molecular dynamics generates biased statistical averages. It can be shown that the correct average for a quantity ${\displaystyle a(\xi )}$ can be obtained using the formula:

${\displaystyle a(\xi )={\frac {\langle |{\mathbf {Z} }|^{-1/2}a(\xi ^{*})\rangle _{\xi ^{*}}}{\langle |{\mathbf {Z} }|^{-1/2}\rangle _{\xi ^{*}}}},}$

where ${\displaystyle \langle ...\rangle _{\xi ^{*}}}$ stands for the statistical average of the quantity enclosed in angular parentheses computed for a constrained ensemble and ${\displaystyle Z}$ is a mass metric tensor defined as:

${\displaystyle Z_{\alpha ,\beta }={\sum }_{i=1}^{3N}m_{i}^{-1}\nabla _{i}\xi _{\alpha }\cdot \nabla _{i}\xi _{\beta },\,\alpha =1,...,r,\,\beta =1,...,r,}$

It can be shown that the free energy gradient can be computed using the equation:[1][2][3][4]

${\displaystyle {\Bigl (}{\frac {\partial A}{\partial \xi _{k}}}{\Bigr )}_{\xi ^{*}}={\frac {1}{\langle |Z|^{-1/2}\rangle _{\xi ^{*}}}}\langle |Z|^{-1/2}[\lambda _{k}+{\frac {k_{B}T}{2|Z|}}\sum _{j=1}^{r}(Z^{-1})_{kj}\sum _{i=1}^{3N}m_{i}^{-1}\nabla _{i}\xi _{j}\cdot \nabla _{i}|Z|]\rangle _{\xi ^{*}},}$

where ${\displaystyle \lambda _{\xi _{k}}}$ is the Lagrange multiplier associated with the parameter ${\displaystyle {\xi _{k}}}$ used in the SHAKE algorithm.[5]

The free-energy difference between states (1) and (2) can be computed by integrating the free-energy gradients over a connecting path:

${\displaystyle {\Delta }A_{1\rightarrow 2}=\int _{\xi (1)}^{\xi (2)}{\Bigl (}{\frac {\partial {A}}{\partial \xi }}{\Bigr )}_{\xi ^{*}}\cdot d{\xi }.}$

Note that as the free-energy is a state quantity, the choice of path connecting (1) with (2) is irrelevant.

Constrained molecular dynamics is performed using the SHAKE algorithm.[5]. In this algorithm, the Lagrangian for the system ${\displaystyle {\mathcal {L}}}$ is extended as follows:

${\displaystyle {\mathcal {L}}^{*}({\mathbf {q,{\dot {q}}} })={\mathcal {L}}({\mathbf {q,{\dot {q}}} })+\sum _{i=1}^{r}\lambda _{i}\sigma _{i}(q),}$

where the summation is over r geometric constraints, ${\displaystyle {\mathcal {L}}^{*}}$ is the Lagrangian for the extended system, and λi is a Lagrange multiplier associated with a geometric constraint σi:

${\displaystyle \sigma _{i}(q)=\xi _{i}({q})-\xi _{i}\;}$

with ξi(q) being a geometric parameter and ξi is the value of ξi(q) fixed during the simulation.

In the SHAKE algorithm, the Lagrange multipliers λi are determined in the iterative procedure:

1. Perform a standard MD step (leap-frog algorithm):
${\displaystyle v_{i}^{t+{\Delta }t/2}=v_{i}^{t-{\Delta }t/2}+{\frac {a_{i}^{t}}{m_{i}}}{\Delta }t}$
${\displaystyle q_{i}^{t+{\Delta }t}=q_{i}^{t}+v_{i}^{t+{\Delta }t/2}{\Delta }t}$
2. Use the new positions q(tt) to compute Lagrange multipliers for all constraints:
${\displaystyle {\lambda }_{k}={\frac {1}{{\Delta }t^{2}}}{\frac {\sigma _{k}(q^{t+{\Delta }t})}{\sum _{i=1}^{N}m_{i}^{-1}\bigtriangledown _{i}{\sigma }_{k}(q^{t})\bigtriangledown _{i}{\sigma }_{k}(q^{t+{\Delta }t})}}}$
3. Update the velocities and positions by adding a contribution due to restoring forces (proportional to λk):
${\displaystyle v_{i}^{t+{\Delta }t/2}=v_{i}^{t-{\Delta }t/2}+\left(a_{i}^{t}-\sum _{k}{\frac {{\lambda }_{k}}{m_{i}}}\bigtriangledown _{i}{\sigma }_{k}(q^{t})\right){\Delta }t}$
${\displaystyle q_{i}^{t+{\Delta }t}=q_{i}^{t}+v_{i}^{t+{\Delta }t/2}{\Delta }t}$
4. repeat steps 2-4 until either |σi(q)| are smaller than a predefined tolerance (determined by SHAKETOL), or the number of iterations exceeds SHAKEMAXITER.

## Anderson thermostat

• For a constrained molecular dynamics run with Andersen thermostat, one has to:
1. Set the standard MD-related tags: IBRION=0, TEBEG, POTIM, and NSW.
2. Set MDALGO=1, and choose an appropriate setting for ANDERSEN_PROB.
3. Define geometric constraints in the ICONST-file, and set the STATUS parameter for the constrained coordinates to 0.
4. When the free-energy gradient is to be computed, set LBLUEOUT=.TRUE.