Icarus
Vehicle Simulation as a Transformable Computational Graph, built on Vulcan and Janus
Loading...
Searching...
No Matches
Integrator.hpp
Go to the documentation of this file.
1#pragma once
2
9
10#include <functional>
13#include <string>
14
15namespace icarus {
16
17// =============================================================================
18// Adaptive Step Result
19// =============================================================================
20
26template <typename Scalar> struct AdaptiveStepResult {
27 JanusVector<Scalar> state;
28 Scalar dt_actual;
30 bool accepted;
31};
32
33// =============================================================================
34// Abstract Integrator Interface
35// =============================================================================
36
45template <typename Scalar> class Integrator {
46 public:
47 virtual ~Integrator() = default;
48
55 std::function<JanusVector<Scalar>(Scalar t, const JanusVector<Scalar> &x)>;
56
66 virtual JanusVector<Scalar> Step(const DerivativeFunc &f, const JanusVector<Scalar> &x,
67 Scalar t, Scalar dt) = 0;
68
72 [[nodiscard]] virtual std::string Name() const = 0;
73
77 [[nodiscard]] virtual int Order() const = 0;
78
82 [[nodiscard]] virtual IntegratorType Type() const = 0;
83
87 [[nodiscard]] virtual bool IsAdaptive() const { return false; }
88};
89
90// =============================================================================
91// Adaptive Integrator Interface
92// =============================================================================
93
101template <typename Scalar> class AdaptiveIntegrator : public Integrator<Scalar> {
102 public:
104
117 AdaptiveStep(const DerivativeFunc &f, const JanusVector<Scalar> &x, Scalar t, Scalar dt) = 0;
118
119 [[nodiscard]] bool IsAdaptive() const override { return true; }
120
124 virtual void SetAbsTol(Scalar tol) = 0;
125
129 virtual void SetRelTol(Scalar tol) = 0;
130
134 [[nodiscard]] virtual Scalar GetAbsTol() const = 0;
135
139 [[nodiscard]] virtual Scalar GetRelTol() const = 0;
140};
141
142} // namespace icarus
Core type definitions, concepts, and configuration for Icarus.
Integrator type enumeration and configuration.
Interface for adaptive step integrators.
Definition Integrator.hpp:101
virtual void SetAbsTol(Scalar tol)=0
Set absolute tolerance.
virtual AdaptiveStepResult< Scalar > AdaptiveStep(const DerivativeFunc &f, const JanusVector< Scalar > &x, Scalar t, Scalar dt)=0
Advance with error control.
virtual Scalar GetRelTol() const =0
Get current relative tolerance.
virtual void SetRelTol(Scalar tol)=0
Set relative tolerance.
bool IsAdaptive() const override
Check if integrator supports adaptive stepping.
Definition Integrator.hpp:119
virtual Scalar GetAbsTol() const =0
Get current absolute tolerance.
Abstract interface for numerical integrators.
Definition Integrator.hpp:45
virtual ~Integrator()=default
virtual IntegratorType Type() const =0
Get integrator type.
virtual std::string Name() const =0
Get integrator name for logging.
virtual bool IsAdaptive() const
Check if integrator supports adaptive stepping.
Definition Integrator.hpp:87
virtual JanusVector< Scalar > Step(const DerivativeFunc &f, const JanusVector< Scalar > &x, Scalar t, Scalar dt)=0
Advance state by one step.
virtual int Order() const =0
Get integrator order (for error analysis).
std::function< JanusVector< Scalar >(Scalar t, const JanusVector< Scalar > &x)> DerivativeFunc
Derivative function signature.
Definition Integrator.hpp:54
Definition AggregationTypes.hpp:13
IntegratorType
Available integrator methods.
Definition IntegratorTypes.hpp:27
Result from adaptive step integrators.
Definition Integrator.hpp:26
JanusVector< Scalar > state
New state at t + dt_actual.
Definition Integrator.hpp:27
Scalar error_estimate
Local truncation error estimate.
Definition Integrator.hpp:29
bool accepted
Whether step was accepted.
Definition Integrator.hpp:30
Scalar dt_actual
Actual step taken (may differ from requested).
Definition Integrator.hpp:28