11#include "CellDataSoABase.h"
12#include "utils/AlignedArrayTriplet.h"
13#include "utils/ConcatenatedSites.h"
30 CellDataSoA(
size_t mol_arg,
size_t ljc_arg,
size_t charges_arg,
size_t dipoles_arg,
size_t quadrupoles_arg) {
31 resize(mol_arg, ljc_arg, charges_arg, dipoles_arg, quadrupoles_arg);
37 enum class QuantityType {
38 MOL_POSITION, CENTER_POSITION, FORCE, VIRIAL
44 size_t _quadrupoles_num;
86 mardyn_assert(qt == QuantityType::MOL_POSITION or qt == QuantityType::CENTER_POSITION);
91 vcp_inline
const vcp_real_calc*
getBeginCalc(QuantityType qt, SiteType st, CoordinateType coord)
const {
92 mardyn_assert(qt == QuantityType::MOL_POSITION or qt == QuantityType::CENTER_POSITION);
97 vcp_inline vcp_real_accum* getBeginAccum(QuantityType qt, SiteType st, CoordinateType coord) {
98 mardyn_assert(qt == QuantityType::FORCE or qt == QuantityType::VIRIAL);
103 vcp_inline
const vcp_real_accum* getBeginAccum(QuantityType qt, SiteType st, CoordinateType coord)
const {
104 mardyn_assert(qt == QuantityType::FORCE or qt == QuantityType::VIRIAL);
117 vcp_inline std::array<vcp_real_accum, 3> getTripletAccum(QuantityType qt, SiteType st,
size_t index)
const {
130 vcp_inline
void setTripletAccum(std::array<vcp_real_accum, 3> t, QuantityType qt, SiteType st,
size_t index) {
138 void pushBackLJC(
const size_t index, std::array<vcp_real_calc,3> moleculePos, std::array<vcp_real_calc,3> centerPos, vcp_ljc_id_t lookUpIndex) {
139 setTripletCalc(moleculePos, QuantityType::MOL_POSITION, SiteType::LJC, index);
140 setTripletCalc(centerPos, QuantityType::CENTER_POSITION, SiteType::LJC, index);
141 _ljc_id[index] = lookUpIndex;
147 void pushBackCharge(
const size_t index, std::array<vcp_real_calc,3> moleculePos, std::array<vcp_real_calc,3> centerPos, vcp_real_calc charge) {
148 setTripletCalc(moleculePos, QuantityType::MOL_POSITION, SiteType::CHARGE, index);
149 setTripletCalc(centerPos, QuantityType::CENTER_POSITION, SiteType::CHARGE, index);
150 _charges_q[index] = charge;
156 void pushBackDipole(
const size_t index, std::array<vcp_real_calc,3> moleculePos, std::array<vcp_real_calc,3> centerPos,
157 vcp_real_calc dipoleMoment, std::array<vcp_real_calc,3> orientation) {
158 setTripletCalc(moleculePos, QuantityType::MOL_POSITION, SiteType::DIPOLE, index);
159 setTripletCalc(centerPos, QuantityType::CENTER_POSITION, SiteType::DIPOLE, index);
160 _dipoles_p[index] = dipoleMoment;
161 _dipoles_e.x(index) = orientation[0];
162 _dipoles_e.y(index) = orientation[1];
163 _dipoles_e.z(index) = orientation[2];
169 void pushBackQuadrupole(
const size_t index, std::array<vcp_real_calc,3> moleculePos, std::array<vcp_real_calc,3> centerPos,
170 vcp_real_calc quadrupoleMoment, std::array<vcp_real_calc,3> orientation) {
171 setTripletCalc(moleculePos, QuantityType::MOL_POSITION, SiteType::QUADRUPOLE, index);
172 setTripletCalc(centerPos, QuantityType::CENTER_POSITION, SiteType::QUADRUPOLE, index);
173 _quadrupoles_m[index] = quadrupoleMoment;
174 _quadrupoles_e.x(index) = orientation[0];
175 _quadrupoles_e.y(index) = orientation[1];
176 _quadrupoles_e.z(index) = orientation[2];
179 void vcp_inline initDistLookupPointers(
181 vcp_lookupOrMask_single*& ljc_dist_lookup,
182 vcp_lookupOrMask_single*& charges_dist_lookup,
183 vcp_lookupOrMask_single*& dipoles_dist_lookup,
184 vcp_lookupOrMask_single*& quadrupoles_dist_lookup)
const {
190 size_t centers_size = ljc_size + charges_size + dipoles_size + quadrupoles_size;
192 centers_dist_lookup.resize_zero_shrink(centers_size);
193 setPaddingToZero(centers_dist_lookup);
195 ljc_dist_lookup = centers_dist_lookup;
196 charges_dist_lookup = ljc_dist_lookup + (ljc_size + VCP_INDICES_PER_LOOKUP_SINGLE_M1)/VCP_INDICES_PER_LOOKUP_SINGLE;
197 dipoles_dist_lookup = charges_dist_lookup + (charges_size + VCP_INDICES_PER_LOOKUP_SINGLE_M1)/VCP_INDICES_PER_LOOKUP_SINGLE;
198 quadrupoles_dist_lookup = dipoles_dist_lookup + (dipoles_size + VCP_INDICES_PER_LOOKUP_SINGLE_M1)/VCP_INDICES_PER_LOOKUP_SINGLE;
201 void vcp_inline initDistLookupPointersSingle(
203 vcp_lookupOrMask_single*& sites_dist_lookup,
204 size_t sites_num)
const {
206 centers_dist_lookup.resize_zero_shrink(sites_num,
true,
false);
207 sites_dist_lookup = centers_dist_lookup;
210 void resize(
size_t molecules_arg,
size_t ljcenters_arg,
size_t charges_arg,
size_t dipoles_arg,
size_t quadrupoles_arg) {
213 setMolNum(molecules_arg);
214 _ljc_num = ljcenters_arg;
215 _charges_num = charges_arg;
216 _dipoles_num = dipoles_arg;
217 _quadrupoles_num = quadrupoles_arg;
220 _mol_pos .resize_zero_shrink(getMolNum());
221 _mol_ljc_num .resize_zero_shrink(getMolNum());
222 _mol_charges_num .resize_zero_shrink(getMolNum());
223 _mol_dipoles_num .resize_zero_shrink(getMolNum());
224 _mol_quadrupoles_num.resize_zero_shrink(getMolNum());
226 _centers_m_r.
resize(ljcenters_arg, charges_arg, dipoles_arg, quadrupoles_arg);
227 _centers_r .
resize(ljcenters_arg, charges_arg, dipoles_arg, quadrupoles_arg);
228 _centers_f .
resize(ljcenters_arg, charges_arg, dipoles_arg, quadrupoles_arg);
229 _centers_V .
resize(ljcenters_arg, charges_arg, dipoles_arg, quadrupoles_arg);
232 _ljc_id.resize_zero_shrink(_ljc_num,
true);
235 _charges_q.resize_zero_shrink(_charges_num);
238 _dipoles_p.resize_zero_shrink(_dipoles_num);
239 _dipoles_e.resize_zero_shrink(_dipoles_num);
240 _dipoles_M.resize_zero_shrink(_dipoles_num);
243 _quadrupoles_m.resize_zero_shrink(_quadrupoles_num);
244 _quadrupoles_e.resize_zero_shrink(_quadrupoles_num);
245 _quadrupoles_M.resize_zero_shrink(_quadrupoles_num);
249 size_t getDynamicSize()
const {
282 t.zero(ljc_size + _charges_num);
283 t.zero(ljc_size + charges_size + _dipoles_num);
284 t.zero(ljc_size + charges_size + dipoles_size + _quadrupoles_num);
291 mardyn_assert(qt == QuantityType::MOL_POSITION or qt == QuantityType::CENTER_POSITION);
294 case QuantityType::MOL_POSITION:
295 returnQuantity = &_centers_m_r;
297 case QuantityType::CENTER_POSITION:
298 returnQuantity = &_centers_r;
301 returnQuantity =
nullptr;
305 mardyn_assert(returnQuantity !=
nullptr);
306 return returnQuantity;
310 mardyn_assert(qt == QuantityType::FORCE or qt == QuantityType::VIRIAL);
313 case QuantityType::FORCE:
314 returnQuantity = &_centers_f;
316 case QuantityType::VIRIAL:
317 returnQuantity = &_centers_V;
320 returnQuantity =
nullptr;
324 mardyn_assert(returnQuantity !=
nullptr);
325 return returnQuantity;
329 mardyn_assert(qt == QuantityType::MOL_POSITION or qt == QuantityType::CENTER_POSITION);
332 case QuantityType::MOL_POSITION:
333 returnQuantity = &_centers_m_r;
335 case QuantityType::CENTER_POSITION:
336 returnQuantity = &_centers_r;
339 returnQuantity =
nullptr;
343 mardyn_assert(returnQuantity !=
nullptr);
344 return returnQuantity;
348 mardyn_assert(qt == QuantityType::FORCE or qt == QuantityType::VIRIAL);
351 case QuantityType::FORCE:
352 returnQuantity = &_centers_f;
354 case QuantityType::VIRIAL:
355 returnQuantity = &_centers_V;
358 returnQuantity =
nullptr;
362 mardyn_assert(returnQuantity !=
nullptr);
363 return returnQuantity;
Defines the length of the vectors and the corresponding functions.
Definition: AlignedArrayTriplet.h:15
An aligned array.
Definition: AlignedArray.h:75
size_t get_dynamic_memory() const
Return amount of allocated storage + .
Definition: AlignedArray.h:225
Definition: CellDataSoABase.h:13
Structure of Arrays for vectorized force calculation.
Definition: CellDataSoA.h:22
vcp_inline std::array< vcp_real_calc, 3 > getTripletCalc(QuantityType qt, SiteType st, size_t index) const
Get a triplet of data from a ConcatenatedSites at specific index.
Definition: CellDataSoA.h:112
void pushBackLJC(const size_t index, std::array< vcp_real_calc, 3 > moleculePos, std::array< vcp_real_calc, 3 > centerPos, vcp_ljc_id_t lookUpIndex)
Add a set of LJC-data at position index.
Definition: CellDataSoA.h:138
void pushBackQuadrupole(const size_t index, std::array< vcp_real_calc, 3 > moleculePos, std::array< vcp_real_calc, 3 > centerPos, vcp_real_calc quadrupoleMoment, std::array< vcp_real_calc, 3 > orientation)
Add a set of quadrupole-data at position index.
Definition: CellDataSoA.h:169
void pushBackDipole(const size_t index, std::array< vcp_real_calc, 3 > moleculePos, std::array< vcp_real_calc, 3 > centerPos, vcp_real_calc dipoleMoment, std::array< vcp_real_calc, 3 > orientation)
Add a set of dipole-data at position index.
Definition: CellDataSoA.h:156
vcp_inline vcp_real_calc * getBeginCalc(QuantityType qt, SiteType st, CoordinateType coord)
Get Pointer to the beginning of the specified data.
Definition: CellDataSoA.h:85
void pushBackCharge(const size_t index, std::array< vcp_real_calc, 3 > moleculePos, std::array< vcp_real_calc, 3 > centerPos, vcp_real_calc charge)
Add a set of charge-data at position index.
Definition: CellDataSoA.h:147
vcp_inline void setTripletCalc(std::array< vcp_real_calc, 3 > t, QuantityType qt, SiteType st, size_t index)
Set a triplet of data in a ConcatenatedSites to specified values.
Definition: CellDataSoA.h:125
Class to manage the storage of ljc-, charge-, dipole- and quadrupole-data in one single AlignedArrayT...
Definition: ConcatenatedSites.h:37
void resize(size_t ljc_num, size_t charges_num, size_t dipoles_num, size_t quadrupoles_num)
Resize the ConcatenatedSites to have enough space for the given number of elements.
Definition: ConcatenatedSites.h:151
vcp_inline void setTriplet(std::array< T, 3 > values, ConcSites::SiteType st, size_t index)
Set the value triplet X,Y,Z of ConcSites::SiteType st at position index to given values.
Definition: ConcatenatedSites.h:138
vcp_inline T * getBeginPointer(ConcSites::SiteType st, ConcSites::CoordinateType coord)
Get a Pointer to the beginning of the specified data.
Definition: ConcatenatedSites.h:55
vcp_inline std::array< T, 3 > getTriplet(ConcSites::SiteType st, size_t index) const
Get the value triplet X,Y,Z of ConcSites::SiteType st at position index.
Definition: ConcatenatedSites.h:127
size_t get_dynamic_memory() const
Get the size of currently occupied memory.
Definition: ConcatenatedSites.h:171
SiteType
Specify which of the 4 data-categories is needed.
Definition: ConcatenatedSites.h:25
CoordinateType
What coordinate would you like to have?
Definition: ConcatenatedSites.h:18