ls1-MarDyn
ls1-MarDyn molecular dynamics code
VectorizedCellProcessor.h
Go to the documentation of this file.
1
7#ifndef VECTORIZEDCELLPROCESSOR_H_
8#define VECTORIZEDCELLPROCESSOR_H_
9
10#include "CellProcessor.h"
11#include "utils/AlignedArray.h"
12#include <iostream>
13#include <vector>
14#include <cmath>
16#include "vectorization/SIMD_VectorizedCellProcessorHelpers.h"
17#include "WrapOpenMP.h"
18
19#include "molecules/MoleculeForwardDeclaration.h"
20class Component;
21class Domain;
22class Comp2Param;
23class CellDataSoA;
24
30 friend class VCP1CLJRMMTest;
31public:
32 typedef std::vector<Component> ComponentList;
33
34 VectorizedCellProcessor& operator=(const VectorizedCellProcessor&) = delete;
35
40 VectorizedCellProcessor(Domain & domain, double cutoffRadius, double LJcutoffRadius);
41
43
47 void initTraversal();
51 void preprocessCell(ParticleCell& /*cell*/) {}
52
53 double processSingleMolecule(Molecule* /*m1*/, ParticleCell& /*cell2*/) {
54 return 0.0;
55 }
56
60 void processCell(ParticleCell& cell);
61
62 void processCellPair(ParticleCell& cell1, ParticleCell& cell2, bool sumAll = false);
63
67 void postprocessCell(ParticleCell& /*cell*/) {}
71 void endTraversal();
72
73
74private:
78 typedef std::vector<Molecule *> MoleculeList;
82 Domain & _domain;
83
87 //const double _cutoffRadiusSquare;
88
92 //const double _LJcutoffRadiusSquare;
93
97 const double _epsRFInvrc3;
98
112 std::vector<AlignedArray<vcp_real_calc> > _eps_sig;
118 std::vector<AlignedArray<vcp_real_calc> > _shift6;
123 double _upot6lj;
124
128 double _upotXpoles;
129
133 double _virial;
134
138 double _myRF;
139
140 struct VLJCPThreadData {
141 public:
142 VLJCPThreadData(): _ljc_dist_lookup(nullptr), _charges_dist_lookup(nullptr), _dipoles_dist_lookup(nullptr), _quadrupoles_dist_lookup(nullptr){
143 _upot6ljV.resize(_numVectorElements);
144 _upotXpolesV.resize(_numVectorElements);
145 _virialV.resize(_numVectorElements);
146 _myRFV.resize(_numVectorElements);
147
148 for (size_t j = 0; j < _numVectorElements; ++j) {
149 _upot6ljV[j] = 0.0;
150 _upotXpolesV[j] = 0.0;
151 _virialV[j] = 0.0;
152 _myRFV[j] = 0.0;
153 }
154 }
155
161 AlignedArray<vcp_lookupOrMask_single> _centers_dist_lookup;
162
166 vcp_lookupOrMask_single* _ljc_dist_lookup;
167
171 vcp_lookupOrMask_single* _charges_dist_lookup;
172
176 vcp_lookupOrMask_single* _dipoles_dist_lookup;
177
181 vcp_lookupOrMask_single* _quadrupoles_dist_lookup;
182
183 AlignedArray<vcp_real_accum> _upot6ljV, _upotXpolesV, _virialV, _myRFV;
184 };
185
186 std::vector<VLJCPThreadData *> _threadData;
187
188 static const size_t _numVectorElements = VCP_VEC_SIZE;
189 size_t _numThreads;
190
191 template<bool calculateMacroscopic>
192 inline void _loopBodyLJ(
193 const RealCalcVec& m1_r_x, const RealCalcVec& m1_r_y, const RealCalcVec& m1_r_z,
194 const RealCalcVec& r1_x, const RealCalcVec& r1_y, const RealCalcVec& r1_z,
195 const RealCalcVec& m2_r_x, const RealCalcVec& m2_r_y, const RealCalcVec& m2_r_z,
196 const RealCalcVec& r2_x, const RealCalcVec& r2_y, const RealCalcVec& r2_z,
197 RealCalcVec& f_x, RealCalcVec& f_y, RealCalcVec& f_z,
198 RealAccumVec& V_x, RealAccumVec& V_y, RealAccumVec& V_z,
199 RealAccumVec& sum_upot6lj, RealAccumVec& sum_virial,
200 const MaskCalcVec& forceMask,
201 const RealCalcVec& eps_24, const RealCalcVec& sig2,
202 const RealCalcVec& shift6);
203
204 template<bool calculateMacroscopic>
205 inline void _loopBodyCharge(
206 const RealCalcVec& m1_r_x, const RealCalcVec& m1_r_y, const RealCalcVec& m1_r_z,
207 const RealCalcVec& r1_x, const RealCalcVec& r1_y, const RealCalcVec& r1_z,
208 const RealCalcVec& qii,
209 const RealCalcVec& m2_r_x, const RealCalcVec& m2_r_y, const RealCalcVec& m2_r_z,
210 const RealCalcVec& r2_x, const RealCalcVec& r2_y, const RealCalcVec& r2_z,
211 const RealCalcVec& qjj,
212 RealCalcVec& f_x, RealCalcVec& f_y, RealCalcVec& f_z,
213 RealAccumVec& V_x, RealAccumVec& V_y, RealAccumVec& V_z,
214 RealAccumVec& sum_upotXpoles, RealAccumVec& sum_virial,
215 const MaskCalcVec& forceMask);
216
217 template<bool calculateMacroscopic>
218 inline void _loopBodyChargeDipole(
219 const RealCalcVec& m1_r_x, const RealCalcVec& m1_r_y, const RealCalcVec& m1_r_z,
220 const RealCalcVec& r1_x, const RealCalcVec& r1_y, const RealCalcVec& r1_z,
221 const RealCalcVec& q,
222 const RealCalcVec& m2_r_x, const RealCalcVec& m2_r_y, const RealCalcVec& m2_r_z,
223 const RealCalcVec& r2_x, const RealCalcVec& r2_y, const RealCalcVec& r2_z,
224 const RealCalcVec& e_x, const RealCalcVec& e_y, const RealCalcVec& e_z,
225 const RealCalcVec& p,
226 RealCalcVec& f_x, RealCalcVec& f_y, RealCalcVec& f_z,
227 RealAccumVec& V_x, RealAccumVec& V_y, RealAccumVec& V_z,
228 RealAccumVec& M_x, RealAccumVec& M_y, RealAccumVec& M_z,
229 RealAccumVec& sum_upotXpoles, RealAccumVec& sum_virial,
230 const MaskCalcVec& forceMask);
231
232 template<bool calculateMacroscopic>
233 inline void _loopBodyDipole(
234 const RealCalcVec& m1_r_x, const RealCalcVec& m1_r_y, const RealCalcVec& m1_r_z,
235 const RealCalcVec& r1_x, const RealCalcVec& r1_y, const RealCalcVec& r1_z,
236 const RealCalcVec& eii_x, const RealCalcVec& eii_y, const RealCalcVec& eii_z,
237 const RealCalcVec& pii,
238 const RealCalcVec& m2_r_x, const RealCalcVec& m2_r_y, const RealCalcVec& m2_r_z,
239 const RealCalcVec& r2_x, const RealCalcVec& r2_y, const RealCalcVec& r2_z,
240 const RealCalcVec& ejj_x, const RealCalcVec& ejj_y, const RealCalcVec& ejj_z,
241 const RealCalcVec& pjj,
242 RealCalcVec& f_x, RealCalcVec& f_y, RealCalcVec& f_z,
243 RealAccumVec& V_x, RealAccumVec& V_y, RealAccumVec& V_z,
244 RealAccumVec& M1_x, RealAccumVec& M1_y, RealAccumVec& M1_z,
245 RealAccumVec& M2_x, RealAccumVec& M2_y, RealAccumVec& M2_z,
246 RealAccumVec& sum_upotXpoles, RealAccumVec& sum_virial, RealAccumVec& sum_myRF,
247 const MaskCalcVec& forceMask,
248 const RealCalcVec& epsRFInvrc3);
249
250 template<bool calculateMacroscopic>
251 inline void _loopBodyChargeQuadrupole(
252 const RealCalcVec& m1_r_x, const RealCalcVec& m1_r_y, const RealCalcVec& m1_r_z,
253 const RealCalcVec& r1_x, const RealCalcVec& r1_y, const RealCalcVec& r1_z,
254 const RealCalcVec& q,
255 const RealCalcVec& m2_r_x, const RealCalcVec& m2_r_y, const RealCalcVec& m2_r_z,
256 const RealCalcVec& r2_x, const RealCalcVec& r2_y, const RealCalcVec& r2_z,
257 const RealCalcVec& ejj_x, const RealCalcVec& ejj_y, const RealCalcVec& ejj_z,
258 const RealCalcVec& m,
259 RealCalcVec& f_x, RealCalcVec& f_y, RealCalcVec& f_z,
260 RealAccumVec& V_x, RealAccumVec& V_y, RealAccumVec& V_z,
261 RealAccumVec& M_x, RealAccumVec& M_y, RealAccumVec& M_z,
262 RealAccumVec& sum_upotXpoles, RealAccumVec& sum_virial,
263 const MaskCalcVec& forceMask);
264
265 template<bool calculateMacroscopic>
266 inline void _loopBodyDipoleQuadrupole(
267 const RealCalcVec& m1_r_x, const RealCalcVec& m1_r_y, const RealCalcVec& m1_r_z,
268 const RealCalcVec& r1_x, const RealCalcVec& r1_y, const RealCalcVec& r1_z,
269 const RealCalcVec& eii_x, const RealCalcVec& eii_y, const RealCalcVec& eii_z,
270 const RealCalcVec& p,
271 const RealCalcVec& m2_r_x, const RealCalcVec& m2_r_y, const RealCalcVec& m2_r_z,
272 const RealCalcVec& r2_x, const RealCalcVec& r2_y, const RealCalcVec& r2_z,
273 const RealCalcVec& ejj_x, const RealCalcVec& ejj_y, const RealCalcVec& ejj_z,
274 const RealCalcVec& m,
275 RealCalcVec& f_x, RealCalcVec& f_y, RealCalcVec& f_z,
276 RealAccumVec& V_x, RealAccumVec& V_y, RealAccumVec& V_z,
277 RealAccumVec& M1_x, RealAccumVec& M1_y, RealAccumVec& M1_z,
278 RealAccumVec& M2_x, RealAccumVec& M2_y, RealAccumVec& M2_z,
279 RealAccumVec& sum_upotXpoles, RealAccumVec& sum_virial,
280 const MaskCalcVec& forceMask);
281
282 template<bool calculateMacroscopic>
283 inline void _loopBodyQuadrupole(
284 const RealCalcVec& m1_r_x, const RealCalcVec& m1_r_y, const RealCalcVec& m1_r_z,
285 const RealCalcVec& r1_x, const RealCalcVec& r1_y, const RealCalcVec& r1_z,
286 const RealCalcVec& eii_x, const RealCalcVec& eii_y, const RealCalcVec& eii_z,
287 const RealCalcVec& mii,
288 const RealCalcVec& m2_r_x, const RealCalcVec& m2_r_y, const RealCalcVec& m2_r_z,
289 const RealCalcVec& r2_x, const RealCalcVec& r2_y, const RealCalcVec& r2_z,
290 const RealCalcVec& ejj_x, const RealCalcVec& ejj_y, const RealCalcVec& ejj_z,
291 const RealCalcVec& mjj,
292 RealCalcVec& f_x, RealCalcVec& f_y, RealCalcVec& f_z,
293 RealAccumVec& V_x, RealAccumVec& V_y, RealAccumVec& V_z,
294 RealAccumVec& Mii_x, RealAccumVec& Mii_y, RealAccumVec& Mii_z,
295 RealAccumVec& Mjj_x, RealAccumVec& Mjj_y, RealAccumVec& Mjj_z,
296 RealAccumVec& sum_upotXpoles, RealAccumVec& sum_virial,
297 const MaskCalcVec& forceMask);
298
318 template<class ForcePolicy, bool CalculateMacroscopic, class MaskGatherChooser>
319 void _calculatePairs(CellDataSoA & soa1, CellDataSoA & soa2);
320
321}; /* end of class VectorizedCellProcessor */
322
323#endif /* VECTORIZEDCELLPROCESSOR_H_ */
AlignedArray.h.
Defines the length of the vectors and the corresponding functions.
An aligned array.
Definition: AlignedArray.h:75
Structure of Arrays for vectorized force calculation.
Definition: CellDataSoA.h:22
Definition: CellProcessor.h:29
Definition: Comp2Param.h:15
Class implementing molecules as rigid rotators consisting out of different interaction sites (LJcente...
Definition: Component.h:14
This class is used to read in the phasespace and to handle macroscopic values.
Definition: Domain.h:47
FullMolecule modeled as LJ sphere with point polarities.
Definition: FullMolecule.h:18
FullParticleCell data structure. Renamed from ParticleCell.
Definition: FullParticleCell.h:49
Vectorized calculation of the force.
Definition: VectorizedCellProcessor.h:29
void preprocessCell(ParticleCell &)
Load the CellDataSoA for cell.
Definition: VectorizedCellProcessor.h:51
void postprocessCell(ParticleCell &)
Free the LennardJonesSoA for cell.
Definition: VectorizedCellProcessor.h:67
void processCellPair(ParticleCell &cell1, ParticleCell &cell2, bool sumAll=false)
Definition: VectorizedCellProcessor.cpp:2746
void endTraversal()
Store macroscopic values in the Domain.
Definition: VectorizedCellProcessor.cpp:124
void processCell(ParticleCell &cell)
Calculate forces between pairs of Molecules in cell.
Definition: VectorizedCellProcessor.cpp:2734
void initTraversal()
Reset macroscopic values to 0.0.
Definition: VectorizedCellProcessor.cpp:111
VectorizedCellProcessor(Domain &domain, double cutoffRadius, double LJcutoffRadius)
Construct and set up the internal parameter table.
Definition: VectorizedCellProcessor.cpp:21
Definition: MaskVec.h:16
Definition: RealVec.h:22