🛰️航天仿真算法库 SpaceAST 0.3.1
载入中...
搜索中...
未找到
ODEIntegrator.hpp
浏览该文件的文档.
1
20
21#pragma once
22
23#include "AstGlobal.h"
24#include "AstMath/ODEStateObserver.hpp"
25#include "AstMath/ODEEventDetectorList.hpp"
26#include "AstMath/ODEStateObserverList.hpp"
27#include "AstMath/ODEInnerStateObserver.hpp"
28#include "AstMath/OrdinaryDifferentialEquation.hpp"
29#include "AstUtil/Object.hpp"
30#include "AstUtil/ObjectNamed.hpp"
31#include <vector>
32#include <type_traits>
33
34AST_NAMESPACE_BEGIN
35
36class ODEEventDetector;
37
41class AST_MATH_API IODEIntegrator: public ObjectNamed
42{
43public:
44 IODEIntegrator() = default;
45 virtual ~IODEIntegrator() {};
46 IODEIntegrator(const IODEIntegrator&) = delete;
47 IODEIntegrator& operator=(const IODEIntegrator&) = delete;
48
52 virtual errc_t initialize(ODE& ode) = 0;
53
54
60 virtual errc_t integrate(ODE& ode, double* y,double& t, double tf) = 0;
61
62
72 virtual errc_t integrateOneStep(ODE& ode, double* y, double& t, double tf) = 0;
73
80 virtual errc_t singleStep(ODE& ode, double* y, double t0, double step) = 0;
81};
82
83
87class AST_MATH_API ODEIntegrator : public IODEIntegrator
88{
89public:
90 ODEIntegrator() = default;
91 ~ODEIntegrator() override;
92
93 using IODEIntegrator::integrate;
94
95 errc_t initialize(ODE& ode) override;
96
97
107 errc_t integrate(
108 ODE& ode, double* y, double& t, double tf,
109 std::vector<double>& xlist, std::vector<std::vector<double>>& ylist
110 );
111
119 template<typename Func>
120 errc_t integrate(int ndim, Func func, double* y, double& t, double tf)
121 {
122 auto ode = make_ode(ndim, func);
123 return integrate(ode, y, t, tf);
124 }
125
130 void addEventDetector(ODEEventDetector* detector);
131
135 template<typename Func>
136 typename std::enable_if<!std::is_base_of<ODEEventDetector, typename std::remove_pointer<Func>::type>::value, ODEEventDetector*>::type
137 addEventDetector(Func func) {
138 ODEEventDetector* detector = new ODEEventDetectorGeneric<Func>(std::move(func));
139 addEventDetector(detector);
140 return detector;
141 }
142
146 void removeEventDetector(ODEEventDetector* detector);
147
150 void clearEventDetectors();
151
154 void clearStateObservers();
155
160 void addStateObserver(ODEStateObserver* observer);
161
162
163 #ifndef SWIG
167 template<typename Func>
168 typename std::enable_if<!std::is_base_of<ODEStateObserver, typename std::remove_pointer<Func>::type>::value, ODEStateObserver*>::type
169 addStateObserver(Func func) {
170 auto observer = new ODEStateObserverGeneric<Func>(func);
171 addStateObserver(observer);
172 return observer;
173 }
174 #endif
175
179 void removeStateObserver(ODEStateObserver* observer);
180
184 ODE* getODE() { return ode_; }
185
189 double* stateAtStepStart() { return stateAtStepStart_; }
190
194 double* stateAtStepEnd() { return stateAtStepEnd_; }
195
199 double& timeAtStepStart() { return timeAtStepStart_; }
200
204 double& timeAtStepEnd() { return timeAtStepEnd_; }
205
209 double* stateTemp() { return stateTemp_; }
210protected:
211 errc_t integrateOneFixedStep(ODE& ode, double absStepSize, double* y, double& t, double tf);
212 errc_t integrateFixedStep(ODE& ode, double absStepSize, double* y, double& t, double tf, int* pNumSteps=nullptr);
213protected:
214 friend class ODEInnerStateObserver;
215 void initWorkStateObserver();
216 A_DISABLE_COPY(ODEIntegrator);
217protected:
218 ODE* ode_{nullptr};
219 ODEStateObserver* workStateObserver_{nullptr};
220 ODEEventDetectorList eventDetectorList_{};
221 ODEStateObserverList stateObserverList_{};
222 ODEInnerStateObserver* innerStateObserver_{nullptr};
223 double* stateAtStepStart_{nullptr};
224 double* stateAtStepEnd_{nullptr};
225 double* stateTemp_{nullptr};
226 double timeAtStepStart_{0.0};
227 double timeAtStepEnd_{0.0};
228};
229
230
231AST_NAMESPACE_END
ODE 积分器接口类
定义 ODEIntegrator.hpp:42
virtual errc_t singleStep(ODE &ode, double *y, double t0, double step)=0
按指定步长执行一步积分(执行单次步进)
virtual errc_t integrateOneStep(ODE &ode, double *y, double &t, double tf)=0
朝目标时刻执行单步积分
virtual errc_t integrate(ODE &ode, double *y, double &t, double tf)=0
从当前时间t开始积分到最终时间tf,直到事件检测器触发事件或者积分到最终时间tf,并将积分结果存储在y中
virtual errc_t initialize(ODE &ode)=0
初始化积分器
泛型ODE积分的事件检测器
定义 ODEEventDetector.hpp:98
定义 ODEEventDetectorList.hpp:32
ODE积分的事件检测器
定义 ODEEventDetector.hpp:36
定义 ODEInnerStateObserver.hpp:31
ODE 积分器
定义 ODEIntegrator.hpp:88
double * stateTemp()
获取临时状态向量
定义 ODEIntegrator.hpp:209
errc_t integrate(int ndim, Func func, double *y, double &t, double tf)
积分ODE
定义 ODEIntegrator.hpp:120
double & timeAtStepEnd()
获取当前积分步的结束时间
定义 ODEIntegrator.hpp:204
std::enable_if<!std::is_base_of< ODEStateObserver, typenamestd::remove_pointer< Func >::type >::value, ODEStateObserver * >::type addStateObserver(Func func)
添加状态观察者(泛型模板)
定义 ODEIntegrator.hpp:169
double * stateAtStepEnd()
获取当前积分步的结束状态
定义 ODEIntegrator.hpp:194
std::enable_if<!std::is_base_of< ODEEventDetector, typenamestd::remove_pointer< Func >::type >::value, ODEEventDetector * >::type addEventDetector(Func func)
添加事件检测器(泛型模板)
定义 ODEIntegrator.hpp:137
ODE * getODE()
获取ODE方程
定义 ODEIntegrator.hpp:184
double & timeAtStepStart()
获取当前积分步的开始时间
定义 ODEIntegrator.hpp:199
double * stateAtStepStart()
获取当前积分步的开始状态
定义 ODEIntegrator.hpp:189
泛型ODE状态量观察者
定义 ODEStateObserver.hpp:84
定义 ODEStateObserverList.hpp:30
ODE状态量观察者
定义 ODEStateObserver.hpp:39
命名对象
定义 ObjectNamed.hpp:36
常微分方程基接口
定义 OrdinaryDifferentialEquation.hpp:33
ODEGeneric< Func > make_ode(Func func, int dim)
创建一个常微分方程
定义 OrdinaryDifferentialEquation.hpp:89