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 GKEnergyGlobalSIMD {
52
53 private final GKSourceSIMD gkSource;
54 private final GKTensorGlobalSIMD gkMonopole;
55 private final GKTensorGlobalSIMD gkDipole;
56 private final GKTensorGlobalSIMD gkQuadrupole;
57
58 private final DoubleVector one = DoubleVector.zero(DoubleVector.SPECIES_PREFERRED).add(1.0);
59
60
61
62
63
64
65
66
67 public GKEnergyGlobalSIMD(double gkc, double epsilon, boolean gradient) {
68 int monopoleOrder = 2;
69 int dipoleOrder = 3;
70 int quadrupoleOrder = 4;
71 if (gradient) {
72 monopoleOrder = 3;
73 dipoleOrder = 4;
74 quadrupoleOrder = 5;
75 }
76 gkSource = new GKSourceSIMD(quadrupoleOrder, gkc);
77 gkMonopole = new GKTensorGlobalSIMD(MONOPOLE, monopoleOrder, gkSource, 1.0, epsilon);
78 gkDipole = new GKTensorGlobalSIMD(DIPOLE, dipoleOrder, gkSource, 1.0, epsilon);
79 gkQuadrupole = new GKTensorGlobalSIMD(QUADRUPOLE, quadrupoleOrder, gkSource, 1.0, epsilon);
80 }
81
82
83
84
85
86
87
88
89
90 public void initPotential(DoubleVector[] r, DoubleVector r2, DoubleVector rbi, DoubleVector rbk) {
91 gkSource.generateSource(POTENTIAL, QUADRUPOLE, r2, rbi, rbk);
92 gkMonopole.setR(r);
93 gkDipole.setR(r);
94 gkQuadrupole.setR(r);
95 gkMonopole.generateTensor();
96 gkDipole.generateTensor();
97 gkQuadrupole.generateTensor();
98 }
99
100
101
102
103
104
105
106
107
108 public void initBorn(DoubleVector[] r, DoubleVector r2, DoubleVector rbi, DoubleVector rbk) {
109 gkSource.generateSource(BORN, QUADRUPOLE, r2, rbi, rbk);
110 gkMonopole.setR(r);
111 gkDipole.setR(r);
112 gkQuadrupole.setR(r);
113 gkMonopole.generateTensor();
114 gkDipole.generateTensor();
115 gkQuadrupole.generateTensor();
116 }
117
118
119
120
121
122
123
124
125 public DoubleVector multipoleEnergy(PolarizableMultipoleSIMD mI, PolarizableMultipoleSIMD mK) {
126 DoubleVector em = gkMonopole.multipoleEnergy(mI, mK);
127 DoubleVector ed = gkDipole.multipoleEnergy(mI, mK);
128 DoubleVector eq = gkQuadrupole.multipoleEnergy(mI, mK);
129 return em.add(ed).add(eq);
130 }
131
132
133
134
135
136
137
138
139 public DoubleVector polarizationEnergy(PolarizableMultipoleSIMD mI, PolarizableMultipoleSIMD mK) {
140 DoubleVector emp = gkMonopole.polarizationEnergy(mI, mK);
141 DoubleVector edp = gkDipole.polarizationEnergy(mI, mK);
142 DoubleVector eqp = gkQuadrupole.polarizationEnergy(mI, mK);
143 return emp.add(edp).add(eqp);
144 }
145
146
147
148
149
150
151
152
153
154
155
156 public DoubleVector multipoleEnergyAndGradient(PolarizableMultipoleSIMD mI, PolarizableMultipoleSIMD mK,
157 DoubleVector[] gI, DoubleVector[] tI, DoubleVector[] tK) {
158 DoubleVector[] gK = new DoubleVector[3];
159 DoubleVector em = gkMonopole.multipoleEnergyAndGradient(mI, mK, gI, gK, tI, tK);
160 DoubleVector ed = gkDipole.multipoleEnergyAndGradient(mI, mK, gI, gK, tI, tK);
161 DoubleVector eq = gkQuadrupole.multipoleEnergyAndGradient(mI, mK, gI, gK, tI, tK);
162 return em.add(ed).add(eq);
163 }
164
165
166
167
168
169
170
171
172
173
174
175
176 public DoubleVector polarizationEnergyAndGradient(PolarizableMultipoleSIMD mI, PolarizableMultipoleSIMD mK, DoubleVector mutualMask,
177 DoubleVector[] gI, DoubleVector[] tI, DoubleVector[] tK) {
178 DoubleVector emp = gkMonopole.polarizationEnergyAndGradient(mI, mK, one, one, mutualMask, gI, tI, tK);
179 DoubleVector edp = gkDipole.polarizationEnergyAndGradient(mI, mK, one, one, mutualMask, gI, tI, tK);
180 DoubleVector eqp = gkQuadrupole.polarizationEnergyAndGradient(mI, mK, one, one, mutualMask, gI, tI, tK);
181
182 return emp.add(edp).add(eqp);
183 }
184
185
186
187
188
189
190
191
192 public DoubleVector multipoleEnergyBornGrad(PolarizableMultipoleSIMD mI, PolarizableMultipoleSIMD mK) {
193 DoubleVector db = gkMonopole.multipoleEnergyBornGrad(mI, mK);
194 db = db.add(gkDipole.multipoleEnergyBornGrad(mI, mK));
195 db = db.add(gkQuadrupole.multipoleEnergyBornGrad(mI, mK));
196 return db;
197 }
198
199
200
201
202
203
204
205
206
207 public DoubleVector polarizationEnergyBornGrad(PolarizableMultipoleSIMD mI, PolarizableMultipoleSIMD mK, boolean mutual) {
208
209 DoubleVector db = gkMonopole.polarizationEnergyBornGrad(mI, mK);
210 db = db.add(gkDipole.polarizationEnergyBornGrad(mI, mK));
211 db = db.add(gkQuadrupole.polarizationEnergyBornGrad(mI, mK));
212
213 if (mutual) {
214 db = db.add(gkDipole.mutualPolarizationEnergyBornGrad(mI, mK));
215 }
216 return db;
217 }
218
219 }