|
|
download LAMMPS [lammps-23Jun2022.tar.gz](https://download.lammps.org/tars/lammps-23Jun2022.tar.gz) St. Joan edition here (version used in this study)
|
|
|
download here LAMMPS [lammps-23Jun2022.tar.gz](https://download.lammps.org/tars/lammps-23Jun2022.tar.gz (version used in this study)
|
|
|
|
|
|
# Introduction
|
|
|
|
... | ... | @@ -37,19 +37,30 @@ To retrieve the properties of an atom, this `int` value needs to be used as an i |
|
|
Function `PairLJCharmmCoulLong::compute` has an inner and an outer for loop.
|
|
|
The outer loop (i-loop) iterates through all 32.000 atoms in the protein simulation, while the inner loop (j-loop) iterates through each atom `j` that is a neighbor of `i`.
|
|
|
|
|
|
![flowchart](uploads/2c10a18b3cda9496b9eaed9e54e001db/flowchart.png)
|
|
|
|
|
|
|
|
|
For each pair of atoms `i, j`, the algorithm first computes the distance between the two atoms.
|
|
|
Then, the distance is compared to many different values.
|
|
|
Then, the distance is compared to different values which act as a threshold.
|
|
|
|
|
|
In the input line `pair_style lj/charmm/coul/long X Y`, `X` is `cut_lj_innersq` and Y is both `cut_ljsq` and `cut_coulsq`.
|
|
|
The alternative form with `X Y Z` parameters ([see](https://docs.lammps.org/pair_charmm.html#pair-style-lj-charmm-coul-long-command)) is not supported by the optimized function and falls back on the LAMMPS vanilla function.
|
|
|
`tabinnersq` can be modified using the `pair_modify table N`, altough its effects have not been explored in this study.
|
|
|
|
|
|
In the input line `pair_style lj/charmm/coul/long X Y`, `X` is `cut_lj_innersq` and Y is `cut_ljsq` and `cut_coulsq`.
|
|
|
The alternative form with `X Y Z` parameters is not supported by the optimized function and would fall back on the LAMMPS vanilla function.
|
|
|
Then, `cut_bothsq` is defined as the minimum of `cut_coulsq` and cut_ljsq`.
|
|
|
These values always follow:
|
|
|
- `cut_lj_innersq < cut_ljsq`
|
|
|
- `tabinnersq < cut_coulsq`
|
|
|
- `cut_bothsq = MIN(cut_ljsq, cut_coulsq)`
|
|
|
|
|
|
In the code, `rsq` represents the distance between atoms `i,j`. It is saved in squared form to avoid computing an expensive `sqrt`.
|
|
|
- If `rsq` is larger than `cut_bothsq`, then, no computation is required because there is no short-range interaction between the two atoms. In that case, the inner loop iteration stops here.
|
|
|
- If `rsq` is smaller than `tabinnersq`, then `forcecoul` is computed using a *fast* table method. If not, it is computed using a *slow* method with calls to `sqrt` and `exp` functions.
|
|
|
- If `rsq` is bigger than `cut_lj_innersq`, then `forcelj` needs a few additional computations.
|
|
|
|
|
|
![flowchart](uploads/2c10a18b3cda9496b9eaed9e54e001db/flowchart.png)
|
|
|
|
|
|
This flowcharts shows the different cases based on `rsq`.
|
|
|
The condition on `forcelj`is not shown to focus on the `tabinnersq` condition.
|
|
|
|
|
|
- If it is smaller than `cut_bothsq`, then, no computation is required because there is no short-range interaction between the two atoms.
|
|
|
- `cut_bothsq` is defined as the minimum of `cut_coulsq` and cut_ljsq`
|
|
|
- If
|
|
|
|
|
|
atom_vec.h -> contains `**x` and `**f` (3D)
|
|
|
neigh_list.h -> contains `**firstneigh` (for each i, store array of neighbors j)
|
... | ... | |