AutoPas  3.0.0
Loading...
Searching...
No Matches
VLCCellPairC08CellHandler.h
Go to the documentation of this file.
1
6#pragma once
7
11
12namespace autopas {
18template <class ParticleCell, class PairwiseFunctor>
20 public:
28 VLCCellPairC08CellHandler(const std::array<unsigned long, 3> &dims, double interactionLength,
29 const std::array<double, 3> &cellLength)
30 : _cellPairOffsets{LCC08CellHandlerUtility::computePairwiseCellOffsetsC08<
31 LCC08CellHandlerUtility::C08OffsetMode::c08CellPairs>(dims, cellLength, interactionLength)},
32 _dims{dims} {}
33
45 unsigned long cellIndex, PairwiseFunctor *pairwiseFunctor, DataLayoutOption layout,
47 using namespace utils::ArrayMath::literals;
48 const auto &aosNeighborList = neighborList.getAoSNeighborList();
49 const auto &soaNeighborList = neighborList.getSoANeighborList();
50
51 // Helper lambda to compute the relative index from two cells
52 auto relIdx = [&](auto cellIndex1, auto cellIndex2) {
53 const auto threeDPosCell1 = utils::ThreeDimensionalMapping::oneToThreeD(cellIndex1, _dims);
54 const auto threeDPosCell2 = utils::ThreeDimensionalMapping::oneToThreeD(cellIndex2, _dims);
55 const auto offset = threeDPosCell2 - threeDPosCell1;
56 return (offset[0] + 1) * 9 + (offset[1] + 1) * 3 + (offset[2] + 1);
57 };
58
59 // for all interaction pairs defined via the c08 base step
60 for (const auto &[offsetA, offsetB] : this->_cellPairOffsets) {
61 // the lists are built with a c18 traversal
62 // the interaction will always be saved in the smaller cell's neighbor list
63 // std::minmax(a, b) returns references. Hence, we can't use temporaries as arguments.
64 const auto offsetCellA = cellIndex + offsetA;
65 const auto offsetCellB = cellIndex + offsetB;
66 const auto [offsetCell1, offsetCell2] = std::minmax(offsetCellA, offsetCellB);
67
68 const auto cell2Local = relIdx(offsetCell1, offsetCell2);
69
70 // if aos, send every pair of interacting particles to functor
71 if (layout == DataLayoutOption::aos) {
72 // vector of pairs {particle, list}
73 const auto &currentList = aosNeighborList[offsetCell1][cell2Local];
74 for (auto &[particleBasePtr, particleList] : currentList) {
75 for (auto *particlePartnerPtr : particleList) {
76 pairwiseFunctor->AoSFunctor(*particleBasePtr, *particlePartnerPtr, useNewton3);
77 }
78 }
79 }
80
81 // if soa, send particle and corresponding neighbor list to the functor
82 else if (layout == DataLayoutOption::soa) {
83 // vector of pairs {particle, list}
84 const auto &currentList = soaNeighborList[offsetCell1][cell2Local];
85 for (const auto &[particleIndex, particleList] : currentList) {
86 if (not particleList.empty()) {
87 pairwiseFunctor->SoAFunctorVerlet(*soa, particleIndex, particleList, useNewton3);
88 }
89 }
90 }
91
92 // if newton3 is off, find cell1 in cell2's neighbor list ("switch" the pair from above) and repeat the
93 // interaction from above
94 if (not useNewton3) {
95 const auto cell2LocalNoN3 = relIdx(offsetCell2, offsetCell1);
96 // exclude interaction within same cell - already handled in
97 if (offsetCell1 != offsetCell2) {
98 // if aos, send every pair of interacting particles to functor
99 if (layout == DataLayoutOption::aos) {
100 // vector of pairs {particle, list}
101 const auto &currentList = aosNeighborList[offsetCell2][cell2LocalNoN3];
102 for (auto &[particleBasePtr, particleList] : currentList) {
103 for (auto *particlePartnerPtr : particleList) {
104 pairwiseFunctor->AoSFunctor(*particleBasePtr, *particlePartnerPtr, useNewton3);
105 }
106 }
107 }
108
109 // if soa, send particle and corresponding neighbor list to the functor
110 else if (layout == DataLayoutOption::soa) {
111 // vector of pairs {particle, list}
112 const auto &currentList = soaNeighborList[offsetCell2][cell2LocalNoN3];
113 for (const auto &[particleIndex, particleList] : currentList) {
114 if (not particleList.empty()) {
115 pairwiseFunctor->SoAFunctorVerlet(*soa, particleIndex, particleList, useNewton3);
116 }
117 }
118 }
119 }
120 }
121 }
122 }
123
124 private:
128 std::vector<LCC08CellHandlerUtility::OffsetPair> _cellPairOffsets;
129
130 std::array<unsigned long, 3> _dims;
131};
132} // namespace autopas
PairwiseFunctor class.
Definition: PairwiseFunctor.h:31
virtual void AoSFunctor(Particle_T &i, Particle_T &j, bool newton3)
PairwiseFunctor for arrays of structures (AoS).
Definition: PairwiseFunctor.h:56
virtual void SoAFunctorVerlet(SoAView< SoAArraysType > soa, const size_t indexFirst, const std::vector< size_t, AlignedAllocator< size_t > > &neighborList, bool newton3)
PairwiseFunctor for structure of arrays (SoA) for neighbor lists.
Definition: PairwiseFunctor.h:86
Structur of the array class.
Definition: SoA.h:28
This class provides the base logic for the c08 traversal for VLCCellPairNeighborList.
Definition: VLCCellPairC08CellHandler.h:19
void processCellListsC08(VLCCellPairNeighborList< typename ParticleCell::ParticleType > &neighborList, unsigned long cellIndex, PairwiseFunctor *pairwiseFunctor, DataLayoutOption layout, SoA< typename ParticleCell::ParticleType::SoAArraysType > *soa, bool useNewton3)
Executes a c08 base step for the cell at cellIndex.
Definition: VLCCellPairC08CellHandler.h:44
VLCCellPairC08CellHandler(const std::array< unsigned long, 3 > &dims, double interactionLength, const std::array< double, 3 > &cellLength)
Constructor of the VLCCellPairC08CellHandler.
Definition: VLCCellPairC08CellHandler.h:28
Neighbor list to be used with VerletListsCells container.
Definition: VLCCellPairNeighborList.h:23
auto & getSoANeighborList()
Returns the neighbor list in SoA layout.
Definition: VLCCellPairNeighborList.h:81
VerletListsCellsHelpers::PairwiseNeighborListsType< Particle_T > & getAoSNeighborList()
Returns the neighbor list in AoS layout.
Definition: VLCCellPairNeighborList.h:73
constexpr std::array< T, 3 > oneToThreeD(T ind, const std::array< T, 3 > &dims)
Convert a 1d index to a 3d index.
Definition: ThreeDimensionalMapping.h:55
This is the main namespace of AutoPas.
Definition: AutoPasDecl.h:32