Program Listing for File steadystateproblem.h

Return to documentation for file (include/amici/steadystateproblem.h)

#ifndef AMICI_STEADYSTATE_PROBLEM_H
#define AMICI_STEADYSTATE_PROBLEM_H

#include <amici/defines.h>
#include <amici/model_state.h>
#include <amici/newton_solver.h>
#include <amici/vector.h>

namespace amici {

class ExpData;
class Solver;
class Model;
class BackwardProblem;
struct FwdSimWorkspace;
struct BwdSimWorkspace;

class WRMSComputer {
  public:
    WRMSComputer(
        int const n, SUNContext const sunctx, realtype const atol,
        realtype const rtol, AmiVector mask
    )
        : ewt_(n, sunctx)
        , rtol_(rtol)
        , atol_(atol)
        , mask_(mask) {}

    realtype wrms(AmiVector const& x, AmiVector const& x_ref);

  private:
    AmiVector ewt_;
    realtype rtol_;
    realtype atol_;
    AmiVector mask_;
};

class NewtonsMethod {
  public:
    NewtonsMethod(
        gsl::not_null<Model*> model, SUNContext sunctx,
        gsl::not_null<NewtonSolver*> solver,
        NewtonDampingFactorMode damping_factor_mode,
        realtype damping_factor_lower_bound, int max_steps, bool check_delta
    );

    void
    run(AmiVector& xdot, DEStateView const& state, WRMSComputer& wrms_computer);

    void compute_step(AmiVector const& xdot, DEStateView const& state);

    [[nodiscard]] AmiVector const& get_delta() const { return delta_; }

    [[nodiscard]] int get_num_steps() const { return i_step_; }

    [[nodiscard]] realtype get_wrms() const { return wrms_; }

  private:

    bool update_damping_factor(bool step_successful, double& gamma);

    realtype compute_wrms(
        AmiVector const& xdot, DEStateView const& state,
        WRMSComputer& wrms_computer
    );

    bool has_converged(
        AmiVector& xdot, DEStateView const& state, WRMSComputer& wrms_computer
    );

    static constexpr realtype conv_thresh = 1.0;

    gsl::not_null<Model*> model_;

    int max_steps_{0};

    NewtonDampingFactorMode damping_factor_mode_{NewtonDampingFactorMode::on};

    realtype damping_factor_lower_bound_{1e-8};

    bool check_delta_;

    gsl::not_null<NewtonSolver*> solver_;

    AmiVector delta_;

    AmiVector delta_old_;

    AmiVector x_old_;

    realtype wrms_ = INFINITY;

    int i_step_ = 0;
};

} // namespace amici
#endif // AMICI_STEADYSTATE_PROBLEM_H