ESPResSo
Extensible Simulation Package for Research on Soft Matter Systems
Loading...
Searching...
No Matches
core/collision_detection/CollisionDetection.hpp
Go to the documentation of this file.
1/*
2 * Copyright (C) 2011-2024 The ESPResSo project
3 *
4 * This file is part of ESPResSo.
5 *
6 * ESPResSo is free software: you can redistribute it and/or modify
7 * it under the terms of the GNU General Public License as published by
8 * the Free Software Foundation, either version 3 of the License, or
9 * (at your option) any later version.
10 *
11 * ESPResSo is distributed in the hope that it will be useful,
12 * but WITHOUT ANY WARRANTY; without even the implied warranty of
13 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
14 * GNU General Public License for more details.
15 *
16 * You should have received a copy of the GNU General Public License
17 * along with this program. If not, see <http://www.gnu.org/licenses/>.
18 */
19
20#pragma once
21
22#include <config/config.hpp>
23
24#ifdef COLLISION_DETECTION
25
26#include "ActiveProtocol.hpp"
27#include "CollisionPair.hpp"
28
29#include "Particle.hpp"
30#include "system/Leaf.hpp"
31
32#include <memory>
33#include <utility>
34#include <variant>
35#include <vector>
36
37namespace CollisionDetection {
38
39class CollisionDetection : public System::Leaf<CollisionDetection> {
40 std::shared_ptr<ActiveProtocol> m_protocol;
41
42public:
43 CollisionDetection() = default;
44 /** @brief Get currently active collision protocol. */
45 auto get_protocol() const { return m_protocol; }
46 /** @brief Set a new collision protocol. */
47 void set_protocol(std::shared_ptr<ActiveProtocol> protocol);
48 /** @brief Delete the currently active collision protocol. */
49 void unset_protocol();
50 /** @brief Validate parameters and create particle types if needed. */
51 void initialize();
52
53 auto is_off() const {
54 return m_protocol == nullptr or std::holds_alternative<Off>(*m_protocol);
55 }
56
57 auto cutoff() const {
58 if (m_protocol == nullptr) {
59 return INACTIVE_CUTOFF;
60 }
61 return std::visit([](auto const &protocol) { return protocol.cutoff(); },
62 *m_protocol);
63 }
64
65 /// Handle queued collisions
66 void handle_collisions();
67
68 void clear_queue() { local_collision_queue.clear(); }
69
70 /** @brief Detect (and queue) a collision between the given particles. */
71 void detect_collision(Particle const &p1, Particle const &p2,
72 double const dist_sq) {
73 if (m_protocol) {
74 bool collision_detected = std::visit(
75 [&p1, &p2, dist_sq](auto const &protocol) {
76 return protocol.detect_collision(p1, p2, dist_sq);
77 },
78 *m_protocol);
79
80 if (collision_detected) {
81 local_collision_queue.emplace_back(p1.id(), p2.id());
82 }
83 }
84 }
85 /// During force calculation, colliding particles are recorded in the queue.
86 /// The queue is processed after force calculation, when it is safe to add
87 /// particles.
88 std::vector<CollisionPair> local_collision_queue;
89};
90
91} // namespace CollisionDetection
92
93#endif // COLLISION_DETECTION
auto get_protocol() const
Get currently active collision protocol.
void detect_collision(Particle const &p1, Particle const &p2, double const dist_sq)
Detect (and queue) a collision between the given particles.
std::vector< CollisionPair > local_collision_queue
During force calculation, colliding particles are recorded in the queue. The queue is processed after...
Abstract class that represents a component of the system.
This file contains the defaults for ESPResSo.
constexpr double INACTIVE_CUTOFF
Cutoff for deactivated interactions.
Struct holding all information for one particle.
Definition Particle.hpp:395
auto const & id() const
Definition Particle.hpp:414