31template <
class Particle_T>
61 VerletLists(
const std::array<double, 3> &boxMin,
const std::array<double, 3> &boxMax,
const double cutoff,
62 const double skin,
const unsigned int rebuildFrequency,
64 const double cellSizeFactor = 1.0)
66 compatibleTraversals::allVLCompatibleTraversals(), cellSizeFactor),
67 _buildVerletListType(buildVerletListType) {}
72 [[nodiscard]] ContainerOption
getContainerType()
const override {
return ContainerOption::verletLists; }
77 if (verletTraversalInterface) {
82 "trying to use a traversal of wrong type in VerletLists::computeInteractions");
107 if (not _soaListIsValid and traversal->
getDataLayout() == DataLayoutOption::soa) {
124 DataLayoutOption dataLayout;
126 dataLayout = DataLayoutOption::aos;
128 dataLayout = DataLayoutOption::soa;
131 _buildVerletListType);
136 this->
_linkedCells.getCellBlock().getCellLength(), dataLayout, useNewton3);
139 _soaListIsValid =
false;
148 size_t numParticles = 0;
149 _aosNeighborLists.clear();
152 for (
auto iter = this->
begin(IteratorBehavior::ownedOrHaloOrDummy); iter.isValid(); ++iter, ++numParticles) {
154 _aosNeighborLists[&(*iter)];
165 _soaNeighborLists.resize(_aosNeighborLists.size());
167 _particlePtr2indexMap.clear();
169 _particlePtr2indexMap.reserve(_aosNeighborLists.size());
174 for (
auto iter = this->
begin(IteratorBehavior::ownedOrHaloOrDummy); iter.isValid(); ++iter, ++index) {
176 _particlePtr2indexMap[&(*iter)] = index;
178 size_t accumulatedListSize = 0;
179 for (
const auto &[particlePtr, neighborPtrVector] : _aosNeighborLists) {
180 accumulatedListSize += neighborPtrVector.size();
181 size_t i_id = _particlePtr2indexMap[particlePtr];
183 _soaNeighborLists[i_id].resize(neighborPtrVector.size());
185 for (
auto &neighborPtr : neighborPtrVector) {
186 _soaNeighborLists[i_id][j] = _particlePtr2indexMap[neighborPtr];
192 "VerletLists::generateSoAListFromAoSVerletLists: average verlet list "
194 static_cast<double>(accumulatedListSize) / _aosNeighborLists.size());
195 _soaListIsValid =
true;
208 std::unordered_map<const Particle_T *, size_t> _particlePtr2indexMap;
214 std::vector<std::vector<size_t, autopas::AlignedAllocator<size_t>>> _soaNeighborLists;
219 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 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:69
bool getUseNewton3() const
Return whether the traversal uses newton 3.
Definition: TraversalInterface.h:63
This class provides the Traversal Interface for the verlet lists container.
Definition: VLTraversalInterface.h:22
virtual void setCellsAndNeighborLists(std::vector< LinkedParticleCell > &cells, typename VerletListHelpers< typename LinkedParticleCell::ParticleType >::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
This functor can generate verlet lists using the typical pairwise traversal.
Definition: VerletListHelpers.h:31
std::unordered_map< Particle_T *, std::vector< Particle_T * > > NeighborListAoSType
Neighbor list AoS style.
Definition: VerletListHelpers.h:26
Base class for Verlet lists which use an underlying linked cells container.
Definition: VerletListsLinkedBase.h:26
ContainerIterator< Particle_T, true, false > begin(IteratorBehavior behavior=IteratorBehavior::ownedOrHalo, typename ContainerIterator< Particle_T, true, false >::ParticleVecType *additionalVectors=nullptr) override
Iterate over all particles using for(auto iter = container.begin(); iter.isValid(); ++iter) .
Definition: VerletListsLinkedBase.h:205
bool _verletBuiltNewton3
specifies if the current verlet list was built for newton3
Definition: VerletListsLinkedBase.h:329
double getVerletSkin() const final
Return the verletSkin of the container verletSkin.
Definition: VerletListsLinkedBase.h:314
double getInteractionLength() const final
Return the interaction length (cutoff+skin) of the container.
Definition: VerletListsLinkedBase.h:319
std::atomic< bool > _neighborListIsValid
specifies if the neighbor list is currently valid
Definition: VerletListsLinkedBase.h:326
LinkedCells< Particle_T > _linkedCells
internal linked cells storage, handles Particle storage and used to build verlet lists
Definition: VerletListsLinkedBase.h:323
double getCutoff() const final
Return the cutoff of the container.
Definition: VerletListsLinkedBase.h:304
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 unsigned int rebuildFrequency, const BuildVerletListType buildVerletListType=BuildVerletListType::VerletSoA, const double cellSizeFactor=1.0)
Constructor of the VerletLists class.
Definition: VerletLists.h:61
BuildVerletListType
Enum that specifies how the verlet lists should be build.
Definition: VerletLists.h:39
@ VerletSoA
Build it using AoS.
Definition: VerletLists.h:47
@ VerletAoS
Build it using AoS.
Definition: VerletLists.h:43
virtual void updateVerletListsAoS(bool useNewton3)
Update the verlet lists for AoS usage.
Definition: VerletLists.h:118
size_t generateAoSNeighborLists()
Clears and then generates the AoS neighbor lists.
Definition: VerletLists.h:147
ContainerOption getContainerType() const override
Get the ContainerType.
Definition: VerletLists.h:72
void rebuildNeighborLists(TraversalInterface *traversal) override
Rebuilds the verlet lists, marks them valid and resets the internal counter.
Definition: VerletLists.h:101
void computeInteractions(TraversalInterface *traversal) override
Iterates over all particle multiples (e.g.
Definition: VerletLists.h:74
void generateSoAListFromAoSVerletLists()
Fills SoA neighbor list with particle indices.
Definition: VerletLists.h:163
VerletListHelpers< Particle_T >::NeighborListAoSType & getVerletListsAoS()
get the actual neighbor list
Definition: VerletLists.h:94
static void exception(const Exception e)
Handle an exception derived by std::exception.
Definition: ExceptionHandler.h:63
This is the main namespace of AutoPas.
Definition: AutoPasDecl.h:32