11#include " ff/amoeba/induce.h"
22#include " ff/amoebamod.h"
3+ #include " ff/cuinduce.h"
34#include " ff/switch.h"
45#include " seq/launch.h"
56#include " tool/error.h"
1011#include < tinker/detail/units.hh>
1112
1213namespace 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-
4314__global__
4415void pcgRsd0 (
4516 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, //
8152{
8253 real kaval = *ka, kapval = *kap;
8354 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 ;
8857 for (int i = ITHREAD; i < n; i += STRIDE) {
8958 #pragma unroll
9059 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
11180{
11281 real kaval = *ksum, kapval = *ksump;
11382 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 ;
11885 for (int i = ITHREAD; i < n; i += STRIDE) {
11986 #pragma unroll
12087 for (int j = 0 ; j < 3 ; ++j) {
@@ -162,7 +129,7 @@ void induceMutualPcg1_cu(real (*uind)[3], real (*uinp)[3])
162129 // get the electrostatic field due to permanent multipoles
163130 dfield (field, fieldp);
164131 // 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);
166133
167134 // initial induced dipole
168135 if (predict) {
@@ -188,7 +155,7 @@ void induceMutualPcg1_cu(real (*uind)[3], real (*uinp)[3])
188155 if (predict) {
189156 ufield (uind, uinp, field, fieldp);
190157 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);
192159 } else if (dirguess) {
193160 ufield (udir, udirp, rsd, rsdp);
194161 } else {
@@ -285,17 +252,12 @@ void induceMutualPcg1_cu(real (*uind)[3], real (*uinp)[3])
285252 print (stdout, " %8d %-16.10f\n " , iter, eps);
286253 }
287254
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 ;
294258
295259 // 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);
299261 }
300262
301263 // print the results from the conjugate gradient iteration
0 commit comments