: HH sodium current NEURON{ SUFFIX isodium NONSPECIFIC_CURRENT i RANGE g, rev_na } UNITS{ (mS) = (millisiemens) (mV) = (millivolt) (uA) = (microamp) } PARAMETER{ g = 35.0 (mS/cm2) h_init = 0.05 rev_na = 70 (mV) } ASSIGNED{ v (mV) i (uA/cm2) } STATE {h} BREAKPOINT{ SOLVE states METHOD cnexp :SOLVE states METHOD euler :SOLVE states METHOD runge :SOLVE states METHOD derivimplicit i = g*(v-rev_na)*(m_infinity(v)^3)*h*0.001 : factor to convert to mA/cm2 } INITIAL { h = h_init } DERIVATIVE states{ h' = ((1-h)*alpha(v) - h*beta(v))/0.2 } FUNCTION m_infinity(Vm (mV)){ LOCAL alpha_m, beta_m, x, y, x1 x1 = -(Vm+60.0)/18.0 if (x1>700){ x1 = 700 : printf("sodium beta_m, time: %g, current: %g, voltage: %g \n", t, i, Vm) } : beta_m = 4.0*exp(-(Vm+60.0)/18.0) beta_m = 4.0*exp(x1) x = Vm+35.0 y = -0.1*x if (y > 700){ :alpha_m = 0 y = 700 : printf("sodium alpha_m, time: %g, current: %g, voltage: %g \n", t, i, Vm) } if (fabs(y)>1e-6){ alpha_m = y/(exp(y)-1) } else{ alpha_m = 1/(1+y/2.0+y*y/6.0) } m_infinity = alpha_m/(alpha_m+beta_m) } FUNCTION alpha(Vm (mV)) (/ms){ LOCAL x UNITSOFF x = -(Vm+58.0)/20.0 if (x>700){ x=700 : printf("sodium alpha, time: %g, current: %g, voltage: %g \n", t, i, Vm) } alpha = 0.07*exp(x) UNITSON } FUNCTION beta(Vm (mV)) (/ms){ LOCAL x, y, x1 UNITSOFF x = (Vm + 28.0) x1 = -0.1*x if (x1>700){ x1=700 : printf("sodium beta, time: %g, current: %g, voltage: %g \n", t, i, Vm) } y = exp(x1) + 1 beta = 1.0/y UNITSON }