31template <
class ContainerType>
33 const ContainerType &container) {
34 using namespace autopas::utils::ArrayMath::literals;
36 const auto upperBoundForMisplacement = container.getVerletSkin() / 2.0;
37 const auto interactionLength = container.getInteractionLength();
38 const auto &boxMin = container.getBoxMin();
39 const auto &boxMax = container.getBoxMax();
41 const auto lowerHaloCorner = boxMin - interactionLength - upperBoundForMisplacement;
42 const auto upperHaloCorner = boxMax + interactionLength + upperBoundForMisplacement;
46 const auto lowerInnerCorner = boxMin + upperBoundForMisplacement;
47 const auto upperInnerCorner = boxMax - upperBoundForMisplacement;
55 const std::array<std::tuple<
decltype(lowerHaloCorner),
decltype(upperHaloCorner)>, 6> haloVolumes{{
57 {{lowerHaloCorner[0], lowerInnerCorner[1], lowerHaloCorner[2]},
58 {lowerInnerCorner[0], upperInnerCorner[1], upperInnerCorner[2]}},
60 {{upperInnerCorner[0], lowerInnerCorner[1], lowerInnerCorner[2]},
61 {upperHaloCorner[0], upperInnerCorner[1], upperHaloCorner[2]}},
63 {{lowerHaloCorner[0], lowerInnerCorner[1], upperInnerCorner[2]},
64 {upperInnerCorner[0], upperInnerCorner[1], upperHaloCorner[2]}},
66 {{lowerInnerCorner[0], lowerInnerCorner[1], lowerHaloCorner[2]},
67 {upperHaloCorner[0], upperInnerCorner[1], lowerInnerCorner[2]}},
69 {lowerHaloCorner, {upperHaloCorner[0], lowerInnerCorner[1], upperHaloCorner[2]}},
71 {{lowerHaloCorner[0], upperInnerCorner[1], lowerHaloCorner[2]}, upperHaloCorner},
84template <
class ContainerType>
88 std::vector<typename ContainerType::ParticleType> leavingParticles{};
90 leavingParticles.reserve(10);
93 const auto &boxMin = container.getBoxMin();
94 const auto &boxMax = container.getBoxMax();
97 std::vector<typename ContainerType::ParticleType> : \
98 omp_out.insert(omp_out.end(), omp_in.begin(), omp_in.end())))
103 AUTOPAS_OPENMP(parallel reduction(vecMergeParticle : leavingParticles))
104 for (
const auto &[regionStart, regionEnd] : haloVolumes) {
105 for (
auto iter = container.getRegionIterator(regionStart, regionEnd, autopas::IteratorBehavior::ownedOrHalo);
106 iter.isValid(); ++iter) {
108 if (iter->isHalo()) {
111 }
else if (not
utils::inBox(iter->getR(), boxMin, boxMax)) {
112 leavingParticles.push_back(*iter);
117 return leavingParticles;
#define AUTOPAS_OPENMP(args)
Empty macro to throw away any arguments.
Definition: WrapOpenMP.h:126
Namespace to collect leaving particles from a container.
Definition: LeavingParticleCollector.h:19
std::array< std::tuple< const std::array< double, 3 >, const std::array< double, 3 > >, 6 > calculateHaloVolumes(const ContainerType &container)
For a given container that supports getCutoff(), getBoxMin() and getBoxMax(), calculates a set of 6 n...
Definition: LeavingParticleCollector.h:32
std::vector< typename ContainerType::ParticleType > collectParticlesAndMarkNonOwnedAsDummy(ContainerType &container)
Collects leaving particles and marks halo particles as dummy.
Definition: LeavingParticleCollector.h:85
bool inBox(const std::array< T, 3 > &position, const std::array< T, 3 > &low, const std::array< T, 3 > &high)
Checks if position is inside of a box defined by low and high.
Definition: inBox.h:26
@ dummy
Dummy or deleted state, a particle with this state is not an actual particle!