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