4
4
#include " math/switch.h"
5
5
#include " seq/add.h"
6
6
#include " seq/damp_hippodisp.h"
7
+ #include " seq/pair_vlambda.h"
7
8
#include " seq/seq.h"
8
9
9
10
namespace tinker {
10
11
#pragma acc routine seq
11
12
template <bool DO_G, class DTYP , int SCALE>
12
13
SEQ_CUDA
13
- void pair_disp_obsolete (real r, real r2, real rr1, //
14
- real dspscale, real aewald, real ci, real ai, real ck, real ak, real edcut,
15
- real edoff, real& restrict e, real& restrict de)
14
+ void pair_disp_obsolete (real r,
15
+ real r2,
16
+ real rr1,
17
+ real dspscale,
18
+ real aewald,
19
+ real ci,
20
+ real ai,
21
+ real ck,
22
+ real ak,
23
+ real edcut,
24
+ real edoff,
25
+ real& restrict e,
26
+ real& restrict de)
16
27
{
17
28
if (r > edoff) {
18
29
e = 0 ;
19
- if CONSTEXPR (DO_G) de = 0 ;
30
+ if CONSTEXPR (DO_G)
31
+ de = 0 ;
20
32
return ;
21
33
}
22
34
@@ -62,10 +74,12 @@ void pair_disp_obsolete(real r, real r2, real rr1, //
62
74
expi = REAL_EXP (-di);
63
75
real term = ((((di + 5 ) * di + 17 ) * di / 96 + 0 .5f ) * di + 1 ) * di + 1 ;
64
76
damp = 1 - term * expi;
65
- if CONSTEXPR (DO_G) ddamp = ai * expi * di2 * ((di2 - 3 ) * di - 3 ) / 96 ;
77
+ if CONSTEXPR (DO_G)
78
+ ddamp = ai * expi * di2 * ((di2 - 3 ) * di - 3 ) / 96 ;
66
79
}
67
80
68
- if CONSTEXPR (SCALE == 1 ) dspscale = 1 ;
81
+ if CONSTEXPR (SCALE == 1 )
82
+ dspscale = 1 ;
69
83
70
84
if CONSTEXPR (eq<DTYP, DEWALD>()) {
71
85
real ralpha2 = r2 * aewald * aewald;
@@ -75,8 +89,7 @@ void pair_disp_obsolete(real r, real r2, real rr1, //
75
89
e = -ci * ck * rr6 * (dspscale * damp * damp + expa - 1 );
76
90
if CONSTEXPR (DO_G) {
77
91
real rterm = -ralpha2 * ralpha2 * ralpha2 * rr1 * expterm;
78
- de = -6 * e * rr1
79
- - ci * ck * rr6 * (rterm + 2 * dspscale * damp * ddamp);
92
+ de = -6 * e * rr1 - ci * ck * rr6 * (rterm + 2 * dspscale * damp * ddamp);
80
93
}
81
94
} else if CONSTEXPR (eq<DTYP, NON_EWALD_TAPER>()) {
82
95
e = -ci * ck * rr6;
@@ -88,24 +101,38 @@ void pair_disp_obsolete(real r, real r2, real rr1, //
88
101
if (r > edcut) {
89
102
real taper, dtaper;
90
103
switchTaper5<DO_G>(r, edcut, edoff, taper, dtaper);
91
- if CONSTEXPR (DO_G) de = e * dtaper + de * taper;
104
+ if CONSTEXPR (DO_G)
105
+ de = e * dtaper + de * taper;
92
106
e = e * taper;
93
107
}
94
108
e *= dspscale;
95
- if CONSTEXPR (DO_G) de *= dspscale;
109
+ if CONSTEXPR (DO_G)
110
+ de *= dspscale;
96
111
}
97
112
}
98
113
99
114
#pragma acc routine seq
100
- template <bool DO_G, class DTYP , int SCALE>
115
+ template <bool DO_G, class DTYP , int SCALE, int SOFTCORE >
101
116
SEQ_CUDA
102
- void pair_disp (real r, real r2, real rr1, //
103
- real dspscale, real aewald, real ci, real ai, real ck, real ak, real edcut,
104
- real edoff, real& restrict e, real& restrict de)
117
+ void pair_disp (real r,
118
+ real r2,
119
+ real rr1,
120
+ real dspscale,
121
+ real aewald,
122
+ real ci,
123
+ real ai,
124
+ real ck,
125
+ real ak,
126
+ real vlambda,
127
+ real edcut,
128
+ real edoff,
129
+ real& restrict e,
130
+ real& restrict de)
105
131
{
106
132
if (r > edoff) {
107
133
e = 0 ;
108
- if CONSTEXPR (DO_G) de = 0 ;
134
+ if CONSTEXPR (DO_G)
135
+ de = 0 ;
109
136
return ;
110
137
}
111
138
@@ -114,9 +141,20 @@ void pair_disp(real r, real r2, real rr1, //
114
141
real dmpik[2 ], damp, ddamp;
115
142
damp_hippodisp<DO_G>(dmpik, r, rr1, ai, ak);
116
143
damp = dmpik[0 ];
117
- if CONSTEXPR (DO_G) ddamp = dmpik[1 ];
144
+ if CONSTEXPR (DO_G)
145
+ ddamp = dmpik[1 ];
146
+
147
+ if CONSTEXPR (SCALE == 1 )
148
+ dspscale = 1 ;
149
+
150
+ // set use of lambda scaling for decoupling or annihilation
151
+ if CONSTEXPR (SOFTCORE) {
152
+ real vlambda2 = vlambda * vlambda;
153
+ real vlambda3 = vlambda2 * vlambda;
154
+ real vterm = (vlambda2 * vlambda2) / REAL_SQRT (1.0 + vlambda2 - vlambda3);
155
+ dspscale *= vterm;
156
+ }
118
157
119
- if CONSTEXPR (SCALE == 1 ) dspscale = 1 ;
120
158
if CONSTEXPR (eq<DTYP, DEWALD>()) {
121
159
real ralpha2 = r2 * aewald * aewald;
122
160
real term = 1 + ralpha2 + 0 .5f * ralpha2 * ralpha2;
@@ -125,8 +163,7 @@ void pair_disp(real r, real r2, real rr1, //
125
163
e = -ci * ck * rr6 * (dspscale * damp * damp + expa - 1 );
126
164
if CONSTEXPR (DO_G) {
127
165
real rterm = -ralpha2 * ralpha2 * ralpha2 * rr1 * expterm;
128
- de = -6 * e * rr1
129
- - ci * ck * rr6 * (rterm + 2 * dspscale * damp * ddamp);
166
+ de = -6 * e * rr1 - ci * ck * rr6 * (rterm + 2 * dspscale * damp * ddamp);
130
167
}
131
168
} else if CONSTEXPR (eq<DTYP, NON_EWALD_TAPER>()) {
132
169
e = -ci * ck * rr6;
@@ -138,11 +175,13 @@ void pair_disp(real r, real r2, real rr1, //
138
175
if (r > edcut) {
139
176
real taper, dtaper;
140
177
switchTaper5<DO_G>(r, edcut, edoff, taper, dtaper);
141
- if CONSTEXPR (DO_G) de = e * dtaper + de * taper;
178
+ if CONSTEXPR (DO_G)
179
+ de = e * dtaper + de * taper;
142
180
e = e * taper;
143
181
}
144
182
e *= dspscale;
145
- if CONSTEXPR (DO_G) de *= dspscale;
183
+ if CONSTEXPR (DO_G)
184
+ de *= dspscale;
146
185
}
147
186
}
148
187
}
0 commit comments