1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38 package ffx.numerics.multipole;
39
40 import jdk.incubator.vector.DoubleVector;
41
42 import static ffx.numerics.multipole.GKMultipoleOrder.DIPOLE;
43 import static ffx.numerics.multipole.GKMultipoleOrder.MONOPOLE;
44 import static ffx.numerics.multipole.GKMultipoleOrder.QUADRUPOLE;
45 import static ffx.numerics.multipole.GKTensorMode.BORN;
46 import static ffx.numerics.multipole.GKTensorMode.POTENTIAL;
47
48
49
50
51 public class GKEnergyQISIMD {
52
53 private final GKSourceSIMD gkSource;
54 private final GKTensorQISIMD gkMonopole;
55 private final GKTensorQISIMD gkDipole;
56 private final GKTensorQISIMD gkQuadrupole;
57
58 private final DoubleVector one = DoubleVector.zero(DoubleVector.SPECIES_PREFERRED).add(1.0);
59
60
61
62
63
64
65
66
67
68 public GKEnergyQISIMD(double soluteDielectric, double solventDielectric, double gkc, boolean gradient) {
69 int monopoleOrder = 2;
70 int dipoleOrder = 3;
71 int quadrupoleOrder = 4;
72 if (gradient) {
73 monopoleOrder = 3;
74 dipoleOrder = 4;
75 quadrupoleOrder = 5;
76 }
77 gkSource = new GKSourceSIMD(quadrupoleOrder, gkc);
78 gkMonopole = new GKTensorQISIMD(MONOPOLE, monopoleOrder, gkSource, soluteDielectric, solventDielectric);
79 gkDipole = new GKTensorQISIMD(DIPOLE, dipoleOrder, gkSource, soluteDielectric, solventDielectric);
80 gkQuadrupole = new GKTensorQISIMD(QUADRUPOLE, quadrupoleOrder, gkSource, soluteDielectric, solventDielectric);
81 }
82
83
84
85
86
87
88
89
90
91 public void initPotential(DoubleVector[] r, DoubleVector r2, DoubleVector rbi, DoubleVector rbk) {
92 gkSource.generateSource(POTENTIAL, QUADRUPOLE, r2, rbi, rbk);
93 gkMonopole.setR(r);
94 gkDipole.setR(r);
95 gkQuadrupole.setR(r);
96 gkMonopole.generateTensor();
97 gkDipole.generateTensor();
98 gkQuadrupole.generateTensor();
99 }
100
101
102
103
104
105
106
107
108
109 public void initBorn(DoubleVector[] r, DoubleVector r2, DoubleVector rbi, DoubleVector rbk) {
110 gkSource.generateSource(BORN, QUADRUPOLE, r2, rbi, rbk);
111 gkMonopole.setR(r);
112 gkDipole.setR(r);
113 gkQuadrupole.setR(r);
114 gkMonopole.generateTensor();
115 gkDipole.generateTensor();
116 gkQuadrupole.generateTensor();
117 }
118
119
120
121
122
123
124
125
126 public DoubleVector multipoleEnergy(PolarizableMultipoleSIMD mI, PolarizableMultipoleSIMD mK) {
127 DoubleVector em = gkMonopole.multipoleEnergy(mI, mK);
128 DoubleVector ed = gkDipole.multipoleEnergy(mI, mK);
129 DoubleVector eq = gkQuadrupole.multipoleEnergy(mI, mK);
130 return em.add(ed).add(eq);
131 }
132
133
134
135
136
137
138
139
140 public DoubleVector polarizationEnergy(PolarizableMultipoleSIMD mI, PolarizableMultipoleSIMD mK) {
141 DoubleVector emp = gkMonopole.polarizationEnergy(mI, mK);
142 DoubleVector edp = gkDipole.polarizationEnergy(mI, mK);
143 DoubleVector eqp = gkQuadrupole.polarizationEnergy(mI, mK);
144 return emp.add(edp).add(eqp);
145 }
146
147
148
149
150
151
152
153
154
155
156
157 public DoubleVector multipoleEnergyAndGradient(PolarizableMultipoleSIMD mI, PolarizableMultipoleSIMD mK,
158 DoubleVector[] gI, DoubleVector[] tI, DoubleVector[] tK) {
159 DoubleVector[] gK = new DoubleVector[3];
160 DoubleVector em = gkMonopole.multipoleEnergyAndGradient(mI, mK, gI, gK, tI, tK);
161 DoubleVector ed = gkDipole.multipoleEnergyAndGradient(mI, mK, gI, gK, tI, tK);
162 DoubleVector eq = gkQuadrupole.multipoleEnergyAndGradient(mI, mK, gI, gK, tI, tK);
163 return em.add(ed).add(eq);
164 }
165
166
167
168
169
170
171
172
173
174
175
176
177 public DoubleVector polarizationEnergyAndGradient(PolarizableMultipoleSIMD mI, PolarizableMultipoleSIMD mK, DoubleVector mutualMask,
178 DoubleVector[] gI, DoubleVector[] tI, DoubleVector[] tK) {
179 DoubleVector emp = gkMonopole.polarizationEnergyAndGradient(mI, mK, one, one, mutualMask, gI, tI, tK);
180 DoubleVector edp = gkDipole.polarizationEnergyAndGradient(mI, mK, one, one, mutualMask, gI, tI, tK);
181 DoubleVector eqp = gkQuadrupole.polarizationEnergyAndGradient(mI, mK, one, one, mutualMask, gI, tI, tK);
182
183 return emp.add(edp).add(eqp);
184 }
185
186
187
188
189
190
191
192
193 public DoubleVector multipoleEnergyBornGrad(PolarizableMultipoleSIMD mI, PolarizableMultipoleSIMD mK) {
194 DoubleVector db = gkMonopole.multipoleEnergyBornGrad(mI, mK);
195 db = db.add(gkDipole.multipoleEnergyBornGrad(mI, mK));
196 db = db.add(gkQuadrupole.multipoleEnergyBornGrad(mI, mK));
197 return db;
198 }
199
200
201
202
203
204
205
206
207
208 public DoubleVector polarizationEnergyBornGrad(PolarizableMultipoleSIMD mI, PolarizableMultipoleSIMD mK, boolean mutual) {
209
210 DoubleVector db = gkMonopole.polarizationEnergyBornGrad(mI, mK);
211 db = db.add(gkDipole.polarizationEnergyBornGrad(mI, mK));
212 db = db.add(gkQuadrupole.polarizationEnergyBornGrad(mI, mK));
213
214 if (mutual) {
215 db = db.add(gkDipole.mutualPolarizationEnergyBornGrad(mI, mK));
216 }
217 return db;
218 }
219
220 }