29template <
typename Particle_T>
37 std::vector<std::vector<std::vector<std::unique_ptr<std::mutex>>>> &spatialLocks)
38 : _spatialLocks(spatialLocks) {}
60 template <
bool newton3,
class ContainerType,
class TriwiseFunctor>
65 std::vector<Particle_T *> bufferParticles;
66 const auto numOwnedBufferParticles = collectBufferParticles(bufferParticles, particleBuffers, haloParticleBuffers);
74 timerBufferBufferBuffer.
start();
77 remainderHelper3bBufferBufferBufferAoS(bufferParticles, numOwnedBufferParticles, f);
79 timerBufferBufferBuffer.
stop();
80 timerBufferBufferContainer.
start();
83 remainderHelper3bBufferBufferContainerAoS(bufferParticles, numOwnedBufferParticles, container, f);
85 timerBufferBufferContainer.
stop();
86 timerBufferContainerContainer.
start();
89 remainderHelper3bBufferContainerContainerAoS<newton3>(bufferParticles, numOwnedBufferParticles, container, f);
90 timerBufferContainerContainer.
stop();
93 AutoPasLog(TRACE,
"Timer Buffer <-> Buffer <-> Container : {}", timerBufferBufferContainer.
getTotalTime());
94 AutoPasLog(TRACE,
"Timer Buffer <-> Container <-> Container : {}", timerBufferContainerContainer.
getTotalTime());
101 std::vector<std::vector<std::vector<std::unique_ptr<std::mutex>>>> &_spatialLocks;
113 size_t collectBufferParticles(std::vector<Particle_T *> &bufferParticles,
117 auto cellToVec = [](
auto &cell) -> std::vector<Particle_T> & {
return cell._particles; };
119 const size_t numOwnedBufferParticles =
120 std::transform_reduce(particleBuffers.begin(), particleBuffers.end(), 0, std::plus<>(),
121 [&](
auto &vec) { return cellToVec(vec).size(); });
123 const size_t numHaloBufferParticles =
124 std::transform_reduce(haloParticleBuffers.begin(), haloParticleBuffers.end(), 0, std::plus<>(),
125 [&](
auto &vec) { return cellToVec(vec).size(); });
127 bufferParticles.reserve(numOwnedBufferParticles + numHaloBufferParticles);
130 for (
auto &buffer : particleBuffers) {
131 for (
auto &p : buffer._particles) {
132 bufferParticles.push_back(&p);
136 for (
auto &buffer : haloParticleBuffers) {
137 for (
auto &p : buffer._particles) {
138 bufferParticles.push_back(&p);
141 return numOwnedBufferParticles;
153 template <
class TriwiseFunctor>
154 void remainderHelper3bBufferBufferBufferAoS(
const std::vector<Particle_T *> &bufferParticles,
155 const size_t numOwnedBufferParticles, TriwiseFunctor *f) {
157 for (
auto i = 0; i < numOwnedBufferParticles; ++i) {
158 Particle_T &p1 = *bufferParticles[i];
160 for (
auto j = 0; j < bufferParticles.size(); ++j) {
161 if (i == j)
continue;
162 Particle_T &p2 = *bufferParticles[j];
164 for (
auto k = j + 1; k < bufferParticles.size(); ++k) {
165 if (k == i)
continue;
166 Particle_T &p3 = *bufferParticles[k];
168 f->AoSFunctor(p1, p2, p3,
false);
185 template <
class ContainerType,
class TriwiseFunctor>
186 void remainderHelper3bBufferBufferContainerAoS(
const std::vector<Particle_T *> &bufferParticles,
187 size_t numOwnedBufferParticles, ContainerType &container,
190 using namespace autopas::utils::ArrayMath::literals;
192 const auto haloBoxMin = container.getBoxMin() - container.getInteractionLength();
193 const auto interactionLengthInv = 1. / container.getInteractionLength();
194 const double cutoff = container.getCutoff();
197 for (
auto i = 0; i < bufferParticles.size(); ++i) {
198 Particle_T &p1 = *bufferParticles[i];
199 const auto min = p1.getR() - cutoff;
200 const auto max = p1.getR() + cutoff;
202 for (
auto j = 0; j < bufferParticles.size(); ++j) {
203 if (j == i)
continue;
204 Particle_T &p2 = *bufferParticles[j];
205 container.forEachInRegion(
207 const auto lockCoords = static_cast_copy_array<size_t>((p3.getR() - haloBoxMin) * interactionLengthInv);
208 if (i < numOwnedBufferParticles) f->AoSFunctor(p1, p2, p3,
false);
209 if (!p3.isHalo() && i < j) {
210 const std::lock_guard<std::mutex> lock(*_spatialLocks[lockCoords[0]][lockCoords[1]][lockCoords[2]]);
211 f->AoSFunctor(p3, p1, p2,
false);
214 min,
max, IteratorBehavior::ownedOrHalo);
231 template <
bool newton3,
class ContainerType,
class TriwiseFunctor>
232 void remainderHelper3bBufferContainerContainerAoS(
const std::vector<Particle_T *> &bufferParticles,
233 size_t numOwnedBufferParticles, ContainerType &container,
237 using namespace autopas::utils::ArrayMath::literals;
239 const double cutoff = container.getCutoff();
240 for (
auto i = 0; i < bufferParticles.size(); ++i) {
241 Particle_T &p1 = *bufferParticles[i];
242 const auto boxMin = p1.getR() - cutoff;
243 const auto boxMax = p1.getR() + cutoff;
245 auto p2Iter = container.getRegionIterator(
246 boxMin, boxMax, IteratorBehavior::ownedOrHalo | IteratorBehavior::forceSequential, std::nullopt);
247 for (; p2Iter.isValid(); ++p2Iter) {
248 Particle_T &p2 = *p2Iter;
250 auto p3Iter = p2Iter;
253 for (; p3Iter.isValid(); ++p3Iter) {
254 Particle_T &p3 = *p3Iter;
256 if constexpr (newton3) {
259 if (i < numOwnedBufferParticles) {
#define AutoPasLog(lvl, fmt,...)
Macro for logging providing common meta information without filename.
Definition: Logger.h:24
#define AUTOPAS_OPENMP(args)
Empty macro to throw away any arguments.
Definition: WrapOpenMP.h:126
This class handles the storage of particles in their full form.
Definition: FullParticleCell.h:26
Handles triwise interactions involving particle buffers (particles not yet inserted into the main con...
Definition: RemainderTriwiseInteractionHandler.h:30
RemainderTriwiseInteractionHandler(std::vector< std::vector< std::vector< std::unique_ptr< std::mutex > > > > &spatialLocks)
Constructor for RemainderTriwiseInteractionHandler.
Definition: RemainderTriwiseInteractionHandler.h:36
void computeRemainderInteractions(TriwiseFunctor *f, ContainerType &container, std::vector< FullParticleCell< Particle_T > > &particleBuffers, std::vector< FullParticleCell< Particle_T > > &haloParticleBuffers)
Performs the interactions ParticleContainer::computeInteractions() did not cover.
Definition: RemainderTriwiseInteractionHandler.h:61
TriwiseFunctor class.
Definition: TriwiseFunctor.h:28
virtual void AoSFunctor(Particle_T &i, Particle_T &j, Particle_T &k, bool newton3)
TriwiseFunctor for arrays of structures (AoS).
Definition: TriwiseFunctor.h:54
A wrapper around autopas::utils::Timer that only compiles implementation logic if the SPDLOG_ACTIVE_L...
Definition: TraceTimer.h:20
long getTotalTime() const
Get total accumulated time.
Definition: TraceTimer.h:63
void start()
start the timer.
Definition: TraceTimer.h:25
long stop()
Stops the timer and returns the time elapsed in nanoseconds since the last call to start.
Definition: TraceTimer.h:34
constexpr std::array< T, SIZE > max(const std::array< T, SIZE > &a, const std::array< T, SIZE > &b)
Takes elementwise maximum and returns the result.
Definition: ArrayMath.h:96
constexpr std::array< T, SIZE > min(const std::array< T, SIZE > &a, const std::array< T, SIZE > &b)
Takes elementwise minimum, returns the result.
Definition: ArrayMath.h:62
constexpr std::array< output_t, SIZE > static_cast_copy_array(const std::array< input_t, SIZE > &a)
Creates a new array by performing an element-wise static_cast<>.
Definition: ArrayUtils.h:33
This is the main namespace of AutoPas.
Definition: AutoPasDecl.h:32