From 8c652b7e2349452e31a49275982c14a983994bb9 Mon Sep 17 00:00:00 2001 From: Somesh Kurahatti Date: Wed, 25 Sep 2024 19:38:53 +0200 Subject: [PATCH 1/6] bond breakage --- src/core/bond_breakage/bond_breakage.cpp | 38 +++++++++ src/core/bond_breakage/bond_breakage.hpp | 3 + src/python/espressomd/bond_breakage.py | 80 +++++++++++++++++++ .../bond_breakage/BondBreakage.cpp | 27 +++++++ .../bond_breakage/BondBreakage.hpp | 17 ++++ .../bond_breakage/CMakeLists.txt | 4 +- .../bond_breakage/initialize.cpp | 2 + 7 files changed, 170 insertions(+), 1 deletion(-) create mode 100644 src/script_interface/bond_breakage/BondBreakage.cpp create mode 100644 src/script_interface/bond_breakage/BondBreakage.hpp diff --git a/src/core/bond_breakage/bond_breakage.cpp b/src/core/bond_breakage/bond_breakage.cpp index df7ca1bc757..dae36f3ebd9 100644 --- a/src/core/bond_breakage/bond_breakage.cpp +++ b/src/core/bond_breakage/bond_breakage.cpp @@ -204,4 +204,42 @@ 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(); + if (bond_breakage.check_and_handle_breakage( + p.id(), {{partners[0]->id(), std::nullopt}}, bond_id, d)) { + return true; + } + return false; + } + if (partners.size() == 2u) { // angle bond + auto d = + box_geo.get_mi_vector(partners[0]->pos(), partners[1]->pos()).norm(); + if (bond_breakage.check_and_handle_breakage( + p.id(), {{partners[0]->id(), partners[1]->id()}}, bond_id, d)) { + return true; + } + return false; + } + 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 6725ba8103b..bdd762e222d 100644 --- a/src/core/bond_breakage/bond_breakage.hpp +++ b/src/core/bond_breakage/bond_breakage.hpp @@ -108,6 +108,9 @@ class BondBreakage { /** Add a particle+bond combination to the breakage queue */ void queue_breakage(int particle_id, BondPartners const &bond_partners, 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 66c4ed468eb..698fada0906 100644 --- a/src/python/espressomd/bond_breakage.py +++ b/src/python/espressomd/bond_breakage.py @@ -55,3 +55,83 @@ 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",) + + def execute(self, parameters): + """ + Execute the bond breakage process. + + Parameters + ---------- + parameters : dict + Dictionary containing parameters for the bond breakage process. + + Returns + ------- + result : any + Result of the bond breakage execution. + """ + return self.call_method("execute", parameters=parameters) + +@script_interface_register +class BondBreakageInterface(ScriptObjectMap): + """Interface for managing multiple BondBreakage instances.""" + + _so_name = "BondBreakage::BondBreakageInterface" + _so_bind_methods = BondBreakage._so_bind_methods + ("size", "clear") + + def add(self, bond_breakage): + """ + Add a BondBreakage instance to the interface. + + Parameters + ---------- + bond_breakage : BondBreakage + An instance of BondBreakage to add. + """ + def _add(self, bond_breakage): + if isinstance(bond_breakage, BondBreakage): + self.call_method("add", object=bond_breakage) + else: + raise ValueError("Only BondBreakage instances can be added.") + + if isinstance(bond_breakage, collections.abc.Iterable): + for bb in bond_breakage: + _add(self, bb) + else: + _add(self, bond_breakage) + + def remove(self, bond_breakage): + """ + Remove a BondBreakage instance from the interface. + + Parameters + ---------- + bond_breakage : BondBreakage + An instance of BondBreakage to remove. + """ + def _remove(self, bond_breakage): + if isinstance(bond_breakage, BondBreakage): + self.call_method("remove", object=bond_breakage) + else: + raise ValueError("Only BondBreakage instances can be removed.") + + if isinstance(bond_breakage, collections.abc.Iterable): + for bb in bond_breakage: + _remove(self, bb) + else: + _remove(bond_breakage) diff --git a/src/script_interface/bond_breakage/BondBreakage.cpp b/src/script_interface/bond_breakage/BondBreakage.cpp new file mode 100644 index 00000000000..b39c866009d --- /dev/null +++ b/src/script_interface/bond_breakage/BondBreakage.cpp @@ -0,0 +1,27 @@ +#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 00000000000..72939201c92 --- /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 74036344736..a0644e0ee2c 100644 --- a/src/script_interface/bond_breakage/CMakeLists.txt +++ b/src/script_interface/bond_breakage/CMakeLists.txt @@ -18,4 +18,6 @@ # target_sources(espresso_script_interface - PRIVATE ${CMAKE_CURRENT_SOURCE_DIR}/initialize.cpp) + 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 380665fdd13..acd1ae9c93c 100644 --- a/src/script_interface/bond_breakage/initialize.cpp +++ b/src/script_interface/bond_breakage/initialize.cpp @@ -20,12 +20,14 @@ #include "initialize.hpp" #include "BreakageSpec.hpp" #include "BreakageSpecs.hpp" +//#include "BondBreakage.hpp" namespace ScriptInterface { 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 From a4895ad13330f7965ef08f0a82d8c55c64cdd29b Mon Sep 17 00:00:00 2001 From: Somesh Kurahatti Date: Thu, 26 Sep 2024 10:42:15 +0200 Subject: [PATCH 2/6] bond-breakage-style-correction --- src/core/bond_breakage/bond_breakage.cpp | 28 +++++++++++-------- src/core/bond_breakage/bond_breakage.hpp | 1 - src/python/espressomd/bond_breakage.py | 4 +++ .../bond_breakage/BondBreakage.cpp | 24 ++++++++-------- .../bond_breakage/initialize.cpp | 4 +-- 5 files changed, 35 insertions(+), 26 deletions(-) diff --git a/src/core/bond_breakage/bond_breakage.cpp b/src/core/bond_breakage/bond_breakage.cpp index dae36f3ebd9..2392b58246c 100644 --- a/src/core/bond_breakage/bond_breakage.cpp +++ b/src/core/bond_breakage/bond_breakage.cpp @@ -204,7 +204,9 @@ 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){ +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(); @@ -226,20 +228,22 @@ bool bond_handler(BondBreakage &bond_breakage, Particle &p, std::span partners) { - return bond_handler(bond_breakage, p, partners, bond_id, *system.box_geo); - }; + // 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); + // 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); + // 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 bdd762e222d..c5b68696547 100644 --- a/src/core/bond_breakage/bond_breakage.hpp +++ b/src/core/bond_breakage/bond_breakage.hpp @@ -108,7 +108,6 @@ class BondBreakage { /** Add a particle+bond combination to the breakage queue */ void queue_breakage(int particle_id, BondPartners const &bond_partners, int bond_type); - }; void execute_bond_breakage(System::System &system, BondBreakage &bond_breakage); diff --git a/src/python/espressomd/bond_breakage.py b/src/python/espressomd/bond_breakage.py index 698fada0906..17c1607d769 100644 --- a/src/python/espressomd/bond_breakage.py +++ b/src/python/espressomd/bond_breakage.py @@ -56,6 +56,7 @@ 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. @@ -87,6 +88,7 @@ def execute(self, parameters): """ return self.call_method("execute", parameters=parameters) + @script_interface_register class BondBreakageInterface(ScriptObjectMap): """Interface for managing multiple BondBreakage instances.""" @@ -103,6 +105,7 @@ def add(self, bond_breakage): bond_breakage : BondBreakage An instance of BondBreakage to add. """ + def _add(self, bond_breakage): if isinstance(bond_breakage, BondBreakage): self.call_method("add", object=bond_breakage) @@ -124,6 +127,7 @@ def remove(self, bond_breakage): bond_breakage : BondBreakage An instance of BondBreakage to remove. """ + def _remove(self, bond_breakage): if isinstance(bond_breakage, BondBreakage): self.call_method("remove", object=bond_breakage) diff --git a/src/script_interface/bond_breakage/BondBreakage.cpp b/src/script_interface/bond_breakage/BondBreakage.cpp index b39c866009d..f1f3b693833 100644 --- a/src/script_interface/bond_breakage/BondBreakage.cpp +++ b/src/script_interface/bond_breakage/BondBreakage.cpp @@ -3,7 +3,7 @@ #include "script_interface/Variant.hpp" #include "script_interface/get_value.hpp" -#include "core/bond_breakage/bond_breakage.hpp" +#include "core/bond_breakage/bond_breakage.hpp" #include "core/system/System.hpp" #include @@ -11,16 +11,18 @@ 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 {}; +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 diff --git a/src/script_interface/bond_breakage/initialize.cpp b/src/script_interface/bond_breakage/initialize.cpp index acd1ae9c93c..638eae29fb4 100644 --- a/src/script_interface/bond_breakage/initialize.cpp +++ b/src/script_interface/bond_breakage/initialize.cpp @@ -20,14 +20,14 @@ #include "initialize.hpp" #include "BreakageSpec.hpp" #include "BreakageSpecs.hpp" -//#include "BondBreakage.hpp" +#include "BondBreakage.hpp" namespace ScriptInterface { namespace BondBreakage { void initialize(Utils::Factory *f) { f->register_new("BondBreakage::BreakageSpec"); f->register_new("BondBreakage::BreakageSpecs"); - //f->register_new("BondBreakage::BondBreakage"); + f->register_new("BondBreakage::BondBreakage"); } } // namespace BondBreakage } // namespace ScriptInterface From d9732f2d36d5326ebba61bac0140e4f7f93140d8 Mon Sep 17 00:00:00 2001 From: Somesh Kurahatti Date: Thu, 26 Sep 2024 16:40:15 +0200 Subject: [PATCH 3/6] bond-breakage-formatting --- src/python/espressomd/bond_breakage.py | 50 ------------------- .../bond_breakage/CMakeLists.txt | 8 +-- .../bond_breakage/initialize.cpp | 2 +- 3 files changed, 5 insertions(+), 55 deletions(-) diff --git a/src/python/espressomd/bond_breakage.py b/src/python/espressomd/bond_breakage.py index 17c1607d769..45a96ea4ea9 100644 --- a/src/python/espressomd/bond_breakage.py +++ b/src/python/espressomd/bond_breakage.py @@ -89,53 +89,3 @@ def execute(self, parameters): return self.call_method("execute", parameters=parameters) -@script_interface_register -class BondBreakageInterface(ScriptObjectMap): - """Interface for managing multiple BondBreakage instances.""" - - _so_name = "BondBreakage::BondBreakageInterface" - _so_bind_methods = BondBreakage._so_bind_methods + ("size", "clear") - - def add(self, bond_breakage): - """ - Add a BondBreakage instance to the interface. - - Parameters - ---------- - bond_breakage : BondBreakage - An instance of BondBreakage to add. - """ - - def _add(self, bond_breakage): - if isinstance(bond_breakage, BondBreakage): - self.call_method("add", object=bond_breakage) - else: - raise ValueError("Only BondBreakage instances can be added.") - - if isinstance(bond_breakage, collections.abc.Iterable): - for bb in bond_breakage: - _add(self, bb) - else: - _add(self, bond_breakage) - - def remove(self, bond_breakage): - """ - Remove a BondBreakage instance from the interface. - - Parameters - ---------- - bond_breakage : BondBreakage - An instance of BondBreakage to remove. - """ - - def _remove(self, bond_breakage): - if isinstance(bond_breakage, BondBreakage): - self.call_method("remove", object=bond_breakage) - else: - raise ValueError("Only BondBreakage instances can be removed.") - - if isinstance(bond_breakage, collections.abc.Iterable): - for bb in bond_breakage: - _remove(self, bb) - else: - _remove(bond_breakage) diff --git a/src/script_interface/bond_breakage/CMakeLists.txt b/src/script_interface/bond_breakage/CMakeLists.txt index a0644e0ee2c..8799638f710 100644 --- a/src/script_interface/bond_breakage/CMakeLists.txt +++ b/src/script_interface/bond_breakage/CMakeLists.txt @@ -17,7 +17,7 @@ # along with this program. If not, see . # -target_sources(espresso_script_interface - PRIVATE - ${CMAKE_CURRENT_SOURCE_DIR}/initialize.cpp - ${CMAKE_CURRENT_SOURCE_DIR}/BondBreakage.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 638eae29fb4..52a629ab82d 100644 --- a/src/script_interface/bond_breakage/initialize.cpp +++ b/src/script_interface/bond_breakage/initialize.cpp @@ -18,9 +18,9 @@ */ #include "initialize.hpp" +#include "BondBreakage.hpp" #include "BreakageSpec.hpp" #include "BreakageSpecs.hpp" -#include "BondBreakage.hpp" namespace ScriptInterface { namespace BondBreakage { From 63059fb0b3fdeac0c0a33d50051ad63bea2cf43f Mon Sep 17 00:00:00 2001 From: Somesh Kurahatti Date: Tue, 1 Oct 2024 17:47:00 +0200 Subject: [PATCH 4/6] bond-breakage --- src/python/espressomd/bond_breakage.py | 2 -- 1 file changed, 2 deletions(-) diff --git a/src/python/espressomd/bond_breakage.py b/src/python/espressomd/bond_breakage.py index 45a96ea4ea9..c4b8e543a2e 100644 --- a/src/python/espressomd/bond_breakage.py +++ b/src/python/espressomd/bond_breakage.py @@ -87,5 +87,3 @@ def execute(self, parameters): Result of the bond breakage execution. """ return self.call_method("execute", parameters=parameters) - - From 3f0fd70612d90731ae3eeaf8015a69734c9d5a48 Mon Sep 17 00:00:00 2001 From: Somesh Kurahatti Date: Fri, 11 Oct 2024 16:09:01 +0200 Subject: [PATCH 5/6] passing expression instead of bool --- src/core/bond_breakage/bond_breakage.cpp | 14 ++++---------- 1 file changed, 4 insertions(+), 10 deletions(-) diff --git a/src/core/bond_breakage/bond_breakage.cpp b/src/core/bond_breakage/bond_breakage.cpp index 2392b58246c..506e35c4dee 100644 --- a/src/core/bond_breakage/bond_breakage.cpp +++ b/src/core/bond_breakage/bond_breakage.cpp @@ -210,20 +210,14 @@ bool bond_handler(BondBreakage &bond_breakage, Particle &p, if (partners.size() == 1u) { // pair bonds auto d = box_geo.get_mi_vector(p.pos(), partners[0]->pos()).norm(); - if (bond_breakage.check_and_handle_breakage( - p.id(), {{partners[0]->id(), std::nullopt}}, bond_id, d)) { - return true; - } - return false; + 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(); - if (bond_breakage.check_and_handle_breakage( - p.id(), {{partners[0]->id(), partners[1]->id()}}, bond_id, d)) { - return true; - } - return false; + return bond_breakage.check_and_handle_breakage( + p.id(), {{partners[0]->id(), partners[1]->id()}}, bond_id, d); } return false; } From 66557f716de5de23c3ec6a2404c590ce6de56d84 Mon Sep 17 00:00:00 2001 From: Somesh Kurahatti Date: Sat, 12 Oct 2024 16:54:02 +0200 Subject: [PATCH 6/6] removing def execute --- src/python/espressomd/bond_breakage.py | 16 ---------------- 1 file changed, 16 deletions(-) diff --git a/src/python/espressomd/bond_breakage.py b/src/python/espressomd/bond_breakage.py index c4b8e543a2e..3e9ddfbf73c 100644 --- a/src/python/espressomd/bond_breakage.py +++ b/src/python/espressomd/bond_breakage.py @@ -71,19 +71,3 @@ class BondBreakage(ScriptInterfaceHelper): _so_name = "BondBreakage::BondBreakage" _so_bind_methods = ("execute",) - - def execute(self, parameters): - """ - Execute the bond breakage process. - - Parameters - ---------- - parameters : dict - Dictionary containing parameters for the bond breakage process. - - Returns - ------- - result : any - Result of the bond breakage execution. - """ - return self.call_method("execute", parameters=parameters)