Nektar++
All Classes Namespaces Files Functions Variables Typedefs Enumerations Enumerator Properties Friends Macros Pages
TenTusscher06.cpp
Go to the documentation of this file.
1 ///////////////////////////////////////////////////////////////////////////////
2 //
3 // File: TenTusscher06.cpp
4 //
5 // For more information, please see: http://www.nektar.info
6 //
7 // The MIT License
8 //
9 // Copyright (c) 2006 Division of Applied Mathematics, Brown University (USA),
10 // Department of Aeronautics, Imperial College London (UK), and Scientific
11 // Computing and Imaging Institute, University of Utah (USA).
12 //
13 // Permission is hereby granted, free of charge, to any person obtaining a
14 // copy of this software and associated documentation files (the "Software"),
15 // to deal in the Software without restriction, including without limitation
16 // the rights to use, copy, modify, merge, publish, distribute, sublicense,
17 // and/or sell copies of the Software, and to permit persons to whom the
18 // Software is furnished to do so, subject to the following conditions:
19 //
20 // The above copyright notice and this permission notice shall be included
21 // in all copies or substantial portions of the Software.
22 //
23 // THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS
24 // OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
25 // FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL
26 // THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
27 // LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
28 // FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
29 // DEALINGS IN THE SOFTWARE.
30 //
31 // Description: ten Tusscher 2006 Epicardium cell model
32 //
33 ///////////////////////////////////////////////////////////////////////////////
34 
35 #include <iostream>
36 #include <string>
37 //#include <LibUtilities/BasicUtils/Vmath.hpp>
39 
40 namespace Nektar
41 {
42 
43 std::string TenTusscher06::className =
45  "TenTusscher06", TenTusscher06::create, "ten Tusscher 2006.");
46 
47 std::string TenTusscher06::lookupIds[4] = {
49  "CellModelVariant", "Epicardium", TenTusscher06::eEpicardium),
51  "CellModelVariant", "Endocardium", TenTusscher06::eEndocardium),
52  LibUtilities::SessionReader::RegisterEnumValue("CellModelVariant", "Mid",
55  "CellModelVariant", "Ischemia", TenTusscher06::eIschemia)};
56 
57 std::string TenTusscher06::def =
59  "Epicardium");
60 
61 /**
62  *
63  */
66  const MultiRegions::ExpListSharedPtr &pField)
67  : CellModel(pSession, pField)
68 {
69  model_variant = pSession->GetSolverInfoAsEnum<TenTusscher06::Variants>(
70  "CellModelVariant");
71 
72  switch (model_variant)
73  {
74  case eEpicardium:
75  g_to = 0.294;
76  g_Ks = 0.392;
77  s_inf_factor = 20.0;
78  s_tau_f1 = 85.0;
79  s_tau_f2 = 45.0;
80  s_tau_f3 = 320.0;
81  s_tau_f4 = 0.0;
82  s_tau_f5 = 1.0;
83  k_0 = 5.4;
84  break;
85  case eEndocardium:
86  g_to = 0.073;
87  g_Ks = 0.392;
88  s_inf_factor = 28.0;
89  s_tau_f1 = 1000.0;
90  s_tau_f2 = 67.0;
91  s_tau_f3 = 1000.0;
92  s_tau_f4 = 8.0;
93  s_tau_f5 = 0.0;
94  k_0 = 5.4;
95  break;
96  case eMid:
97  g_to = 0.294;
98  g_Ks = 0.098;
99  s_inf_factor = 20.0;
100  s_tau_f1 = 85.0;
101  s_tau_f2 = 45.0;
102  s_tau_f3 = 320.0;
103  s_tau_f4 = 0.0;
104  s_tau_f5 = 1.0;
105  k_0 = 5.4;
106  break;
107  case eIschemia:
108  g_to = 0.294;
109  g_Ks = 0.392;
110  s_inf_factor = 20.0;
111  s_tau_f1 = 85.0;
112  s_tau_f2 = 45.0;
113  s_tau_f3 = 320.0;
114  s_tau_f4 = 0.0;
115  s_tau_f5 = 1.0;
116  k_0 = 9.0;
117  break;
118  }
119  m_nvar = 19;
120 
121  m_gates.push_back(1);
122  m_gates.push_back(2);
123  m_gates.push_back(3);
124  m_gates.push_back(4);
125  m_gates.push_back(5);
126  m_gates.push_back(6);
127  m_gates.push_back(7);
128  m_gates.push_back(8);
129  m_gates.push_back(9);
130  m_gates.push_back(10);
131  m_gates.push_back(11);
132  m_gates.push_back(12);
133  m_concentrations.push_back(13);
134  m_concentrations.push_back(14);
135  m_concentrations.push_back(15);
136  m_concentrations.push_back(16);
137  m_concentrations.push_back(17);
138  m_concentrations.push_back(18);
139 }
140 
141 /**
142  *
143  */
145  const Array<OneD, const Array<OneD, NekDouble>> &inarray,
146  Array<OneD, Array<OneD, NekDouble>> &outarray, const NekDouble time)
147 {
148  boost::ignore_unused(time);
149 
150  for (size_t i = 0; i < m_nq; ++i)
151  {
152  // Inputs:
153  // Time units: millisecond
154  NekDouble var_chaste_interface__membrane__V = inarray[0][i];
155  // Units: millivolt; Initial value: -85.23
156  NekDouble
157  var_chaste_interface__rapid_time_dependent_potassium_current_Xr1_gate__Xr1 =
158  inarray[1][i];
159  // Units: dimensionless; Initial value: 0.00621
160  NekDouble
161  var_chaste_interface__rapid_time_dependent_potassium_current_Xr2_gate__Xr2 =
162  inarray[2][i];
163  // Units: dimensionless; Initial value: 0.4712
164  NekDouble
165  var_chaste_interface__slow_time_dependent_potassium_current_Xs_gate__Xs =
166  inarray[3][i];
167  // Units: dimensionless; Initial value: 0.0095
168  NekDouble var_chaste_interface__fast_sodium_current_m_gate__m =
169  inarray[4][i];
170  // Units: dimensionless; Initial value: 0.00172
171  NekDouble var_chaste_interface__fast_sodium_current_h_gate__h =
172  inarray[5][i];
173  // Units: dimensionless; Initial value: 0.7444
174  NekDouble var_chaste_interface__fast_sodium_current_j_gate__j =
175  inarray[6][i];
176  // Units: dimensionless; Initial value: 0.7045
177  NekDouble var_chaste_interface__L_type_Ca_current_d_gate__d =
178  inarray[7][i];
179  // Units: dimensionless; Initial value: 3.373e-5
180  NekDouble var_chaste_interface__L_type_Ca_current_f_gate__f =
181  inarray[8][i];
182  // Units: dimensionless; Initial value: 0.7888
183  NekDouble var_chaste_interface__L_type_Ca_current_f2_gate__f2 =
184  inarray[9][i];
185  // Units: dimensionless; Initial value: 0.9755
186  NekDouble var_chaste_interface__L_type_Ca_current_fCass_gate__fCass =
187  inarray[10][i];
188  // Units: dimensionless; Initial value: 0.9953
189  NekDouble var_chaste_interface__transient_outward_current_s_gate__s =
190  inarray[11][i];
191  // Units: dimensionless; Initial value: 0.999998
192  NekDouble var_chaste_interface__transient_outward_current_r_gate__r =
193  inarray[12][i];
194  // Units: dimensionless; Initial value: 2.42e-8
195  NekDouble var_chaste_interface__calcium_dynamics__Ca_i = inarray[13][i];
196  // Units: millimolar; Initial value: 0.000126
197  NekDouble var_chaste_interface__calcium_dynamics__Ca_SR =
198  inarray[14][i];
199  // Units: millimolar; Initial value: 3.64
200  NekDouble var_chaste_interface__calcium_dynamics__Ca_ss =
201  inarray[15][i];
202  // Units: millimolar; Initial value: 0.00036
203  NekDouble var_chaste_interface__calcium_dynamics__R_prime =
204  inarray[16][i];
205  // Units: dimensionless; Initial value: 0.9073
206  NekDouble var_chaste_interface__sodium_dynamics__Na_i = inarray[17][i];
207  // Units: millimolar; Initial value: 8.604
208  NekDouble var_chaste_interface__potassium_dynamics__K_i =
209  inarray[18][i];
210  // Units: millimolar; Initial value: 136.89
211 
212  // Mathematics
213  NekDouble d_dt_chaste_interface__membrane__V;
214  const NekDouble var_membrane__R = 8314.472; // joule_per_mole_kelvin
215  const NekDouble var_membrane__T = 310.0; // kelvin
216  const NekDouble var_membrane__F = 96485.3415; // coulomb_per_millimole
217  const NekDouble var_membrane__Cm = 0.185; // microF
218  const NekDouble var_membrane__V_c = 0.016404; // micrometre3
219  const NekDouble var_inward_rectifier_potassium_current__V =
220  var_chaste_interface__membrane__V; // millivolt
221  const NekDouble var_reversal_potentials__K_i =
222  var_chaste_interface__potassium_dynamics__K_i; // millimolar
223  const NekDouble var_reversal_potentials__R =
224  var_membrane__R; // joule_per_mole_kelvin
225  const NekDouble var_reversal_potentials__T = var_membrane__T; // kelvin
226  const NekDouble var_reversal_potentials__F =
227  var_membrane__F; // coulomb_per_millimole
228  const NekDouble var_potassium_dynamics__K_o = k_0; // millimolar
229  const NekDouble var_reversal_potentials__K_o =
230  var_potassium_dynamics__K_o; // millimolar
231  const NekDouble var_reversal_potentials__E_K =
232  ((var_reversal_potentials__R * var_reversal_potentials__T) /
233  var_reversal_potentials__F) *
234  log(var_reversal_potentials__K_o /
235  var_reversal_potentials__K_i); // millivolt
236  const NekDouble var_inward_rectifier_potassium_current__E_K =
237  var_reversal_potentials__E_K; // millivolt
238  const NekDouble var_inward_rectifier_potassium_current__beta_K1 =
239  ((3.0 *
240  exp(0.0002 * ((var_inward_rectifier_potassium_current__V -
241  var_inward_rectifier_potassium_current__E_K) +
242  100.0))) +
243  exp(0.1 * ((var_inward_rectifier_potassium_current__V -
244  var_inward_rectifier_potassium_current__E_K) -
245  10.0))) /
246  (1.0 +
247  exp((-0.5) *
248  (var_inward_rectifier_potassium_current__V -
249  var_inward_rectifier_potassium_current__E_K))); // dimensionless
250  const NekDouble var_inward_rectifier_potassium_current__alpha_K1 =
251  0.1 /
252  (1.0 + exp(0.06 * ((var_inward_rectifier_potassium_current__V -
253  var_inward_rectifier_potassium_current__E_K) -
254  200.0))); // dimensionless
255  const NekDouble var_inward_rectifier_potassium_current__xK1_inf =
256  var_inward_rectifier_potassium_current__alpha_K1 /
257  (var_inward_rectifier_potassium_current__alpha_K1 +
258  var_inward_rectifier_potassium_current__beta_K1); // dimensionless
259  const NekDouble var_inward_rectifier_potassium_current__K_o =
260  var_potassium_dynamics__K_o; // millimolar
261  const NekDouble var_inward_rectifier_potassium_current__g_K1 =
262  5.405; // nanoS_per_picoF
263  const NekDouble var_inward_rectifier_potassium_current__i_K1 =
264  var_inward_rectifier_potassium_current__g_K1 *
265  var_inward_rectifier_potassium_current__xK1_inf *
266  sqrt(var_inward_rectifier_potassium_current__K_o / 5.4) *
267  (var_inward_rectifier_potassium_current__V -
268  var_inward_rectifier_potassium_current__E_K); // picoA_per_picoF
269  const NekDouble var_transient_outward_current__s =
270  var_chaste_interface__transient_outward_current_s_gate__s; // dimensionless
271  const NekDouble var_transient_outward_current__r =
272  var_chaste_interface__transient_outward_current_r_gate__r; // dimensionless
273  const NekDouble var_transient_outward_current__g_to =
274  g_to; // nanoS_per_picoF
275  const NekDouble var_transient_outward_current__V =
276  var_chaste_interface__membrane__V; // millivolt
277  const NekDouble var_transient_outward_current__E_K =
278  var_reversal_potentials__E_K; // millivolt
279  const NekDouble var_transient_outward_current__i_to =
280  var_transient_outward_current__g_to *
281  var_transient_outward_current__r *
282  var_transient_outward_current__s *
283  (var_transient_outward_current__V -
284  var_transient_outward_current__E_K); // picoA_per_picoF
285  const NekDouble var_rapid_time_dependent_potassium_current__Xr1 =
286  var_chaste_interface__rapid_time_dependent_potassium_current_Xr1_gate__Xr1; // dimensionless
287  const NekDouble var_rapid_time_dependent_potassium_current__Xr2 =
288  var_chaste_interface__rapid_time_dependent_potassium_current_Xr2_gate__Xr2; // dimensionless
289  const NekDouble var_rapid_time_dependent_potassium_current__V =
290  var_chaste_interface__membrane__V; // millivolt
291  const NekDouble var_rapid_time_dependent_potassium_current__K_o =
292  var_potassium_dynamics__K_o; // millimolar
293  const NekDouble var_rapid_time_dependent_potassium_current__E_K =
294  var_reversal_potentials__E_K; // millivolt
295  const NekDouble var_rapid_time_dependent_potassium_current__g_Kr =
296  0.153; // nanoS_per_picoF
297  const NekDouble var_rapid_time_dependent_potassium_current__i_Kr =
298  var_rapid_time_dependent_potassium_current__g_Kr *
299  sqrt(var_rapid_time_dependent_potassium_current__K_o / 5.4) *
300  var_rapid_time_dependent_potassium_current__Xr1 *
301  var_rapid_time_dependent_potassium_current__Xr2 *
302  (var_rapid_time_dependent_potassium_current__V -
303  var_rapid_time_dependent_potassium_current__E_K); // picoA_per_picoF
304  const NekDouble var_slow_time_dependent_potassium_current__g_Ks =
305  g_Ks; // nanoS_per_picoF
306  const NekDouble var_sodium_dynamics__Na_o = 140.0; // millimolar
307  const NekDouble var_reversal_potentials__Na_o =
308  var_sodium_dynamics__Na_o; // millimolar
309  const NekDouble var_reversal_potentials__Na_i =
310  var_chaste_interface__sodium_dynamics__Na_i; // millimolar
311  const NekDouble var_reversal_potentials__P_kna = 0.03; // dimensionless
312  const NekDouble var_reversal_potentials__E_Ks =
313  ((var_reversal_potentials__R * var_reversal_potentials__T) /
314  var_reversal_potentials__F) *
315  log((var_reversal_potentials__K_o +
316  (var_reversal_potentials__P_kna *
317  var_reversal_potentials__Na_o)) /
318  (var_reversal_potentials__K_i +
319  (var_reversal_potentials__P_kna *
320  var_reversal_potentials__Na_i))); // millivolt
321  const NekDouble var_slow_time_dependent_potassium_current__E_Ks =
322  var_reversal_potentials__E_Ks; // millivolt
323  const NekDouble var_slow_time_dependent_potassium_current__V =
324  var_chaste_interface__membrane__V; // millivolt
325  const NekDouble var_slow_time_dependent_potassium_current__Xs =
326  var_chaste_interface__slow_time_dependent_potassium_current_Xs_gate__Xs; // dimensionless
327  const NekDouble var_slow_time_dependent_potassium_current__i_Ks =
328  var_slow_time_dependent_potassium_current__g_Ks *
329  pow(var_slow_time_dependent_potassium_current__Xs, 2.0) *
330  (var_slow_time_dependent_potassium_current__V -
331  var_slow_time_dependent_potassium_current__E_Ks); // picoA_per_picoF
332  const NekDouble var_L_type_Ca_current__Ca_ss =
333  var_chaste_interface__calcium_dynamics__Ca_ss; // millimolar
334  const NekDouble var_L_type_Ca_current__g_CaL =
335  3.98e-05; // litre_per_farad_second
336  const NekDouble var_L_type_Ca_current__f =
337  var_chaste_interface__L_type_Ca_current_f_gate__f; // dimensionless
338  const NekDouble var_L_type_Ca_current__d =
339  var_chaste_interface__L_type_Ca_current_d_gate__d; // dimensionless
340  const NekDouble var_L_type_Ca_current__F =
341  var_membrane__F; // coulomb_per_millimole
342  const NekDouble var_L_type_Ca_current__f2 =
343  var_chaste_interface__L_type_Ca_current_f2_gate__f2; // dimensionless
344  const NekDouble var_L_type_Ca_current__fCass =
345  var_chaste_interface__L_type_Ca_current_fCass_gate__fCass; // dimensionless
346  const NekDouble var_L_type_Ca_current__V =
347  var_chaste_interface__membrane__V; // millivolt
348  const NekDouble var_L_type_Ca_current__T = var_membrane__T; // kelvin
349  const NekDouble var_calcium_dynamics__Ca_o = 2.0; // millimolar
350  const NekDouble var_L_type_Ca_current__Ca_o =
351  var_calcium_dynamics__Ca_o; // millimolar
352  const NekDouble var_L_type_Ca_current__R =
353  var_membrane__R; // joule_per_mole_kelvin
354  const NekDouble var_L_type_Ca_current__i_CaL =
355  (((var_L_type_Ca_current__g_CaL * var_L_type_Ca_current__d *
356  var_L_type_Ca_current__f * var_L_type_Ca_current__f2 *
357  var_L_type_Ca_current__fCass * 4.0 *
358  (var_L_type_Ca_current__V - 15.0) *
359  pow(var_L_type_Ca_current__F, 2.0)) /
360  (var_L_type_Ca_current__R * var_L_type_Ca_current__T)) *
361  ((0.25 * var_L_type_Ca_current__Ca_ss *
362  exp((2.0 * (var_L_type_Ca_current__V - 15.0) *
363  var_L_type_Ca_current__F) /
364  (var_L_type_Ca_current__R * var_L_type_Ca_current__T))) -
365  var_L_type_Ca_current__Ca_o)) /
366  (exp((2.0 * (var_L_type_Ca_current__V - 15.0) *
367  var_L_type_Ca_current__F) /
368  (var_L_type_Ca_current__R * var_L_type_Ca_current__T)) -
369  1.0); // picoA_per_picoF
370  const NekDouble var_sodium_potassium_pump_current__Na_i =
371  var_chaste_interface__sodium_dynamics__Na_i; // millimolar
372  const NekDouble var_sodium_potassium_pump_current__R =
373  var_membrane__R; // joule_per_mole_kelvin
374  const NekDouble var_sodium_potassium_pump_current__T =
375  var_membrane__T; // kelvin
376  const NekDouble var_sodium_potassium_pump_current__V =
377  var_chaste_interface__membrane__V; // millivolt
378  const NekDouble var_sodium_potassium_pump_current__K_mk =
379  1.0; // millimolar
380  const NekDouble var_sodium_potassium_pump_current__P_NaK =
381  2.724; // picoA_per_picoF
382  const NekDouble var_sodium_potassium_pump_current__K_mNa =
383  40.0; // millimolar
384  const NekDouble var_sodium_potassium_pump_current__F =
385  var_membrane__F; // coulomb_per_millimole
386  const NekDouble var_sodium_potassium_pump_current__K_o =
387  var_potassium_dynamics__K_o; // millimolar
388  const NekDouble var_sodium_potassium_pump_current__i_NaK =
389  ((((var_sodium_potassium_pump_current__P_NaK *
390  var_sodium_potassium_pump_current__K_o) /
391  (var_sodium_potassium_pump_current__K_o +
392  var_sodium_potassium_pump_current__K_mk)) *
393  var_sodium_potassium_pump_current__Na_i) /
394  (var_sodium_potassium_pump_current__Na_i +
395  var_sodium_potassium_pump_current__K_mNa)) /
396  (1.0 +
397  (0.1245 * exp(((-0.1) * var_sodium_potassium_pump_current__V *
398  var_sodium_potassium_pump_current__F) /
399  (var_sodium_potassium_pump_current__R *
400  var_sodium_potassium_pump_current__T))) +
401  (0.0353 *
402  exp(((-var_sodium_potassium_pump_current__V) *
403  var_sodium_potassium_pump_current__F) /
404  (var_sodium_potassium_pump_current__R *
405  var_sodium_potassium_pump_current__T)))); // picoA_per_picoF
406  const NekDouble var_fast_sodium_current__j =
407  var_chaste_interface__fast_sodium_current_j_gate__j; // dimensionless
408  const NekDouble var_fast_sodium_current__h =
409  var_chaste_interface__fast_sodium_current_h_gate__h; // dimensionless
410  const NekDouble var_fast_sodium_current__g_Na =
411  14.838; // nanoS_per_picoF
412  const NekDouble var_fast_sodium_current__m =
413  var_chaste_interface__fast_sodium_current_m_gate__m; // dimensionless
414  const NekDouble var_fast_sodium_current__V =
415  var_chaste_interface__membrane__V; // millivolt
416  const NekDouble var_reversal_potentials__E_Na =
417  ((var_reversal_potentials__R * var_reversal_potentials__T) /
418  var_reversal_potentials__F) *
419  log(var_reversal_potentials__Na_o /
420  var_reversal_potentials__Na_i); // millivolt
421  const NekDouble var_fast_sodium_current__E_Na =
422  var_reversal_potentials__E_Na; // millivolt
423  const NekDouble var_fast_sodium_current__i_Na =
424  var_fast_sodium_current__g_Na *
425  pow(var_fast_sodium_current__m, 3.0) * var_fast_sodium_current__h *
426  var_fast_sodium_current__j *
427  (var_fast_sodium_current__V -
428  var_fast_sodium_current__E_Na); // picoA_per_picoF
429  const NekDouble var_sodium_background_current__V =
430  var_chaste_interface__membrane__V; // millivolt
431  const NekDouble var_sodium_background_current__E_Na =
432  var_reversal_potentials__E_Na; // millivolt
433  const NekDouble var_sodium_background_current__g_bna =
434  0.00029; // nanoS_per_picoF
435  const NekDouble var_sodium_background_current__i_b_Na =
436  var_sodium_background_current__g_bna *
437  (var_sodium_background_current__V -
438  var_sodium_background_current__E_Na); // picoA_per_picoF
439  const NekDouble var_sodium_calcium_exchanger_current__alpha =
440  2.5; // dimensionless
441  const NekDouble var_sodium_calcium_exchanger_current__gamma =
442  0.35; // dimensionless
443  const NekDouble var_sodium_calcium_exchanger_current__K_sat =
444  0.1; // dimensionless
445  const NekDouble var_sodium_calcium_exchanger_current__Km_Ca =
446  1.38; // millimolar
447  const NekDouble var_sodium_calcium_exchanger_current__K_NaCa =
448  1000.0; // picoA_per_picoF
449  const NekDouble var_sodium_calcium_exchanger_current__F =
450  var_membrane__F; // coulomb_per_millimole
451  const NekDouble var_sodium_calcium_exchanger_current__Ca_i =
452  var_chaste_interface__calcium_dynamics__Ca_i; // millimolar
453  const NekDouble var_sodium_calcium_exchanger_current__Ca_o =
454  var_calcium_dynamics__Ca_o; // millimolar
455  const NekDouble var_sodium_calcium_exchanger_current__V =
456  var_chaste_interface__membrane__V; // millivolt
457  const NekDouble var_sodium_calcium_exchanger_current__R =
458  var_membrane__R; // joule_per_mole_kelvin
459  const NekDouble var_sodium_calcium_exchanger_current__Km_Nai =
460  87.5; // millimolar
461  const NekDouble var_sodium_calcium_exchanger_current__Na_o =
462  var_sodium_dynamics__Na_o; // millimolar
463  const NekDouble var_sodium_calcium_exchanger_current__Na_i =
464  var_chaste_interface__sodium_dynamics__Na_i; // millimolar
465  const NekDouble var_sodium_calcium_exchanger_current__T =
466  var_membrane__T; // kelvin
467  const NekDouble var_sodium_calcium_exchanger_current__i_NaCa =
468  (var_sodium_calcium_exchanger_current__K_NaCa *
469  ((exp((var_sodium_calcium_exchanger_current__gamma *
470  var_sodium_calcium_exchanger_current__V *
471  var_sodium_calcium_exchanger_current__F) /
472  (var_sodium_calcium_exchanger_current__R *
473  var_sodium_calcium_exchanger_current__T)) *
474  pow(var_sodium_calcium_exchanger_current__Na_i, 3.0) *
475  var_sodium_calcium_exchanger_current__Ca_o) -
476  (exp(((var_sodium_calcium_exchanger_current__gamma - 1.0) *
477  var_sodium_calcium_exchanger_current__V *
478  var_sodium_calcium_exchanger_current__F) /
479  (var_sodium_calcium_exchanger_current__R *
480  var_sodium_calcium_exchanger_current__T)) *
481  pow(var_sodium_calcium_exchanger_current__Na_o, 3.0) *
482  var_sodium_calcium_exchanger_current__Ca_i *
483  var_sodium_calcium_exchanger_current__alpha))) /
484  ((pow(var_sodium_calcium_exchanger_current__Km_Nai, 3.0) +
485  pow(var_sodium_calcium_exchanger_current__Na_o, 3.0)) *
486  (var_sodium_calcium_exchanger_current__Km_Ca +
487  var_sodium_calcium_exchanger_current__Ca_o) *
488  (1.0 +
489  (var_sodium_calcium_exchanger_current__K_sat *
490  exp(((var_sodium_calcium_exchanger_current__gamma - 1.0) *
491  var_sodium_calcium_exchanger_current__V *
492  var_sodium_calcium_exchanger_current__F) /
493  (var_sodium_calcium_exchanger_current__R *
494  var_sodium_calcium_exchanger_current__T))))); // picoA_per_picoF
495  const NekDouble var_reversal_potentials__Ca_o =
496  var_calcium_dynamics__Ca_o; // millimolar
497  const NekDouble var_reversal_potentials__Ca_i =
498  var_chaste_interface__calcium_dynamics__Ca_i; // millimolar
499  const NekDouble var_reversal_potentials__E_Ca =
500  ((0.5 * var_reversal_potentials__R * var_reversal_potentials__T) /
501  var_reversal_potentials__F) *
502  log(var_reversal_potentials__Ca_o /
503  var_reversal_potentials__Ca_i); // millivolt
504  const NekDouble var_calcium_background_current__E_Ca =
505  var_reversal_potentials__E_Ca; // millivolt
506  const NekDouble var_calcium_background_current__g_bca =
507  0.000592; // nanoS_per_picoF
508  const NekDouble var_calcium_background_current__V =
509  var_chaste_interface__membrane__V; // millivolt
510  const NekDouble var_calcium_background_current__i_b_Ca =
511  var_calcium_background_current__g_bca *
512  (var_calcium_background_current__V -
513  var_calcium_background_current__E_Ca); // picoA_per_picoF
514  const NekDouble var_potassium_pump_current__g_pK =
515  0.0146; // nanoS_per_picoF
516  const NekDouble var_potassium_pump_current__V =
517  var_chaste_interface__membrane__V; // millivolt
518  const NekDouble var_potassium_pump_current__E_K =
519  var_reversal_potentials__E_K; // millivolt
520  const NekDouble var_potassium_pump_current__i_p_K =
521  (var_potassium_pump_current__g_pK *
522  (var_potassium_pump_current__V -
523  var_potassium_pump_current__E_K)) /
524  (1.0 + exp((25.0 - var_potassium_pump_current__V) /
525  5.98)); // picoA_per_picoF
526  const NekDouble var_calcium_pump_current__K_pCa = 0.0005; // millimolar
527  const NekDouble var_calcium_pump_current__Ca_i =
528  var_chaste_interface__calcium_dynamics__Ca_i; // millimolar
529  const NekDouble var_calcium_pump_current__g_pCa =
530  0.1238; // picoA_per_picoF
531  const NekDouble var_calcium_pump_current__i_p_Ca =
532  (var_calcium_pump_current__g_pCa * var_calcium_pump_current__Ca_i) /
533  (var_calcium_pump_current__Ca_i +
534  var_calcium_pump_current__K_pCa); // picoA_per_picoF
535  const NekDouble var_chaste_interface__membrane__i_Stim = 0.0;
536  const NekDouble var_rapid_time_dependent_potassium_current_Xr1_gate__V =
537  var_rapid_time_dependent_potassium_current__V; // millivolt
538  const NekDouble
539  var_rapid_time_dependent_potassium_current_Xr1_gate__alpha_xr1 =
540  450.0 /
541  (1.0 +
542  exp(((-45.0) -
543  var_rapid_time_dependent_potassium_current_Xr1_gate__V) /
544  10.0)); // dimensionless
545  const NekDouble
546  var_rapid_time_dependent_potassium_current_Xr1_gate__beta_xr1 =
547  6.0 /
548  (1.0 +
549  exp((var_rapid_time_dependent_potassium_current_Xr1_gate__V +
550  30.0) /
551  11.5)); // dimensionless
552  const NekDouble
553  var_rapid_time_dependent_potassium_current_Xr1_gate__tau_xr1 =
554  1.0 *
555  var_rapid_time_dependent_potassium_current_Xr1_gate__alpha_xr1 *
556  var_rapid_time_dependent_potassium_current_Xr1_gate__beta_xr1; // millisecond
557  const NekDouble
558  var_rapid_time_dependent_potassium_current_Xr1_gate__xr1_inf =
559  1.0 /
560  (1.0 +
561  exp(((-26.0) -
562  var_rapid_time_dependent_potassium_current_Xr1_gate__V) /
563  7.0)); // dimensionless
564  const NekDouble var_rapid_time_dependent_potassium_current_Xr2_gate__V =
565  var_rapid_time_dependent_potassium_current__V; // millivolt
566  const NekDouble
567  var_rapid_time_dependent_potassium_current_Xr2_gate__alpha_xr2 =
568  3.0 /
569  (1.0 +
570  exp(((-60.0) -
571  var_rapid_time_dependent_potassium_current_Xr2_gate__V) /
572  20.0)); // dimensionless
573  const NekDouble
574  var_rapid_time_dependent_potassium_current_Xr2_gate__beta_xr2 =
575  1.12 /
576  (1.0 +
577  exp((var_rapid_time_dependent_potassium_current_Xr2_gate__V -
578  60.0) /
579  20.0)); // dimensionless
580  const NekDouble
581  var_rapid_time_dependent_potassium_current_Xr2_gate__tau_xr2 =
582  1.0 *
583  var_rapid_time_dependent_potassium_current_Xr2_gate__alpha_xr2 *
584  var_rapid_time_dependent_potassium_current_Xr2_gate__beta_xr2; // millisecond
585  const NekDouble
586  var_rapid_time_dependent_potassium_current_Xr2_gate__xr2_inf =
587  1.0 /
588  (1.0 +
589  exp((var_rapid_time_dependent_potassium_current_Xr2_gate__V +
590  88.0) /
591  24.0)); // dimensionless
592  const NekDouble var_slow_time_dependent_potassium_current_Xs_gate__V =
593  var_slow_time_dependent_potassium_current__V; // millivolt
594  const NekDouble
595  var_slow_time_dependent_potassium_current_Xs_gate__beta_xs =
596  1.0 /
597  (1.0 +
598  exp((var_slow_time_dependent_potassium_current_Xs_gate__V -
599  35.0) /
600  15.0)); // dimensionless
601  const NekDouble
602  var_slow_time_dependent_potassium_current_Xs_gate__alpha_xs =
603  1400.0 /
604  sqrt(
605  1.0 +
606  exp((5.0 -
607  var_slow_time_dependent_potassium_current_Xs_gate__V) /
608  6.0)); // dimensionless
609  const NekDouble
610  var_slow_time_dependent_potassium_current_Xs_gate__tau_xs =
611  (1.0 *
612  var_slow_time_dependent_potassium_current_Xs_gate__alpha_xs *
613  var_slow_time_dependent_potassium_current_Xs_gate__beta_xs) +
614  80.0; // millisecond
615  const NekDouble
616  var_slow_time_dependent_potassium_current_Xs_gate__xs_inf =
617  1.0 /
618  (1.0 +
619  exp(((-5.0) -
620  var_slow_time_dependent_potassium_current_Xs_gate__V) /
621  14.0)); // dimensionless
622  const NekDouble var_fast_sodium_current_m_gate__V =
623  var_fast_sodium_current__V; // millivolt
624  const NekDouble var_fast_sodium_current_m_gate__alpha_m =
625  1.0 / (1.0 + exp(((-60.0) - var_fast_sodium_current_m_gate__V) /
626  5.0)); // dimensionless
627  const NekDouble var_fast_sodium_current_m_gate__beta_m =
628  (0.1 /
629  (1.0 + exp((var_fast_sodium_current_m_gate__V + 35.0) / 5.0))) +
630  (0.1 / (1.0 + exp((var_fast_sodium_current_m_gate__V - 50.0) /
631  200.0))); // dimensionless
632  const NekDouble var_fast_sodium_current_m_gate__tau_m =
633  1.0 * var_fast_sodium_current_m_gate__alpha_m *
634  var_fast_sodium_current_m_gate__beta_m; // millisecond
635  const NekDouble var_fast_sodium_current_m_gate__m_inf =
636  1.0 / pow(1.0 + exp(((-56.86) - var_fast_sodium_current_m_gate__V) /
637  9.03),
638  2.0); // dimensionless
639  const NekDouble var_fast_sodium_current_h_gate__V =
640  var_fast_sodium_current__V; // millivolt
641  const NekDouble var_fast_sodium_current_h_gate__h_inf =
642  1.0 /
643  pow(1.0 + exp((var_fast_sodium_current_h_gate__V + 71.55) / 7.43),
644  2.0); // dimensionless
645  const NekDouble var_fast_sodium_current_h_gate__beta_h =
646  (var_fast_sodium_current_h_gate__V < (-40.0))
647  ? ((2.7 * exp(0.079 * var_fast_sodium_current_h_gate__V)) +
648  (310000.0 * exp(0.3485 * var_fast_sodium_current_h_gate__V)))
649  : (0.77 /
650  (0.13 *
651  (1.0 + exp((var_fast_sodium_current_h_gate__V + 10.66) /
652  (-11.1))))); // per_millisecond
653  const NekDouble var_fast_sodium_current_h_gate__alpha_h =
654  (var_fast_sodium_current_h_gate__V < (-40.0))
655  ? (0.057 *
656  exp((-(var_fast_sodium_current_h_gate__V + 80.0)) / 6.8))
657  : 0.0; // per_millisecond
658  const NekDouble var_fast_sodium_current_h_gate__tau_h =
659  1.0 / (var_fast_sodium_current_h_gate__alpha_h +
660  var_fast_sodium_current_h_gate__beta_h); // millisecond
661  const NekDouble var_fast_sodium_current_j_gate__V =
662  var_fast_sodium_current__V; // millivolt
663  const NekDouble var_fast_sodium_current_j_gate__j_inf =
664  1.0 /
665  pow(1.0 + exp((var_fast_sodium_current_j_gate__V + 71.55) / 7.43),
666  2.0); // dimensionless
667  const NekDouble var_fast_sodium_current_j_gate__alpha_j =
668  (var_fast_sodium_current_j_gate__V < (-40.0))
669  ? ((((((-25428.0) *
670  exp(0.2444 * var_fast_sodium_current_j_gate__V)) -
671  (6.948e-06 *
672  exp((-0.04391) * var_fast_sodium_current_j_gate__V))) *
673  (var_fast_sodium_current_j_gate__V + 37.78)) /
674  1.0) /
675  (1.0 +
676  exp(0.311 * (var_fast_sodium_current_j_gate__V + 79.23))))
677  : 0.0; // per_millisecond
678  const NekDouble var_fast_sodium_current_j_gate__beta_j =
679  (var_fast_sodium_current_j_gate__V < (-40.0))
680  ? ((0.02424 *
681  exp((-0.01052) * var_fast_sodium_current_j_gate__V)) /
682  (1.0 + exp((-0.1378) *
683  (var_fast_sodium_current_j_gate__V + 40.14))))
684  : ((0.6 * exp(0.057 * var_fast_sodium_current_j_gate__V)) /
685  (1.0 + exp((-0.1) * (var_fast_sodium_current_j_gate__V +
686  32.0)))); // per_millisecond
687  const NekDouble var_fast_sodium_current_j_gate__tau_j =
688  1.0 / (var_fast_sodium_current_j_gate__alpha_j +
689  var_fast_sodium_current_j_gate__beta_j); // millisecond
690  const NekDouble var_L_type_Ca_current_d_gate__V =
691  var_L_type_Ca_current__V; // millivolt
692  const NekDouble var_L_type_Ca_current_d_gate__alpha_d =
693  (1.4 /
694  (1.0 + exp(((-35.0) - var_L_type_Ca_current_d_gate__V) / 13.0))) +
695  0.25; // dimensionless
696  const NekDouble var_L_type_Ca_current_d_gate__gamma_d =
697  1.0 / (1.0 + exp((50.0 - var_L_type_Ca_current_d_gate__V) /
698  20.0)); // millisecond
699  const NekDouble var_L_type_Ca_current_d_gate__beta_d =
700  1.4 / (1.0 + exp((var_L_type_Ca_current_d_gate__V + 5.0) /
701  5.0)); // dimensionless
702  const NekDouble var_L_type_Ca_current_d_gate__tau_d =
703  (1.0 * var_L_type_Ca_current_d_gate__alpha_d *
704  var_L_type_Ca_current_d_gate__beta_d) +
705  var_L_type_Ca_current_d_gate__gamma_d; // millisecond
706  const NekDouble var_L_type_Ca_current_d_gate__d_inf =
707  1.0 / (1.0 + exp(((-8.0) - var_L_type_Ca_current_d_gate__V) /
708  7.5)); // dimensionless
709  const NekDouble var_L_type_Ca_current_f_gate__V =
710  var_L_type_Ca_current__V; // millivolt
711  const NekDouble var_L_type_Ca_current_f_gate__tau_f =
712  (1102.5 *
713  exp((-pow(var_L_type_Ca_current_f_gate__V + 27.0, 2.0)) / 225.0)) +
714  (200.0 /
715  (1.0 + exp((13.0 - var_L_type_Ca_current_f_gate__V) / 10.0))) +
716  (180.0 /
717  (1.0 + exp((var_L_type_Ca_current_f_gate__V + 30.0) / 10.0))) +
718  20.0; // millisecond
719  const NekDouble var_L_type_Ca_current_f_gate__f_inf =
720  1.0 / (1.0 + exp((var_L_type_Ca_current_f_gate__V + 20.0) /
721  7.0)); // dimensionless
722  const NekDouble var_L_type_Ca_current_f2_gate__V =
723  var_L_type_Ca_current__V; // millivolt
724  const NekDouble var_L_type_Ca_current_f2_gate__f2_inf =
725  (0.67 /
726  (1.0 + exp((var_L_type_Ca_current_f2_gate__V + 35.0) / 7.0))) +
727  0.33; // dimensionless
728  const NekDouble var_L_type_Ca_current_f2_gate__tau_f2 =
729  (562.0 * exp((-pow(var_L_type_Ca_current_f2_gate__V + 27.0, 2.0)) /
730  240.0)) +
731  (31.0 /
732  (1.0 + exp((25.0 - var_L_type_Ca_current_f2_gate__V) / 10.0))) +
733  (80.0 / (1.0 + exp((var_L_type_Ca_current_f2_gate__V + 30.0) /
734  10.0))); // millisecond
735  const NekDouble var_L_type_Ca_current_fCass_gate__Ca_ss =
736  var_L_type_Ca_current__Ca_ss; // millimolar
737  const NekDouble var_L_type_Ca_current_fCass_gate__tau_fCass =
738  (80.0 /
739  (1.0 + pow(var_L_type_Ca_current_fCass_gate__Ca_ss / 0.05, 2.0))) +
740  2.0; // millisecond
741  const NekDouble var_L_type_Ca_current_fCass_gate__fCass_inf =
742  (0.6 /
743  (1.0 + pow(var_L_type_Ca_current_fCass_gate__Ca_ss / 0.05, 2.0))) +
744  0.4; // dimensionless
745  const NekDouble var_transient_outward_current_s_gate__V =
746  var_transient_outward_current__V; // millivolt
747  const NekDouble var_transient_outward_current_s_gate__s_inf =
748  1.0 / (1.0 + exp((var_transient_outward_current_s_gate__V +
749  s_inf_factor) /
750  5.0)); // dimensionless
751  const NekDouble var_transient_outward_current_s_gate__tau_s =
752  (s_tau_f1 *
753  exp((-pow(var_transient_outward_current_s_gate__V + s_tau_f2,
754  2.0)) /
755  s_tau_f3)) +
756  s_tau_f4 +
757  s_tau_f5 *
758  ((5.0 /
759  (1.0 + exp((var_transient_outward_current_s_gate__V - 20.0) /
760  5.0))) +
761  3.0); // millisecond
762  const NekDouble var_transient_outward_current_r_gate__V =
763  var_transient_outward_current__V; // millivolt
764  const NekDouble var_transient_outward_current_r_gate__r_inf =
765  1.0 / (1.0 + exp((20.0 - var_transient_outward_current_r_gate__V) /
766  6.0)); // dimensionless
767  const NekDouble var_transient_outward_current_r_gate__tau_r =
768  (9.5 *
769  exp((-pow(var_transient_outward_current_r_gate__V + 40.0, 2.0)) /
770  1800.0)) +
771  0.8; // millisecond
772  const NekDouble var_calcium_dynamics__Ca_i =
773  var_chaste_interface__calcium_dynamics__Ca_i; // millimolar
774  const NekDouble var_calcium_dynamics__Ca_SR =
775  var_chaste_interface__calcium_dynamics__Ca_SR; // millimolar
776  const NekDouble var_calcium_dynamics__Ca_ss =
777  var_chaste_interface__calcium_dynamics__Ca_ss; // millimolar
778  const NekDouble var_calcium_dynamics__V_rel = 0.102; // per_millisecond
779  const NekDouble var_calcium_dynamics__R_prime =
780  var_chaste_interface__calcium_dynamics__R_prime; // dimensionless
781  const NekDouble var_calcium_dynamics__k1_prime =
782  0.15; // per_millimolar2_per_millisecond
783  const NekDouble var_calcium_dynamics__max_sr = 2.5; // dimensionless
784  const NekDouble var_calcium_dynamics__EC = 1.5; // millimolar
785  const NekDouble var_calcium_dynamics__min_sr = 1.0; // dimensionless
786  const NekDouble var_calcium_dynamics__kcasr =
787  var_calcium_dynamics__max_sr -
788  ((var_calcium_dynamics__max_sr - var_calcium_dynamics__min_sr) /
789  (1.0 + pow(var_calcium_dynamics__EC / var_calcium_dynamics__Ca_SR,
790  2.0))); // dimensionless
791  const NekDouble var_calcium_dynamics__k1 =
792  var_calcium_dynamics__k1_prime /
793  var_calcium_dynamics__kcasr; // per_millimolar2_per_millisecond
794  const NekDouble var_calcium_dynamics__k3 = 0.06; // per_millisecond
795  const NekDouble var_calcium_dynamics__O =
796  (var_calcium_dynamics__k1 * pow(var_calcium_dynamics__Ca_ss, 2.0) *
797  var_calcium_dynamics__R_prime) /
798  (var_calcium_dynamics__k3 +
799  (var_calcium_dynamics__k1 *
800  pow(var_calcium_dynamics__Ca_ss, 2.0))); // dimensionless
801  const NekDouble var_calcium_dynamics__i_rel =
802  var_calcium_dynamics__V_rel * var_calcium_dynamics__O *
803  (var_calcium_dynamics__Ca_SR -
804  var_calcium_dynamics__Ca_ss); // millimolar_per_millisecond
805  const NekDouble var_calcium_dynamics__Vmax_up =
806  0.006375; // millimolar_per_millisecond
807  const NekDouble var_calcium_dynamics__K_up = 0.00025; // millimolar
808  const NekDouble var_calcium_dynamics__i_up =
809  var_calcium_dynamics__Vmax_up /
810  (1.0 + (pow(var_calcium_dynamics__K_up, 2.0) /
811  pow(var_calcium_dynamics__Ca_i,
812  2.0))); // millimolar_per_millisecond
813  const NekDouble var_calcium_dynamics__V_leak =
814  0.00036; // per_millisecond
815  const NekDouble var_calcium_dynamics__i_leak =
816  var_calcium_dynamics__V_leak *
817  (var_calcium_dynamics__Ca_SR -
818  var_calcium_dynamics__Ca_i); // millimolar_per_millisecond
819  const NekDouble var_calcium_dynamics__V_xfer =
820  0.0038; // per_millisecond
821  const NekDouble var_calcium_dynamics__i_xfer =
822  var_calcium_dynamics__V_xfer *
823  (var_calcium_dynamics__Ca_ss -
824  var_calcium_dynamics__Ca_i); // millimolar_per_millisecond
825  const NekDouble var_calcium_dynamics__k2_prime =
826  0.045; // per_millimolar_per_millisecond
827  const NekDouble var_calcium_dynamics__k2 =
828  var_calcium_dynamics__k2_prime *
829  var_calcium_dynamics__kcasr; // per_millimolar_per_millisecond
830  const NekDouble var_calcium_dynamics__k4 = 0.005; // per_millisecond
831  const NekDouble var_calcium_dynamics__Buf_c = 0.2; // millimolar
832  const NekDouble var_calcium_dynamics__K_buf_c = 0.001; // millimolar
833  const NekDouble var_calcium_dynamics__Ca_i_bufc =
834  1.0 /
835  (1.0 +
836  ((var_calcium_dynamics__Buf_c * var_calcium_dynamics__K_buf_c) /
837  pow(var_calcium_dynamics__Ca_i + var_calcium_dynamics__K_buf_c,
838  2.0))); // dimensionless
839  const NekDouble var_calcium_dynamics__K_buf_sr = 0.3; // millimolar
840  const NekDouble var_calcium_dynamics__Buf_sr = 10.0; // millimolar
841  const NekDouble var_calcium_dynamics__Ca_sr_bufsr =
842  1.0 /
843  (1.0 +
844  ((var_calcium_dynamics__Buf_sr * var_calcium_dynamics__K_buf_sr) /
845  pow(var_calcium_dynamics__Ca_SR + var_calcium_dynamics__K_buf_sr,
846  2.0))); // dimensionless
847  const NekDouble var_calcium_dynamics__Buf_ss = 0.4; // millimolar
848  const NekDouble var_calcium_dynamics__K_buf_ss = 0.00025; // millimolar
849  const NekDouble var_calcium_dynamics__Ca_ss_bufss =
850  1.0 /
851  (1.0 +
852  ((var_calcium_dynamics__Buf_ss * var_calcium_dynamics__K_buf_ss) /
853  pow(var_calcium_dynamics__Ca_ss + var_calcium_dynamics__K_buf_ss,
854  2.0))); // dimensionless
855  const NekDouble var_calcium_dynamics__V_sr = 0.001094; // micrometre3
856  const NekDouble var_calcium_dynamics__V_ss = 5.468e-05; // micrometre3
857  const NekDouble var_calcium_dynamics__V_c =
858  var_membrane__V_c; // micrometre3
859  const NekDouble var_calcium_dynamics__F =
860  var_membrane__F; // coulomb_per_millimole
861  const NekDouble var_calcium_dynamics__Cm = var_membrane__Cm; // microF
862  const NekDouble var_calcium_dynamics__i_CaL =
863  var_L_type_Ca_current__i_CaL; // picoA_per_picoF
864  const NekDouble var_calcium_dynamics__i_NaCa =
865  var_sodium_calcium_exchanger_current__i_NaCa; // picoA_per_picoF
866  const NekDouble var_calcium_dynamics__i_p_Ca =
867  var_calcium_pump_current__i_p_Ca; // picoA_per_picoF
868  const NekDouble var_calcium_dynamics__i_b_Ca =
869  var_calcium_background_current__i_b_Ca; // picoA_per_picoF
870  const NekDouble var_calcium_dynamics__d_Ca_i_d_environment__time =
871  var_calcium_dynamics__Ca_i_bufc *
872  (((((var_calcium_dynamics__i_leak - var_calcium_dynamics__i_up) *
873  var_calcium_dynamics__V_sr) /
874  var_calcium_dynamics__V_c) +
875  var_calcium_dynamics__i_xfer) -
876  ((1.0 *
877  ((var_calcium_dynamics__i_b_Ca + var_calcium_dynamics__i_p_Ca) -
878  (2.0 * var_calcium_dynamics__i_NaCa)) *
879  var_calcium_dynamics__Cm) /
880  (2.0 * 1.0 * var_calcium_dynamics__V_c *
881  var_calcium_dynamics__F))); // 'millimole per litre per
882  // millisecond'
883  const NekDouble var_calcium_dynamics__d_Ca_SR_d_environment__time =
884  var_calcium_dynamics__Ca_sr_bufsr *
885  (var_calcium_dynamics__i_up -
886  (var_calcium_dynamics__i_rel +
887  var_calcium_dynamics__i_leak)); // 'millimole per litre per
888  // millisecond'
889  const NekDouble var_calcium_dynamics__d_Ca_ss_d_environment__time =
890  var_calcium_dynamics__Ca_ss_bufss *
891  (((((-1.0) * var_calcium_dynamics__i_CaL *
892  var_calcium_dynamics__Cm) /
893  (2.0 * 1.0 * var_calcium_dynamics__V_ss *
894  var_calcium_dynamics__F)) +
895  ((var_calcium_dynamics__i_rel * var_calcium_dynamics__V_sr) /
896  var_calcium_dynamics__V_ss)) -
897  ((var_calcium_dynamics__i_xfer * var_calcium_dynamics__V_c) /
898  var_calcium_dynamics__V_ss)); // 'millimole per litre per
899  // millisecond'
900  const NekDouble var_calcium_dynamics__d_R_prime_d_environment__time =
901  ((-var_calcium_dynamics__k2) * var_calcium_dynamics__Ca_ss *
902  var_calcium_dynamics__R_prime) +
903  (var_calcium_dynamics__k4 *
904  (1.0 - var_calcium_dynamics__R_prime)); // per_millisecond
905  const NekDouble var_sodium_dynamics__F =
906  var_membrane__F; // coulomb_per_millimole
907  const NekDouble var_sodium_dynamics__Cm = var_membrane__Cm; // microF
908  const NekDouble var_sodium_dynamics__V_c =
909  var_membrane__V_c; // micrometre3
910  const NekDouble var_sodium_dynamics__i_Na =
911  var_fast_sodium_current__i_Na; // picoA_per_picoF
912  const NekDouble var_sodium_dynamics__i_NaCa =
913  var_sodium_calcium_exchanger_current__i_NaCa; // picoA_per_picoF
914  const NekDouble var_sodium_dynamics__i_NaK =
915  var_sodium_potassium_pump_current__i_NaK; // picoA_per_picoF
916  const NekDouble var_sodium_dynamics__i_b_Na =
917  var_sodium_background_current__i_b_Na; // picoA_per_picoF
918  const NekDouble var_sodium_dynamics__d_Na_i_d_environment__time =
919  (((-1.0) *
920  (var_sodium_dynamics__i_Na + var_sodium_dynamics__i_b_Na +
921  (3.0 * var_sodium_dynamics__i_NaK) +
922  (3.0 * var_sodium_dynamics__i_NaCa))) /
923  (1.0 * var_sodium_dynamics__V_c * var_sodium_dynamics__F)) *
924  var_sodium_dynamics__Cm; // 'millimole per litre per millisecond'
925  const NekDouble var_potassium_dynamics__F =
926  var_membrane__F; // coulomb_per_millimole
927  const NekDouble var_potassium_dynamics__Cm = var_membrane__Cm; // microF
928  const NekDouble var_potassium_dynamics__V_c =
929  var_membrane__V_c; // micrometre3
930  const NekDouble var_potassium_dynamics__i_K1 =
931  var_inward_rectifier_potassium_current__i_K1; // picoA_per_picoF
932  const NekDouble var_potassium_dynamics__i_to =
933  var_transient_outward_current__i_to; // picoA_per_picoF
934  const NekDouble var_potassium_dynamics__i_NaK =
935  var_sodium_potassium_pump_current__i_NaK; // picoA_per_picoF
936  const NekDouble var_potassium_dynamics__i_Kr =
937  var_rapid_time_dependent_potassium_current__i_Kr; // picoA_per_picoF
938  const NekDouble var_potassium_dynamics__i_Ks =
939  var_slow_time_dependent_potassium_current__i_Ks; // picoA_per_picoF
940  const NekDouble var_potassium_dynamics__i_p_K =
941  var_potassium_pump_current__i_p_K; // picoA_per_picoF
942  const NekDouble
943  var_potassium_dynamics__chaste_interface__chaste_membrane_capacitance =
944  1.0; // uF_per_cm2
945  const NekDouble var_potassium_dynamics__i_Stim_converter =
946  var_chaste_interface__membrane__i_Stim; // uA_per_cm2
947  const NekDouble var_potassium_dynamics__i_Stim =
948  var_potassium_dynamics__i_Stim_converter /
949  var_potassium_dynamics__chaste_interface__chaste_membrane_capacitance; // picoA_per_picoF
950  const NekDouble var_potassium_dynamics__d_K_i_d_environment__time =
951  (((-1.0) *
952  ((var_potassium_dynamics__i_K1 + var_potassium_dynamics__i_to +
953  var_potassium_dynamics__i_Kr + var_potassium_dynamics__i_Ks +
954  var_potassium_dynamics__i_p_K +
955  var_potassium_dynamics__i_Stim) -
956  (2.0 * var_potassium_dynamics__i_NaK))) /
957  (1.0 * var_potassium_dynamics__V_c * var_potassium_dynamics__F)) *
958  var_potassium_dynamics__Cm; // 'millimole per litre per millisecond'
959  const NekDouble
960  var_chaste_interface__calcium_dynamics__d_Ca_i_d_environment__time =
961  var_calcium_dynamics__d_Ca_i_d_environment__time; // millimolar_per_millisecond
962  const NekDouble
963  var_chaste_interface__calcium_dynamics__d_Ca_SR_d_environment__time =
964  var_calcium_dynamics__d_Ca_SR_d_environment__time; // millimolar_per_millisecond
965  const NekDouble
966  var_chaste_interface__calcium_dynamics__d_Ca_ss_d_environment__time =
967  var_calcium_dynamics__d_Ca_ss_d_environment__time; // millimolar_per_millisecond
968  const NekDouble
969  var_chaste_interface__calcium_dynamics__d_R_prime_d_environment__time =
970  var_calcium_dynamics__d_R_prime_d_environment__time; // per_millisecond
971  const NekDouble
972  var_chaste_interface__sodium_dynamics__d_Na_i_d_environment__time =
973  var_sodium_dynamics__d_Na_i_d_environment__time; // millimolar_per_millisecond
974  const NekDouble
975  var_chaste_interface__potassium_dynamics__d_K_i_d_environment__time =
976  var_potassium_dynamics__d_K_i_d_environment__time; // millimolar_per_millisecond
977  const NekDouble d_dt_chaste_interface__calcium_dynamics__Ca_i =
978  var_chaste_interface__calcium_dynamics__d_Ca_i_d_environment__time; // 'millimole per litre per millisecond'
979  const NekDouble d_dt_chaste_interface__calcium_dynamics__Ca_SR =
980  var_chaste_interface__calcium_dynamics__d_Ca_SR_d_environment__time; // 'millimole per litre per millisecond'
981  const NekDouble d_dt_chaste_interface__calcium_dynamics__Ca_ss =
982  var_chaste_interface__calcium_dynamics__d_Ca_ss_d_environment__time; // 'millimole per litre per millisecond'
983  const NekDouble d_dt_chaste_interface__calcium_dynamics__R_prime =
984  var_chaste_interface__calcium_dynamics__d_R_prime_d_environment__time; // per_millisecond
985  const NekDouble d_dt_chaste_interface__sodium_dynamics__Na_i =
986  var_chaste_interface__sodium_dynamics__d_Na_i_d_environment__time; // 'millimole per litre per millisecond'
987  const NekDouble d_dt_chaste_interface__potassium_dynamics__K_i =
988  var_chaste_interface__potassium_dynamics__d_K_i_d_environment__time; // 'millimole per litre per millisecond'
989 
990  const NekDouble var_membrane__i_K1 =
991  var_inward_rectifier_potassium_current__i_K1; // picoA_per_picoF
992  const NekDouble var_membrane__i_to =
993  var_transient_outward_current__i_to; // picoA_per_picoF
994  const NekDouble var_membrane__i_Kr =
995  var_rapid_time_dependent_potassium_current__i_Kr; // picoA_per_picoF
996  const NekDouble var_membrane__i_Ks =
997  var_slow_time_dependent_potassium_current__i_Ks; // picoA_per_picoF
998  const NekDouble var_membrane__i_CaL =
999  var_L_type_Ca_current__i_CaL; // picoA_per_picoF
1000  const NekDouble var_membrane__i_NaK =
1001  var_sodium_potassium_pump_current__i_NaK; // picoA_per_picoF
1002  const NekDouble var_membrane__i_Na =
1003  var_fast_sodium_current__i_Na; // picoA_per_picoF
1004  const NekDouble var_membrane__i_b_Na =
1005  var_sodium_background_current__i_b_Na; // picoA_per_picoF
1006  const NekDouble var_membrane__i_NaCa =
1007  var_sodium_calcium_exchanger_current__i_NaCa; // picoA_per_picoF
1008  const NekDouble var_membrane__i_b_Ca =
1009  var_calcium_background_current__i_b_Ca; // picoA_per_picoF
1010  const NekDouble var_membrane__i_p_K =
1011  var_potassium_pump_current__i_p_K; // picoA_per_picoF
1012  const NekDouble var_membrane__i_p_Ca =
1013  var_calcium_pump_current__i_p_Ca; // picoA_per_picoF
1014  const NekDouble var_membrane__i_Stim_converter =
1015  var_chaste_interface__membrane__i_Stim; // uA_per_cm2
1016  const NekDouble
1017  var_membrane__chaste_interface__chaste_membrane_capacitance =
1018  1.0; // uF_per_cm2
1019  const NekDouble var_membrane__i_Stim =
1020  var_membrane__i_Stim_converter /
1021  var_membrane__chaste_interface__chaste_membrane_capacitance; // picoA_per_picoF
1022  const NekDouble var_membrane__d_V_d_environment__time =
1023  ((-1.0) / 1.0) *
1024  (var_membrane__i_K1 + var_membrane__i_to + var_membrane__i_Kr +
1025  var_membrane__i_Ks + var_membrane__i_CaL + var_membrane__i_NaK +
1026  var_membrane__i_Na + var_membrane__i_b_Na + var_membrane__i_NaCa +
1027  var_membrane__i_b_Ca + var_membrane__i_p_K + var_membrane__i_p_Ca +
1028  var_membrane__i_Stim); // 'millivolt per millisecond'
1029  const NekDouble
1030  var_chaste_interface__membrane__d_V_d_environment__time =
1031  var_membrane__d_V_d_environment__time; // ___units_1
1032  d_dt_chaste_interface__membrane__V =
1033  var_chaste_interface__membrane__d_V_d_environment__time; // 'millivolt
1034  // per
1035  // millisecond'
1036  outarray[0][i] = d_dt_chaste_interface__membrane__V;
1037  outarray[1][i] =
1038  var_rapid_time_dependent_potassium_current_Xr1_gate__xr1_inf;
1039  m_gates_tau[0][i] =
1040  var_rapid_time_dependent_potassium_current_Xr1_gate__tau_xr1;
1041  outarray[2][i] =
1042  var_rapid_time_dependent_potassium_current_Xr2_gate__xr2_inf;
1043  m_gates_tau[1][i] =
1044  var_rapid_time_dependent_potassium_current_Xr2_gate__tau_xr2;
1045  outarray[3][i] =
1046  var_slow_time_dependent_potassium_current_Xs_gate__xs_inf;
1047  m_gates_tau[2][i] =
1048  var_slow_time_dependent_potassium_current_Xs_gate__tau_xs;
1049  outarray[4][i] = var_fast_sodium_current_m_gate__m_inf;
1050  m_gates_tau[3][i] = var_fast_sodium_current_m_gate__tau_m;
1051  outarray[5][i] = var_fast_sodium_current_h_gate__h_inf;
1052  m_gates_tau[4][i] = var_fast_sodium_current_h_gate__tau_h;
1053  outarray[6][i] = var_fast_sodium_current_j_gate__j_inf;
1054  m_gates_tau[5][i] = var_fast_sodium_current_j_gate__tau_j;
1055  outarray[7][i] = var_L_type_Ca_current_d_gate__d_inf;
1056  m_gates_tau[6][i] = var_L_type_Ca_current_d_gate__tau_d;
1057  outarray[8][i] = var_L_type_Ca_current_f_gate__f_inf;
1058  m_gates_tau[7][i] = var_L_type_Ca_current_f_gate__tau_f;
1059  outarray[9][i] = var_L_type_Ca_current_f2_gate__f2_inf;
1060  m_gates_tau[8][i] = var_L_type_Ca_current_f2_gate__tau_f2;
1061  outarray[10][i] = var_L_type_Ca_current_fCass_gate__fCass_inf;
1062  m_gates_tau[9][i] = var_L_type_Ca_current_fCass_gate__tau_fCass;
1063  outarray[11][i] = var_transient_outward_current_s_gate__s_inf;
1064  m_gates_tau[10][i] = var_transient_outward_current_s_gate__tau_s;
1065  outarray[12][i] = var_transient_outward_current_r_gate__r_inf;
1066  m_gates_tau[11][i] = var_transient_outward_current_r_gate__tau_r;
1067  outarray[13][i] = d_dt_chaste_interface__calcium_dynamics__Ca_i;
1068  outarray[14][i] = d_dt_chaste_interface__calcium_dynamics__Ca_SR;
1069  outarray[15][i] = d_dt_chaste_interface__calcium_dynamics__Ca_ss;
1070  outarray[16][i] = d_dt_chaste_interface__calcium_dynamics__R_prime;
1071  outarray[17][i] = d_dt_chaste_interface__sodium_dynamics__Na_i;
1072  outarray[18][i] = d_dt_chaste_interface__potassium_dynamics__K_i;
1073  }
1074 }
1075 
1076 /**
1077  *
1078  */
1080 {
1081  SolverUtils::AddSummaryItem(s, "Cell model", "TenTusscher06");
1082 }
1083 
1084 /**
1085  *
1086  */
1088 {
1089  // Values taken from CellML website
1090  switch (model_variant)
1091  {
1092  case eEpicardium:
1093  Vmath::Fill(m_nq, -85.23, m_cellSol[0], 1);
1094  Vmath::Fill(m_nq, 0.00621, m_cellSol[1], 1);
1095  Vmath::Fill(m_nq, 0.4712, m_cellSol[2], 1);
1096  Vmath::Fill(m_nq, 0.0095, m_cellSol[3], 1);
1097  Vmath::Fill(m_nq, 0.00172, m_cellSol[4], 1);
1098  Vmath::Fill(m_nq, 0.7444, m_cellSol[5], 1);
1099  Vmath::Fill(m_nq, 0.7045, m_cellSol[6], 1);
1100  Vmath::Fill(m_nq, 3.373e-5, m_cellSol[7], 1);
1101  Vmath::Fill(m_nq, 0.7888, m_cellSol[8], 1);
1102  Vmath::Fill(m_nq, 0.9755, m_cellSol[9], 1);
1103  Vmath::Fill(m_nq, 0.9953, m_cellSol[10], 1);
1104  Vmath::Fill(m_nq, 0.999998, m_cellSol[11], 1);
1105  Vmath::Fill(m_nq, 2.42e-8, m_cellSol[12], 1);
1106  Vmath::Fill(m_nq, 0.000126, m_cellSol[13], 1);
1107  Vmath::Fill(m_nq, 3.64, m_cellSol[14], 1);
1108  Vmath::Fill(m_nq, 0.00036, m_cellSol[15], 1);
1109  Vmath::Fill(m_nq, 0.9073, m_cellSol[16], 1);
1110  Vmath::Fill(m_nq, 8.604, m_cellSol[17], 1);
1111  Vmath::Fill(m_nq, 136.89, m_cellSol[18], 1);
1112  break;
1113  case eEndocardium:
1114  Vmath::Fill(m_nq, -86.709, m_cellSol[0], 1);
1115  Vmath::Fill(m_nq, 0.00448, m_cellSol[1], 1);
1116  Vmath::Fill(m_nq, 0.476, m_cellSol[2], 1);
1117  Vmath::Fill(m_nq, 0.0087, m_cellSol[3], 1);
1118  Vmath::Fill(m_nq, 0.00155, m_cellSol[4], 1);
1119  Vmath::Fill(m_nq, 0.7573, m_cellSol[5], 1);
1120  Vmath::Fill(m_nq, 0.7225, m_cellSol[6], 1);
1121  Vmath::Fill(m_nq, 3.164e-5, m_cellSol[7], 1);
1122  Vmath::Fill(m_nq, 0.8009, m_cellSol[8], 1);
1123  Vmath::Fill(m_nq, 0.9778, m_cellSol[9], 1);
1124  Vmath::Fill(m_nq, 0.9953, m_cellSol[10], 1);
1125  Vmath::Fill(m_nq, 0.3212, m_cellSol[11], 1);
1126  Vmath::Fill(m_nq, 2.235e-8, m_cellSol[12], 1);
1127  Vmath::Fill(m_nq, 0.00013, m_cellSol[13], 1);
1128  Vmath::Fill(m_nq, 3.715, m_cellSol[14], 1);
1129  Vmath::Fill(m_nq, 0.00036, m_cellSol[15], 1);
1130  Vmath::Fill(m_nq, 0.9068, m_cellSol[16], 1);
1131  Vmath::Fill(m_nq, 10.355, m_cellSol[17], 1);
1132  Vmath::Fill(m_nq, 138.4, m_cellSol[18], 1);
1133  break;
1134  case eMid:
1135  Vmath::Fill(m_nq, -85.423, m_cellSol[0], 1);
1136  Vmath::Fill(m_nq, 0.0165, m_cellSol[1], 1);
1137  Vmath::Fill(m_nq, 0.473, m_cellSol[2], 1);
1138  Vmath::Fill(m_nq, 0.0174, m_cellSol[3], 1);
1139  Vmath::Fill(m_nq, 0.00165, m_cellSol[4], 1);
1140  Vmath::Fill(m_nq, 0.749, m_cellSol[5], 1);
1141  Vmath::Fill(m_nq, 0.6788, m_cellSol[6], 1);
1142  Vmath::Fill(m_nq, 3.288e-5, m_cellSol[7], 1);
1143  Vmath::Fill(m_nq, 0.7026, m_cellSol[8], 1);
1144  Vmath::Fill(m_nq, 0.9526, m_cellSol[9], 1);
1145  Vmath::Fill(m_nq, 0.9942, m_cellSol[10], 1);
1146  Vmath::Fill(m_nq, 0.999998, m_cellSol[11], 1);
1147  Vmath::Fill(m_nq, 2.347e-8, m_cellSol[12], 1);
1148  Vmath::Fill(m_nq, 0.000153, m_cellSol[13], 1);
1149  Vmath::Fill(m_nq, 4.272, m_cellSol[14], 1);
1150  Vmath::Fill(m_nq, 0.00042, m_cellSol[15], 1);
1151  Vmath::Fill(m_nq, 0.8978, m_cellSol[16], 1);
1152  Vmath::Fill(m_nq, 10.132, m_cellSol[17], 1);
1153  Vmath::Fill(m_nq, 138.52, m_cellSol[18], 1);
1154  break;
1155  case eIschemia:
1156  Vmath::Fill(m_nq, -85.23, m_cellSol[0], 1);
1157  Vmath::Fill(m_nq, 0.00621, m_cellSol[1], 1);
1158  Vmath::Fill(m_nq, 0.4712, m_cellSol[2], 1);
1159  Vmath::Fill(m_nq, 0.0095, m_cellSol[3], 1);
1160  Vmath::Fill(m_nq, 0.00172, m_cellSol[4], 1);
1161  Vmath::Fill(m_nq, 0.7444, m_cellSol[5], 1);
1162  Vmath::Fill(m_nq, 0.7045, m_cellSol[6], 1);
1163  Vmath::Fill(m_nq, 3.373e-5, m_cellSol[7], 1);
1164  Vmath::Fill(m_nq, 0.7888, m_cellSol[8], 1);
1165  Vmath::Fill(m_nq, 0.9755, m_cellSol[9], 1);
1166  Vmath::Fill(m_nq, 0.9953, m_cellSol[10], 1);
1167  Vmath::Fill(m_nq, 0.999998, m_cellSol[11], 1);
1168  Vmath::Fill(m_nq, 2.42e-8, m_cellSol[12], 1);
1169  Vmath::Fill(m_nq, 0.000126, m_cellSol[13], 1);
1170  Vmath::Fill(m_nq, 3.64, m_cellSol[14], 1);
1171  Vmath::Fill(m_nq, 0.00036, m_cellSol[15], 1);
1172  Vmath::Fill(m_nq, 0.9073, m_cellSol[16], 1);
1173  Vmath::Fill(m_nq, 8.604, m_cellSol[17], 1);
1174  Vmath::Fill(m_nq, 136.89, m_cellSol[18], 1);
1175  break;
1176  }
1177 }
1178 
1179 } // namespace Nektar
Cell model base class.
Definition: CellModel.h:66
Array< OneD, Array< OneD, NekDouble > > m_cellSol
Cell model solution variables.
Definition: CellModel.h:126
std::vector< int > m_concentrations
Indices of cell model variables which are concentrations.
Definition: CellModel.h:139
std::vector< int > m_gates
Indices of cell model variables which are gates.
Definition: CellModel.h:141
size_t m_nq
Number of physical points.
Definition: CellModel.h:117
size_t m_nvar
Number of variables in cell model (inc. transmembrane voltage)
Definition: CellModel.h:119
Array< OneD, Array< OneD, NekDouble > > m_gates_tau
Storage for gate tau values.
Definition: CellModel.h:143
tKey RegisterCreatorFunction(tKey idKey, CreatorFunction classCreator, std::string pDesc="")
Register a class with the factory.
Definition: NekFactory.hpp:198
static std::string RegisterEnumValue(std::string pEnum, std::string pString, int pEnumValue)
Registers an enumeration value.
static std::string RegisterDefaultSolverInfo(const std::string &pName, const std::string &pValue)
Registers the default string value of a solver info property.
TenTusscher06(const LibUtilities::SessionReaderSharedPtr &pSession, const MultiRegions::ExpListSharedPtr &pField)
Constructor.
static std::string def
Definition: TenTusscher06.h:98
static std::string lookupIds[]
Definition: TenTusscher06.h:97
enum Variants model_variant
Definition: TenTusscher06.h:95
virtual void v_GenerateSummary(SummaryList &s) override
Prints a summary of the model parameters.
virtual void v_Update(const Array< OneD, const Array< OneD, NekDouble >> &inarray, Array< OneD, Array< OneD, NekDouble >> &outarray, const NekDouble time) override
virtual void v_SetInitialConditions() override
static CellModelSharedPtr create(const LibUtilities::SessionReaderSharedPtr &pSession, const MultiRegions::ExpListSharedPtr &pField)
Creates an instance of this class.
Definition: TenTusscher06.h:47
static std::string className
Name of class.
Definition: TenTusscher06.h:56
std::shared_ptr< SessionReader > SessionReaderSharedPtr
std::shared_ptr< ExpList > ExpListSharedPtr
Shared pointer to an ExpList object.
std::vector< std::pair< std::string, std::string > > SummaryList
Definition: Misc.h:48
void AddSummaryItem(SummaryList &l, const std::string &name, const std::string &value)
Adds a summary item to the summary info list.
Definition: Misc.cpp:49
The above copyright notice and this permission notice shall be included.
Definition: CoupledSolver.h:2
CellModelFactory & GetCellModelFactory()
Definition: CellModel.cpp:46
double NekDouble
void Fill(int n, const T alpha, T *x, const int incx)
Fill a vector with a constant value.
Definition: Vmath.cpp:45
scalarT< T > log(scalarT< T > in)
Definition: scalar.hpp:303
scalarT< T > sqrt(scalarT< T > in)
Definition: scalar.hpp:294