From 15660ed6466285a44f37b3f38383f01033d56439 Mon Sep 17 00:00:00 2001 From: HenrZu <69154294+HenrZu@users.noreply.github.com> Date: Mon, 13 Jul 2026 14:01:58 +0200 Subject: [PATCH 1/3] m_flow_delta --- cpp/memilio/compartments/flow_simulation.h | 5 +++-- cpp/memilio/compartments/flow_simulation_base.h | 10 +++++++++- 2 files changed, 12 insertions(+), 3 deletions(-) diff --git a/cpp/memilio/compartments/flow_simulation.h b/cpp/memilio/compartments/flow_simulation.h index 1293b3ca56..f4aac13075 100755 --- a/cpp/memilio/compartments/flow_simulation.h +++ b/cpp/memilio/compartments/flow_simulation.h @@ -75,8 +75,9 @@ class FlowSimulation : public details::FlowSimulationBase FlowSimulationBase(Model const& model, std::unique_ptr&& integrator_core, FP t0, FP dt) : Base(model, std::move(integrator_core), t0, dt) , m_flow_result(t0, model.get_initial_flows()) + , m_flow_delta(model.get_initial_flows().size()) { } @@ -97,13 +98,20 @@ class FlowSimulationBase : public SimulationBase // calculate new time points for (Eigen::Index i = result.get_num_time_points(); i < flows.get_num_time_points(); i++) { result.add_time_point(flows.get_time(i)); - model.get_derivatives(flows.get_value(i) - flows.get_value(last_tp), result.get_value(i)); + m_flow_delta = flows.get_value(i) - flows.get_value(last_tp); + model.get_derivatives(m_flow_delta, result.get_value(i)); result.get_value(i) += result.get_value(last_tp); } } + Eigen::VectorX& get_flow_delta() + { + return m_flow_delta; + } + private: mio::TimeSeries m_flow_result; ///< Flow result of the simulation. + Eigen::VectorX m_flow_delta; ///< Pre-allocated temporary for flow changes relative to the current base point. }; /// @brief Specialization of FlowSimulationBase that takes a SystemIntegrator instead of it's Integrands. From 6780dac5c17adf9d9f6caff3f562fbaa5ee0e4f1 Mon Sep 17 00:00:00 2001 From: HenrZu <69154294+HenrZu@users.noreply.github.com> Date: Mon, 13 Jul 2026 19:31:25 +0200 Subject: [PATCH 2/3] reserve for result --- cpp/memilio/compartments/flow_simulation_base.h | 1 + 1 file changed, 1 insertion(+) diff --git a/cpp/memilio/compartments/flow_simulation_base.h b/cpp/memilio/compartments/flow_simulation_base.h index 9e19fb8a75..7f7ec79c5d 100755 --- a/cpp/memilio/compartments/flow_simulation_base.h +++ b/cpp/memilio/compartments/flow_simulation_base.h @@ -95,6 +95,7 @@ class FlowSimulationBase : public SimulationBase auto& result = this->get_result(); // take the last time point as base result (instead of the initial results), so that we use external changes const size_t last_tp = result.get_num_time_points() - 1; + result.reserve(flows.get_num_time_points()); // calculate new time points for (Eigen::Index i = result.get_num_time_points(); i < flows.get_num_time_points(); i++) { result.add_time_point(flows.get_time(i)); From 8341eb5234aa1c4ad0f77db09dc21bd31bcab85f Mon Sep 17 00:00:00 2001 From: HenrZu <69154294+HenrZu@users.noreply.github.com> Date: Thu, 20 Aug 2026 13:31:15 +0200 Subject: [PATCH 3/3] remove getter for m_flow_delta --- cpp/memilio/compartments/flow_simulation.h | 7 ++++--- cpp/memilio/compartments/flow_simulation_base.h | 7 +------ 2 files changed, 5 insertions(+), 9 deletions(-) diff --git a/cpp/memilio/compartments/flow_simulation.h b/cpp/memilio/compartments/flow_simulation.h index f4aac13075..dd4332a8d8 100755 --- a/cpp/memilio/compartments/flow_simulation.h +++ b/cpp/memilio/compartments/flow_simulation.h @@ -49,6 +49,7 @@ class FlowSimulation : public details::FlowSimulationBase>(), t0, dt) , m_pop(model.get_initial_values().size()) + , m_flow_delta(Base::get_flows().get_num_elements()) { } @@ -75,9 +76,8 @@ class FlowSimulation : public details::FlowSimulationBase m_pop; ///< pre-allocated temporary, used during computation of flow derivatives + Eigen::VectorX m_flow_delta; ///< Pre-allocated temporary for flow changes used during integration. }; /** diff --git a/cpp/memilio/compartments/flow_simulation_base.h b/cpp/memilio/compartments/flow_simulation_base.h index 7f7ec79c5d..883de68051 100755 --- a/cpp/memilio/compartments/flow_simulation_base.h +++ b/cpp/memilio/compartments/flow_simulation_base.h @@ -56,7 +56,7 @@ class FlowSimulationBase : public SimulationBase FlowSimulationBase(Model const& model, std::unique_ptr&& integrator_core, FP t0, FP dt) : Base(model, std::move(integrator_core), t0, dt) , m_flow_result(t0, model.get_initial_flows()) - , m_flow_delta(model.get_initial_flows().size()) + , m_flow_delta(m_flow_result.get_num_elements()) { } @@ -105,11 +105,6 @@ class FlowSimulationBase : public SimulationBase } } - Eigen::VectorX& get_flow_delta() - { - return m_flow_delta; - } - private: mio::TimeSeries m_flow_result; ///< Flow result of the simulation. Eigen::VectorX m_flow_delta; ///< Pre-allocated temporary for flow changes relative to the current base point.