19template <
class ParticleCell,
class PairwiseFunctor>
30 const std::array<double, 3> &cellLength)
31 : _cellPairOffsets{LCC08CellHandlerUtility::computePairwiseCellOffsetsC08<
32 LCC08CellHandlerUtility::C08OffsetMode::c08CellPairs>(dims, cellLength, interactionLength)},
46 unsigned long cellIndex,
PairwiseFunctor *pairwiseFunctor, DataLayoutOption layout,
48 using namespace utils::ArrayMath::literals;
53 auto relIdx = [&](
auto cellIndex1,
auto cellIndex2) {
56 const auto offset = threeDPosCell2 - threeDPosCell1;
57 return (offset[0] + 1) * 9 + (offset[1] + 1) * 3 + (offset[2] + 1);
61 for (
const auto &[offsetA, offsetB] : this->_cellPairOffsets) {
65 const auto offsetCellA = cellIndex + offsetA;
66 const auto offsetCellB = cellIndex + offsetB;
67 const auto [offsetCell1, offsetCell2] = std::minmax(offsetCellA, offsetCellB);
69 const auto cell2Local = relIdx(offsetCell1, offsetCell2);
72 if (layout == DataLayoutOption::aos) {
74 const auto ¤tList = aosNeighborList[offsetCell1][cell2Local];
75 for (
auto &[particleBasePtr, particleList] : currentList) {
76 for (
auto *particlePartnerPtr : particleList) {
77 pairwiseFunctor->
AoSFunctor(*particleBasePtr, *particlePartnerPtr, useNewton3);
83 else if (layout == DataLayoutOption::soa) {
85 const auto ¤tList = soaNeighborList[offsetCell1][cell2Local];
86 for (
const auto &[particleIndex, particleList] : currentList) {
87 if (not particleList.empty()) {
88 pairwiseFunctor->
SoAFunctorVerlet(*soa, particleIndex, particleList, useNewton3);
96 const auto cell2LocalNoN3 = relIdx(offsetCell2, offsetCell1);
98 if (offsetCell1 != offsetCell2) {
100 if (layout == DataLayoutOption::aos) {
102 const auto ¤tList = aosNeighborList[offsetCell2][cell2LocalNoN3];
103 for (
auto &[particleBasePtr, particleList] : currentList) {
104 for (
auto *particlePartnerPtr : particleList) {
105 pairwiseFunctor->
AoSFunctor(*particleBasePtr, *particlePartnerPtr, useNewton3);
111 else if (layout == DataLayoutOption::soa) {
113 const auto ¤tList = soaNeighborList[offsetCell2][cell2LocalNoN3];
114 for (
const auto &[particleIndex, particleList] : currentList) {
115 if (not particleList.empty()) {
116 pairwiseFunctor->
SoAFunctorVerlet(*soa, particleIndex, particleList, useNewton3);
129 std::vector<LCC08CellHandlerUtility::OffsetPair> _cellPairOffsets;
131 std::array<unsigned long, 3> _dims;
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:20
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:45
VLCCellPairC08CellHandler(const std::array< unsigned long, 3 > &dims, double interactionLength, const std::array< double, 3 > &cellLength)
Constructor of the VLCCellPairC08CellHandler.
Definition: VLCCellPairC08CellHandler.h:29
Neighbor list to be used with VerletListsCells container.
Definition: VLCCellPairNeighborList.h:30
auto & getSoANeighborList()
Returns the neighbor list in SoA layout.
Definition: VLCCellPairNeighborList.h:88
VerletListsCellsHelpers::PairwiseNeighborListsType< Particle_T > & getAoSNeighborList()
Returns the neighbor list in AoS layout.
Definition: VLCCellPairNeighborList.h:80
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