2121#include < integrators/sde/milstein.hpp> // Milstein method with Lévy area (strong order 1.0)
2222#include < integrators/sde/sri1.hpp> // Stochastic Runge-Kutta method (strong order 1.0)
2323#include < integrators/sde/implicit_euler_maruyama.hpp> // Implicit method for stiff SDEs
24-
25- // Advanced high-order SDE integrators (strong order 1.5)
2624#include < integrators/sde/sra.hpp> // SRA base implementation
2725#include < integrators/sde/sra1.hpp> // SRA1 variant for additive noise
2826#include < integrators/sde/sra2.hpp> // SRA2 variant for additive noise
@@ -319,7 +317,7 @@ namespace diffeq {
319317 using DefaultTime = double ;
320318}
321319
322- // Optional: Convenience factory functions
320+ // Modern factory functions using std::make_unique
323321namespace diffeq {
324322
325323 /* *
@@ -329,7 +327,7 @@ namespace diffeq {
329327 auto make_rk45 (typename AbstractIntegrator<S>::system_function sys,
330328 typename S::value_type rtol = 1e-6 ,
331329 typename S::value_type atol = 1e-9 ) {
332- return integrators::ode::RK45Integrator<S>(std::move (sys), rtol, atol);
330+ return std::make_unique< integrators::ode::RK45Integrator<S> >(std::move (sys), rtol, atol);
333331 }
334332
335333 /* *
@@ -339,7 +337,7 @@ namespace diffeq {
339337 auto make_dop853 (typename AbstractIntegrator<S>::system_function sys,
340338 typename S::value_type rtol = 1e-10 ,
341339 typename S::value_type atol = 1e-15 ) {
342- return integrators::ode::DOP853Integrator<S>(std::move (sys), rtol, atol);
340+ return std::make_unique< integrators::ode::DOP853Integrator<S> >(std::move (sys), rtol, atol);
343341 }
344342
345343 /* *
@@ -349,6 +347,40 @@ namespace diffeq {
349347 auto make_bdf (typename AbstractIntegrator<S>::system_function sys,
350348 typename S::value_type rtol = 1e-6 ,
351349 typename S::value_type atol = 1e-9 ) {
352- return integrators::ode::BDFIntegrator<S>(std::move (sys), rtol, atol);
350+ return std::make_unique<integrators::ode::BDFIntegrator<S>>(std::move (sys), rtol, atol);
351+ }
352+
353+ /* *
354+ * Create an RK4 integrator (fixed step)
355+ */
356+ template <system_state S>
357+ auto make_rk4 (typename AbstractIntegrator<S>::system_function sys) {
358+ return std::make_unique<integrators::ode::RK4Integrator<S>>(std::move (sys));
359+ }
360+
361+ /* *
362+ * Create an RK23 integrator (adaptive)
363+ */
364+ template <system_state S>
365+ auto make_rk23 (typename AbstractIntegrator<S>::system_function sys,
366+ typename S::value_type rtol = 1e-6 ,
367+ typename S::value_type atol = 1e-9 ) {
368+ return std::make_unique<integrators::ode::RK23Integrator<S>>(std::move (sys), rtol, atol);
369+ }
370+
371+ /* *
372+ * Create an Euler integrator (fixed step)
373+ */
374+ template <system_state S>
375+ auto make_euler (typename AbstractIntegrator<S>::system_function sys) {
376+ return std::make_unique<integrators::ode::EulerIntegrator<S>>(std::move (sys));
377+ }
378+
379+ /* *
380+ * Create an Improved Euler integrator (fixed step)
381+ */
382+ template <system_state S>
383+ auto make_improved_euler (typename AbstractIntegrator<S>::system_function sys) {
384+ return std::make_unique<integrators::ode::ImprovedEulerIntegrator<S>>(std::move (sys));
353385 }
354386}
0 commit comments