38 #include <lifev/electrophysiology/solver/IonicModels/IonicFox.hpp> 39 #include <Teuchos_RCP.hpp> 40 #include <Teuchos_ParameterList.hpp> 41 #include "Teuchos_XMLParameterListHelpers.hpp" 97 M_restingConditions.at (0) = - 94.7;
98 M_restingConditions.at (1) = 2.4676e-4;
99 M_restingConditions.at (2) = 0.99869;
100 M_restingConditions.at (3) = 0.99887;
101 M_restingConditions.at (4) = 0.229;
102 M_restingConditions.at (5) = 0.0001;
103 M_restingConditions.at (6) = 3.742e-5;
104 M_restingConditions.at (7) = 1.0;
105 M_restingConditions.at (8) = 0.983;
106 M_restingConditions.at (9) = 0.0001;
107 M_restingConditions.at (10) = 0.942;
108 M_restingConditions.at (11) = 0.0472;
109 M_restingConditions.at (12) = 320.0;
115 M_ACap = parameterList.get (
"areaCap", 1.534e-4 );
116 M_VMyo = parameterList.get (
"volMyo", 25.84e-6 );
117 M_Vup = parameterList.get (
"volUp", 0.1 );
118 M_Vsr = parameterList.get (
"volSR", 2e-6 );
119 M_NaO = parameterList.get (
"concNa0", 138.0 );
120 M_CaO = parameterList.get (
"concCa0", 2000.0 );
121 M_K0 = parameterList.get (
"concK0", 4.0 );
122 M_NaIn = parameterList.get (
"concNaIn", 10.0 );
123 M_KIn = parameterList.get (
"concKIn", 149.4 );
124 M_CmdnTot = parameterList.get (
"cmdnTot", 10.0 );
125 M_CsqnTot = parameterList.get (
"csqnTot", 10000.0 );
126 M_KmCmdn = parameterList.get (
"constmCmdn", 2.0 );
127 M_KmCsqn = parameterList.get (
"constmCsqn", 600.0 );
128 M_Cm = parameterList.get (
"capMem", 1.0 );
129 M_F = parameterList.get (
"farad", 96.5 );
130 M_T = parameterList.get (
"temp", 310.0 );
131 M_R = parameterList.get (
"gasConst", 8.314 );
132 M_GNa = parameterList.get (
"maxCondNa", 12.8 );
133 M_GKp = parameterList.get (
"maxCondKp", 0.002216 );
134 M_KmNa = parameterList.get (
"constmNa", 87.5 );
135 M_KmCa = parameterList.get (
"constmCa", 1380.0 );
136 M_kSat = parameterList.get (
"kSat", 0.2 );
137 M_kNaCa = parameterList.get (
"kNaCa", 1500.0 );
138 M_eta = parameterList.get (
"eta", 0.35 );
139 M_INaK = parameterList.get (
"courNaK", 0.693 );
140 M_KmNai = parameterList.get (
"constmNai", 10.0 );
141 M_KmK0 = parameterList.get (
"constmK0", 1.5 );
142 M_IpCa = parameterList.get (
"courpCa", 0.05 );
143 M_KmPCa = parameterList.get (
"constmpCa", 0.05 );
144 M_GCab = parameterList.get (
"maxCondCab", 0.0003842 );
145 M_GNab = parameterList.get (
"maxCondNab", 0.0031 );
146 M_KmUp = parameterList.get (
"constmUp", 0.32 );
147 M_PCa = parameterList.get (
"permCa", 0.0000226 );
148 M_ICaHalf = parameterList.get (
"courCaHalf", -0.265 );
149 M_GK1 = parameterList.get (
"maxCondK1", 2.8 );
150 M_GKr = parameterList.get (
"maxCondKr", 0.0136 );
151 M_GKs = parameterList.get (
"maxCondKs", 0.0245 );
152 M_Gt0 = parameterList.get (
"maxCondt0", 0.23815 );
153 M_PCaK = parameterList.get (
"permCaK", 5.79e-7 );
154 M_Prel = parameterList.get (
"permrel", 6.0 );
155 M_Pleak = parameterList.get (
"permleak", 0.000001 );
156 M_KmfCa = parameterList.get (
"constmfCa", 0.18 );
157 M_KmK1 = parameterList.get (
"constmK1", 13.0 );
206 M_numberOfEquations = model.M_numberOfEquations;
207 M_restingConditions = model.M_restingConditions;
208 M_numberOfGatingVariables = model.M_numberOfGatingVariables;
260 M_numberOfEquations = model.M_numberOfEquations;
261 M_restingConditions = model.M_restingConditions;
262 M_numberOfGatingVariables = model.M_numberOfGatingVariables;
274 std::vector<Real> gatingRhs ( computeLocalGatingRhs (v) );
275 std::vector<Real> subSysCaRhs ( computeLocalSubSysCaRhs (v) );
277 std::copy ( gatingRhs.begin(), gatingRhs.end(), rhs.begin() );
278 std::copy ( subSysCaRhs.begin(), subSysCaRhs.end() - 1, rhs.begin() + gatingRhs.size() );
284 std::vector<Real> gatingRhs ( computeLocalGatingRhs (v) );
285 std::vector<Real> subSysCaRhs ( computeLocalSubSysCaRhs (v) );
287 rhs[0] = computeLocalPotentialRhs (v );
289 if (rhs.size() > M_numberOfEquations)
291 std::copy ( gatingRhs.begin(), gatingRhs.end(), rhs.begin() + 1 );
292 std::copy ( subSysCaRhs.begin(), subSysCaRhs.end(), rhs.begin() + 1 + gatingRhs.size() );
296 std::copy ( gatingRhs.begin(), gatingRhs.end(), rhs.begin() + 1 );
297 std::copy ( subSysCaRhs.begin(), subSysCaRhs.end() - 1, rhs.begin() + 1 + gatingRhs.size() );
306 std::vector<Real> gatingRhs ( computeLocalGatingRhs (v) );
307 std::vector<Real> subSysCaRhs ( computeLocalSubSysCaRhs (v) );
309 std::copy ( gatingRhs.begin(), gatingRhs.end(), rhs.begin() );
310 std::copy ( subSysCaRhs.begin(), subSysCaRhs.end() - 1, rhs.begin() + gatingRhs.size() );
315 std::vector<Real> fastNa (fastINa (v) );
316 std::vector<Real> rapidK (rapidIK (v) );
317 std::vector<Real> slowK (slowIK (v) );
318 std::vector<Real> transOutK (transOutIK (v) );
319 std::vector<Real> subSysCaRHS (computeLocalSubSysCaRhs (v) );
320 Real INa = fastNa[0];
321 Real IKr = rapidK[0];
323 Real It0 = transOutK[0];
324 Real ICa = subSysCaRHS[5];
326 return - ( INa + timeIIK1 (v) + IKr + IKs + It0 + plaIKp (v) + pumpINaK (v)
327 + exINaCa (v) + backINab (v) + backICab (v) + pumpIpCa (v) + ICa ) ;
341 std::vector<Real> gatingRhs (7);
342 std::vector<Real> paramNa ( fastINa (v) );
343 std::vector<Real> paramKr ( rapidIK (v) );
344 std::vector<Real> paramKs ( slowIK (v) );
345 std::vector<Real> paramKt0 ( transOutIK (v) );
347 gatingRhs[0] = paramNa[1] * ( 1 - m ) - paramNa[2] * m;
348 gatingRhs[1] = paramNa[3] * ( 1 - h ) - paramNa[4] * h;
349 gatingRhs[2] = paramNa[5] * ( 1 - j ) - paramNa[6] * j;
351 gatingRhs[3] = ( paramKr[1] - xr ) / paramKr[2];
352 gatingRhs[4] = ( paramKs[1] - xks ) / paramKs[2];
353 gatingRhs[5] = paramKt0[1] * ( 1 - xt0 ) - paramKt0[2] * xt0;
354 gatingRhs[6] = paramKt0[3] * ( 1 - yt0 ) - paramKt0[4] * yt0;
370 std::vector<Real> paramNa ( fastINa (v) );
371 std::vector<Real> paramKr ( rapidIK (v) );
372 std::vector<Real> paramKs ( slowIK (v) );
373 std::vector<Real> paramKt0 ( transOutIK (v) );
375 Real TAU_M = 1.0 / ( paramNa[1] + paramNa[2] );
376 Real M_INF = paramNa[1] * TAU_M;
377 Real TAU_H = 1.0 / ( paramNa[3] + paramNa[4] );
378 Real H_INF = paramNa[3] * TAU_M;
379 Real TAU_J = 1.0 / ( paramNa[5] + paramNa[6] );
380 Real J_INF = paramNa[5] * TAU_M;
382 Real TAU_Xr = paramKr[2];
383 Real Xr_INF = paramKr[1];
384 Real TAU_Xks = paramKs[2];
385 Real Xks_INF = paramKs[1];
387 Real TAU_xto = 1.0 / ( paramKt0[1] + paramKt0[2] );
388 Real xto_INF = paramKt0[1] * TAU_M;
389 Real TAU_yto = 1.0 / ( paramKt0[3] + paramKt0[4] );
390 Real yto_INF = paramKt0[3] * TAU_M;
392 v[1] = M_INF - ( M_INF - m ) * std::exp (- dt / TAU_M );
393 v[2] = H_INF - ( H_INF - h ) * std::exp (- dt / TAU_H );
394 v[3] = J_INF - ( J_INF - j ) * std::exp (- dt / TAU_J );
395 v[4] = Xr_INF - ( Xr_INF - xr ) * std::exp (- dt / TAU_Xr );
396 v[5] = Xks_INF - ( Xks_INF - xks ) * std::exp (- dt / TAU_Xks );
397 v[6] = xto_INF - ( xto_INF - xt0 ) * std::exp (- dt / TAU_xto );
398 v[7] = yto_INF - ( yto_INF - yt0 ) * std::exp (- dt / TAU_yto );
406 std::vector<Real> subSysCaRHS (6);
409 Real cCaIn ( v[11] );
410 Real cCaSR ( v[12] );
412 Real gating_d ( v[9] );
413 Real gating_f ( v[8] );
414 Real gating_f_Ca ( v[10] );
418 Real gamma = 1.0 / ( 1.0 + pow ( ( 2000.0 / cCaSR ), 3) );
420 Real jRel =
M_Prel * gating_d * gating_f * gating_f_Ca * ( gamma * cCaSR - cCaIn ) / ( 1.0 + 1.65 * exp (V / 20.0) );
427 Real sd = 1.0 / ( 1.0 + exp ( - ( V + 10.0 ) / 6.24 ) );
428 Real td = 1.0 / ( (0.25 * exp (-0.01 * V) / (1.0 + exp (-0.07 * V) ) ) + (0.07 * exp (-0.05 * (V + 40.0) ) / (1.0 + exp (0.05 * (V + 40.0) ) ) ) );
430 Real sfca = 1.0 / (1.0 + pow ( (cCaIn /
M_KmfCa), 3.0) );
433 Real sf = 1.0 / (1 + exp (V + 12.5) / 5.0);
434 Real tf = 30.0 + (200.0 / (1 + exp ( (V + 20.0) / 9.5) ) );
437 ( (cCaIn * exp (2.0 * ( V *
M_F ) / (
M_R *
M_T ) ) - 0.341 *
M_CaO) /
438 (exp (2.0 * ( V *
M_F ) / (
M_R *
M_T ) ) - 1.0) );
439 Real I_Cal = gating_d * gating_f * gating_f_Ca * I_Ca_full;
444 Real I_Ca = I_Cal + I_Ca_K;
448 subSysCaRHS[4] = betaSR * ( jUp - jLeak - jRel) * ( M_VMyo / M_Vsr );
449 subSysCaRHS[3] = betaIn * ( jRel + jLeak - jUp - (M_ACap * M_Cm / (2 * M_F * M_VMyo) ) * (I_Cal + backICab (v) + M_IpCa - 2 * exINaCa (v) ) );
451 subSysCaRHS[0] = ( sf - gating_f ) / tf;
452 subSysCaRHS[1] = ( sd - gating_d ) / td;
453 subSysCaRHS[2] = ( sfca - gating_f_Ca ) / tfca;
455 subSysCaRHS[5] = I_Ca;
465 std::vector<Real> fastNa (7);
474 fastNa[0] = M_GNa * m * m * m * h * j * ( V - potNa );
476 Real alpha_m = 0.32 * ( V + 47.13 ) / ( 1.0 - exp ( - 0.1 * ( V + 47.13 ) ) );
477 Real beta_m = 0.08 * exp (- V / 11.0 );
479 Real alpha_h = 0.135 * exp ( - ( V + 80.0 ) / 6.8 );
480 Real beta_h = 7.5 / ( 1.0 + exp ( - 0.1 * ( V + 11.0 ) ) );
481 Real alpha_j = ( 0.175 * exp ( - ( V + 100.0 ) / 23.0 ) ) / ( 1.0 + exp ( 0.15 * ( V + 79.0 ) ) );
482 Real beta_j = 0.3 / ( 1.0 + exp ( -0.1 * ( V + 32.0 ) ) );
497 std::vector<Real> rapidK (3);
503 Real RV = 1.0 / ( 1.0 + 2.5 * std::exp ( 0.1 * ( V + 28.0 ) ) );
505 Real sxr = 1.0 / ( 1.0 + std::exp ( -2.182 - 0.1819 * V ) );
506 Real txr = 43.0 + ( 1.0 / ( std::exp ( -5.495 + 0.1691 * V ) + std::exp ( -7.677 - 0.0128 * V ) ) );
508 rapidK[0] = M_GKr * xr * RV * std::sqrt ( M_K0 / 4.0 ) * ( V - potK1 );
526 Real sxs = 1.0 / ( 1.0 + std::exp ( - ( V - 16.0 ) / 13.6 ) );
527 Real txs = 1.0 / ( ( 0.0000719 * ( V - 10.0 ) / ( 1.0 - std::exp ( -0.148 * ( V - 10.0 ) ) ) )
528 + ( 0.000131 * ( V - 10.0 ) / ( std::exp ( 0.0687 * (V - 10.0) ) - 1.0) ) );
530 std::vector<Real> slow (3, 0.0);
531 slow[0] = M_GKs * xs * xs * ( V - potKs );
541 std::vector<Real> transOutK (5);
549 Real axto = 0.04516 * exp ( 0.03577 * V );
550 Real bxto = 0.0989 * exp ( -0.06237 * V );
551 Real ayto = ( 0.005415 * exp ( - ( V + 33.5 ) / 5.0 ) ) / ( 1.0 + 0.051335 * exp ( - ( V + 33.5 ) / 5.0 ) );
552 Real byto = ( 0.005415 * exp ( ( V + 33.5 ) / 5.0 ) ) / ( 1.0 + 0.051335 * exp ( ( V + 33.5 ) / 5.0 ) );
554 transOutK[0] = M_Gt0 * xto * yto * ( V - potK1 );
571 Real sK1 = 1.0 / ( 2.0 + exp ( ( 1.62 / (
M_R *
M_T /
M_F ) ) * ( V - potK1 ) ) );
574 return maxCondK1 * sK1 * constK1inf * ( V - potK1 );
583 Real constKp = 1 / ( 1 + exp ( ( 7.488 - V ) / 5.98 ) );
585 return M_GKp * constKp * ( V - potKp );
593 Real cCaIn ( v[11] );
606 Real sigma = ( 1.0 / 7.0 ) * ( exp (
M_NaO / 67.3 ) - 1.0 );
607 Real fNak = 1.0 / ( 1.0 + 0.1245 * exp ( -0.1 * ( V *
M_F ) / (
M_R *
M_T ) ) +
608 0.0365 * sigma * exp ( - ( V *
M_F ) / (
M_R *
M_T ) ) );
616 return M_IpCa * v[11] / ( M_KmPCa + v[11] );
623 Real cCaIn ( v[11] );
627 return M_GCab * ( V - potCaN );
637 return M_GNab * ( V - potNaN );
642 std::cout <<
"\n\n\t\tIonicFox Informations\n\n";
643 std::cout <<
"number of unkowns: " <<
this->Size() << std::endl;
710 std::cout <<
"\n\t\t End of IonicFox Informations\n\n\n";
Real timeIIK1(const std::vector< Real > &v)
Real exINaCa(const std::vector< Real > &v)
void showMe()
Display information about the model.
Real M_ACap
Cell Geometry Parameters (4)
Real M_PCa
L-type Ca2+ Channel Parameters (6)
std::vector< Real > computeLocalGatingRhs(const std::vector< Real > &v)
Real M_NaO
Standard Ionic Concentrations (5)
std::vector< Real > slowIK(const std::vector< Real > &v)
void computeRhs(const std::vector< Real > &v, std::vector< Real > &rhs)
This methods contains the actual evaluation of the rhs of all state variablesin the model (0D version...
Real M_Cm
Membrane Current Parameters (24)
std::vector< Real > rapidIK(const std::vector< Real > &v)
void updateInverseJacobian(const UInt &iQuadPt)
Real M_CmdnTot
Buffering Parameters (4)
Real pumpIpCa(const std::vector< Real > &v)
void computeGatingVariablesWithRushLarsen(std::vector< Real > &v, const Real dt)
This methods contains the actual evaluation of the rhs of the voltage equation only (0D version) ...
IonicFox(Teuchos::ParameterList ¶meterList)
Real M_KmUp
SR Parameters (1)
Real plaIKp(const std::vector< Real > &v)
std::vector< Real > computeLocalSubSysCaRhs(const std::vector< Real > &v)
Ca2+ Subsystem.
IonicModel - This class implements an ionic model.
IonicFox & operator=(const IonicFox &model)
Operator.
double Real
Generic real data.
Real backICab(const std::vector< Real > &v)
Real backINab(const std::vector< Real > &v)
std::vector< Real > transOutIK(const std::vector< Real > &v)
void computeGatingRhs(const std::vector< Real > &v, std::vector< Real > &rhs)
Methods.
Real pumpINaK(const std::vector< Real > &v)
Real computeLocalPotentialRhs(const std::vector< Real > &v)
This methods contains the actual evaluation of the rhs of the voltage equation only (0D version) ...
void computeNonGatingRhs(const std::vector< Real > &v, std::vector< Real > &rhs)
In the case this method is improperly used, it should use this default implementation.
IonicFox(const IonicFox &model)
std::vector< Real > fastINa(const std::vector< Real > &v)
Ionic Currents (Luo and Rudy)