31template <
class Particle_T>
36 using ParticleType = Particle_T;
67 VerletLists(
const std::array<double, 3> &boxMin,
const std::array<double, 3> &boxMax,
const double cutoff,
69 const double cellSizeFactor = 1.0)
71 _buildVerletListType(buildVerletListType) {}
76 [[nodiscard]] ContainerOption
getContainerType()
const override {
return ContainerOption::verletLists; }
81 if (verletTraversalInterface) {
98 return _aosNeighborLists;
112 if (not _soaListIsValid and traversal->
getDataLayout() == DataLayoutOption::soa) {
129 DataLayoutOption dataLayout;
131 dataLayout = DataLayoutOption::aos;
133 dataLayout = DataLayoutOption::soa;
136 static_cast<int>(_buildVerletListType));
140 this->
_linkedCells.getCellBlock().getCellLength(), dataLayout, useNewton3);
143 _soaListIsValid =
false;
152 size_t numParticles = 0;
153 _aosNeighborLists.clear();
158 for (
auto iter = this->
begin(IteratorBehavior::ownedOrHaloOrDummy); iter.isValid(); ++iter, ++numParticles) {
160 _aosNeighborLists[&(*iter)];
171 _soaNeighborLists.resize(_aosNeighborLists.size());
173 _particlePtr2indexMap.clear();
175 _particlePtr2indexMap.reserve(_aosNeighborLists.size());
180 for (
auto iter = this->
begin(IteratorBehavior::ownedOrHaloOrDummy); iter.isValid(); ++iter, ++index) {
182 _particlePtr2indexMap[&(*iter)] = index;
184 size_t accumulatedListSize = 0;
185 for (
const auto &[particlePtr, neighborPtrVector] : _aosNeighborLists) {
186 accumulatedListSize += neighborPtrVector.size();
187 size_t i_id = _particlePtr2indexMap[particlePtr];
189 _soaNeighborLists[i_id].resize(neighborPtrVector.size());
191 for (
auto &neighborPtr : neighborPtrVector) {
192 _soaNeighborLists[i_id][j] = _particlePtr2indexMap[neighborPtr];
198 "VerletLists::generateSoAListFromAoSVerletLists: average verlet list "
200 static_cast<double>(accumulatedListSize) / _aosNeighborLists.size());
201 _soaListIsValid =
true;
214 std::unordered_map<const Particle_T *, size_t> _particlePtr2indexMap;
220 std::vector<std::vector<size_t, AlignedAllocator<size_t>>> _soaNeighborLists;
225 bool _soaListIsValid{
false};
#define AutoPasLog(lvl, fmt,...)
Macro for logging providing common meta information without filename.
Definition: Logger.h:24
This class handles the storage of particles in their full form.
Definition: FullParticleCell.h:26
This functor generates lists of particles within interactionLength of each other: can be used interna...
Definition: InteractionListGeneratorFunctor.h:30
std::unordered_map< Particle_T *, std::vector< Particle_T * > > NeighborListAoSType
Neighbor list AoS style.
Definition: InteractionListGeneratorFunctor.h:40
This class provides the lc_c08 traversal.
Definition: LCC08Traversal.h:28
This interface serves as a common parent class for all traversals.
Definition: TraversalInterface.h:18
virtual void endTraversal()=0
Finalizes the traversal.
virtual void traverseParticles()=0
Traverse the particles by pairs, triplets etc.
virtual void initTraversal()=0
Initializes the traversal.
DataLayoutOption getDataLayout() const
Return the data layout option.
Definition: TraversalInterface.h:71
bool getUseNewton3() const
Return whether the traversal uses newton 3.
Definition: TraversalInterface.h:65
This class provides the Traversal Interface for the verlet lists container.
Definition: VLTraversalInterface.h:22
virtual void setCellsAndNeighborLists(std::vector< LinkedParticleCell > &cells, InteractionListGeneratorFunctor< typename LinkedParticleCell::ParticleType, true >::NeighborListAoSType &aosNeighborLists, std::vector< std::vector< size_t, autopas::AlignedAllocator< size_t > > > &soaNeighborLists)
Sets the information the traversal needs for the iteration.
Definition: VLTraversalInterface.h:35
Base class for Verlet lists which use an underlying linked cells container.
Definition: VerletListsLinkedBase.h:25
ContainerIterator< Particle_T, true, false > begin(IteratorBehavior behavior=IteratorBehavior::ownedOrHalo, utils::optRef< typename ContainerIterator< Particle_T, true, false >::ParticleVecType > additionalVectors=std::nullopt) override
Iterate over all particles using for(auto iter = container.begin(); iter.isValid(); ++iter) .
Definition: VerletListsLinkedBase.h:200
bool _verletBuiltNewton3
specifies if the current verlet list was built for newton3
Definition: VerletListsLinkedBase.h:326
double getVerletSkin() const final
Return the verletSkin of the container verletSkin.
Definition: VerletListsLinkedBase.h:311
double getInteractionLength() const final
Return the interaction length (cutoff+skin) of the container.
Definition: VerletListsLinkedBase.h:316
std::atomic< bool > _neighborListIsValid
specifies if the neighbor list is currently valid
Definition: VerletListsLinkedBase.h:323
LinkedCells< Particle_T > _linkedCells
internal linked cells storage, handles Particle storage and used to build verlet lists
Definition: VerletListsLinkedBase.h:320
double getCutoff() const final
Return the cutoff of the container.
Definition: VerletListsLinkedBase.h:301
Verlet Lists container.
Definition: VerletLists.h:32
VerletLists(const std::array< double, 3 > &boxMin, const std::array< double, 3 > &boxMax, const double cutoff, const double skin, const BuildVerletListType buildVerletListType=BuildVerletListType::VerletSoA, const double cellSizeFactor=1.0)
Constructor of the VerletLists class.
Definition: VerletLists.h:67
BuildVerletListType
Enum that specifies how the verlet lists should be build.
Definition: VerletLists.h:46
@ VerletSoA
Build it using AoS.
Definition: VerletLists.h:54
@ VerletAoS
Build it using AoS.
Definition: VerletLists.h:50
virtual void updateVerletListsAoS(bool useNewton3)
Update the verlet lists for AoS usage.
Definition: VerletLists.h:123
size_t generateAoSNeighborLists()
Clears and then generates the AoS neighbor lists.
Definition: VerletLists.h:151
ContainerOption getContainerType() const override
Get the ContainerType.
Definition: VerletLists.h:76
void rebuildNeighborLists(TraversalInterface *traversal) override
Rebuilds the verlet lists, marks them valid and resets the internal counter.
Definition: VerletLists.h:106
void computeInteractions(TraversalInterface *traversal) override
Iterates over all particle multiples (e.g.
Definition: VerletLists.h:78
InteractionListGeneratorFunctor< Particle_T, true >::NeighborListAoSType & getVerletListsAoS()
get the actual neighbor list
Definition: VerletLists.h:97
void generateSoAListFromAoSVerletLists()
Fills SoA neighbor list with particle indices.
Definition: VerletLists.h:169
static void exception(const Exception e)
Handle an exception derived by std::exception.
Definition: ExceptionHandler.h:64
This is the main namespace of AutoPas.
Definition: AutoPasDecl.h:34