svMultiPhysics
Loading...
Searching...
No Matches
ionic_bueno_orovio.h
1// SPDX-FileCopyrightText: Copyright (c) Stanford University, The Regents of the
2// University of California, and others. SPDX-License-Identifier: BSD-3-Clause
3
4#ifndef IONIC_BUENO_OROVIO_H
5#define IONIC_BUENO_OROVIO_H
6
7#include "ionic_model.h"
8
9#include "Vector.h"
10#include "utils.h"
11
12/**
13 * @brief Bueno-Orovio ionic model.
14 *
15 * **Reference**: Bueno-Orovio, Cherry, Fenton. Minimal model for human
16 * ventricular action potentials in tissue. Journal of Theoretical Biology
17 * (2008)
18 */
19class BuenoOrovio : public IonicModel {
20public:
21 /// Model label.
22 static inline const std::string label = "BO";
23
24 /// State variables.
25 static inline const InitialStates initial_X = {
26 {"u", -84.0}, {"v", 1.0}, {"w", 1.0}, {"s", 0.0}};
27
28 /// Gating variables.
29 static inline const InitialStates initial_Xg = {};
30
31 /// Index of the slow inward current gate (s), used as calcium proxy for
32 /// electromechanical coupling.
33 static constexpr unsigned int calcium_index = 3;
34
35 /// Model parameters class.
37 public:
39 constexpr bool required = true;
40
41 add_parameter("u_o", {0.0, 0.0, 0.0}, required);
42 add_parameter("u_u", {1.550, 1.56, 1.61}, required);
43 add_parameter("theta_v", {0.30, 0.3, 0.3}, required);
44 add_parameter("theta_w", {0.130, 0.13, 0.13}, required);
45 add_parameter("thetam_v", {6.E-3, 0.2, 0.1}, required);
46 add_parameter("theta_o", {6.E-3, 6.E-3, 5.E-3}, required);
47 add_parameter("taum_v1", {60.0, 75., 80.}, required);
48 add_parameter("taum_v2", {1.15E3, 10., 1.4506}, required);
49 add_parameter("taup_v", {1.45060, 1.4506, 1.4506}, required);
50 add_parameter("taum_w1", {60.0, 6., 70.}, required);
51 add_parameter("taum_w2", {15.0, 140., 8.}, required);
52 add_parameter("km_w", {65.0, 200., 200.}, required);
53 add_parameter("um_w", {3.E-2, 1.6E-2, 1.6E-2}, required);
54 add_parameter("taup_w", {200.0, 280., 280.}, required);
55 add_parameter("tau_fi", {0.110, 0.1, 0.078}, required);
56 add_parameter("tau_o1", {400.0, 470., 410.}, required);
57 add_parameter("tau_o2", {6.0, 6., 7.}, required);
58 add_parameter("tau_so1", {30.01810, 40., 91.}, required);
59 add_parameter("tau_so2", {0.99570, 1.2, 0.8}, required);
60 add_parameter("k_so", {2.04580, 2., 2.1}, required);
61 add_parameter("u_so", {0.650, 0.65, 0.6}, required);
62 add_parameter("tau_s1", {2.73420, 2.7342, 2.7342}, required);
63 add_parameter("tau_s2", {16.0, 2., 2.}, required);
64 add_parameter("k_s", {2.09940, 2.0994, 2.0994}, required);
65 add_parameter("u_s", {0.90870, 0.9087, 0.9087}, required);
66 add_parameter("tau_si", {1.88750, 2.9013, 3.3849}, required);
67 add_parameter("tau_winf", {7.E-2, 2.73E-2, 1.E-2}, required);
68 add_parameter("ws_inf", {0.940, 0.78, 0.5}, required);
69 }
70 };
71
72 /// Constructor.
75 /* Vrest_ = */ -84.0, /* Vscale_ = */ 85.70,
76 /* Tscale_ = */ 1.0, /* Voffset_ = */ -84.0) {}
77
78 /// Construct an instance of model parameters.
79 virtual std::unique_ptr<IonicModelParameters>
80 get_parameters() const override {
81 return std::make_unique<Parameters>();
82 }
83
84 /// Read model parameters from a parameter object.
85 virtual void read_parameters(const IonicModelParameters &params) override;
86
87 /// Distribute model parameters to all parallel processes.
88 virtual void distribute_parameters(const CmMod &cm_mod,
89 const cmType &cm) override;
90
91 /// Get the calcium proxy index.
92 virtual unsigned int get_calcium_index() const override {
93 return calcium_index;
94 }
95
96protected:
97 /// @name Model parameters
98 /// @{
99
100 /// Alias for model parameters container. The three entries in each of these
101 /// correspond to epicardium, endocardium and myocardium, respectively (see
102 /// also table 1 in the reference paper).
103 /// \todo [TODO:DaveP] these guys should be maps map<int,double>.
104 /// @todo[michelebucelli] Would it make sense to treat these in the same way
105 /// as the epi/endo/myo zone are treated in the TTP model?
107
108 ModelParam u_o = {0.0, 0.0, 0.0}; ///< [1].
109 ModelParam u_u = {1.550, 1.56, 1.61}; ///< [1].
110 ModelParam theta_v = {0.30, 0.3, 0.3}; ///< [1].
111 ModelParam theta_w = {0.130, 0.13, 0.13}; ///< [1].
112 ModelParam thetam_v = {6.E-3, 0.2, 0.1}; ///< [1].
113 ModelParam theta_o = {6.E-3, 6.E-3, 5.E-3}; ///< [1].
114 ModelParam taum_v1 = {60.0, 75., 80.}; ///< [1/s].
115 ModelParam taum_v2 = {1.15E3, 10., 1.4506}; ///< [1/s].
116 ModelParam taup_v = {1.45060, 1.4506, 1.4506}; ///< [1/s].
117 ModelParam taum_w1 = {60.0, 6., 70.}; ///< [1/s].
118 ModelParam taum_w2 = {15.0, 140., 8.}; ///< [1/s].
119 ModelParam km_w = {65.0, 200., 200.}; ///< [1].
120 ModelParam um_w = {3.E-2, 1.6E-2, 1.6E-2}; ///< [1].
121 ModelParam taup_w = {200.0, 280., 280.}; ///< [1/s].
122 ModelParam tau_fi = {0.110, 0.1, 0.078}; ///< [1/s].
123 ModelParam tau_o1 = {400.0, 470., 410.}; ///< [1/s].
124 ModelParam tau_o2 = {6.0, 6., 7.}; ///< [1/s].
125 ModelParam tau_so1 = {30.01810, 40., 91.}; ///< [1/s].
126 ModelParam tau_so2 = {0.99570, 1.2, 0.8}; ///< [1/s].
127 ModelParam k_so = {2.04580, 2., 2.1}; ///< [1].
128 ModelParam u_so = {0.650, 0.65, 0.6}; ///< [1].
129 ModelParam tau_s1 = {2.73420, 2.7342, 2.7342}; ///< [1/s].
130 ModelParam tau_s2 = {16.0, 2., 2.}; ///< [1/s].
131 ModelParam k_s = {2.09940, 2.0994, 2.0994}; ///< [1].
132 ModelParam u_s = {0.90870, 0.9087, 0.9087}; ///< [1].
133 ModelParam tau_si = {1.88750, 2.9013, 3.3849}; ///< [1/s].
134 ModelParam tau_winf = {7.E-2, 2.73E-2, 1.E-2}; ///< [1/s].
135 ModelParam ws_inf = {0.940, 0.78, 0.5}; ///< [1].
136
137 /// @}
138
139 /// Update variable with analytical solution. This model has none, so this
140 /// method does nothing.
141 virtual void update_g(const unsigned int zone_id, const double dt,
142 const Vector<double> &X,
143 Vector<double> &Xg) const override {}
144
145 /// Model right-hand side.
146 virtual Vector<double> getf(const unsigned int zone_id,
147 const Vector<double> &X, const Vector<double> &Xg,
148 const double I_stim,
149 const double I_sac) const override;
150
151 /// Model jacobian.
152 virtual Array<double> getj(const unsigned int zone_id,
153 const Vector<double> &X, const Vector<double> &Xg,
154 const double Ksac) const override;
155
156 /// Step function.
157 inline double step(const double r) const { return r < 0.0 ? 0.0 : 1.0; }
158
159 /// Delta function.
160 inline double delta(const double r) const {
161 return utils::is_zero(r) ? 1.0 : 0.0;
162 }
163};
164
165#endif
Model parameters class.
Definition ionic_bueno_orovio.h:36
Bueno-Orovio ionic model.
Definition ionic_bueno_orovio.h:19
static constexpr unsigned int calcium_index
Definition ionic_bueno_orovio.h:33
ModelParam theta_v
[1].
Definition ionic_bueno_orovio.h:110
ModelParam tau_so2
[1/s].
Definition ionic_bueno_orovio.h:126
virtual void read_parameters(const IonicModelParameters &params) override
Read model parameters from a parameter object.
Definition ionic_bueno_orovio.cpp:6
ModelParam theta_w
[1].
Definition ionic_bueno_orovio.h:111
ModelParam u_so
[1].
Definition ionic_bueno_orovio.h:128
static const InitialStates initial_X
State variables.
Definition ionic_bueno_orovio.h:25
ModelParam tau_s2
[1/s].
Definition ionic_bueno_orovio.h:130
ModelParam tau_s1
[1/s].
Definition ionic_bueno_orovio.h:129
ModelParam u_u
[1].
Definition ionic_bueno_orovio.h:109
virtual unsigned int get_calcium_index() const override
Get the calcium proxy index.
Definition ionic_bueno_orovio.h:92
virtual void update_g(const unsigned int zone_id, const double dt, const Vector< double > &X, Vector< double > &Xg) const override
Definition ionic_bueno_orovio.h:141
ModelParam tau_winf
[1/s].
Definition ionic_bueno_orovio.h:134
ModelParam taum_w1
[1/s].
Definition ionic_bueno_orovio.h:117
ModelParam taum_w2
[1/s].
Definition ionic_bueno_orovio.h:118
ModelParam tau_o2
[1/s].
Definition ionic_bueno_orovio.h:124
ModelParam tau_so1
[1/s].
Definition ionic_bueno_orovio.h:125
virtual Vector< double > getf(const unsigned int zone_id, const Vector< double > &X, const Vector< double > &Xg, const double I_stim, const double I_sac) const override
Model right-hand side.
Definition ionic_bueno_orovio.cpp:72
ModelParam k_so
[1].
Definition ionic_bueno_orovio.h:127
double delta(const double r) const
Delta function.
Definition ionic_bueno_orovio.h:160
ModelParam taup_w
[1/s].
Definition ionic_bueno_orovio.h:121
virtual Array< double > getj(const unsigned int zone_id, const Vector< double > &X, const Vector< double > &Xg, const double Ksac) const override
Model jacobian.
Definition ionic_bueno_orovio.cpp:119
ModelParam taum_v1
[1/s].
Definition ionic_bueno_orovio.h:114
virtual std::unique_ptr< IonicModelParameters > get_parameters() const override
Construct an instance of model parameters.
Definition ionic_bueno_orovio.h:80
ModelParam u_o
[1].
Definition ionic_bueno_orovio.h:108
static const InitialStates initial_Xg
Gating variables.
Definition ionic_bueno_orovio.h:29
ModelParam tau_si
[1/s].
Definition ionic_bueno_orovio.h:133
ModelParam theta_o
[1].
Definition ionic_bueno_orovio.h:113
static const std::string label
Model label.
Definition ionic_bueno_orovio.h:22
ModelParam tau_o1
[1/s].
Definition ionic_bueno_orovio.h:123
ModelParam taup_v
[1/s].
Definition ionic_bueno_orovio.h:116
virtual void distribute_parameters(const CmMod &cm_mod, const cmType &cm) override
Distribute model parameters to all parallel processes.
Definition ionic_bueno_orovio.cpp:39
ModelParam taum_v2
[1/s].
Definition ionic_bueno_orovio.h:115
ModelParam km_w
[1].
Definition ionic_bueno_orovio.h:119
double step(const double r) const
Step function.
Definition ionic_bueno_orovio.h:157
ModelParam um_w
[1].
Definition ionic_bueno_orovio.h:120
ModelParam tau_fi
[1/s].
Definition ionic_bueno_orovio.h:122
ModelParam k_s
[1].
Definition ionic_bueno_orovio.h:131
ModelParam ws_inf
[1].
Definition ionic_bueno_orovio.h:135
ModelParam thetam_v
[1].
Definition ionic_bueno_orovio.h:112
BuenoOrovio()
Constructor.
Definition ionic_bueno_orovio.h:73
ModelParam u_s
[1].
Definition ionic_bueno_orovio.h:132
The CmMod class duplicates the data structures in the Fortran CMMOD module defined in COMU....
Definition CmMod.h:35
Abstract ionic model class.
Definition ionic_model.h:127
std::vector< std::pair< std::string, double > > InitialStates
Definition ionic_model.h:133
Initial conditions parameters for a generic ionic model.
Definition Parameters.h:1242
void add_parameter(const std::string &label, double default_value, bool required)
Add a new parameter to this object.
Definition Parameters.h:1290
The cmType class stores data and defines methods used for mpi communication.
Definition CmMod.h:55