45template <
class Particle_T>
69 DirectSum(
const std::array<double, 3> &boxMin,
const std::array<double, 3> &boxMax,
double cutoff,
double skin,
70 const size_t aosSortingThresholdFallback,
const size_t soaSortingThresholdFallback)
72 soaSortingThresholdFallback),
73 _cellBorderFlagManager() {
74 using namespace autopas::utils::ArrayMath::literals;
78 std::for_each(++this->
_cells.begin(), this->_cells.end(),
79 [&](
auto &cell) { cell.setPossibleParticleOwnerships(OwnershipState::halo); });
80 auto boxLength = boxMax - boxMin;
81 this->
_cells[0].setCellLength(boxLength);
87 [[nodiscard]] ContainerOption
getContainerType()
const override {
return ContainerOption::directSum; }
89 void reserve(
size_t numParticles,
size_t numParticlesHaloEstimate)
override {
90 this->getOwnedCell().
reserve(numParticles);
91 for (
auto cellIt = ++this->
_cells.begin(); cellIt != this->
_cells.end(); cellIt++) {
92 cellIt->reserve(numParticlesHaloEstimate);
107 const auto pos = haloParticle.getR();
109 for (
size_t dim = 0; dim < 3; ++dim) {
110 if (pos[dim] < boxMin[dim]) {
111 this->
_cells[2 * dim + 1].addParticle(haloParticle);
113 }
else if (pos[dim] >= boxMax[dim]) {
114 this->
_cells[2 * dim + 2].addParticle(haloParticle);
126 const auto pos = haloParticle.getR();
130 for (
size_t dim = 0; dim < 3; ++dim) {
131 if (pos[dim] < boxMin[dim] + skinHalf) {
135 }
else if (pos[dim] >= boxMax[dim] - skinHalf) {
145 for (
auto cellIt = ++this->
_cells.begin(); cellIt != this->
_cells.end(); cellIt++) {
155 prepareTraversal(traversal);
162 [[nodiscard]] std::vector<Particle_T>
updateContainer(
bool keepNeighborListsValid)
override {
163 if (keepNeighborListsValid) {
170 std::vector<Particle_T> invalidParticles{};
171 auto &particleVec = getOwnedCell().
_particles;
172 for (
auto iter = particleVec.begin(); iter != particleVec.end();) {
173 if (
utils::notInBox(iter->getR(), this->getBoxMin(), this->getBoxMax())) {
174 invalidParticles.push_back(*iter);
176 *iter = particleVec.back();
177 particleVec.pop_back();
182 return invalidParticles;
189 using namespace autopas::utils::ArrayMath::literals;
203 IteratorBehavior behavior = IteratorBehavior::ownedOrHalo,
205 std::nullopt)
override {
213 IteratorBehavior behavior = IteratorBehavior::ownedOrHalo,
215 std::nullopt)
const override {
222 template <
typename Lambda>
223 void forEach(Lambda forEachLambda, IteratorBehavior behavior) {
224 if (behavior & IteratorBehavior::owned) {
225 getOwnedCell().
forEach(forEachLambda);
227 if (behavior & IteratorBehavior::halo) {
228 for (
auto cellIt = ++this->
_cells.begin(); cellIt != this->
_cells.end(); cellIt++) {
229 cellIt->forEach(forEachLambda);
233 if (not(behavior & IteratorBehavior::ownedOrHalo)) {
241 template <
typename Lambda,
typename A>
242 void reduce(Lambda reduceLambda, A &result, IteratorBehavior behavior) {
243 if (behavior & IteratorBehavior::owned) {
244 getOwnedCell().
reduce(reduceLambda, result);
246 if (behavior & IteratorBehavior::halo) {
247 for (
auto cellIt = ++this->
_cells.begin(); cellIt != this->
_cells.end(); cellIt++) {
248 cellIt->reduce(reduceLambda, result);
252 if (not(behavior & IteratorBehavior::ownedOrHalo)) {
261 const std::array<double, 3> &lowerCorner,
const std::array<double, 3> &higherCorner, IteratorBehavior behavior,
263 std::nullopt)
override {
271 const std::array<double, 3> &lowerCorner,
const std::array<double, 3> &higherCorner, IteratorBehavior behavior,
273 std::nullopt)
const override {
280 template <
typename Lambda>
282 const std::array<double, 3> &higherCorner, IteratorBehavior behavior) {
283 if (behavior & IteratorBehavior::owned) {
284 getOwnedCell().
forEach(forEachLambda, lowerCorner, higherCorner, behavior);
286 if (behavior & IteratorBehavior::halo) {
287 for (
auto cellIt = ++this->
_cells.begin(); cellIt != this->
_cells.end(); cellIt++) {
288 cellIt->forEach(forEachLambda, lowerCorner, higherCorner, behavior);
292 if (not(behavior & IteratorBehavior::ownedOrHalo)) {
300 template <
typename Lambda,
typename A>
301 void reduceInRegion(Lambda reduceLambda, A &result,
const std::array<double, 3> &lowerCorner,
302 const std::array<double, 3> &higherCorner, IteratorBehavior behavior) {
303 if (behavior & IteratorBehavior::owned) {
304 getOwnedCell().
reduce(reduceLambda, result, lowerCorner, higherCorner, behavior);
306 if (behavior & IteratorBehavior::halo) {
307 for (
auto cellIt = ++this->
_cells.begin(); cellIt != this->
_cells.end(); cellIt++) {
308 cellIt->reduce(reduceLambda, result, lowerCorner, higherCorner, behavior);
312 if (not(behavior & IteratorBehavior::ownedOrHalo)) {
317 std::tuple<const Particle_T *, size_t, size_t>
getParticle(
size_t cellIndex,
size_t particleIndex,
318 IteratorBehavior iteratorBehavior,
319 const std::array<double, 3> &boxMin,
320 const std::array<double, 3> &boxMax)
const override {
321 return getParticleImpl<true>(cellIndex, particleIndex, iteratorBehavior, boxMin, boxMax);
323 std::tuple<const Particle_T *, size_t, size_t>
getParticle(
size_t cellIndex,
size_t particleIndex,
324 IteratorBehavior iteratorBehavior)
const override {
326 constexpr std::array<double, 3> boxMin{std::numeric_limits<double>::lowest(), std::numeric_limits<double>::lowest(),
327 std::numeric_limits<double>::lowest()};
329 constexpr std::array<double, 3> boxMax{std::numeric_limits<double>::max(), std::numeric_limits<double>::max(),
330 std::numeric_limits<double>::max()};
331 return getParticleImpl<false>(cellIndex, particleIndex, iteratorBehavior, boxMin, boxMax);
339 auto swapDelFromCell = [&](
auto &particleCell) ->
bool {
340 auto &particleVec = particleCell._particles;
341 const bool isRearParticle = &particle == &particleVec.back();
342 particle = particleVec.back();
343 particleVec.pop_back();
344 return isRearParticle;
348 if (particle.isOwned()) {
349 return swapDelFromCell(getOwnedCell());
350 }
else if (particle.isHalo()) {
354 const auto pos = particle.getR();
357 for (
size_t dim = 0; dim < 3; ++dim) {
358 if (pos[dim] < boxMin[dim] + skinHalf) {
359 if (swapDelFromCell(this->
_cells[2 * dim + 1])) {
362 }
else if (pos[dim] >= boxMax[dim] - skinHalf) {
363 if (swapDelFromCell(this->
_cells[2 * dim + 2])) {
373 auto &particleVec = this->
_cells[cellIndex]._particles;
374 auto &particle = particleVec[particleIndex];
376 particle = particleVec.back();
377 particleVec.pop_back();
378 return particleIndex < particleVec.size();
386 using index_t = std::size_t;
389 [[nodiscard]]
bool cellCanContainHaloParticles(index_t index1d)
const override {
390 return index1d >= 1 and index1d <= 6;
393 [[nodiscard]]
bool cellCanContainOwnedParticles(index_t index1d)
const override {
return index1d == 0; }
395 } _cellBorderFlagManager;
408 template <
bool regionIter>
409 std::tuple<const Particle_T *, size_t, size_t> getParticleImpl(
size_t cellIndex,
size_t particleIndex,
410 IteratorBehavior iteratorBehavior,
411 const std::array<double, 3> &boxMin,
412 const std::array<double, 3> &boxMax)
const {
414 const auto [startCellIndex, endCellIndex] = [&]() -> std::tuple<size_t, size_t> {
416 if (not(iteratorBehavior & IteratorBehavior::halo)) {
420 if (not(iteratorBehavior & IteratorBehavior::owned)) {
424 if constexpr (regionIter) {
435 if (cellIndex == 0 and particleIndex == 0) {
440 if (cellIndex >= this->
_cells.size()) {
441 return {
nullptr, 0, 0};
444 if (particleIndex >= this->
_cells[cellIndex].
size() or
445 not containerIteratorUtils::particleFulfillsIteratorRequirements<regionIter>(
446 this->
_cells[cellIndex][particleIndex], iteratorBehavior, boxMin, boxMax)) {
448 std::tie(cellIndex, particleIndex) =
449 advanceIteratorIndices<regionIter>(cellIndex, particleIndex, iteratorBehavior, boxMin, boxMax);
453 if (cellIndex >= this->
_cells.size()) {
454 return {
nullptr, 0, 0};
456 const Particle_T *retPtr = &this->
_cells[cellIndex][particleIndex];
458 return {retPtr, cellIndex, particleIndex};
472 template <
bool regionIter>
473 std::tuple<size_t, size_t> advanceIteratorIndices(
size_t cellIndex,
size_t particleIndex,
474 IteratorBehavior iteratorBehavior,
475 const std::array<double, 3> &boxMin,
476 const std::array<double, 3> &boxMax)
const {
484 while (particleIndex >= this->
_cells[cellIndex].
size()) {
488 if (cellIndex > ((not(iteratorBehavior & IteratorBehavior::halo)) ? 0 : (this->
_cells.
size() - 1))) {
489 return {std::numeric_limits<
decltype(cellIndex)>::max(), std::numeric_limits<
decltype(particleIndex)>::max()};
492 }
while (not containerIteratorUtils::particleFulfillsIteratorRequirements<regionIter>(
493 this->
_cells[cellIndex][particleIndex], iteratorBehavior, boxMin, boxMax));
496 return {cellIndex, particleIndex};
504 template <
typename Traversal>
505 void prepareTraversal(Traversal &traversal) {
508 if (dsTraversal && cellTraversal) {
511 cellTraversal->setCellsToTraverse(this->
_cells);
514 "The selected traversal is not compatible with the DirectSum container. TraversalID: {}",
515 traversal->getTraversalType());
The CellBasedParticleContainer class stores particles in some object and provides methods to iterate ...
Definition: CellBasedParticleContainer.h:28
const std::array< double, 3 > & getBoxMax() const final
Get the upper corner of the container without halo.
Definition: CellBasedParticleContainer.h:79
size_t size() const override
Get the total number of particles saved in the container (owned + halo + dummy).
Definition: CellBasedParticleContainer.h:141
double getVerletSkin() const final
Returns the verlet Skin length.
Definition: CellBasedParticleContainer.h:104
double getCutoff() const final
Return the cutoff of the container.
Definition: CellBasedParticleContainer.h:89
std::shared_ptr< const SortingThresholdInfoInterface > _soaSortingThresholds
Current AoS pair-sorting threshold, forwarded to freshly generated traversals in prepareTraversal().
Definition: CellBasedParticleContainer.h:192
std::shared_ptr< const SortingThresholdInfoInterface > _aosSortingThresholds
Current AoS pair-sorting threshold, forwarded to freshly generated traversals in prepareTraversal().
Definition: CellBasedParticleContainer.h:188
const std::array< double, 3 > & getBoxMin() const final
Get the lower corner of the container without halo.
Definition: CellBasedParticleContainer.h:84
std::vector< ParticleCellType > _cells
Vector of particle cells.
Definition: CellBasedParticleContainer.h:181
A cell pair traversal.
Definition: CellTraversal.h:25
virtual void setAoSSortingThresholds(const SortingThresholdInfoInterface &aosSortingThreshold)=0
Set the aos-sorting-threshold for traversals that use the CellFunctor.
Public iterator class that iterates over a particle container and additional vectors (which are typic...
Definition: ContainerIterator.h:95
std::conditional_t< modifiable, std::vector< std::vector< Particle_T > * >, std::vector< std::vector< Particle_T > const * > > ParticleVecType
Type of the additional vector collection.
Definition: ContainerIterator.h:108
Interface for traversals used by the DirectSum container.
Definition: DSTraversalInterface.h:18
This class stores all owned particles in a single cell.
Definition: DirectSum.h:46
bool deleteParticle(size_t cellIndex, size_t particleIndex) override
Deletes the particle at the given index positions as long as this does not compromise the validity of...
Definition: DirectSum.h:372
std::tuple< const Particle_T *, size_t, size_t > getParticle(size_t cellIndex, size_t particleIndex, IteratorBehavior iteratorBehavior) const override
Fetch the pointer to a particle, identified via a cell and particle index.
Definition: DirectSum.h:323
bool deleteParticle(Particle_T &particle) override
Deletes the given particle as long as this does not compromise the validity of the container.
Definition: DirectSum.h:337
void addParticleImpl(const Particle_T &p) override
Adds a particle to the container.
Definition: DirectSum.h:99
void reduceInRegion(Lambda reduceLambda, A &result, const std::array< double, 3 > &lowerCorner, const std::array< double, 3 > &higherCorner, IteratorBehavior behavior)
Execute code on all particles in this container in a certain region as defined by a lambda function.
Definition: DirectSum.h:301
TraversalSelectorInfo getTraversalSelectorInfo() const override
Generates a traversal selector info for this container.
Definition: DirectSum.h:188
void forEachInRegion(Lambda forEachLambda, const std::array< double, 3 > &lowerCorner, const std::array< double, 3 > &higherCorner, IteratorBehavior behavior)
Execute code on all particles in this container in a certain region as defined by a lambda function.
Definition: DirectSum.h:281
ContainerIterator< Particle_T, false, false > begin(IteratorBehavior behavior=IteratorBehavior::ownedOrHalo, utils::optRef< typename ContainerIterator< Particle_T, false, false >::ParticleVecType > additionalVectors=std::nullopt) const override
Iterate over all particles using for(auto iter = container.begin(); iter.isValid(); ++iter) .
Definition: DirectSum.h:212
void rebuildNeighborLists(TraversalInterface *traversal) override
Rebuilds the neighbor lists for the next traversals.
Definition: DirectSum.h:150
void deleteHaloParticles() override
Deletes all halo particles.
Definition: DirectSum.h:144
FullParticleCell< Particle_T > ParticleCellType
Type of the ParticleCell.
Definition: DirectSum.h:51
void reserve(size_t numParticles, size_t numParticlesHaloEstimate) override
Reserve memory for a given number of particles in the container and logic layers.
Definition: DirectSum.h:89
std::tuple< const Particle_T *, size_t, size_t > getParticle(size_t cellIndex, size_t particleIndex, IteratorBehavior iteratorBehavior, const std::array< double, 3 > &boxMin, const std::array< double, 3 > &boxMax) const override
Fetch the pointer to a particle, identified via a cell and particle index.
Definition: DirectSum.h:317
void computeInteractions(TraversalInterface *traversal) override
Iterates over all particle multiples (e.g.
Definition: DirectSum.h:154
std::vector< Particle_T > updateContainer(bool keepNeighborListsValid) override
Updates the container.
Definition: DirectSum.h:162
ContainerIterator< Particle_T, true, true > getRegionIterator(const std::array< double, 3 > &lowerCorner, const std::array< double, 3 > &higherCorner, IteratorBehavior behavior, utils::optRef< typename ContainerIterator< Particle_T, true, true >::ParticleVecType > additionalVectors=std::nullopt) override
Iterate over all particles in a specified region for(auto iter = container.getRegionIterator(lowCorne...
Definition: DirectSum.h:260
DirectSum(const std::array< double, 3 > &boxMin, const std::array< double, 3 > &boxMax, double cutoff, double skin, const size_t aosSortingThresholdFallback, const size_t soaSortingThresholdFallback)
Constructor of the DirectSum class.
Definition: DirectSum.h:69
void forEach(Lambda forEachLambda, IteratorBehavior behavior)
Execute code on all particles in this container as defined by a lambda function.
Definition: DirectSum.h:223
bool updateHaloParticle(const Particle_T &haloParticle) override
Update a halo particle of the container with the given haloParticle.
Definition: DirectSum.h:123
void addHaloParticleImpl(const Particle_T &haloParticle) override
Adds a particle to the container that lies in the halo region of the container.
Definition: DirectSum.h:104
ContainerIterator< Particle_T, false, true > getRegionIterator(const std::array< double, 3 > &lowerCorner, const std::array< double, 3 > &higherCorner, IteratorBehavior behavior, utils::optRef< typename ContainerIterator< Particle_T, false, true >::ParticleVecType > additionalVectors=std::nullopt) const override
Iterate over all particles in a specified region for(auto iter = container.getRegionIterator(lowCorne...
Definition: DirectSum.h:270
ContainerOption getContainerType() const override
Get the ContainerType.
Definition: DirectSum.h:87
Particle_T ParticleType
Type of the Particle.
Definition: DirectSum.h:56
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: DirectSum.h:202
void reduce(Lambda reduceLambda, A &result, IteratorBehavior behavior)
Reduce properties of particles as defined by a lambda function.
Definition: DirectSum.h:242
This class handles the storage of particles in their full form.
Definition: FullParticleCell.h:26
void deleteDummyParticles() override
Deletes all dummy particles in this cell.
Definition: FullParticleCell.h:227
StorageType _particles
Storage of the molecules of the cell.
Definition: FullParticleCell.h:274
void forEach(Lambda forEachLambda)
Executes code for every particle in this cell as defined by lambda function.
Definition: FullParticleCell.h:105
void reserve(size_t n)
Requests that the vector capacity be at least enough to contain n elements.
Definition: FullParticleCell.h:269
void addParticle(const Particle_T &p) override
Adds a Particle to the cell.
Definition: FullParticleCell.h:51
void reduce(Lambda reduceLambda, A &result)
Reduce properties of particles as defined by a lambda function.
Definition: FullParticleCell.h:144
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.
Info for traversals of a specific container.
Definition: TraversalSelectorInfo.h:14
Interface class to handle cell borders and cell types of cells.
Definition: CellBorderAndFlagManager.h:17
static void exception(const Exception e)
Handle an exception derived by std::exception.
Definition: ExceptionHandler.h:64
std::vector< typename ContainerType::ParticleType > collectParticlesAndMarkNonOwnedAsDummy(ContainerType &container)
Collects leaving particles and marks halo particles as dummy.
Definition: LeavingParticleCollector.h:85
static bool checkParticleInCellAndUpdateByIDAndPosition(CellType &cell, const typename CellType::ParticleType &particle, double absError)
Same as checkParticleInCellAndUpdateByID(CellType, ParticleType), but additionally checks whether the...
Definition: ParticleCellHelpers.h:39
constexpr bool less(const std::array< T, SIZE > &a, const std::array< T, SIZE > &b)
True iff for all d the following holds: a[d] < b[d].
Definition: ArrayMath.h:79
bool notInBox(const std::array< T, 3 > &position, const std::array< T, 3 > &low, const std::array< T, 3 > &high)
Checks if position is not inside of a box defined by low and high.
Definition: inBox.h:50
std::optional< std::reference_wrapper< T > > optRef
Short alias for std::optional<std::reference_wrapper<T>>
Definition: optRef.h:16
This is the main namespace of AutoPas.
Definition: AutoPasDecl.h:34
int autopas_get_num_threads()
Dummy for omp_get_num_threads() when no OpenMP is available.
Definition: WrapOpenMP.h:138
@ owned
Owned state, a particle with this state is an actual particle and owned by the current AutoPas object...
int autopas_get_thread_num()
Dummy for omp_set_lock() when no OpenMP is available.
Definition: WrapOpenMP.h:132