DiffEq - Modern C++ ODE Integration Library 1.0.0
High-performance C++ library for solving ODEs with async signal processing
Loading...
Searching...
No Matches
abstract_integrator.hpp
1#pragma once
2#include <functional>
3#include <concepts>
4#include <type_traits>
5#include "concepts.hpp"
6
7namespace diffeq::core {
8
9// Abstract integrator base class
10template<system_state S>
12public:
13 using state_type = S;
14 using time_type = typename S::value_type;
15 using value_type = typename S::value_type;
16 using system_function = std::function<void(time_type, const state_type&, state_type&)>;
17
18 explicit AbstractIntegrator(system_function sys)
19 : sys_(std::move(sys)), current_time_(time_type{0}) {}
20
21 virtual ~AbstractIntegrator() = default;
22
23 // Pure virtual function that derived classes must implement
24 virtual void step(state_type& state, time_type dt) = 0;
25
26 // Virtual function for multi-step integration (can be overridden)
27 virtual void integrate(state_type& state, time_type dt, time_type end_time) {
28 while (current_time_ < end_time) {
29 time_type step_size = std::min(dt, end_time - current_time_);
30 step(state, step_size);
31 }
32 }
33
34 // Getters
35 time_type current_time() const { return current_time_; }
36
37 // Setters
38 void set_time(time_type t) { current_time_ = t; }
39 void set_system(system_function sys) { sys_ = std::move(sys); }
40
41protected:
42 system_function sys_;
43 time_type current_time_;
44
45 // Helper function for derived classes to update time
46 void advance_time(time_type dt) { current_time_ += dt; }
47};
48
49} // namespace diffeq::core