/*-------------------------------------------------------------------------- Author: Thomas Nowotny Institute: Institute for Nonlinear Dynamics University of California San Diego La Jolla, CA 92093-0402 email to: tnowotny@ucsd.edu initial version: 2005-08-17 --------------------------------------------------------------------------*/ #ifndef CN_PNANEURON_CC #define CN_PNANEURON_CC #include "CN_neuron.cc" pNaNeuron::pNaNeuron(int inlabel, double *the_p= pNa_p): neuron(inlabel, pNa_IVARNO, PNANEURON, the_p, pNa_PNO) { } pNaNeuron::pNaNeuron(int inlabel, vector<int> inpos, double *the_p= pNa_p): neuron(inlabel, pNa_IVARNO, PNANEURON, inpos, the_p, pNa_PNO) { } inline double pNaNeuron::E(double *x) { assert(enabled); return x[idx]; } #define gpNa p[0] #define ENa p[1] #define VmpNa p[2] #define smpNa p[3] #define taumpNa p[4] #define VhpNa p[5] #define shpNa p[6] #define ChpNa p[7] #define tauh0pNa p[8] #define tauhApNa p[9] #define VthpNa p[10] #define sthpNa p[11] #define Cmem p[12] #define _efunc(a,b,V) 1.0/(1.0 + exp(((V)-(a))/(b))) void pNaNeuron::currents(ostream &os, double *x) { os << -x[idx+1]*x[idx+2]*gpNa*(x[idx]-ENa); } void pNaNeuron::derivative(double *x, double *dx) { static double minf, hinf, taum, tauh; Isyn= 0.0; forall(den, den_it) { Isyn+= (*den_it)->Isyn(x); } // differential eqn for E, the membrane potential dx[idx]= -(x[idx+1]*x[idx+2]*gpNa*(x[idx]-ENa)-Isyn)/p[9]; // differential equation for pNa current activation minf= _efunc(VmpNa, smpNa, x[idx]); taum= taumpNa; // constant time scale for activation (?) dx[idx+1]= (minf - x[idx+1])/taum; // differential equation for pNa current inactivation hinf= (1.0-ChpNa)*(_efunc(VhpNa, shpNa, x[idx]))+ChpNa; tauh= tauh0pNa - tauhApNa*_efunc(VthpNa, sthpNa, x[idx]); // wild guess dx[idx+2]= (hinf - x[idx+2])/tauh; } #undef _efunc #undef gpNa #undef ENa #undef VmpNa #undef smpNa #undef taumpNa #undef VhpNa #undef shpNa #undef ChpNa #undef tauh0pNa #undef tauhApNa #undef VthpNa #undef sthpNa #undef Cmem #endif