Tinker9 70bd052 (Thu Nov 9 12:11:35 2023 -0800)
Loading...
Searching...
No Matches
dampaplus.h
1#pragma once
2#include "math/libfunc.h"
3#include "seq/seq.h"
4
5namespace tinker {
6#pragma acc routine seq
7template <int ORDER>
9inline void damp_gordon2(real* restrict dmpik, real* restrict dmpi,
10 real* restrict dmpk, real r, real alphai, real alphak)
11{
12#if TINKER_REAL_SIZE == 8
13 real eps = 0.001;
14#elif TINKER_REAL_SIZE == 4
15 real eps = 0.05f;
16#endif
17
18 real diff = REAL_ABS(alphai - alphak);
19
20 if (diff < eps) alphai = 0.5f * (alphai + alphak);
21
22 real dampi = alphai * r;
23 real dampk = alphak * r;
24 real expi = REAL_EXP(-dampi);
25 real expk = REAL_EXP(-dampk);
26
27 real dampi2 = dampi * dampi;
28 real dampi3 = dampi * dampi2;
29
30 // divisions
31 const real div3 = 1 / ((real)3);
32 const real div15 = 1 / ((real)15);
33
34 // GORDON2
35 // core-valence
36 dmpi[0] = expi;
37 dmpi[1] = (1 + dampi) * expi;
38 dmpi[2] = (1 + dampi + dampi2 * div3) * expi;
39 dmpi[3] = (1 + dampi + 0.4f * dampi2 + dampi3 * div15) * expi;
40
41 if (diff < eps) {
42 dmpk[0] = dmpi[0];
43 dmpk[1] = dmpi[1];
44 dmpk[2] = dmpi[2];
45 dmpk[3] = dmpi[3];
46
47 // valence-valence
48 real dampi4 = dampi2 * dampi2;
49 real dampi5 = dampi2 * dampi3;
50 const real div6 = 1 / ((real)6);
51 const real div30 = 1 / ((real)30);
52 const real div105 = 1 / ((real)105);
53 const real div210 = 1 / ((real)210);
54
55 dmpik[0] = (1.0f + 0.5f * dampi) * expi;
56 dmpik[1] = (1.0f + dampi + 0.5f * dampi2) * expi;
57 dmpik[2] = (1.0f + dampi + 0.5f * dampi2 + dampi3 * div6) * expi;
58 dmpik[3] = (1.0f + dampi + 0.5f * dampi2 + dampi3 * div6 + dampi4 * div30)
59 * expi;
60 dmpik[4] = (1.0f + dampi + 0.5f * dampi2 + dampi3 * div6
61 + 4.0f * dampi4 * div105 + dampi5 * div210)
62 * expi;
63 if CONSTEXPR (ORDER > 9) {
64 real dampi6 = dampi3 * dampi3;
65 const real div126 = 1 / ((real)126);
66 const real div315 = 1 / ((real)315);
67 const real div1890 = 1 / ((real)1890);
68 dmpik[5] = (1.0f + dampi + 0.5f * dampi2 + dampi3 * div6
69 + 5.0f * dampi4 * div126 + 2.0f * dampi5 * div315
70 + dampi6 * div1890)
71 * expi;
72 }
73 } else {
74 real dampi2 = dampi * dampi;
75 real dampi3 = dampi * dampi2;
76 real dampi4 = dampi2 * dampi2;
77 real dampk2 = dampk * dampk;
78 real dampk3 = dampk * dampk2;
79 real dampk4 = dampk2 * dampk2;
80
81 const real div7 = 1 / ((real)7);
82 const real div21 = 1 / ((real)21);
83 const real div105 = 1 / ((real)105);
84 dmpk[0] = expk;
85 dmpk[1] = (1 + dampk) * expk;
86 dmpk[2] = (1 + dampk + dampk2 * div3) * expk;
87 dmpk[3] = (1 + dampk + 0.4f * dampk2 + dampk3 * div15) * expk;
88
89 // valence-valence
90 real alphai2 = alphai * alphai;
91 real alphak2 = alphak * alphak;
92 real alphaik = ((alphak + alphai) * (alphak - alphai));
93 real termi = alphak2 / alphaik;
94 real termk = -alphai2 / alphaik;
95
96 dmpik[0] = termi * expi + termk * expk;
97 dmpik[1] = termi * (1 + dampi) * expi + termk * (1 + dampk) * expk;
98 dmpik[2] = termi * (1 + dampi + dampi2 * div3) * expi
99 + termk * (1 + dampk + dampk2 * div3) * expk;
100 dmpik[3] = termi * (1 + dampi + 0.4f * dampi2 + dampi3 * div15) * expi
101 + termk * (1 + dampk + 0.4f * dampk2 + dampk3 * div15) * expk;
102 dmpik[4] = termi
103 * (1 + dampi + 3.0f * dampi2 * div7 + 2.0f * dampi3 * div21
104 + dampi4 * div105)
105 * expi
106 + termk
107 * (1 + dampk + 3.0f * dampk2 * div7 + 2.0f * dampk3 * div21
108 + dampk4 * div105)
109 * expk;
110
111 if CONSTEXPR (ORDER > 9) {
112 const real div9 = 1 / ((real)9);
113 const real div63 = 1 / ((real)63);
114 const real div945 = 1 / ((real)945);
115 real dampi5 = dampi2 * dampi3;
116 real dampk5 = dampk2 * dampk3;
117 dmpik[5] = termi
118 * (1 + dampi + 4.0f * dampi2 * div9 + dampi3 * div9
119 + dampi4 * div63 + dampi5 * div945)
120 * expi
121 + termk
122 * (1 + dampk + 4.0f * dampk2 * div9 + dampk3 * div9
123 + dampk4 * div63 + dampk5 * div945)
124 * expk;
125 }
126 }
127}
128
129// dfield aplus
131inline void damp_aplus3(real r, real pdi, real ddi, real pdk, real ddk,
132 real& restrict scale3, real& restrict scale5, real& restrict scale7)
133{
134 real pgamma = REAL_MIN(ddi, ddk);
135 real damp = pdi * pdk;
136 real ratio = r * REAL_RECIP(damp);
137 damp = (damp == 0 ? 0 : pgamma * REAL_SQRT(ratio * ratio * ratio));
138 real damp2 = damp * damp;
139 real expdamp = REAL_EXP(-damp);
140 scale3 = 1 - expdamp;
141 scale5 = 1 - expdamp * (1 + (real)0.5 * damp);
142 scale7 = 1 - expdamp * (1 + (real)0.65 * damp + (real)0.15 * damp2);
143}
144
146inline void damp_aplus3g(real r, real rr2, real xr, real yr, real zr, real pdi,
147 real ddi, real pdk, real ddk, real& restrict scale31, real& restrict scale51,
148 real& restrict scale71, real& restrict rc31, real& restrict rc32,
149 real& restrict rc33, real& restrict rc51, real& restrict rc52,
150 real& restrict rc53, real& restrict rc71, real& restrict rc72,
151 real& restrict rc73)
152{
153 real pgamma = REAL_MIN(ddi, ddk);
154 real damp = pdi * pdk;
155 real ratio = r * REAL_RECIP(damp);
156 damp = (damp == 0 ? 0 : pgamma * REAL_SQRT(ratio * ratio * ratio));
157 real damp2 = damp * damp;
158 scale31 = REAL_EXP(-damp);
159 scale51 = scale31 * (1 + (real)0.5 * damp);
160 scale71 = scale31 * (1 + (real)0.65 * damp + (real)0.15 * damp2);
161 real temp3 = (real)1.5 * damp * scale31 * rr2;
162 real temp5 = (real)0.5 * (1 + damp);
163 real temp7 = (real)0.7 + (real)0.15 * damp2 / temp5;
164 rc31 = xr * temp3;
165 rc32 = yr * temp3;
166 rc33 = zr * temp3;
167 rc51 = rc31 * temp5;
168 rc52 = rc32 * temp5;
169 rc53 = rc33 * temp5;
170 rc71 = rc51 * temp7;
171 rc72 = rc52 * temp7;
172 rc73 = rc53 * temp7;
173}
174}
#define SEQ_ROUTINE
Definition: acc/seqdef.h:7
#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
Definition: testrt.h:9
__device__ void damp_gordon2(real *__restrict__ dmpik, real *__restrict__ dmpi, real *__restrict__ dmpk, real r, real alphai, real alphak)
Definition: dampaplus.h:9
__device__ void damp_aplus3g(real r, real rr2, real xr, real yr, real zr, real pdi, real ddi, real pdk, real ddk, real &__restrict__ scale31, real &__restrict__ scale51, real &__restrict__ scale71, real &__restrict__ rc31, real &__restrict__ rc32, real &__restrict__ rc33, real &__restrict__ rc51, real &__restrict__ rc52, real &__restrict__ rc53, real &__restrict__ rc71, real &__restrict__ rc72, real &__restrict__ rc73)
Definition: dampaplus.h:146
__device__ void damp_aplus3(real r, real pdi, real ddi, real pdk, real ddk, real &__restrict__ scale3, real &__restrict__ scale5, real &__restrict__ scale7)
Definition: dampaplus.h:131