From b766e6ebfa539173b4b3580ca5356533a27a8caa Mon Sep 17 00:00:00 2001 From: Berk Hess Date: Sun, 15 Sep 2019 23:01:43 +0200 Subject: [PATCH] Add virtual site type 2FD Fixes #2451 Change-Id: Ide9dcd829284567010435ed5cfb55194aed12dcf --- .../functions/interaction-methods.rst | 30 +- .../functions/plots/dummies.fig | 154 +- .../functions/plots/dummies.pdf | Bin 396185 -> 16256 bytes .../functions/plots/dummies.svg | 5754 ++--------------- .../topologies/topology-file-formats.rst | 2 + docs/release-notes/2020/major/features.rst | 7 + src/gromacs/fileio/tpxio.cpp | 3 + src/gromacs/gmxlib/nrnb.cpp | 1 + src/gromacs/gmxlib/nrnb.h | 3 +- src/gromacs/gmxpreprocess/convparm.cpp | 1 + src/gromacs/gmxpreprocess/topdirs.cpp | 10 +- src/gromacs/mdlib/vsite.cpp | 162 +- src/gromacs/topology/ifunc.cpp | 1 + src/gromacs/topology/ifunc.h | 1 + 14 files changed, 694 insertions(+), 5435 deletions(-) diff --git a/docs/reference-manual/functions/interaction-methods.rst b/docs/reference-manual/functions/interaction-methods.rst index 45812f98bc..c036c671df 100644 --- a/docs/reference-manual/functions/interaction-methods.rst +++ b/docs/reference-manual/functions/interaction-methods.rst @@ -170,7 +170,7 @@ However, in the general case redistribution should be done first. .. figure:: plots/dummies.* :width: 15.00000cm - The six different types of virtual site construction in . The + The seven different types of virtual site construction. The constructing atoms are shown as black circles, the virtual sites in gray. @@ -206,6 +206,30 @@ can be constructed from “particles” that are simpler virtual sites. - In this case the virtual site is on the line through atoms :math:`i` and :math:`j`. +- On the line through two atoms, with a fixed distance + (:numref:`Fig. %s ` 2fd): + + .. math:: \mathbf{r}_s ~=~ \mathbf{r}_i + a \frac{ \mathbf{r}_ij } + { | \mathbf{r}_ij | } + :label: eqnvsite2fdatom + +- In this case the virtual site is on the line through the the other two + particles at a distance of :math:`|a|` from :math:`i`. The force on + particles :math:`i` and :math:`j` due to the force on the virtual site + can be computed as: + + .. math:: \begin{array}{lcr} + \mathbf{F}_i &=& \displaystyle \mathbf{F}_{s} - \gamma ( \mathbf{F}_is - \mathbf{p} ) \\[1ex] + \mathbf{F}_j &=& \displaystyle \gamma (\mathbf{F}_{s} - \mathbf{p}) \\[1ex] + \end{array} + ~\mbox{~ where~ }~ + \begin{array}{c} + \displaystyle \gamma = \frac{a}{ | \mathbf{r}_ij | } \\[2ex] + \displaystyle \mathbf{p} = \frac{ \mathbf{r}_{is} \cdot \mathbf{F}_{s} } + { \mathbf{r}_{is} \cdot \mathbf{r}_is } \mathbf{r}_is + \end{array} + :label: eqnvsite2fdforce + - As a linear combination of three atoms (:numref:`Fig. %s ` 3): @@ -218,8 +242,8 @@ can be constructed from “particles” that are simpler virtual sites. - In the plane of three atoms, with a fixed distance (:numref:`Fig. %s ` 3fd): - .. math:: \mathbf{r}_s ~=~ \mathbf{r}_i + b \frac{ \mathbf{r}_ij + a \mathbf{r}_{jk} } - { | \mathbf{r}_ij + a \mathbf{r}_{jk} | } + .. math:: \mathbf{r}_s ~=~ \mathbf{r}_i + b \frac{ (1 - a) \mathbf{r}_ij + a \mathbf{r}_{jk} } + { | (1 - a) \mathbf{r}_ij + a \mathbf{r}_{jk} | } :label: eqnvsiteplane3atom - In this case the virtual site is in the plane of the other three diff --git a/docs/reference-manual/functions/plots/dummies.fig b/docs/reference-manual/functions/plots/dummies.fig index f868c8a431..074884422c 100644 --- a/docs/reference-manual/functions/plots/dummies.fig +++ b/docs/reference-manual/functions/plots/dummies.fig @@ -1,105 +1,119 @@ -#FIG 3.1 +#FIG 3.2 Produced by xfig version 3.2.7a Portrait Center Inches +A4 +100.00 +Single +-2 1200 2 5 1 2 1 -1 -1 0 0 -1 3.000 0 1 0 0 11851.786 1198.214 12525 1200 11850 525 11550 1800 -1 3 0 1 -1 7 0 0 0 0.000 1 0.0000 6825 1200 150 150 6825 1200 6975 1350 -1 3 0 1 -1 -1 0 0 62 0.000 1 0.0000 6825 3600 150 150 6825 3600 6975 3600 -1 3 0 1 -1 -1 0 0 62 0.000 1 0.0000 7500 2400 150 150 7500 2400 7650 2400 -1 3 0 1 -1 -1 0 0 62 0.000 1 0.0000 11175 2400 150 150 11175 2400 11325 2400 -1 3 0 1 -1 -1 0 0 62 0.000 1 0.0000 9825 2400 150 150 9825 2400 9975 2400 -1 3 2 1 -1 -1 0 0 -1 4.000 1 0.0000 6825 2400 75 75 6825 2400 6900 2475 -1 3 0 1 -1 7 0 0 0 0.000 1 0.0000 4050 1200 150 150 4050 1200 4200 1350 -1 3 0 1 -1 -1 0 0 62 0.000 1 0.0000 4050 3600 150 150 4050 3600 4200 3600 -1 3 0 1 -1 -1 0 0 62 0.000 1 0.0000 4725 2400 150 150 4725 2400 4875 2400 1 3 0 1 -1 -1 0 0 62 0.000 1 0.0000 2925 2400 150 150 2925 2400 3075 2400 -1 3 0 1 -1 -1 0 0 62 0.000 1 0.0000 1125 2400 150 150 1125 2400 1275 2550 1 3 0 0 -1 -1 0 0 10 0.000 1 0.0000 2025 2400 150 150 2025 2400 2175 2400 -1 3 0 0 -1 -1 0 0 10 0.000 1 0.0000 5625 2400 168 168 5625 2400 5775 2475 -1 3 0 0 -1 -1 0 0 10 0.000 1 0.0000 8400 2400 150 150 8400 2400 8550 2400 -1 3 0 0 -1 -1 0 0 10 0.000 1 0.0000 12750 1200 150 150 12750 1200 12900 1200 -1 3 0 1 -1 -1 0 0 62 0.000 1 0.0000 11850 1200 150 150 11850 1200 12000 1200 -1 3 0 1 -1 -1 0 0 20 0.000 1 0.0000 13740 2355 150 150 13740 2355 13890 2355 -1 3 0 1 7 -1 2 0 20 0.000 1 0.0000 15165 2730 150 150 15165 2730 15315 2880 -1 3 0 0 -1 -1 0 0 10 0.000 1 0.0000 15390 3180 168 168 15390 3180 15540 3255 -1 3 0 1 -1 -1 0 0 62 0.000 1 0.0000 15165 1980 150 150 15165 1980 15315 2130 -1 3 0 1 -1 -1 0 0 62 0.000 1 0.0000 16800 1593 168 168 16800 1593 16632 1425 -1 3 0 1 -1 -1 2 0 62 0.000 1 0.0000 17100 2400 150 150 17100 2400 17250 2550 -1 3 0 1 -1 -1 0 0 62 0.000 1 0.0000 16800 3282 168 168 16800 3282 16650 3207 -1 3 0 0 -1 -1 0 0 10 0.000 1 0.0000 18000 2400 150 150 18000 2400 18150 2400 -1 3 0 1 -1 -1 4 0 62 0.000 1 0.0000 16670 2400 168 168 16670 2400 16838 2568 +1 3 0 1 -1 -1 0 0 62 0.000 1 0.0000 1125 2400 150 150 1125 2400 1275 2550 +1 3 0 1 -1 -1 0 0 62 0.000 1 0.0000 4950 2400 150 150 4950 2400 5100 2550 +1 3 0 0 -1 -1 0 0 10 0.000 1 0.0000 5850 2400 150 150 5850 2400 6000 2400 +1 3 0 1 -1 -1 0 0 62 0.000 1 0.0000 4050 2400 150 150 4050 2400 4200 2550 +1 3 0 1 -1 7 0 0 0 0.000 1 0.0000 9375 1200 150 150 9375 1200 9525 1350 +1 3 0 1 -1 -1 0 0 62 0.000 1 0.0000 9375 3600 150 150 9375 3600 9525 3600 +1 3 0 1 -1 -1 0 0 62 0.000 1 0.0000 10050 2400 150 150 10050 2400 10200 2400 +1 3 0 1 -1 -1 0 0 62 0.000 1 0.0000 13725 2400 150 150 13725 2400 13875 2400 +1 3 0 1 -1 -1 0 0 62 0.000 1 0.0000 12375 2400 150 150 12375 2400 12525 2400 +1 3 2 1 -1 -1 0 0 -1 4.000 1 0.0000 9375 2400 75 75 9375 2400 9450 2475 +1 3 0 1 -1 7 0 0 0 0.000 1 0.0000 6600 1200 150 150 6600 1200 6750 1350 +1 3 0 1 -1 -1 0 0 62 0.000 1 0.0000 6600 3600 150 150 6600 3600 6750 3600 +1 3 0 1 -1 -1 0 0 62 0.000 1 0.0000 7275 2400 150 150 7275 2400 7425 2400 +1 3 0 0 -1 -1 0 0 10 0.000 1 0.0000 8175 2400 168 168 8175 2400 8325 2475 +1 3 0 0 -1 -1 0 0 10 0.000 1 0.0000 10950 2400 150 150 10950 2400 11100 2400 +1 3 0 0 -1 -1 0 0 10 0.000 1 0.0000 15300 1200 150 150 15300 1200 15450 1200 +1 3 0 1 -1 -1 0 0 62 0.000 1 0.0000 14400 1200 150 150 14400 1200 14550 1200 +1 3 0 1 -1 -1 0 0 20 0.000 1 0.0000 16290 2355 150 150 16290 2355 16440 2355 +1 3 0 1 7 -1 2 0 20 0.000 1 0.0000 17715 2730 150 150 17715 2730 17865 2880 +1 3 0 0 -1 -1 0 0 10 0.000 1 0.0000 17940 3180 168 168 17940 3180 18090 3255 +1 3 0 1 -1 -1 0 0 62 0.000 1 0.0000 17715 1980 150 150 17715 1980 17865 2130 +1 3 0 1 -1 -1 0 0 62 0.000 1 0.0000 19350 1593 168 168 19350 1593 19182 1425 +1 3 0 1 -1 -1 2 0 62 0.000 1 0.0000 19650 2400 150 150 19650 2400 19800 2550 +1 3 0 1 -1 -1 0 0 62 0.000 1 0.0000 19350 3282 168 168 19350 3282 19200 3207 +1 3 0 0 -1 -1 0 0 10 0.000 1 0.0000 20550 2400 150 150 20550 2400 20700 2400 +1 3 0 1 -1 -1 4 0 62 0.000 1 0.0000 19220 2400 168 168 19220 2400 19388 2568 +2 1 2 1 -1 7 1 0 -1 3.000 0 0 -1 0 0 2 + 750 2400 3300 2400 +2 1 0 1 0 7 50 -1 -1 0.000 0 0 -1 0 0 2 + 4050 2400 4950 2400 +2 1 0 1 0 7 50 -1 -1 0.000 0 0 -1 0 0 2 + 4950 2400 5850 2400 2 1 0 1 -1 -1 0 0 -1 0.000 0 0 -1 0 0 3 - 6825 1200 7500 2400 6825 3600 + 9375 1200 10050 2400 9375 3600 2 1 2 1 -1 -1 0 0 -1 3.000 0 0 -1 0 0 2 - 6825 900 6825 3900 + 9375 900 9375 3900 2 1 2 1 -1 -1 0 0 -1 3.000 0 0 -1 0 0 2 - 7500 2400 7500 1950 + 10050 2400 10050 1950 2 1 0 1 -1 7 1 0 -1 0.000 0 0 -1 0 0 2 - 7500 2400 8400 2400 + 10050 2400 10950 2400 2 1 2 1 -1 -1 1 0 -1 3.000 0 0 -1 0 0 2 - 8400 2400 8400 1950 + 10950 2400 10950 1950 2 1 2 1 -1 -1 1 0 -1 3.000 0 0 -1 0 0 2 - 6825 2400 8700 2400 + 9375 2400 11250 2400 2 1 2 1 -1 -1 0 0 -1 3.000 0 0 -1 0 0 2 - 7500 2100 8400 2100 + 10050 2100 10950 2100 2 1 2 1 -1 -1 0 0 -1 3.000 0 0 -1 0 0 2 - 11850 1200 11850 1650 + 14400 1200 14400 1650 2 1 0 1 -1 -1 1 0 -1 0.000 0 0 -1 0 0 4 - 9825 2400 11175 2400 11850 1200 12750 1200 + 12375 2400 13725 2400 14400 1200 15300 1200 2 1 2 1 -1 -1 1 0 -1 3.000 0 0 -1 0 0 2 - 12750 1200 12750 1650 + 15300 1200 15300 1650 2 1 2 1 -1 -1 0 0 -1 3.000 0 0 -1 0 0 2 - 11850 1500 12750 1500 + 14400 1500 15300 1500 2 1 2 1 -1 7 0 0 -1 3.000 0 0 -1 1 1 3 2 1 1.00 60.00 120.00 2 1 1.00 60.00 120.00 - 5175 1575 4725 2400 5175 3225 + 7725 1575 7275 2400 7725 3225 2 1 2 1 -1 7 1 0 -1 3.000 0 0 -1 0 0 3 - 5175 1575 5625 2400 5175 3225 + 7725 1575 8175 2400 7725 3225 2 1 0 1 -1 -1 0 0 -1 0.000 0 0 -1 0 0 3 - 4050 1200 4725 2400 4050 3600 + 6600 1200 7275 2400 6600 3600 2 1 0 1 -1 7 1 0 -1 0.000 0 0 -1 0 0 2 - 4725 2400 5625 2400 -2 1 2 1 -1 7 1 0 -1 3.000 0 0 -1 0 0 2 - 750 2400 3300 2400 + 7275 2400 8175 2400 2 1 0 2 -1 -1 1 0 -1 0.000 0 0 -1 0 1 2 1 1 1.00 70.00 660.00 - 15090 2355 15390 3180 + 17640 2355 17940 3180 2 3 0 1 7 -1 1 0 20 0.000 0 0 -1 0 0 4 - 15315 3180 15090 2355 15465 3180 15315 3180 + 17865 3180 17640 2355 18015 3180 17865 3180 2 3 2 1 -1 7 2 0 -1 3.000 0 0 -1 0 0 4 - 13740 2355 15165 1980 15165 2730 13740 2355 + 16290 2355 17715 1980 17715 2730 16290 2355 2 3 0 1 7 -1 1 0 20 0.000 0 0 -1 0 0 4 - 16870 3267 17095 2442 16720 3267 16870 3267 + 19420 3267 19645 2442 19270 3267 19420 3267 2 3 0 1 7 -1 1 0 20 0.000 0 0 -1 0 0 4 - 16875 1575 17100 2400 16725 1575 16875 1575 + 19425 1575 19650 2400 19275 1575 19425 1575 2 1 0 1 -1 7 1 0 -1 0.000 0 0 -1 0 0 2 - 17100 2400 18000 2400 + 19650 2400 20550 2400 2 1 2 1 -1 -1 0 0 -1 3.000 0 0 -1 0 0 2 - 17100 1950 17100 2400 + 19650 1950 19650 2400 2 1 2 1 -1 -1 1 0 -1 3.000 0 0 -1 0 0 2 - 18000 1950 18000 2400 + 20550 1950 20550 2400 2 1 2 1 -1 -1 0 0 -1 3.000 0 0 -1 0 0 2 - 17100 2100 18000 2100 + 19650 2100 20550 2100 2 3 0 0 0 7 3 0 50 0.000 0 0 -1 0 0 5 - 17025 2287 16650 2362 16650 2437 17025 2512 17025 2287 -4 0 -1 0 0 18 30 0.0000 4 315 255 1875 3600 2\001 -4 0 -1 0 0 17 24 0.0000 4 210 195 1522 2175 a\001 -4 0 -1 0 0 17 24 0.0000 4 270 615 2197 2175 1-a\001 -4 0 -1 0 0 17 24 0.0000 4 210 195 4747 1950 a\001 -4 0 -1 0 0 17 24 0.0000 4 285 210 4747 3150 b\001 -4 0 -1 0 0 17 24 0.0000 4 210 195 6547 1950 a\001 -4 0 -1 0 0 17 24 0.0000 4 270 615 6172 3075 1-a\001 -4 0 -1 0 0 18 30 0.0000 4 330 930 10725 3600 3fad\001 -4 0 -1 0 0 18 30 0.0000 4 315 255 4575 3600 3\001 -4 0 0 1 0 18 30 0.0000 4 330 675 7575 3600 3fd\001 -4 0 -1 0 0 32 24 0.0000 4 255 180 10950 1050 q\001 -4 0 -1 0 0 17 24 0.0000 4 285 210 12172 1875 d\001 -4 0 -1 1 0 16 24 0.0000 4 360 450 12045 1868 | |\001 -4 0 -1 0 0 17 24 0.0000 4 285 210 7818 1950 b\001 -4 0 -1 1 0 16 24 0.0000 4 360 450 7713 1950 | |\001 -4 0 -1 0 0 18 30 0.0000 4 315 945 13965 3555 3out\001 -4 0 -1 0 0 18 30 0.0000 4 330 675 17175 3600 4fd\001 -4 0 -1 0 0 17 24 0.0000 4 210 180 17422 2025 c\001 -4 0 -1 1 0 16 24 0.0000 4 360 450 17309 2025 | |\001 + 19575 2287 19200 2362 19200 2437 19575 2512 19575 2287 +4 0 -1 0 0 18 30 0.0000 4 345 270 1875 3600 2\001 +4 0 -1 0 0 17 24 0.0000 4 210 225 1522 2175 a\001 +4 0 -1 0 0 17 24 0.0000 4 285 585 2197 2175 1-a\001 +4 0 -1 0 0 17 24 0.0000 4 210 225 7297 1950 a\001 +4 0 -1 0 0 17 24 0.0000 4 300 225 7297 3150 b\001 +4 0 -1 0 0 17 24 0.0000 4 210 225 9097 1950 a\001 +4 0 -1 0 0 17 24 0.0000 4 285 585 8722 3075 1-a\001 +4 0 -1 0 0 18 30 0.0000 4 360 1005 13275 3600 3fad\001 +4 0 -1 0 0 18 30 0.0000 4 345 270 7125 3600 3\001 +4 0 0 1 0 18 30 0.0000 4 360 735 10125 3600 3fd\001 +4 0 -1 0 0 32 24 0.0000 4 285 210 13500 1050 q\001 +4 0 -1 0 0 17 24 0.0000 4 300 225 14722 1875 d\001 +4 0 -1 1 0 16 24 0.0000 4 390 570 14595 1868 | |\001 +4 0 -1 0 0 17 24 0.0000 4 300 225 10368 1950 b\001 +4 0 -1 1 0 16 24 0.0000 4 390 570 10263 1950 | |\001 +4 0 -1 0 0 18 30 0.0000 4 360 1035 16515 3555 3out\001 +4 0 -1 0 0 18 30 0.0000 4 360 735 19725 3600 4fd\001 +4 0 -1 0 0 17 24 0.0000 4 210 210 19972 2025 c\001 +4 0 -1 1 0 16 24 0.0000 4 390 570 19859 2025 | |\001 +4 0 -1 1 0 16 24 0.0000 4 390 570 5175 1950 | |\001 +4 0 -1 0 0 17 24 0.0000 4 210 225 5325 1950 a\001 +4 0 -1 0 0 18 30 0.0000 4 360 735 4575 3600 2fd\001 diff --git a/docs/reference-manual/functions/plots/dummies.pdf b/docs/reference-manual/functions/plots/dummies.pdf index 7835f7695d146df3e9b7c630f625121a1dc7e96c..1c8791a5d2f68f40a3f718f14f2db138b1942163 100644 GIT binary patch literal 16256 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 L^T)sZ>D~VT6Y@HV diff --git a/docs/reference-manual/functions/plots/dummies.svg b/docs/reference-manual/functions/plots/dummies.svg index 45fa90e44b..b009d62dd2 100644 --- a/docs/reference-manual/functions/plots/dummies.svg +++ b/docs/reference-manual/functions/plots/dummies.svg @@ -1,5344 +1,410 @@ - - - -image/svg+xml| | -3fd -| || | -1-aaba1-aa -23fad -3out4fdn -c -b -3 -θ -d - \ No newline at end of file + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +3fd + +| | + +| | + +| | + +| | + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +2 + +a + +1-a + +a + +b + +a + +1-a + +3fad + +3 + +θ + +d + +b + +3out + +4fd + +c + +a + +2fd + + diff --git a/docs/reference-manual/topologies/topology-file-formats.rst b/docs/reference-manual/topologies/topology-file-formats.rst index 084a585151..49401c2405 100644 --- a/docs/reference-manual/topologies/topology-file-formats.rst +++ b/docs/reference-manual/topologies/topology-file-formats.rst @@ -253,6 +253,8 @@ interactions can be converted to constraints by :ref:`grompp `. +------------------------------------+----------------------------+------------+-----------+-------------------------------------------------------------------------+------------+ | 2-body virtual site | ``virtual_sites2`` | 3 | 1 | |AO| () | | +------------------------------------+----------------------------+------------+-----------+-------------------------------------------------------------------------+------------+ + | 2-body virtual site (fd) | ``virtual_sites2`` | 3 | 2 | |DO| (nm) | | + +------------------------------------+----------------------------+------------+-----------+-------------------------------------------------------------------------+------------+ | 3-body virtual site | ``virtual_sites3`` | 4 | 1 | |AO|, |BO| () | | +------------------------------------+----------------------------+------------+-----------+-------------------------------------------------------------------------+------------+ | 3-body virtual site (fd) | ``virtual_sites3`` | 4 | 2 | |AO| (); |DO| (nm) | | diff --git a/docs/release-notes/2020/major/features.rst b/docs/release-notes/2020/major/features.rst index ed3ae87464..e27510b45c 100644 --- a/docs/release-notes/2020/major/features.rst +++ b/docs/release-notes/2020/major/features.rst @@ -17,3 +17,10 @@ increasing the similarity of a simulated density to the reference density. Multiple protocols are available for how to calculate simulated densities as well as how the similarity between a reference and a simulated density is evaluated. + +Virtual site on the line through two atoms at fixed distance +"""""""""""""""""""""""""""""""""""""""""""""""""""""""""""" + +This is use useful for e.g. halogens in the CHARMM force field. + +:issue:`2451` diff --git a/src/gromacs/fileio/tpxio.cpp b/src/gromacs/fileio/tpxio.cpp index c58d374902..300f56ba67 100644 --- a/src/gromacs/fileio/tpxio.cpp +++ b/src/gromacs/fileio/tpxio.cpp @@ -125,6 +125,7 @@ enum tpxv tpxv_MimicQMMM, /**< Introduced support for MiMiC QM/MM interface */ tpxv_PullAverage, /**< Added possibility to output average pull force and position */ tpxv_GenericInternalParameters, /**< Added internal parameters for mdrun modules*/ + tpxv_VSite2FD, /**< Added 2FD type virtual site */ tpxv_Count /**< the total number of tpxv versions */ }; @@ -207,6 +208,7 @@ static const t_ftupd ftupd[] = { { 79, F_DVDL_RESTRAINT }, { 79, F_DVDL_TEMPERATURE }, { tpxv_GenericInternalParameters, F_DENSITYFITTING }, + { tpxv_VSite2FD, F_VSITE2FD }, }; #define NFTUPD asize(ftupd) @@ -1968,6 +1970,7 @@ static void do_iparams(gmx::ISerializer *serializer, serializer->doReal(&iparams->settle.dhh); break; case F_VSITE2: + case F_VSITE2FD: serializer->doReal(&iparams->vsite.a); break; case F_VSITE3: diff --git a/src/gromacs/gmxlib/nrnb.cpp b/src/gromacs/gmxlib/nrnb.cpp index 08de8f3af1..1eea461821 100644 --- a/src/gromacs/gmxlib/nrnb.cpp +++ b/src/gromacs/gmxlib/nrnb.cpp @@ -174,6 +174,7 @@ static const t_nrnb_data nbdata[eNRNB] = { { "Constraint-Vir", 24 }, { "Settle", 323 }, { "Virtual Site 2", 23 }, + { "Virtual Site 2fd", 63 }, { "Virtual Site 3", 37 }, { "Virtual Site 3fd", 95 }, { "Virtual Site 3fad", 176 }, diff --git a/src/gromacs/gmxlib/nrnb.h b/src/gromacs/gmxlib/nrnb.h index 66decbebca..bab0ac594e 100644 --- a/src/gromacs/gmxlib/nrnb.h +++ b/src/gromacs/gmxlib/nrnb.h @@ -108,7 +108,8 @@ enum eNR_PCOUPL, eNR_EKIN, eNR_LINCS, eNR_LINCSMAT, eNR_SHAKE, eNR_CONSTR_V, eNR_SHAKE_RIJ, eNR_CONSTR_VIR, eNR_SETTLE, - eNR_VSITE2, eNR_VSITE3, eNR_VSITE3FD, + eNR_VSITE2, eNR_VSITE2FD, + eNR_VSITE3, eNR_VSITE3FD, eNR_VSITE3FAD, eNR_VSITE3OUT, eNR_VSITE4FD, eNR_VSITE4FDN, eNR_VSITEN, eNR_CMAP, eNR_UREY_BRADLEY, eNR_CROSS_BOND_BOND, diff --git a/src/gromacs/gmxpreprocess/convparm.cpp b/src/gromacs/gmxpreprocess/convparm.cpp index 16c77479cd..40cbc20ed1 100644 --- a/src/gromacs/gmxpreprocess/convparm.cpp +++ b/src/gromacs/gmxpreprocess/convparm.cpp @@ -406,6 +406,7 @@ assign_param(t_functype ftype, t_iparams *newparam, newparam->settle.dhh = old[1]; break; case F_VSITE2: + case F_VSITE2FD: case F_VSITE3: case F_VSITE3FD: case F_VSITE3OUT: diff --git a/src/gromacs/gmxpreprocess/topdirs.cpp b/src/gromacs/gmxpreprocess/topdirs.cpp index 89f4374b1f..8f7aea5bd7 100644 --- a/src/gromacs/gmxpreprocess/topdirs.cpp +++ b/src/gromacs/gmxpreprocess/topdirs.cpp @@ -207,7 +207,15 @@ int ifunc_index(Directive d, int type) return F_BHAM; } case Directive::d_vsites2: - return F_VSITE2; + switch (type) + { + case 1: + return F_VSITE2; + case 2: + return F_VSITE2FD; + default: + gmx_fatal(FARGS, "Invalid vsites2 type %d", type); + } case Directive::d_vsites3: switch (type) { diff --git a/src/gromacs/mdlib/vsite.cpp b/src/gromacs/mdlib/vsite.cpp index 063b63c9a3..cbc42a8f4b 100644 --- a/src/gromacs/mdlib/vsite.cpp +++ b/src/gromacs/mdlib/vsite.cpp @@ -189,6 +189,11 @@ static int pbc_rvec_sub(const t_pbc *pbc, const rvec xi, const rvec xj, rvec dx) } } +static inline real inverseNorm(const rvec x) +{ + return gmx::invsqrt(iprod(x, x)); +} + /* Vsite construction routines */ static void constr_vsite2(const rvec xi, const rvec xj, rvec x, real a, const t_pbc *pbc) @@ -215,6 +220,24 @@ static void constr_vsite2(const rvec xi, const rvec xj, rvec x, real a, const t_ /* TOTAL: 10 flops */ } +static void constr_vsite2FD(const rvec xi, const rvec xj, rvec x, real a, + const t_pbc *pbc) +{ + rvec xij; + pbc_rvec_sub(pbc, xj, xi, xij); + /* 3 flops */ + + const real b = a*inverseNorm(xij); + /* 6 + 10 flops */ + + x[XX] = xi[XX] + b*xij[XX]; + x[YY] = xi[YY] + b*xij[YY]; + x[ZZ] = xi[ZZ] + b*xij[ZZ]; + /* 6 Flops */ + + /* TOTAL: 25 flops */ +} + static void constr_vsite3(const rvec xi, const rvec xj, const rvec xk, rvec x, real a, real b, const t_pbc *pbc) { @@ -258,7 +281,7 @@ static void constr_vsite3FD(const rvec xi, const rvec xj, const rvec xk, rvec x, temp[ZZ] = xij[ZZ] + a*xjk[ZZ]; /* 6 flops */ - c = b*gmx::invsqrt(iprod(temp, temp)); + c = b*inverseNorm(temp); /* 6 + 10 flops */ x[XX] = xi[XX] + c*temp[XX]; @@ -278,13 +301,13 @@ static void constr_vsite3FAD(const rvec xi, const rvec xj, const rvec xk, rvec x pbc_rvec_sub(pbc, xk, xj, xjk); /* 6 flops */ - invdij = gmx::invsqrt(iprod(xij, xij)); + invdij = inverseNorm(xij); c1 = invdij * invdij * iprod(xij, xjk); xp[XX] = xjk[XX] - c1*xij[XX]; xp[YY] = xjk[YY] - c1*xij[YY]; xp[ZZ] = xjk[ZZ] - c1*xij[ZZ]; a1 = a*invdij; - b1 = b*gmx::invsqrt(iprod(xp, xp)); + b1 = b*inverseNorm(xp); /* 45 */ x[XX] = xi[XX] + a1*xij[XX] + b1*xp[XX]; @@ -330,7 +353,7 @@ static void constr_vsite4FD(const rvec xi, const rvec xj, const rvec xk, const r temp[ZZ] = xij[ZZ] + a*xjk[ZZ] + b*xjl[ZZ]; /* 12 flops */ - d = c*gmx::invsqrt(iprod(temp, temp)); + d = c*inverseNorm(temp); /* 6 + 10 flops */ x[XX] = xi[XX] + d*temp[XX]; @@ -369,7 +392,7 @@ static void constr_vsite4FDN(const rvec xi, const rvec xj, const rvec xk, const cprod(rja, rjb, rm); /* 9 flops */ - d = c*gmx::invsqrt(norm2(rm)); + d = c*inverseNorm(rm); /* 5+5+1 flops */ x[XX] = xi[XX] + d*rm[XX]; @@ -496,6 +519,10 @@ static void construct_vsites_thread(rvec x[], aj = ia[3]; constr_vsite2(x[ai], x[aj], x[avsite], a1, pbc_null2); break; + case F_VSITE2FD: + aj = ia[3]; + constr_vsite2FD(x[ai], x[aj], x[avsite], a1, pbc_null2); + break; case F_VSITE3: aj = ia[3]; ak = ia[4]; @@ -736,6 +763,105 @@ void constructVsitesGlobal(const gmx_mtop_t &mtop, } } +static void spread_vsite2FD(const t_iatom ia[], real a, + const rvec x[], + rvec f[], rvec fshift[], + gmx_bool VirCorr, matrix dxdf, + const t_pbc *pbc, const t_graph *g) +{ + const int av = ia[1]; + const int ai = ia[2]; + const int aj = ia[3]; + rvec fv; + copy_rvec(f[av], fv); + + rvec xij; + int sji = pbc_rvec_sub(pbc, x[aj], x[ai], xij); + /* 6 flops */ + + const real invDistance = inverseNorm(xij); + const real b = a*invDistance; + /* 4 + ?10? flops */ + + const real fproj = iprod(xij, fv)*invDistance*invDistance; + + rvec fj; + fj[XX] = b*(fv[XX] - fproj*xij[XX]); + fj[YY] = b*(fv[YY] - fproj*xij[YY]); + fj[ZZ] = b*(fv[ZZ] - fproj*xij[ZZ]); + /* 9 */ + + /* b is already calculated in constr_vsite2FD + storing b somewhere will save flops. */ + + f[ai][XX] += fv[XX] - fj[XX]; + f[ai][YY] += fv[YY] - fj[YY]; + f[ai][ZZ] += fv[ZZ] - fj[ZZ]; + f[aj][XX] += fj[XX]; + f[aj][YY] += fj[YY]; + f[aj][ZZ] += fj[ZZ]; + /* 9 Flops */ + + if (fshift) + { + int svi; + if (g) + { + ivec di; + ivec_sub(SHIFT_IVEC(g, ia[1]), SHIFT_IVEC(g, ai), di); + svi = IVEC2IS(di); + ivec_sub(SHIFT_IVEC(g, aj), SHIFT_IVEC(g, ai), di); + sji = IVEC2IS(di); + } + else if (pbc) + { + rvec xvi; + svi = pbc_rvec_sub(pbc, x[av], x[ai], xvi); + } + else + { + svi = CENTRAL; + } + + if (svi != CENTRAL || sji != CENTRAL) + { + rvec_dec(fshift[svi], fv); + fshift[CENTRAL][XX] += fv[XX] - fj[XX]; + fshift[CENTRAL][YY] += fv[YY] - fj[YY]; + fshift[CENTRAL][ZZ] += fv[ZZ] - fj[ZZ]; + fshift[ sji][XX] += fj[XX]; + fshift[ sji][YY] += fj[YY]; + fshift[ sji][ZZ] += fj[ZZ]; + } + } + + if (VirCorr) + { + /* When VirCorr=TRUE, the virial for the current forces is not + * calculated from the redistributed forces. This means that + * the effect of non-linear virtual site constructions on the virial + * needs to be added separately. This contribution can be calculated + * in many ways, but the simplest and cheapest way is to use + * the first constructing atom ai as a reference position in space: + * subtract (xv-xi)*fv and add (xj-xi)*fj. + */ + rvec xiv; + + pbc_rvec_sub(pbc, x[av], x[ai], xiv); + + for (int i = 0; i < DIM; i++) + { + for (int j = 0; j < DIM; j++) + { + /* As xix is a linear combination of j and k, use that here */ + dxdf[i][j] += -xiv[i]*fv[j] + xij[i]*fj[j]; + } + } + } + + /* TOTAL: 38 flops */ +} + static void spread_vsite3(const t_iatom ia[], real a, real b, const rvec x[], rvec f[], rvec fshift[], @@ -800,7 +926,7 @@ static void spread_vsite3FD(const t_iatom ia[], real a, real b, gmx_bool VirCorr, matrix dxdf, const t_pbc *pbc, const t_graph *g) { - real c, invl, fproj, a1; + real fproj, a1; rvec xvi, xij, xjk, xix, fv, temp; t_iatom av, ai, aj, ak; int svi, sji, skj; @@ -822,11 +948,11 @@ static void spread_vsite3FD(const t_iatom ia[], real a, real b, xix[ZZ] = xij[ZZ]+a*xjk[ZZ]; /* 6 flops */ - invl = gmx::invsqrt(iprod(xix, xix)); - c = b*invl; + const real invDistance = inverseNorm(xix); + const real c = b*invDistance; /* 4 + ?10? flops */ - fproj = iprod(xix, fv)*invl*invl; /* = (xix . f)/(xix . xix) */ + fproj = iprod(xix, fv)*invDistance*invDistance; /* = (xix . f)/(xix . xix) */ temp[XX] = c*(fv[XX]-fproj*xix[XX]); temp[YY] = c*(fv[YY]-fproj*xix[YY]); @@ -929,14 +1055,14 @@ static void spread_vsite3FAD(const t_iatom ia[], real a, real b, skj = pbc_rvec_sub(pbc, x[ak], x[aj], xjk); /* 6 flops */ - invdij = gmx::invsqrt(iprod(xij, xij)); + invdij = inverseNorm(xij); invdij2 = invdij * invdij; c1 = iprod(xij, xjk) * invdij2; xperp[XX] = xjk[XX] - c1*xij[XX]; xperp[YY] = xjk[YY] - c1*xij[YY]; xperp[ZZ] = xjk[ZZ] - c1*xij[ZZ]; /* xperp in plane ijk, perp. to ij */ - invdp = gmx::invsqrt(iprod(xperp, xperp)); + invdp = inverseNorm(xperp); a1 = a*invdij; b1 = b*invdp; /* 45 flops */ @@ -1122,7 +1248,7 @@ static void spread_vsite4FD(const t_iatom ia[], real a, real b, real c, gmx_bool VirCorr, matrix dxdf, const t_pbc *pbc, const t_graph *g) { - real d, invl, fproj, a1; + real fproj, a1; rvec xvi, xij, xjk, xjl, xix, fv, temp; int av, ai, aj, ak, al; ivec di; @@ -1146,13 +1272,13 @@ static void spread_vsite4FD(const t_iatom ia[], real a, real b, real c, } /* 12 flops */ - invl = gmx::invsqrt(iprod(xix, xix)); - d = c*invl; + const real invDistance = inverseNorm(xix); + const real d = c*invDistance; /* 4 + ?10? flops */ copy_rvec(f[av], fv); - fproj = iprod(xix, fv)*invl*invl; /* = (xix . f)/(xix . xix) */ + fproj = iprod(xix, fv)*invDistance*invDistance; /* = (xix . f)/(xix . xix) */ for (m = 0; m < DIM; m++) { @@ -1272,7 +1398,7 @@ static void spread_vsite4FDN(const t_iatom ia[], real a, real b, real c, cprod(rja, rjb, rm); /* 9 flops */ - invrm = gmx::invsqrt(norm2(rm)); + invrm = inverseNorm(rm); denom = invrm*invrm; /* 5+5+2 flops */ @@ -1482,6 +1608,9 @@ static void spread_vsite_f_thread(const rvec x[], case F_VSITE2: spread_vsite2(ia, a1, x, f, fshift, pbc_null2, g); break; + case F_VSITE2FD: + spread_vsite2FD(ia, a1, x, f, fshift, VirCorr, dxdf, pbc_null2, g); + break; case F_VSITE3: b1 = ip[tp].vsite.b; spread_vsite3(ia, a1, b1, x, f, fshift, pbc_null2, g); @@ -1740,6 +1869,7 @@ void spread_vsite_f(const gmx_vsite_t *vsite, } inc_nrnb(nrnb, eNR_VSITE2, vsite_count(idef->il, F_VSITE2)); + inc_nrnb(nrnb, eNR_VSITE2FD, vsite_count(idef->il, F_VSITE2FD)); inc_nrnb(nrnb, eNR_VSITE3, vsite_count(idef->il, F_VSITE3)); inc_nrnb(nrnb, eNR_VSITE3FD, vsite_count(idef->il, F_VSITE3FD)); inc_nrnb(nrnb, eNR_VSITE3FAD, vsite_count(idef->il, F_VSITE3FAD)); diff --git a/src/gromacs/topology/ifunc.cpp b/src/gromacs/topology/ifunc.cpp index 56346e70e9..ee60db622a 100644 --- a/src/gromacs/topology/ifunc.cpp +++ b/src/gromacs/topology/ifunc.cpp @@ -147,6 +147,7 @@ const t_interaction_function interaction_function[F_NRE] = def_shk ("CONSTRNC", "Constr. No Conn.", 2, 1, 1 ), def_shkcb ("SETTLE", "Settle", 3, 2, 0 ), def_vsite ("VSITE2", "Virtual site 2", 3, 1 ), + def_vsite ("VSITE2FD", "Virtual site 2fd", 3, 1 ), def_vsite ("VSITE3", "Virtual site 3", 4, 2 ), def_vsite ("VSITE3FD", "Virtual site 3fd", 4, 2 ), def_vsite ("VSITE3FAD", "Virtual site 3fad", 4, 2 ), diff --git a/src/gromacs/topology/ifunc.h b/src/gromacs/topology/ifunc.h index c3c1fffa43..4d4e5d3479 100644 --- a/src/gromacs/topology/ifunc.h +++ b/src/gromacs/topology/ifunc.h @@ -186,6 +186,7 @@ enum F_CONSTRNC, F_SETTLE, F_VSITE2, + F_VSITE2FD, F_VSITE3, F_VSITE3FD, F_VSITE3FAD, -- 2.22.0