diff --git a/src/core/bond_breakage/bond_breakage.cpp b/src/core/bond_breakage/bond_breakage.cpp index df7ca1bc75..506e35c4de 100644 --- a/src/core/bond_breakage/bond_breakage.cpp +++ b/src/core/bond_breakage/bond_breakage.cpp @@ -204,4 +204,40 @@ void BondBreakage::process_queue_impl(System::System &system) { } } +bool bond_handler(BondBreakage &bond_breakage, Particle &p, + std::span partners, int bond_id, + BoxGeometry const &box_geo) { + + if (partners.size() == 1u) { // pair bonds + auto d = box_geo.get_mi_vector(p.pos(), partners[0]->pos()).norm(); + return bond_breakage.check_and_handle_breakage( + p.id(), {{partners[0]->id(), std::nullopt}}, bond_id, d); + } + if (partners.size() == 2u) { // angle bond + auto d = + box_geo.get_mi_vector(partners[0]->pos(), partners[1]->pos()).norm(); + return bond_breakage.check_and_handle_breakage( + p.id(), {{partners[0]->id(), partners[1]->id()}}, bond_id, d); + } + return false; +} + +void execute_bond_breakage(System::System &system, + BondBreakage &bond_breakage) { + // Clear the bond breakage queue + bond_breakage.clear_queue(); + + // Create the bond kernel function (the bond handler) + auto bond_kernel = [&](Particle &p, int bond_id, + std::span partners) { + return bond_handler(bond_breakage, p, partners, bond_id, *system.box_geo); + }; + + // Use the CellStructure::bond_loop to process bonds + system.cell_structure->bond_loop(bond_kernel); + + // Process the bond breakage queue + bond_breakage.process_queue(system); +} + } // namespace BondBreakage diff --git a/src/core/bond_breakage/bond_breakage.hpp b/src/core/bond_breakage/bond_breakage.hpp index 6725ba8103..c5b6869654 100644 --- a/src/core/bond_breakage/bond_breakage.hpp +++ b/src/core/bond_breakage/bond_breakage.hpp @@ -110,4 +110,6 @@ class BondBreakage { int bond_type); }; +void execute_bond_breakage(System::System &system, BondBreakage &bond_breakage); + } // namespace BondBreakage diff --git a/src/python/espressomd/bond_breakage.py b/src/python/espressomd/bond_breakage.py index 66c4ed468e..3e9ddfbf73 100644 --- a/src/python/espressomd/bond_breakage.py +++ b/src/python/espressomd/bond_breakage.py @@ -55,3 +55,19 @@ def __getitem__(self, key): def __setitem__(self, key, value): return super().__setitem__(self._get_key(key), value) + + +@script_interface_register +class BondBreakage(ScriptInterfaceHelper): + """Bond breakage interface. + + This class provides methods to manage and manipulate bond breakage. + + Methods + ------- + execute(parameters) + Executes the bond breakage with the given parameters. + """ + + _so_name = "BondBreakage::BondBreakage" + _so_bind_methods = ("execute",) diff --git a/src/script_interface/bond_breakage/BondBreakage.cpp b/src/script_interface/bond_breakage/BondBreakage.cpp new file mode 100644 index 0000000000..f1f3b69383 --- /dev/null +++ b/src/script_interface/bond_breakage/BondBreakage.cpp @@ -0,0 +1,29 @@ +#include "BondBreakage.hpp" + +#include "script_interface/Variant.hpp" +#include "script_interface/get_value.hpp" + +#include "core/bond_breakage/bond_breakage.hpp" +#include "core/system/System.hpp" + +#include + +namespace ScriptInterface { +namespace BondBreakage { + +Variant BondBreakage::do_call_method(std::string const &name, + VariantMap const &) { + if (name == "execute") { + + context()->parallel_try_catch([]() { + execute_bond_breakage(System::get_system(), + *System::get_system().bond_breakage); + }); + + return {}; + } + return {}; +} + +} // namespace BondBreakage +} // namespace ScriptInterface diff --git a/src/script_interface/bond_breakage/BondBreakage.hpp b/src/script_interface/bond_breakage/BondBreakage.hpp new file mode 100644 index 0000000000..72939201c9 --- /dev/null +++ b/src/script_interface/bond_breakage/BondBreakage.hpp @@ -0,0 +1,17 @@ +#pragma once + +#include "script_interface/ScriptInterface.hpp" +#include "script_interface/auto_parameters/AutoParameters.hpp" +#include + +namespace ScriptInterface { +namespace BondBreakage { + +class BondBreakage : public AutoParameters { +public: + Variant do_call_method(std::string const &name, + VariantMap const ¶meters) override; +}; + +} // namespace BondBreakage +} // namespace ScriptInterface diff --git a/src/script_interface/bond_breakage/CMakeLists.txt b/src/script_interface/bond_breakage/CMakeLists.txt index 7403634473..8799638f71 100644 --- a/src/script_interface/bond_breakage/CMakeLists.txt +++ b/src/script_interface/bond_breakage/CMakeLists.txt @@ -17,5 +17,7 @@ # along with this program. If not, see . # -target_sources(espresso_script_interface - PRIVATE ${CMAKE_CURRENT_SOURCE_DIR}/initialize.cpp) +target_sources( + espresso_script_interface + PRIVATE ${CMAKE_CURRENT_SOURCE_DIR}/initialize.cpp + ${CMAKE_CURRENT_SOURCE_DIR}/BondBreakage.cpp) diff --git a/src/script_interface/bond_breakage/initialize.cpp b/src/script_interface/bond_breakage/initialize.cpp index 380665fdd1..52a629ab82 100644 --- a/src/script_interface/bond_breakage/initialize.cpp +++ b/src/script_interface/bond_breakage/initialize.cpp @@ -18,6 +18,7 @@ */ #include "initialize.hpp" +#include "BondBreakage.hpp" #include "BreakageSpec.hpp" #include "BreakageSpecs.hpp" @@ -26,6 +27,7 @@ namespace BondBreakage { void initialize(Utils::Factory *f) { f->register_new("BondBreakage::BreakageSpec"); f->register_new("BondBreakage::BreakageSpecs"); + f->register_new("BondBreakage::BondBreakage"); } } // namespace BondBreakage } // namespace ScriptInterface