AutoPas  3.0.0
Loading...
Searching...
No Matches
VerletLists.h
Go to the documentation of this file.
1
7#pragma once
8
9#include "VerletListHelpers.h"
19
20namespace autopas {
21
31template <class Particle_T>
32class VerletLists : public VerletListsLinkedBase<Particle_T> {
36 using ParticleType = Particle_T;
41
42 public:
55 };
56
67 VerletLists(const std::array<double, 3> &boxMin, const std::array<double, 3> &boxMax, const double cutoff,
68 const double skin, const BuildVerletListType buildVerletListType = BuildVerletListType::VerletSoA,
69 const double cellSizeFactor = 1.0)
70 : VerletListsLinkedBase<Particle_T>(boxMin, boxMax, cutoff, skin, cellSizeFactor),
71 _buildVerletListType(buildVerletListType) {}
72
76 [[nodiscard]] ContainerOption getContainerType() const override { return ContainerOption::verletLists; }
77
78 void computeInteractions(TraversalInterface *traversal) override {
79 // Check if traversal is allowed for this container and give it the data it needs.
80 auto *verletTraversalInterface = dynamic_cast<VLTraversalInterface<ParticleCellType> *>(traversal);
81 if (verletTraversalInterface) {
82 verletTraversalInterface->setCellsAndNeighborLists(this->_linkedCells.getCells(), _aosNeighborLists,
83 _soaNeighborLists);
84 } else {
85 utils::ExceptionHandler::exception("trying to use a traversal of wrong type in VerletLists::computeInteractions");
86 }
87
88 traversal->initTraversal();
89 traversal->traverseParticles();
90 traversal->endTraversal();
91 }
92
98
104 void rebuildNeighborLists(TraversalInterface *traversal) override {
105 this->_verletBuiltNewton3 = traversal->getUseNewton3();
106 this->updateVerletListsAoS(traversal->getUseNewton3());
107 // the neighbor list is now valid
108 this->_neighborListIsValid.store(true, std::memory_order_relaxed);
109
110 if (not _soaListIsValid and traversal->getDataLayout() == DataLayoutOption::soa) {
111 // only do this if we need it, i.e., if we are using soa!
113 }
114 }
115
116 protected:
121 virtual void updateVerletListsAoS(bool useNewton3) {
124 this->getCutoff() + this->getVerletSkin());
125
127 DataLayoutOption dataLayout;
128 if (_buildVerletListType == BuildVerletListType::VerletAoS) {
129 dataLayout = DataLayoutOption::aos;
130 } else if (_buildVerletListType == BuildVerletListType::VerletSoA) {
131 dataLayout = DataLayoutOption::soa;
132 } else {
133 utils::ExceptionHandler::exception("VerletLists::updateVerletListsAoS(): unsupported BuildVerletListType: {}",
134 _buildVerletListType);
135 }
136 auto traversal =
138 this->_linkedCells.getCellBlock().getCellsPerDimensionWithHalo(), &f, this->getInteractionLength(),
139 this->_linkedCells.getCellBlock().getCellLength(), dataLayout, useNewton3);
140 this->_linkedCells.computeInteractions(&traversal);
141
142 _soaListIsValid = false;
143 }
144
151 size_t numParticles = 0;
152 _aosNeighborLists.clear();
153 // DON'T simply parallelize this loop!!! this needs modifications if you want to parallelize it!
154 // We have to iterate also over dummy particles here to ensure a correct size of the arrays.
155 for (auto iter = this->begin(IteratorBehavior::ownedOrHaloOrDummy); iter.isValid(); ++iter, ++numParticles) {
156 // create the verlet list entries for all particles
157 _aosNeighborLists[&(*iter)];
158 }
159
160 return numParticles;
161 }
162
167 // resize the list to the size of the aos neighborlist
168 _soaNeighborLists.resize(_aosNeighborLists.size());
169 // clear the aos 2 soa map
170 _particlePtr2indexMap.clear();
171
172 _particlePtr2indexMap.reserve(_aosNeighborLists.size());
173 size_t index = 0;
174
175 // Here we have to iterate over all particles, as particles might be later on marked for deletion, and we cannot
176 // differentiate them from particles already marked for deletion.
177 for (auto iter = this->begin(IteratorBehavior::ownedOrHaloOrDummy); iter.isValid(); ++iter, ++index) {
178 // set the map
179 _particlePtr2indexMap[&(*iter)] = index;
180 }
181 size_t accumulatedListSize = 0;
182 for (const auto &[particlePtr, neighborPtrVector] : _aosNeighborLists) {
183 accumulatedListSize += neighborPtrVector.size();
184 size_t i_id = _particlePtr2indexMap[particlePtr];
185 // each soa neighbor list should be of the same size as for aos
186 _soaNeighborLists[i_id].resize(neighborPtrVector.size());
187 size_t j = 0;
188 for (auto &neighborPtr : neighborPtrVector) {
189 _soaNeighborLists[i_id][j] = _particlePtr2indexMap[neighborPtr];
190 j++;
191 }
192 }
193
194 AutoPasLog(DEBUG,
195 "VerletLists::generateSoAListFromAoSVerletLists: average verlet list "
196 "size is {}",
197 static_cast<double>(accumulatedListSize) / _aosNeighborLists.size());
198 _soaListIsValid = true;
199 }
200
201 private:
206
211 std::unordered_map<const Particle_T *, size_t> _particlePtr2indexMap;
212
217 std::vector<std::vector<size_t, AlignedAllocator<size_t>>> _soaNeighborLists;
218
222 bool _soaListIsValid{false};
223
227 BuildVerletListType _buildVerletListType;
228};
229
230} // namespace autopas
#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:25
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:206
bool _verletBuiltNewton3
specifies if the current verlet list was built for newton3
Definition: VerletListsLinkedBase.h:330
double getVerletSkin() const final
Return the verletSkin of the container verletSkin.
Definition: VerletListsLinkedBase.h:315
double getInteractionLength() const final
Return the interaction length (cutoff+skin) of the container.
Definition: VerletListsLinkedBase.h:320
std::atomic< bool > _neighborListIsValid
specifies if the neighbor list is currently valid
Definition: VerletListsLinkedBase.h:327
LinkedCells< Particle_T > _linkedCells
internal linked cells storage, handles Particle storage and used to build verlet lists
Definition: VerletListsLinkedBase.h:324
double getCutoff() const final
Return the cutoff of the container.
Definition: VerletListsLinkedBase.h:305
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:121
size_t generateAoSNeighborLists()
Clears and then generates the AoS neighbor lists.
Definition: VerletLists.h:150
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:104
void computeInteractions(TraversalInterface *traversal) override
Iterates over all particle multiples (e.g.
Definition: VerletLists.h:78
void generateSoAListFromAoSVerletLists()
Fills SoA neighbor list with particle indices.
Definition: VerletLists.h:166
VerletListHelpers< Particle_T >::NeighborListAoSType & getVerletListsAoS()
get the actual neighbor list
Definition: VerletLists.h:97
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