21 using state_type =
typename base_type::state_type;
22 using time_type =
typename base_type::time_type;
23 using value_type =
typename base_type::value_type;
25 explicit SRIW1Integrator(std::shared_ptr<typename base_type::sde_problem_type> problem,
26 std::shared_ptr<typename base_type::wiener_process_type> wiener =
nullptr)
29 void step(state_type& state, time_type dt)
override {
33 state_type drift_term = create_state_like(state);
34 state_type diffusion_term = create_state_like(state);
35 state_type dW = create_state_like(state);
38 this->wiener_->generate_increment(dW, dt);
41 this->problem_->drift(this->current_time_, state, drift_term);
42 this->problem_->diffusion(this->current_time_, state, diffusion_term);
45 for (
size_t i = 0; i < state.size(); ++i) {
46 auto state_it = state.begin();
47 auto drift_it = drift_term.begin();
48 auto diffusion_it = diffusion_term.begin();
49 auto dW_it = dW.begin();
51 state_it[i] += drift_it[i] * dt + diffusion_it[i] * dW_it[i];
54 this->advance_time(dt);
57 std::string name()
const override {
58 return "SRIW1 (Simplified Implementation)";
62 template<
typename State>
63 State create_state_like(
const State& prototype) {
65 if constexpr (
requires { result.resize(prototype.size()); }) {
66 result.resize(prototype.size());
67 std::fill(result.begin(), result.end(), value_type{0});