Nygren et al. 1998¶
Key: nygren1998mathematical
A mathematical model of the human atrial myocyte based on averaged voltage-clamp data recorded from isolated single myocytes. This model consists of a Hodgkin-Huxley–type equivalent circuit for the sarcolemma, coupled with a fluid compartment model, which accounts for changes in ionic concentrations in the cytoplasm as well as in the sarcoplasmic reticulum. This formulation can reconstruct action potential data that are representative of recordings from a majority of human atrial cells and therefore provides a biophysically based account of the underlying ionic currents.
References¶
Figure¶
Variables¶
V = -74.2525Ca_c = 1.8147Ca_d = 7.2495e-05Ca_i = 6.729e-05Ca_rel = 0.6465Ca_up = 0.6646K_c = 5.3581K_i = 129.435Na_c = 130.011Na_i = 8.5547F1 = 0.4284F2 = 0.0028O_C = 0.0275O_Calse = 0.4369O_TC = 0.0133O_TMgC = 0.1961O_TMgMg = 0.7094d_L = 1.3005e-05f_L1 = 0.9986f_L2 = 0.9986h1 = 0.8814h2 = 0.8742m = 0.0032017n = 0.0048357p_a = 0.0001r = 0.0010678r_sus = 0.00015949s = 0.949s_sus = 0.9912
Parameters¶
diffusivity_V = 1.0Cm = 0.05Ca_b = 1.8K_b = 5.4Mg_i = 2.5Na_b = 130.0E_Ca_app = 60.0F = 96487.0I_up_max = 2800.0P_Na = 0.0016R = 8314.0T = 306.15Vol_c = 0.000800224Vol_d = 0.00011768Vol_i = 0.005884Vol_rel = 4.41e-05Vol_up = 0.0003969alpha_rel = 200000.0d_NaCa = 0.0003g_B_Ca = 0.078681g_B_Na = 0.060599g_Ca_L = 6.75g_K1 = 3.0g_Kr = 0.5g_Ks = 1.0g_sus = 2.75g_t = 7.5gamma = 0.45i_CaP_max = 4.0i_NaK_max = 70.8253k_Ca = 0.025k_CaP = 0.0002k_NaCa = 0.0374842k_NaK_K = 1.0k_NaK_Na = 11.0k_cyca = 0.0003k_rel_d = 0.003k_rel_i = 0.0003k_srca = 0.5k_xcs = 0.4phi_Na_en = -1.68r_recov = 0.815tau_Ca = 24.7tau_K = 10.0tau_Na = 14.3tau_di = 0.01tau_tr = 0.01
Source code¶
OpenCL kernel
// r gate
const Real r_inf = 1.0 / (1.0 + exp((V - 1.0) / -11.0));
const Real tau_r = 0.0035 * exp(-pow(V / 30.0, 2.0)) + 0.0015;
*_new_r = r_inf + (r - r_inf) * exp(-(dt / tau_r));
// s gate
const Real s_inf = 1.0 / (1.0 + exp((V + 40.5) / 11.5));
const Real tau_s = 0.4812 * exp(-pow((V + 52.45) / 14.97, 2.0)) + 0.01414;
*_new_s = s_inf + (s - s_inf) * exp(-(dt / tau_s));
// L type Ca channel
const Real f_Ca = Ca_d / (Ca_d + k_Ca);
const Real i_Ca_L = g_Ca_L * d_L * (f_Ca * f_L1 + (1.0 - f_Ca) * f_L2) * (V - E_Ca_app);
// d_L gate
const Real d_L_inf = 1.0 / (1.0 + exp((V + 9.0) / -5.8));
const Real tau_d_L = 0.0027 * exp(-pow((V + 35.0) / 30.0, 2.0)) + 0.002;
*_new_d_L = d_L_inf + (d_L - d_L_inf) * exp(-(dt / tau_d_L));
// f_L1 gate
const Real f_L_inf = 1.0 / (1.0 + exp((V + 27.4) / 7.1));
const Real tau_f_L1 = 0.161 * exp(-pow((V + 40.0) / 14.4, 2.0)) + 0.01;
*_new_f_L1 = f_L_inf + (f_L1 - f_L_inf) * exp(-(dt / tau_f_L1));
// n gate
const Real n_inf = 1.0 / (1.0 + exp((V - 19.9) / -12.7));
const Real tau_n = 0.7 + 0.4 * exp(-pow((V - 20.0) / 20.0, 2.0));
*_new_n = n_inf + (n - n_inf) * exp(-(dt / tau_n));
// pa gate
const Real p_a_inf = 1.0 / (1.0 + exp((V + 15.0) / -6.0));
const Real tau_p_a = 0.03118 + 0.21718 * exp(-pow((V + 20.1376) / 22.1996, 2.0));
*_new_p_a = p_a_inf + (p_a - p_a_inf) * exp(-(dt / tau_p_a));
// pi gate
const Real p_i = 1.0 / (1.0 + exp((V + 55.0) / 24.0));
// intracellular Ca buffering
const Real dot_O_C = 200000.0 * Ca_i * (1.0 - O_C) - 476.0 * O_C;
const Real dot_O_TC = 78400.0 * Ca_i * (1.0 - O_TC) - 392.0 * O_TC;
const Real dot_O_TMgC = 200000.0 * Ca_i * (1.0 - O_TMgC - O_TMgMg) - 6.6 * O_TMgC;
*_new_O_C = O_C + dt*dot_O_C;
*_new_O_TC = O_TC + dt*dot_O_TC;
*_new_O_TMgC = O_TMgC + dt*dot_O_TMgC;
*_new_O_TMgMg = O_TMgMg + dt*(2000.0 * Mg_i * (1.0 - O_TMgC - O_TMgMg) - 666.0 * O_TMgMg);
// sarcolemmal calcium pump current
const Real i_CaP = i_CaP_max * Ca_i / (Ca_i + k_CaP);
// h1 gate
const Real h_inf = 1.0 / (1.0 + exp((V + 63.6) / 5.3));
const Real tau_h1 = 0.03 / (1.0 + exp((V + 35.1) / 3.2)) + 0.0003;
*_new_h1 = h_inf + (h1 - h_inf) * exp(-(dt / tau_h1));
// m gate
const Real m_inf = 1.0 / (1.0 + exp((V + 27.12) / -8.21));
const Real tau_m = 4.2e-05 * exp(-pow((V + 25.57) / 28.8, 2.0)) + 2.4e-05;
*_new_m = m_inf + (m - m_inf) * exp(-(dt / tau_m));
// sodium potassium pump
const Real i_NaK = i_NaK_max * K_c / (K_c + k_NaK_K) * pow(Na_i, 1.5) / (pow(Na_i, 1.5) + pow(k_NaK_Na, 1.5)) * safe_divide(V + 150.0, V + 200.0);
// r_sus gate
const Real r_sus_inf = 1.0 / (1.0 + exp((V + 4.3) / -8.0));
const Real tau_r_sus = 0.009 / (1.0 + exp((V + 5.0) / 12.0)) + 0.0005;
*_new_r_sus = r_sus_inf + (r_sus - r_sus_inf) * exp(-(dt / tau_r_sus));
// s_sus gate
const Real s_sus_inf = 0.4 / (1.0 + exp((V + 20.0) / 10.0)) + 0.6;
const Real tau_s_sus = 0.047 / (1.0 + exp((V + 60.0) / 10.0)) + 0.3;
*_new_s_sus = s_sus_inf + (s_sus - s_sus_inf) * exp(-(dt / tau_s_sus));
// f_L2 gate
const Real tau_f_L2 = 1.3323 * exp(-pow((V + 40.0) / 14.2, 2.0)) + 0.0626;
*_new_f_L2 = f_L_inf + (f_L2 - f_L_inf) * exp(-(dt / tau_f_L2));
// h2 gate
const Real tau_h2 = 0.12 / (1.0 + exp((V + 35.1) / 3.2)) + 0.003;
*_new_h2 = h_inf + (h2 - h_inf) * exp(-(dt / tau_h2));
// Ca handling by the SR
const Real dot_O_Calse = 480.0 * Ca_rel * (1.0 - O_Calse) - 400.0 * O_Calse;
const Real i_rel = alpha_rel * pow(F2 / (F2 + 0.25), 2.0) * (Ca_rel - Ca_i);
const Real i_up = I_up_max * (Ca_i / k_cyca - k_xcs * k_xcs * Ca_up / k_srca) / ((Ca_i + k_cyca) / k_cyca + k_xcs * (Ca_up + k_srca) / k_srca);
const Real r_act = 203.8 * (pow(Ca_i / (Ca_i + k_rel_i), 4.0) + pow(Ca_d / (Ca_d + k_rel_d), 4.0));
const Real r_inact = 33.96 + 339.6 * pow(Ca_i / (Ca_i + k_rel_i), 4.0);
*_new_O_Calse = O_Calse + dt*dot_O_Calse;
*_new_F1 = F1 + dt*(r_recov * (1.0 - F1 - F2) - r_act * F1);
*_new_F2 = F2 + dt*(r_act * F1 - r_inact * F2);
// sodium current
const Real E_Na = R * T / F * log(Na_c / Na_i);
const Real i_Na =
P_Na * m * m * m * (0.9 * h1 + 0.1 * h2) * Na_c * F * F / (R * T) *
(fabs(V) < 1e-3
? R * T * (exp((-E_Na * F) / (R * T)) - 1.0) / F
: V * (exp((V - E_Na) * F / (R * T)) - 1.0)
/ (exp(V * F / (R * T)) - 1.0)
);
// remaining
const Real i_tr = (Ca_up - Ca_rel) * 2.0 * F * Vol_rel / tau_tr;
const Real E_K = R * T / F * log(K_c / K_i);
const Real i_NaCa = k_NaCa * (Na_i * Na_i * Na_i * Ca_c * exp(gamma * F * V / (R * T)) - Na_c * Na_c * Na_c * Ca_i * exp((gamma - 1.0) * V * F / (R * T))) / (1.0 + d_NaCa * (Na_c * Na_c * Na_c * Ca_i + Na_i * Na_i * Na_i * Ca_c));
const Real E_Ca = R * T / (2.0 * F) * log(Ca_c / Ca_i);
const Real i_B_Na = g_B_Na * (V - E_Na);
const Real i_di = (Ca_d - Ca_i) * 2.0 * F * Vol_d / tau_di;
*_new_Ca_rel = Ca_rel + dt*((i_tr - i_rel) / (2.0 * Vol_rel * F) - 31.0 * dot_O_Calse);
*_new_Ca_up = Ca_up + dt*((i_up - i_tr) / (2.0 * Vol_up * F));
const Real i_t = g_t * r * s * (V - E_K);
const Real i_B_Ca = g_B_Ca * (V - E_Ca);
*_new_Na_c = Na_c + dt*((Na_b - Na_c) / tau_Na + (i_Na + i_B_Na + 3.0 * i_NaK + 3.0 * i_NaCa + phi_Na_en) / (Vol_c * F));
const Real i_Kr = g_Kr * p_a * p_i * (V - E_K);
const Real i_Ks = g_Ks * n * (V - E_K);
*_new_Ca_d = Ca_d + dt*(-(i_Ca_L + i_di) / (2.0 * Vol_d * F));
*_new_Na_i = Na_i + dt*(-(i_Na + i_B_Na + 3.0 * i_NaK + 3.0 * i_NaCa + phi_Na_en) / (Vol_i * F));
const Real i_K1 = g_K1 * pow(K_c / 1.0, 0.4457) * (V - E_K) / (1.0 + exp(1.5 * (V - E_K + 3.6) * F / (R * T)));
const Real i_sus = g_sus * r_sus * s_sus * (V - E_K);
*_new_Ca_c = Ca_c + dt*((Ca_b - Ca_c) / tau_Ca + (i_Ca_L + i_B_Ca + i_CaP - 2.0 * i_NaCa) / (2.0 * Vol_c * F));
*_new_K_c = K_c + dt*((K_b - K_c) / tau_K + (i_t + i_sus + i_K1 + i_Kr + i_Ks - 2.0 * i_NaK) / (Vol_c * F));
*_new_Ca_i = Ca_i + dt*(-(-i_di + i_B_Ca + i_CaP - 2.0 * i_NaCa + i_up - i_rel) / (2.0 * Vol_i * F) - (0.08 * dot_O_TC + 0.16 * dot_O_TMgC + 0.045 * dot_O_C));
*_new_K_i = K_i + dt*(-(i_t + i_sus + i_K1 + i_Kr + i_Ks - 2.0 * i_NaK) / (Vol_i * F));
*_new_V = V + dt*(_diffuse_V - (i_Na + i_Ca_L + i_t + i_sus + i_K1 + i_Kr + i_Ks + i_B_Na + i_B_Ca + i_NaK + i_CaP + i_NaCa) / Cm);
// check for unphysical values
if(*_new_Ca_c <= 0.0) { *_new_Ca_c = VERY_SMALL_NUMBER; }
if(*_new_Ca_d <= 0.0) { *_new_Ca_d = VERY_SMALL_NUMBER; }
if(*_new_Ca_i <= 0.0) { *_new_Ca_i = VERY_SMALL_NUMBER; }
if(*_new_Ca_rel <= 0.0) { *_new_Ca_rel = VERY_SMALL_NUMBER; }
if(*_new_Ca_up <= 0.0) { *_new_Ca_up = VERY_SMALL_NUMBER; }
if(*_new_K_c <= 0.0) { *_new_K_c = VERY_SMALL_NUMBER; }
if(*_new_K_i <= 0.0) { *_new_K_i = VERY_SMALL_NUMBER; }
if(*_new_Na_c <= 0.0) { *_new_Na_c = VERY_SMALL_NUMBER; }
if(*_new_Na_i <= 0.0) { *_new_Na_i = VERY_SMALL_NUMBER; }
Additional metadata¶
keywords:
- excitable media
- electrophysiology
- heart
- human
- atria
example discretisation:
dt: 5.8e-05
dx: 0.044
stimulus: 34.1
units:
t: s
x: m
u: mV