Tinker9 70bd052 (Thu Nov 9 12:11:35 2023 -0800)
Loading...
Searching...
No Matches
pair_lj.h
1#pragma once
2#include "math/libfunc.h"
3#include "seq/pair_vlambda.h"
4
5namespace tinker {
9#pragma acc routine seq
10template <bool DO_G, bool SOFTCORE>
12void pair_lj_v0(real r, real invr, real vlambda, real rad, real eps,
14{
15 if CONSTEXPR (SOFTCORE) {
16 if (rad == 0) {
17 ev = 0;
18 if CONSTEXPR (DO_G) dev = 0;
19 return;
20 }
21 real sig = invr * rad;
22 real sig2 = sig * sig;
23 real p6 = 1 / (sig2 * sig2 * sig2);
24 p6 = p6 * 2;
25 real sc = p6 + (1 - vlambda) / 2;
26 real invsc = 1 / sc;
27 real term = 4 * vlambda * eps * invsc * invsc;
28 ev = term * (1 - sc);
29 if CONSTEXPR (DO_G) {
30 real dterm = -6 * p6 * term * invr;
31 dev = dterm * (2 * invsc - 1);
32 }
33 } else {
34 real sig = invr * rad;
35 real sig2 = sig * sig;
36 real p6 = sig2 * sig2 * sig2;
37 real ep6 = eps * p6;
38 ev = ep6 * (p6 - 2);
39 if CONSTEXPR (DO_G) dev = ep6 * (p6 - 1) * (-12 * invr);
40 }
41}
42
46#pragma acc routine seq
47template <bool DO_G, bool SOFTCORE>
49void pair_lj_v1(real rik, real vlambda, real rv, real eps, real vscalek,
50 real& restrict e, real& restrict de)
51{
52 eps *= vscalek;
53 pair_lj_v0<DO_G, SOFTCORE>(rik, 1 / rik, vlambda, rv, eps, e, de);
54}
55
59#pragma acc routine seq
60template <bool DO_G, bool SOFTCORE, class RADRULE, class EPSRULE, int SCALE>
62void pair_lj_v2(real r, real invr, real vlambda, //
63 real vscale, real radi, real epsi, real radk, real epsk, real evcut,
64 real evoff, real& restrict ev, real& restrict dev)
65{
66 if (r > evoff) {
67 ev = 0;
68 if CONSTEXPR (DO_G) dev = 0;
69 return;
70 }
71 real rad = RADRULE::avg(radi, radk);
72 real eps = EPSRULE::savg(epsi, epsk);
73 if CONSTEXPR (SCALE != 1) eps *= vscale;
74 pair_lj_v0<DO_G, SOFTCORE>(r, invr, vlambda, rad, eps, ev, dev);
75 // taper
76 if (r > evcut) {
77 real taper, dtaper;
78 switchTaper5<DO_G>(r, evcut, evoff, taper, dtaper);
79 if CONSTEXPR (DO_G) dev = ev * dtaper + dev * taper;
80 ev = ev * taper;
81 }
82}
83
87#pragma acc routine seq
88template <bool DO_G, bool SOFTCORE, int SCALE>
90void pair_lj_v3(real r, real invr, real vlambda, //
91 real vscale, real rad, real eps, real evcut, real evoff, real& restrict ev,
92 real& restrict dev)
93{
94 if CONSTEXPR (SCALE != 1) { eps *= vscale; }
95 pair_lj_v0<DO_G, SOFTCORE>(r, invr, vlambda, rad, eps, ev, dev);
96 // taper
97 if (r > evcut) {
98 real taper, dtaper;
99 switchTaper5<DO_G>(r, evcut, evoff, taper, dtaper);
100 if CONSTEXPR (DO_G) dev = ev * dtaper + dev * taper;
101 ev = ev * taper;
102 }
103}
104}
#define SEQ_CUDA
Definition: acc/seqdef.h:12
#define restrict
Definition: macro.h:51
#define CONSTEXPR
Definition: macro.h:61
float real
Definition: precision.h:80
__device__ void pair_lj_v0(real r, real invr, real vlambda, real rad, real eps, real &__restrict__ ev, real &__restrict__ dev)
Definition: pair_lj.h:12
__device__ void pair_lj_v3(real r, real invr, real vlambda, real vscale, real rad, real eps, real evcut, real evoff, real &__restrict__ ev, real &__restrict__ dev)
Definition: pair_lj.h:90
__device__ void pair_lj_v2(real r, real invr, real vlambda, real vscale, real radi, real epsi, real radk, real epsk, real evcut, real evoff, real &__restrict__ ev, real &__restrict__ dev)
Definition: pair_lj.h:62
__device__ void pair_lj_v1(real rik, real vlambda, real rv, real eps, real vscalek, real &__restrict__ e, real &__restrict__ de)
Definition: pair_lj.h:49
Definition: testrt.h:9
EnergyBuffer ev