/* Created by Language version: 6.0.2 */ /* NOT VECTORIZED */ #include #include #include "scoplib.h" #undef PI #include "md1redef.h" #include "section.h" #include "nrnoc_ml.h" #include "md2redef.h" #if METHOD3 extern int _method3; #endif #undef exp #define exp hoc_Exp extern double hoc_Exp(); /*SUPPRESS 761*/ /*SUPPRESS 762*/ /*SUPPRESS 763*/ /*SUPPRESS 765*/ extern double *getarg(); static double *_p; static Datum *_ppvar; #define delta_t dt #define Alpha _p[0] #define Beta _p[1] #define e _p[2] #define iNMDA _p[3] #define g _p[4] #define gmax _p[5] #define Ron _p[6] #define Roff _p[7] #define Rinf _p[8] #define Rtau _p[9] #define synon _p[10] #define B _p[11] #define DRon _p[12] #define DRoff _p[13] #define _g _p[14] #define _tsav _p[15] #define _nd_area *_ppvar[0].pval #if MAC #if !defined(v) #define v _mlhv #endif #if !defined(h) #define h _mlhh #endif #endif static int hoc_nrnpointerindex = -1; /* external NEURON variables */ extern double dt; extern double t; /* declaration of user functions */ static double _hoc_mgblock(); static int _mechtype; extern int nrn_get_mechtype(); extern Prop* nrn_point_prop_; static int _pointtype; static void* _hoc_create_pnt(_ho) Object* _ho; { void* create_point_process(); return create_point_process(_pointtype, _ho); } static void _hoc_destroy_pnt(); static double _hoc_loc_pnt(_vptr) void* _vptr; {double loc_point_process(); return loc_point_process(_pointtype, _vptr); } static double _hoc_has_loc(_vptr) void* _vptr; {double has_loc_point(); return has_loc_point(_vptr); } static double _hoc_get_loc_pnt(_vptr)void* _vptr; { double get_loc_point_process(); return (get_loc_point_process(_vptr)); } static _hoc_setdata(_vptr) void* _vptr; { Prop* _prop; _prop = ((Point_process*)_vptr)->_prop; _p = _prop->param; _ppvar = _prop->dparam; } /* connect user functions to hoc names */ static IntFunc hoc_intfunc[] = { 0,0 }; static struct Member_func { char* _name; double (*_member)();} _member_func[] = { "loc", _hoc_loc_pnt, "has_loc", _hoc_has_loc, "get_loc", _hoc_get_loc_pnt, "mgblock", _hoc_mgblock, 0, 0 }; #define _f_mgblock _f_mgblock_NMDAb #define mgblock mgblock_NMDAb extern double _f_mgblock(); extern double mgblock(); /* declare global and static user variables */ #define Cmax Cmax_NMDAb double Cmax = 1; #define Cdur Cdur_NMDAb double Cdur = 1.1; #define mg mg_NMDAb double mg = 1; #define usetable usetable_NMDAb double usetable = 1; /* some parameters have upper and lower limits */ static HocParmLimits _hoc_parm_limits[] = { "usetable_NMDAb", 0, 1, 0,0,0 }; static HocParmUnits _hoc_parm_units[] = { "Cmax_NMDAb", "mM", "Cdur_NMDAb", "ms", "mg_NMDAb", "mM", "Alpha", "/ms", "Beta", "/ms", "e", "mV", "iNMDA", "nA", "g", "umho", 0,0 }; static double Roff0 = 0; static double Ron0 = 0; static double v = 0; /* connect global user variables to hoc */ static DoubScal hoc_scdoub[] = { "Cmax_NMDAb", &Cmax, "Cdur_NMDAb", &Cdur, "mg_NMDAb", &mg, "usetable_NMDAb", &usetable, 0,0 }; static DoubVec hoc_vdoub[] = { 0,0,0 }; static double _sav_indep; static nrn_alloc(), nrn_init(), nrn_state(); static nrn_cur(), nrn_jacob(); static void _hoc_destroy_pnt(_vptr) void* _vptr; { destroy_point_process(_vptr); } static int _ode_count(), _ode_map(), _ode_spec(), _ode_matsol(); extern int nrn_cvode_; #define _cvode_ieq _ppvar[3]._i /* connect range variables in _p that hoc is supposed to know about */ static char *_mechanism[] = { "6.0.2", "NMDAb", "Alpha", "Beta", "e", 0, "iNMDA", "g", "gmax", 0, "Ron", "Roff", 0, 0}; static nrn_alloc(_prop) Prop *_prop; { Prop *prop_ion, *need_memb(); double *_p; Datum *_ppvar; if (nrn_point_prop_) { _p = nrn_point_prop_->param; _ppvar = nrn_point_prop_->dparam; }else{ _p = nrn_prop_data_alloc(_mechtype, 16); /*initialize range parameters*/ Alpha = 10; Beta = 0.0125; e = 0; } _prop->param = _p; _prop->param_size = 16; if (!nrn_point_prop_) { _ppvar = nrn_prop_datum_alloc(_mechtype, 4); } _prop->dparam = _ppvar; /*connect ionic variables to this model*/ } static _initlists(); /* some states have an absolute tolerance */ static Symbol** _atollist; static HocStateTolerance _hoc_state_tol[] = { 0,0 }; #define _tqitem &(_ppvar[2]._pvoid) static _net_receive(); typedef (*_Pfrv)(); extern _Pfrv* pnt_receive; extern short* pnt_receive_size; _NMDAb_reg() { int _vectorized = 0; _initlists(); _pointtype = point_register_mech(_mechanism, nrn_alloc,nrn_cur, nrn_jacob, nrn_state, nrn_init, hoc_nrnpointerindex, _hoc_create_pnt, _hoc_destroy_pnt, _member_func, _vectorized); _mechtype = nrn_get_mechtype(_mechanism[1]); hoc_register_dparam_size(_mechtype, 4); hoc_register_cvode(_mechtype, _ode_count, _ode_map, _ode_spec, _ode_matsol); hoc_register_tolerance(_mechtype, _hoc_state_tol, &_atollist); pnt_receive[_mechtype] = _net_receive; pnt_receive_size[_mechtype] = 5; hoc_register_var(hoc_scdoub, hoc_vdoub, hoc_intfunc); ivoc_help("help ?1 NMDAb /home/jg/ModelosNeuron/ProgramsNeuronCA1_JG/CleanVersion_CA1_JG_15Mar09/mechanism/x86_64/NMDAb.mod\n"); hoc_register_limits(_mechtype, _hoc_parm_limits); hoc_register_units(_mechtype, _hoc_parm_units); } static double *_t_mgblock; static int _reset; static char *modelname = "simple NMDA receptors"; static int error; static int _ninits = 0; static int _match_recurse=1; static _modl_cleanup(){ _match_recurse=1;} static int _ode_spec1(), _ode_matsol1(); extern int state_discon_flag_; static _check_mgblock(); static double _n_mgblock(); static int _slist1[2], _dlist1[2]; static int release(); /*CVODE*/ static int _ode_spec1 () {_reset=0; { DRon = ( synon * Rinf - Ron ) / Rtau ; DRoff = - Beta * Roff ; } return _reset; } static int _ode_matsol1() { DRon = DRon / (1. - dt*( ( ( ( - 1.0 ) ) ) / Rtau )) ; DRoff = DRoff / (1. - dt*( (- Beta)*(1.0) )) ; } /*END CVODE*/ static int release () {_reset=0; { Ron = Ron + (1. - exp(dt*(( ( ( - 1.0 ) ) ) / Rtau)))*(- ( ( ( (synon)*(Rinf) ) ) / Rtau ) / ( ( ( ( - 1.0) ) ) / Rtau ) - Ron) ; Roff = Roff + (1. - exp(dt*((- Beta)*(1.0))))*(- ( 0.0 ) / ( (- Beta)*(1.0) ) - Roff) ; } return 0; } static double _mfac_mgblock, _tmin_mgblock; static _check_mgblock() { static int _maktable=1; int _i, _j, _ix = 0; double _xi, _tmax; static double _sav_mg; if (!usetable) {return;} if (_sav_mg != mg) { _maktable = 1;} if (_maktable) { double _x, _dx; _maktable=0; _tmin_mgblock = - 140.0 ; _tmax = 80.0 ; _dx = (_tmax - _tmin_mgblock)/1000.; _mfac_mgblock = 1./_dx; for (_i=0, _x=_tmin_mgblock; _i < 1001; _x += _dx, _i++) { _t_mgblock[_i] = _f_mgblock(_x); } _sav_mg = mg; } } double mgblock(_lv) double _lv;{ _check_mgblock(); return _n_mgblock(_lv); } static double _n_mgblock(_lv) double _lv;{ int _i, _j; double _xi, _theta; if (!usetable) { return _f_mgblock(_lv); } _xi = _mfac_mgblock * (_lv - _tmin_mgblock); _i = (int) _xi; if (_xi <= 0.) { return _t_mgblock[0]; } if (_i >= 1000) { return _t_mgblock[1000]; } return _t_mgblock[_i] + (_xi - (double)_i)*(_t_mgblock[_i+1] - _t_mgblock[_i]); } double _f_mgblock ( _lv ) double _lv ; { double _lmgblock; _lmgblock = 1.0 / ( 1.0 + exp ( 0.062 * - _lv ) * ( mg / 3.57 ) ) ; return _lmgblock; } static double _hoc_mgblock(_vptr) void* _vptr; { double _r; _hoc_setdata(_vptr); _r = mgblock ( *getarg(1) ) ; return(_r); } static _net_receive (_pnt, _args, _lflag) Point_process* _pnt; double* _args; double _lflag; { _p = _pnt->_prop->param; _ppvar = _pnt->_prop->dparam; if (_tsav > t){ extern char* hoc_object_name(); hoc_execerror(hoc_object_name(_pnt->ob), ":Event arrived out of order. Must call ParallelContext.set_maxstep AFTER assigning minimum NetCon.delay");} _tsav = t; if (_lflag == 1. ) {*(_tqitem) = 0;} { if ( _lflag == 0.0 ) { _args[2] = _args[2] + 1.0 ; if ( ! _args[1] ) { _args[3] = _args[3] * exp ( - Beta * ( t - _args[4] ) ) ; _args[4] = t ; _args[1] = 1.0 ; synon = synon + _args[0] ; state_discontinuity ( _cvode_ieq + 0, & Ron , Ron + _args[3] ) ; state_discontinuity ( _cvode_ieq + 1, & Roff , Roff - _args[3] ) ; } net_send ( _tqitem, _args, _pnt, Cdur , _args[2] ) ; } if ( _lflag == _args[2] ) { _args[3] = _args[0] * Rinf + ( _args[3] - _args[0] * Rinf ) * exp ( - ( t - _args[4] ) / Rtau ) ; _args[4] = t ; synon = synon - _args[0] ; state_discontinuity ( _cvode_ieq + 0, & Ron , Ron - _args[3] ) ; state_discontinuity ( _cvode_ieq + 1, & Roff , Roff + _args[3] ) ; _args[1] = 0.0 ; } gmax = _args[0] ; } } static int _ode_count(_type) int _type;{ return 2;} static int _ode_spec(_nd, _pp, _ppd) Node* _nd; double* _pp; Datum* _ppd; { _p = _pp; _ppvar = _ppd; v = NODEV(_nd); _ode_spec1(); } static int _ode_map(_ieq, _pv, _pvdot, _pp, _ppd, _atol, _type) int _ieq, _type; double** _pv, **_pvdot, *_pp, *_atol; Datum* _ppd; { int _i; _p = _pp; _ppvar = _ppd; _cvode_ieq = _ieq; for (_i=0; _i < 2; ++_i) { _pv[_i] = _pp + _slist1[_i]; _pvdot[_i] = _pp + _dlist1[_i]; _cvode_abstol(_atollist, _atol, _i); } } static int _ode_matsol(_nd, _pp, _ppd) Node* _nd; double* _pp; Datum* _ppd; { _p = _pp; _ppvar = _ppd; v = NODEV(_nd); _ode_matsol1(); } static initmodel() { int _i; double _save;_ninits++; _save = t; t = 0.0; { Roff = Roff0; Ron = Ron0; { Rinf = Cmax * Alpha / ( Cmax * Alpha + Beta ) ; Rtau = 1.0 / ( Cmax * Alpha + Beta ) ; synon = 0.0 ; } _sav_indep = t; t = _save; } } static nrn_init(_ml, _type) _Memb_list* _ml; int _type;{ Node *_nd; double _v; int* _ni; int _iml, _cntml; #if CACHEVEC _ni = _ml->_nodeindices; #endif _cntml = _ml->_nodecount; for (_iml = 0; _iml < _cntml; ++_iml) { _p = _ml->_data[_iml]; _ppvar = _ml->_pdata[_iml]; _tsav = -1e20; #if CACHEVEC if (use_cachevec) { _v = VEC_V(_ni[_iml]); }else #endif { _nd = _ml->_nodelist[_iml]; _v = NODEV(_nd); } v = _v; initmodel(); }} static double _nrn_current(_v) double _v;{double _current=0.;v=_v;{ { B = mgblock ( v ) ; g = ( Ron + Roff ) * 1.0 * B ; iNMDA = g * ( v - e ) ; } _current += iNMDA; } return _current; } static nrn_cur(_ml, _type) _Memb_list* _ml; int _type;{ Node *_nd; int* _ni; double _rhs, _v; int _iml, _cntml; #if CACHEVEC _ni = _ml->_nodeindices; #endif _cntml = _ml->_nodecount; for (_iml = 0; _iml < _cntml; ++_iml) { _p = _ml->_data[_iml]; _ppvar = _ml->_pdata[_iml]; #if CACHEVEC if (use_cachevec) { _v = VEC_V(_ni[_iml]); }else #endif { _nd = _ml->_nodelist[_iml]; _v = NODEV(_nd); } _g = _nrn_current(_v + .001); { state_discon_flag_ = 1; _rhs = _nrn_current(_v); state_discon_flag_ = 0; } _g = (_g - _rhs)/.001; _g *= 1.e2/(_nd_area); _rhs *= 1.e2/(_nd_area); #if CACHEVEC if (use_cachevec) { VEC_RHS(_ni[_iml]) -= _rhs; }else #endif { NODERHS(_nd) -= _rhs; } }} static nrn_jacob(_ml, _type) _Memb_list* _ml; int _type;{ Node *_nd; int* _ni; int _iml, _cntml; #if CACHEVEC _ni = _ml->_nodeindices; #endif _cntml = _ml->_nodecount; for (_iml = 0; _iml < _cntml; ++_iml) { _p = _ml->_data[_iml]; #if CACHEVEC if (use_cachevec) { VEC_D(_ni[_iml]) += _g; }else #endif { _nd = _ml->_nodelist[_iml]; NODED(_nd) += _g; } }} static nrn_state(_ml, _type) _Memb_list* _ml; int _type;{ double _break, _save; Node *_nd; double _v; int* _ni; int _iml, _cntml; #if CACHEVEC _ni = _ml->_nodeindices; #endif _cntml = _ml->_nodecount; for (_iml = 0; _iml < _cntml; ++_iml) { _p = _ml->_data[_iml]; _ppvar = _ml->_pdata[_iml]; _nd = _ml->_nodelist[_iml]; #if CACHEVEC if (use_cachevec) { _v = VEC_V(_ni[_iml]); }else #endif { _nd = _ml->_nodelist[_iml]; _v = NODEV(_nd); } _break = t + .5*dt; _save = t; delta_t = dt; v=_v; { { { for (; t < _break; t += delta_t) { error = release(); if(error){fprintf(stderr,"at line 105 in file NMDAb.mod:\n SOLVE release METHOD cnexp\n"); nrn_complain(_p); abort_run(error);} }} t = _save; }}} } static terminal(){} static _initlists() { int _i; static int _first = 1; if (!_first) return; _slist1[0] = &(Ron) - _p; _dlist1[0] = &(DRon) - _p; _slist1[1] = &(Roff) - _p; _dlist1[1] = &(DRoff) - _p; _t_mgblock = makevector(1001*sizeof(double)); _first = 0; }