/* Created by Language version: 6.2.0 */ /* VECTORIZED */ #include #include #include #include "scoplib_ansi.h" #undef PI #define nil 0 #include "md1redef.h" #include "section.h" #include "nrniv_mf.h" #include "md2redef.h" #if METHOD3 extern int _method3; #endif #if !NRNGPU #undef exp #define exp hoc_Exp extern double hoc_Exp(double); #endif #define _threadargscomma_ _p, _ppvar, _thread, _nt, #define _threadargs_ _p, _ppvar, _thread, _nt #define _threadargsprotocomma_ double* _p, Datum* _ppvar, Datum* _thread, _NrnThread* _nt, #define _threadargsproto_ double* _p, Datum* _ppvar, Datum* _thread, _NrnThread* _nt /*SUPPRESS 761*/ /*SUPPRESS 762*/ /*SUPPRESS 763*/ /*SUPPRESS 765*/ extern double *getarg(); /* Thread safe. No static _p or _ppvar. */ #define t _nt->_t #define dt _nt->_dt #define rs _p[0] #define toff _p[1] #define amp _p[2] #define i _p[3] #define vc _p[4] #define on _p[5] #define v _p[6] #define _g _p[7] #define _nd_area *_ppvar[0]._pval #if MAC #if !defined(v) #define v _mlhv #endif #if !defined(h) #define h _mlhh #endif #endif #if defined(__cplusplus) extern "C" { #endif static int hoc_nrnpointerindex = -1; static Datum* _extcall_thread; static Prop* _extcall_prop; /* external NEURON variables */ /* declaration of user functions */ static double _hoc_icur(); static double _hoc_vstim(); static int _mechtype; extern void _nrn_cacheloop_reg(int, int); extern void hoc_register_prop_size(int, int, int); extern void hoc_register_limits(int, HocParmLimits*); extern void hoc_register_units(int, HocParmUnits*); extern void nrn_promote(Prop*, int, int); extern Memb_func* memb_func; 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)); } extern void _nrn_setdata_reg(int, void(*)(Prop*)); static void _setdata(Prop* _prop) { _extcall_prop = _prop; } static void _hoc_setdata(void* _vptr) { Prop* _prop; _prop = ((Point_process*)_vptr)->_prop; _setdata(_prop); } /* connect user functions to hoc names */ static VoidFunc hoc_intfunc[] = { 0,0 }; static Member_func _member_func[] = { "loc", _hoc_loc_pnt, "has_loc", _hoc_has_loc, "get_loc", _hoc_get_loc_pnt, "icur", _hoc_icur, "vstim", _hoc_vstim, 0, 0 }; /* declare global and static user variables */ /* some parameters have upper and lower limits */ static HocParmLimits _hoc_parm_limits[] = { "rs", 1e-09, 1e+09, 0,0,0 }; static HocParmUnits _hoc_parm_units[] = { "rs", "megohm", "toff", "ms", "amp", "mV", "i", "nA", "vc", "mV", 0,0 }; static double delta_t = 0.01; /* connect global user variables to hoc */ static DoubScal hoc_scdoub[] = { 0,0 }; static DoubVec hoc_vdoub[] = { 0,0,0 }; static double _sav_indep; static void nrn_alloc(Prop*); static void nrn_init(_NrnThread*, _Memb_list*, int); static void nrn_state(_NrnThread*, _Memb_list*, int); static void nrn_cur(_NrnThread*, _Memb_list*, int); static void nrn_jacob(_NrnThread*, _Memb_list*, int); static void _hoc_destroy_pnt(_vptr) void* _vptr; { destroy_point_process(_vptr); } /* connect range variables in _p that hoc is supposed to know about */ static const char *_mechanism[] = { "6.2.0", "Vsource", "rs", "toff", "amp", 0, "i", "vc", 0, 0, 0}; extern Prop* need_memb(Symbol*); static void nrn_alloc(Prop* _prop) { Prop *prop_ion; double *_p; Datum *_ppvar; if (nrn_point_prop_) { _prop->_alloc_seq = nrn_point_prop_->_alloc_seq; _p = nrn_point_prop_->param; _ppvar = nrn_point_prop_->dparam; }else{ _p = nrn_prop_data_alloc(_mechtype, 8, _prop); /*initialize range parameters*/ rs = 1; toff = 0; amp = 0; } _prop->param = _p; _prop->param_size = 8; if (!nrn_point_prop_) { _ppvar = nrn_prop_datum_alloc(_mechtype, 2, _prop); } _prop->dparam = _ppvar; /*connect ionic variables to this model*/ } static void _initlists(); extern Symbol* hoc_lookup(const char*); extern void _nrn_thread_reg(int, int, void(*f)(Datum*)); extern void _nrn_thread_table_reg(int, void(*)(double*, Datum*, Datum*, _NrnThread*, int)); extern void hoc_register_tolerance(int, HocStateTolerance*, Symbol***); extern void _cvode_abstol( Symbol**, double*, int); void _vsource_reg() { int _vectorized = 1; _initlists(); _pointtype = point_register_mech(_mechanism, nrn_alloc,nrn_cur, nrn_jacob, nrn_state, nrn_init, hoc_nrnpointerindex, 1, _hoc_create_pnt, _hoc_destroy_pnt, _member_func); _mechtype = nrn_get_mechtype(_mechanism[1]); _nrn_setdata_reg(_mechtype, _setdata); hoc_register_dparam_size(_mechtype, 2); hoc_register_var(hoc_scdoub, hoc_vdoub, hoc_intfunc); ivoc_help("help ?1 Vsource /Users/cweaver/research/Neuron/Coskren/MorphologyPaperTwo/Scripts/NeuronMechanisms/x86_64/vsource.mod\n"); hoc_register_limits(_mechtype, _hoc_parm_limits); hoc_register_units(_mechtype, _hoc_parm_units); } static int _reset; static char *modelname = "vsource.mod"; static int error; static int _ninits = 0; static int _match_recurse=1; static void _modl_cleanup(){ _match_recurse=1;} static int icur(_threadargsproto_); static int vstim(_threadargsproto_); static int icur ( _threadargsproto_ ) { if ( on ) { i = ( vc - v ) / rs ; } else { i = 0.0 ; } return 0; } static double _hoc_icur(void* _vptr) { double _r; double* _p; Datum* _ppvar; Datum* _thread; _NrnThread* _nt; _p = ((Point_process*)_vptr)->_prop->param; _ppvar = ((Point_process*)_vptr)->_prop->dparam; _thread = _extcall_thread; _nt = (_NrnThread*)((Point_process*)_vptr)->_vnt; _r = 1.; icur ( _p, _ppvar, _thread, _nt ); return(_r); } static int vstim ( _threadargsproto_ ) { on = 1.0 ; if ( toff ) { at_time ( _nt, toff ) ; } if ( t < toff ) { vc = amp ; } else { vc = 0.0 ; on = 0.0 ; } icur ( _threadargs_ ) ; return 0; } static double _hoc_vstim(void* _vptr) { double _r; double* _p; Datum* _ppvar; Datum* _thread; _NrnThread* _nt; _p = ((Point_process*)_vptr)->_prop->param; _ppvar = ((Point_process*)_vptr)->_prop->dparam; _thread = _extcall_thread; _nt = (_NrnThread*)((Point_process*)_vptr)->_vnt; _r = 1.; vstim ( _p, _ppvar, _thread, _nt ); return(_r); } static void initmodel(double* _p, Datum* _ppvar, Datum* _thread, _NrnThread* _nt) { int _i; double _save;{ { on = 1.0 ; } } } static void nrn_init(_NrnThread* _nt, _Memb_list* _ml, int _type){ double* _p; Datum* _ppvar; Datum* _thread; Node *_nd; double _v; int* _ni; int _iml, _cntml; #if CACHEVEC _ni = _ml->_nodeindices; #endif _cntml = _ml->_nodecount; _thread = _ml->_thread; for (_iml = 0; _iml < _cntml; ++_iml) { _p = _ml->_data[_iml]; _ppvar = _ml->_pdata[_iml]; #if EXTRACELLULAR _nd = _ml->_nodelist[_iml]; if (_nd->_extnode) { _v = NODEV(_nd) +_nd->_extnode->_v[0]; }else #endif { #if CACHEVEC if (use_cachevec) { _v = VEC_V(_ni[_iml]); }else #endif { _nd = _ml->_nodelist[_iml]; _v = NODEV(_nd); } } v = _v; initmodel(_p, _ppvar, _thread, _nt); }} static double _nrn_current(double* _p, Datum* _ppvar, Datum* _thread, _NrnThread* _nt, double _v){double _current=0.;v=_v;{ { vstim ( _threadargs_ ) ; } _current += i; } return _current; } static void nrn_cur(_NrnThread* _nt, _Memb_list* _ml, int _type) { double* _p; Datum* _ppvar; Datum* _thread; Node *_nd; int* _ni; double _rhs, _v; int _iml, _cntml; #if CACHEVEC _ni = _ml->_nodeindices; #endif _cntml = _ml->_nodecount; _thread = _ml->_thread; for (_iml = 0; _iml < _cntml; ++_iml) { _p = _ml->_data[_iml]; _ppvar = _ml->_pdata[_iml]; #if EXTRACELLULAR _nd = _ml->_nodelist[_iml]; if (_nd->_extnode) { _v = NODEV(_nd) +_nd->_extnode->_v[0]; }else #endif { #if CACHEVEC if (use_cachevec) { _v = VEC_V(_ni[_iml]); }else #endif { _nd = _ml->_nodelist[_iml]; _v = NODEV(_nd); } } _g = _nrn_current(_p, _ppvar, _thread, _nt, _v + .001); { _rhs = _nrn_current(_p, _ppvar, _thread, _nt, _v); } _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; } #if EXTRACELLULAR if (_nd->_extnode) { *_nd->_extnode->_rhs[0] += _rhs; } #endif }} static void nrn_jacob(_NrnThread* _nt, _Memb_list* _ml, int _type) { double* _p; Datum* _ppvar; Datum* _thread; Node *_nd; int* _ni; int _iml, _cntml; #if CACHEVEC _ni = _ml->_nodeindices; #endif _cntml = _ml->_nodecount; _thread = _ml->_thread; for (_iml = 0; _iml < _cntml; ++_iml) { _p = _ml->_data[_iml]; _nd = _ml->_nodelist[_iml]; #if CACHEVEC if (use_cachevec) { VEC_D(_ni[_iml]) -= _g; }else #endif { NODED(_nd) -= _g; } #if EXTRACELLULAR if (_nd->_extnode) { *_nd->_extnode->_d[0] += _g; } #endif }} static void nrn_state(_NrnThread* _nt, _Memb_list* _ml, int _type) { double _break, _save; double* _p; Datum* _ppvar; Datum* _thread; Node *_nd; double _v; int* _ni; int _iml, _cntml; #if CACHEVEC _ni = _ml->_nodeindices; #endif _cntml = _ml->_nodecount; _thread = _ml->_thread; for (_iml = 0; _iml < _cntml; ++_iml) { _p = _ml->_data[_iml]; _ppvar = _ml->_pdata[_iml]; _nd = _ml->_nodelist[_iml]; #if EXTRACELLULAR _nd = _ml->_nodelist[_iml]; if (_nd->_extnode) { _v = NODEV(_nd) +_nd->_extnode->_v[0]; }else #endif { #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; v=_v; { { { for (; t < _break; t += dt) { { icur(_p, _ppvar, _thread, _nt); } }} t = _save; }}} } static void terminal(){} static void _initlists(){ double _x; double* _p = &_x; int _i; static int _first = 1; if (!_first) return; _first = 0; } #if defined(__cplusplus) } /* extern "C" */ #endif