1
1
#include " ff/amoeba/induce.h"
2
2
#include " ff/amoebamod.h"
3
+ #include " ff/cuinduce.h"
3
4
#include " ff/switch.h"
4
5
#include " seq/launch.h"
5
6
#include " tool/error.h"
10
11
#include < tinker/detail/units.hh>
11
12
12
13
namespace tinker {
13
- __global__
14
- void pcgUdir (int n, const real* restrict polarity, real (*restrict udir)[3],
15
- real (*restrict udirp)[3], const real (*restrict field)[3], const real (*restrict fieldp)[3])
16
- {
17
- for (int i = ITHREAD; i < n; i += STRIDE) {
18
- real poli = polarity[i];
19
- #pragma unroll
20
- for (int j = 0 ; j < 3 ; ++j) {
21
- udir[i][j] = poli * field[i][j];
22
- udirp[i][j] = poli * fieldp[i][j];
23
- }
24
- }
25
- }
26
-
27
- __global__
28
- void pcgRsd (int n, const real* restrict polarity_inv, //
29
- real (*restrict rsd)[3], real (*restrict rsp)[3], //
30
- const real (*restrict udir)[3], const real (*restrict udip)[3], const real (*restrict uind)[3],
31
- const real (*restrict uinp)[3], const real (*restrict field)[3], const real (*restrict fielp)[3])
32
- {
33
- for (int i = ITHREAD; i < n; i += STRIDE) {
34
- real poli_inv = polarity_inv[i];
35
- #pragma unroll
36
- for (int j = 0 ; j < 3 ; ++j) {
37
- rsd[i][j] = (udir[i][j] - uind[i][j]) * poli_inv + field[i][j];
38
- rsp[i][j] = (udip[i][j] - uinp[i][j]) * poli_inv + fielp[i][j];
39
- }
40
- }
41
- }
42
-
43
14
__global__
44
15
void pcgRsd0 (
45
16
int n, const real* restrict polarity, real (*restrict rsd)[3], real (*restrict rsdp)[3])
@@ -81,10 +52,8 @@ void pcgP2(int n, const real* restrict polarity, //
81
52
{
82
53
real kaval = *ka, kapval = *kap;
83
54
real a = *ksum / kaval, ap = *ksump / kapval;
84
- if (kaval == 0 )
85
- a = 0 ;
86
- if (kapval == 0 )
87
- ap = 0 ;
55
+ if (kaval == 0 ) a = 0 ;
56
+ if (kapval == 0 ) ap = 0 ;
88
57
for (int i = ITHREAD; i < n; i += STRIDE) {
89
58
#pragma unroll
90
59
for (int j = 0 ; j < 3 ; ++j) {
@@ -111,10 +80,8 @@ void pcgP3(int n, const real* restrict ksum, const real* restrict ksump, const r
111
80
{
112
81
real kaval = *ksum, kapval = *ksump;
113
82
real b = *ksum1 / kaval, bp = *ksump1 / kapval;
114
- if (kaval == 0 )
115
- b = 0 ;
116
- if (kapval == 0 )
117
- bp = 0 ;
83
+ if (kaval == 0 ) b = 0 ;
84
+ if (kapval == 0 ) bp = 0 ;
118
85
for (int i = ITHREAD; i < n; i += STRIDE) {
119
86
#pragma unroll
120
87
for (int j = 0 ; j < 3 ; ++j) {
@@ -162,7 +129,7 @@ void induceMutualPcg1_cu(real (*uind)[3], real (*uinp)[3])
162
129
// get the electrostatic field due to permanent multipoles
163
130
dfield (field, fieldp);
164
131
// direct induced dipoles
165
- launch_k1s (g::s0, n, pcgUdir , n, polarity, udir, udirp, field, fieldp);
132
+ launch_k1s (g::s0, n, pcgUdirV2 , n, polarity, udir, udirp, field, fieldp);
166
133
167
134
// initial induced dipole
168
135
if (predict) {
@@ -188,7 +155,7 @@ void induceMutualPcg1_cu(real (*uind)[3], real (*uinp)[3])
188
155
if (predict) {
189
156
ufield (uind, uinp, field, fieldp);
190
157
launch_k1s (
191
- g::s0, n, pcgRsd , n, polarity_inv, rsd, rsdp, udir, udirp, uind, uinp, field, fieldp);
158
+ g::s0, n, pcgRsd0V2 , n, polarity_inv, rsd, rsdp, udir, udirp, uind, uinp, field, fieldp);
192
159
} else if (dirguess) {
193
160
ufield (udir, udirp, rsd, rsdp);
194
161
} else {
@@ -285,17 +252,12 @@ void induceMutualPcg1_cu(real (*uind)[3], real (*uinp)[3])
285
252
print (stdout, " %8d %-16.10f\n " , iter, eps);
286
253
}
287
254
288
- if (eps < poleps)
289
- done = true ;
290
- if (eps > epsold)
291
- done = true ;
292
- if (iter >= politer)
293
- done = true ;
255
+ if (eps < poleps) done = true ;
256
+ if (eps > epsold) done = true ;
257
+ if (iter >= politer) done = true ;
294
258
295
259
// apply a "peek" iteration to the mutual induced dipoles
296
- if (done) {
297
- launch_k1s (g::s0, n, pcgPeek, n, pcgpeek, polarity, uind, uinp, rsd, rsdp);
298
- }
260
+ if (done) launch_k1s (g::s0, n, pcgPeek, n, pcgpeek, polarity, uind, uinp, rsd, rsdp);
299
261
}
300
262
301
263
// print the results from the conjugate gradient iteration
0 commit comments