diff --git a/src/particles/elements/mixin/named.H b/src/particles/elements/mixin/named.H index 07cabc250..f06a6d86c 100644 --- a/src/particles/elements/mixin/named.H +++ b/src/particles/elements/mixin/named.H @@ -27,6 +27,28 @@ namespace impactx::elements */ struct Named { + /** Overwrite the name of the element + * + * @param new_name set a new name on the element + */ + AMREX_GPU_HOST + void set_name ( + std::string const & new_name + ) + { + // free old name + if (m_name != nullptr) { + delete[] m_name; + m_name = nullptr; + } + + // set new name + if (new_name.size() > 0) { + m_name = new char[new_name.size() + 1]; + std::strcpy(m_name, new_name.c_str()); + } + } + /** A user-named element * * @param name a user defined and not necessarily unique name of the element @@ -37,8 +59,7 @@ namespace impactx::elements ) { if (name.has_value()) { - m_name = new char[name->size() + 1]; - std::strcpy(m_name, name->c_str()); + set_name(*name); } } @@ -116,6 +137,7 @@ namespace impactx::elements return m_name != nullptr; } + private: // Implementation note: // This is used as a mixin class in elements that are copied to GPU. GPU compilers copy // a whole element by its sizeof(T). diff --git a/src/python/elements.cpp b/src/python/elements.cpp index 1f0f9cfb7..7d4a33f76 100644 --- a/src/python/elements.cpp +++ b/src/python/elements.cpp @@ -143,7 +143,11 @@ void init_elements(py::module& m) // mixin classes py::class_(me, "Named") - .def_property_readonly("name", &elements::Named::name) + .def_property("name", + [](elements::Named & nm) { return nm.name(); }, + [](elements::Named & nm, std::string new_name) { nm.set_name(new_name); }, + "segment length in m" + ) .def_property_readonly("has_name", &elements::Named::has_name) ; diff --git a/tests/python/test_push.py b/tests/python/test_push.py index 308c33784..04fde43bd 100644 --- a/tests/python/test_push.py +++ b/tests/python/test_push.py @@ -47,8 +47,14 @@ def test_element_push(): assert pc.total_number_of_particles() == npart # init accelerator lattice + drift = elements.Drift(name="drift1", ds=0.25) + assert drift.name == "drift1" + # changed my mind on the name + drift.name = "mydrift" + assert drift.name == "mydrift" + fodo = [ - elements.Drift(name="drift1", ds=0.25), + drift, ] sim.lattice.extend(fodo)