Tinker9 70bd052 (Thu Nov 9 12:11:35 2023 -0800)
Loading...
Searching...
No Matches
pair_field_chgpen.h
1#pragma once
2#include "ff/elec.h"
3#include "math/realn.h"
4#include "seq/add.h"
5#include "seq/damp.h"
6#include "seq/damp_hippo.h"
7
8namespace tinker {
9#pragma acc routine seq
10template <class ETYP>
12void pair_dfield_chgpen(real r2, real xr, real yr, real zr, real dscale,
13 real ci, real dix, real diy, real diz, real corei, real vali, real alphai,
14 real qixx, real qixy, real qixz, real qiyy, real qiyz, real qizz, real ck,
15 real dkx, real dky, real dkz, real corek, real valk, real alphak, real qkxx,
16 real qkxy, real qkxz, real qkyy, real qkyz, real qkzz, real aewald,
17 real& restrict fidx, real& restrict fidy, real& restrict fidz,
18 real& restrict fkdx, real& restrict fkdy, real& restrict fkdz)
19{
20 real r = REAL_SQRT(r2);
21 real invr1 = REAL_RECIP(r);
22 real rr2 = invr1 * invr1;
23
24 real bn[4];
25 real dmpi[4], dmpk[4];
26
27 damp_dir(dmpi, dmpk, r, alphai, alphak);
28
29 if CONSTEXPR (eq<ETYP, EWALD>()) damp_ewald<4>(bn, r, invr1, rr2, aewald);
30
31 real rr1 = invr1;
32 real rr3 = rr1 * rr2;
33 real rr5 = 3 * rr1 * rr2 * rr2;
34 real rr7 = 15 * rr1 * rr2 * rr2 * rr2;
35
36 real dir = dix * xr + diy * yr + diz * zr;
37 real qix = qixx * xr + qixy * yr + qixz * zr;
38 real qiy = qixy * xr + qiyy * yr + qiyz * zr;
39 real qiz = qixz * xr + qiyz * yr + qizz * zr;
40 real qir = qix * xr + qiy * yr + qiz * zr;
41 real dkr = dkx * xr + dky * yr + dkz * zr;
42 real qkx = qkxx * xr + qkxy * yr + qkxz * zr;
43 real qky = qkxy * xr + qkyy * yr + qkyz * zr;
44 real qkz = qkxz * xr + qkyz * yr + qkzz * zr;
45 real qkr = qkx * xr + qky * yr + qkz * zr;
46
47 real3 dixyz = make_real3(dix, diy, diz);
48 real3 dkxyz = make_real3(dkx, dky, dkz);
49 real3 qixyz = make_real3(qix, qiy, qiz);
50 real3 qkxyz = make_real3(qkx, qky, qkz);
51 real3 dr = make_real3(xr, yr, zr);
52 real c1;
53 real3 inci, inck;
54
55 // d-field
56 real rr3i, rr5i, rr7i;
57 real rr3k, rr5k, rr7k;
58 if CONSTEXPR (eq<ETYP, EWALD>()) {
59 rr3i = bn[1] - (1 - dscale * dmpi[1]) * rr3;
60 rr5i = bn[2] - (1 - dscale * dmpi[2]) * rr5;
61 rr7i = bn[3] - (1 - dscale * dmpi[3]) * rr7;
62 rr3k = bn[1] - (1 - dscale * dmpk[1]) * rr3;
63 rr5k = bn[2] - (1 - dscale * dmpk[2]) * rr5;
64 rr7k = bn[3] - (1 - dscale * dmpk[3]) * rr7;
65 rr3 = bn[1] - (1 - dscale) * rr3;
66 } else if CONSTEXPR (eq<ETYP, NON_EWALD>()) {
67 rr3i = dscale * dmpi[1] * rr3;
68 rr5i = dscale * dmpi[2] * rr5;
69 rr7i = dscale * dmpi[3] * rr7;
70 rr3k = dscale * dmpk[1] * rr3;
71 rr5k = dscale * dmpk[2] * rr5;
72 rr7k = dscale * dmpk[3] * rr7;
73 rr3 *= dscale;
74 }
75 c1 = -(rr3 * corek + rr3k * valk - rr5k * dkr + rr7k * qkr);
76 inci = c1 * dr - rr3k * dkxyz + 2 * rr5k * qkxyz;
77 fidx += inci.x;
78 fidy += inci.y;
79 fidz += inci.z;
80
81 c1 = (rr3 * corei + rr3i * vali + rr5i * dir + rr7i * qir);
82 inck = c1 * dr - rr3i * dixyz - 2 * rr5i * qixyz;
83 fkdx += inck.x;
84 fkdy += inck.y;
85 fkdz += inck.z;
86}
87
88#pragma acc routine seq
89template <class ETYP>
91void pair_ufield_chgpen(real r2, real xr, real yr, real zr, real wscale, //
92 real uindi0, real uindi1, real uindi2, //
93 real corei, real vali, real alphai, //
94 real uindk0, real uindk1, real uindk2, //
95 real corek, real valk, real alphak, //
96 real aewald, real& restrict fidx, real& restrict fidy, real& restrict fidz,
97 real& restrict fkdx, real& restrict fkdy, real& restrict fkdz)
98{
99 real r = REAL_SQRT(r2);
100 real invr1 = REAL_RECIP(r);
101 real rr2 = invr1 * invr1;
102
103 real bn[3];
104 real dmpik[3];
105 real scale3, scale5;
106 damp_mut(dmpik, r, alphai, alphak);
107 scale3 = wscale * dmpik[1];
108 scale5 = wscale * dmpik[2];
109
110 real rr1 = invr1;
111 real rr3 = rr1 * rr2;
112 real rr5 = rr1 * rr2 * rr2;
113
114 if CONSTEXPR (eq<ETYP, EWALD>()) {
115 damp_ewald<3>(bn, r, invr1, rr2, aewald);
116
117 bn[1] *= -1;
118 bn[1] += (1 - scale3) * rr3;
119 bn[2] -= 3 * (1 - scale5) * rr5;
120 } else if CONSTEXPR (eq<ETYP, NON_EWALD>()) {
121 bn[1] = -scale3 * rr3;
122 bn[2] = 3 * scale5 * rr5;
123 }
124
125 real coef;
126 real3 inci, inck;
127 real3 dr = make_real3(xr, yr, zr);
128 real3 uid = make_real3(uindi0, uindi1, uindi2);
129 real3 ukd = make_real3(uindk0, uindk1, uindk2);
130
131 coef = bn[2] * dot3(dr, ukd);
132 inci = coef * dr + bn[1] * ukd;
133 fidx += inci.x;
134 fidy += inci.y;
135 fidz += inci.z;
136
137 coef = bn[2] * dot3(dr, uid);
138 inck = coef * dr + bn[1] * uid;
139 fkdx += inck.x;
140 fkdy += inck.y;
141 fkdz += inck.z;
142}
143}
float x
Definition: acc/realndef.h:49
float y
Definition: acc/realndef.h:49
float z
Definition: acc/realndef.h:49
#define SEQ_CUDA
Definition: acc/seqdef.h:12
Definition: acc/realndef.h:48
#define restrict
Definition: macro.h:51
#define CONSTEXPR
Definition: macro.h:61
__device__ real dot3(real3 a, real3 b)
Definition: realn.h:84
float real
Definition: precision.h:80
Definition: testrt.h:9
__device__ void damp_mut(real *__restrict__ dmpik, real r, real alphai, real alphak)
Definition: damp_hippo.h:410
__device__ void damp_dir(real *__restrict__ dmpi, real *__restrict__ dmpk, real r, real alphai, real alphak)
Definition: damp_hippo.h:403
__device__ void pair_dfield_chgpen(real r2, real xr, real yr, real zr, real dscale, real ci, real dix, real diy, real diz, real corei, real vali, real alphai, real qixx, real qixy, real qixz, real qiyy, real qiyz, real qizz, real ck, real dkx, real dky, real dkz, real corek, real valk, real alphak, real qkxx, real qkxy, real qkxz, real qkyy, real qkyz, real qkzz, real aewald, real &__restrict__ fidx, real &__restrict__ fidy, real &__restrict__ fidz, real &__restrict__ fkdx, real &__restrict__ fkdy, real &__restrict__ fkdz)
Definition: pair_field_chgpen.h:12
__device__ void pair_ufield_chgpen(real r2, real xr, real yr, real zr, real wscale, real uindi0, real uindi1, real uindi2, real corei, real vali, real alphai, real uindk0, real uindk1, real uindk2, real corek, real valk, real alphak, real aewald, real &__restrict__ fidx, real &__restrict__ fidy, real &__restrict__ fidz, real &__restrict__ fkdx, real &__restrict__ fkdy, real &__restrict__ fkdz)
Definition: pair_field_chgpen.h:91