Program Listing for File steadystateproblem.h
↰ Return to documentation for file (include/amici/steadystateproblem.h
)
#ifndef AMICI_STEADYSTATEPROBLEM_H
#define AMICI_STEADYSTATEPROBLEM_H
#include <amici/defines.h>
#include <amici/model_state.h>
#include <amici/newton_solver.h>
#include <amici/vector.h>
#include <nvector/nvector_serial.h>
#include <memory>
namespace amici {
class ExpData;
class Solver;
class Model;
class SteadystateProblem {
public:
explicit SteadystateProblem(Solver const& solver, Model const& model);
void workSteadyStateProblem(Solver const& solver, Model& model, int it);
void workSteadyStateBackwardProblem(
Solver const& solver, Model& model, BackwardProblem const* bwd
);
SimulationState const& getFinalSimulationState() const { return state_; };
AmiVector const& getEquilibrationQuadratures() const { return xQB_; }
AmiVector const& getState() const { return state_.x; };
AmiVectorArray const& getStateSensitivity() const { return state_.sx; };
std::vector<realtype> const& getDJydx() const { return dJydx_; }
double getCPUTime() const { return cpu_time_; }
double getCPUTimeB() const { return cpu_timeB_; }
std::vector<SteadyStateStatus> const& getSteadyStateStatus() const {
return steady_state_status_;
}
realtype getSteadyStateTime() const { return state_.t; }
realtype getResidualNorm() const { return wrms_; }
std::vector<int> const& getNumSteps() const { return numsteps_; }
int getNumStepsB() const { return numstepsB_; }
void getAdjointUpdates(Model& model, ExpData const& edata);
AmiVector const& getAdjointState() const { return xB_; }
AmiVector const& getAdjointQuadrature() const { return xQB_; }
bool hasQuadrature() const { return hasQuadrature_; }
bool checkSteadyStateSuccess() const;
private:
void findSteadyState(Solver const& solver, Model& model, int it);
void findSteadyStateByNewtonsMethod(Model& model, bool newton_retry);
void
findSteadyStateBySimulation(Solver const& solver, Model& model, int it);
void computeSteadyStateQuadrature(Solver const& solver, Model& model);
void getQuadratureByLinSolve(Model& model);
void getQuadratureBySimulation(Solver const& solver, Model& model);
[[noreturn]] void handleSteadyStateFailure(
bool tried_newton_1, bool tried_simulation, bool tried_newton_2
);
void
writeErrorString(std::string* errorString, SteadyStateStatus status) const;
bool getSensitivityFlag(
Model const& model, Solver const& solver, int it,
SteadyStateContext context
);
realtype getWrmsNorm(
AmiVector const& x, AmiVector const& xdot, AmiVector const& mask,
realtype atol, realtype rtol, AmiVector& ewt
) const;
realtype getWrms(Model& model, SensitivityMethod sensi_method);
realtype getWrmsFSA(Model& model);
void applyNewtonsMethod(Model& model, bool newton_retry);
void
runSteadystateSimulation(Solver const& solver, Model& model, bool backward);
std::unique_ptr<Solver> createSteadystateSimSolver(
Solver const& solver, Model& model, bool forwardSensis, bool backward
) const;
void initializeForwardProblem(int it, Solver const& solver, Model& model);
bool initializeBackwardProblem(
Solver const& solver, Model& model, BackwardProblem const* bwd
);
void
computeQBfromQ(Model& model, AmiVector const& yQ, AmiVector& yQB) const;
bool makePositiveAndCheckConvergence(Model& model);
bool updateDampingFactor(bool step_successful);
void flagUpdatedState();
void updateSensiSimulation(Solver const& solver);
void updateRightHandSide(Model& model);
void getNewtonStep(Model& model);
AmiVector delta_;
AmiVector delta_old_;
AmiVector ewt_;
AmiVector ewtQB_;
AmiVector x_old_;
AmiVector xdot_;
AmiVectorArray sdx_;
AmiVector xB_;
AmiVector xQ_;
AmiVector xQB_;
AmiVector xQBdot_;
int max_steps_{0};
realtype wrms_{NAN};
std::vector<realtype> dJydx_;
SimulationState state_;
std::vector<int> numsteps_{std::vector<int>(3, 0)};
int numstepsB_{0};
double cpu_time_{0.0};
double cpu_timeB_{0.0};
bool hasQuadrature_{false};
double gamma_{1.0};
std::vector<SteadyStateStatus> steady_state_status_;
realtype atol_{NAN};
realtype rtol_{NAN};
realtype atol_sensi_{NAN};
realtype rtol_sensi_{NAN};
realtype atol_quad_{NAN};
realtype rtol_quad_{NAN};
std::unique_ptr<NewtonSolver> newton_solver_{nullptr};
NewtonDampingFactorMode damping_factor_mode_{NewtonDampingFactorMode::on};
realtype damping_factor_lower_bound_{1e-8};
bool newton_step_conv_{false};
bool check_sensi_conv_{true};
bool xdot_updated_{false};
bool delta_updated_{false};
bool sensis_updated_{false};
};
} // namespace amici
#endif // STEADYSTATEPROBLEM_H