From 502b1ed402246d4c76a768a765e269d05b8a980d Mon Sep 17 00:00:00 2001 From: katduecker Date: Tue, 9 Jul 2024 09:41:10 -0400 Subject: [PATCH 01/28] tonic bias options --- hnn_core/cell.py | 5 +++-- hnn_core/network.py | 20 ++++++++++++-------- hnn_core/network_builder.py | 8 ++++---- 3 files changed, 19 insertions(+), 14 deletions(-) diff --git a/hnn_core/cell.py b/hnn_core/cell.py index 7e533f087..c71be72f5 100644 --- a/hnn_core/cell.py +++ b/hnn_core/cell.py @@ -728,7 +728,7 @@ def _insert_dipole(self, sec_name_apical): dpp.ztan = seg_lens_z[-1] self.dipole = h.Vector().record(self.dpl_ref) - def create_tonic_bias(self, amplitude, t0, tstop, loc=0.5): + def create_tonic_bias(self, amplitude, t0, tstop, sect_name='soma',loc=0.5): """Create tonic bias at the soma. Parameters @@ -742,7 +742,8 @@ def create_tonic_bias(self, amplitude, t0, tstop, loc=0.5): loc : float (0 to 1) The location of the input in the soma section. """ - stim = h.IClamp(self._nrn_sections['soma'](loc)) + + stim = h.IClamp(self._nrn_sections[sect_name](loc)) stim.delay = t0 stim.dur = tstop - t0 stim.amp = amplitude diff --git a/hnn_core/network.py b/hnn_core/network.py index c00de12b0..988048368 100644 --- a/hnn_core/network.py +++ b/hnn_core/network.py @@ -1133,7 +1133,8 @@ def _instantiate_drives(self, tstop, n_trials=1): self.external_drives[ drive['name']]['events'].append(event_times) - def add_tonic_bias(self, *, cell_type=None, amplitude, t0=0, tstop=None): + def add_tonic_bias(self, *, cell_type=None, sect_name='soma', bias_name='tonic', + amplitude, t0=0, tstop=None): """Attaches parameters of tonic bias input for given cell types Parameters @@ -1169,6 +1170,7 @@ def add_tonic_bias(self, *, cell_type=None, amplitude, t0=0, tstop=None): _validate_type(amplitude, (float, int), 'amplitude') _add_cell_type_bias(network=self, cell_type=cell_type, + sect_name=sect_name, bias_name=bias_name, amplitude=float(amplitude), t_0=t0, t_stop=tstop) else: @@ -1180,6 +1182,7 @@ def add_tonic_bias(self, *, cell_type=None, amplitude, t0=0, tstop=None): for _cell_type, _amplitude in amplitude.items(): _add_cell_type_bias(network=self, cell_type=_cell_type, + sect_name=sect_name,bias_name=bias_name, amplitude=_amplitude, t_0=t0, t_stop=tstop) @@ -1648,7 +1651,7 @@ def __repr__(self): def _add_cell_type_bias(network: Network, amplitude: Union[float, dict], - cell_type=None, + cell_type=None, sect_name='soma', bias_name='tonic', t_0=0, t_stop=None): if network is None: @@ -1665,15 +1668,16 @@ def _add_cell_type_bias(network: Network, amplitude: Union[float, dict], f'{list(network.cell_types.keys())}. ' f'Got {cell_type}') - if 'tonic' not in network.external_biases: - network.external_biases['tonic'] = dict() + if bias_name not in network.external_biases: + network.external_biases[bias_name] = dict() - if cell_type in network.external_biases['tonic']: - raise ValueError(f'Tonic bias already defined for {cell_type}') + if cell_type in network.external_biases[bias_name]: + raise ValueError(f'Bias named {bias_name} already defined for {cell_type}') cell_type_bias = { 'amplitude': amplitude, 't0': t_0, - 'tstop': t_stop + 'tstop': t_stop, + 'sect_name': sect_name } - network.external_biases['tonic'][cell_type] = cell_type_bias + network.external_biases[bias_name][cell_type] = cell_type_bias diff --git a/hnn_core/network_builder.py b/hnn_core/network_builder.py index 230f20e06..6995e0714 100644 --- a/hnn_core/network_builder.py +++ b/hnn_core/network_builder.py @@ -441,10 +441,10 @@ def _create_cells_and_drives(self, threshold, record_vsec=False, else: cell.build() # add tonic biases - if ('tonic' in self.net.external_biases and - src_type in self.net.external_biases['tonic']): - cell.create_tonic_bias(**self.net.external_biases - ['tonic'][src_type]) + for bias in self.net.external_biases: + if src_type in self.net.external_biases[bias]: + cell.create_tonic_bias(**self.net.external_biases + [bias][src_type]) cell.record(record_vsec, record_isec, record_ca) # this call could belong in init of a _Cell (with threshold)? From 1f5c435ca9cd84d36d20c3103140e0091c2219fb Mon Sep 17 00:00:00 2001 From: katduecker Date: Tue, 17 Sep 2024 18:31:23 -0400 Subject: [PATCH 02/28] update defaults --- hnn_core/cells_default.py | 3 +- hnn_core/extracellular.py | 2 +- hnn_core/mod/arm64/.libs/libnrnmech.so | Bin 0 -> 115696 bytes hnn_core/mod/arm64/ar.c | 582 ++++++++++++++++ hnn_core/mod/arm64/ar.o | Bin 0 -> 9760 bytes hnn_core/mod/arm64/ca.c | 786 ++++++++++++++++++++++ hnn_core/mod/arm64/ca.o | Bin 0 -> 17312 bytes hnn_core/mod/arm64/cad.c | 577 ++++++++++++++++ hnn_core/mod/arm64/cad.o | Bin 0 -> 10640 bytes hnn_core/mod/arm64/cat.c | 628 ++++++++++++++++++ hnn_core/mod/arm64/cat.o | Bin 0 -> 11088 bytes hnn_core/mod/arm64/dipole.c | 339 ++++++++++ hnn_core/mod/arm64/dipole.o | Bin 0 -> 5864 bytes hnn_core/mod/arm64/dipole_pp.c | 398 +++++++++++ hnn_core/mod/arm64/dipole_pp.o | Bin 0 -> 7296 bytes hnn_core/mod/arm64/hh2.c | 883 +++++++++++++++++++++++++ hnn_core/mod/arm64/hh2.o | Bin 0 -> 18496 bytes hnn_core/mod/arm64/kca.c | 629 ++++++++++++++++++ hnn_core/mod/arm64/kca.o | Bin 0 -> 13328 bytes hnn_core/mod/arm64/km.c | 728 ++++++++++++++++++++ hnn_core/mod/arm64/km.o | Bin 0 -> 15824 bytes hnn_core/mod/arm64/libnrnmech.dylib | Bin 0 -> 115696 bytes hnn_core/mod/arm64/makemod2c_inc | 80 +++ hnn_core/mod/arm64/mod_func.cpp | 49 ++ hnn_core/mod/arm64/mod_func.o | Bin 0 -> 2320 bytes hnn_core/mod/arm64/special | 103 +++ hnn_core/mod/arm64/special.nrn | 103 +++ hnn_core/mod/arm64/vecevent.c | 421 ++++++++++++ hnn_core/mod/arm64/vecevent.o | Bin 0 -> 7952 bytes 29 files changed, 6309 insertions(+), 2 deletions(-) create mode 100755 hnn_core/mod/arm64/.libs/libnrnmech.so create mode 100644 hnn_core/mod/arm64/ar.c create mode 100644 hnn_core/mod/arm64/ar.o create mode 100644 hnn_core/mod/arm64/ca.c create mode 100644 hnn_core/mod/arm64/ca.o create mode 100644 hnn_core/mod/arm64/cad.c create mode 100644 hnn_core/mod/arm64/cad.o create mode 100644 hnn_core/mod/arm64/cat.c create mode 100644 hnn_core/mod/arm64/cat.o create mode 100644 hnn_core/mod/arm64/dipole.c create mode 100644 hnn_core/mod/arm64/dipole.o create mode 100644 hnn_core/mod/arm64/dipole_pp.c create mode 100644 hnn_core/mod/arm64/dipole_pp.o create mode 100644 hnn_core/mod/arm64/hh2.c create mode 100644 hnn_core/mod/arm64/hh2.o create mode 100644 hnn_core/mod/arm64/kca.c create mode 100644 hnn_core/mod/arm64/kca.o create mode 100644 hnn_core/mod/arm64/km.c create mode 100644 hnn_core/mod/arm64/km.o create mode 100755 hnn_core/mod/arm64/libnrnmech.dylib create mode 100644 hnn_core/mod/arm64/makemod2c_inc create mode 100644 hnn_core/mod/arm64/mod_func.cpp create mode 100644 hnn_core/mod/arm64/mod_func.o create mode 100755 hnn_core/mod/arm64/special create mode 100755 hnn_core/mod/arm64/special.nrn create mode 100644 hnn_core/mod/arm64/vecevent.c create mode 100644 hnn_core/mod/arm64/vecevent.o diff --git a/hnn_core/cells_default.py b/hnn_core/cells_default.py index 86f931162..62177e9dd 100644 --- a/hnn_core/cells_default.py +++ b/hnn_core/cells_default.py @@ -418,7 +418,7 @@ def pyramidal_ca(cell_name, pos, override_params=None, gid=None): override_params['L5Pyr_soma_gnabar_hh2'] = 0.32 gbar_ca = partial( - _linear_g_at_dist, gsoma=10., gdend=40., xkink=1501) + _linear_g_at_dist, gsoma=10., gdend=40., xkink=1501) # Sarah's values: gsoma=10, gdend = 40 gbar_na = partial( _linear_g_at_dist, gsoma=override_params['L5Pyr_soma_gnabar_hh2'], gdend=28e-4, xkink=962) @@ -429,6 +429,7 @@ def pyramidal_ca(cell_name, pos, override_params=None, gid=None): override_params['L5Pyr_dend_gbar_ca'] = gbar_ca override_params['L5Pyr_dend_gnabar_hh2'] = gbar_na override_params['L5Pyr_dend_gkbar_hh2'] = gbar_k + override_params['L5Pyr_soma_gbar_ca'] = 10. cell = pyramidal(cell_name, pos, override_params=override_params, gid=gid) diff --git a/hnn_core/extracellular.py b/hnn_core/extracellular.py index d76355df1..b4917b0e4 100644 --- a/hnn_core/extracellular.py +++ b/hnn_core/extracellular.py @@ -272,7 +272,7 @@ class ExtracellularArray: measured values of conductivity in rat cortex (note units there are mS/cm) """ - def __init__(self, positions, *, conductivity=0.3, method='psa', + def __init__(self, positions, *, conductivity=0.3, method='lsa', min_distance=0.5, times=None, voltages=None): _validate_type(positions, (tuple, list), 'positions') diff --git a/hnn_core/mod/arm64/.libs/libnrnmech.so b/hnn_core/mod/arm64/.libs/libnrnmech.so new file mode 100755 index 0000000000000000000000000000000000000000..5f62907728cdcc3ad109b31a42d12bd162e4fb56 GIT binary patch literal 115696 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 Szbo$?G5&AYteVQc0{0&h_u(x7 literal 0 HcmV?d00001 diff --git a/hnn_core/mod/arm64/ar.c b/hnn_core/mod/arm64/ar.c new file mode 100644 index 000000000..b573a859e --- /dev/null +++ b/hnn_core/mod/arm64/ar.c @@ -0,0 +1,582 @@ +/* Created by Language version: 7.7.0 */ +/* VECTORIZED */ +#define NRN_VECTORIZED 1 +#include +#include +#include +#include "mech_api.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 nrn_init _nrn_init__ar +#define _nrn_initial _nrn_initial__ar +#define nrn_cur _nrn_cur__ar +#define _nrn_current _nrn_current__ar +#define nrn_jacob _nrn_jacob__ar +#define nrn_state _nrn_state__ar +#define _net_receive _net_receive__ar +#define _f_settables _f_settables__ar +#define settables settables__ar +#define states states__ar + +#define _threadargscomma_ _p, _ppvar, _thread, _nt, +#define _threadargsprotocomma_ double* _p, Datum* _ppvar, Datum* _thread, NrnThread* _nt, +#define _threadargs_ _p, _ppvar, _thread, _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 gbar _p[0] +#define gbar_columnindex 0 +#define i _p[1] +#define i_columnindex 1 +#define m _p[2] +#define m_columnindex 2 +#define minf _p[3] +#define minf_columnindex 3 +#define mtau _p[4] +#define mtau_columnindex 4 +#define Dm _p[5] +#define Dm_columnindex 5 +#define v _p[6] +#define v_columnindex 6 +#define _g _p[7] +#define _g_columnindex 7 + +#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 void _hoc_settables(void); + 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; + +#define NMODL_TEXT 1 +#if NMODL_TEXT +static const char* nmodl_file_text; +static const char* nmodl_filename; +extern void hoc_reg_nmodl_text(int, const char*); +extern void hoc_reg_nmodl_filename(int, const char*); +#endif + + extern void _nrn_setdata_reg(int, void(*)(Prop*)); + static void _setdata(Prop* _prop) { + _extcall_prop = _prop; + } + static void _hoc_setdata() { + Prop *_prop, *hoc_getdata_range(int); + _prop = hoc_getdata_range(_mechtype); + _setdata(_prop); + hoc_retpushx(1.); +} + /* connect user functions to hoc names */ + static VoidFunc hoc_intfunc[] = { + "setdata_ar", _hoc_setdata, + "settables_ar", _hoc_settables, + 0, 0 +}; + +static void _check_settables(double*, Datum*, Datum*, NrnThread*); +static void _check_table_thread(double* _p, Datum* _ppvar, Datum* _thread, NrnThread* _nt, int _type) { + _check_settables(_p, _ppvar, _thread, _nt); + } + /* declare global and static user variables */ +#define erev erev_ar + double erev = -35; +#define usetable usetable_ar + double usetable = 1; + /* some parameters have upper and lower limits */ + static HocParmLimits _hoc_parm_limits[] = { + "usetable_ar", 0, 1, + 0,0,0 +}; + static HocParmUnits _hoc_parm_units[] = { + "erev_ar", "mV", + "gbar_ar", "mho/cm2", + "i_ar", "mA/cm2", + 0,0 +}; + static double delta_t = 1; + static double m0 = 0; + /* connect global user variables to hoc */ + static DoubScal hoc_scdoub[] = { + "erev_ar", &erev_ar, + "usetable_ar", &usetable_ar, + 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 int _ode_count(int); +static void _ode_map(int, double**, double**, double*, Datum*, double*, int); +static void _ode_spec(NrnThread*, _Memb_list*, int); +static void _ode_matsol(NrnThread*, _Memb_list*, int); + +#define _cvode_ieq _ppvar[0]._i + static void _ode_matsol_instance1(_threadargsproto_); + /* connect range variables in _p that hoc is supposed to know about */ + static const char *_mechanism[] = { + "7.7.0", +"ar", + "gbar_ar", + 0, + "i_ar", + 0, + "m_ar", + 0, + 0}; + +extern Prop* need_memb(Symbol*); + +static void nrn_alloc(Prop* _prop) { + Prop *prop_ion; + double *_p; Datum *_ppvar; + _p = nrn_prop_data_alloc(_mechtype, 8, _prop); + /*initialize range parameters*/ + gbar = 0; + _prop->param = _p; + _prop->param_size = 8; + _ppvar = nrn_prop_datum_alloc(_mechtype, 1, _prop); + _prop->dparam = _ppvar; + /*connect ionic variables to this model*/ + +} + static void _initlists(); + /* some states have an absolute tolerance */ + static Symbol** _atollist; + static HocStateTolerance _hoc_state_tol[] = { + 0,0 +}; + extern Symbol* hoc_lookup(const char*); +extern void _nrn_thread_reg(int, int, void(*)(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 _ar_reg() { + int _vectorized = 1; + _initlists(); + register_mech(_mechanism, nrn_alloc,nrn_cur, nrn_jacob, nrn_state, nrn_init, hoc_nrnpointerindex, 1); + _mechtype = nrn_get_mechtype(_mechanism[1]); + _nrn_setdata_reg(_mechtype, _setdata); + _nrn_thread_table_reg(_mechtype, _check_table_thread); + #if NMODL_TEXT + hoc_reg_nmodl_text(_mechtype, nmodl_file_text); + hoc_reg_nmodl_filename(_mechtype, nmodl_filename); +#endif + hoc_register_prop_size(_mechtype, 8, 1); + hoc_register_dparam_semantics(_mechtype, 0, "cvodeieq"); + hoc_register_cvode(_mechtype, _ode_count, _ode_map, _ode_spec, _ode_matsol); + hoc_register_tolerance(_mechtype, _hoc_state_tol, &_atollist); + hoc_register_var(hoc_scdoub, hoc_vdoub, hoc_intfunc); + ivoc_help("help ?1 ar /Users/katharinaduecker/Documents/Projects Brown/hnn-core/hnn_core/mod/ar.mod\n"); + hoc_register_limits(_mechtype, _hoc_parm_limits); + hoc_register_units(_mechtype, _hoc_parm_units); + } + static double *_t_minf; + static double *_t_mtau; +static int _reset; +static char *modelname = "Anomalous rectifier current for RD Traub, J Neurophysiol 89:909-921, 2003"; + +static int error; +static int _ninits = 0; +static int _match_recurse=1; +static void _modl_cleanup(){ _match_recurse=1;} +static int _f_settables(_threadargsprotocomma_ double); +static int settables(_threadargsprotocomma_ double); + +static int _ode_spec1(_threadargsproto_); +/*static int _ode_matsol1(_threadargsproto_);*/ + static void _n_settables(_threadargsprotocomma_ double _lv); + static int _slist1[1], _dlist1[1]; + static int states(_threadargsproto_); + +/*CVODE*/ + static int _ode_spec1 (double* _p, Datum* _ppvar, Datum* _thread, NrnThread* _nt) {int _reset = 0; { + settables ( _threadargscomma_ v ) ; + Dm = ( minf - m ) / mtau ; + } + return _reset; +} + static int _ode_matsol1 (double* _p, Datum* _ppvar, Datum* _thread, NrnThread* _nt) { + settables ( _threadargscomma_ v ) ; + Dm = Dm / (1. - dt*( ( ( ( - 1.0 ) ) ) / mtau )) ; + return 0; +} + /*END CVODE*/ + static int states (double* _p, Datum* _ppvar, Datum* _thread, NrnThread* _nt) { { + settables ( _threadargscomma_ v ) ; + m = m + (1. - exp(dt*(( ( ( - 1.0 ) ) ) / mtau)))*(- ( ( ( minf ) ) / mtau ) / ( ( ( ( - 1.0 ) ) ) / mtau ) - m) ; + } + return 0; +} + static double _mfac_settables, _tmin_settables; + static void _check_settables(double* _p, Datum* _ppvar, Datum* _thread, NrnThread* _nt) { + static int _maktable=1; int _i, _j, _ix = 0; + double _xi, _tmax; + if (!usetable) {return;} + if (_maktable) { double _x, _dx; _maktable=0; + _tmin_settables = - 120.0 ; + _tmax = 40.0 ; + _dx = (_tmax - _tmin_settables)/641.; _mfac_settables = 1./_dx; + for (_i=0, _x=_tmin_settables; _i < 642; _x += _dx, _i++) { + _f_settables(_p, _ppvar, _thread, _nt, _x); + _t_minf[_i] = minf; + _t_mtau[_i] = mtau; + } + } + } + + static int settables(double* _p, Datum* _ppvar, Datum* _thread, NrnThread* _nt, double _lv) { +#if 0 +_check_settables(_p, _ppvar, _thread, _nt); +#endif + _n_settables(_p, _ppvar, _thread, _nt, _lv); + return 0; + } + + static void _n_settables(double* _p, Datum* _ppvar, Datum* _thread, NrnThread* _nt, double _lv){ int _i, _j; + double _xi, _theta; + if (!usetable) { + _f_settables(_p, _ppvar, _thread, _nt, _lv); return; +} + _xi = _mfac_settables * (_lv - _tmin_settables); + if (isnan(_xi)) { + minf = _xi; + mtau = _xi; + return; + } + if (_xi <= 0.) { + minf = _t_minf[0]; + mtau = _t_mtau[0]; + return; } + if (_xi >= 641.) { + minf = _t_minf[641]; + mtau = _t_mtau[641]; + return; } + _i = (int) _xi; + _theta = _xi - (double)_i; + minf = _t_minf[_i] + _theta*(_t_minf[_i+1] - _t_minf[_i]); + mtau = _t_mtau[_i] + _theta*(_t_mtau[_i+1] - _t_mtau[_i]); + } + + +static int _f_settables ( _threadargsprotocomma_ double _lv ) { + minf = 1.0 / ( 1.0 + exp ( ( _lv + 75.0 ) / 5.5 ) ) ; + mtau = 1.0 / ( exp ( - 14.6 - 0.086 * _lv ) + exp ( - 1.87 + 0.07 * _lv ) ) ; + return 0; } + +static void _hoc_settables(void) { + double _r; + double* _p; Datum* _ppvar; Datum* _thread; NrnThread* _nt; + if (_extcall_prop) {_p = _extcall_prop->param; _ppvar = _extcall_prop->dparam;}else{ _p = (double*)0; _ppvar = (Datum*)0; } + _thread = _extcall_thread; + _nt = nrn_threads; + +#if 1 + _check_settables(_p, _ppvar, _thread, _nt); +#endif + _r = 1.; + settables ( _p, _ppvar, _thread, _nt, *getarg(1) ); + hoc_retpushx(_r); +} + +static int _ode_count(int _type){ return 1;} + +static void _ode_spec(NrnThread* _nt, _Memb_list* _ml, int _type) { + double* _p; Datum* _ppvar; Datum* _thread; + Node* _nd; double _v; int _iml, _cntml; + _cntml = _ml->_nodecount; + _thread = _ml->_thread; + for (_iml = 0; _iml < _cntml; ++_iml) { + _p = _ml->_data[_iml]; _ppvar = _ml->_pdata[_iml]; + _nd = _ml->_nodelist[_iml]; + v = NODEV(_nd); + _ode_spec1 (_p, _ppvar, _thread, _nt); + }} + +static void _ode_map(int _ieq, double** _pv, double** _pvdot, double* _pp, Datum* _ppd, double* _atol, int _type) { + double* _p; Datum* _ppvar; + int _i; _p = _pp; _ppvar = _ppd; + _cvode_ieq = _ieq; + for (_i=0; _i < 1; ++_i) { + _pv[_i] = _pp + _slist1[_i]; _pvdot[_i] = _pp + _dlist1[_i]; + _cvode_abstol(_atollist, _atol, _i); + } + } + +static void _ode_matsol_instance1(_threadargsproto_) { + _ode_matsol1 (_p, _ppvar, _thread, _nt); + } + +static void _ode_matsol(NrnThread* _nt, _Memb_list* _ml, int _type) { + double* _p; Datum* _ppvar; Datum* _thread; + Node* _nd; double _v; int _iml, _cntml; + _cntml = _ml->_nodecount; + _thread = _ml->_thread; + for (_iml = 0; _iml < _cntml; ++_iml) { + _p = _ml->_data[_iml]; _ppvar = _ml->_pdata[_iml]; + _nd = _ml->_nodelist[_iml]; + v = NODEV(_nd); + _ode_matsol_instance1(_threadargs_); + }} + +static void initmodel(double* _p, Datum* _ppvar, Datum* _thread, NrnThread* _nt) { + int _i; double _save;{ + m = m0; + { + settables ( _threadargscomma_ v ) ; + m = minf ; + m = 0.25 ; + } + +} +} + +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 0 + _check_settables(_p, _ppvar, _thread, _nt); +#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;{ { + i = gbar * m * ( v - erev ) ; + } + _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 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; +#if CACHEVEC + if (use_cachevec) { + VEC_RHS(_ni[_iml]) -= _rhs; + }else +#endif + { + NODERHS(_nd) -= _rhs; + } + +} + +} + +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]; +#if CACHEVEC + if (use_cachevec) { + VEC_D(_ni[_iml]) += _g; + }else +#endif + { + _nd = _ml->_nodelist[_iml]; + NODED(_nd) += _g; + } + +} + +} + +static void nrn_state(NrnThread* _nt, _Memb_list* _ml, int _type) { +double* _p; Datum* _ppvar; Datum* _thread; +Node *_nd; double _v = 0.0; 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 CACHEVEC + if (use_cachevec) { + _v = VEC_V(_ni[_iml]); + }else +#endif + { + _nd = _ml->_nodelist[_iml]; + _v = NODEV(_nd); + } + v=_v; +{ + { states(_p, _ppvar, _thread, _nt); + }}} + +} + +static void terminal(){} + +static void _initlists(){ + double _x; double* _p = &_x; + int _i; static int _first = 1; + if (!_first) return; + _slist1[0] = m_columnindex; _dlist1[0] = Dm_columnindex; + _t_minf = makevector(642*sizeof(double)); + _t_mtau = makevector(642*sizeof(double)); +_first = 0; +} + +#if defined(__cplusplus) +} /* extern "C" */ +#endif + +#if NMODL_TEXT +static const char* nmodl_filename = "/Users/katharinaduecker/Documents/Projects Brown/hnn-core/hnn_core/mod/ar.mod"; +static const char* nmodl_file_text = + "TITLE Anomalous rectifier current for RD Traub, J Neurophysiol 89:909-921, 2003\n" + "\n" + "COMMENT\n" + " Implemented by Maciej Lazarewicz 2003 (mlazarew@seas.upenn.edu)\n" + "ENDCOMMENT\n" + "\n" + "INDEPENDENT { t FROM 0 TO 1 WITH 1 (ms) }\n" + "\n" + "UNITS {\n" + " (mV) = (millivolt)\n" + " (mA) = (milliamp)\n" + "}\n" + "\n" + "NEURON {\n" + " SUFFIX ar\n" + " NONSPECIFIC_CURRENT i\n" + " RANGE gbar, i\n" + "}\n" + "\n" + "PARAMETER {\n" + " gbar = 0.0 (mho/cm2)\n" + " v (mV)\n" + " erev = -35 (mV)\n" + "}\n" + "\n" + "ASSIGNED {\n" + " i (mA/cm2)\n" + " minf (1)\n" + " mtau (ms)\n" + "}\n" + "\n" + "STATE {\n" + " m\n" + "}\n" + "\n" + "BREAKPOINT {\n" + " SOLVE states METHOD cnexp\n" + " i = gbar * m * ( v - erev )\n" + "}\n" + "\n" + "INITIAL {\n" + " settables(v)\n" + " m = minf\n" + " m = 0.25\n" + "}\n" + "\n" + "DERIVATIVE states {\n" + " settables(v)\n" + " m' = ( minf - m ) / mtau\n" + "}\n" + "\n" + "UNITSOFF\n" + "PROCEDURE settables(v) {\n" + " TABLE minf, mtau FROM -120 TO 40 WITH 641\n" + " minf = 1 / ( 1 + exp( ( v + 75 ) / 5.5 ) )\n" + " mtau = 1 / ( exp( -14.6 - 0.086 * v ) + exp( -1.87 + 0.07 * v ) )\n" + "}\n" + "UNITSON\n" + ; +#endif diff --git a/hnn_core/mod/arm64/ar.o b/hnn_core/mod/arm64/ar.o new file mode 100644 index 0000000000000000000000000000000000000000..798d8132b2c776c8358c12c45fcd158cd9ce8e70 GIT binary patch literal 9760 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 TRFctj%Byh0jeo5&nvDGy*=kPd literal 0 HcmV?d00001 diff --git a/hnn_core/mod/arm64/ca.c b/hnn_core/mod/arm64/ca.c new file mode 100644 index 000000000..fcc6a508f --- /dev/null +++ b/hnn_core/mod/arm64/ca.c @@ -0,0 +1,786 @@ +/* Created by Language version: 7.7.0 */ +/* NOT VECTORIZED */ +#define NRN_VECTORIZED 0 +#include +#include +#include +#include "mech_api.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 nrn_init _nrn_init__ca +#define _nrn_initial _nrn_initial__ca +#define nrn_cur _nrn_cur__ca +#define _nrn_current _nrn_current__ca +#define nrn_jacob _nrn_jacob__ca +#define nrn_state _nrn_state__ca +#define _net_receive _net_receive__ca +#define _f_trates _f_trates__ca +#define rates rates__ca +#define states states__ca +#define trates trates__ca + +#define _threadargscomma_ /**/ +#define _threadargsprotocomma_ /**/ +#define _threadargs_ /**/ +#define _threadargsproto_ /**/ + /*SUPPRESS 761*/ + /*SUPPRESS 762*/ + /*SUPPRESS 763*/ + /*SUPPRESS 765*/ + extern double *getarg(); + static double *_p; static Datum *_ppvar; + +#define t nrn_threads->_t +#define dt nrn_threads->_dt +#define gbar _p[0] +#define gbar_columnindex 0 +#define gca _p[1] +#define gca_columnindex 1 +#define minf _p[2] +#define minf_columnindex 2 +#define hinf _p[3] +#define hinf_columnindex 3 +#define mtau _p[4] +#define mtau_columnindex 4 +#define htau _p[5] +#define htau_columnindex 5 +#define m _p[6] +#define m_columnindex 6 +#define h _p[7] +#define h_columnindex 7 +#define ica _p[8] +#define ica_columnindex 8 +#define eca _p[9] +#define eca_columnindex 9 +#define Dm _p[10] +#define Dm_columnindex 10 +#define Dh _p[11] +#define Dh_columnindex 11 +#define _g _p[12] +#define _g_columnindex 12 +#define _ion_eca *_ppvar[0]._pval +#define _ion_ica *_ppvar[1]._pval +#define _ion_dicadv *_ppvar[2]._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; + /* external NEURON variables */ + extern double celsius; + /* declaration of user functions */ + static void _hoc_efun(void); + static void _hoc_rates(void); + static void _hoc_trates(void); + 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; + +#define NMODL_TEXT 1 +#if NMODL_TEXT +static const char* nmodl_file_text; +static const char* nmodl_filename; +extern void hoc_reg_nmodl_text(int, const char*); +extern void hoc_reg_nmodl_filename(int, const char*); +#endif + + extern void _nrn_setdata_reg(int, void(*)(Prop*)); + static void _setdata(Prop* _prop) { + _p = _prop->param; _ppvar = _prop->dparam; + } + static void _hoc_setdata() { + Prop *_prop, *hoc_getdata_range(int); + _prop = hoc_getdata_range(_mechtype); + _setdata(_prop); + hoc_retpushx(1.); +} + /* connect user functions to hoc names */ + static VoidFunc hoc_intfunc[] = { + "setdata_ca", _hoc_setdata, + "efun_ca", _hoc_efun, + "rates_ca", _hoc_rates, + "trates_ca", _hoc_trates, + 0, 0 +}; +#define efun efun_ca + extern double efun( double ); + /* declare global and static user variables */ +#define cai cai_ca + double cai = 0; +#define cao cao_ca + double cao = 2.5; +#define q10 q10_ca + double q10 = 2.3; +#define tshift tshift_ca + double tshift = 30.7; +#define tadj tadj_ca + double tadj = 0; +#define temp temp_ca + double temp = 23; +#define usetable usetable_ca + double usetable = 1; +#define vshift vshift_ca + double vshift = 0; +#define vmax vmax_ca + double vmax = 100; +#define vmin vmin_ca + double vmin = -120; + /* some parameters have upper and lower limits */ + static HocParmLimits _hoc_parm_limits[] = { + "usetable_ca", 0, 1, + 0,0,0 +}; + static HocParmUnits _hoc_parm_units[] = { + "vshift_ca", "mV", + "cao_ca", "mM", + "cai_ca", "mM", + "temp_ca", "degC", + "vmin_ca", "mV", + "vmax_ca", "mV", + "gbar_ca", "pS/um2", + "gca_ca", "pS/um2", + "mtau_ca", "ms", + "htau_ca", "ms", + 0,0 +}; + static double delta_t = 1; + static double h0 = 0; + static double m0 = 0; + static double v = 0; + /* connect global user variables to hoc */ + static DoubScal hoc_scdoub[] = { + "vshift_ca", &vshift_ca, + "cao_ca", &cao_ca, + "cai_ca", &cai_ca, + "temp_ca", &temp_ca, + "q10_ca", &q10_ca, + "tshift_ca", &tshift_ca, + "vmin_ca", &vmin_ca, + "vmax_ca", &vmax_ca, + "tadj_ca", &tadj_ca, + "usetable_ca", &usetable_ca, + 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 int _ode_count(int); +static void _ode_map(int, double**, double**, double*, Datum*, double*, int); +static void _ode_spec(NrnThread*, _Memb_list*, int); +static void _ode_matsol(NrnThread*, _Memb_list*, int); + +#define _cvode_ieq _ppvar[3]._i + static void _ode_matsol_instance1(_threadargsproto_); + /* connect range variables in _p that hoc is supposed to know about */ + static const char *_mechanism[] = { + "7.7.0", +"ca", + "gbar_ca", + 0, + "gca_ca", + "minf_ca", + "hinf_ca", + "mtau_ca", + "htau_ca", + 0, + "m_ca", + "h_ca", + 0, + 0}; + static Symbol* _ca_sym; + +extern Prop* need_memb(Symbol*); + +static void nrn_alloc(Prop* _prop) { + Prop *prop_ion; + double *_p; Datum *_ppvar; + _p = nrn_prop_data_alloc(_mechtype, 13, _prop); + /*initialize range parameters*/ + gbar = 0.1; + _prop->param = _p; + _prop->param_size = 13; + _ppvar = nrn_prop_datum_alloc(_mechtype, 4, _prop); + _prop->dparam = _ppvar; + /*connect ionic variables to this model*/ + prop_ion = need_memb(_ca_sym); + nrn_promote(prop_ion, 0, 1); + _ppvar[0]._pval = &prop_ion->param[0]; /* eca */ + _ppvar[1]._pval = &prop_ion->param[3]; /* ica */ + _ppvar[2]._pval = &prop_ion->param[4]; /* _ion_dicadv */ + +} + static void _initlists(); + /* some states have an absolute tolerance */ + static Symbol** _atollist; + static HocStateTolerance _hoc_state_tol[] = { + 0,0 +}; + static void _update_ion_pointer(Datum*); + extern Symbol* hoc_lookup(const char*); +extern void _nrn_thread_reg(int, int, void(*)(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 _ca_reg() { + int _vectorized = 0; + _initlists(); + ion_reg("ca", -10000.); + _ca_sym = hoc_lookup("ca_ion"); + register_mech(_mechanism, nrn_alloc,nrn_cur, nrn_jacob, nrn_state, nrn_init, hoc_nrnpointerindex, 0); + _mechtype = nrn_get_mechtype(_mechanism[1]); + _nrn_setdata_reg(_mechtype, _setdata); + _nrn_thread_reg(_mechtype, 2, _update_ion_pointer); + #if NMODL_TEXT + hoc_reg_nmodl_text(_mechtype, nmodl_file_text); + hoc_reg_nmodl_filename(_mechtype, nmodl_filename); +#endif + hoc_register_prop_size(_mechtype, 13, 4); + hoc_register_dparam_semantics(_mechtype, 0, "ca_ion"); + hoc_register_dparam_semantics(_mechtype, 1, "ca_ion"); + hoc_register_dparam_semantics(_mechtype, 2, "ca_ion"); + hoc_register_dparam_semantics(_mechtype, 3, "cvodeieq"); + hoc_register_cvode(_mechtype, _ode_count, _ode_map, _ode_spec, _ode_matsol); + hoc_register_tolerance(_mechtype, _hoc_state_tol, &_atollist); + hoc_register_var(hoc_scdoub, hoc_vdoub, hoc_intfunc); + ivoc_help("help ?1 ca /Users/katharinaduecker/Documents/Projects Brown/hnn-core/hnn_core/mod/ca.mod\n"); + hoc_register_limits(_mechtype, _hoc_parm_limits); + hoc_register_units(_mechtype, _hoc_parm_units); + } + +#define FARADAY _nrnunit_FARADAY[_nrnunit_use_legacy_] +static double _nrnunit_FARADAY[2] = {0x1.78e555060882cp+16, 96485.3}; /* 96485.3321233100141 */ + +#define R _nrnunit_R[_nrnunit_use_legacy_] +static double _nrnunit_R[2] = {0x1.0a1013e8990bep+3, 8.3145}; /* 8.3144626181532395 */ + +#define PI _nrnunit_PI[_nrnunit_use_legacy_] +static double _nrnunit_PI[2] = {0x1.921fb54442d18p+1, 3.14159}; /* 3.14159265358979312 */ + static double _zmexp , _zhexp ; + static double *_t_minf; + static double *_t_hinf; + static double *_t_mtau; + static double *_t_htau; +static int _reset; +static char *modelname = ""; + +static int error; +static int _ninits = 0; +static int _match_recurse=1; +static void _modl_cleanup(){ _match_recurse=1;} +static int _f_trates(double); +static int rates(double); +static int trates(double); + +static int _ode_spec1(_threadargsproto_); +/*static int _ode_matsol1(_threadargsproto_);*/ + static void _n_trates(double); + static int _slist1[2], _dlist1[2]; + static int states(_threadargsproto_); + +/*CVODE*/ + static int _ode_spec1 () {_reset=0; + { + trates ( _threadargscomma_ v + vshift ) ; + Dm = ( minf - m ) / mtau ; + Dh = ( hinf - h ) / htau ; + } + return _reset; +} + static int _ode_matsol1 () { + trates ( _threadargscomma_ v + vshift ) ; + Dm = Dm / (1. - dt*( ( ( ( - 1.0 ) ) ) / mtau )) ; + Dh = Dh / (1. - dt*( ( ( ( - 1.0 ) ) ) / htau )) ; + return 0; +} + /*END CVODE*/ + static int states () {_reset=0; + { + trates ( _threadargscomma_ v + vshift ) ; + m = m + (1. - exp(dt*(( ( ( - 1.0 ) ) ) / mtau)))*(- ( ( ( minf ) ) / mtau ) / ( ( ( ( - 1.0 ) ) ) / mtau ) - m) ; + h = h + (1. - exp(dt*(( ( ( - 1.0 ) ) ) / htau)))*(- ( ( ( hinf ) ) / htau ) / ( ( ( ( - 1.0 ) ) ) / htau ) - h) ; + } + return 0; +} + static double _mfac_trates, _tmin_trates; + static void _check_trates(); + static void _check_trates() { + static int _maktable=1; int _i, _j, _ix = 0; + double _xi, _tmax; + static double _sav_celsius; + static double _sav_temp; + if (!usetable) {return;} + if (_sav_celsius != celsius) { _maktable = 1;} + if (_sav_temp != temp) { _maktable = 1;} + if (_maktable) { double _x, _dx; _maktable=0; + _tmin_trates = vmin ; + _tmax = vmax ; + _dx = (_tmax - _tmin_trates)/199.; _mfac_trates = 1./_dx; + for (_i=0, _x=_tmin_trates; _i < 200; _x += _dx, _i++) { + _f_trates(_x); + _t_minf[_i] = minf; + _t_hinf[_i] = hinf; + _t_mtau[_i] = mtau; + _t_htau[_i] = htau; + } + _sav_celsius = celsius; + _sav_temp = temp; + } + } + + static int trates(double _lv){ _check_trates(); + _n_trates(_lv); + return 0; + } + + static void _n_trates(double _lv){ int _i, _j; + double _xi, _theta; + if (!usetable) { + _f_trates(_lv); return; +} + _xi = _mfac_trates * (_lv - _tmin_trates); + if (isnan(_xi)) { + minf = _xi; + hinf = _xi; + mtau = _xi; + htau = _xi; + return; + } + if (_xi <= 0.) { + minf = _t_minf[0]; + hinf = _t_hinf[0]; + mtau = _t_mtau[0]; + htau = _t_htau[0]; + return; } + if (_xi >= 199.) { + minf = _t_minf[199]; + hinf = _t_hinf[199]; + mtau = _t_mtau[199]; + htau = _t_htau[199]; + return; } + _i = (int) _xi; + _theta = _xi - (double)_i; + minf = _t_minf[_i] + _theta*(_t_minf[_i+1] - _t_minf[_i]); + hinf = _t_hinf[_i] + _theta*(_t_hinf[_i+1] - _t_hinf[_i]); + mtau = _t_mtau[_i] + _theta*(_t_mtau[_i+1] - _t_mtau[_i]); + htau = _t_htau[_i] + _theta*(_t_htau[_i+1] - _t_htau[_i]); + } + + +static int _f_trates ( double _lv ) { + rates ( _threadargscomma_ _lv ) ; + return 0; } + +static void _hoc_trates(void) { + double _r; + _r = 1.; + trates ( *getarg(1) ); + hoc_retpushx(_r); +} + +static int rates ( double _lvm ) { + double _la , _lb ; + tadj = pow( q10 , ( ( celsius - temp - tshift ) / 10.0 ) ) ; + _la = 0.055 * ( - 27.0 - _lvm ) / ( exp ( ( - 27.0 - _lvm ) / 3.8 ) - 1.0 ) ; + _lb = 0.94 * exp ( ( - 75.0 - _lvm ) / 17.0 ) ; + mtau = 1.0 / tadj / ( _la + _lb ) ; + minf = _la / ( _la + _lb ) ; + _la = 0.000457 * exp ( ( - 13.0 - _lvm ) / 50.0 ) ; + _lb = 0.0065 / ( exp ( ( - _lvm - 15.0 ) / 28.0 ) + 1.0 ) ; + htau = 1.0 / tadj / ( _la + _lb ) ; + hinf = _la / ( _la + _lb ) ; + return 0; } + +static void _hoc_rates(void) { + double _r; + _r = 1.; + rates ( *getarg(1) ); + hoc_retpushx(_r); +} + +double efun ( double _lz ) { + double _lefun; + if ( fabs ( _lz ) < 1e-4 ) { + _lefun = 1.0 - _lz / 2.0 ; + } + else { + _lefun = _lz / ( exp ( _lz ) - 1.0 ) ; + } + +return _lefun; + } + +static void _hoc_efun(void) { + double _r; + _r = efun ( *getarg(1) ); + hoc_retpushx(_r); +} + +static int _ode_count(int _type){ return 2;} + +static void _ode_spec(NrnThread* _nt, _Memb_list* _ml, int _type) { + Datum* _thread; + Node* _nd; double _v; int _iml, _cntml; + _cntml = _ml->_nodecount; + _thread = _ml->_thread; + for (_iml = 0; _iml < _cntml; ++_iml) { + _p = _ml->_data[_iml]; _ppvar = _ml->_pdata[_iml]; + _nd = _ml->_nodelist[_iml]; + v = NODEV(_nd); + eca = _ion_eca; + _ode_spec1 (); + }} + +static void _ode_map(int _ieq, double** _pv, double** _pvdot, double* _pp, Datum* _ppd, double* _atol, int _type) { + 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 void _ode_matsol_instance1(_threadargsproto_) { + _ode_matsol1 (); + } + +static void _ode_matsol(NrnThread* _nt, _Memb_list* _ml, int _type) { + Datum* _thread; + Node* _nd; double _v; int _iml, _cntml; + _cntml = _ml->_nodecount; + _thread = _ml->_thread; + for (_iml = 0; _iml < _cntml; ++_iml) { + _p = _ml->_data[_iml]; _ppvar = _ml->_pdata[_iml]; + _nd = _ml->_nodelist[_iml]; + v = NODEV(_nd); + eca = _ion_eca; + _ode_matsol_instance1(_threadargs_); + }} + extern void nrn_update_ion_pointer(Symbol*, Datum*, int, int); + static void _update_ion_pointer(Datum* _ppvar) { + nrn_update_ion_pointer(_ca_sym, _ppvar, 0, 0); + nrn_update_ion_pointer(_ca_sym, _ppvar, 1, 3); + nrn_update_ion_pointer(_ca_sym, _ppvar, 2, 4); + } + +static void initmodel() { + int _i; double _save;_ninits++; + _save = t; + t = 0.0; +{ + h = h0; + m = m0; + { + trates ( _threadargscomma_ v + vshift ) ; + m = minf ; + h = hinf ; + } + _sav_indep = t; t = _save; + +} +} + +static void nrn_init(NrnThread* _nt, _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]; +#if CACHEVEC + if (use_cachevec) { + _v = VEC_V(_ni[_iml]); + }else +#endif + { + _nd = _ml->_nodelist[_iml]; + _v = NODEV(_nd); + } + v = _v; + eca = _ion_eca; + initmodel(); + }} + +static double _nrn_current(double _v){double _current=0.;v=_v;{ { + gca = tadj * gbar * m * m * h ; + ica = ( 1e-4 ) * gca * ( v - eca ) ; + } + _current += ica; + +} return _current; +} + +static void nrn_cur(NrnThread* _nt, _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); + } + eca = _ion_eca; + _g = _nrn_current(_v + .001); + { double _dica; + _dica = ica; + _rhs = _nrn_current(_v); + _ion_dicadv += (_dica - ica)/.001 ; + } + _g = (_g - _rhs)/.001; + _ion_ica += ica ; +#if CACHEVEC + if (use_cachevec) { + VEC_RHS(_ni[_iml]) -= _rhs; + }else +#endif + { + NODERHS(_nd) -= _rhs; + } + +}} + +static void nrn_jacob(NrnThread* _nt, _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 void nrn_state(NrnThread* _nt, _Memb_list* _ml, int _type){ +Node *_nd; double _v = 0.0; 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); + } + v=_v; +{ + eca = _ion_eca; + { error = states(); + if(error){fprintf(stderr,"at line 73 in file ca.mod:\n SOLVE states METHOD cnexp\n"); nrn_complain(_p); abort_run(error);} + } }} + +} + +static void terminal(){} + +static void _initlists() { + int _i; static int _first = 1; + if (!_first) return; + _slist1[0] = m_columnindex; _dlist1[0] = Dm_columnindex; + _slist1[1] = h_columnindex; _dlist1[1] = Dh_columnindex; + _t_minf = makevector(200*sizeof(double)); + _t_hinf = makevector(200*sizeof(double)); + _t_mtau = makevector(200*sizeof(double)); + _t_htau = makevector(200*sizeof(double)); +_first = 0; +} + +#if NMODL_TEXT +static const char* nmodl_filename = "/Users/katharinaduecker/Documents/Projects Brown/hnn-core/hnn_core/mod/ca.mod"; +static const char* nmodl_file_text = + "COMMENT\n" + " 26 Ago 2002 Modification of original channel to allow variable time step\n" + " and to correct an initialization error.\n" + "\n" + " Done by Michael Hines(michael.hines@yale.edu) and Ruggero Scorcioni (rscorcio@gmu.edu)\n" + " at EU Advance Course in Computational Neuroscience. Obidos, Portugal\n" + "\n" + " ca.mod\n" + " Uses fixed eca instead of GHK eqn\n" + "\n" + " HVA Ca current\n" + " Based on Reuveni, Friedman, Amitai and Gutnick (1993) J. Neurosci. 13: 4609-4621.\n" + "\n" + " Author: Zach Mainen, Salk Institute, 1994, zach@salk.edu\n" + "ENDCOMMENT\n" + "\n" + "INDEPENDENT {t FROM 0 TO 1 WITH 1 (ms)}\n" + "\n" + "NEURON {\n" + " SUFFIX ca\n" + " USEION ca READ eca WRITE ica\n" + " RANGE m, h, gca, gbar\n" + " RANGE minf, hinf, mtau, htau\n" + " GLOBAL q10, temp, tadj, vmin, vmax, vshift, tshift\n" + "}\n" + "\n" + "PARAMETER {\n" + " gbar = 0.1 (pS/um2) : 0.12 mho/cm2\n" + " vshift = 0 (mV) : voltage shift (affects all)\n" + "\n" + " cao = 2.5 (mM) : external ca concentration\n" + " cai (mM)\n" + "\n" + " temp = 23 (degC) : original temp\n" + " q10 = 2.3 : temperature sensitivity\n" + " tshift = 30.7\n" + "\n" + " v (mV)\n" + " dt (ms)\n" + " celsius (degC)\n" + " vmin = -120 (mV)\n" + " vmax = 100 (mV)\n" + "}\n" + "\n" + "UNITS {\n" + " (mA) = (milliamp)\n" + " (mV) = (millivolt)\n" + " (pS) = (picosiemens)\n" + " (um) = (micron)\n" + " FARADAY = (faraday) (coulomb)\n" + " R = (k-mole) (joule/degC)\n" + " PI = (pi) (1)\n" + "}\n" + "\n" + "ASSIGNED {\n" + " ica (mA/cm2)\n" + " gca (pS/um2)\n" + " eca (mV)\n" + " minf hinf\n" + " mtau (ms) htau (ms)\n" + " tadj\n" + "}\n" + "\n" + "STATE { m h }\n" + "\n" + "INITIAL {\n" + " trates(v+vshift)\n" + " m = minf\n" + " h = hinf\n" + "}\n" + "\n" + "BREAKPOINT {\n" + " SOLVE states METHOD cnexp\n" + " gca = tadj * gbar * m * m * h\n" + " ica = (1e-4) * gca * (v - eca)\n" + "}\n" + "\n" + "LOCAL mexp, hexp\n" + "\n" + ": PROCEDURE states() {\n" + ": trates(v+vshift)\n" + ": m = m + mexp*(minf-m)\n" + ": h = h + hexp*(hinf-h)\n" + ": VERBATIM\n" + ": return 0;\n" + ": ENDVERBATIM\n" + ": }\n" + "\n" + "DERIVATIVE states {\n" + " trates(v + vshift)\n" + " m' = (minf - m) / mtau\n" + " h' = (hinf - h) / htau\n" + "}\n" + "\n" + "PROCEDURE trates(v) {\n" + " TABLE minf, hinf, mtau, htau\n" + " DEPEND celsius, temp\n" + "\n" + " FROM vmin TO vmax WITH 199\n" + "\n" + " : not consistently executed from here if usetable == 1\n" + " rates(v)\n" + "\n" + " : tinc = -dt * tadj\n" + "\n" + " : mexp = 1 - exp(tinc/mtau)\n" + " : hexp = 1 - exp(tinc/htau)\n" + "}\n" + "\n" + "PROCEDURE rates(vm) {\n" + " LOCAL a, b\n" + "\n" + " tadj = q10^((celsius - temp - tshift)/10)\n" + "\n" + " a = 0.055 * (-27 - vm) / (exp((-27 - vm) / 3.8) - 1)\n" + " b = 0.94 * exp((-75 - vm) / 17)\n" + "\n" + " mtau = 1 / tadj / (a+b)\n" + " minf = a / (a + b)\n" + "\n" + " : \"h\" inactivation\n" + " a = 0.000457 * exp((-13 - vm) / 50)\n" + " b = 0.0065 / (exp((-vm - 15) / 28) + 1)\n" + "\n" + " htau = 1 / tadj / (a + b)\n" + " hinf = a / (a + b)\n" + "}\n" + "\n" + "FUNCTION efun(z) {\n" + " if (fabs(z) < 1e-4) {\n" + " efun = 1 - z/2\n" + " } else {\n" + " efun = z / (exp(z) - 1)\n" + " }\n" + "}\n" + ; +#endif diff --git a/hnn_core/mod/arm64/ca.o b/hnn_core/mod/arm64/ca.o new file mode 100644 index 0000000000000000000000000000000000000000..94c123755a6a1469f6f325ee2c5edf7162b1e084 GIT binary patch literal 17312 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 O>sandRoT +#include +#include +#include "mech_api.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 nrn_init _nrn_init__cad +#define _nrn_initial _nrn_initial__cad +#define nrn_cur _nrn_cur__cad +#define _nrn_current _nrn_current__cad +#define nrn_jacob _nrn_jacob__cad +#define nrn_state _nrn_state__cad +#define _net_receive _net_receive__cad +#define state state__cad + +#define _threadargscomma_ _p, _ppvar, _thread, _nt, +#define _threadargsprotocomma_ double* _p, Datum* _ppvar, Datum* _thread, NrnThread* _nt, +#define _threadargs_ _p, _ppvar, _thread, _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 taur _p[0] +#define taur_columnindex 0 +#define ca _p[1] +#define ca_columnindex 1 +#define cai _p[2] +#define cai_columnindex 2 +#define Dca _p[3] +#define Dca_columnindex 3 +#define ica _p[4] +#define ica_columnindex 4 +#define drive_channel _p[5] +#define drive_channel_columnindex 5 +#define v _p[6] +#define v_columnindex 6 +#define _g _p[7] +#define _g_columnindex 7 +#define _ion_ica *_ppvar[0]._pval +#define _ion_cai *_ppvar[1]._pval +#define _style_ca *((int*)_ppvar[2]._pvoid) + +#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 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; + +#define NMODL_TEXT 1 +#if NMODL_TEXT +static const char* nmodl_file_text; +static const char* nmodl_filename; +extern void hoc_reg_nmodl_text(int, const char*); +extern void hoc_reg_nmodl_filename(int, const char*); +#endif + + extern void _nrn_setdata_reg(int, void(*)(Prop*)); + static void _setdata(Prop* _prop) { + _extcall_prop = _prop; + } + static void _hoc_setdata() { + Prop *_prop, *hoc_getdata_range(int); + _prop = hoc_getdata_range(_mechtype); + _setdata(_prop); + hoc_retpushx(1.); +} + /* connect user functions to hoc names */ + static VoidFunc hoc_intfunc[] = { + "setdata_cad", _hoc_setdata, + 0, 0 +}; + /* declare global and static user variables */ +#define cainf cainf_cad + double cainf = 0.0001; +#define depth depth_cad + double depth = 0.1; + /* some parameters have upper and lower limits */ + static HocParmLimits _hoc_parm_limits[] = { + 0,0,0 +}; + static HocParmUnits _hoc_parm_units[] = { + "depth_cad", "um", + "cainf_cad", "mM", + "taur_cad", "ms", + "ca_cad", "mM", + 0,0 +}; + static double ca0 = 0; + static double delta_t = 1; + /* connect global user variables to hoc */ + static DoubScal hoc_scdoub[] = { + "depth_cad", &depth_cad, + "cainf_cad", &cainf_cad, + 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 int _ode_count(int); +static void _ode_map(int, double**, double**, double*, Datum*, double*, int); +static void _ode_spec(NrnThread*, _Memb_list*, int); +static void _ode_matsol(NrnThread*, _Memb_list*, int); + +#define _cvode_ieq _ppvar[3]._i + static void _ode_synonym(int, double**, Datum**); + static void _ode_matsol_instance1(_threadargsproto_); + /* connect range variables in _p that hoc is supposed to know about */ + static const char *_mechanism[] = { + "7.7.0", +"cad", + "taur_cad", + 0, + 0, + "ca_cad", + 0, + 0}; + static Symbol* _ca_sym; + +extern Prop* need_memb(Symbol*); + +static void nrn_alloc(Prop* _prop) { + Prop *prop_ion; + double *_p; Datum *_ppvar; + _p = nrn_prop_data_alloc(_mechtype, 8, _prop); + /*initialize range parameters*/ + taur = 200; + _prop->param = _p; + _prop->param_size = 8; + _ppvar = nrn_prop_datum_alloc(_mechtype, 4, _prop); + _prop->dparam = _ppvar; + /*connect ionic variables to this model*/ + prop_ion = need_memb(_ca_sym); + nrn_check_conc_write(_prop, prop_ion, 1); + nrn_promote(prop_ion, 3, 0); + _ppvar[0]._pval = &prop_ion->param[3]; /* ica */ + _ppvar[1]._pval = &prop_ion->param[1]; /* cai */ + _ppvar[2]._pvoid = (void*)(&(prop_ion->dparam[0]._i)); /* iontype for ca */ + +} + static void _initlists(); + /* some states have an absolute tolerance */ + static Symbol** _atollist; + static HocStateTolerance _hoc_state_tol[] = { + "ca_cad", 1e-05, + 0,0 +}; + static void _update_ion_pointer(Datum*); + extern Symbol* hoc_lookup(const char*); +extern void _nrn_thread_reg(int, int, void(*)(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 _cad_reg() { + int _vectorized = 1; + _initlists(); + ion_reg("ca", -10000.); + _ca_sym = hoc_lookup("ca_ion"); + register_mech(_mechanism, nrn_alloc,nrn_cur, nrn_jacob, nrn_state, nrn_init, hoc_nrnpointerindex, 1); + _mechtype = nrn_get_mechtype(_mechanism[1]); + _nrn_setdata_reg(_mechtype, _setdata); + _nrn_thread_reg(_mechtype, 2, _update_ion_pointer); + #if NMODL_TEXT + hoc_reg_nmodl_text(_mechtype, nmodl_file_text); + hoc_reg_nmodl_filename(_mechtype, nmodl_filename); +#endif + hoc_register_prop_size(_mechtype, 8, 4); + hoc_register_dparam_semantics(_mechtype, 0, "ca_ion"); + hoc_register_dparam_semantics(_mechtype, 1, "ca_ion"); + hoc_register_dparam_semantics(_mechtype, 2, "#ca_ion"); + hoc_register_dparam_semantics(_mechtype, 3, "cvodeieq"); + nrn_writes_conc(_mechtype, 0); + hoc_register_cvode(_mechtype, _ode_count, _ode_map, _ode_spec, _ode_matsol); + hoc_register_tolerance(_mechtype, _hoc_state_tol, &_atollist); + hoc_register_synonym(_mechtype, _ode_synonym); + hoc_register_var(hoc_scdoub, hoc_vdoub, hoc_intfunc); + ivoc_help("help ?1 cad /Users/katharinaduecker/Documents/Projects Brown/hnn-core/hnn_core/mod/cad.mod\n"); + hoc_register_limits(_mechtype, _hoc_parm_limits); + hoc_register_units(_mechtype, _hoc_parm_units); + } + +#define FARADAY _nrnunit_FARADAY[_nrnunit_use_legacy_] +static double _nrnunit_FARADAY[2] = {0x1.78e555060882cp+16, 96485.3}; /* 96485.3321233100141 */ +static int _reset; +static char *modelname = "Decay of internal calcium concentration"; + +static int error; +static int _ninits = 0; +static int _match_recurse=1; +static void _modl_cleanup(){ _match_recurse=1;} + +static int _ode_spec1(_threadargsproto_); +/*static int _ode_matsol1(_threadargsproto_);*/ + static int _slist1[1], _dlist1[1]; + static int state(_threadargsproto_); + +/*CVODE*/ + static int _ode_spec1 (double* _p, Datum* _ppvar, Datum* _thread, NrnThread* _nt) {int _reset = 0; { + drive_channel = - ( 10000.0 ) * ica / ( 2.0 * FARADAY * depth ) ; + if ( drive_channel <= 0. ) { + drive_channel = 0. ; + } + Dca = drive_channel + ( cainf - ca ) / taur ; + cai = ca ; + } + return _reset; +} + static int _ode_matsol1 (double* _p, Datum* _ppvar, Datum* _thread, NrnThread* _nt) { + drive_channel = - ( 10000.0 ) * ica / ( 2.0 * FARADAY * depth ) ; + if ( drive_channel <= 0. ) { + drive_channel = 0. ; + } + Dca = Dca / (1. - dt*( ( ( ( - 1.0 ) ) ) / taur )) ; + cai = ca ; + return 0; +} + /*END CVODE*/ + static int state (double* _p, Datum* _ppvar, Datum* _thread, NrnThread* _nt) { { + drive_channel = - ( 10000.0 ) * ica / ( 2.0 * FARADAY * depth ) ; + if ( drive_channel <= 0. ) { + drive_channel = 0. ; + } + ca = ca + (1. - exp(dt*(( ( ( - 1.0 ) ) ) / taur)))*(- ( drive_channel + ( ( cainf ) ) / taur ) / ( ( ( ( - 1.0 ) ) ) / taur ) - ca) ; + cai = ca ; + } + return 0; +} + +static int _ode_count(int _type){ return 1;} + +static void _ode_spec(NrnThread* _nt, _Memb_list* _ml, int _type) { + double* _p; Datum* _ppvar; Datum* _thread; + Node* _nd; double _v; int _iml, _cntml; + _cntml = _ml->_nodecount; + _thread = _ml->_thread; + for (_iml = 0; _iml < _cntml; ++_iml) { + _p = _ml->_data[_iml]; _ppvar = _ml->_pdata[_iml]; + _nd = _ml->_nodelist[_iml]; + v = NODEV(_nd); + ica = _ion_ica; + cai = _ion_cai; + cai = _ion_cai; + _ode_spec1 (_p, _ppvar, _thread, _nt); + _ion_cai = cai; + }} + +static void _ode_map(int _ieq, double** _pv, double** _pvdot, double* _pp, Datum* _ppd, double* _atol, int _type) { + double* _p; Datum* _ppvar; + int _i; _p = _pp; _ppvar = _ppd; + _cvode_ieq = _ieq; + for (_i=0; _i < 1; ++_i) { + _pv[_i] = _pp + _slist1[_i]; _pvdot[_i] = _pp + _dlist1[_i]; + _cvode_abstol(_atollist, _atol, _i); + } + } + static void _ode_synonym(int _cnt, double** _pp, Datum** _ppd) { + double* _p; Datum* _ppvar; + int _i; + for (_i=0; _i < _cnt; ++_i) {_p = _pp[_i]; _ppvar = _ppd[_i]; + _ion_cai = ca ; + }} + +static void _ode_matsol_instance1(_threadargsproto_) { + _ode_matsol1 (_p, _ppvar, _thread, _nt); + } + +static void _ode_matsol(NrnThread* _nt, _Memb_list* _ml, int _type) { + double* _p; Datum* _ppvar; Datum* _thread; + Node* _nd; double _v; int _iml, _cntml; + _cntml = _ml->_nodecount; + _thread = _ml->_thread; + for (_iml = 0; _iml < _cntml; ++_iml) { + _p = _ml->_data[_iml]; _ppvar = _ml->_pdata[_iml]; + _nd = _ml->_nodelist[_iml]; + v = NODEV(_nd); + ica = _ion_ica; + cai = _ion_cai; + cai = _ion_cai; + _ode_matsol_instance1(_threadargs_); + }} + extern void nrn_update_ion_pointer(Symbol*, Datum*, int, int); + static void _update_ion_pointer(Datum* _ppvar) { + nrn_update_ion_pointer(_ca_sym, _ppvar, 0, 3); + nrn_update_ion_pointer(_ca_sym, _ppvar, 1, 1); + } + +static void initmodel(double* _p, Datum* _ppvar, Datum* _thread, NrnThread* _nt) { + int _i; double _save;{ + ca = ca0; + { + ca = cainf ; + cai = ca ; + } + +} +} + +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 CACHEVEC + if (use_cachevec) { + _v = VEC_V(_ni[_iml]); + }else +#endif + { + _nd = _ml->_nodelist[_iml]; + _v = NODEV(_nd); + } + v = _v; + ica = _ion_ica; + cai = _ion_cai; + cai = _ion_cai; + initmodel(_p, _ppvar, _thread, _nt); + _ion_cai = cai; + nrn_wrote_conc(_ca_sym, (&(_ion_cai)) - 1, _style_ca); +} +} + +static double _nrn_current(double* _p, Datum* _ppvar, Datum* _thread, NrnThread* _nt, double _v){double _current=0.;v=_v;{ +} 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 CACHEVEC + if (use_cachevec) { + _v = VEC_V(_ni[_iml]); + }else +#endif + { + _nd = _ml->_nodelist[_iml]; + _v = NODEV(_nd); + } + +} + +} + +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]; +#if CACHEVEC + if (use_cachevec) { + VEC_D(_ni[_iml]) += _g; + }else +#endif + { + _nd = _ml->_nodelist[_iml]; + NODED(_nd) += _g; + } + +} + +} + +static void nrn_state(NrnThread* _nt, _Memb_list* _ml, int _type) { +double* _p; Datum* _ppvar; Datum* _thread; +Node *_nd; double _v = 0.0; 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 CACHEVEC + if (use_cachevec) { + _v = VEC_V(_ni[_iml]); + }else +#endif + { + _nd = _ml->_nodelist[_iml]; + _v = NODEV(_nd); + } + v=_v; +{ + ica = _ion_ica; + cai = _ion_cai; + cai = _ion_cai; + { state(_p, _ppvar, _thread, _nt); + } { + } + _ion_cai = cai; +}} + +} + +static void terminal(){} + +static void _initlists(){ + double _x; double* _p = &_x; + int _i; static int _first = 1; + if (!_first) return; + _slist1[0] = ca_columnindex; _dlist1[0] = Dca_columnindex; +_first = 0; +} + +#if defined(__cplusplus) +} /* extern "C" */ +#endif + +#if NMODL_TEXT +static const char* nmodl_filename = "/Users/katharinaduecker/Documents/Projects Brown/hnn-core/hnn_core/mod/cad.mod"; +static const char* nmodl_file_text = + "COMMENT\n" + " 26 Ago 2002 Modification of original channel to allow variable time step\n" + " and to correct an initialization error.\n" + "\n" + " Done by Michael Hines (michael.hines@yale.edu) and Ruggero Scorcioni (rscorcio@gmu.edu)\n" + " at EU Advance Course in Computational Neuroscience. Obidos, Portugal\n" + "\n" + " Internal calcium concentration due to calcium currents and pump.\n" + " Differential equations.\n" + "\n" + " Simple model of ATPase pump with 3 kinetic constants (Destexhe 92)\n" + " Cai + P <-> CaP -> Cao + P (k1,k2,k3)\n" + "\n" + " A Michaelis-Menten approximation is assumed, which reduces the complexity\n" + " of the system to 2 parameters:\n" + "\n" + " kt = * k3 -> TIME CONSTANT OF THE PUMP\n" + " kd = k2/k1 (dissociation constant) -> EQUILIBRIUM CALCIUM VALUE\n" + "\n" + " The values of these parameters are chosen assuming a high affinity of\n" + " the pump to calcium and a low transport capacity (cfr. Blaustein,\n" + " TINS, 11: 438, 1988, and references therein).\n" + "\n" + " Units checked using \"modlunit\" -> factor 10000 needed in ca entry\n" + "\n" + " VERSION OF PUMP + DECAY (decay can be viewed as simplified buffering)\n" + "\n" + " All variables are range variables\n" + "\n" + " This mechanism was published in: Destexhe, A. Babloyantz, A. and\n" + " Sejnowski, TJ. Ionic mechanisms for intrinsic slow oscillations in\n" + " thalamic relay neurons. Biophys. J. 65: 1538-1552, 1993)\n" + "\n" + " Written by Alain Destexhe, Salk Institute, Nov 12, 1992\n" + "\n" + "ENDCOMMENT\n" + "\n" + "TITLE Decay of internal calcium concentration\n" + "\n" + "INDEPENDENT {t FROM 0 TO 1 WITH 1 (ms)}\n" + "\n" + "NEURON {\n" + " SUFFIX cad\n" + " USEION ca\n" + " READ ica, cai\n" + " WRITE cai\n" + "\n" + " : SRJones put taur up here\n" + " RANGE ca, taur\n" + " GLOBAL depth, cainf\n" + " : GLOBAL depth, cainf, taur\n" + "}\n" + "\n" + "UNITS {\n" + " : moles do not appear in units\n" + " (molar) = (1/liter)\n" + " (mM) = (millimolar)\n" + " (um) = (micron)\n" + " (mA) = (milliamp)\n" + " (msM) = (ms mM)\n" + " FARADAY = (faraday) (coulomb)\n" + "}\n" + "\n" + "PARAMETER {\n" + " depth = .1 (um) : depth of shell\n" + " taur = 200 (ms) : rate of calcium removal 200 default\n" + " cainf = 100e-6 (mM)\n" + " cai (mM)\n" + "}\n" + "\n" + "STATE {\n" + " ca (mM) <1e-5>\n" + "}\n" + "\n" + "INITIAL {\n" + " ca = cainf\n" + " cai = ca\n" + "}\n" + "\n" + "ASSIGNED {\n" + " ica (mA/cm2)\n" + " drive_channel (mM/ms)\n" + "}\n" + "\n" + "BREAKPOINT {\n" + " SOLVE state METHOD cnexp\n" + "}\n" + "\n" + "DERIVATIVE state {\n" + " drive_channel = -(10000) * ica / (2 * FARADAY * depth)\n" + "\n" + " : cannot pump inward\n" + " if (drive_channel <= 0.) { drive_channel = 0. }\n" + "\n" + " ca' = drive_channel + (cainf-ca) / taur\n" + " cai = ca\n" + "}\n" + ; +#endif diff --git a/hnn_core/mod/arm64/cad.o b/hnn_core/mod/arm64/cad.o new file mode 100644 index 0000000000000000000000000000000000000000..fd15ecc7575cc941a0dd12ff70946b543f6eb0a6 GIT binary patch literal 10640 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 literal 0 HcmV?d00001 diff --git a/hnn_core/mod/arm64/cat.c b/hnn_core/mod/arm64/cat.c new file mode 100644 index 000000000..2771f33ff --- /dev/null +++ b/hnn_core/mod/arm64/cat.c @@ -0,0 +1,628 @@ +/* Created by Language version: 7.7.0 */ +/* VECTORIZED */ +#define NRN_VECTORIZED 1 +#include +#include +#include +#include "mech_api.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 nrn_init _nrn_init__cat +#define _nrn_initial _nrn_initial__cat +#define nrn_cur _nrn_cur__cat +#define _nrn_current _nrn_current__cat +#define nrn_jacob _nrn_jacob__cat +#define nrn_state _nrn_state__cat +#define _net_receive _net_receive__cat +#define _f_settables _f_settables__cat +#define settables settables__cat +#define states states__cat + +#define _threadargscomma_ _p, _ppvar, _thread, _nt, +#define _threadargsprotocomma_ double* _p, Datum* _ppvar, Datum* _thread, NrnThread* _nt, +#define _threadargs_ _p, _ppvar, _thread, _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 gbar _p[0] +#define gbar_columnindex 0 +#define i _p[1] +#define i_columnindex 1 +#define m _p[2] +#define m_columnindex 2 +#define h _p[3] +#define h_columnindex 3 +#define minf _p[4] +#define minf_columnindex 4 +#define hinf _p[5] +#define hinf_columnindex 5 +#define mtau _p[6] +#define mtau_columnindex 6 +#define htau _p[7] +#define htau_columnindex 7 +#define Dm _p[8] +#define Dm_columnindex 8 +#define Dh _p[9] +#define Dh_columnindex 9 +#define v _p[10] +#define v_columnindex 10 +#define _g _p[11] +#define _g_columnindex 11 + +#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 void _hoc_settables(void); + 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; + +#define NMODL_TEXT 1 +#if NMODL_TEXT +static const char* nmodl_file_text; +static const char* nmodl_filename; +extern void hoc_reg_nmodl_text(int, const char*); +extern void hoc_reg_nmodl_filename(int, const char*); +#endif + + extern void _nrn_setdata_reg(int, void(*)(Prop*)); + static void _setdata(Prop* _prop) { + _extcall_prop = _prop; + } + static void _hoc_setdata() { + Prop *_prop, *hoc_getdata_range(int); + _prop = hoc_getdata_range(_mechtype); + _setdata(_prop); + hoc_retpushx(1.); +} + /* connect user functions to hoc names */ + static VoidFunc hoc_intfunc[] = { + "setdata_cat", _hoc_setdata, + "settables_cat", _hoc_settables, + 0, 0 +}; + +static void _check_settables(double*, Datum*, Datum*, NrnThread*); +static void _check_table_thread(double* _p, Datum* _ppvar, Datum* _thread, NrnThread* _nt, int _type) { + _check_settables(_p, _ppvar, _thread, _nt); + } + /* declare global and static user variables */ +#define eca eca_cat + double eca = 0; +#define usetable usetable_cat + double usetable = 1; + /* some parameters have upper and lower limits */ + static HocParmLimits _hoc_parm_limits[] = { + "usetable_cat", 0, 1, + 0,0,0 +}; + static HocParmUnits _hoc_parm_units[] = { + "eca_cat", "mV", + "gbar_cat", "mho/cm2", + "i_cat", "mA/cm2", + 0,0 +}; + static double delta_t = 1; + static double h0 = 0; + static double m0 = 0; + /* connect global user variables to hoc */ + static DoubScal hoc_scdoub[] = { + "eca_cat", &eca_cat, + "usetable_cat", &usetable_cat, + 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 int _ode_count(int); +static void _ode_map(int, double**, double**, double*, Datum*, double*, int); +static void _ode_spec(NrnThread*, _Memb_list*, int); +static void _ode_matsol(NrnThread*, _Memb_list*, int); + +#define _cvode_ieq _ppvar[0]._i + static void _ode_matsol_instance1(_threadargsproto_); + /* connect range variables in _p that hoc is supposed to know about */ + static const char *_mechanism[] = { + "7.7.0", +"cat", + "gbar_cat", + 0, + "i_cat", + 0, + "m_cat", + "h_cat", + 0, + 0}; + +extern Prop* need_memb(Symbol*); + +static void nrn_alloc(Prop* _prop) { + Prop *prop_ion; + double *_p; Datum *_ppvar; + _p = nrn_prop_data_alloc(_mechtype, 12, _prop); + /*initialize range parameters*/ + gbar = 0; + _prop->param = _p; + _prop->param_size = 12; + _ppvar = nrn_prop_datum_alloc(_mechtype, 1, _prop); + _prop->dparam = _ppvar; + /*connect ionic variables to this model*/ + +} + static void _initlists(); + /* some states have an absolute tolerance */ + static Symbol** _atollist; + static HocStateTolerance _hoc_state_tol[] = { + 0,0 +}; + extern Symbol* hoc_lookup(const char*); +extern void _nrn_thread_reg(int, int, void(*)(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 _cat_reg() { + int _vectorized = 1; + _initlists(); + register_mech(_mechanism, nrn_alloc,nrn_cur, nrn_jacob, nrn_state, nrn_init, hoc_nrnpointerindex, 1); + _mechtype = nrn_get_mechtype(_mechanism[1]); + _nrn_setdata_reg(_mechtype, _setdata); + _nrn_thread_table_reg(_mechtype, _check_table_thread); + #if NMODL_TEXT + hoc_reg_nmodl_text(_mechtype, nmodl_file_text); + hoc_reg_nmodl_filename(_mechtype, nmodl_filename); +#endif + hoc_register_prop_size(_mechtype, 12, 1); + hoc_register_dparam_semantics(_mechtype, 0, "cvodeieq"); + hoc_register_cvode(_mechtype, _ode_count, _ode_map, _ode_spec, _ode_matsol); + hoc_register_tolerance(_mechtype, _hoc_state_tol, &_atollist); + hoc_register_var(hoc_scdoub, hoc_vdoub, hoc_intfunc); + ivoc_help("help ?1 cat /Users/katharinaduecker/Documents/Projects Brown/hnn-core/hnn_core/mod/cat.mod\n"); + hoc_register_limits(_mechtype, _hoc_parm_limits); + hoc_register_units(_mechtype, _hoc_parm_units); + } + static double *_t_minf; + static double *_t_mtau; + static double *_t_hinf; + static double *_t_htau; +static int _reset; +static char *modelname = "Calcium low threshold T type current for RD Traub, J Neurophysiol 89:909-921, 2003"; + +static int error; +static int _ninits = 0; +static int _match_recurse=1; +static void _modl_cleanup(){ _match_recurse=1;} +static int _f_settables(_threadargsprotocomma_ double); +static int settables(_threadargsprotocomma_ double); + +static int _ode_spec1(_threadargsproto_); +/*static int _ode_matsol1(_threadargsproto_);*/ + static void _n_settables(_threadargsprotocomma_ double _lv); + static int _slist1[2], _dlist1[2]; + static int states(_threadargsproto_); + +/*CVODE*/ + static int _ode_spec1 (double* _p, Datum* _ppvar, Datum* _thread, NrnThread* _nt) {int _reset = 0; { + settables ( _threadargscomma_ v ) ; + Dm = ( minf - m ) / mtau ; + Dh = ( hinf - h ) / htau ; + } + return _reset; +} + static int _ode_matsol1 (double* _p, Datum* _ppvar, Datum* _thread, NrnThread* _nt) { + settables ( _threadargscomma_ v ) ; + Dm = Dm / (1. - dt*( ( ( ( - 1.0 ) ) ) / mtau )) ; + Dh = Dh / (1. - dt*( ( ( ( - 1.0 ) ) ) / htau )) ; + return 0; +} + /*END CVODE*/ + static int states (double* _p, Datum* _ppvar, Datum* _thread, NrnThread* _nt) { { + settables ( _threadargscomma_ v ) ; + m = m + (1. - exp(dt*(( ( ( - 1.0 ) ) ) / mtau)))*(- ( ( ( minf ) ) / mtau ) / ( ( ( ( - 1.0 ) ) ) / mtau ) - m) ; + h = h + (1. - exp(dt*(( ( ( - 1.0 ) ) ) / htau)))*(- ( ( ( hinf ) ) / htau ) / ( ( ( ( - 1.0 ) ) ) / htau ) - h) ; + } + return 0; +} + static double _mfac_settables, _tmin_settables; + static void _check_settables(double* _p, Datum* _ppvar, Datum* _thread, NrnThread* _nt) { + static int _maktable=1; int _i, _j, _ix = 0; + double _xi, _tmax; + if (!usetable) {return;} + if (_maktable) { double _x, _dx; _maktable=0; + _tmin_settables = - 120.0 ; + _tmax = 40.0 ; + _dx = (_tmax - _tmin_settables)/641.; _mfac_settables = 1./_dx; + for (_i=0, _x=_tmin_settables; _i < 642; _x += _dx, _i++) { + _f_settables(_p, _ppvar, _thread, _nt, _x); + _t_minf[_i] = minf; + _t_mtau[_i] = mtau; + _t_hinf[_i] = hinf; + _t_htau[_i] = htau; + } + } + } + + static int settables(double* _p, Datum* _ppvar, Datum* _thread, NrnThread* _nt, double _lv) { +#if 0 +_check_settables(_p, _ppvar, _thread, _nt); +#endif + _n_settables(_p, _ppvar, _thread, _nt, _lv); + return 0; + } + + static void _n_settables(double* _p, Datum* _ppvar, Datum* _thread, NrnThread* _nt, double _lv){ int _i, _j; + double _xi, _theta; + if (!usetable) { + _f_settables(_p, _ppvar, _thread, _nt, _lv); return; +} + _xi = _mfac_settables * (_lv - _tmin_settables); + if (isnan(_xi)) { + minf = _xi; + mtau = _xi; + hinf = _xi; + htau = _xi; + return; + } + if (_xi <= 0.) { + minf = _t_minf[0]; + mtau = _t_mtau[0]; + hinf = _t_hinf[0]; + htau = _t_htau[0]; + return; } + if (_xi >= 641.) { + minf = _t_minf[641]; + mtau = _t_mtau[641]; + hinf = _t_hinf[641]; + htau = _t_htau[641]; + return; } + _i = (int) _xi; + _theta = _xi - (double)_i; + minf = _t_minf[_i] + _theta*(_t_minf[_i+1] - _t_minf[_i]); + mtau = _t_mtau[_i] + _theta*(_t_mtau[_i+1] - _t_mtau[_i]); + hinf = _t_hinf[_i] + _theta*(_t_hinf[_i+1] - _t_hinf[_i]); + htau = _t_htau[_i] + _theta*(_t_htau[_i+1] - _t_htau[_i]); + } + + +static int _f_settables ( _threadargsprotocomma_ double _lv ) { + minf = 1.0 / ( 1.0 + exp ( ( - _lv - 56.0 ) / 6.2 ) ) ; + mtau = 0.204 + 0.333 / ( exp ( ( _lv + 15.8 ) / 18.2 ) + exp ( ( - _lv - 131.0 ) / 16.7 ) ) ; + hinf = 1.0 / ( 1.0 + exp ( ( _lv + 80.0 ) / 4.0 ) ) ; + if ( _lv < - 81.0 ) { + htau = 0.333 * exp ( ( _lv + 466.0 ) / 66.6 ) ; + } + else { + htau = 9.32 + 0.333 * exp ( ( - _lv - 21.0 ) / 10.5 ) ; + } + return 0; } + +static void _hoc_settables(void) { + double _r; + double* _p; Datum* _ppvar; Datum* _thread; NrnThread* _nt; + if (_extcall_prop) {_p = _extcall_prop->param; _ppvar = _extcall_prop->dparam;}else{ _p = (double*)0; _ppvar = (Datum*)0; } + _thread = _extcall_thread; + _nt = nrn_threads; + +#if 1 + _check_settables(_p, _ppvar, _thread, _nt); +#endif + _r = 1.; + settables ( _p, _ppvar, _thread, _nt, *getarg(1) ); + hoc_retpushx(_r); +} + +static int _ode_count(int _type){ return 2;} + +static void _ode_spec(NrnThread* _nt, _Memb_list* _ml, int _type) { + double* _p; Datum* _ppvar; Datum* _thread; + Node* _nd; double _v; int _iml, _cntml; + _cntml = _ml->_nodecount; + _thread = _ml->_thread; + for (_iml = 0; _iml < _cntml; ++_iml) { + _p = _ml->_data[_iml]; _ppvar = _ml->_pdata[_iml]; + _nd = _ml->_nodelist[_iml]; + v = NODEV(_nd); + _ode_spec1 (_p, _ppvar, _thread, _nt); + }} + +static void _ode_map(int _ieq, double** _pv, double** _pvdot, double* _pp, Datum* _ppd, double* _atol, int _type) { + double* _p; Datum* _ppvar; + 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 void _ode_matsol_instance1(_threadargsproto_) { + _ode_matsol1 (_p, _ppvar, _thread, _nt); + } + +static void _ode_matsol(NrnThread* _nt, _Memb_list* _ml, int _type) { + double* _p; Datum* _ppvar; Datum* _thread; + Node* _nd; double _v; int _iml, _cntml; + _cntml = _ml->_nodecount; + _thread = _ml->_thread; + for (_iml = 0; _iml < _cntml; ++_iml) { + _p = _ml->_data[_iml]; _ppvar = _ml->_pdata[_iml]; + _nd = _ml->_nodelist[_iml]; + v = NODEV(_nd); + _ode_matsol_instance1(_threadargs_); + }} + +static void initmodel(double* _p, Datum* _ppvar, Datum* _thread, NrnThread* _nt) { + int _i; double _save;{ + h = h0; + m = m0; + { + settables ( _threadargscomma_ v ) ; + m = minf ; + h = hinf ; + m = 0.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 0 + _check_settables(_p, _ppvar, _thread, _nt); +#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;{ { + i = gbar * m * m * h * ( v - 125.0 ) ; + } + _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 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; +#if CACHEVEC + if (use_cachevec) { + VEC_RHS(_ni[_iml]) -= _rhs; + }else +#endif + { + NODERHS(_nd) -= _rhs; + } + +} + +} + +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]; +#if CACHEVEC + if (use_cachevec) { + VEC_D(_ni[_iml]) += _g; + }else +#endif + { + _nd = _ml->_nodelist[_iml]; + NODED(_nd) += _g; + } + +} + +} + +static void nrn_state(NrnThread* _nt, _Memb_list* _ml, int _type) { +double* _p; Datum* _ppvar; Datum* _thread; +Node *_nd; double _v = 0.0; 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 CACHEVEC + if (use_cachevec) { + _v = VEC_V(_ni[_iml]); + }else +#endif + { + _nd = _ml->_nodelist[_iml]; + _v = NODEV(_nd); + } + v=_v; +{ + { states(_p, _ppvar, _thread, _nt); + }}} + +} + +static void terminal(){} + +static void _initlists(){ + double _x; double* _p = &_x; + int _i; static int _first = 1; + if (!_first) return; + _slist1[0] = m_columnindex; _dlist1[0] = Dm_columnindex; + _slist1[1] = h_columnindex; _dlist1[1] = Dh_columnindex; + _t_minf = makevector(642*sizeof(double)); + _t_mtau = makevector(642*sizeof(double)); + _t_hinf = makevector(642*sizeof(double)); + _t_htau = makevector(642*sizeof(double)); +_first = 0; +} + +#if defined(__cplusplus) +} /* extern "C" */ +#endif + +#if NMODL_TEXT +static const char* nmodl_filename = "/Users/katharinaduecker/Documents/Projects Brown/hnn-core/hnn_core/mod/cat.mod"; +static const char* nmodl_file_text = + "TITLE Calcium low threshold T type current for RD Traub, J Neurophysiol 89:909-921, 2003\n" + "\n" + "COMMENT\n" + " Implemented by Maciej Lazarewicz 2003 (mlazarew@seas.upenn.edu)\n" + "ENDCOMMENT\n" + "\n" + "INDEPENDENT { t FROM 0 TO 1 WITH 1 (ms) }\n" + "\n" + "UNITS {\n" + " (mV) = (millivolt)\n" + " (mA) = (milliamp)\n" + "}\n" + "\n" + "NEURON {\n" + " SUFFIX cat\n" + " NONSPECIFIC_CURRENT i : not causing [Ca2+] influx\n" + " RANGE gbar, i\n" + "}\n" + "\n" + "PARAMETER {\n" + " gbar = 0.0 (mho/cm2)\n" + " v eca (mV)\n" + "}\n" + "\n" + "ASSIGNED {\n" + " i (mA/cm2)\n" + " minf hinf (1)\n" + " mtau htau (ms)\n" + "}\n" + "\n" + "STATE {\n" + " m h\n" + "}\n" + "\n" + "BREAKPOINT {\n" + " SOLVE states METHOD cnexp\n" + " i = gbar * m * m * h * ( v - 125 )\n" + "}\n" + "\n" + "INITIAL {\n" + " settables(v)\n" + " m = minf\n" + " h = hinf\n" + " m = 0\n" + "}\n" + "\n" + "DERIVATIVE states {\n" + " settables(v)\n" + " m' = ( minf - m ) / mtau\n" + " h' = ( hinf - h ) / htau\n" + "}\n" + "\n" + "UNITSOFF\n" + "PROCEDURE settables(v) {\n" + " TABLE minf, mtau, hinf, htau FROM -120 TO 40 WITH 641\n" + "\n" + " minf = 1 / (1 + exp(( -v - 56 ) / 6.2))\n" + " mtau = 0.204 + 0.333 / (exp(( v + 15.8) / 18.2) + exp((-v - 131) / 16.7))\n" + " hinf = 1 / (1 + exp((v + 80) / 4))\n" + "\n" + " if (v < -81) {\n" + " htau = 0.333 * exp((v + 466 ) / 66.6)\n" + " } else {\n" + " htau = 9.32 + 0.333 * exp((-v - 21) / 10.5)\n" + " }\n" + "}\n" + "UNITSON\n" + ; +#endif diff --git a/hnn_core/mod/arm64/cat.o b/hnn_core/mod/arm64/cat.o new file mode 100644 index 0000000000000000000000000000000000000000..7b19a3fa03cb9ad2d5982f6d74d470a3b24a5169 GIT binary patch literal 11088 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 b)3os`$|}(8Fq$N8pBJ|;NKsQr+1dXB94kth literal 0 HcmV?d00001 diff --git a/hnn_core/mod/arm64/dipole.c b/hnn_core/mod/arm64/dipole.c new file mode 100644 index 000000000..010ed337b --- /dev/null +++ b/hnn_core/mod/arm64/dipole.c @@ -0,0 +1,339 @@ +/* Created by Language version: 7.7.0 */ +/* NOT VECTORIZED */ +#define NRN_VECTORIZED 0 +#include +#include +#include +#include "mech_api.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 nrn_init _nrn_init__dipole +#define _nrn_initial _nrn_initial__dipole +#define nrn_cur _nrn_cur__dipole +#define _nrn_current _nrn_current__dipole +#define nrn_jacob _nrn_jacob__dipole +#define nrn_state _nrn_state__dipole +#define _net_receive _net_receive__dipole + +#define _threadargscomma_ /**/ +#define _threadargsprotocomma_ /**/ +#define _threadargs_ /**/ +#define _threadargsproto_ /**/ + /*SUPPRESS 761*/ + /*SUPPRESS 762*/ + /*SUPPRESS 763*/ + /*SUPPRESS 765*/ + extern double *getarg(); + static double *_p; static Datum *_ppvar; + +#define t nrn_threads->_t +#define dt nrn_threads->_dt +#define ia _p[0] +#define ia_columnindex 0 +#define ri _p[1] +#define ri_columnindex 1 +#define ztan _p[2] +#define ztan_columnindex 2 +#define Q _p[3] +#define Q_columnindex 3 +#define pv *_ppvar[0]._pval +#define _p_pv _ppvar[0]._pval +#define Qsum *_ppvar[1]._pval +#define _p_Qsum _ppvar[1]._pval +#define Qtotal *_ppvar[2]._pval +#define _p_Qtotal _ppvar[2]._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 = 0; + /* external NEURON variables */ + /* declaration of user functions */ + 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; + +#define NMODL_TEXT 1 +#if NMODL_TEXT +static const char* nmodl_file_text; +static const char* nmodl_filename; +extern void hoc_reg_nmodl_text(int, const char*); +extern void hoc_reg_nmodl_filename(int, const char*); +#endif + + extern void _nrn_setdata_reg(int, void(*)(Prop*)); + static void _setdata(Prop* _prop) { + _p = _prop->param; _ppvar = _prop->dparam; + } + static void _hoc_setdata() { + Prop *_prop, *hoc_getdata_range(int); + _prop = hoc_getdata_range(_mechtype); + _setdata(_prop); + hoc_retpushx(1.); +} + /* connect user functions to hoc names */ + static VoidFunc hoc_intfunc[] = { + "setdata_dipole", _hoc_setdata, + 0, 0 +}; + /* declare global and static user variables */ + /* some parameters have upper and lower limits */ + static HocParmLimits _hoc_parm_limits[] = { + 0,0,0 +}; + static HocParmUnits _hoc_parm_units[] = { + "ia_dipole", "nA", + "ri_dipole", "Mohm", + "ztan_dipole", "um", + "Q_dipole", "fAm", + "pv_dipole", "mV", + "Qsum_dipole", "fAm", + "Qtotal_dipole", "fAm", + 0,0 +}; + static double v = 0; + /* 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 _ba1(Node*_nd, double* _pp, Datum* _ppd, Datum* _thread, NrnThread* _nt) , _ba2(Node*_nd, double* _pp, Datum* _ppd, Datum* _thread, NrnThread* _nt) ; + static void nrn_alloc(Prop*); +static void nrn_init(NrnThread*, _Memb_list*, int); +static void nrn_state(NrnThread*, _Memb_list*, int); + /* connect range variables in _p that hoc is supposed to know about */ + static const char *_mechanism[] = { + "7.7.0", +"dipole", + 0, + "ia_dipole", + "ri_dipole", + "ztan_dipole", + "Q_dipole", + 0, + 0, + "pv_dipole", + "Qsum_dipole", + "Qtotal_dipole", + 0}; + +extern Prop* need_memb(Symbol*); + +static void nrn_alloc(Prop* _prop) { + Prop *prop_ion; + double *_p; Datum *_ppvar; + _p = nrn_prop_data_alloc(_mechtype, 4, _prop); + /*initialize range parameters*/ + _prop->param = _p; + _prop->param_size = 4; + _ppvar = nrn_prop_datum_alloc(_mechtype, 3, _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(*)(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 _dipole_reg() { + int _vectorized = 0; + _initlists(); + register_mech(_mechanism, nrn_alloc,(void*)0, (void*)0, (void*)0, nrn_init, hoc_nrnpointerindex, 0); + _mechtype = nrn_get_mechtype(_mechanism[1]); + _nrn_setdata_reg(_mechtype, _setdata); + #if NMODL_TEXT + hoc_reg_nmodl_text(_mechtype, nmodl_file_text); + hoc_reg_nmodl_filename(_mechtype, nmodl_filename); +#endif + hoc_register_prop_size(_mechtype, 4, 3); + hoc_register_dparam_semantics(_mechtype, 0, "pointer"); + hoc_register_dparam_semantics(_mechtype, 1, "pointer"); + hoc_register_dparam_semantics(_mechtype, 2, "pointer"); + hoc_reg_ba(_mechtype, _ba1, 22); + hoc_reg_ba(_mechtype, _ba2, 23); + hoc_register_var(hoc_scdoub, hoc_vdoub, hoc_intfunc); + ivoc_help("help ?1 dipole /Users/katharinaduecker/Documents/Projects Brown/hnn-core/hnn_core/mod/dipole.mod\n"); + hoc_register_limits(_mechtype, _hoc_parm_limits); + hoc_register_units(_mechtype, _hoc_parm_units); + } +static int _reset; +static char *modelname = ""; + +static int error; +static int _ninits = 0; +static int _match_recurse=1; +static void _modl_cleanup(){ _match_recurse=1;} + /* AFTER SOLVE */ + static void _ba1(Node*_nd, double* _pp, Datum* _ppd, Datum* _thread, NrnThread* _nt) { + _p = _pp; _ppvar = _ppd; + v = NODEV(_nd); + ia = ( pv - v ) / ri ; + Q = ia * ztan ; + Qsum = Qsum + Q ; + Qtotal = Qtotal + Q ; + } + /* AFTER INITIAL */ + static void _ba2(Node*_nd, double* _pp, Datum* _ppd, Datum* _thread, NrnThread* _nt) { + _p = _pp; _ppvar = _ppd; + v = NODEV(_nd); + ia = ( pv - v ) / ri ; + Q = ia * ztan ; + Qsum = Qsum + Q ; + Qtotal = Qtotal + Q ; + } + +static void initmodel() { + int _i; double _save;_ninits++; +{ + +} +} + +static void nrn_init(NrnThread* _nt, _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]; +#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(double _v){double _current=0.;v=_v;{ +} return _current; +} + +static void nrn_state(NrnThread* _nt, _Memb_list* _ml, int _type){ +Node *_nd; double _v = 0.0; 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); + } + v=_v; +{ +}} + +} + +static void terminal(){} + +static void _initlists() { + int _i; static int _first = 1; + if (!_first) return; +_first = 0; +} + +#if NMODL_TEXT +static const char* nmodl_filename = "/Users/katharinaduecker/Documents/Projects Brown/hnn-core/hnn_core/mod/dipole.mod"; +static const char* nmodl_file_text = + ": dipole.mod - mod file for range variable dipole\n" + ":\n" + ": v 1.9.1m0\n" + ": rev 2015-12-15 (SL: minor)\n" + ": last rev: (SL: Added back Qtotal, which WAS used in par version)\n" + "\n" + "NEURON {\n" + " SUFFIX dipole\n" + " RANGE ri, ia, Q, ztan\n" + " POINTER pv\n" + "\n" + " : for density. sums into Dipole at section position 1\n" + " POINTER Qsum\n" + " POINTER Qtotal\n" + "}\n" + "\n" + "UNITS {\n" + " (nA) = (nanoamp)\n" + " (mV) = (millivolt)\n" + " (Mohm) = (megaohm)\n" + " (um) = (micrometer)\n" + " (Am) = (amp meter)\n" + " (fAm) = (femto amp meter)\n" + "}\n" + "\n" + "ASSIGNED {\n" + " ia (nA)\n" + " ri (Mohm)\n" + " pv (mV)\n" + " v (mV)\n" + " ztan (um)\n" + " Q (fAm)\n" + "\n" + " : human dipole order of 10 nAm\n" + " Qsum (fAm)\n" + " Qtotal (fAm)\n" + "}\n" + "\n" + ": solve for v's first then use them\n" + "AFTER SOLVE {\n" + " ia = (pv - v) / ri\n" + " Q = ia * ztan\n" + " Qsum = Qsum + Q\n" + " Qtotal = Qtotal + Q\n" + "}\n" + "\n" + "AFTER INITIAL {\n" + " ia = (pv - v) / ri\n" + " Q = ia * ztan\n" + " Qsum = Qsum + Q\n" + " Qtotal = Qtotal + Q\n" + "}\n" + ; +#endif diff --git a/hnn_core/mod/arm64/dipole.o b/hnn_core/mod/arm64/dipole.o new file mode 100644 index 0000000000000000000000000000000000000000..688fdbacdc3935d499e4bb0ac41087474ea43957 GIT binary patch literal 5864 zcmeHLU2Ggz6}~%m;?2gmfd-L62{#a^o%nB4r%o)U?1uaqmc)*oA3>$@cz2wgWM^jC z89PZ$q^%kWOU;8*1(An7Sg1&L%0nVm5K9!&(ub&2B5F$%L4-^MC=aQKM5toKBEB>C z%zC}4sE~jsuJ+D%zH`n!_uQYIy?1~0xA*_iEJRG8&|?K^Uc*D8qCAFrGqi^Ep~w5H zlxm9Fpj=?y1eq$uqhc6=buv)0;={X+3@`CWy3cVaUYG`wdxngSq8#}U8b;0x%q5Ls z>`V`*m-qvY6X)E^NTh+xkEk&%c`C^;Mt#3VSsyPN*TEW}Fdp;zDKd<#ACzqODBBIA zZoG}kaG7yxWldm+oPJe_c%D-{_X!oLX>eV-p$nOY=7%F|^{%tviWSJqM=$)7`@*e z_4|gV@~Z9oHtP^;8nrq;O!4#%aOxwnkzD>4c~>UWbNBbZF$=%79~^!SGUjtqo2xu8 z&i$o9TvYRrn*Sd1qp?Lfk0iw6c#D{)*k-N1MJ!e(cOXuB?t{a>n7!Iy+-U7i&97P^ zzWqu}3@4D|*JG*q_MY@y+v(Hqp0(`ebjE(}kE=B(#BhV`84#$2X?us2%vC zT4%8s>YHq}mC4t`HG?6_mOf!{Sy@{U>Az?VBp-U+uW z@46jXuVj&cS0)6<%XO(}oe&eEx3jmiTPTgNO@pP99ZAmyrW?tFkx-n7q(Oh&smg&D zn1zV>RzN>W5p~nz8(!WKB;@9QR?fU0F0sasrEHdv04Iv2WMG1N-;M$%I51I=Fjx z|B)yY(i}+d+p|lS>~?9J?Q*bP(&UG}1N-~;4evT2ixY{E_l0B1S*~vfr#dAT!AEa_ zCwHoyVg}O3K0vRs=)s4CsvD%*Qh`-k$o2Rm#Xe*ohAkXcZu-vZ)1l)0%;zYg3Czqf%nn`N#k)C)jrmshCg zfYgri0_x3dkF&jz?SkzOFn(%(U!i^vNbT<`)E9uC0KcW|8M>>$Uw=>8GuIXBSAgXA zszQAlxDEN90aCsvfxX~)<~fCW28gqAM+*3H_2 z+zPt{;wYYZT%o=W_$2gefjD_*)+p4Qfgb~pE7Ti-xB_Kpa{=|gW1ZU3?miG_tIR!x z`duK6;||*wfH-GmZYk7n0?Ga!unX<4F@KZ!73QxprvnPEa+#ME>N7xU{}M2X_H|0_VmY`FydB5)S?8Q=^MeYacyei}Fp`~q+a_!zJV{3I|B{5+7x zMg0x{slUBI>Zcn>@mqluR{|;CIv~Y~10jc(wod`Cf@6FuXBf+jBaA6V$p{Gjo3x*5 zSG6YXN7^MkU(#mqoYv0cIi;P&v#g!L^Iq(JtVz2STfp<>*esrBVpDhqC!4ffzDeuu zY0_HTn>4vGrd@Bi*$~spjZ=*=ZK3f_qo!S3@%DfS} ziSF&+g)jLJa2u2PEc2&{qkVKQ|1;a~u$^MHV1x8x6H(c~{EyI4xrj>k=#6|i$`458 zMdtLLqVj9*Z-(=Ii}@wyuMvmu2y&wGI<-gqIQMr7I?DGN`+to%e9G+qEw=k?-l9~HJZO45J%s~xc}#w7nvVpeuDWR^XHg9&HM%Co0)%~`8wt^ z%vUhK$eex;sQ(``KTEu3y>ORbHvd0i{wDihVE!)iQ_OELr*)zDzh%CM`R|zbFu%?G zo5ZmfqW?+$iurs5^A{D|IqCaQEkPY$tmFN49PjpJ?O&+lxjIhoeSE3~@3v)pzK)Y` zt^Y6UIQ{O_+Ua{z%U`VHf2wOQjJ%gMN>)%D_wy$scGPfjr6{QX?hM0r?Vw=$f!}F_ z2fV5qbXE!fOxb~tf95C>ZUIhJ;Zj3bR2N5;cfoe*+#}60w;Upwj^SH4payo<7X_me z|E!^#Vi9+nx}c#3hx4pK7fEtLb*yaObZy@e7$EmfI+)anm((C`$wfcv4i{>cB~mPT zMZ>qBwM6K6)C$7D!KorNH6l0SnWNj7YdYjY;b|hGURCOd6J8p_+nNe(77AWgiD9R( z +#include +#include +#include "mech_api.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 nrn_init _nrn_init__Dipole +#define _nrn_initial _nrn_initial__Dipole +#define nrn_cur _nrn_cur__Dipole +#define _nrn_current _nrn_current__Dipole +#define nrn_jacob _nrn_jacob__Dipole +#define nrn_state _nrn_state__Dipole +#define _net_receive _net_receive__Dipole + +#define _threadargscomma_ /**/ +#define _threadargsprotocomma_ /**/ +#define _threadargs_ /**/ +#define _threadargsproto_ /**/ + /*SUPPRESS 761*/ + /*SUPPRESS 762*/ + /*SUPPRESS 763*/ + /*SUPPRESS 765*/ + extern double *getarg(); + static double *_p; static Datum *_ppvar; + +#define t nrn_threads->_t +#define dt nrn_threads->_dt +#define ia _p[0] +#define ia_columnindex 0 +#define ri _p[1] +#define ri_columnindex 1 +#define ztan _p[2] +#define ztan_columnindex 2 +#define Q _p[3] +#define Q_columnindex 3 +#define Qsum _p[4] +#define Qsum_columnindex 4 +#define _nd_area *_ppvar[0]._pval +#define pv *_ppvar[2]._pval +#define _p_pv _ppvar[2]._pval +#define Qtotal *_ppvar[3]._pval +#define _p_Qtotal _ppvar[3]._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 = 2; + /* external NEURON variables */ + /* declaration of user functions */ + 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; + +#define NMODL_TEXT 1 +#if NMODL_TEXT +static const char* nmodl_file_text; +static const char* nmodl_filename; +extern void hoc_reg_nmodl_text(int, const char*); +extern void hoc_reg_nmodl_filename(int, const char*); +#endif + + extern Prop* nrn_point_prop_; + static int _pointtype; + static void* _hoc_create_pnt(Object* _ho) { void* create_point_process(int, Object*); + return create_point_process(_pointtype, _ho); +} + static void _hoc_destroy_pnt(void*); + static double _hoc_loc_pnt(void* _vptr) {double loc_point_process(int, void*); + return loc_point_process(_pointtype, _vptr); +} + static double _hoc_has_loc(void* _vptr) {double has_loc_point(void*); + return has_loc_point(_vptr); +} + static double _hoc_get_loc_pnt(void* _vptr) { + double get_loc_point_process(void*); return (get_loc_point_process(_vptr)); +} + extern void _nrn_setdata_reg(int, void(*)(Prop*)); + static void _setdata(Prop* _prop) { + _p = _prop->param; _ppvar = _prop->dparam; + } + 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, + 0, 0 +}; + /* declare global and static user variables */ + /* some parameters have upper and lower limits */ + static HocParmLimits _hoc_parm_limits[] = { + 0,0,0 +}; + static HocParmUnits _hoc_parm_units[] = { + "ia", "nA", + "ri", "Mohm", + "ztan", "um", + "Q", "fAm", + "Qsum", "fAm", + "pv", "mV", + "Qtotal", "fAm", + 0,0 +}; + static double v = 0; + /* 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 _ba1(Node*_nd, double* _pp, Datum* _ppd, Datum* _thread, NrnThread* _nt) , _ba2(Node*_nd, double* _pp, Datum* _ppd, Datum* _thread, NrnThread* _nt) , _ba3(Node*_nd, double* _pp, Datum* _ppd, Datum* _thread, NrnThread* _nt) , _ba4(Node*_nd, double* _pp, Datum* _ppd, Datum* _thread, NrnThread* _nt) ; + static void nrn_alloc(Prop*); +static void nrn_init(NrnThread*, _Memb_list*, int); +static void nrn_state(NrnThread*, _Memb_list*, int); + static void _hoc_destroy_pnt(void* _vptr) { + destroy_point_process(_vptr); +} + /* connect range variables in _p that hoc is supposed to know about */ + static const char *_mechanism[] = { + "7.7.0", +"Dipole", + 0, + "ia", + "ri", + "ztan", + "Q", + "Qsum", + 0, + 0, + "pv", + "Qtotal", + 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, 5, _prop); + /*initialize range parameters*/ + } + _prop->param = _p; + _prop->param_size = 5; + if (!nrn_point_prop_) { + _ppvar = nrn_prop_datum_alloc(_mechtype, 4, _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(*)(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 _dipole_pp_reg() { + int _vectorized = 0; + _initlists(); + _pointtype = point_register_mech(_mechanism, + nrn_alloc,(void*)0, (void*)0, (void*)0, nrn_init, + hoc_nrnpointerindex, 0, + _hoc_create_pnt, _hoc_destroy_pnt, _member_func); + _mechtype = nrn_get_mechtype(_mechanism[1]); + _nrn_setdata_reg(_mechtype, _setdata); + #if NMODL_TEXT + hoc_reg_nmodl_text(_mechtype, nmodl_file_text); + hoc_reg_nmodl_filename(_mechtype, nmodl_filename); +#endif + hoc_register_prop_size(_mechtype, 5, 4); + hoc_register_dparam_semantics(_mechtype, 0, "area"); + hoc_register_dparam_semantics(_mechtype, 1, "pntproc"); + hoc_register_dparam_semantics(_mechtype, 2, "pointer"); + hoc_register_dparam_semantics(_mechtype, 3, "pointer"); + hoc_reg_ba(_mechtype, _ba1, 22); + hoc_reg_ba(_mechtype, _ba2, 23); + hoc_reg_ba(_mechtype, _ba3, 13); + hoc_reg_ba(_mechtype, _ba4, 11); + hoc_register_var(hoc_scdoub, hoc_vdoub, hoc_intfunc); + ivoc_help("help ?1 Dipole /Users/katharinaduecker/Documents/Projects Brown/hnn-core/hnn_core/mod/dipole_pp.mod\n"); + hoc_register_limits(_mechtype, _hoc_parm_limits); + hoc_register_units(_mechtype, _hoc_parm_units); + } +static int _reset; +static char *modelname = ""; + +static int error; +static int _ninits = 0; +static int _match_recurse=1; +static void _modl_cleanup(){ _match_recurse=1;} + /* AFTER SOLVE */ + static void _ba1(Node*_nd, double* _pp, Datum* _ppd, Datum* _thread, NrnThread* _nt) { + _p = _pp; _ppvar = _ppd; + v = NODEV(_nd); + ia = ( pv - v ) / ri ; + Q = ia * ztan ; + Qsum = Qsum + Q ; + Qtotal = Qtotal + Q ; + } + /* AFTER INITIAL */ + static void _ba2(Node*_nd, double* _pp, Datum* _ppd, Datum* _thread, NrnThread* _nt) { + _p = _pp; _ppvar = _ppd; + v = NODEV(_nd); + ia = ( pv - v ) / ri ; + Q = ia * ztan ; + Qsum = Qsum + Q ; + Qtotal = Qtotal + Q ; + } + /* BEFORE INITIAL */ + static void _ba3(Node*_nd, double* _pp, Datum* _ppd, Datum* _thread, NrnThread* _nt) { + _p = _pp; _ppvar = _ppd; + v = NODEV(_nd); + Qsum = 0.0 ; + Qtotal = 0.0 ; + } + /* BEFORE BREAKPOINT */ + static void _ba4(Node*_nd, double* _pp, Datum* _ppd, Datum* _thread, NrnThread* _nt) { + _p = _pp; _ppvar = _ppd; + v = NODEV(_nd); + Qsum = 0.0 ; + Qtotal = 0.0 ; + } + +static void initmodel() { + int _i; double _save;_ninits++; +{ + +} +} + +static void nrn_init(NrnThread* _nt, _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]; +#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(double _v){double _current=0.;v=_v;{ +} return _current; +} + +static void nrn_state(NrnThread* _nt, _Memb_list* _ml, int _type){ +Node *_nd; double _v = 0.0; 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); + } + v=_v; +{ +}} + +} + +static void terminal(){} + +static void _initlists() { + int _i; static int _first = 1; + if (!_first) return; +_first = 0; +} + +#if NMODL_TEXT +static const char* nmodl_filename = "/Users/katharinaduecker/Documents/Projects Brown/hnn-core/hnn_core/mod/dipole_pp.mod"; +static const char* nmodl_file_text = + ": dipole_pp.mod - creates point process mechanism Dipole\n" + ":\n" + ": v 1.9.1m0\n" + ": rev 2015-12-15 (SL: minor)\n" + ": last rev: (SL: added Qtotal back, used for par calc)\n" + "\n" + "NEURON {\n" + " POINT_PROCESS Dipole\n" + " RANGE ri, ia, Q, ztan\n" + " POINTER pv\n" + "\n" + " : for POINT_PROCESS. Gets additions from dipole\n" + " RANGE Qsum\n" + " POINTER Qtotal\n" + "}\n" + "\n" + "UNITS {\n" + " (nA) = (nanoamp)\n" + " (mV) = (millivolt)\n" + " (Mohm) = (megaohm)\n" + " (um) = (micrometer)\n" + " (Am) = (amp meter)\n" + " (fAm) = (femto amp meter)\n" + "}\n" + "\n" + "ASSIGNED {\n" + " ia (nA)\n" + " ri (Mohm) : internal resistance\n" + " pv (mV)\n" + " v (mV)\n" + " ztan (um)\n" + " Q (fAm)\n" + " Qsum (fAm)\n" + " Qtotal (fAm)\n" + "}\n" + "\n" + ": solve for v's first then use them\n" + "AFTER SOLVE {\n" + " ia = (pv - v) / ri\n" + " Q = ia * ztan\n" + " Qsum = Qsum + Q\n" + " Qtotal = Qtotal + Q\n" + "}\n" + "\n" + "AFTER INITIAL {\n" + " ia = (pv - v) / ri\n" + " Q = ia * ztan\n" + " Qsum = Qsum + Q\n" + " Qtotal = Qtotal + Q\n" + "}\n" + "\n" + ": following needed for POINT_PROCESS only but will work if also in SUFFIX\n" + "BEFORE INITIAL {\n" + " Qsum = 0\n" + " Qtotal = 0\n" + "}\n" + "\n" + "BEFORE BREAKPOINT {\n" + " Qsum = 0\n" + " Qtotal = 0\n" + "}\n" + ; +#endif diff --git a/hnn_core/mod/arm64/dipole_pp.o b/hnn_core/mod/arm64/dipole_pp.o new file mode 100644 index 0000000000000000000000000000000000000000..cbb18bd4f196cd73d7f3f619414bcb8c5f24fc45 GIT binary patch literal 7296 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 literal 0 HcmV?d00001 diff --git a/hnn_core/mod/arm64/hh2.c b/hnn_core/mod/arm64/hh2.c new file mode 100644 index 000000000..c5946d715 --- /dev/null +++ b/hnn_core/mod/arm64/hh2.c @@ -0,0 +1,883 @@ +/* Created by Language version: 7.7.0 */ +/* VECTORIZED */ +#define NRN_VECTORIZED 1 +#include +#include +#include +#include "mech_api.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 nrn_init _nrn_init__hh2 +#define _nrn_initial _nrn_initial__hh2 +#define nrn_cur _nrn_cur__hh2 +#define _nrn_current _nrn_current__hh2 +#define nrn_jacob _nrn_jacob__hh2 +#define nrn_state _nrn_state__hh2 +#define _net_receive _net_receive__hh2 +#define _f_rates _f_rates__hh2 +#define rates rates__hh2 +#define states states__hh2 + +#define _threadargscomma_ _p, _ppvar, _thread, _nt, +#define _threadargsprotocomma_ double* _p, Datum* _ppvar, Datum* _thread, NrnThread* _nt, +#define _threadargs_ _p, _ppvar, _thread, _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 gnabar _p[0] +#define gnabar_columnindex 0 +#define gkbar _p[1] +#define gkbar_columnindex 1 +#define gl _p[2] +#define gl_columnindex 2 +#define el _p[3] +#define el_columnindex 3 +#define gna _p[4] +#define gna_columnindex 4 +#define gk _p[5] +#define gk_columnindex 5 +#define il _p[6] +#define il_columnindex 6 +#define m _p[7] +#define m_columnindex 7 +#define h _p[8] +#define h_columnindex 8 +#define n _p[9] +#define n_columnindex 9 +#define Dm _p[10] +#define Dm_columnindex 10 +#define Dh _p[11] +#define Dh_columnindex 11 +#define Dn _p[12] +#define Dn_columnindex 12 +#define ena _p[13] +#define ena_columnindex 13 +#define ek _p[14] +#define ek_columnindex 14 +#define ina _p[15] +#define ina_columnindex 15 +#define ik _p[16] +#define ik_columnindex 16 +#define v _p[17] +#define v_columnindex 17 +#define _g _p[18] +#define _g_columnindex 18 +#define _ion_ena *_ppvar[0]._pval +#define _ion_ina *_ppvar[1]._pval +#define _ion_dinadv *_ppvar[2]._pval +#define _ion_ek *_ppvar[3]._pval +#define _ion_ik *_ppvar[4]._pval +#define _ion_dikdv *_ppvar[5]._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 */ + extern double celsius; + /* declaration of user functions */ + static void _hoc_rates(void); + static void _hoc_vtrap(void); + 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; + +#define NMODL_TEXT 1 +#if NMODL_TEXT +static const char* nmodl_file_text; +static const char* nmodl_filename; +extern void hoc_reg_nmodl_text(int, const char*); +extern void hoc_reg_nmodl_filename(int, const char*); +#endif + + extern void _nrn_setdata_reg(int, void(*)(Prop*)); + static void _setdata(Prop* _prop) { + _extcall_prop = _prop; + } + static void _hoc_setdata() { + Prop *_prop, *hoc_getdata_range(int); + _prop = hoc_getdata_range(_mechtype); + _setdata(_prop); + hoc_retpushx(1.); +} + /* connect user functions to hoc names */ + static VoidFunc hoc_intfunc[] = { + "setdata_hh2", _hoc_setdata, + "rates_hh2", _hoc_rates, + "vtrap_hh2", _hoc_vtrap, + 0, 0 +}; +#define vtrap vtrap_hh2 + extern double vtrap( _threadargsprotocomma_ double , double ); + +static void _check_rates(double*, Datum*, Datum*, NrnThread*); +static void _check_table_thread(double* _p, Datum* _ppvar, Datum* _thread, NrnThread* _nt, int _type) { + _check_rates(_p, _ppvar, _thread, _nt); + } + /* declare global and static user variables */ + static int _thread1data_inuse = 0; +static double _thread1data[6]; +#define _gth 0 +#define htau_hh2 _thread1data[0] +#define htau _thread[_gth]._pval[0] +#define hinf_hh2 _thread1data[1] +#define hinf _thread[_gth]._pval[1] +#define mtau_hh2 _thread1data[2] +#define mtau _thread[_gth]._pval[2] +#define minf_hh2 _thread1data[3] +#define minf _thread[_gth]._pval[3] +#define ntau_hh2 _thread1data[4] +#define ntau _thread[_gth]._pval[4] +#define ninf_hh2 _thread1data[5] +#define ninf _thread[_gth]._pval[5] +#define temp temp_hh2 + double temp = 6.3; +#define tshift tshift_hh2 + double tshift = 30.7; +#define usetable usetable_hh2 + double usetable = 1; + /* some parameters have upper and lower limits */ + static HocParmLimits _hoc_parm_limits[] = { + "gl_hh2", 0, 1e+09, + "gkbar_hh2", 0, 1e+09, + "gnabar_hh2", 0, 1e+09, + "usetable_hh2", 0, 1, + 0,0,0 +}; + static HocParmUnits _hoc_parm_units[] = { + "mtau_hh2", "ms", + "htau_hh2", "ms", + "ntau_hh2", "ms", + "gnabar_hh2", "S/cm2", + "gkbar_hh2", "S/cm2", + "gl_hh2", "S/cm2", + "el_hh2", "mV", + "gna_hh2", "S/cm2", + "gk_hh2", "S/cm2", + "il_hh2", "mA/cm2", + 0,0 +}; + static double delta_t = 0.01; + static double h0 = 0; + static double m0 = 0; + static double n0 = 0; + /* connect global user variables to hoc */ + static DoubScal hoc_scdoub[] = { + "temp_hh2", &temp_hh2, + "tshift_hh2", &tshift_hh2, + "minf_hh2", &minf_hh2, + "hinf_hh2", &hinf_hh2, + "ninf_hh2", &ninf_hh2, + "mtau_hh2", &mtau_hh2, + "htau_hh2", &htau_hh2, + "ntau_hh2", &ntau_hh2, + "usetable_hh2", &usetable_hh2, + 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 int _ode_count(int); +static void _ode_map(int, double**, double**, double*, Datum*, double*, int); +static void _ode_spec(NrnThread*, _Memb_list*, int); +static void _ode_matsol(NrnThread*, _Memb_list*, int); + +#define _cvode_ieq _ppvar[6]._i + static void _ode_matsol_instance1(_threadargsproto_); + /* connect range variables in _p that hoc is supposed to know about */ + static const char *_mechanism[] = { + "7.7.0", +"hh2", + "gnabar_hh2", + "gkbar_hh2", + "gl_hh2", + "el_hh2", + 0, + "gna_hh2", + "gk_hh2", + "il_hh2", + 0, + "m_hh2", + "h_hh2", + "n_hh2", + 0, + 0}; + static Symbol* _na_sym; + static Symbol* _k_sym; + +extern Prop* need_memb(Symbol*); + +static void nrn_alloc(Prop* _prop) { + Prop *prop_ion; + double *_p; Datum *_ppvar; + _p = nrn_prop_data_alloc(_mechtype, 19, _prop); + /*initialize range parameters*/ + gnabar = 0.12; + gkbar = 0.036; + gl = 0.0003; + el = -54.3; + _prop->param = _p; + _prop->param_size = 19; + _ppvar = nrn_prop_datum_alloc(_mechtype, 7, _prop); + _prop->dparam = _ppvar; + /*connect ionic variables to this model*/ + prop_ion = need_memb(_na_sym); + nrn_promote(prop_ion, 0, 1); + _ppvar[0]._pval = &prop_ion->param[0]; /* ena */ + _ppvar[1]._pval = &prop_ion->param[3]; /* ina */ + _ppvar[2]._pval = &prop_ion->param[4]; /* _ion_dinadv */ + prop_ion = need_memb(_k_sym); + nrn_promote(prop_ion, 0, 1); + _ppvar[3]._pval = &prop_ion->param[0]; /* ek */ + _ppvar[4]._pval = &prop_ion->param[3]; /* ik */ + _ppvar[5]._pval = &prop_ion->param[4]; /* _ion_dikdv */ + +} + static void _initlists(); + /* some states have an absolute tolerance */ + static Symbol** _atollist; + static HocStateTolerance _hoc_state_tol[] = { + 0,0 +}; + static void _thread_mem_init(Datum*); + static void _thread_cleanup(Datum*); + static void _update_ion_pointer(Datum*); + extern Symbol* hoc_lookup(const char*); +extern void _nrn_thread_reg(int, int, void(*)(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 _hh2_reg() { + int _vectorized = 1; + _initlists(); + ion_reg("na", -10000.); + ion_reg("k", -10000.); + _na_sym = hoc_lookup("na_ion"); + _k_sym = hoc_lookup("k_ion"); + register_mech(_mechanism, nrn_alloc,nrn_cur, nrn_jacob, nrn_state, nrn_init, hoc_nrnpointerindex, 2); + _extcall_thread = (Datum*)ecalloc(1, sizeof(Datum)); + _thread_mem_init(_extcall_thread); + _thread1data_inuse = 0; + _mechtype = nrn_get_mechtype(_mechanism[1]); + _nrn_setdata_reg(_mechtype, _setdata); + _nrn_thread_reg(_mechtype, 1, _thread_mem_init); + _nrn_thread_reg(_mechtype, 0, _thread_cleanup); + _nrn_thread_reg(_mechtype, 2, _update_ion_pointer); + _nrn_thread_table_reg(_mechtype, _check_table_thread); + #if NMODL_TEXT + hoc_reg_nmodl_text(_mechtype, nmodl_file_text); + hoc_reg_nmodl_filename(_mechtype, nmodl_filename); +#endif + hoc_register_prop_size(_mechtype, 19, 7); + hoc_register_dparam_semantics(_mechtype, 0, "na_ion"); + hoc_register_dparam_semantics(_mechtype, 1, "na_ion"); + hoc_register_dparam_semantics(_mechtype, 2, "na_ion"); + hoc_register_dparam_semantics(_mechtype, 3, "k_ion"); + hoc_register_dparam_semantics(_mechtype, 4, "k_ion"); + hoc_register_dparam_semantics(_mechtype, 5, "k_ion"); + hoc_register_dparam_semantics(_mechtype, 6, "cvodeieq"); + hoc_register_cvode(_mechtype, _ode_count, _ode_map, _ode_spec, _ode_matsol); + hoc_register_tolerance(_mechtype, _hoc_state_tol, &_atollist); + hoc_register_var(hoc_scdoub, hoc_vdoub, hoc_intfunc); + ivoc_help("help ?1 hh2 /Users/katharinaduecker/Documents/Projects Brown/hnn-core/hnn_core/mod/hh2.mod\n"); + hoc_register_limits(_mechtype, _hoc_parm_limits); + hoc_register_units(_mechtype, _hoc_parm_units); + } + static double *_t_minf; + static double *_t_mtau; + static double *_t_hinf; + static double *_t_htau; + static double *_t_ninf; + static double *_t_ntau; +static int _reset; +static char *modelname = "hh2.mod sodium, potassium, and leak channels"; + +static int error; +static int _ninits = 0; +static int _match_recurse=1; +static void _modl_cleanup(){ _match_recurse=1;} +static int _f_rates(_threadargsprotocomma_ double); +static int rates(_threadargsprotocomma_ double); + +static int _ode_spec1(_threadargsproto_); +/*static int _ode_matsol1(_threadargsproto_);*/ + static void _n_rates(_threadargsprotocomma_ double _lv); + static int _slist1[3], _dlist1[3]; + static int states(_threadargsproto_); + +/*CVODE*/ + static int _ode_spec1 (double* _p, Datum* _ppvar, Datum* _thread, NrnThread* _nt) {int _reset = 0; { + rates ( _threadargscomma_ v ) ; + Dm = ( minf - m ) / mtau ; + Dh = ( hinf - h ) / htau ; + Dn = ( ninf - n ) / ntau ; + } + return _reset; +} + static int _ode_matsol1 (double* _p, Datum* _ppvar, Datum* _thread, NrnThread* _nt) { + rates ( _threadargscomma_ v ) ; + Dm = Dm / (1. - dt*( ( ( ( - 1.0 ) ) ) / mtau )) ; + Dh = Dh / (1. - dt*( ( ( ( - 1.0 ) ) ) / htau )) ; + Dn = Dn / (1. - dt*( ( ( ( - 1.0 ) ) ) / ntau )) ; + return 0; +} + /*END CVODE*/ + static int states (double* _p, Datum* _ppvar, Datum* _thread, NrnThread* _nt) { { + rates ( _threadargscomma_ v ) ; + m = m + (1. - exp(dt*(( ( ( - 1.0 ) ) ) / mtau)))*(- ( ( ( minf ) ) / mtau ) / ( ( ( ( - 1.0 ) ) ) / mtau ) - m) ; + h = h + (1. - exp(dt*(( ( ( - 1.0 ) ) ) / htau)))*(- ( ( ( hinf ) ) / htau ) / ( ( ( ( - 1.0 ) ) ) / htau ) - h) ; + n = n + (1. - exp(dt*(( ( ( - 1.0 ) ) ) / ntau)))*(- ( ( ( ninf ) ) / ntau ) / ( ( ( ( - 1.0 ) ) ) / ntau ) - n) ; + } + return 0; +} + static double _mfac_rates, _tmin_rates; + static void _check_rates(double* _p, Datum* _ppvar, Datum* _thread, NrnThread* _nt) { + static int _maktable=1; int _i, _j, _ix = 0; + double _xi, _tmax; + static double _sav_celsius; + if (!usetable) {return;} + if (_sav_celsius != celsius) { _maktable = 1;} + if (_maktable) { double _x, _dx; _maktable=0; + _tmin_rates = - 100.0 ; + _tmax = 100.0 ; + _dx = (_tmax - _tmin_rates)/200.; _mfac_rates = 1./_dx; + for (_i=0, _x=_tmin_rates; _i < 201; _x += _dx, _i++) { + _f_rates(_p, _ppvar, _thread, _nt, _x); + _t_minf[_i] = minf; + _t_mtau[_i] = mtau; + _t_hinf[_i] = hinf; + _t_htau[_i] = htau; + _t_ninf[_i] = ninf; + _t_ntau[_i] = ntau; + } + _sav_celsius = celsius; + } + } + + static int rates(double* _p, Datum* _ppvar, Datum* _thread, NrnThread* _nt, double _lv) { +#if 0 +_check_rates(_p, _ppvar, _thread, _nt); +#endif + _n_rates(_p, _ppvar, _thread, _nt, _lv); + return 0; + } + + static void _n_rates(double* _p, Datum* _ppvar, Datum* _thread, NrnThread* _nt, double _lv){ int _i, _j; + double _xi, _theta; + if (!usetable) { + _f_rates(_p, _ppvar, _thread, _nt, _lv); return; +} + _xi = _mfac_rates * (_lv - _tmin_rates); + if (isnan(_xi)) { + minf = _xi; + mtau = _xi; + hinf = _xi; + htau = _xi; + ninf = _xi; + ntau = _xi; + return; + } + if (_xi <= 0.) { + minf = _t_minf[0]; + mtau = _t_mtau[0]; + hinf = _t_hinf[0]; + htau = _t_htau[0]; + ninf = _t_ninf[0]; + ntau = _t_ntau[0]; + return; } + if (_xi >= 200.) { + minf = _t_minf[200]; + mtau = _t_mtau[200]; + hinf = _t_hinf[200]; + htau = _t_htau[200]; + ninf = _t_ninf[200]; + ntau = _t_ntau[200]; + return; } + _i = (int) _xi; + _theta = _xi - (double)_i; + minf = _t_minf[_i] + _theta*(_t_minf[_i+1] - _t_minf[_i]); + mtau = _t_mtau[_i] + _theta*(_t_mtau[_i+1] - _t_mtau[_i]); + hinf = _t_hinf[_i] + _theta*(_t_hinf[_i+1] - _t_hinf[_i]); + htau = _t_htau[_i] + _theta*(_t_htau[_i+1] - _t_htau[_i]); + ninf = _t_ninf[_i] + _theta*(_t_ninf[_i+1] - _t_ninf[_i]); + ntau = _t_ntau[_i] + _theta*(_t_ntau[_i+1] - _t_ntau[_i]); + } + + +static int _f_rates ( _threadargsprotocomma_ double _lv ) { + double _lalpha , _lbeta , _lsum , _lq10 ; + _lq10 = pow( 3.0 , ( ( celsius - temp - tshift ) / 10.0 ) ) ; + _lalpha = .1 * vtrap ( _threadargscomma_ - ( _lv + 40.0 ) , 10.0 ) ; + _lbeta = 4.0 * exp ( - ( _lv + 65.0 ) / 18.0 ) ; + _lsum = _lalpha + _lbeta ; + mtau = 1.0 / ( _lq10 * _lsum ) ; + minf = _lalpha / _lsum ; + _lalpha = .07 * exp ( - ( _lv + 65.0 ) / 20.0 ) ; + _lbeta = 1.0 / ( exp ( - ( _lv + 35.0 ) / 10.0 ) + 1.0 ) ; + _lsum = _lalpha + _lbeta ; + htau = 1.0 / ( _lq10 * _lsum ) ; + hinf = _lalpha / _lsum ; + _lalpha = .01 * vtrap ( _threadargscomma_ - ( _lv + 55.0 ) , 10.0 ) ; + _lbeta = .125 * exp ( - ( _lv + 65.0 ) / 80.0 ) ; + _lsum = _lalpha + _lbeta ; + ntau = 1.0 / ( _lq10 * _lsum ) ; + ninf = _lalpha / _lsum ; + return 0; } + +static void _hoc_rates(void) { + double _r; + double* _p; Datum* _ppvar; Datum* _thread; NrnThread* _nt; + if (_extcall_prop) {_p = _extcall_prop->param; _ppvar = _extcall_prop->dparam;}else{ _p = (double*)0; _ppvar = (Datum*)0; } + _thread = _extcall_thread; + _nt = nrn_threads; + +#if 1 + _check_rates(_p, _ppvar, _thread, _nt); +#endif + _r = 1.; + rates ( _p, _ppvar, _thread, _nt, *getarg(1) ); + hoc_retpushx(_r); +} + +double vtrap ( _threadargsprotocomma_ double _lx , double _ly ) { + double _lvtrap; + if ( fabs ( _lx / _ly ) < 1e-6 ) { + _lvtrap = _ly * ( 1.0 - _lx / _ly / 2.0 ) ; + } + else { + _lvtrap = _lx / ( exp ( _lx / _ly ) - 1.0 ) ; + } + +return _lvtrap; + } + +static void _hoc_vtrap(void) { + double _r; + double* _p; Datum* _ppvar; Datum* _thread; NrnThread* _nt; + if (_extcall_prop) {_p = _extcall_prop->param; _ppvar = _extcall_prop->dparam;}else{ _p = (double*)0; _ppvar = (Datum*)0; } + _thread = _extcall_thread; + _nt = nrn_threads; + _r = vtrap ( _p, _ppvar, _thread, _nt, *getarg(1) , *getarg(2) ); + hoc_retpushx(_r); +} + +static int _ode_count(int _type){ return 3;} + +static void _ode_spec(NrnThread* _nt, _Memb_list* _ml, int _type) { + double* _p; Datum* _ppvar; Datum* _thread; + Node* _nd; double _v; int _iml, _cntml; + _cntml = _ml->_nodecount; + _thread = _ml->_thread; + for (_iml = 0; _iml < _cntml; ++_iml) { + _p = _ml->_data[_iml]; _ppvar = _ml->_pdata[_iml]; + _nd = _ml->_nodelist[_iml]; + v = NODEV(_nd); + ena = _ion_ena; + ek = _ion_ek; + _ode_spec1 (_p, _ppvar, _thread, _nt); + }} + +static void _ode_map(int _ieq, double** _pv, double** _pvdot, double* _pp, Datum* _ppd, double* _atol, int _type) { + double* _p; Datum* _ppvar; + int _i; _p = _pp; _ppvar = _ppd; + _cvode_ieq = _ieq; + for (_i=0; _i < 3; ++_i) { + _pv[_i] = _pp + _slist1[_i]; _pvdot[_i] = _pp + _dlist1[_i]; + _cvode_abstol(_atollist, _atol, _i); + } + } + +static void _ode_matsol_instance1(_threadargsproto_) { + _ode_matsol1 (_p, _ppvar, _thread, _nt); + } + +static void _ode_matsol(NrnThread* _nt, _Memb_list* _ml, int _type) { + double* _p; Datum* _ppvar; Datum* _thread; + Node* _nd; double _v; int _iml, _cntml; + _cntml = _ml->_nodecount; + _thread = _ml->_thread; + for (_iml = 0; _iml < _cntml; ++_iml) { + _p = _ml->_data[_iml]; _ppvar = _ml->_pdata[_iml]; + _nd = _ml->_nodelist[_iml]; + v = NODEV(_nd); + ena = _ion_ena; + ek = _ion_ek; + _ode_matsol_instance1(_threadargs_); + }} + +static void _thread_mem_init(Datum* _thread) { + if (_thread1data_inuse) {_thread[_gth]._pval = (double*)ecalloc(6, sizeof(double)); + }else{ + _thread[_gth]._pval = _thread1data; _thread1data_inuse = 1; + } + } + +static void _thread_cleanup(Datum* _thread) { + if (_thread[_gth]._pval == _thread1data) { + _thread1data_inuse = 0; + }else{ + free((void*)_thread[_gth]._pval); + } + } + extern void nrn_update_ion_pointer(Symbol*, Datum*, int, int); + static void _update_ion_pointer(Datum* _ppvar) { + nrn_update_ion_pointer(_na_sym, _ppvar, 0, 0); + nrn_update_ion_pointer(_na_sym, _ppvar, 1, 3); + nrn_update_ion_pointer(_na_sym, _ppvar, 2, 4); + nrn_update_ion_pointer(_k_sym, _ppvar, 3, 0); + nrn_update_ion_pointer(_k_sym, _ppvar, 4, 3); + nrn_update_ion_pointer(_k_sym, _ppvar, 5, 4); + } + +static void initmodel(double* _p, Datum* _ppvar, Datum* _thread, NrnThread* _nt) { + int _i; double _save;{ + h = h0; + m = m0; + n = n0; + { + rates ( _threadargscomma_ v ) ; + m = minf ; + h = hinf ; + n = ninf ; + } + +} +} + +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 0 + _check_rates(_p, _ppvar, _thread, _nt); +#endif +#if CACHEVEC + if (use_cachevec) { + _v = VEC_V(_ni[_iml]); + }else +#endif + { + _nd = _ml->_nodelist[_iml]; + _v = NODEV(_nd); + } + v = _v; + ena = _ion_ena; + ek = _ion_ek; + initmodel(_p, _ppvar, _thread, _nt); + } +} + +static double _nrn_current(double* _p, Datum* _ppvar, Datum* _thread, NrnThread* _nt, double _v){double _current=0.;v=_v;{ { + gna = gnabar * m * m * m * h ; + ina = gna * ( v - ena ) ; + gk = gkbar * n * n * n * n ; + ik = gk * ( v - ek ) ; + il = gl * ( v - el ) ; + } + _current += ina; + _current += ik; + _current += il; + +} 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 CACHEVEC + if (use_cachevec) { + _v = VEC_V(_ni[_iml]); + }else +#endif + { + _nd = _ml->_nodelist[_iml]; + _v = NODEV(_nd); + } + ena = _ion_ena; + ek = _ion_ek; + _g = _nrn_current(_p, _ppvar, _thread, _nt, _v + .001); + { double _dik; + double _dina; + _dina = ina; + _dik = ik; + _rhs = _nrn_current(_p, _ppvar, _thread, _nt, _v); + _ion_dinadv += (_dina - ina)/.001 ; + _ion_dikdv += (_dik - ik)/.001 ; + } + _g = (_g - _rhs)/.001; + _ion_ina += ina ; + _ion_ik += ik ; +#if CACHEVEC + if (use_cachevec) { + VEC_RHS(_ni[_iml]) -= _rhs; + }else +#endif + { + NODERHS(_nd) -= _rhs; + } + +} + +} + +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]; +#if CACHEVEC + if (use_cachevec) { + VEC_D(_ni[_iml]) += _g; + }else +#endif + { + _nd = _ml->_nodelist[_iml]; + NODED(_nd) += _g; + } + +} + +} + +static void nrn_state(NrnThread* _nt, _Memb_list* _ml, int _type) { +double* _p; Datum* _ppvar; Datum* _thread; +Node *_nd; double _v = 0.0; 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 CACHEVEC + if (use_cachevec) { + _v = VEC_V(_ni[_iml]); + }else +#endif + { + _nd = _ml->_nodelist[_iml]; + _v = NODEV(_nd); + } + v=_v; +{ + ena = _ion_ena; + ek = _ion_ek; + { states(_p, _ppvar, _thread, _nt); + } }} + +} + +static void terminal(){} + +static void _initlists(){ + double _x; double* _p = &_x; + int _i; static int _first = 1; + if (!_first) return; + _slist1[0] = m_columnindex; _dlist1[0] = Dm_columnindex; + _slist1[1] = h_columnindex; _dlist1[1] = Dh_columnindex; + _slist1[2] = n_columnindex; _dlist1[2] = Dn_columnindex; + _t_minf = makevector(201*sizeof(double)); + _t_mtau = makevector(201*sizeof(double)); + _t_hinf = makevector(201*sizeof(double)); + _t_htau = makevector(201*sizeof(double)); + _t_ninf = makevector(201*sizeof(double)); + _t_ntau = makevector(201*sizeof(double)); +_first = 0; +} + +#if defined(__cplusplus) +} /* extern "C" */ +#endif + +#if NMODL_TEXT +static const char* nmodl_filename = "/Users/katharinaduecker/Documents/Projects Brown/hnn-core/hnn_core/mod/hh2.mod"; +static const char* nmodl_file_text = + "TITLE hh2.mod sodium, potassium, and leak channels\n" + " \n" + "COMMENT\n" + " This is an adjusted Hodgkin-Huxley treatment for sodium, \n" + " potassium, and leakage channels.\n" + " Membrane voltage is in absolute mV and has been reversed in polarity\n" + " from the original HH convention and shifted to reflect a resting potential\n" + " of -65 mV.\n" + " Remember to set celsius in your HOC file.\n" + "ENDCOMMENT\n" + " \n" + "UNITS {\n" + " (mA) = (milliamp)\n" + " (mV) = (millivolt)\n" + " (S) = (siemens)\n" + "}\n" + " \n" + "? interface\n" + "NEURON {\n" + " SUFFIX hh2\n" + " USEION na READ ena WRITE ina\n" + " USEION k READ ek WRITE ik\n" + " NONSPECIFIC_CURRENT il\n" + " RANGE gnabar, gkbar, gl, el, gna, gk\n" + " GLOBAL minf, hinf, ninf, mtau, htau, ntau, tshift, temp\n" + " THREADSAFE : assigned GLOBALs will be per thread\n" + "}\n" + " \n" + "PARAMETER {\n" + " gnabar = .12 (S/cm2) <0,1e9>\n" + " gkbar = .036 (S/cm2) <0,1e9>\n" + " gl = .0003 (S/cm2) <0,1e9>\n" + " el = -54.3 (mV)\n" + " temp = 6.3\n" + " tshift = 30.7\n" + "}\n" + " \n" + "STATE {\n" + " m h n\n" + "}\n" + " \n" + "ASSIGNED {\n" + " v (mV)\n" + " celsius (degC)\n" + " ena (mV)\n" + " ek (mV)\n" + "\n" + " gna (S/cm2)\n" + " gk (S/cm2)\n" + " ina (mA/cm2)\n" + " ik (mA/cm2)\n" + " il (mA/cm2)\n" + " minf hinf ninf\n" + " mtau (ms) htau (ms) ntau (ms)\n" + "}\n" + " \n" + "? currents\n" + "BREAKPOINT {\n" + " SOLVE states METHOD cnexp\n" + " gna = gnabar*m*m*m*h\n" + " ina = gna*(v - ena)\n" + " gk = gkbar*n*n*n*n\n" + " ik = gk*(v - ek) \n" + " il = gl*(v - el)\n" + "}\n" + " \n" + " \n" + "INITIAL {\n" + " rates(v)\n" + " m = minf\n" + " h = hinf\n" + " n = ninf\n" + "}\n" + "\n" + "? states\n" + "DERIVATIVE states { \n" + " rates(v)\n" + " m' = (minf-m)/mtau\n" + " h' = (hinf-h)/htau\n" + " n' = (ninf-n)/ntau\n" + "}\n" + " \n" + ":LOCAL q10\n" + "\n" + "\n" + "? rates\n" + "PROCEDURE rates(v(mV)) { :Computes rate and other constants at current v.\n" + " :Call once from HOC to initialize inf at resting v.\n" + " LOCAL alpha, beta, sum, q10\n" + " TABLE minf, mtau, hinf, htau, ninf, ntau DEPEND celsius FROM -100 TO 100 WITH 200\n" + "\n" + "UNITSOFF\n" + " q10 = 3^((celsius - temp - tshift)/10)\n" + " :\"m\" sodium activation system\n" + " alpha = .1 * vtrap(-(v+40),10)\n" + " beta = 4 * exp(-(v+65)/18)\n" + " sum = alpha + beta\n" + " mtau = 1/(q10*sum)\n" + " minf = alpha/sum\n" + " :\"h\" sodium inactivation system\n" + " alpha = .07 * exp(-(v+65)/20)\n" + " beta = 1 / (exp(-(v+35)/10) + 1)\n" + " sum = alpha + beta\n" + " htau = 1/(q10*sum)\n" + " hinf = alpha/sum\n" + " :\"n\" potassium activation system\n" + " alpha = .01*vtrap(-(v+55),10) \n" + " beta = .125*exp(-(v+65)/80)\n" + " sum = alpha + beta\n" + " ntau = 1/(q10*sum)\n" + " ninf = alpha/sum\n" + "}\n" + " \n" + "FUNCTION vtrap(x,y) { :Traps for 0 in denominator of rate eqns.\n" + " if (fabs(x/y) < 1e-6) {\n" + " vtrap = y*(1 - x/y/2)\n" + " }else{\n" + " vtrap = x/(exp(x/y) - 1)\n" + " }\n" + "}\n" + " \n" + "UNITSON\n" + ; +#endif diff --git a/hnn_core/mod/arm64/hh2.o b/hnn_core/mod/arm64/hh2.o new file mode 100644 index 0000000000000000000000000000000000000000..dac6fd77eed5d3abf7d20078335ce0809b8cc447 GIT binary patch literal 18496 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 +#include +#include +#include "mech_api.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 nrn_init _nrn_init__kca +#define _nrn_initial _nrn_initial__kca +#define nrn_cur _nrn_cur__kca +#define _nrn_current _nrn_current__kca +#define nrn_jacob _nrn_jacob__kca +#define nrn_state _nrn_state__kca +#define _net_receive _net_receive__kca +#define rates rates__kca +#define states states__kca + +#define _threadargscomma_ /**/ +#define _threadargsprotocomma_ /**/ +#define _threadargs_ /**/ +#define _threadargsproto_ /**/ + /*SUPPRESS 761*/ + /*SUPPRESS 762*/ + /*SUPPRESS 763*/ + /*SUPPRESS 765*/ + extern double *getarg(); + static double *_p; static Datum *_ppvar; + +#define t nrn_threads->_t +#define dt nrn_threads->_dt +#define gbar _p[0] +#define gbar_columnindex 0 +#define gk _p[1] +#define gk_columnindex 1 +#define ninf _p[2] +#define ninf_columnindex 2 +#define ntau _p[3] +#define ntau_columnindex 3 +#define n _p[4] +#define n_columnindex 4 +#define cai _p[5] +#define cai_columnindex 5 +#define a _p[6] +#define a_columnindex 6 +#define b _p[7] +#define b_columnindex 7 +#define ik _p[8] +#define ik_columnindex 8 +#define ek _p[9] +#define ek_columnindex 9 +#define Dn _p[10] +#define Dn_columnindex 10 +#define _g _p[11] +#define _g_columnindex 11 +#define _ion_ek *_ppvar[0]._pval +#define _ion_ik *_ppvar[1]._pval +#define _ion_dikdv *_ppvar[2]._pval +#define _ion_cai *_ppvar[3]._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; + /* external NEURON variables */ + extern double celsius; + /* declaration of user functions */ + static void _hoc_rates(void); + 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; + +#define NMODL_TEXT 1 +#if NMODL_TEXT +static const char* nmodl_file_text; +static const char* nmodl_filename; +extern void hoc_reg_nmodl_text(int, const char*); +extern void hoc_reg_nmodl_filename(int, const char*); +#endif + + extern void _nrn_setdata_reg(int, void(*)(Prop*)); + static void _setdata(Prop* _prop) { + _p = _prop->param; _ppvar = _prop->dparam; + } + static void _hoc_setdata() { + Prop *_prop, *hoc_getdata_range(int); + _prop = hoc_getdata_range(_mechtype); + _setdata(_prop); + hoc_retpushx(1.); +} + /* connect user functions to hoc names */ + static VoidFunc hoc_intfunc[] = { + "setdata_kca", _hoc_setdata, + "rates_kca", _hoc_rates, + 0, 0 +}; + /* declare global and static user variables */ +#define Rb Rb_kca + double Rb = 0.02; +#define Ra Ra_kca + double Ra = 0.01; +#define caix caix_kca + double caix = 1; +#define q10 q10_kca + double q10 = 2.3; +#define tshift tshift_kca + double tshift = 30.7; +#define tadj tadj_kca + double tadj = 0; +#define temp temp_kca + double temp = 23; +#define vmax vmax_kca + double vmax = 100; +#define vmin vmin_kca + double vmin = -120; + /* some parameters have upper and lower limits */ + static HocParmLimits _hoc_parm_limits[] = { + 0,0,0 +}; + static HocParmUnits _hoc_parm_units[] = { + "Ra_kca", "/ms", + "Rb_kca", "/ms", + "temp_kca", "degC", + "vmin_kca", "mV", + "vmax_kca", "mV", + "gbar_kca", "pS/um2", + "gk_kca", "pS/um2", + "ntau_kca", "ms", + 0,0 +}; + static double delta_t = 1; + static double n0 = 0; + static double v = 0; + /* connect global user variables to hoc */ + static DoubScal hoc_scdoub[] = { + "caix_kca", &caix_kca, + "Ra_kca", &Ra_kca, + "Rb_kca", &Rb_kca, + "temp_kca", &temp_kca, + "q10_kca", &q10_kca, + "tshift_kca", &tshift_kca, + "vmin_kca", &vmin_kca, + "vmax_kca", &vmax_kca, + "tadj_kca", &tadj_kca, + 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 int _ode_count(int); +static void _ode_map(int, double**, double**, double*, Datum*, double*, int); +static void _ode_spec(NrnThread*, _Memb_list*, int); +static void _ode_matsol(NrnThread*, _Memb_list*, int); + +#define _cvode_ieq _ppvar[4]._i + static void _ode_matsol_instance1(_threadargsproto_); + /* connect range variables in _p that hoc is supposed to know about */ + static const char *_mechanism[] = { + "7.7.0", +"kca", + "gbar_kca", + 0, + "gk_kca", + "ninf_kca", + "ntau_kca", + 0, + "n_kca", + 0, + 0}; + static Symbol* _k_sym; + static Symbol* _ca_sym; + +extern Prop* need_memb(Symbol*); + +static void nrn_alloc(Prop* _prop) { + Prop *prop_ion; + double *_p; Datum *_ppvar; + _p = nrn_prop_data_alloc(_mechtype, 12, _prop); + /*initialize range parameters*/ + gbar = 10; + _prop->param = _p; + _prop->param_size = 12; + _ppvar = nrn_prop_datum_alloc(_mechtype, 5, _prop); + _prop->dparam = _ppvar; + /*connect ionic variables to this model*/ + prop_ion = need_memb(_k_sym); + nrn_promote(prop_ion, 0, 1); + _ppvar[0]._pval = &prop_ion->param[0]; /* ek */ + _ppvar[1]._pval = &prop_ion->param[3]; /* ik */ + _ppvar[2]._pval = &prop_ion->param[4]; /* _ion_dikdv */ + prop_ion = need_memb(_ca_sym); + nrn_promote(prop_ion, 1, 0); + _ppvar[3]._pval = &prop_ion->param[1]; /* cai */ + +} + static void _initlists(); + /* some states have an absolute tolerance */ + static Symbol** _atollist; + static HocStateTolerance _hoc_state_tol[] = { + 0,0 +}; + static void _update_ion_pointer(Datum*); + extern Symbol* hoc_lookup(const char*); +extern void _nrn_thread_reg(int, int, void(*)(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 _kca_reg() { + int _vectorized = 0; + _initlists(); + ion_reg("k", -10000.); + ion_reg("ca", -10000.); + _k_sym = hoc_lookup("k_ion"); + _ca_sym = hoc_lookup("ca_ion"); + register_mech(_mechanism, nrn_alloc,nrn_cur, nrn_jacob, nrn_state, nrn_init, hoc_nrnpointerindex, 0); + _mechtype = nrn_get_mechtype(_mechanism[1]); + _nrn_setdata_reg(_mechtype, _setdata); + _nrn_thread_reg(_mechtype, 2, _update_ion_pointer); + #if NMODL_TEXT + hoc_reg_nmodl_text(_mechtype, nmodl_file_text); + hoc_reg_nmodl_filename(_mechtype, nmodl_filename); +#endif + hoc_register_prop_size(_mechtype, 12, 5); + hoc_register_dparam_semantics(_mechtype, 0, "k_ion"); + hoc_register_dparam_semantics(_mechtype, 1, "k_ion"); + hoc_register_dparam_semantics(_mechtype, 2, "k_ion"); + hoc_register_dparam_semantics(_mechtype, 3, "ca_ion"); + hoc_register_dparam_semantics(_mechtype, 4, "cvodeieq"); + hoc_register_cvode(_mechtype, _ode_count, _ode_map, _ode_spec, _ode_matsol); + hoc_register_tolerance(_mechtype, _hoc_state_tol, &_atollist); + hoc_register_var(hoc_scdoub, hoc_vdoub, hoc_intfunc); + ivoc_help("help ?1 kca /Users/katharinaduecker/Documents/Projects Brown/hnn-core/hnn_core/mod/kca.mod\n"); + hoc_register_limits(_mechtype, _hoc_parm_limits); + hoc_register_units(_mechtype, _hoc_parm_units); + } + static double _znexp ; +static int _reset; +static char *modelname = ""; + +static int error; +static int _ninits = 0; +static int _match_recurse=1; +static void _modl_cleanup(){ _match_recurse=1;} +static int rates(double); + +static int _ode_spec1(_threadargsproto_); +/*static int _ode_matsol1(_threadargsproto_);*/ + static int _slist1[1], _dlist1[1]; + static int states(_threadargsproto_); + +/*CVODE*/ + static int _ode_spec1 () {_reset=0; + { + rates ( _threadargscomma_ cai ) ; + Dn = ( ninf - n ) / ntau ; + } + return _reset; +} + static int _ode_matsol1 () { + rates ( _threadargscomma_ cai ) ; + Dn = Dn / (1. - dt*( ( ( ( - 1.0 ) ) ) / ntau )) ; + return 0; +} + /*END CVODE*/ + static int states () {_reset=0; + { + rates ( _threadargscomma_ cai ) ; + n = n + (1. - exp(dt*(( ( ( - 1.0 ) ) ) / ntau)))*(- ( ( ( ninf ) ) / ntau ) / ( ( ( ( - 1.0 ) ) ) / ntau ) - n) ; + } + return 0; +} + +static int rates ( double _lcai ) { + a = Ra * pow( _lcai , caix ) ; + b = Rb ; + tadj = pow( q10 , ( ( celsius - temp - tshift ) / 10.0 ) ) ; + ntau = 1.0 / tadj / ( a + b ) ; + ninf = a / ( a + b ) ; + return 0; } + +static void _hoc_rates(void) { + double _r; + _r = 1.; + rates ( *getarg(1) ); + hoc_retpushx(_r); +} + +static int _ode_count(int _type){ return 1;} + +static void _ode_spec(NrnThread* _nt, _Memb_list* _ml, int _type) { + Datum* _thread; + Node* _nd; double _v; int _iml, _cntml; + _cntml = _ml->_nodecount; + _thread = _ml->_thread; + for (_iml = 0; _iml < _cntml; ++_iml) { + _p = _ml->_data[_iml]; _ppvar = _ml->_pdata[_iml]; + _nd = _ml->_nodelist[_iml]; + v = NODEV(_nd); + ek = _ion_ek; + cai = _ion_cai; + _ode_spec1 (); + }} + +static void _ode_map(int _ieq, double** _pv, double** _pvdot, double* _pp, Datum* _ppd, double* _atol, int _type) { + int _i; _p = _pp; _ppvar = _ppd; + _cvode_ieq = _ieq; + for (_i=0; _i < 1; ++_i) { + _pv[_i] = _pp + _slist1[_i]; _pvdot[_i] = _pp + _dlist1[_i]; + _cvode_abstol(_atollist, _atol, _i); + } + } + +static void _ode_matsol_instance1(_threadargsproto_) { + _ode_matsol1 (); + } + +static void _ode_matsol(NrnThread* _nt, _Memb_list* _ml, int _type) { + Datum* _thread; + Node* _nd; double _v; int _iml, _cntml; + _cntml = _ml->_nodecount; + _thread = _ml->_thread; + for (_iml = 0; _iml < _cntml; ++_iml) { + _p = _ml->_data[_iml]; _ppvar = _ml->_pdata[_iml]; + _nd = _ml->_nodelist[_iml]; + v = NODEV(_nd); + ek = _ion_ek; + cai = _ion_cai; + _ode_matsol_instance1(_threadargs_); + }} + extern void nrn_update_ion_pointer(Symbol*, Datum*, int, int); + static void _update_ion_pointer(Datum* _ppvar) { + nrn_update_ion_pointer(_k_sym, _ppvar, 0, 0); + nrn_update_ion_pointer(_k_sym, _ppvar, 1, 3); + nrn_update_ion_pointer(_k_sym, _ppvar, 2, 4); + nrn_update_ion_pointer(_ca_sym, _ppvar, 3, 1); + } + +static void initmodel() { + int _i; double _save;_ninits++; + _save = t; + t = 0.0; +{ + n = n0; + { + rates ( _threadargscomma_ cai ) ; + n = ninf ; + } + _sav_indep = t; t = _save; + +} +} + +static void nrn_init(NrnThread* _nt, _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]; +#if CACHEVEC + if (use_cachevec) { + _v = VEC_V(_ni[_iml]); + }else +#endif + { + _nd = _ml->_nodelist[_iml]; + _v = NODEV(_nd); + } + v = _v; + ek = _ion_ek; + cai = _ion_cai; + initmodel(); + }} + +static double _nrn_current(double _v){double _current=0.;v=_v;{ { + gk = tadj * gbar * n ; + ik = ( 1e-4 ) * gk * ( v - ek ) ; + } + _current += ik; + +} return _current; +} + +static void nrn_cur(NrnThread* _nt, _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); + } + ek = _ion_ek; + cai = _ion_cai; + _g = _nrn_current(_v + .001); + { double _dik; + _dik = ik; + _rhs = _nrn_current(_v); + _ion_dikdv += (_dik - ik)/.001 ; + } + _g = (_g - _rhs)/.001; + _ion_ik += ik ; +#if CACHEVEC + if (use_cachevec) { + VEC_RHS(_ni[_iml]) -= _rhs; + }else +#endif + { + NODERHS(_nd) -= _rhs; + } + +}} + +static void nrn_jacob(NrnThread* _nt, _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 void nrn_state(NrnThread* _nt, _Memb_list* _ml, int _type){ +Node *_nd; double _v = 0.0; 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); + } + v=_v; +{ + ek = _ion_ek; + cai = _ion_cai; + { error = states(); + if(error){fprintf(stderr,"at line 84 in file kca.mod:\n SOLVE states METHOD cnexp\n"); nrn_complain(_p); abort_run(error);} + } }} + +} + +static void terminal(){} + +static void _initlists() { + int _i; static int _first = 1; + if (!_first) return; + _slist1[0] = n_columnindex; _dlist1[0] = Dn_columnindex; +_first = 0; +} + +#if NMODL_TEXT +static const char* nmodl_filename = "/Users/katharinaduecker/Documents/Projects Brown/hnn-core/hnn_core/mod/kca.mod"; +static const char* nmodl_file_text = + "COMMENT\n" + " 26 Ago 2002 Modification of original channel to allow variable time step\n" + " and to correct an initialization error.\n" + "\n" + " Done by Michael Hines (michael.hines@yale.edu) and Ruggero Scorcioni (rscorcio@gmu.edu)\n" + " at EU Advance Course in Computational Neuroscience. Obidos, Portugal\n" + "\n" + " kca.mod\n" + "\n" + " Calcium-dependent potassium channel\n" + " Based on Pennefather (1990) -- sympathetic ganglion cells\n" + " taken from Reuveni et al (1993) -- neocortical cells\n" + "\n" + " Author: Zach Mainen, Salk Institute, 1995, zach@salk.edu\n" + "\n" + "ENDCOMMENT\n" + "\n" + "INDEPENDENT {t FROM 0 TO 1 WITH 1 (ms)}\n" + "\n" + "NEURON {\n" + " SUFFIX kca\n" + " USEION k READ ek WRITE ik\n" + " USEION ca READ cai\n" + " RANGE n, gk, gbar\n" + " RANGE ninf, ntau\n" + " GLOBAL Ra, Rb, caix\n" + " GLOBAL q10, temp, tadj, vmin, vmax, tshift\n" + "}\n" + "\n" + "UNITS {\n" + " (mA) = (milliamp)\n" + " (mV) = (millivolt)\n" + " (pS) = (picosiemens)\n" + " (um) = (micron)\n" + "}\n" + "\n" + "PARAMETER {\n" + " : 0.03 mho/cm2\n" + " gbar = 10 (pS/um2)\n" + " v (mV)\n" + " cai (mM)\n" + " caix = 1\n" + "\n" + " : max act rate\n" + " Ra = 0.01 (/ms)\n" + "\n" + " : max deact rate\n" + " Rb = 0.02 (/ms)\n" + "\n" + " dt (ms)\n" + " celsius (degC)\n" + "\n" + " : original temp\n" + " temp = 23 (degC)\n" + " q10 = 2.3\n" + " tshift = 30.7\n" + "\n" + " vmin = -120 (mV)\n" + " vmax = 100 (mV)\n" + "}\n" + "\n" + "ASSIGNED {\n" + " a (/ms)\n" + " b (/ms)\n" + " ik (mA/cm2)\n" + " gk (pS/um2)\n" + " ek (mV)\n" + " ninf\n" + " ntau (ms)\n" + " tadj\n" + "}\n" + "\n" + "\n" + "STATE {\n" + " n\n" + "}\n" + "\n" + "INITIAL {\n" + " rates(cai)\n" + " n = ninf\n" + "}\n" + "\n" + "BREAKPOINT {\n" + " SOLVE states METHOD cnexp\n" + " gk = tadj * gbar * n\n" + " ik = (1e-4) * gk * (v - ek)\n" + "}\n" + "\n" + "LOCAL nexp\n" + "\n" + ": Computes state variable n at the current v and dt.\n" + "DERIVATIVE states {\n" + " rates(cai)\n" + " n' = (ninf - n) / ntau\n" + "}\n" + "\n" + "PROCEDURE rates(cai(mM)) {\n" + " a = Ra * cai^caix\n" + " b = Rb\n" + "\n" + " tadj = q10^((celsius - temp - tshift) / 10)\n" + "\n" + " ntau = 1 / tadj / (a + b)\n" + " ninf = a / (a + b)\n" + "\n" + " : tinc = -dt * tadj\n" + " : nexp = 1 - exp(tinc/ntau)\n" + "}\n" + ; +#endif diff --git a/hnn_core/mod/arm64/kca.o b/hnn_core/mod/arm64/kca.o new file mode 100644 index 0000000000000000000000000000000000000000..1ff57893b6931b929d89d6789bc73e939e92c0f5 GIT binary patch literal 13328 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 +#include +#include +#include "mech_api.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 nrn_init _nrn_init__km +#define _nrn_initial _nrn_initial__km +#define nrn_cur _nrn_cur__km +#define _nrn_current _nrn_current__km +#define nrn_jacob _nrn_jacob__km +#define nrn_state _nrn_state__km +#define _net_receive _net_receive__km +#define _f_trates _f_trates__km +#define rates rates__km +#define states states__km +#define trates trates__km + +#define _threadargscomma_ /**/ +#define _threadargsprotocomma_ /**/ +#define _threadargs_ /**/ +#define _threadargsproto_ /**/ + /*SUPPRESS 761*/ + /*SUPPRESS 762*/ + /*SUPPRESS 763*/ + /*SUPPRESS 765*/ + extern double *getarg(); + static double *_p; static Datum *_ppvar; + +#define t nrn_threads->_t +#define dt nrn_threads->_dt +#define gbar _p[0] +#define gbar_columnindex 0 +#define gk _p[1] +#define gk_columnindex 1 +#define ninf _p[2] +#define ninf_columnindex 2 +#define ntau _p[3] +#define ntau_columnindex 3 +#define n _p[4] +#define n_columnindex 4 +#define a _p[5] +#define a_columnindex 5 +#define b _p[6] +#define b_columnindex 6 +#define ik _p[7] +#define ik_columnindex 7 +#define ek _p[8] +#define ek_columnindex 8 +#define Dn _p[9] +#define Dn_columnindex 9 +#define _g _p[10] +#define _g_columnindex 10 +#define _ion_ek *_ppvar[0]._pval +#define _ion_ik *_ppvar[1]._pval +#define _ion_dikdv *_ppvar[2]._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; + /* external NEURON variables */ + extern double celsius; + /* declaration of user functions */ + static void _hoc_rates(void); + static void _hoc_trates(void); + 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; + +#define NMODL_TEXT 1 +#if NMODL_TEXT +static const char* nmodl_file_text; +static const char* nmodl_filename; +extern void hoc_reg_nmodl_text(int, const char*); +extern void hoc_reg_nmodl_filename(int, const char*); +#endif + + extern void _nrn_setdata_reg(int, void(*)(Prop*)); + static void _setdata(Prop* _prop) { + _p = _prop->param; _ppvar = _prop->dparam; + } + static void _hoc_setdata() { + Prop *_prop, *hoc_getdata_range(int); + _prop = hoc_getdata_range(_mechtype); + _setdata(_prop); + hoc_retpushx(1.); +} + /* connect user functions to hoc names */ + static VoidFunc hoc_intfunc[] = { + "setdata_km", _hoc_setdata, + "rates_km", _hoc_rates, + "trates_km", _hoc_trates, + 0, 0 +}; + /* declare global and static user variables */ +#define Rb Rb_km + double Rb = 0.001; +#define Ra Ra_km + double Ra = 0.001; +#define qa qa_km + double qa = 9; +#define q10 q10_km + double q10 = 2.3; +#define tha tha_km + double tha = -30; +#define tshift tshift_km + double tshift = 30.7; +#define tadj tadj_km + double tadj = 0; +#define temp temp_km + double temp = 23; +#define usetable usetable_km + double usetable = 1; +#define vmax vmax_km + double vmax = 100; +#define vmin vmin_km + double vmin = -120; + /* some parameters have upper and lower limits */ + static HocParmLimits _hoc_parm_limits[] = { + "usetable_km", 0, 1, + 0,0,0 +}; + static HocParmUnits _hoc_parm_units[] = { + "tha_km", "mV", + "qa_km", "mV", + "Ra_km", "/ms", + "Rb_km", "/ms", + "temp_km", "degC", + "vmin_km", "mV", + "vmax_km", "mV", + "gbar_km", "pS/um2", + "gk_km", "pS/um2", + "ntau_km", "ms", + 0,0 +}; + static double delta_t = 1; + static double n0 = 0; + static double v = 0; + /* connect global user variables to hoc */ + static DoubScal hoc_scdoub[] = { + "tha_km", &tha_km, + "qa_km", &qa_km, + "Ra_km", &Ra_km, + "Rb_km", &Rb_km, + "temp_km", &temp_km, + "q10_km", &q10_km, + "tshift_km", &tshift_km, + "vmin_km", &vmin_km, + "vmax_km", &vmax_km, + "tadj_km", &tadj_km, + "usetable_km", &usetable_km, + 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 int _ode_count(int); +static void _ode_map(int, double**, double**, double*, Datum*, double*, int); +static void _ode_spec(NrnThread*, _Memb_list*, int); +static void _ode_matsol(NrnThread*, _Memb_list*, int); + +#define _cvode_ieq _ppvar[3]._i + static void _ode_matsol_instance1(_threadargsproto_); + /* connect range variables in _p that hoc is supposed to know about */ + static const char *_mechanism[] = { + "7.7.0", +"km", + "gbar_km", + 0, + "gk_km", + "ninf_km", + "ntau_km", + 0, + "n_km", + 0, + 0}; + static Symbol* _k_sym; + +extern Prop* need_memb(Symbol*); + +static void nrn_alloc(Prop* _prop) { + Prop *prop_ion; + double *_p; Datum *_ppvar; + _p = nrn_prop_data_alloc(_mechtype, 11, _prop); + /*initialize range parameters*/ + gbar = 10; + _prop->param = _p; + _prop->param_size = 11; + _ppvar = nrn_prop_datum_alloc(_mechtype, 4, _prop); + _prop->dparam = _ppvar; + /*connect ionic variables to this model*/ + prop_ion = need_memb(_k_sym); + nrn_promote(prop_ion, 0, 1); + _ppvar[0]._pval = &prop_ion->param[0]; /* ek */ + _ppvar[1]._pval = &prop_ion->param[3]; /* ik */ + _ppvar[2]._pval = &prop_ion->param[4]; /* _ion_dikdv */ + +} + static void _initlists(); + /* some states have an absolute tolerance */ + static Symbol** _atollist; + static HocStateTolerance _hoc_state_tol[] = { + 0,0 +}; + static void _update_ion_pointer(Datum*); + extern Symbol* hoc_lookup(const char*); +extern void _nrn_thread_reg(int, int, void(*)(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 _km_reg() { + int _vectorized = 0; + _initlists(); + ion_reg("k", -10000.); + _k_sym = hoc_lookup("k_ion"); + register_mech(_mechanism, nrn_alloc,nrn_cur, nrn_jacob, nrn_state, nrn_init, hoc_nrnpointerindex, 0); + _mechtype = nrn_get_mechtype(_mechanism[1]); + _nrn_setdata_reg(_mechtype, _setdata); + _nrn_thread_reg(_mechtype, 2, _update_ion_pointer); + #if NMODL_TEXT + hoc_reg_nmodl_text(_mechtype, nmodl_file_text); + hoc_reg_nmodl_filename(_mechtype, nmodl_filename); +#endif + hoc_register_prop_size(_mechtype, 11, 4); + hoc_register_dparam_semantics(_mechtype, 0, "k_ion"); + hoc_register_dparam_semantics(_mechtype, 1, "k_ion"); + hoc_register_dparam_semantics(_mechtype, 2, "k_ion"); + hoc_register_dparam_semantics(_mechtype, 3, "cvodeieq"); + hoc_register_cvode(_mechtype, _ode_count, _ode_map, _ode_spec, _ode_matsol); + hoc_register_tolerance(_mechtype, _hoc_state_tol, &_atollist); + hoc_register_var(hoc_scdoub, hoc_vdoub, hoc_intfunc); + ivoc_help("help ?1 km /Users/katharinaduecker/Documents/Projects Brown/hnn-core/hnn_core/mod/km.mod\n"); + hoc_register_limits(_mechtype, _hoc_parm_limits); + hoc_register_units(_mechtype, _hoc_parm_units); + } + static double _znexp ; + static double *_t_ninf; + static double *_t_ntau; +static int _reset; +static char *modelname = ""; + +static int error; +static int _ninits = 0; +static int _match_recurse=1; +static void _modl_cleanup(){ _match_recurse=1;} +static int _f_trates(double); +static int rates(double); +static int trates(double); + +static int _ode_spec1(_threadargsproto_); +/*static int _ode_matsol1(_threadargsproto_);*/ + static void _n_trates(double); + static int _slist1[1], _dlist1[1]; + static int states(_threadargsproto_); + +/*CVODE*/ + static int _ode_spec1 () {_reset=0; + { + trates ( _threadargscomma_ v ) ; + Dn = ( ninf - n ) / ntau ; + } + return _reset; +} + static int _ode_matsol1 () { + trates ( _threadargscomma_ v ) ; + Dn = Dn / (1. - dt*( ( ( ( - 1.0 ) ) ) / ntau )) ; + return 0; +} + /*END CVODE*/ + static int states () {_reset=0; + { + trates ( _threadargscomma_ v ) ; + n = n + (1. - exp(dt*(( ( ( - 1.0 ) ) ) / ntau)))*(- ( ( ( ninf ) ) / ntau ) / ( ( ( ( - 1.0 ) ) ) / ntau ) - n) ; + } + return 0; +} + static double _mfac_trates, _tmin_trates; + static void _check_trates(); + static void _check_trates() { + static int _maktable=1; int _i, _j, _ix = 0; + double _xi, _tmax; + static double _sav_celsius; + static double _sav_temp; + static double _sav_Ra; + static double _sav_Rb; + static double _sav_tha; + static double _sav_qa; + if (!usetable) {return;} + if (_sav_celsius != celsius) { _maktable = 1;} + if (_sav_temp != temp) { _maktable = 1;} + if (_sav_Ra != Ra) { _maktable = 1;} + if (_sav_Rb != Rb) { _maktable = 1;} + if (_sav_tha != tha) { _maktable = 1;} + if (_sav_qa != qa) { _maktable = 1;} + if (_maktable) { double _x, _dx; _maktable=0; + _tmin_trates = vmin ; + _tmax = vmax ; + _dx = (_tmax - _tmin_trates)/199.; _mfac_trates = 1./_dx; + for (_i=0, _x=_tmin_trates; _i < 200; _x += _dx, _i++) { + _f_trates(_x); + _t_ninf[_i] = ninf; + _t_ntau[_i] = ntau; + } + _sav_celsius = celsius; + _sav_temp = temp; + _sav_Ra = Ra; + _sav_Rb = Rb; + _sav_tha = tha; + _sav_qa = qa; + } + } + + static int trates(double _lv){ _check_trates(); + _n_trates(_lv); + return 0; + } + + static void _n_trates(double _lv){ int _i, _j; + double _xi, _theta; + if (!usetable) { + _f_trates(_lv); return; +} + _xi = _mfac_trates * (_lv - _tmin_trates); + if (isnan(_xi)) { + ninf = _xi; + ntau = _xi; + return; + } + if (_xi <= 0.) { + ninf = _t_ninf[0]; + ntau = _t_ntau[0]; + return; } + if (_xi >= 199.) { + ninf = _t_ninf[199]; + ntau = _t_ntau[199]; + return; } + _i = (int) _xi; + _theta = _xi - (double)_i; + ninf = _t_ninf[_i] + _theta*(_t_ninf[_i+1] - _t_ninf[_i]); + ntau = _t_ntau[_i] + _theta*(_t_ntau[_i+1] - _t_ntau[_i]); + } + + +static int _f_trates ( double _lv ) { + rates ( _threadargscomma_ _lv ) ; + return 0; } + +static void _hoc_trates(void) { + double _r; + _r = 1.; + trates ( *getarg(1) ); + hoc_retpushx(_r); +} + +static int rates ( double _lv ) { + a = Ra * ( _lv - tha ) / ( 1.0 - exp ( - ( _lv - tha ) / qa ) ) ; + b = - Rb * ( _lv - tha ) / ( 1.0 - exp ( ( _lv - tha ) / qa ) ) ; + tadj = pow( q10 , ( ( celsius - temp - tshift ) / 10.0 ) ) ; + ntau = 1.0 / tadj / ( a + b ) ; + ninf = a / ( a + b ) ; + return 0; } + +static void _hoc_rates(void) { + double _r; + _r = 1.; + rates ( *getarg(1) ); + hoc_retpushx(_r); +} + +static int _ode_count(int _type){ return 1;} + +static void _ode_spec(NrnThread* _nt, _Memb_list* _ml, int _type) { + Datum* _thread; + Node* _nd; double _v; int _iml, _cntml; + _cntml = _ml->_nodecount; + _thread = _ml->_thread; + for (_iml = 0; _iml < _cntml; ++_iml) { + _p = _ml->_data[_iml]; _ppvar = _ml->_pdata[_iml]; + _nd = _ml->_nodelist[_iml]; + v = NODEV(_nd); + ek = _ion_ek; + _ode_spec1 (); + }} + +static void _ode_map(int _ieq, double** _pv, double** _pvdot, double* _pp, Datum* _ppd, double* _atol, int _type) { + int _i; _p = _pp; _ppvar = _ppd; + _cvode_ieq = _ieq; + for (_i=0; _i < 1; ++_i) { + _pv[_i] = _pp + _slist1[_i]; _pvdot[_i] = _pp + _dlist1[_i]; + _cvode_abstol(_atollist, _atol, _i); + } + } + +static void _ode_matsol_instance1(_threadargsproto_) { + _ode_matsol1 (); + } + +static void _ode_matsol(NrnThread* _nt, _Memb_list* _ml, int _type) { + Datum* _thread; + Node* _nd; double _v; int _iml, _cntml; + _cntml = _ml->_nodecount; + _thread = _ml->_thread; + for (_iml = 0; _iml < _cntml; ++_iml) { + _p = _ml->_data[_iml]; _ppvar = _ml->_pdata[_iml]; + _nd = _ml->_nodelist[_iml]; + v = NODEV(_nd); + ek = _ion_ek; + _ode_matsol_instance1(_threadargs_); + }} + extern void nrn_update_ion_pointer(Symbol*, Datum*, int, int); + static void _update_ion_pointer(Datum* _ppvar) { + nrn_update_ion_pointer(_k_sym, _ppvar, 0, 0); + nrn_update_ion_pointer(_k_sym, _ppvar, 1, 3); + nrn_update_ion_pointer(_k_sym, _ppvar, 2, 4); + } + +static void initmodel() { + int _i; double _save;_ninits++; + _save = t; + t = 0.0; +{ + n = n0; + { + trates ( _threadargscomma_ v ) ; + n = ninf ; + } + _sav_indep = t; t = _save; + +} +} + +static void nrn_init(NrnThread* _nt, _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]; +#if CACHEVEC + if (use_cachevec) { + _v = VEC_V(_ni[_iml]); + }else +#endif + { + _nd = _ml->_nodelist[_iml]; + _v = NODEV(_nd); + } + v = _v; + ek = _ion_ek; + initmodel(); + }} + +static double _nrn_current(double _v){double _current=0.;v=_v;{ { + gk = tadj * gbar * n ; + ik = ( 1e-4 ) * gk * ( v - ek ) ; + } + _current += ik; + +} return _current; +} + +static void nrn_cur(NrnThread* _nt, _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); + } + ek = _ion_ek; + _g = _nrn_current(_v + .001); + { double _dik; + _dik = ik; + _rhs = _nrn_current(_v); + _ion_dikdv += (_dik - ik)/.001 ; + } + _g = (_g - _rhs)/.001; + _ion_ik += ik ; +#if CACHEVEC + if (use_cachevec) { + VEC_RHS(_ni[_iml]) -= _rhs; + }else +#endif + { + NODERHS(_nd) -= _rhs; + } + +}} + +static void nrn_jacob(NrnThread* _nt, _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 void nrn_state(NrnThread* _nt, _Memb_list* _ml, int _type){ +Node *_nd; double _v = 0.0; 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); + } + v=_v; +{ + ek = _ion_ek; + { error = states(); + if(error){fprintf(stderr,"at line 90 in file km.mod:\n SOLVE states METHOD cnexp\n"); nrn_complain(_p); abort_run(error);} + } }} + +} + +static void terminal(){} + +static void _initlists() { + int _i; static int _first = 1; + if (!_first) return; + _slist1[0] = n_columnindex; _dlist1[0] = Dn_columnindex; + _t_ninf = makevector(200*sizeof(double)); + _t_ntau = makevector(200*sizeof(double)); +_first = 0; +} + +#if NMODL_TEXT +static const char* nmodl_filename = "/Users/katharinaduecker/Documents/Projects Brown/hnn-core/hnn_core/mod/km.mod"; +static const char* nmodl_file_text = + "COMMENT\n" + " 26 Ago 2002 Modification of original channel to allow variable time step\n" + " and to correct an initialization error.\n" + "\n" + " Done by Michael Hines (michael.hines@yale.edu) and Ruggero Scorcioni (rscorcio@gmu.edu)\n" + " at EU Advance Course in Computational Neuroscience. Obidos, Portugal\n" + "\n" + " km.mod\n" + "\n" + " Potassium channel, Hodgkin-Huxley style kinetics\n" + " Based on I-M (muscarinic K channel)\n" + " Slow, noninactivating\n" + "\n" + " Original Author: Zach Mainen, Salk Institute, 1995, zach@salk.edu\n" + "ENDCOMMENT\n" + "\n" + "INDEPENDENT {t FROM 0 TO 1 WITH 1 (ms)}\n" + "\n" + "NEURON {\n" + " SUFFIX km\n" + " USEION k READ ek WRITE ik\n" + " RANGE n, gk, gbar\n" + " RANGE ninf, ntau\n" + " GLOBAL Ra, Rb\n" + " GLOBAL q10, temp, tadj, vmin, vmax, tshift\n" + "}\n" + "\n" + "UNITS {\n" + " (mA) = (milliamp)\n" + " (mV) = (millivolt)\n" + " (pS) = (picosiemens)\n" + " (um) = (micron)\n" + "}\n" + "\n" + "PARAMETER {\n" + " : 0.03 mho/cm2\n" + " gbar = 10 (pS/um2)\n" + " v (mV)\n" + "\n" + " : v 1/2 for inf\n" + " tha = -30 (mV)\n" + "\n" + " : inf slope\n" + " qa = 9 (mV)\n" + "\n" + " : max act rate (slow)\n" + " Ra = 0.001 (/ms)\n" + "\n" + " : max deact rate (slow)\n" + " Rb = 0.001 (/ms)\n" + "\n" + " dt (ms)\n" + " celsius (degC)\n" + "\n" + " : original temp\n" + " temp = 23 (degC)\n" + "\n" + " : temp sensitivity\n" + " q10 = 2.3\n" + "\n" + " tshift = 30.7\n" + "\n" + " vmin = -120 (mV)\n" + " vmax = 100 (mV)\n" + "}\n" + "\n" + "\n" + "ASSIGNED {\n" + " a (/ms)\n" + " b (/ms)\n" + " ik (mA/cm2)\n" + " gk (pS/um2)\n" + " ek (mV)\n" + " ninf\n" + " ntau (ms)\n" + " tadj\n" + "}\n" + "\n" + "\n" + "STATE {\n" + " n\n" + "}\n" + "\n" + "INITIAL {\n" + " trates(v)\n" + " n = ninf\n" + "}\n" + "\n" + "BREAKPOINT {\n" + " SOLVE states METHOD cnexp\n" + " gk = tadj * gbar * n\n" + " ik = (1e-4) * gk * (v - ek)\n" + "}\n" + "\n" + "LOCAL nexp\n" + "\n" + ": Computes state variable n at the current v and dt.\n" + "DERIVATIVE states {\n" + " trates(v)\n" + " n' = (ninf - n) / ntau\n" + "}\n" + "\n" + ": Computes rate and other constants at current v.\n" + ": Call once from HOC to initialize inf at resting v.\n" + "PROCEDURE trates(v) {\n" + " TABLE ninf, ntau\n" + " DEPEND celsius, temp, Ra, Rb, tha, qa\n" + "\n" + " FROM vmin TO vmax WITH 199\n" + "\n" + " : not consistently executed from here if usetable_hh == 1\n" + " rates(v)\n" + " : tinc = -dt * tadj\n" + " : nexp = 1 - exp(tinc/ntau)\n" + "}\n" + "\n" + ": Computes rate and other constants at current v.\n" + ": Call once from HOC to initialize inf at resting v.\n" + "PROCEDURE rates(v) {\n" + " a = Ra * (v - tha) / (1 - exp(-(v - tha) / qa))\n" + " b = -Rb * (v - tha) / (1 - exp((v - tha) / qa))\n" + "\n" + " tadj = q10^((celsius - temp - tshift) / 10)\n" + " ntau = 1/tadj/(a+b)\n" + " ninf = a/(a+b)\n" + "}\n" + ; +#endif diff --git a/hnn_core/mod/arm64/km.o b/hnn_core/mod/arm64/km.o new file mode 100644 index 0000000000000000000000000000000000000000..8822182a349820c9f7265eb25be93f698b7ad431 GIT binary patch literal 15824 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 Szbo$?G5&AYteVQc0{0&h_u(x7 literal 0 HcmV?d00001 diff --git a/hnn_core/mod/arm64/makemod2c_inc b/hnn_core/mod/arm64/makemod2c_inc new file mode 100644 index 000000000..c829854aa --- /dev/null +++ b/hnn_core/mod/arm64/makemod2c_inc @@ -0,0 +1,80 @@ +./ar.c: ../ar.mod + @printf " -> $(C_GREEN)NMODL$(C_RESET) $<\\n" + (cd ".."; MODLUNIT=$(NRNUNITS) $(NOCMODL) "ar.mod" -o "/Users/katharinaduecker/Documents/projects_brown/hnn-core/hnn_core/mod/arm64") + +./ar.o: ./ar.c + @printf " -> $(C_GREEN)Compiling$(C_RESET) $<\\n" + $(COMPILE) -I".." $(INCLUDES) -fPIC -c $< -o $@ + +./ca.c: ../ca.mod + @printf " -> $(C_GREEN)NMODL$(C_RESET) $<\\n" + (cd ".."; MODLUNIT=$(NRNUNITS) $(NOCMODL) "ca.mod" -o "/Users/katharinaduecker/Documents/projects_brown/hnn-core/hnn_core/mod/arm64") + +./ca.o: ./ca.c + @printf " -> $(C_GREEN)Compiling$(C_RESET) $<\\n" + $(COMPILE) -I".." $(INCLUDES) -fPIC -c $< -o $@ + +./cad.c: ../cad.mod + @printf " -> $(C_GREEN)NMODL$(C_RESET) $<\\n" + (cd ".."; MODLUNIT=$(NRNUNITS) $(NOCMODL) "cad.mod" -o "/Users/katharinaduecker/Documents/projects_brown/hnn-core/hnn_core/mod/arm64") + +./cad.o: ./cad.c + @printf " -> $(C_GREEN)Compiling$(C_RESET) $<\\n" + $(COMPILE) -I".." $(INCLUDES) -fPIC -c $< -o $@ + +./cat.c: ../cat.mod + @printf " -> $(C_GREEN)NMODL$(C_RESET) $<\\n" + (cd ".."; MODLUNIT=$(NRNUNITS) $(NOCMODL) "cat.mod" -o "/Users/katharinaduecker/Documents/projects_brown/hnn-core/hnn_core/mod/arm64") + +./cat.o: ./cat.c + @printf " -> $(C_GREEN)Compiling$(C_RESET) $<\\n" + $(COMPILE) -I".." $(INCLUDES) -fPIC -c $< -o $@ + +./dipole.c: ../dipole.mod + @printf " -> $(C_GREEN)NMODL$(C_RESET) $<\\n" + (cd ".."; MODLUNIT=$(NRNUNITS) $(NOCMODL) "dipole.mod" -o "/Users/katharinaduecker/Documents/projects_brown/hnn-core/hnn_core/mod/arm64") + +./dipole.o: ./dipole.c + @printf " -> $(C_GREEN)Compiling$(C_RESET) $<\\n" + $(COMPILE) -I".." $(INCLUDES) -fPIC -c $< -o $@ + +./dipole_pp.c: ../dipole_pp.mod + @printf " -> $(C_GREEN)NMODL$(C_RESET) $<\\n" + (cd ".."; MODLUNIT=$(NRNUNITS) $(NOCMODL) "dipole_pp.mod" -o "/Users/katharinaduecker/Documents/projects_brown/hnn-core/hnn_core/mod/arm64") + +./dipole_pp.o: ./dipole_pp.c + @printf " -> $(C_GREEN)Compiling$(C_RESET) $<\\n" + $(COMPILE) -I".." $(INCLUDES) -fPIC -c $< -o $@ + +./hh2.c: ../hh2.mod + @printf " -> $(C_GREEN)NMODL$(C_RESET) $<\\n" + (cd ".."; MODLUNIT=$(NRNUNITS) $(NOCMODL) "hh2.mod" -o "/Users/katharinaduecker/Documents/projects_brown/hnn-core/hnn_core/mod/arm64") + +./hh2.o: ./hh2.c + @printf " -> $(C_GREEN)Compiling$(C_RESET) $<\\n" + $(COMPILE) -I".." $(INCLUDES) -fPIC -c $< -o $@ + +./kca.c: ../kca.mod + @printf " -> $(C_GREEN)NMODL$(C_RESET) $<\\n" + (cd ".."; MODLUNIT=$(NRNUNITS) $(NOCMODL) "kca.mod" -o "/Users/katharinaduecker/Documents/projects_brown/hnn-core/hnn_core/mod/arm64") + +./kca.o: ./kca.c + @printf " -> $(C_GREEN)Compiling$(C_RESET) $<\\n" + $(COMPILE) -I".." $(INCLUDES) -fPIC -c $< -o $@ + +./km.c: ../km.mod + @printf " -> $(C_GREEN)NMODL$(C_RESET) $<\\n" + (cd ".."; MODLUNIT=$(NRNUNITS) $(NOCMODL) "km.mod" -o "/Users/katharinaduecker/Documents/projects_brown/hnn-core/hnn_core/mod/arm64") + +./km.o: ./km.c + @printf " -> $(C_GREEN)Compiling$(C_RESET) $<\\n" + $(COMPILE) -I".." $(INCLUDES) -fPIC -c $< -o $@ + +./vecevent.c: ../vecevent.mod + @printf " -> $(C_GREEN)NMODL$(C_RESET) $<\\n" + (cd ".."; MODLUNIT=$(NRNUNITS) $(NOCMODL) "vecevent.mod" -o "/Users/katharinaduecker/Documents/projects_brown/hnn-core/hnn_core/mod/arm64") + +./vecevent.o: ./vecevent.c + @printf " -> $(C_GREEN)Compiling$(C_RESET) $<\\n" + $(COMPILE) -I".." $(INCLUDES) -fPIC -c $< -o $@ + diff --git a/hnn_core/mod/arm64/mod_func.cpp b/hnn_core/mod/arm64/mod_func.cpp new file mode 100644 index 000000000..20de9a07b --- /dev/null +++ b/hnn_core/mod/arm64/mod_func.cpp @@ -0,0 +1,49 @@ +#include +#include "hocdec.h" +extern int nrnmpi_myid; +extern int nrn_nobanner_; +#if defined(__cplusplus) +extern "C" { +#endif + +extern void _ar_reg(void); +extern void _ca_reg(void); +extern void _cad_reg(void); +extern void _cat_reg(void); +extern void _dipole_reg(void); +extern void _dipole_pp_reg(void); +extern void _hh2_reg(void); +extern void _kca_reg(void); +extern void _km_reg(void); +extern void _vecevent_reg(void); + +void modl_reg() { + if (!nrn_nobanner_) if (nrnmpi_myid < 1) { + fprintf(stderr, "Additional mechanisms from files\n"); + fprintf(stderr, " \"ar.mod\""); + fprintf(stderr, " \"ca.mod\""); + fprintf(stderr, " \"cad.mod\""); + fprintf(stderr, " \"cat.mod\""); + fprintf(stderr, " \"dipole.mod\""); + fprintf(stderr, " \"dipole_pp.mod\""); + fprintf(stderr, " \"hh2.mod\""); + fprintf(stderr, " \"kca.mod\""); + fprintf(stderr, " \"km.mod\""); + fprintf(stderr, " \"vecevent.mod\""); + fprintf(stderr, "\n"); + } + _ar_reg(); + _ca_reg(); + _cad_reg(); + _cat_reg(); + _dipole_reg(); + _dipole_pp_reg(); + _hh2_reg(); + _kca_reg(); + _km_reg(); + _vecevent_reg(); +} + +#if defined(__cplusplus) +} +#endif diff --git a/hnn_core/mod/arm64/mod_func.o b/hnn_core/mod/arm64/mod_func.o new file mode 100644 index 0000000000000000000000000000000000000000..56a64dd56ea3bd1cbffe0a2bed556e29250c9e0d GIT binary patch literal 2320 zcmb7_PiPfK9LHxjPhX;ssBLOft9A_@S}-9^wWg4T7pl<1Qbpb&2gA7TZp@P1ecOHO ze-A-Cc<4dFL!naimVgHlq48iT#e)Sw@z6`X2my2PB0*3R>G${MH%Z>M59;uK^Z9*$ zGxK}1voo`g-@bfT5yB8CRIP(OB*%iGd;%M8wl?Lzs$o-w7PybrWrWE(c!ZRBa3*H~ zNLf2LR$JBDyTExUAEmZRLJU!3NlX)TkmdLpcO+BzNPTSKIUOdxl+J;bMmW7Zz|uj?i&Eakg7K7FQqr7zVXAE-9;UlFasc&a*c`?k25AuW z>s&9yPH+K>_BjS&M6(?bG?I*RZDIr7t1KS+ZFc#*F}wV&xY{Yil}@Aj26nFt{ul6J z_dYYk4^~(8T%}9YK194>R^NCq{LvNI)m^3OBYk4}2>fd;apV2sqiy=Pi{EV1-!T9C zf7|707vI$;|MN9*7wb@krf2^@wtRkccJa_3Gw9nh>ic0H))P0f;=r49ldusttck21 zTN7avG&TsU&&>wny59%Sb5}io)y=i*hiN?uT9r&w9hjUP((cr1s;O89PX%6ZDo8jT zrl$&>7yPiRTgw>)aR>BAAogkhB=|AtgImF4U=Mf{{0JNav3L4w;0NGga0}>w*!TV4 zf!n|l@KbOQ#9nvyDB8O@-V1I(yhqWlaGWNIJ?kuCnxMT1Ql146``VdTw4ZVO35X-* zJW{kDaC{ELk#p`U+P64<1H{pEt}EK~vMK*%5R2nnQnW8{JOyzNIFX|5b9@ZM*>-A* zw!`r%h(~Zn6z#nr&U7@WIKCa+0Zn%TIF2rP%jzNsOOCZqijAho}j*K%%Q$++(3QFxQseV%Vuq?Y>rer%|V&~3axWDOc!#y z@c{ZB-AL`wzi^)=Zl7WOlJyX<>-oM$tQ#*z-`n3qZ{o4kAA5z?ai#1j=(7bK6m(xf?<;6}|7-JKEa-YcA1r8` zp_cJC3;M@`o+)VBw`>1jL~;NhOnm2LBlm+WOX2FfKxV-S`U1K+dv3;#x@>U0u%3#Q zgS#qf?V?lox~J!|x8mSxQlW{{S(pbxCRq}vp^VRlzK|2?$=qwkWKuuwCP|Pt m+8Nf)e(ij%oqgKbtDUbzl*j3imT(}y)DjNl;EJRZD8xVAcUNry literal 0 HcmV?d00001 diff --git a/hnn_core/mod/arm64/special b/hnn_core/mod/arm64/special new file mode 100755 index 000000000..8511d2b4f --- /dev/null +++ b/hnn_core/mod/arm64/special @@ -0,0 +1,103 @@ +#!/Users/katharinaduecker/miniconda3/envs/hnn_env/bin/python +""" +A generic wrapper to access nrn binaries from a python installation +Please create a softlink with the binary name to be called. +""" +import os +import shutil +import subprocess +import sys +from pkg_resources import working_set +from distutils.ccompiler import new_compiler +from sysconfig import get_config_vars, get_config_var + + +# This replaces the now depricated distutils.sysutils.customize_compiler +def _customize_compiler(compiler): + """Do platform-sepcific customizations of compilers on unix platforms.""" + if compiler.compiler_type == "unix": + (cc, cxx, cflags) = get_config_vars("CC", "CXX", "CFLAGS") + if "CC" in os.environ: + cc = os.environ["CC"] + if "CXX" in os.environ: + cxx = os.environ["CXX"] + if "CFLAGS" in os.environ: + cflags = cflags + " " + os.environ["CFLAGS"] + cc_cmd = cc + " " + cflags + # We update executables in compiler to take advantage of distutils arg splitting + compiler.set_executables(compiler=cc_cmd, compiler_cxx=cxx) + + +def _set_default_compiler(): + """Set (dont overwrite) CC/CXX so that apps dont use the build-time ones""" + ccompiler = new_compiler() + _customize_compiler(ccompiler) + # xcrun wrapper must bring all args + if ccompiler.compiler[0] == "xcrun": + ccompiler.compiler[0] = get_config_var("CC") + ccompiler.compiler_cxx[0] = get_config_var("CXX") + os.environ.setdefault("CC", ccompiler.compiler[0]) + os.environ.setdefault("CXX", ccompiler.compiler_cxx[0]) + + +def _config_exe(exe_name): + """Sets the environment to run the real executable (returned)""" + + package_name = "neuron" + + # determine package to find the install location + if "neuron-gpu-nightly" in working_set.by_key: + print("INFO : Using neuron-gpu-nightly Package (Alpha Developer Version)") + package_name = "neuron-gpu-nightly" + elif "neuron-gpu" in working_set.by_key: + print("INFO : Using neuron-gpu Package (Alpha Version)") + package_name = "neuron-gpu" + elif "neuron-nightly" in working_set.by_key: + print("INFO : Using neuron-nightly Package (Developer Version)") + package_name = "neuron-nightly" + elif "neuron" in working_set.by_key: + package_name = "neuron" + else: + raise RuntimeError("NEURON package not found! Verify PYTHONPATH") + + NRN_PREFIX = os.path.join( + working_set.by_key[package_name].location, "neuron", ".data" + ) + os.environ["NEURONHOME"] = os.path.join(NRN_PREFIX, "share/nrn") + os.environ["NRNHOME"] = NRN_PREFIX + os.environ["CORENRNHOME"] = NRN_PREFIX + os.environ["NRN_PYTHONEXE"] = sys.executable + os.environ["CORENRN_PYTHONEXE"] = sys.executable + os.environ["CORENRN_PERLEXE"] = shutil.which("perl") + os.environ["NRNBIN"] = os.path.dirname(__file__) + + _set_default_compiler() + return os.path.join(NRN_PREFIX, "bin", exe_name) + + +def _wrap_executable(output_name): + """Create a wrapper for an executable in same dir. Requires renaming the original file. + Executables are typically found under arch_name + """ + release_dir = os.path.join(os.environ["NEURONHOME"], "demo/release") + arch_name = next(os.walk(release_dir))[1][0] # first dir + file_path = os.path.join(arch_name, output_name) + shutil.move(file_path, file_path + ".nrn") + shutil.copy(__file__, file_path) + + +if __name__ == "__main__": + exe = _config_exe(os.path.basename(sys.argv[0])) + + if exe.endswith("nrnivmodl"): + # To create a wrapper for special (so it also gets ENV vars) we intercept nrnivmodl + subprocess.check_call([exe, *sys.argv[1:]]) + _wrap_executable("special") + sys.exit(0) + + if exe.endswith("special"): + exe = os.path.join( + sys.argv[0] + ".nrn" + ) # original special is renamed special.nrn + + os.execv(exe, sys.argv) diff --git a/hnn_core/mod/arm64/special.nrn b/hnn_core/mod/arm64/special.nrn new file mode 100755 index 000000000..8511d2b4f --- /dev/null +++ b/hnn_core/mod/arm64/special.nrn @@ -0,0 +1,103 @@ +#!/Users/katharinaduecker/miniconda3/envs/hnn_env/bin/python +""" +A generic wrapper to access nrn binaries from a python installation +Please create a softlink with the binary name to be called. +""" +import os +import shutil +import subprocess +import sys +from pkg_resources import working_set +from distutils.ccompiler import new_compiler +from sysconfig import get_config_vars, get_config_var + + +# This replaces the now depricated distutils.sysutils.customize_compiler +def _customize_compiler(compiler): + """Do platform-sepcific customizations of compilers on unix platforms.""" + if compiler.compiler_type == "unix": + (cc, cxx, cflags) = get_config_vars("CC", "CXX", "CFLAGS") + if "CC" in os.environ: + cc = os.environ["CC"] + if "CXX" in os.environ: + cxx = os.environ["CXX"] + if "CFLAGS" in os.environ: + cflags = cflags + " " + os.environ["CFLAGS"] + cc_cmd = cc + " " + cflags + # We update executables in compiler to take advantage of distutils arg splitting + compiler.set_executables(compiler=cc_cmd, compiler_cxx=cxx) + + +def _set_default_compiler(): + """Set (dont overwrite) CC/CXX so that apps dont use the build-time ones""" + ccompiler = new_compiler() + _customize_compiler(ccompiler) + # xcrun wrapper must bring all args + if ccompiler.compiler[0] == "xcrun": + ccompiler.compiler[0] = get_config_var("CC") + ccompiler.compiler_cxx[0] = get_config_var("CXX") + os.environ.setdefault("CC", ccompiler.compiler[0]) + os.environ.setdefault("CXX", ccompiler.compiler_cxx[0]) + + +def _config_exe(exe_name): + """Sets the environment to run the real executable (returned)""" + + package_name = "neuron" + + # determine package to find the install location + if "neuron-gpu-nightly" in working_set.by_key: + print("INFO : Using neuron-gpu-nightly Package (Alpha Developer Version)") + package_name = "neuron-gpu-nightly" + elif "neuron-gpu" in working_set.by_key: + print("INFO : Using neuron-gpu Package (Alpha Version)") + package_name = "neuron-gpu" + elif "neuron-nightly" in working_set.by_key: + print("INFO : Using neuron-nightly Package (Developer Version)") + package_name = "neuron-nightly" + elif "neuron" in working_set.by_key: + package_name = "neuron" + else: + raise RuntimeError("NEURON package not found! Verify PYTHONPATH") + + NRN_PREFIX = os.path.join( + working_set.by_key[package_name].location, "neuron", ".data" + ) + os.environ["NEURONHOME"] = os.path.join(NRN_PREFIX, "share/nrn") + os.environ["NRNHOME"] = NRN_PREFIX + os.environ["CORENRNHOME"] = NRN_PREFIX + os.environ["NRN_PYTHONEXE"] = sys.executable + os.environ["CORENRN_PYTHONEXE"] = sys.executable + os.environ["CORENRN_PERLEXE"] = shutil.which("perl") + os.environ["NRNBIN"] = os.path.dirname(__file__) + + _set_default_compiler() + return os.path.join(NRN_PREFIX, "bin", exe_name) + + +def _wrap_executable(output_name): + """Create a wrapper for an executable in same dir. Requires renaming the original file. + Executables are typically found under arch_name + """ + release_dir = os.path.join(os.environ["NEURONHOME"], "demo/release") + arch_name = next(os.walk(release_dir))[1][0] # first dir + file_path = os.path.join(arch_name, output_name) + shutil.move(file_path, file_path + ".nrn") + shutil.copy(__file__, file_path) + + +if __name__ == "__main__": + exe = _config_exe(os.path.basename(sys.argv[0])) + + if exe.endswith("nrnivmodl"): + # To create a wrapper for special (so it also gets ENV vars) we intercept nrnivmodl + subprocess.check_call([exe, *sys.argv[1:]]) + _wrap_executable("special") + sys.exit(0) + + if exe.endswith("special"): + exe = os.path.join( + sys.argv[0] + ".nrn" + ) # original special is renamed special.nrn + + os.execv(exe, sys.argv) diff --git a/hnn_core/mod/arm64/vecevent.c b/hnn_core/mod/arm64/vecevent.c new file mode 100644 index 000000000..205ff9d29 --- /dev/null +++ b/hnn_core/mod/arm64/vecevent.c @@ -0,0 +1,421 @@ +/* Created by Language version: 7.7.0 */ +/* NOT VECTORIZED */ +#define NRN_VECTORIZED 0 +#include +#include +#include +#include "mech_api.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 nrn_init _nrn_init__VecStim +#define _nrn_initial _nrn_initial__VecStim +#define nrn_cur _nrn_cur__VecStim +#define _nrn_current _nrn_current__VecStim +#define nrn_jacob _nrn_jacob__VecStim +#define nrn_state _nrn_state__VecStim +#define _net_receive _net_receive__VecStim +#define element element__VecStim +#define play play__VecStim + +#define _threadargscomma_ /**/ +#define _threadargsprotocomma_ /**/ +#define _threadargs_ /**/ +#define _threadargsproto_ /**/ + /*SUPPRESS 761*/ + /*SUPPRESS 762*/ + /*SUPPRESS 763*/ + /*SUPPRESS 765*/ + extern double *getarg(); + static double *_p; static Datum *_ppvar; + +#define t nrn_threads->_t +#define dt nrn_threads->_dt +#define index _p[0] +#define index_columnindex 0 +#define etime _p[1] +#define etime_columnindex 1 +#define space _p[2] +#define space_columnindex 2 +#define _tsav _p[3] +#define _tsav_columnindex 3 +#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; + /* external NEURON variables */ + /* declaration of user functions */ + static double _hoc_element(void*); + static double _hoc_play(void*); + 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; + +#define NMODL_TEXT 1 +#if NMODL_TEXT +static const char* nmodl_file_text; +static const char* nmodl_filename; +extern void hoc_reg_nmodl_text(int, const char*); +extern void hoc_reg_nmodl_filename(int, const char*); +#endif + + extern Prop* nrn_point_prop_; + static int _pointtype; + static void* _hoc_create_pnt(Object* _ho) { void* create_point_process(int, Object*); + return create_point_process(_pointtype, _ho); +} + static void _hoc_destroy_pnt(void*); + static double _hoc_loc_pnt(void* _vptr) {double loc_point_process(int, void*); + return loc_point_process(_pointtype, _vptr); +} + static double _hoc_has_loc(void* _vptr) {double has_loc_point(void*); + return has_loc_point(_vptr); +} + static double _hoc_get_loc_pnt(void* _vptr) { + double get_loc_point_process(void*); return (get_loc_point_process(_vptr)); +} + extern void _nrn_setdata_reg(int, void(*)(Prop*)); + static void _setdata(Prop* _prop) { + _p = _prop->param; _ppvar = _prop->dparam; + } + 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, + "element", _hoc_element, + "play", _hoc_play, + 0, 0 +}; + /* declare global and static user variables */ + /* some parameters have upper and lower limits */ + static HocParmLimits _hoc_parm_limits[] = { + 0,0,0 +}; + static HocParmUnits _hoc_parm_units[] = { + 0,0 +}; + static double v = 0; + /* 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 _hoc_destroy_pnt(void* _vptr) { + destroy_point_process(_vptr); +} + /* connect range variables in _p that hoc is supposed to know about */ + static const char *_mechanism[] = { + "7.7.0", +"VecStim", + 0, + 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, 4, _prop); + /*initialize range parameters*/ + } + _prop->param = _p; + _prop->param_size = 4; + if (!nrn_point_prop_) { + _ppvar = nrn_prop_datum_alloc(_mechtype, 3, _prop); + } + _prop->dparam = _ppvar; + /*connect ionic variables to this model*/ + +} + static void _initlists(); + +#define _tqitem &(_ppvar[2]._pvoid) + static void _net_receive(Point_process*, double*, double); + extern Symbol* hoc_lookup(const char*); +extern void _nrn_thread_reg(int, int, void(*)(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 _vecevent_reg() { + int _vectorized = 0; + _initlists(); + _pointtype = point_register_mech(_mechanism, + nrn_alloc,(void*)0, (void*)0, (void*)0, nrn_init, + hoc_nrnpointerindex, 0, + _hoc_create_pnt, _hoc_destroy_pnt, _member_func); + _mechtype = nrn_get_mechtype(_mechanism[1]); + _nrn_setdata_reg(_mechtype, _setdata); + #if NMODL_TEXT + hoc_reg_nmodl_text(_mechtype, nmodl_file_text); + hoc_reg_nmodl_filename(_mechtype, nmodl_filename); +#endif + hoc_register_prop_size(_mechtype, 4, 3); + hoc_register_dparam_semantics(_mechtype, 0, "area"); + hoc_register_dparam_semantics(_mechtype, 1, "pntproc"); + hoc_register_dparam_semantics(_mechtype, 2, "netsend"); + add_nrn_artcell(_mechtype, 2); + add_nrn_has_net_event(_mechtype); + pnt_receive[_mechtype] = _net_receive; + pnt_receive_size[_mechtype] = 1; + hoc_register_var(hoc_scdoub, hoc_vdoub, hoc_intfunc); + ivoc_help("help ?1 VecStim /Users/katharinaduecker/Documents/Projects Brown/hnn-core/hnn_core/mod/vecevent.mod\n"); + hoc_register_limits(_mechtype, _hoc_parm_limits); + hoc_register_units(_mechtype, _hoc_parm_units); + } +static int _reset; +static char *modelname = ""; + +static int error; +static int _ninits = 0; +static int _match_recurse=1; +static void _modl_cleanup(){ _match_recurse=1;} +static int element(); +static int play(); + +static void _net_receive (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 == 1.0 ) { + net_event ( _pnt, t ) ; + element ( _threadargs_ ) ; + if ( index > 0.0 ) { + artcell_net_send ( _tqitem, _args, _pnt, t + etime - t , 1.0 ) ; + } + } + } } + +/*VERBATIM*/ +extern double* vector_vec(); +extern int vector_capacity(); +extern void* vector_arg(); + +static int element ( ) { + +/*VERBATIM*/ + { void* vv; int i, size; double* px; + i = (int)index; + if (i >= 0) { + vv = *((void**)(&space)); + if (vv) { + size = vector_capacity(vv); + px = vector_vec(vv); + if (i < size) { + etime = px[i]; + index += 1.; + } else { + index = -1.; + } + } else { + index = -1.; + } + } + } + return 0; } + +static double _hoc_element(void* _vptr) { + double _r; + _hoc_setdata(_vptr); + _r = 1.; + element ( ); + return(_r); +} + +static int play ( ) { + +/*VERBATIM*/ + void** vv; + vv = (void**)(&space); + *vv = (void*)0; + if (ifarg(1)) { + *vv = vector_arg(1); + } + return 0; } + +static double _hoc_play(void* _vptr) { + double _r; + _hoc_setdata(_vptr); + _r = 1.; + play ( ); + return(_r); +} + +static void initmodel() { + int _i; double _save;_ninits++; +{ + { + index = 0.0 ; + element ( _threadargs_ ) ; + if ( index > 0.0 ) { + artcell_net_send ( _tqitem, (double*)0, _ppvar[1]._pvoid, t + etime - t , 1.0 ) ; + } + } + +} +} + +static void nrn_init(NrnThread* _nt, _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; + initmodel(); +}} + +static double _nrn_current(double _v){double _current=0.;v=_v;{ +} return _current; +} + +static void nrn_state(NrnThread* _nt, _Memb_list* _ml, int _type){ +Node *_nd; double _v = 0.0; 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]; + v=_v; +{ +}} + +} + +static void terminal(){} + +static void _initlists() { + int _i; static int _first = 1; + if (!_first) return; +_first = 0; +} + +#if NMODL_TEXT +static const char* nmodl_filename = "/Users/katharinaduecker/Documents/Projects Brown/hnn-core/hnn_core/mod/vecevent.mod"; +static const char* nmodl_file_text = + ": Vector stream of events\n" + "\n" + "NEURON {\n" + " ARTIFICIAL_CELL VecStim\n" + "}\n" + "\n" + "ASSIGNED {\n" + " index\n" + " etime (ms)\n" + " space\n" + "}\n" + "\n" + "INITIAL {\n" + " index = 0\n" + " element()\n" + " if (index > 0) {\n" + " net_send(etime - t, 1)\n" + " }\n" + "}\n" + "\n" + "NET_RECEIVE (w) {\n" + " if (flag == 1) {\n" + " net_event(t)\n" + " element()\n" + " if (index > 0) {\n" + " net_send(etime - t, 1)\n" + " }\n" + " }\n" + "}\n" + "\n" + "VERBATIM\n" + "extern double* vector_vec();\n" + "extern int vector_capacity();\n" + "extern void* vector_arg();\n" + "ENDVERBATIM\n" + "\n" + "PROCEDURE element() {\n" + "VERBATIM\n" + " { void* vv; int i, size; double* px;\n" + " i = (int)index;\n" + " if (i >= 0) {\n" + " vv = *((void**)(&space));\n" + " if (vv) {\n" + " size = vector_capacity(vv);\n" + " px = vector_vec(vv);\n" + " if (i < size) {\n" + " etime = px[i];\n" + " index += 1.;\n" + " } else {\n" + " index = -1.;\n" + " }\n" + " } else {\n" + " index = -1.;\n" + " }\n" + " }\n" + " }\n" + "ENDVERBATIM\n" + "}\n" + "\n" + "PROCEDURE play() {\n" + "VERBATIM\n" + " void** vv;\n" + " vv = (void**)(&space);\n" + " *vv = (void*)0;\n" + " if (ifarg(1)) {\n" + " *vv = vector_arg(1);\n" + " }\n" + "ENDVERBATIM\n" + "}\n" + ; +#endif diff --git a/hnn_core/mod/arm64/vecevent.o b/hnn_core/mod/arm64/vecevent.o new file mode 100644 index 0000000000000000000000000000000000000000..78c3b08684bce7cdbdc1c40dc37ac4aea9031f25 GIT binary patch literal 7952 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 Date: Sun, 27 Oct 2024 14:12:23 -0400 Subject: [PATCH 03/28] describe new parameters --- hnn_core/network.py | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/hnn_core/network.py b/hnn_core/network.py index 988048368..ef74b1b23 100644 --- a/hnn_core/network.py +++ b/hnn_core/network.py @@ -1143,6 +1143,10 @@ def add_tonic_bias(self, *, cell_type=None, sect_name='soma', bias_name='tonic', The name of the cell type to add a tonic input. When supplied, a float value must be provided with the `amplitude` keyword. Valid inputs are those listed in `net.cell_types`. + sect_name : str | 'soma' + section the bias should be added to. + bias_name : str | 'tonic' + The name of the bias (allows several biases to be added to the cell). amplitude: dict | float A dictionary of cell type keys (str) to amplitude values (float). Valid inputs for cell types are those listed in `net.cell_types`. From 6aeb75ebcd2e6e97914aca71fc89a66e586b5a12 Mon Sep 17 00:00:00 2001 From: katduecker Date: Sun, 27 Oct 2024 14:25:17 -0400 Subject: [PATCH 04/28] stop tracking arm64 --- hnn_core/mod/arm64/.libs/libnrnmech.so | Bin 115696 -> 0 bytes hnn_core/mod/arm64/ar.c | 582 ---------------- hnn_core/mod/arm64/ar.o | Bin 9760 -> 0 bytes hnn_core/mod/arm64/ca.c | 786 ---------------------- hnn_core/mod/arm64/ca.o | Bin 17312 -> 0 bytes hnn_core/mod/arm64/cad.c | 577 ---------------- hnn_core/mod/arm64/cad.o | Bin 10640 -> 0 bytes hnn_core/mod/arm64/cat.c | 628 ------------------ hnn_core/mod/arm64/cat.o | Bin 11088 -> 0 bytes hnn_core/mod/arm64/dipole.c | 339 ---------- hnn_core/mod/arm64/dipole.o | Bin 5864 -> 0 bytes hnn_core/mod/arm64/dipole_pp.c | 398 ----------- hnn_core/mod/arm64/dipole_pp.o | Bin 7296 -> 0 bytes hnn_core/mod/arm64/hh2.c | 883 ------------------------- hnn_core/mod/arm64/hh2.o | Bin 18496 -> 0 bytes hnn_core/mod/arm64/kca.c | 629 ------------------ hnn_core/mod/arm64/kca.o | Bin 13328 -> 0 bytes hnn_core/mod/arm64/km.c | 728 -------------------- hnn_core/mod/arm64/km.o | Bin 15824 -> 0 bytes hnn_core/mod/arm64/libnrnmech.dylib | Bin 115696 -> 0 bytes hnn_core/mod/arm64/makemod2c_inc | 80 --- hnn_core/mod/arm64/mod_func.cpp | 49 -- hnn_core/mod/arm64/mod_func.o | Bin 2320 -> 0 bytes hnn_core/mod/arm64/special | 103 --- hnn_core/mod/arm64/special.nrn | 103 --- hnn_core/mod/arm64/vecevent.c | 421 ------------ hnn_core/mod/arm64/vecevent.o | Bin 7952 -> 0 bytes 27 files changed, 6306 deletions(-) delete mode 100755 hnn_core/mod/arm64/.libs/libnrnmech.so delete mode 100644 hnn_core/mod/arm64/ar.c delete mode 100644 hnn_core/mod/arm64/ar.o delete mode 100644 hnn_core/mod/arm64/ca.c delete mode 100644 hnn_core/mod/arm64/ca.o delete mode 100644 hnn_core/mod/arm64/cad.c delete mode 100644 hnn_core/mod/arm64/cad.o delete mode 100644 hnn_core/mod/arm64/cat.c delete mode 100644 hnn_core/mod/arm64/cat.o delete mode 100644 hnn_core/mod/arm64/dipole.c delete mode 100644 hnn_core/mod/arm64/dipole.o delete mode 100644 hnn_core/mod/arm64/dipole_pp.c delete mode 100644 hnn_core/mod/arm64/dipole_pp.o delete mode 100644 hnn_core/mod/arm64/hh2.c delete mode 100644 hnn_core/mod/arm64/hh2.o delete mode 100644 hnn_core/mod/arm64/kca.c delete mode 100644 hnn_core/mod/arm64/kca.o delete mode 100644 hnn_core/mod/arm64/km.c delete mode 100644 hnn_core/mod/arm64/km.o delete mode 100755 hnn_core/mod/arm64/libnrnmech.dylib delete mode 100644 hnn_core/mod/arm64/makemod2c_inc delete mode 100644 hnn_core/mod/arm64/mod_func.cpp delete mode 100644 hnn_core/mod/arm64/mod_func.o delete mode 100755 hnn_core/mod/arm64/special delete mode 100755 hnn_core/mod/arm64/special.nrn delete mode 100644 hnn_core/mod/arm64/vecevent.c delete mode 100644 hnn_core/mod/arm64/vecevent.o diff --git a/hnn_core/mod/arm64/.libs/libnrnmech.so b/hnn_core/mod/arm64/.libs/libnrnmech.so deleted file mode 100755 index 5f62907728cdcc3ad109b31a42d12bd162e4fb56..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 115696 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 Szbo$?G5&AYteVQc0{0&h_u(x7 diff --git a/hnn_core/mod/arm64/ar.c b/hnn_core/mod/arm64/ar.c deleted file mode 100644 index b573a859e..000000000 --- a/hnn_core/mod/arm64/ar.c +++ /dev/null @@ -1,582 +0,0 @@ -/* Created by Language version: 7.7.0 */ -/* VECTORIZED */ -#define NRN_VECTORIZED 1 -#include -#include -#include -#include "mech_api.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 nrn_init _nrn_init__ar -#define _nrn_initial _nrn_initial__ar -#define nrn_cur _nrn_cur__ar -#define _nrn_current _nrn_current__ar -#define nrn_jacob _nrn_jacob__ar -#define nrn_state _nrn_state__ar -#define _net_receive _net_receive__ar -#define _f_settables _f_settables__ar -#define settables settables__ar -#define states states__ar - -#define _threadargscomma_ _p, _ppvar, _thread, _nt, -#define _threadargsprotocomma_ double* _p, Datum* _ppvar, Datum* _thread, NrnThread* _nt, -#define _threadargs_ _p, _ppvar, _thread, _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 gbar _p[0] -#define gbar_columnindex 0 -#define i _p[1] -#define i_columnindex 1 -#define m _p[2] -#define m_columnindex 2 -#define minf _p[3] -#define minf_columnindex 3 -#define mtau _p[4] -#define mtau_columnindex 4 -#define Dm _p[5] -#define Dm_columnindex 5 -#define v _p[6] -#define v_columnindex 6 -#define _g _p[7] -#define _g_columnindex 7 - -#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 void _hoc_settables(void); - 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; - -#define NMODL_TEXT 1 -#if NMODL_TEXT -static const char* nmodl_file_text; -static const char* nmodl_filename; -extern void hoc_reg_nmodl_text(int, const char*); -extern void hoc_reg_nmodl_filename(int, const char*); -#endif - - extern void _nrn_setdata_reg(int, void(*)(Prop*)); - static void _setdata(Prop* _prop) { - _extcall_prop = _prop; - } - static void _hoc_setdata() { - Prop *_prop, *hoc_getdata_range(int); - _prop = hoc_getdata_range(_mechtype); - _setdata(_prop); - hoc_retpushx(1.); -} - /* connect user functions to hoc names */ - static VoidFunc hoc_intfunc[] = { - "setdata_ar", _hoc_setdata, - "settables_ar", _hoc_settables, - 0, 0 -}; - -static void _check_settables(double*, Datum*, Datum*, NrnThread*); -static void _check_table_thread(double* _p, Datum* _ppvar, Datum* _thread, NrnThread* _nt, int _type) { - _check_settables(_p, _ppvar, _thread, _nt); - } - /* declare global and static user variables */ -#define erev erev_ar - double erev = -35; -#define usetable usetable_ar - double usetable = 1; - /* some parameters have upper and lower limits */ - static HocParmLimits _hoc_parm_limits[] = { - "usetable_ar", 0, 1, - 0,0,0 -}; - static HocParmUnits _hoc_parm_units[] = { - "erev_ar", "mV", - "gbar_ar", "mho/cm2", - "i_ar", "mA/cm2", - 0,0 -}; - static double delta_t = 1; - static double m0 = 0; - /* connect global user variables to hoc */ - static DoubScal hoc_scdoub[] = { - "erev_ar", &erev_ar, - "usetable_ar", &usetable_ar, - 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 int _ode_count(int); -static void _ode_map(int, double**, double**, double*, Datum*, double*, int); -static void _ode_spec(NrnThread*, _Memb_list*, int); -static void _ode_matsol(NrnThread*, _Memb_list*, int); - -#define _cvode_ieq _ppvar[0]._i - static void _ode_matsol_instance1(_threadargsproto_); - /* connect range variables in _p that hoc is supposed to know about */ - static const char *_mechanism[] = { - "7.7.0", -"ar", - "gbar_ar", - 0, - "i_ar", - 0, - "m_ar", - 0, - 0}; - -extern Prop* need_memb(Symbol*); - -static void nrn_alloc(Prop* _prop) { - Prop *prop_ion; - double *_p; Datum *_ppvar; - _p = nrn_prop_data_alloc(_mechtype, 8, _prop); - /*initialize range parameters*/ - gbar = 0; - _prop->param = _p; - _prop->param_size = 8; - _ppvar = nrn_prop_datum_alloc(_mechtype, 1, _prop); - _prop->dparam = _ppvar; - /*connect ionic variables to this model*/ - -} - static void _initlists(); - /* some states have an absolute tolerance */ - static Symbol** _atollist; - static HocStateTolerance _hoc_state_tol[] = { - 0,0 -}; - extern Symbol* hoc_lookup(const char*); -extern void _nrn_thread_reg(int, int, void(*)(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 _ar_reg() { - int _vectorized = 1; - _initlists(); - register_mech(_mechanism, nrn_alloc,nrn_cur, nrn_jacob, nrn_state, nrn_init, hoc_nrnpointerindex, 1); - _mechtype = nrn_get_mechtype(_mechanism[1]); - _nrn_setdata_reg(_mechtype, _setdata); - _nrn_thread_table_reg(_mechtype, _check_table_thread); - #if NMODL_TEXT - hoc_reg_nmodl_text(_mechtype, nmodl_file_text); - hoc_reg_nmodl_filename(_mechtype, nmodl_filename); -#endif - hoc_register_prop_size(_mechtype, 8, 1); - hoc_register_dparam_semantics(_mechtype, 0, "cvodeieq"); - hoc_register_cvode(_mechtype, _ode_count, _ode_map, _ode_spec, _ode_matsol); - hoc_register_tolerance(_mechtype, _hoc_state_tol, &_atollist); - hoc_register_var(hoc_scdoub, hoc_vdoub, hoc_intfunc); - ivoc_help("help ?1 ar /Users/katharinaduecker/Documents/Projects Brown/hnn-core/hnn_core/mod/ar.mod\n"); - hoc_register_limits(_mechtype, _hoc_parm_limits); - hoc_register_units(_mechtype, _hoc_parm_units); - } - static double *_t_minf; - static double *_t_mtau; -static int _reset; -static char *modelname = "Anomalous rectifier current for RD Traub, J Neurophysiol 89:909-921, 2003"; - -static int error; -static int _ninits = 0; -static int _match_recurse=1; -static void _modl_cleanup(){ _match_recurse=1;} -static int _f_settables(_threadargsprotocomma_ double); -static int settables(_threadargsprotocomma_ double); - -static int _ode_spec1(_threadargsproto_); -/*static int _ode_matsol1(_threadargsproto_);*/ - static void _n_settables(_threadargsprotocomma_ double _lv); - static int _slist1[1], _dlist1[1]; - static int states(_threadargsproto_); - -/*CVODE*/ - static int _ode_spec1 (double* _p, Datum* _ppvar, Datum* _thread, NrnThread* _nt) {int _reset = 0; { - settables ( _threadargscomma_ v ) ; - Dm = ( minf - m ) / mtau ; - } - return _reset; -} - static int _ode_matsol1 (double* _p, Datum* _ppvar, Datum* _thread, NrnThread* _nt) { - settables ( _threadargscomma_ v ) ; - Dm = Dm / (1. - dt*( ( ( ( - 1.0 ) ) ) / mtau )) ; - return 0; -} - /*END CVODE*/ - static int states (double* _p, Datum* _ppvar, Datum* _thread, NrnThread* _nt) { { - settables ( _threadargscomma_ v ) ; - m = m + (1. - exp(dt*(( ( ( - 1.0 ) ) ) / mtau)))*(- ( ( ( minf ) ) / mtau ) / ( ( ( ( - 1.0 ) ) ) / mtau ) - m) ; - } - return 0; -} - static double _mfac_settables, _tmin_settables; - static void _check_settables(double* _p, Datum* _ppvar, Datum* _thread, NrnThread* _nt) { - static int _maktable=1; int _i, _j, _ix = 0; - double _xi, _tmax; - if (!usetable) {return;} - if (_maktable) { double _x, _dx; _maktable=0; - _tmin_settables = - 120.0 ; - _tmax = 40.0 ; - _dx = (_tmax - _tmin_settables)/641.; _mfac_settables = 1./_dx; - for (_i=0, _x=_tmin_settables; _i < 642; _x += _dx, _i++) { - _f_settables(_p, _ppvar, _thread, _nt, _x); - _t_minf[_i] = minf; - _t_mtau[_i] = mtau; - } - } - } - - static int settables(double* _p, Datum* _ppvar, Datum* _thread, NrnThread* _nt, double _lv) { -#if 0 -_check_settables(_p, _ppvar, _thread, _nt); -#endif - _n_settables(_p, _ppvar, _thread, _nt, _lv); - return 0; - } - - static void _n_settables(double* _p, Datum* _ppvar, Datum* _thread, NrnThread* _nt, double _lv){ int _i, _j; - double _xi, _theta; - if (!usetable) { - _f_settables(_p, _ppvar, _thread, _nt, _lv); return; -} - _xi = _mfac_settables * (_lv - _tmin_settables); - if (isnan(_xi)) { - minf = _xi; - mtau = _xi; - return; - } - if (_xi <= 0.) { - minf = _t_minf[0]; - mtau = _t_mtau[0]; - return; } - if (_xi >= 641.) { - minf = _t_minf[641]; - mtau = _t_mtau[641]; - return; } - _i = (int) _xi; - _theta = _xi - (double)_i; - minf = _t_minf[_i] + _theta*(_t_minf[_i+1] - _t_minf[_i]); - mtau = _t_mtau[_i] + _theta*(_t_mtau[_i+1] - _t_mtau[_i]); - } - - -static int _f_settables ( _threadargsprotocomma_ double _lv ) { - minf = 1.0 / ( 1.0 + exp ( ( _lv + 75.0 ) / 5.5 ) ) ; - mtau = 1.0 / ( exp ( - 14.6 - 0.086 * _lv ) + exp ( - 1.87 + 0.07 * _lv ) ) ; - return 0; } - -static void _hoc_settables(void) { - double _r; - double* _p; Datum* _ppvar; Datum* _thread; NrnThread* _nt; - if (_extcall_prop) {_p = _extcall_prop->param; _ppvar = _extcall_prop->dparam;}else{ _p = (double*)0; _ppvar = (Datum*)0; } - _thread = _extcall_thread; - _nt = nrn_threads; - -#if 1 - _check_settables(_p, _ppvar, _thread, _nt); -#endif - _r = 1.; - settables ( _p, _ppvar, _thread, _nt, *getarg(1) ); - hoc_retpushx(_r); -} - -static int _ode_count(int _type){ return 1;} - -static void _ode_spec(NrnThread* _nt, _Memb_list* _ml, int _type) { - double* _p; Datum* _ppvar; Datum* _thread; - Node* _nd; double _v; int _iml, _cntml; - _cntml = _ml->_nodecount; - _thread = _ml->_thread; - for (_iml = 0; _iml < _cntml; ++_iml) { - _p = _ml->_data[_iml]; _ppvar = _ml->_pdata[_iml]; - _nd = _ml->_nodelist[_iml]; - v = NODEV(_nd); - _ode_spec1 (_p, _ppvar, _thread, _nt); - }} - -static void _ode_map(int _ieq, double** _pv, double** _pvdot, double* _pp, Datum* _ppd, double* _atol, int _type) { - double* _p; Datum* _ppvar; - int _i; _p = _pp; _ppvar = _ppd; - _cvode_ieq = _ieq; - for (_i=0; _i < 1; ++_i) { - _pv[_i] = _pp + _slist1[_i]; _pvdot[_i] = _pp + _dlist1[_i]; - _cvode_abstol(_atollist, _atol, _i); - } - } - -static void _ode_matsol_instance1(_threadargsproto_) { - _ode_matsol1 (_p, _ppvar, _thread, _nt); - } - -static void _ode_matsol(NrnThread* _nt, _Memb_list* _ml, int _type) { - double* _p; Datum* _ppvar; Datum* _thread; - Node* _nd; double _v; int _iml, _cntml; - _cntml = _ml->_nodecount; - _thread = _ml->_thread; - for (_iml = 0; _iml < _cntml; ++_iml) { - _p = _ml->_data[_iml]; _ppvar = _ml->_pdata[_iml]; - _nd = _ml->_nodelist[_iml]; - v = NODEV(_nd); - _ode_matsol_instance1(_threadargs_); - }} - -static void initmodel(double* _p, Datum* _ppvar, Datum* _thread, NrnThread* _nt) { - int _i; double _save;{ - m = m0; - { - settables ( _threadargscomma_ v ) ; - m = minf ; - m = 0.25 ; - } - -} -} - -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 0 - _check_settables(_p, _ppvar, _thread, _nt); -#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;{ { - i = gbar * m * ( v - erev ) ; - } - _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 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; -#if CACHEVEC - if (use_cachevec) { - VEC_RHS(_ni[_iml]) -= _rhs; - }else -#endif - { - NODERHS(_nd) -= _rhs; - } - -} - -} - -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]; -#if CACHEVEC - if (use_cachevec) { - VEC_D(_ni[_iml]) += _g; - }else -#endif - { - _nd = _ml->_nodelist[_iml]; - NODED(_nd) += _g; - } - -} - -} - -static void nrn_state(NrnThread* _nt, _Memb_list* _ml, int _type) { -double* _p; Datum* _ppvar; Datum* _thread; -Node *_nd; double _v = 0.0; 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 CACHEVEC - if (use_cachevec) { - _v = VEC_V(_ni[_iml]); - }else -#endif - { - _nd = _ml->_nodelist[_iml]; - _v = NODEV(_nd); - } - v=_v; -{ - { states(_p, _ppvar, _thread, _nt); - }}} - -} - -static void terminal(){} - -static void _initlists(){ - double _x; double* _p = &_x; - int _i; static int _first = 1; - if (!_first) return; - _slist1[0] = m_columnindex; _dlist1[0] = Dm_columnindex; - _t_minf = makevector(642*sizeof(double)); - _t_mtau = makevector(642*sizeof(double)); -_first = 0; -} - -#if defined(__cplusplus) -} /* extern "C" */ -#endif - -#if NMODL_TEXT -static const char* nmodl_filename = "/Users/katharinaduecker/Documents/Projects Brown/hnn-core/hnn_core/mod/ar.mod"; -static const char* nmodl_file_text = - "TITLE Anomalous rectifier current for RD Traub, J Neurophysiol 89:909-921, 2003\n" - "\n" - "COMMENT\n" - " Implemented by Maciej Lazarewicz 2003 (mlazarew@seas.upenn.edu)\n" - "ENDCOMMENT\n" - "\n" - "INDEPENDENT { t FROM 0 TO 1 WITH 1 (ms) }\n" - "\n" - "UNITS {\n" - " (mV) = (millivolt)\n" - " (mA) = (milliamp)\n" - "}\n" - "\n" - "NEURON {\n" - " SUFFIX ar\n" - " NONSPECIFIC_CURRENT i\n" - " RANGE gbar, i\n" - "}\n" - "\n" - "PARAMETER {\n" - " gbar = 0.0 (mho/cm2)\n" - " v (mV)\n" - " erev = -35 (mV)\n" - "}\n" - "\n" - "ASSIGNED {\n" - " i (mA/cm2)\n" - " minf (1)\n" - " mtau (ms)\n" - "}\n" - "\n" - "STATE {\n" - " m\n" - "}\n" - "\n" - "BREAKPOINT {\n" - " SOLVE states METHOD cnexp\n" - " i = gbar * m * ( v - erev )\n" - "}\n" - "\n" - "INITIAL {\n" - " settables(v)\n" - " m = minf\n" - " m = 0.25\n" - "}\n" - "\n" - "DERIVATIVE states {\n" - " settables(v)\n" - " m' = ( minf - m ) / mtau\n" - "}\n" - "\n" - "UNITSOFF\n" - "PROCEDURE settables(v) {\n" - " TABLE minf, mtau FROM -120 TO 40 WITH 641\n" - " minf = 1 / ( 1 + exp( ( v + 75 ) / 5.5 ) )\n" - " mtau = 1 / ( exp( -14.6 - 0.086 * v ) + exp( -1.87 + 0.07 * v ) )\n" - "}\n" - "UNITSON\n" - ; -#endif diff --git a/hnn_core/mod/arm64/ar.o b/hnn_core/mod/arm64/ar.o deleted file mode 100644 index 798d8132b2c776c8358c12c45fcd158cd9ce8e70..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 9760 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 TRFctj%Byh0jeo5&nvDGy*=kPd diff --git a/hnn_core/mod/arm64/ca.c b/hnn_core/mod/arm64/ca.c deleted file mode 100644 index fcc6a508f..000000000 --- a/hnn_core/mod/arm64/ca.c +++ /dev/null @@ -1,786 +0,0 @@ -/* Created by Language version: 7.7.0 */ -/* NOT VECTORIZED */ -#define NRN_VECTORIZED 0 -#include -#include -#include -#include "mech_api.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 nrn_init _nrn_init__ca -#define _nrn_initial _nrn_initial__ca -#define nrn_cur _nrn_cur__ca -#define _nrn_current _nrn_current__ca -#define nrn_jacob _nrn_jacob__ca -#define nrn_state _nrn_state__ca -#define _net_receive _net_receive__ca -#define _f_trates _f_trates__ca -#define rates rates__ca -#define states states__ca -#define trates trates__ca - -#define _threadargscomma_ /**/ -#define _threadargsprotocomma_ /**/ -#define _threadargs_ /**/ -#define _threadargsproto_ /**/ - /*SUPPRESS 761*/ - /*SUPPRESS 762*/ - /*SUPPRESS 763*/ - /*SUPPRESS 765*/ - extern double *getarg(); - static double *_p; static Datum *_ppvar; - -#define t nrn_threads->_t -#define dt nrn_threads->_dt -#define gbar _p[0] -#define gbar_columnindex 0 -#define gca _p[1] -#define gca_columnindex 1 -#define minf _p[2] -#define minf_columnindex 2 -#define hinf _p[3] -#define hinf_columnindex 3 -#define mtau _p[4] -#define mtau_columnindex 4 -#define htau _p[5] -#define htau_columnindex 5 -#define m _p[6] -#define m_columnindex 6 -#define h _p[7] -#define h_columnindex 7 -#define ica _p[8] -#define ica_columnindex 8 -#define eca _p[9] -#define eca_columnindex 9 -#define Dm _p[10] -#define Dm_columnindex 10 -#define Dh _p[11] -#define Dh_columnindex 11 -#define _g _p[12] -#define _g_columnindex 12 -#define _ion_eca *_ppvar[0]._pval -#define _ion_ica *_ppvar[1]._pval -#define _ion_dicadv *_ppvar[2]._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; - /* external NEURON variables */ - extern double celsius; - /* declaration of user functions */ - static void _hoc_efun(void); - static void _hoc_rates(void); - static void _hoc_trates(void); - 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; - -#define NMODL_TEXT 1 -#if NMODL_TEXT -static const char* nmodl_file_text; -static const char* nmodl_filename; -extern void hoc_reg_nmodl_text(int, const char*); -extern void hoc_reg_nmodl_filename(int, const char*); -#endif - - extern void _nrn_setdata_reg(int, void(*)(Prop*)); - static void _setdata(Prop* _prop) { - _p = _prop->param; _ppvar = _prop->dparam; - } - static void _hoc_setdata() { - Prop *_prop, *hoc_getdata_range(int); - _prop = hoc_getdata_range(_mechtype); - _setdata(_prop); - hoc_retpushx(1.); -} - /* connect user functions to hoc names */ - static VoidFunc hoc_intfunc[] = { - "setdata_ca", _hoc_setdata, - "efun_ca", _hoc_efun, - "rates_ca", _hoc_rates, - "trates_ca", _hoc_trates, - 0, 0 -}; -#define efun efun_ca - extern double efun( double ); - /* declare global and static user variables */ -#define cai cai_ca - double cai = 0; -#define cao cao_ca - double cao = 2.5; -#define q10 q10_ca - double q10 = 2.3; -#define tshift tshift_ca - double tshift = 30.7; -#define tadj tadj_ca - double tadj = 0; -#define temp temp_ca - double temp = 23; -#define usetable usetable_ca - double usetable = 1; -#define vshift vshift_ca - double vshift = 0; -#define vmax vmax_ca - double vmax = 100; -#define vmin vmin_ca - double vmin = -120; - /* some parameters have upper and lower limits */ - static HocParmLimits _hoc_parm_limits[] = { - "usetable_ca", 0, 1, - 0,0,0 -}; - static HocParmUnits _hoc_parm_units[] = { - "vshift_ca", "mV", - "cao_ca", "mM", - "cai_ca", "mM", - "temp_ca", "degC", - "vmin_ca", "mV", - "vmax_ca", "mV", - "gbar_ca", "pS/um2", - "gca_ca", "pS/um2", - "mtau_ca", "ms", - "htau_ca", "ms", - 0,0 -}; - static double delta_t = 1; - static double h0 = 0; - static double m0 = 0; - static double v = 0; - /* connect global user variables to hoc */ - static DoubScal hoc_scdoub[] = { - "vshift_ca", &vshift_ca, - "cao_ca", &cao_ca, - "cai_ca", &cai_ca, - "temp_ca", &temp_ca, - "q10_ca", &q10_ca, - "tshift_ca", &tshift_ca, - "vmin_ca", &vmin_ca, - "vmax_ca", &vmax_ca, - "tadj_ca", &tadj_ca, - "usetable_ca", &usetable_ca, - 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 int _ode_count(int); -static void _ode_map(int, double**, double**, double*, Datum*, double*, int); -static void _ode_spec(NrnThread*, _Memb_list*, int); -static void _ode_matsol(NrnThread*, _Memb_list*, int); - -#define _cvode_ieq _ppvar[3]._i - static void _ode_matsol_instance1(_threadargsproto_); - /* connect range variables in _p that hoc is supposed to know about */ - static const char *_mechanism[] = { - "7.7.0", -"ca", - "gbar_ca", - 0, - "gca_ca", - "minf_ca", - "hinf_ca", - "mtau_ca", - "htau_ca", - 0, - "m_ca", - "h_ca", - 0, - 0}; - static Symbol* _ca_sym; - -extern Prop* need_memb(Symbol*); - -static void nrn_alloc(Prop* _prop) { - Prop *prop_ion; - double *_p; Datum *_ppvar; - _p = nrn_prop_data_alloc(_mechtype, 13, _prop); - /*initialize range parameters*/ - gbar = 0.1; - _prop->param = _p; - _prop->param_size = 13; - _ppvar = nrn_prop_datum_alloc(_mechtype, 4, _prop); - _prop->dparam = _ppvar; - /*connect ionic variables to this model*/ - prop_ion = need_memb(_ca_sym); - nrn_promote(prop_ion, 0, 1); - _ppvar[0]._pval = &prop_ion->param[0]; /* eca */ - _ppvar[1]._pval = &prop_ion->param[3]; /* ica */ - _ppvar[2]._pval = &prop_ion->param[4]; /* _ion_dicadv */ - -} - static void _initlists(); - /* some states have an absolute tolerance */ - static Symbol** _atollist; - static HocStateTolerance _hoc_state_tol[] = { - 0,0 -}; - static void _update_ion_pointer(Datum*); - extern Symbol* hoc_lookup(const char*); -extern void _nrn_thread_reg(int, int, void(*)(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 _ca_reg() { - int _vectorized = 0; - _initlists(); - ion_reg("ca", -10000.); - _ca_sym = hoc_lookup("ca_ion"); - register_mech(_mechanism, nrn_alloc,nrn_cur, nrn_jacob, nrn_state, nrn_init, hoc_nrnpointerindex, 0); - _mechtype = nrn_get_mechtype(_mechanism[1]); - _nrn_setdata_reg(_mechtype, _setdata); - _nrn_thread_reg(_mechtype, 2, _update_ion_pointer); - #if NMODL_TEXT - hoc_reg_nmodl_text(_mechtype, nmodl_file_text); - hoc_reg_nmodl_filename(_mechtype, nmodl_filename); -#endif - hoc_register_prop_size(_mechtype, 13, 4); - hoc_register_dparam_semantics(_mechtype, 0, "ca_ion"); - hoc_register_dparam_semantics(_mechtype, 1, "ca_ion"); - hoc_register_dparam_semantics(_mechtype, 2, "ca_ion"); - hoc_register_dparam_semantics(_mechtype, 3, "cvodeieq"); - hoc_register_cvode(_mechtype, _ode_count, _ode_map, _ode_spec, _ode_matsol); - hoc_register_tolerance(_mechtype, _hoc_state_tol, &_atollist); - hoc_register_var(hoc_scdoub, hoc_vdoub, hoc_intfunc); - ivoc_help("help ?1 ca /Users/katharinaduecker/Documents/Projects Brown/hnn-core/hnn_core/mod/ca.mod\n"); - hoc_register_limits(_mechtype, _hoc_parm_limits); - hoc_register_units(_mechtype, _hoc_parm_units); - } - -#define FARADAY _nrnunit_FARADAY[_nrnunit_use_legacy_] -static double _nrnunit_FARADAY[2] = {0x1.78e555060882cp+16, 96485.3}; /* 96485.3321233100141 */ - -#define R _nrnunit_R[_nrnunit_use_legacy_] -static double _nrnunit_R[2] = {0x1.0a1013e8990bep+3, 8.3145}; /* 8.3144626181532395 */ - -#define PI _nrnunit_PI[_nrnunit_use_legacy_] -static double _nrnunit_PI[2] = {0x1.921fb54442d18p+1, 3.14159}; /* 3.14159265358979312 */ - static double _zmexp , _zhexp ; - static double *_t_minf; - static double *_t_hinf; - static double *_t_mtau; - static double *_t_htau; -static int _reset; -static char *modelname = ""; - -static int error; -static int _ninits = 0; -static int _match_recurse=1; -static void _modl_cleanup(){ _match_recurse=1;} -static int _f_trates(double); -static int rates(double); -static int trates(double); - -static int _ode_spec1(_threadargsproto_); -/*static int _ode_matsol1(_threadargsproto_);*/ - static void _n_trates(double); - static int _slist1[2], _dlist1[2]; - static int states(_threadargsproto_); - -/*CVODE*/ - static int _ode_spec1 () {_reset=0; - { - trates ( _threadargscomma_ v + vshift ) ; - Dm = ( minf - m ) / mtau ; - Dh = ( hinf - h ) / htau ; - } - return _reset; -} - static int _ode_matsol1 () { - trates ( _threadargscomma_ v + vshift ) ; - Dm = Dm / (1. - dt*( ( ( ( - 1.0 ) ) ) / mtau )) ; - Dh = Dh / (1. - dt*( ( ( ( - 1.0 ) ) ) / htau )) ; - return 0; -} - /*END CVODE*/ - static int states () {_reset=0; - { - trates ( _threadargscomma_ v + vshift ) ; - m = m + (1. - exp(dt*(( ( ( - 1.0 ) ) ) / mtau)))*(- ( ( ( minf ) ) / mtau ) / ( ( ( ( - 1.0 ) ) ) / mtau ) - m) ; - h = h + (1. - exp(dt*(( ( ( - 1.0 ) ) ) / htau)))*(- ( ( ( hinf ) ) / htau ) / ( ( ( ( - 1.0 ) ) ) / htau ) - h) ; - } - return 0; -} - static double _mfac_trates, _tmin_trates; - static void _check_trates(); - static void _check_trates() { - static int _maktable=1; int _i, _j, _ix = 0; - double _xi, _tmax; - static double _sav_celsius; - static double _sav_temp; - if (!usetable) {return;} - if (_sav_celsius != celsius) { _maktable = 1;} - if (_sav_temp != temp) { _maktable = 1;} - if (_maktable) { double _x, _dx; _maktable=0; - _tmin_trates = vmin ; - _tmax = vmax ; - _dx = (_tmax - _tmin_trates)/199.; _mfac_trates = 1./_dx; - for (_i=0, _x=_tmin_trates; _i < 200; _x += _dx, _i++) { - _f_trates(_x); - _t_minf[_i] = minf; - _t_hinf[_i] = hinf; - _t_mtau[_i] = mtau; - _t_htau[_i] = htau; - } - _sav_celsius = celsius; - _sav_temp = temp; - } - } - - static int trates(double _lv){ _check_trates(); - _n_trates(_lv); - return 0; - } - - static void _n_trates(double _lv){ int _i, _j; - double _xi, _theta; - if (!usetable) { - _f_trates(_lv); return; -} - _xi = _mfac_trates * (_lv - _tmin_trates); - if (isnan(_xi)) { - minf = _xi; - hinf = _xi; - mtau = _xi; - htau = _xi; - return; - } - if (_xi <= 0.) { - minf = _t_minf[0]; - hinf = _t_hinf[0]; - mtau = _t_mtau[0]; - htau = _t_htau[0]; - return; } - if (_xi >= 199.) { - minf = _t_minf[199]; - hinf = _t_hinf[199]; - mtau = _t_mtau[199]; - htau = _t_htau[199]; - return; } - _i = (int) _xi; - _theta = _xi - (double)_i; - minf = _t_minf[_i] + _theta*(_t_minf[_i+1] - _t_minf[_i]); - hinf = _t_hinf[_i] + _theta*(_t_hinf[_i+1] - _t_hinf[_i]); - mtau = _t_mtau[_i] + _theta*(_t_mtau[_i+1] - _t_mtau[_i]); - htau = _t_htau[_i] + _theta*(_t_htau[_i+1] - _t_htau[_i]); - } - - -static int _f_trates ( double _lv ) { - rates ( _threadargscomma_ _lv ) ; - return 0; } - -static void _hoc_trates(void) { - double _r; - _r = 1.; - trates ( *getarg(1) ); - hoc_retpushx(_r); -} - -static int rates ( double _lvm ) { - double _la , _lb ; - tadj = pow( q10 , ( ( celsius - temp - tshift ) / 10.0 ) ) ; - _la = 0.055 * ( - 27.0 - _lvm ) / ( exp ( ( - 27.0 - _lvm ) / 3.8 ) - 1.0 ) ; - _lb = 0.94 * exp ( ( - 75.0 - _lvm ) / 17.0 ) ; - mtau = 1.0 / tadj / ( _la + _lb ) ; - minf = _la / ( _la + _lb ) ; - _la = 0.000457 * exp ( ( - 13.0 - _lvm ) / 50.0 ) ; - _lb = 0.0065 / ( exp ( ( - _lvm - 15.0 ) / 28.0 ) + 1.0 ) ; - htau = 1.0 / tadj / ( _la + _lb ) ; - hinf = _la / ( _la + _lb ) ; - return 0; } - -static void _hoc_rates(void) { - double _r; - _r = 1.; - rates ( *getarg(1) ); - hoc_retpushx(_r); -} - -double efun ( double _lz ) { - double _lefun; - if ( fabs ( _lz ) < 1e-4 ) { - _lefun = 1.0 - _lz / 2.0 ; - } - else { - _lefun = _lz / ( exp ( _lz ) - 1.0 ) ; - } - -return _lefun; - } - -static void _hoc_efun(void) { - double _r; - _r = efun ( *getarg(1) ); - hoc_retpushx(_r); -} - -static int _ode_count(int _type){ return 2;} - -static void _ode_spec(NrnThread* _nt, _Memb_list* _ml, int _type) { - Datum* _thread; - Node* _nd; double _v; int _iml, _cntml; - _cntml = _ml->_nodecount; - _thread = _ml->_thread; - for (_iml = 0; _iml < _cntml; ++_iml) { - _p = _ml->_data[_iml]; _ppvar = _ml->_pdata[_iml]; - _nd = _ml->_nodelist[_iml]; - v = NODEV(_nd); - eca = _ion_eca; - _ode_spec1 (); - }} - -static void _ode_map(int _ieq, double** _pv, double** _pvdot, double* _pp, Datum* _ppd, double* _atol, int _type) { - 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 void _ode_matsol_instance1(_threadargsproto_) { - _ode_matsol1 (); - } - -static void _ode_matsol(NrnThread* _nt, _Memb_list* _ml, int _type) { - Datum* _thread; - Node* _nd; double _v; int _iml, _cntml; - _cntml = _ml->_nodecount; - _thread = _ml->_thread; - for (_iml = 0; _iml < _cntml; ++_iml) { - _p = _ml->_data[_iml]; _ppvar = _ml->_pdata[_iml]; - _nd = _ml->_nodelist[_iml]; - v = NODEV(_nd); - eca = _ion_eca; - _ode_matsol_instance1(_threadargs_); - }} - extern void nrn_update_ion_pointer(Symbol*, Datum*, int, int); - static void _update_ion_pointer(Datum* _ppvar) { - nrn_update_ion_pointer(_ca_sym, _ppvar, 0, 0); - nrn_update_ion_pointer(_ca_sym, _ppvar, 1, 3); - nrn_update_ion_pointer(_ca_sym, _ppvar, 2, 4); - } - -static void initmodel() { - int _i; double _save;_ninits++; - _save = t; - t = 0.0; -{ - h = h0; - m = m0; - { - trates ( _threadargscomma_ v + vshift ) ; - m = minf ; - h = hinf ; - } - _sav_indep = t; t = _save; - -} -} - -static void nrn_init(NrnThread* _nt, _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]; -#if CACHEVEC - if (use_cachevec) { - _v = VEC_V(_ni[_iml]); - }else -#endif - { - _nd = _ml->_nodelist[_iml]; - _v = NODEV(_nd); - } - v = _v; - eca = _ion_eca; - initmodel(); - }} - -static double _nrn_current(double _v){double _current=0.;v=_v;{ { - gca = tadj * gbar * m * m * h ; - ica = ( 1e-4 ) * gca * ( v - eca ) ; - } - _current += ica; - -} return _current; -} - -static void nrn_cur(NrnThread* _nt, _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); - } - eca = _ion_eca; - _g = _nrn_current(_v + .001); - { double _dica; - _dica = ica; - _rhs = _nrn_current(_v); - _ion_dicadv += (_dica - ica)/.001 ; - } - _g = (_g - _rhs)/.001; - _ion_ica += ica ; -#if CACHEVEC - if (use_cachevec) { - VEC_RHS(_ni[_iml]) -= _rhs; - }else -#endif - { - NODERHS(_nd) -= _rhs; - } - -}} - -static void nrn_jacob(NrnThread* _nt, _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 void nrn_state(NrnThread* _nt, _Memb_list* _ml, int _type){ -Node *_nd; double _v = 0.0; 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); - } - v=_v; -{ - eca = _ion_eca; - { error = states(); - if(error){fprintf(stderr,"at line 73 in file ca.mod:\n SOLVE states METHOD cnexp\n"); nrn_complain(_p); abort_run(error);} - } }} - -} - -static void terminal(){} - -static void _initlists() { - int _i; static int _first = 1; - if (!_first) return; - _slist1[0] = m_columnindex; _dlist1[0] = Dm_columnindex; - _slist1[1] = h_columnindex; _dlist1[1] = Dh_columnindex; - _t_minf = makevector(200*sizeof(double)); - _t_hinf = makevector(200*sizeof(double)); - _t_mtau = makevector(200*sizeof(double)); - _t_htau = makevector(200*sizeof(double)); -_first = 0; -} - -#if NMODL_TEXT -static const char* nmodl_filename = "/Users/katharinaduecker/Documents/Projects Brown/hnn-core/hnn_core/mod/ca.mod"; -static const char* nmodl_file_text = - "COMMENT\n" - " 26 Ago 2002 Modification of original channel to allow variable time step\n" - " and to correct an initialization error.\n" - "\n" - " Done by Michael Hines(michael.hines@yale.edu) and Ruggero Scorcioni (rscorcio@gmu.edu)\n" - " at EU Advance Course in Computational Neuroscience. Obidos, Portugal\n" - "\n" - " ca.mod\n" - " Uses fixed eca instead of GHK eqn\n" - "\n" - " HVA Ca current\n" - " Based on Reuveni, Friedman, Amitai and Gutnick (1993) J. Neurosci. 13: 4609-4621.\n" - "\n" - " Author: Zach Mainen, Salk Institute, 1994, zach@salk.edu\n" - "ENDCOMMENT\n" - "\n" - "INDEPENDENT {t FROM 0 TO 1 WITH 1 (ms)}\n" - "\n" - "NEURON {\n" - " SUFFIX ca\n" - " USEION ca READ eca WRITE ica\n" - " RANGE m, h, gca, gbar\n" - " RANGE minf, hinf, mtau, htau\n" - " GLOBAL q10, temp, tadj, vmin, vmax, vshift, tshift\n" - "}\n" - "\n" - "PARAMETER {\n" - " gbar = 0.1 (pS/um2) : 0.12 mho/cm2\n" - " vshift = 0 (mV) : voltage shift (affects all)\n" - "\n" - " cao = 2.5 (mM) : external ca concentration\n" - " cai (mM)\n" - "\n" - " temp = 23 (degC) : original temp\n" - " q10 = 2.3 : temperature sensitivity\n" - " tshift = 30.7\n" - "\n" - " v (mV)\n" - " dt (ms)\n" - " celsius (degC)\n" - " vmin = -120 (mV)\n" - " vmax = 100 (mV)\n" - "}\n" - "\n" - "UNITS {\n" - " (mA) = (milliamp)\n" - " (mV) = (millivolt)\n" - " (pS) = (picosiemens)\n" - " (um) = (micron)\n" - " FARADAY = (faraday) (coulomb)\n" - " R = (k-mole) (joule/degC)\n" - " PI = (pi) (1)\n" - "}\n" - "\n" - "ASSIGNED {\n" - " ica (mA/cm2)\n" - " gca (pS/um2)\n" - " eca (mV)\n" - " minf hinf\n" - " mtau (ms) htau (ms)\n" - " tadj\n" - "}\n" - "\n" - "STATE { m h }\n" - "\n" - "INITIAL {\n" - " trates(v+vshift)\n" - " m = minf\n" - " h = hinf\n" - "}\n" - "\n" - "BREAKPOINT {\n" - " SOLVE states METHOD cnexp\n" - " gca = tadj * gbar * m * m * h\n" - " ica = (1e-4) * gca * (v - eca)\n" - "}\n" - "\n" - "LOCAL mexp, hexp\n" - "\n" - ": PROCEDURE states() {\n" - ": trates(v+vshift)\n" - ": m = m + mexp*(minf-m)\n" - ": h = h + hexp*(hinf-h)\n" - ": VERBATIM\n" - ": return 0;\n" - ": ENDVERBATIM\n" - ": }\n" - "\n" - "DERIVATIVE states {\n" - " trates(v + vshift)\n" - " m' = (minf - m) / mtau\n" - " h' = (hinf - h) / htau\n" - "}\n" - "\n" - "PROCEDURE trates(v) {\n" - " TABLE minf, hinf, mtau, htau\n" - " DEPEND celsius, temp\n" - "\n" - " FROM vmin TO vmax WITH 199\n" - "\n" - " : not consistently executed from here if usetable == 1\n" - " rates(v)\n" - "\n" - " : tinc = -dt * tadj\n" - "\n" - " : mexp = 1 - exp(tinc/mtau)\n" - " : hexp = 1 - exp(tinc/htau)\n" - "}\n" - "\n" - "PROCEDURE rates(vm) {\n" - " LOCAL a, b\n" - "\n" - " tadj = q10^((celsius - temp - tshift)/10)\n" - "\n" - " a = 0.055 * (-27 - vm) / (exp((-27 - vm) / 3.8) - 1)\n" - " b = 0.94 * exp((-75 - vm) / 17)\n" - "\n" - " mtau = 1 / tadj / (a+b)\n" - " minf = a / (a + b)\n" - "\n" - " : \"h\" inactivation\n" - " a = 0.000457 * exp((-13 - vm) / 50)\n" - " b = 0.0065 / (exp((-vm - 15) / 28) + 1)\n" - "\n" - " htau = 1 / tadj / (a + b)\n" - " hinf = a / (a + b)\n" - "}\n" - "\n" - "FUNCTION efun(z) {\n" - " if (fabs(z) < 1e-4) {\n" - " efun = 1 - z/2\n" - " } else {\n" - " efun = z / (exp(z) - 1)\n" - " }\n" - "}\n" - ; -#endif diff --git a/hnn_core/mod/arm64/ca.o b/hnn_core/mod/arm64/ca.o deleted file mode 100644 index 94c123755a6a1469f6f325ee2c5edf7162b1e084..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 17312 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 O>sandRoT -#include -#include -#include "mech_api.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 nrn_init _nrn_init__cad -#define _nrn_initial _nrn_initial__cad -#define nrn_cur _nrn_cur__cad -#define _nrn_current _nrn_current__cad -#define nrn_jacob _nrn_jacob__cad -#define nrn_state _nrn_state__cad -#define _net_receive _net_receive__cad -#define state state__cad - -#define _threadargscomma_ _p, _ppvar, _thread, _nt, -#define _threadargsprotocomma_ double* _p, Datum* _ppvar, Datum* _thread, NrnThread* _nt, -#define _threadargs_ _p, _ppvar, _thread, _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 taur _p[0] -#define taur_columnindex 0 -#define ca _p[1] -#define ca_columnindex 1 -#define cai _p[2] -#define cai_columnindex 2 -#define Dca _p[3] -#define Dca_columnindex 3 -#define ica _p[4] -#define ica_columnindex 4 -#define drive_channel _p[5] -#define drive_channel_columnindex 5 -#define v _p[6] -#define v_columnindex 6 -#define _g _p[7] -#define _g_columnindex 7 -#define _ion_ica *_ppvar[0]._pval -#define _ion_cai *_ppvar[1]._pval -#define _style_ca *((int*)_ppvar[2]._pvoid) - -#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 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; - -#define NMODL_TEXT 1 -#if NMODL_TEXT -static const char* nmodl_file_text; -static const char* nmodl_filename; -extern void hoc_reg_nmodl_text(int, const char*); -extern void hoc_reg_nmodl_filename(int, const char*); -#endif - - extern void _nrn_setdata_reg(int, void(*)(Prop*)); - static void _setdata(Prop* _prop) { - _extcall_prop = _prop; - } - static void _hoc_setdata() { - Prop *_prop, *hoc_getdata_range(int); - _prop = hoc_getdata_range(_mechtype); - _setdata(_prop); - hoc_retpushx(1.); -} - /* connect user functions to hoc names */ - static VoidFunc hoc_intfunc[] = { - "setdata_cad", _hoc_setdata, - 0, 0 -}; - /* declare global and static user variables */ -#define cainf cainf_cad - double cainf = 0.0001; -#define depth depth_cad - double depth = 0.1; - /* some parameters have upper and lower limits */ - static HocParmLimits _hoc_parm_limits[] = { - 0,0,0 -}; - static HocParmUnits _hoc_parm_units[] = { - "depth_cad", "um", - "cainf_cad", "mM", - "taur_cad", "ms", - "ca_cad", "mM", - 0,0 -}; - static double ca0 = 0; - static double delta_t = 1; - /* connect global user variables to hoc */ - static DoubScal hoc_scdoub[] = { - "depth_cad", &depth_cad, - "cainf_cad", &cainf_cad, - 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 int _ode_count(int); -static void _ode_map(int, double**, double**, double*, Datum*, double*, int); -static void _ode_spec(NrnThread*, _Memb_list*, int); -static void _ode_matsol(NrnThread*, _Memb_list*, int); - -#define _cvode_ieq _ppvar[3]._i - static void _ode_synonym(int, double**, Datum**); - static void _ode_matsol_instance1(_threadargsproto_); - /* connect range variables in _p that hoc is supposed to know about */ - static const char *_mechanism[] = { - "7.7.0", -"cad", - "taur_cad", - 0, - 0, - "ca_cad", - 0, - 0}; - static Symbol* _ca_sym; - -extern Prop* need_memb(Symbol*); - -static void nrn_alloc(Prop* _prop) { - Prop *prop_ion; - double *_p; Datum *_ppvar; - _p = nrn_prop_data_alloc(_mechtype, 8, _prop); - /*initialize range parameters*/ - taur = 200; - _prop->param = _p; - _prop->param_size = 8; - _ppvar = nrn_prop_datum_alloc(_mechtype, 4, _prop); - _prop->dparam = _ppvar; - /*connect ionic variables to this model*/ - prop_ion = need_memb(_ca_sym); - nrn_check_conc_write(_prop, prop_ion, 1); - nrn_promote(prop_ion, 3, 0); - _ppvar[0]._pval = &prop_ion->param[3]; /* ica */ - _ppvar[1]._pval = &prop_ion->param[1]; /* cai */ - _ppvar[2]._pvoid = (void*)(&(prop_ion->dparam[0]._i)); /* iontype for ca */ - -} - static void _initlists(); - /* some states have an absolute tolerance */ - static Symbol** _atollist; - static HocStateTolerance _hoc_state_tol[] = { - "ca_cad", 1e-05, - 0,0 -}; - static void _update_ion_pointer(Datum*); - extern Symbol* hoc_lookup(const char*); -extern void _nrn_thread_reg(int, int, void(*)(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 _cad_reg() { - int _vectorized = 1; - _initlists(); - ion_reg("ca", -10000.); - _ca_sym = hoc_lookup("ca_ion"); - register_mech(_mechanism, nrn_alloc,nrn_cur, nrn_jacob, nrn_state, nrn_init, hoc_nrnpointerindex, 1); - _mechtype = nrn_get_mechtype(_mechanism[1]); - _nrn_setdata_reg(_mechtype, _setdata); - _nrn_thread_reg(_mechtype, 2, _update_ion_pointer); - #if NMODL_TEXT - hoc_reg_nmodl_text(_mechtype, nmodl_file_text); - hoc_reg_nmodl_filename(_mechtype, nmodl_filename); -#endif - hoc_register_prop_size(_mechtype, 8, 4); - hoc_register_dparam_semantics(_mechtype, 0, "ca_ion"); - hoc_register_dparam_semantics(_mechtype, 1, "ca_ion"); - hoc_register_dparam_semantics(_mechtype, 2, "#ca_ion"); - hoc_register_dparam_semantics(_mechtype, 3, "cvodeieq"); - nrn_writes_conc(_mechtype, 0); - hoc_register_cvode(_mechtype, _ode_count, _ode_map, _ode_spec, _ode_matsol); - hoc_register_tolerance(_mechtype, _hoc_state_tol, &_atollist); - hoc_register_synonym(_mechtype, _ode_synonym); - hoc_register_var(hoc_scdoub, hoc_vdoub, hoc_intfunc); - ivoc_help("help ?1 cad /Users/katharinaduecker/Documents/Projects Brown/hnn-core/hnn_core/mod/cad.mod\n"); - hoc_register_limits(_mechtype, _hoc_parm_limits); - hoc_register_units(_mechtype, _hoc_parm_units); - } - -#define FARADAY _nrnunit_FARADAY[_nrnunit_use_legacy_] -static double _nrnunit_FARADAY[2] = {0x1.78e555060882cp+16, 96485.3}; /* 96485.3321233100141 */ -static int _reset; -static char *modelname = "Decay of internal calcium concentration"; - -static int error; -static int _ninits = 0; -static int _match_recurse=1; -static void _modl_cleanup(){ _match_recurse=1;} - -static int _ode_spec1(_threadargsproto_); -/*static int _ode_matsol1(_threadargsproto_);*/ - static int _slist1[1], _dlist1[1]; - static int state(_threadargsproto_); - -/*CVODE*/ - static int _ode_spec1 (double* _p, Datum* _ppvar, Datum* _thread, NrnThread* _nt) {int _reset = 0; { - drive_channel = - ( 10000.0 ) * ica / ( 2.0 * FARADAY * depth ) ; - if ( drive_channel <= 0. ) { - drive_channel = 0. ; - } - Dca = drive_channel + ( cainf - ca ) / taur ; - cai = ca ; - } - return _reset; -} - static int _ode_matsol1 (double* _p, Datum* _ppvar, Datum* _thread, NrnThread* _nt) { - drive_channel = - ( 10000.0 ) * ica / ( 2.0 * FARADAY * depth ) ; - if ( drive_channel <= 0. ) { - drive_channel = 0. ; - } - Dca = Dca / (1. - dt*( ( ( ( - 1.0 ) ) ) / taur )) ; - cai = ca ; - return 0; -} - /*END CVODE*/ - static int state (double* _p, Datum* _ppvar, Datum* _thread, NrnThread* _nt) { { - drive_channel = - ( 10000.0 ) * ica / ( 2.0 * FARADAY * depth ) ; - if ( drive_channel <= 0. ) { - drive_channel = 0. ; - } - ca = ca + (1. - exp(dt*(( ( ( - 1.0 ) ) ) / taur)))*(- ( drive_channel + ( ( cainf ) ) / taur ) / ( ( ( ( - 1.0 ) ) ) / taur ) - ca) ; - cai = ca ; - } - return 0; -} - -static int _ode_count(int _type){ return 1;} - -static void _ode_spec(NrnThread* _nt, _Memb_list* _ml, int _type) { - double* _p; Datum* _ppvar; Datum* _thread; - Node* _nd; double _v; int _iml, _cntml; - _cntml = _ml->_nodecount; - _thread = _ml->_thread; - for (_iml = 0; _iml < _cntml; ++_iml) { - _p = _ml->_data[_iml]; _ppvar = _ml->_pdata[_iml]; - _nd = _ml->_nodelist[_iml]; - v = NODEV(_nd); - ica = _ion_ica; - cai = _ion_cai; - cai = _ion_cai; - _ode_spec1 (_p, _ppvar, _thread, _nt); - _ion_cai = cai; - }} - -static void _ode_map(int _ieq, double** _pv, double** _pvdot, double* _pp, Datum* _ppd, double* _atol, int _type) { - double* _p; Datum* _ppvar; - int _i; _p = _pp; _ppvar = _ppd; - _cvode_ieq = _ieq; - for (_i=0; _i < 1; ++_i) { - _pv[_i] = _pp + _slist1[_i]; _pvdot[_i] = _pp + _dlist1[_i]; - _cvode_abstol(_atollist, _atol, _i); - } - } - static void _ode_synonym(int _cnt, double** _pp, Datum** _ppd) { - double* _p; Datum* _ppvar; - int _i; - for (_i=0; _i < _cnt; ++_i) {_p = _pp[_i]; _ppvar = _ppd[_i]; - _ion_cai = ca ; - }} - -static void _ode_matsol_instance1(_threadargsproto_) { - _ode_matsol1 (_p, _ppvar, _thread, _nt); - } - -static void _ode_matsol(NrnThread* _nt, _Memb_list* _ml, int _type) { - double* _p; Datum* _ppvar; Datum* _thread; - Node* _nd; double _v; int _iml, _cntml; - _cntml = _ml->_nodecount; - _thread = _ml->_thread; - for (_iml = 0; _iml < _cntml; ++_iml) { - _p = _ml->_data[_iml]; _ppvar = _ml->_pdata[_iml]; - _nd = _ml->_nodelist[_iml]; - v = NODEV(_nd); - ica = _ion_ica; - cai = _ion_cai; - cai = _ion_cai; - _ode_matsol_instance1(_threadargs_); - }} - extern void nrn_update_ion_pointer(Symbol*, Datum*, int, int); - static void _update_ion_pointer(Datum* _ppvar) { - nrn_update_ion_pointer(_ca_sym, _ppvar, 0, 3); - nrn_update_ion_pointer(_ca_sym, _ppvar, 1, 1); - } - -static void initmodel(double* _p, Datum* _ppvar, Datum* _thread, NrnThread* _nt) { - int _i; double _save;{ - ca = ca0; - { - ca = cainf ; - cai = ca ; - } - -} -} - -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 CACHEVEC - if (use_cachevec) { - _v = VEC_V(_ni[_iml]); - }else -#endif - { - _nd = _ml->_nodelist[_iml]; - _v = NODEV(_nd); - } - v = _v; - ica = _ion_ica; - cai = _ion_cai; - cai = _ion_cai; - initmodel(_p, _ppvar, _thread, _nt); - _ion_cai = cai; - nrn_wrote_conc(_ca_sym, (&(_ion_cai)) - 1, _style_ca); -} -} - -static double _nrn_current(double* _p, Datum* _ppvar, Datum* _thread, NrnThread* _nt, double _v){double _current=0.;v=_v;{ -} 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 CACHEVEC - if (use_cachevec) { - _v = VEC_V(_ni[_iml]); - }else -#endif - { - _nd = _ml->_nodelist[_iml]; - _v = NODEV(_nd); - } - -} - -} - -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]; -#if CACHEVEC - if (use_cachevec) { - VEC_D(_ni[_iml]) += _g; - }else -#endif - { - _nd = _ml->_nodelist[_iml]; - NODED(_nd) += _g; - } - -} - -} - -static void nrn_state(NrnThread* _nt, _Memb_list* _ml, int _type) { -double* _p; Datum* _ppvar; Datum* _thread; -Node *_nd; double _v = 0.0; 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 CACHEVEC - if (use_cachevec) { - _v = VEC_V(_ni[_iml]); - }else -#endif - { - _nd = _ml->_nodelist[_iml]; - _v = NODEV(_nd); - } - v=_v; -{ - ica = _ion_ica; - cai = _ion_cai; - cai = _ion_cai; - { state(_p, _ppvar, _thread, _nt); - } { - } - _ion_cai = cai; -}} - -} - -static void terminal(){} - -static void _initlists(){ - double _x; double* _p = &_x; - int _i; static int _first = 1; - if (!_first) return; - _slist1[0] = ca_columnindex; _dlist1[0] = Dca_columnindex; -_first = 0; -} - -#if defined(__cplusplus) -} /* extern "C" */ -#endif - -#if NMODL_TEXT -static const char* nmodl_filename = "/Users/katharinaduecker/Documents/Projects Brown/hnn-core/hnn_core/mod/cad.mod"; -static const char* nmodl_file_text = - "COMMENT\n" - " 26 Ago 2002 Modification of original channel to allow variable time step\n" - " and to correct an initialization error.\n" - "\n" - " Done by Michael Hines (michael.hines@yale.edu) and Ruggero Scorcioni (rscorcio@gmu.edu)\n" - " at EU Advance Course in Computational Neuroscience. Obidos, Portugal\n" - "\n" - " Internal calcium concentration due to calcium currents and pump.\n" - " Differential equations.\n" - "\n" - " Simple model of ATPase pump with 3 kinetic constants (Destexhe 92)\n" - " Cai + P <-> CaP -> Cao + P (k1,k2,k3)\n" - "\n" - " A Michaelis-Menten approximation is assumed, which reduces the complexity\n" - " of the system to 2 parameters:\n" - "\n" - " kt = * k3 -> TIME CONSTANT OF THE PUMP\n" - " kd = k2/k1 (dissociation constant) -> EQUILIBRIUM CALCIUM VALUE\n" - "\n" - " The values of these parameters are chosen assuming a high affinity of\n" - " the pump to calcium and a low transport capacity (cfr. Blaustein,\n" - " TINS, 11: 438, 1988, and references therein).\n" - "\n" - " Units checked using \"modlunit\" -> factor 10000 needed in ca entry\n" - "\n" - " VERSION OF PUMP + DECAY (decay can be viewed as simplified buffering)\n" - "\n" - " All variables are range variables\n" - "\n" - " This mechanism was published in: Destexhe, A. Babloyantz, A. and\n" - " Sejnowski, TJ. Ionic mechanisms for intrinsic slow oscillations in\n" - " thalamic relay neurons. Biophys. J. 65: 1538-1552, 1993)\n" - "\n" - " Written by Alain Destexhe, Salk Institute, Nov 12, 1992\n" - "\n" - "ENDCOMMENT\n" - "\n" - "TITLE Decay of internal calcium concentration\n" - "\n" - "INDEPENDENT {t FROM 0 TO 1 WITH 1 (ms)}\n" - "\n" - "NEURON {\n" - " SUFFIX cad\n" - " USEION ca\n" - " READ ica, cai\n" - " WRITE cai\n" - "\n" - " : SRJones put taur up here\n" - " RANGE ca, taur\n" - " GLOBAL depth, cainf\n" - " : GLOBAL depth, cainf, taur\n" - "}\n" - "\n" - "UNITS {\n" - " : moles do not appear in units\n" - " (molar) = (1/liter)\n" - " (mM) = (millimolar)\n" - " (um) = (micron)\n" - " (mA) = (milliamp)\n" - " (msM) = (ms mM)\n" - " FARADAY = (faraday) (coulomb)\n" - "}\n" - "\n" - "PARAMETER {\n" - " depth = .1 (um) : depth of shell\n" - " taur = 200 (ms) : rate of calcium removal 200 default\n" - " cainf = 100e-6 (mM)\n" - " cai (mM)\n" - "}\n" - "\n" - "STATE {\n" - " ca (mM) <1e-5>\n" - "}\n" - "\n" - "INITIAL {\n" - " ca = cainf\n" - " cai = ca\n" - "}\n" - "\n" - "ASSIGNED {\n" - " ica (mA/cm2)\n" - " drive_channel (mM/ms)\n" - "}\n" - "\n" - "BREAKPOINT {\n" - " SOLVE state METHOD cnexp\n" - "}\n" - "\n" - "DERIVATIVE state {\n" - " drive_channel = -(10000) * ica / (2 * FARADAY * depth)\n" - "\n" - " : cannot pump inward\n" - " if (drive_channel <= 0.) { drive_channel = 0. }\n" - "\n" - " ca' = drive_channel + (cainf-ca) / taur\n" - " cai = ca\n" - "}\n" - ; -#endif diff --git a/hnn_core/mod/arm64/cad.o b/hnn_core/mod/arm64/cad.o deleted file mode 100644 index fd15ecc7575cc941a0dd12ff70946b543f6eb0a6..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 10640 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 diff --git a/hnn_core/mod/arm64/cat.c b/hnn_core/mod/arm64/cat.c deleted file mode 100644 index 2771f33ff..000000000 --- a/hnn_core/mod/arm64/cat.c +++ /dev/null @@ -1,628 +0,0 @@ -/* Created by Language version: 7.7.0 */ -/* VECTORIZED */ -#define NRN_VECTORIZED 1 -#include -#include -#include -#include "mech_api.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 nrn_init _nrn_init__cat -#define _nrn_initial _nrn_initial__cat -#define nrn_cur _nrn_cur__cat -#define _nrn_current _nrn_current__cat -#define nrn_jacob _nrn_jacob__cat -#define nrn_state _nrn_state__cat -#define _net_receive _net_receive__cat -#define _f_settables _f_settables__cat -#define settables settables__cat -#define states states__cat - -#define _threadargscomma_ _p, _ppvar, _thread, _nt, -#define _threadargsprotocomma_ double* _p, Datum* _ppvar, Datum* _thread, NrnThread* _nt, -#define _threadargs_ _p, _ppvar, _thread, _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 gbar _p[0] -#define gbar_columnindex 0 -#define i _p[1] -#define i_columnindex 1 -#define m _p[2] -#define m_columnindex 2 -#define h _p[3] -#define h_columnindex 3 -#define minf _p[4] -#define minf_columnindex 4 -#define hinf _p[5] -#define hinf_columnindex 5 -#define mtau _p[6] -#define mtau_columnindex 6 -#define htau _p[7] -#define htau_columnindex 7 -#define Dm _p[8] -#define Dm_columnindex 8 -#define Dh _p[9] -#define Dh_columnindex 9 -#define v _p[10] -#define v_columnindex 10 -#define _g _p[11] -#define _g_columnindex 11 - -#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 void _hoc_settables(void); - 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; - -#define NMODL_TEXT 1 -#if NMODL_TEXT -static const char* nmodl_file_text; -static const char* nmodl_filename; -extern void hoc_reg_nmodl_text(int, const char*); -extern void hoc_reg_nmodl_filename(int, const char*); -#endif - - extern void _nrn_setdata_reg(int, void(*)(Prop*)); - static void _setdata(Prop* _prop) { - _extcall_prop = _prop; - } - static void _hoc_setdata() { - Prop *_prop, *hoc_getdata_range(int); - _prop = hoc_getdata_range(_mechtype); - _setdata(_prop); - hoc_retpushx(1.); -} - /* connect user functions to hoc names */ - static VoidFunc hoc_intfunc[] = { - "setdata_cat", _hoc_setdata, - "settables_cat", _hoc_settables, - 0, 0 -}; - -static void _check_settables(double*, Datum*, Datum*, NrnThread*); -static void _check_table_thread(double* _p, Datum* _ppvar, Datum* _thread, NrnThread* _nt, int _type) { - _check_settables(_p, _ppvar, _thread, _nt); - } - /* declare global and static user variables */ -#define eca eca_cat - double eca = 0; -#define usetable usetable_cat - double usetable = 1; - /* some parameters have upper and lower limits */ - static HocParmLimits _hoc_parm_limits[] = { - "usetable_cat", 0, 1, - 0,0,0 -}; - static HocParmUnits _hoc_parm_units[] = { - "eca_cat", "mV", - "gbar_cat", "mho/cm2", - "i_cat", "mA/cm2", - 0,0 -}; - static double delta_t = 1; - static double h0 = 0; - static double m0 = 0; - /* connect global user variables to hoc */ - static DoubScal hoc_scdoub[] = { - "eca_cat", &eca_cat, - "usetable_cat", &usetable_cat, - 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 int _ode_count(int); -static void _ode_map(int, double**, double**, double*, Datum*, double*, int); -static void _ode_spec(NrnThread*, _Memb_list*, int); -static void _ode_matsol(NrnThread*, _Memb_list*, int); - -#define _cvode_ieq _ppvar[0]._i - static void _ode_matsol_instance1(_threadargsproto_); - /* connect range variables in _p that hoc is supposed to know about */ - static const char *_mechanism[] = { - "7.7.0", -"cat", - "gbar_cat", - 0, - "i_cat", - 0, - "m_cat", - "h_cat", - 0, - 0}; - -extern Prop* need_memb(Symbol*); - -static void nrn_alloc(Prop* _prop) { - Prop *prop_ion; - double *_p; Datum *_ppvar; - _p = nrn_prop_data_alloc(_mechtype, 12, _prop); - /*initialize range parameters*/ - gbar = 0; - _prop->param = _p; - _prop->param_size = 12; - _ppvar = nrn_prop_datum_alloc(_mechtype, 1, _prop); - _prop->dparam = _ppvar; - /*connect ionic variables to this model*/ - -} - static void _initlists(); - /* some states have an absolute tolerance */ - static Symbol** _atollist; - static HocStateTolerance _hoc_state_tol[] = { - 0,0 -}; - extern Symbol* hoc_lookup(const char*); -extern void _nrn_thread_reg(int, int, void(*)(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 _cat_reg() { - int _vectorized = 1; - _initlists(); - register_mech(_mechanism, nrn_alloc,nrn_cur, nrn_jacob, nrn_state, nrn_init, hoc_nrnpointerindex, 1); - _mechtype = nrn_get_mechtype(_mechanism[1]); - _nrn_setdata_reg(_mechtype, _setdata); - _nrn_thread_table_reg(_mechtype, _check_table_thread); - #if NMODL_TEXT - hoc_reg_nmodl_text(_mechtype, nmodl_file_text); - hoc_reg_nmodl_filename(_mechtype, nmodl_filename); -#endif - hoc_register_prop_size(_mechtype, 12, 1); - hoc_register_dparam_semantics(_mechtype, 0, "cvodeieq"); - hoc_register_cvode(_mechtype, _ode_count, _ode_map, _ode_spec, _ode_matsol); - hoc_register_tolerance(_mechtype, _hoc_state_tol, &_atollist); - hoc_register_var(hoc_scdoub, hoc_vdoub, hoc_intfunc); - ivoc_help("help ?1 cat /Users/katharinaduecker/Documents/Projects Brown/hnn-core/hnn_core/mod/cat.mod\n"); - hoc_register_limits(_mechtype, _hoc_parm_limits); - hoc_register_units(_mechtype, _hoc_parm_units); - } - static double *_t_minf; - static double *_t_mtau; - static double *_t_hinf; - static double *_t_htau; -static int _reset; -static char *modelname = "Calcium low threshold T type current for RD Traub, J Neurophysiol 89:909-921, 2003"; - -static int error; -static int _ninits = 0; -static int _match_recurse=1; -static void _modl_cleanup(){ _match_recurse=1;} -static int _f_settables(_threadargsprotocomma_ double); -static int settables(_threadargsprotocomma_ double); - -static int _ode_spec1(_threadargsproto_); -/*static int _ode_matsol1(_threadargsproto_);*/ - static void _n_settables(_threadargsprotocomma_ double _lv); - static int _slist1[2], _dlist1[2]; - static int states(_threadargsproto_); - -/*CVODE*/ - static int _ode_spec1 (double* _p, Datum* _ppvar, Datum* _thread, NrnThread* _nt) {int _reset = 0; { - settables ( _threadargscomma_ v ) ; - Dm = ( minf - m ) / mtau ; - Dh = ( hinf - h ) / htau ; - } - return _reset; -} - static int _ode_matsol1 (double* _p, Datum* _ppvar, Datum* _thread, NrnThread* _nt) { - settables ( _threadargscomma_ v ) ; - Dm = Dm / (1. - dt*( ( ( ( - 1.0 ) ) ) / mtau )) ; - Dh = Dh / (1. - dt*( ( ( ( - 1.0 ) ) ) / htau )) ; - return 0; -} - /*END CVODE*/ - static int states (double* _p, Datum* _ppvar, Datum* _thread, NrnThread* _nt) { { - settables ( _threadargscomma_ v ) ; - m = m + (1. - exp(dt*(( ( ( - 1.0 ) ) ) / mtau)))*(- ( ( ( minf ) ) / mtau ) / ( ( ( ( - 1.0 ) ) ) / mtau ) - m) ; - h = h + (1. - exp(dt*(( ( ( - 1.0 ) ) ) / htau)))*(- ( ( ( hinf ) ) / htau ) / ( ( ( ( - 1.0 ) ) ) / htau ) - h) ; - } - return 0; -} - static double _mfac_settables, _tmin_settables; - static void _check_settables(double* _p, Datum* _ppvar, Datum* _thread, NrnThread* _nt) { - static int _maktable=1; int _i, _j, _ix = 0; - double _xi, _tmax; - if (!usetable) {return;} - if (_maktable) { double _x, _dx; _maktable=0; - _tmin_settables = - 120.0 ; - _tmax = 40.0 ; - _dx = (_tmax - _tmin_settables)/641.; _mfac_settables = 1./_dx; - for (_i=0, _x=_tmin_settables; _i < 642; _x += _dx, _i++) { - _f_settables(_p, _ppvar, _thread, _nt, _x); - _t_minf[_i] = minf; - _t_mtau[_i] = mtau; - _t_hinf[_i] = hinf; - _t_htau[_i] = htau; - } - } - } - - static int settables(double* _p, Datum* _ppvar, Datum* _thread, NrnThread* _nt, double _lv) { -#if 0 -_check_settables(_p, _ppvar, _thread, _nt); -#endif - _n_settables(_p, _ppvar, _thread, _nt, _lv); - return 0; - } - - static void _n_settables(double* _p, Datum* _ppvar, Datum* _thread, NrnThread* _nt, double _lv){ int _i, _j; - double _xi, _theta; - if (!usetable) { - _f_settables(_p, _ppvar, _thread, _nt, _lv); return; -} - _xi = _mfac_settables * (_lv - _tmin_settables); - if (isnan(_xi)) { - minf = _xi; - mtau = _xi; - hinf = _xi; - htau = _xi; - return; - } - if (_xi <= 0.) { - minf = _t_minf[0]; - mtau = _t_mtau[0]; - hinf = _t_hinf[0]; - htau = _t_htau[0]; - return; } - if (_xi >= 641.) { - minf = _t_minf[641]; - mtau = _t_mtau[641]; - hinf = _t_hinf[641]; - htau = _t_htau[641]; - return; } - _i = (int) _xi; - _theta = _xi - (double)_i; - minf = _t_minf[_i] + _theta*(_t_minf[_i+1] - _t_minf[_i]); - mtau = _t_mtau[_i] + _theta*(_t_mtau[_i+1] - _t_mtau[_i]); - hinf = _t_hinf[_i] + _theta*(_t_hinf[_i+1] - _t_hinf[_i]); - htau = _t_htau[_i] + _theta*(_t_htau[_i+1] - _t_htau[_i]); - } - - -static int _f_settables ( _threadargsprotocomma_ double _lv ) { - minf = 1.0 / ( 1.0 + exp ( ( - _lv - 56.0 ) / 6.2 ) ) ; - mtau = 0.204 + 0.333 / ( exp ( ( _lv + 15.8 ) / 18.2 ) + exp ( ( - _lv - 131.0 ) / 16.7 ) ) ; - hinf = 1.0 / ( 1.0 + exp ( ( _lv + 80.0 ) / 4.0 ) ) ; - if ( _lv < - 81.0 ) { - htau = 0.333 * exp ( ( _lv + 466.0 ) / 66.6 ) ; - } - else { - htau = 9.32 + 0.333 * exp ( ( - _lv - 21.0 ) / 10.5 ) ; - } - return 0; } - -static void _hoc_settables(void) { - double _r; - double* _p; Datum* _ppvar; Datum* _thread; NrnThread* _nt; - if (_extcall_prop) {_p = _extcall_prop->param; _ppvar = _extcall_prop->dparam;}else{ _p = (double*)0; _ppvar = (Datum*)0; } - _thread = _extcall_thread; - _nt = nrn_threads; - -#if 1 - _check_settables(_p, _ppvar, _thread, _nt); -#endif - _r = 1.; - settables ( _p, _ppvar, _thread, _nt, *getarg(1) ); - hoc_retpushx(_r); -} - -static int _ode_count(int _type){ return 2;} - -static void _ode_spec(NrnThread* _nt, _Memb_list* _ml, int _type) { - double* _p; Datum* _ppvar; Datum* _thread; - Node* _nd; double _v; int _iml, _cntml; - _cntml = _ml->_nodecount; - _thread = _ml->_thread; - for (_iml = 0; _iml < _cntml; ++_iml) { - _p = _ml->_data[_iml]; _ppvar = _ml->_pdata[_iml]; - _nd = _ml->_nodelist[_iml]; - v = NODEV(_nd); - _ode_spec1 (_p, _ppvar, _thread, _nt); - }} - -static void _ode_map(int _ieq, double** _pv, double** _pvdot, double* _pp, Datum* _ppd, double* _atol, int _type) { - double* _p; Datum* _ppvar; - 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 void _ode_matsol_instance1(_threadargsproto_) { - _ode_matsol1 (_p, _ppvar, _thread, _nt); - } - -static void _ode_matsol(NrnThread* _nt, _Memb_list* _ml, int _type) { - double* _p; Datum* _ppvar; Datum* _thread; - Node* _nd; double _v; int _iml, _cntml; - _cntml = _ml->_nodecount; - _thread = _ml->_thread; - for (_iml = 0; _iml < _cntml; ++_iml) { - _p = _ml->_data[_iml]; _ppvar = _ml->_pdata[_iml]; - _nd = _ml->_nodelist[_iml]; - v = NODEV(_nd); - _ode_matsol_instance1(_threadargs_); - }} - -static void initmodel(double* _p, Datum* _ppvar, Datum* _thread, NrnThread* _nt) { - int _i; double _save;{ - h = h0; - m = m0; - { - settables ( _threadargscomma_ v ) ; - m = minf ; - h = hinf ; - m = 0.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 0 - _check_settables(_p, _ppvar, _thread, _nt); -#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;{ { - i = gbar * m * m * h * ( v - 125.0 ) ; - } - _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 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; -#if CACHEVEC - if (use_cachevec) { - VEC_RHS(_ni[_iml]) -= _rhs; - }else -#endif - { - NODERHS(_nd) -= _rhs; - } - -} - -} - -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]; -#if CACHEVEC - if (use_cachevec) { - VEC_D(_ni[_iml]) += _g; - }else -#endif - { - _nd = _ml->_nodelist[_iml]; - NODED(_nd) += _g; - } - -} - -} - -static void nrn_state(NrnThread* _nt, _Memb_list* _ml, int _type) { -double* _p; Datum* _ppvar; Datum* _thread; -Node *_nd; double _v = 0.0; 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 CACHEVEC - if (use_cachevec) { - _v = VEC_V(_ni[_iml]); - }else -#endif - { - _nd = _ml->_nodelist[_iml]; - _v = NODEV(_nd); - } - v=_v; -{ - { states(_p, _ppvar, _thread, _nt); - }}} - -} - -static void terminal(){} - -static void _initlists(){ - double _x; double* _p = &_x; - int _i; static int _first = 1; - if (!_first) return; - _slist1[0] = m_columnindex; _dlist1[0] = Dm_columnindex; - _slist1[1] = h_columnindex; _dlist1[1] = Dh_columnindex; - _t_minf = makevector(642*sizeof(double)); - _t_mtau = makevector(642*sizeof(double)); - _t_hinf = makevector(642*sizeof(double)); - _t_htau = makevector(642*sizeof(double)); -_first = 0; -} - -#if defined(__cplusplus) -} /* extern "C" */ -#endif - -#if NMODL_TEXT -static const char* nmodl_filename = "/Users/katharinaduecker/Documents/Projects Brown/hnn-core/hnn_core/mod/cat.mod"; -static const char* nmodl_file_text = - "TITLE Calcium low threshold T type current for RD Traub, J Neurophysiol 89:909-921, 2003\n" - "\n" - "COMMENT\n" - " Implemented by Maciej Lazarewicz 2003 (mlazarew@seas.upenn.edu)\n" - "ENDCOMMENT\n" - "\n" - "INDEPENDENT { t FROM 0 TO 1 WITH 1 (ms) }\n" - "\n" - "UNITS {\n" - " (mV) = (millivolt)\n" - " (mA) = (milliamp)\n" - "}\n" - "\n" - "NEURON {\n" - " SUFFIX cat\n" - " NONSPECIFIC_CURRENT i : not causing [Ca2+] influx\n" - " RANGE gbar, i\n" - "}\n" - "\n" - "PARAMETER {\n" - " gbar = 0.0 (mho/cm2)\n" - " v eca (mV)\n" - "}\n" - "\n" - "ASSIGNED {\n" - " i (mA/cm2)\n" - " minf hinf (1)\n" - " mtau htau (ms)\n" - "}\n" - "\n" - "STATE {\n" - " m h\n" - "}\n" - "\n" - "BREAKPOINT {\n" - " SOLVE states METHOD cnexp\n" - " i = gbar * m * m * h * ( v - 125 )\n" - "}\n" - "\n" - "INITIAL {\n" - " settables(v)\n" - " m = minf\n" - " h = hinf\n" - " m = 0\n" - "}\n" - "\n" - "DERIVATIVE states {\n" - " settables(v)\n" - " m' = ( minf - m ) / mtau\n" - " h' = ( hinf - h ) / htau\n" - "}\n" - "\n" - "UNITSOFF\n" - "PROCEDURE settables(v) {\n" - " TABLE minf, mtau, hinf, htau FROM -120 TO 40 WITH 641\n" - "\n" - " minf = 1 / (1 + exp(( -v - 56 ) / 6.2))\n" - " mtau = 0.204 + 0.333 / (exp(( v + 15.8) / 18.2) + exp((-v - 131) / 16.7))\n" - " hinf = 1 / (1 + exp((v + 80) / 4))\n" - "\n" - " if (v < -81) {\n" - " htau = 0.333 * exp((v + 466 ) / 66.6)\n" - " } else {\n" - " htau = 9.32 + 0.333 * exp((-v - 21) / 10.5)\n" - " }\n" - "}\n" - "UNITSON\n" - ; -#endif diff --git a/hnn_core/mod/arm64/cat.o b/hnn_core/mod/arm64/cat.o deleted file mode 100644 index 7b19a3fa03cb9ad2d5982f6d74d470a3b24a5169..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 11088 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 b)3os`$|}(8Fq$N8pBJ|;NKsQr+1dXB94kth diff --git a/hnn_core/mod/arm64/dipole.c b/hnn_core/mod/arm64/dipole.c deleted file mode 100644 index 010ed337b..000000000 --- a/hnn_core/mod/arm64/dipole.c +++ /dev/null @@ -1,339 +0,0 @@ -/* Created by Language version: 7.7.0 */ -/* NOT VECTORIZED */ -#define NRN_VECTORIZED 0 -#include -#include -#include -#include "mech_api.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 nrn_init _nrn_init__dipole -#define _nrn_initial _nrn_initial__dipole -#define nrn_cur _nrn_cur__dipole -#define _nrn_current _nrn_current__dipole -#define nrn_jacob _nrn_jacob__dipole -#define nrn_state _nrn_state__dipole -#define _net_receive _net_receive__dipole - -#define _threadargscomma_ /**/ -#define _threadargsprotocomma_ /**/ -#define _threadargs_ /**/ -#define _threadargsproto_ /**/ - /*SUPPRESS 761*/ - /*SUPPRESS 762*/ - /*SUPPRESS 763*/ - /*SUPPRESS 765*/ - extern double *getarg(); - static double *_p; static Datum *_ppvar; - -#define t nrn_threads->_t -#define dt nrn_threads->_dt -#define ia _p[0] -#define ia_columnindex 0 -#define ri _p[1] -#define ri_columnindex 1 -#define ztan _p[2] -#define ztan_columnindex 2 -#define Q _p[3] -#define Q_columnindex 3 -#define pv *_ppvar[0]._pval -#define _p_pv _ppvar[0]._pval -#define Qsum *_ppvar[1]._pval -#define _p_Qsum _ppvar[1]._pval -#define Qtotal *_ppvar[2]._pval -#define _p_Qtotal _ppvar[2]._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 = 0; - /* external NEURON variables */ - /* declaration of user functions */ - 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; - -#define NMODL_TEXT 1 -#if NMODL_TEXT -static const char* nmodl_file_text; -static const char* nmodl_filename; -extern void hoc_reg_nmodl_text(int, const char*); -extern void hoc_reg_nmodl_filename(int, const char*); -#endif - - extern void _nrn_setdata_reg(int, void(*)(Prop*)); - static void _setdata(Prop* _prop) { - _p = _prop->param; _ppvar = _prop->dparam; - } - static void _hoc_setdata() { - Prop *_prop, *hoc_getdata_range(int); - _prop = hoc_getdata_range(_mechtype); - _setdata(_prop); - hoc_retpushx(1.); -} - /* connect user functions to hoc names */ - static VoidFunc hoc_intfunc[] = { - "setdata_dipole", _hoc_setdata, - 0, 0 -}; - /* declare global and static user variables */ - /* some parameters have upper and lower limits */ - static HocParmLimits _hoc_parm_limits[] = { - 0,0,0 -}; - static HocParmUnits _hoc_parm_units[] = { - "ia_dipole", "nA", - "ri_dipole", "Mohm", - "ztan_dipole", "um", - "Q_dipole", "fAm", - "pv_dipole", "mV", - "Qsum_dipole", "fAm", - "Qtotal_dipole", "fAm", - 0,0 -}; - static double v = 0; - /* 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 _ba1(Node*_nd, double* _pp, Datum* _ppd, Datum* _thread, NrnThread* _nt) , _ba2(Node*_nd, double* _pp, Datum* _ppd, Datum* _thread, NrnThread* _nt) ; - static void nrn_alloc(Prop*); -static void nrn_init(NrnThread*, _Memb_list*, int); -static void nrn_state(NrnThread*, _Memb_list*, int); - /* connect range variables in _p that hoc is supposed to know about */ - static const char *_mechanism[] = { - "7.7.0", -"dipole", - 0, - "ia_dipole", - "ri_dipole", - "ztan_dipole", - "Q_dipole", - 0, - 0, - "pv_dipole", - "Qsum_dipole", - "Qtotal_dipole", - 0}; - -extern Prop* need_memb(Symbol*); - -static void nrn_alloc(Prop* _prop) { - Prop *prop_ion; - double *_p; Datum *_ppvar; - _p = nrn_prop_data_alloc(_mechtype, 4, _prop); - /*initialize range parameters*/ - _prop->param = _p; - _prop->param_size = 4; - _ppvar = nrn_prop_datum_alloc(_mechtype, 3, _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(*)(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 _dipole_reg() { - int _vectorized = 0; - _initlists(); - register_mech(_mechanism, nrn_alloc,(void*)0, (void*)0, (void*)0, nrn_init, hoc_nrnpointerindex, 0); - _mechtype = nrn_get_mechtype(_mechanism[1]); - _nrn_setdata_reg(_mechtype, _setdata); - #if NMODL_TEXT - hoc_reg_nmodl_text(_mechtype, nmodl_file_text); - hoc_reg_nmodl_filename(_mechtype, nmodl_filename); -#endif - hoc_register_prop_size(_mechtype, 4, 3); - hoc_register_dparam_semantics(_mechtype, 0, "pointer"); - hoc_register_dparam_semantics(_mechtype, 1, "pointer"); - hoc_register_dparam_semantics(_mechtype, 2, "pointer"); - hoc_reg_ba(_mechtype, _ba1, 22); - hoc_reg_ba(_mechtype, _ba2, 23); - hoc_register_var(hoc_scdoub, hoc_vdoub, hoc_intfunc); - ivoc_help("help ?1 dipole /Users/katharinaduecker/Documents/Projects Brown/hnn-core/hnn_core/mod/dipole.mod\n"); - hoc_register_limits(_mechtype, _hoc_parm_limits); - hoc_register_units(_mechtype, _hoc_parm_units); - } -static int _reset; -static char *modelname = ""; - -static int error; -static int _ninits = 0; -static int _match_recurse=1; -static void _modl_cleanup(){ _match_recurse=1;} - /* AFTER SOLVE */ - static void _ba1(Node*_nd, double* _pp, Datum* _ppd, Datum* _thread, NrnThread* _nt) { - _p = _pp; _ppvar = _ppd; - v = NODEV(_nd); - ia = ( pv - v ) / ri ; - Q = ia * ztan ; - Qsum = Qsum + Q ; - Qtotal = Qtotal + Q ; - } - /* AFTER INITIAL */ - static void _ba2(Node*_nd, double* _pp, Datum* _ppd, Datum* _thread, NrnThread* _nt) { - _p = _pp; _ppvar = _ppd; - v = NODEV(_nd); - ia = ( pv - v ) / ri ; - Q = ia * ztan ; - Qsum = Qsum + Q ; - Qtotal = Qtotal + Q ; - } - -static void initmodel() { - int _i; double _save;_ninits++; -{ - -} -} - -static void nrn_init(NrnThread* _nt, _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]; -#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(double _v){double _current=0.;v=_v;{ -} return _current; -} - -static void nrn_state(NrnThread* _nt, _Memb_list* _ml, int _type){ -Node *_nd; double _v = 0.0; 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); - } - v=_v; -{ -}} - -} - -static void terminal(){} - -static void _initlists() { - int _i; static int _first = 1; - if (!_first) return; -_first = 0; -} - -#if NMODL_TEXT -static const char* nmodl_filename = "/Users/katharinaduecker/Documents/Projects Brown/hnn-core/hnn_core/mod/dipole.mod"; -static const char* nmodl_file_text = - ": dipole.mod - mod file for range variable dipole\n" - ":\n" - ": v 1.9.1m0\n" - ": rev 2015-12-15 (SL: minor)\n" - ": last rev: (SL: Added back Qtotal, which WAS used in par version)\n" - "\n" - "NEURON {\n" - " SUFFIX dipole\n" - " RANGE ri, ia, Q, ztan\n" - " POINTER pv\n" - "\n" - " : for density. sums into Dipole at section position 1\n" - " POINTER Qsum\n" - " POINTER Qtotal\n" - "}\n" - "\n" - "UNITS {\n" - " (nA) = (nanoamp)\n" - " (mV) = (millivolt)\n" - " (Mohm) = (megaohm)\n" - " (um) = (micrometer)\n" - " (Am) = (amp meter)\n" - " (fAm) = (femto amp meter)\n" - "}\n" - "\n" - "ASSIGNED {\n" - " ia (nA)\n" - " ri (Mohm)\n" - " pv (mV)\n" - " v (mV)\n" - " ztan (um)\n" - " Q (fAm)\n" - "\n" - " : human dipole order of 10 nAm\n" - " Qsum (fAm)\n" - " Qtotal (fAm)\n" - "}\n" - "\n" - ": solve for v's first then use them\n" - "AFTER SOLVE {\n" - " ia = (pv - v) / ri\n" - " Q = ia * ztan\n" - " Qsum = Qsum + Q\n" - " Qtotal = Qtotal + Q\n" - "}\n" - "\n" - "AFTER INITIAL {\n" - " ia = (pv - v) / ri\n" - " Q = ia * ztan\n" - " Qsum = Qsum + Q\n" - " Qtotal = Qtotal + Q\n" - "}\n" - ; -#endif diff --git a/hnn_core/mod/arm64/dipole.o b/hnn_core/mod/arm64/dipole.o deleted file mode 100644 index 688fdbacdc3935d499e4bb0ac41087474ea43957..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 5864 zcmeHLU2Ggz6}~%m;?2gmfd-L62{#a^o%nB4r%o)U?1uaqmc)*oA3>$@cz2wgWM^jC z89PZ$q^%kWOU;8*1(An7Sg1&L%0nVm5K9!&(ub&2B5F$%L4-^MC=aQKM5toKBEB>C z%zC}4sE~jsuJ+D%zH`n!_uQYIy?1~0xA*_iEJRG8&|?K^Uc*D8qCAFrGqi^Ep~w5H zlxm9Fpj=?y1eq$uqhc6=buv)0;={X+3@`CWy3cVaUYG`wdxngSq8#}U8b;0x%q5Ls z>`V`*m-qvY6X)E^NTh+xkEk&%c`C^;Mt#3VSsyPN*TEW}Fdp;zDKd<#ACzqODBBIA zZoG}kaG7yxWldm+oPJe_c%D-{_X!oLX>eV-p$nOY=7%F|^{%tviWSJqM=$)7`@*e z_4|gV@~Z9oHtP^;8nrq;O!4#%aOxwnkzD>4c~>UWbNBbZF$=%79~^!SGUjtqo2xu8 z&i$o9TvYRrn*Sd1qp?Lfk0iw6c#D{)*k-N1MJ!e(cOXuB?t{a>n7!Iy+-U7i&97P^ zzWqu}3@4D|*JG*q_MY@y+v(Hqp0(`ebjE(}kE=B(#BhV`84#$2X?us2%vC zT4%8s>YHq}mC4t`HG?6_mOf!{Sy@{U>Az?VBp-U+uW z@46jXuVj&cS0)6<%XO(}oe&eEx3jmiTPTgNO@pP99ZAmyrW?tFkx-n7q(Oh&smg&D zn1zV>RzN>W5p~nz8(!WKB;@9QR?fU0F0sasrEHdv04Iv2WMG1N-;M$%I51I=Fjx z|B)yY(i}+d+p|lS>~?9J?Q*bP(&UG}1N-~;4evT2ixY{E_l0B1S*~vfr#dAT!AEa_ zCwHoyVg}O3K0vRs=)s4CsvD%*Qh`-k$o2Rm#Xe*ohAkXcZu-vZ)1l)0%;zYg3Czqf%nn`N#k)C)jrmshCg zfYgri0_x3dkF&jz?SkzOFn(%(U!i^vNbT<`)E9uC0KcW|8M>>$Uw=>8GuIXBSAgXA zszQAlxDEN90aCsvfxX~)<~fCW28gqAM+*3H_2 z+zPt{;wYYZT%o=W_$2gefjD_*)+p4Qfgb~pE7Ti-xB_Kpa{=|gW1ZU3?miG_tIR!x z`duK6;||*wfH-GmZYk7n0?Ga!unX<4F@KZ!73QxprvnPEa+#ME>N7xU{}M2X_H|0_VmY`FydB5)S?8Q=^MeYacyei}Fp`~q+a_!zJV{3I|B{5+7x zMg0x{slUBI>Zcn>@mqluR{|;CIv~Y~10jc(wod`Cf@6FuXBf+jBaA6V$p{Gjo3x*5 zSG6YXN7^MkU(#mqoYv0cIi;P&v#g!L^Iq(JtVz2STfp<>*esrBVpDhqC!4ffzDeuu zY0_HTn>4vGrd@Bi*$~spjZ=*=ZK3f_qo!S3@%DfS} ziSF&+g)jLJa2u2PEc2&{qkVKQ|1;a~u$^MHV1x8x6H(c~{EyI4xrj>k=#6|i$`458 zMdtLLqVj9*Z-(=Ii}@wyuMvmu2y&wGI<-gqIQMr7I?DGN`+to%e9G+qEw=k?-l9~HJZO45J%s~xc}#w7nvVpeuDWR^XHg9&HM%Co0)%~`8wt^ z%vUhK$eex;sQ(``KTEu3y>ORbHvd0i{wDihVE!)iQ_OELr*)zDzh%CM`R|zbFu%?G zo5ZmfqW?+$iurs5^A{D|IqCaQEkPY$tmFN49PjpJ?O&+lxjIhoeSE3~@3v)pzK)Y` zt^Y6UIQ{O_+Ua{z%U`VHf2wOQjJ%gMN>)%D_wy$scGPfjr6{QX?hM0r?Vw=$f!}F_ z2fV5qbXE!fOxb~tf95C>ZUIhJ;Zj3bR2N5;cfoe*+#}60w;Upwj^SH4payo<7X_me z|E!^#Vi9+nx}c#3hx4pK7fEtLb*yaObZy@e7$EmfI+)anm((C`$wfcv4i{>cB~mPT zMZ>qBwM6K6)C$7D!KorNH6l0SnWNj7YdYjY;b|hGURCOd6J8p_+nNe(77AWgiD9R( z -#include -#include -#include "mech_api.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 nrn_init _nrn_init__Dipole -#define _nrn_initial _nrn_initial__Dipole -#define nrn_cur _nrn_cur__Dipole -#define _nrn_current _nrn_current__Dipole -#define nrn_jacob _nrn_jacob__Dipole -#define nrn_state _nrn_state__Dipole -#define _net_receive _net_receive__Dipole - -#define _threadargscomma_ /**/ -#define _threadargsprotocomma_ /**/ -#define _threadargs_ /**/ -#define _threadargsproto_ /**/ - /*SUPPRESS 761*/ - /*SUPPRESS 762*/ - /*SUPPRESS 763*/ - /*SUPPRESS 765*/ - extern double *getarg(); - static double *_p; static Datum *_ppvar; - -#define t nrn_threads->_t -#define dt nrn_threads->_dt -#define ia _p[0] -#define ia_columnindex 0 -#define ri _p[1] -#define ri_columnindex 1 -#define ztan _p[2] -#define ztan_columnindex 2 -#define Q _p[3] -#define Q_columnindex 3 -#define Qsum _p[4] -#define Qsum_columnindex 4 -#define _nd_area *_ppvar[0]._pval -#define pv *_ppvar[2]._pval -#define _p_pv _ppvar[2]._pval -#define Qtotal *_ppvar[3]._pval -#define _p_Qtotal _ppvar[3]._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 = 2; - /* external NEURON variables */ - /* declaration of user functions */ - 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; - -#define NMODL_TEXT 1 -#if NMODL_TEXT -static const char* nmodl_file_text; -static const char* nmodl_filename; -extern void hoc_reg_nmodl_text(int, const char*); -extern void hoc_reg_nmodl_filename(int, const char*); -#endif - - extern Prop* nrn_point_prop_; - static int _pointtype; - static void* _hoc_create_pnt(Object* _ho) { void* create_point_process(int, Object*); - return create_point_process(_pointtype, _ho); -} - static void _hoc_destroy_pnt(void*); - static double _hoc_loc_pnt(void* _vptr) {double loc_point_process(int, void*); - return loc_point_process(_pointtype, _vptr); -} - static double _hoc_has_loc(void* _vptr) {double has_loc_point(void*); - return has_loc_point(_vptr); -} - static double _hoc_get_loc_pnt(void* _vptr) { - double get_loc_point_process(void*); return (get_loc_point_process(_vptr)); -} - extern void _nrn_setdata_reg(int, void(*)(Prop*)); - static void _setdata(Prop* _prop) { - _p = _prop->param; _ppvar = _prop->dparam; - } - 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, - 0, 0 -}; - /* declare global and static user variables */ - /* some parameters have upper and lower limits */ - static HocParmLimits _hoc_parm_limits[] = { - 0,0,0 -}; - static HocParmUnits _hoc_parm_units[] = { - "ia", "nA", - "ri", "Mohm", - "ztan", "um", - "Q", "fAm", - "Qsum", "fAm", - "pv", "mV", - "Qtotal", "fAm", - 0,0 -}; - static double v = 0; - /* 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 _ba1(Node*_nd, double* _pp, Datum* _ppd, Datum* _thread, NrnThread* _nt) , _ba2(Node*_nd, double* _pp, Datum* _ppd, Datum* _thread, NrnThread* _nt) , _ba3(Node*_nd, double* _pp, Datum* _ppd, Datum* _thread, NrnThread* _nt) , _ba4(Node*_nd, double* _pp, Datum* _ppd, Datum* _thread, NrnThread* _nt) ; - static void nrn_alloc(Prop*); -static void nrn_init(NrnThread*, _Memb_list*, int); -static void nrn_state(NrnThread*, _Memb_list*, int); - static void _hoc_destroy_pnt(void* _vptr) { - destroy_point_process(_vptr); -} - /* connect range variables in _p that hoc is supposed to know about */ - static const char *_mechanism[] = { - "7.7.0", -"Dipole", - 0, - "ia", - "ri", - "ztan", - "Q", - "Qsum", - 0, - 0, - "pv", - "Qtotal", - 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, 5, _prop); - /*initialize range parameters*/ - } - _prop->param = _p; - _prop->param_size = 5; - if (!nrn_point_prop_) { - _ppvar = nrn_prop_datum_alloc(_mechtype, 4, _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(*)(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 _dipole_pp_reg() { - int _vectorized = 0; - _initlists(); - _pointtype = point_register_mech(_mechanism, - nrn_alloc,(void*)0, (void*)0, (void*)0, nrn_init, - hoc_nrnpointerindex, 0, - _hoc_create_pnt, _hoc_destroy_pnt, _member_func); - _mechtype = nrn_get_mechtype(_mechanism[1]); - _nrn_setdata_reg(_mechtype, _setdata); - #if NMODL_TEXT - hoc_reg_nmodl_text(_mechtype, nmodl_file_text); - hoc_reg_nmodl_filename(_mechtype, nmodl_filename); -#endif - hoc_register_prop_size(_mechtype, 5, 4); - hoc_register_dparam_semantics(_mechtype, 0, "area"); - hoc_register_dparam_semantics(_mechtype, 1, "pntproc"); - hoc_register_dparam_semantics(_mechtype, 2, "pointer"); - hoc_register_dparam_semantics(_mechtype, 3, "pointer"); - hoc_reg_ba(_mechtype, _ba1, 22); - hoc_reg_ba(_mechtype, _ba2, 23); - hoc_reg_ba(_mechtype, _ba3, 13); - hoc_reg_ba(_mechtype, _ba4, 11); - hoc_register_var(hoc_scdoub, hoc_vdoub, hoc_intfunc); - ivoc_help("help ?1 Dipole /Users/katharinaduecker/Documents/Projects Brown/hnn-core/hnn_core/mod/dipole_pp.mod\n"); - hoc_register_limits(_mechtype, _hoc_parm_limits); - hoc_register_units(_mechtype, _hoc_parm_units); - } -static int _reset; -static char *modelname = ""; - -static int error; -static int _ninits = 0; -static int _match_recurse=1; -static void _modl_cleanup(){ _match_recurse=1;} - /* AFTER SOLVE */ - static void _ba1(Node*_nd, double* _pp, Datum* _ppd, Datum* _thread, NrnThread* _nt) { - _p = _pp; _ppvar = _ppd; - v = NODEV(_nd); - ia = ( pv - v ) / ri ; - Q = ia * ztan ; - Qsum = Qsum + Q ; - Qtotal = Qtotal + Q ; - } - /* AFTER INITIAL */ - static void _ba2(Node*_nd, double* _pp, Datum* _ppd, Datum* _thread, NrnThread* _nt) { - _p = _pp; _ppvar = _ppd; - v = NODEV(_nd); - ia = ( pv - v ) / ri ; - Q = ia * ztan ; - Qsum = Qsum + Q ; - Qtotal = Qtotal + Q ; - } - /* BEFORE INITIAL */ - static void _ba3(Node*_nd, double* _pp, Datum* _ppd, Datum* _thread, NrnThread* _nt) { - _p = _pp; _ppvar = _ppd; - v = NODEV(_nd); - Qsum = 0.0 ; - Qtotal = 0.0 ; - } - /* BEFORE BREAKPOINT */ - static void _ba4(Node*_nd, double* _pp, Datum* _ppd, Datum* _thread, NrnThread* _nt) { - _p = _pp; _ppvar = _ppd; - v = NODEV(_nd); - Qsum = 0.0 ; - Qtotal = 0.0 ; - } - -static void initmodel() { - int _i; double _save;_ninits++; -{ - -} -} - -static void nrn_init(NrnThread* _nt, _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]; -#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(double _v){double _current=0.;v=_v;{ -} return _current; -} - -static void nrn_state(NrnThread* _nt, _Memb_list* _ml, int _type){ -Node *_nd; double _v = 0.0; 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); - } - v=_v; -{ -}} - -} - -static void terminal(){} - -static void _initlists() { - int _i; static int _first = 1; - if (!_first) return; -_first = 0; -} - -#if NMODL_TEXT -static const char* nmodl_filename = "/Users/katharinaduecker/Documents/Projects Brown/hnn-core/hnn_core/mod/dipole_pp.mod"; -static const char* nmodl_file_text = - ": dipole_pp.mod - creates point process mechanism Dipole\n" - ":\n" - ": v 1.9.1m0\n" - ": rev 2015-12-15 (SL: minor)\n" - ": last rev: (SL: added Qtotal back, used for par calc)\n" - "\n" - "NEURON {\n" - " POINT_PROCESS Dipole\n" - " RANGE ri, ia, Q, ztan\n" - " POINTER pv\n" - "\n" - " : for POINT_PROCESS. Gets additions from dipole\n" - " RANGE Qsum\n" - " POINTER Qtotal\n" - "}\n" - "\n" - "UNITS {\n" - " (nA) = (nanoamp)\n" - " (mV) = (millivolt)\n" - " (Mohm) = (megaohm)\n" - " (um) = (micrometer)\n" - " (Am) = (amp meter)\n" - " (fAm) = (femto amp meter)\n" - "}\n" - "\n" - "ASSIGNED {\n" - " ia (nA)\n" - " ri (Mohm) : internal resistance\n" - " pv (mV)\n" - " v (mV)\n" - " ztan (um)\n" - " Q (fAm)\n" - " Qsum (fAm)\n" - " Qtotal (fAm)\n" - "}\n" - "\n" - ": solve for v's first then use them\n" - "AFTER SOLVE {\n" - " ia = (pv - v) / ri\n" - " Q = ia * ztan\n" - " Qsum = Qsum + Q\n" - " Qtotal = Qtotal + Q\n" - "}\n" - "\n" - "AFTER INITIAL {\n" - " ia = (pv - v) / ri\n" - " Q = ia * ztan\n" - " Qsum = Qsum + Q\n" - " Qtotal = Qtotal + Q\n" - "}\n" - "\n" - ": following needed for POINT_PROCESS only but will work if also in SUFFIX\n" - "BEFORE INITIAL {\n" - " Qsum = 0\n" - " Qtotal = 0\n" - "}\n" - "\n" - "BEFORE BREAKPOINT {\n" - " Qsum = 0\n" - " Qtotal = 0\n" - "}\n" - ; -#endif diff --git a/hnn_core/mod/arm64/dipole_pp.o b/hnn_core/mod/arm64/dipole_pp.o deleted file mode 100644 index cbb18bd4f196cd73d7f3f619414bcb8c5f24fc45..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 7296 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 diff --git a/hnn_core/mod/arm64/hh2.c b/hnn_core/mod/arm64/hh2.c deleted file mode 100644 index c5946d715..000000000 --- a/hnn_core/mod/arm64/hh2.c +++ /dev/null @@ -1,883 +0,0 @@ -/* Created by Language version: 7.7.0 */ -/* VECTORIZED */ -#define NRN_VECTORIZED 1 -#include -#include -#include -#include "mech_api.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 nrn_init _nrn_init__hh2 -#define _nrn_initial _nrn_initial__hh2 -#define nrn_cur _nrn_cur__hh2 -#define _nrn_current _nrn_current__hh2 -#define nrn_jacob _nrn_jacob__hh2 -#define nrn_state _nrn_state__hh2 -#define _net_receive _net_receive__hh2 -#define _f_rates _f_rates__hh2 -#define rates rates__hh2 -#define states states__hh2 - -#define _threadargscomma_ _p, _ppvar, _thread, _nt, -#define _threadargsprotocomma_ double* _p, Datum* _ppvar, Datum* _thread, NrnThread* _nt, -#define _threadargs_ _p, _ppvar, _thread, _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 gnabar _p[0] -#define gnabar_columnindex 0 -#define gkbar _p[1] -#define gkbar_columnindex 1 -#define gl _p[2] -#define gl_columnindex 2 -#define el _p[3] -#define el_columnindex 3 -#define gna _p[4] -#define gna_columnindex 4 -#define gk _p[5] -#define gk_columnindex 5 -#define il _p[6] -#define il_columnindex 6 -#define m _p[7] -#define m_columnindex 7 -#define h _p[8] -#define h_columnindex 8 -#define n _p[9] -#define n_columnindex 9 -#define Dm _p[10] -#define Dm_columnindex 10 -#define Dh _p[11] -#define Dh_columnindex 11 -#define Dn _p[12] -#define Dn_columnindex 12 -#define ena _p[13] -#define ena_columnindex 13 -#define ek _p[14] -#define ek_columnindex 14 -#define ina _p[15] -#define ina_columnindex 15 -#define ik _p[16] -#define ik_columnindex 16 -#define v _p[17] -#define v_columnindex 17 -#define _g _p[18] -#define _g_columnindex 18 -#define _ion_ena *_ppvar[0]._pval -#define _ion_ina *_ppvar[1]._pval -#define _ion_dinadv *_ppvar[2]._pval -#define _ion_ek *_ppvar[3]._pval -#define _ion_ik *_ppvar[4]._pval -#define _ion_dikdv *_ppvar[5]._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 */ - extern double celsius; - /* declaration of user functions */ - static void _hoc_rates(void); - static void _hoc_vtrap(void); - 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; - -#define NMODL_TEXT 1 -#if NMODL_TEXT -static const char* nmodl_file_text; -static const char* nmodl_filename; -extern void hoc_reg_nmodl_text(int, const char*); -extern void hoc_reg_nmodl_filename(int, const char*); -#endif - - extern void _nrn_setdata_reg(int, void(*)(Prop*)); - static void _setdata(Prop* _prop) { - _extcall_prop = _prop; - } - static void _hoc_setdata() { - Prop *_prop, *hoc_getdata_range(int); - _prop = hoc_getdata_range(_mechtype); - _setdata(_prop); - hoc_retpushx(1.); -} - /* connect user functions to hoc names */ - static VoidFunc hoc_intfunc[] = { - "setdata_hh2", _hoc_setdata, - "rates_hh2", _hoc_rates, - "vtrap_hh2", _hoc_vtrap, - 0, 0 -}; -#define vtrap vtrap_hh2 - extern double vtrap( _threadargsprotocomma_ double , double ); - -static void _check_rates(double*, Datum*, Datum*, NrnThread*); -static void _check_table_thread(double* _p, Datum* _ppvar, Datum* _thread, NrnThread* _nt, int _type) { - _check_rates(_p, _ppvar, _thread, _nt); - } - /* declare global and static user variables */ - static int _thread1data_inuse = 0; -static double _thread1data[6]; -#define _gth 0 -#define htau_hh2 _thread1data[0] -#define htau _thread[_gth]._pval[0] -#define hinf_hh2 _thread1data[1] -#define hinf _thread[_gth]._pval[1] -#define mtau_hh2 _thread1data[2] -#define mtau _thread[_gth]._pval[2] -#define minf_hh2 _thread1data[3] -#define minf _thread[_gth]._pval[3] -#define ntau_hh2 _thread1data[4] -#define ntau _thread[_gth]._pval[4] -#define ninf_hh2 _thread1data[5] -#define ninf _thread[_gth]._pval[5] -#define temp temp_hh2 - double temp = 6.3; -#define tshift tshift_hh2 - double tshift = 30.7; -#define usetable usetable_hh2 - double usetable = 1; - /* some parameters have upper and lower limits */ - static HocParmLimits _hoc_parm_limits[] = { - "gl_hh2", 0, 1e+09, - "gkbar_hh2", 0, 1e+09, - "gnabar_hh2", 0, 1e+09, - "usetable_hh2", 0, 1, - 0,0,0 -}; - static HocParmUnits _hoc_parm_units[] = { - "mtau_hh2", "ms", - "htau_hh2", "ms", - "ntau_hh2", "ms", - "gnabar_hh2", "S/cm2", - "gkbar_hh2", "S/cm2", - "gl_hh2", "S/cm2", - "el_hh2", "mV", - "gna_hh2", "S/cm2", - "gk_hh2", "S/cm2", - "il_hh2", "mA/cm2", - 0,0 -}; - static double delta_t = 0.01; - static double h0 = 0; - static double m0 = 0; - static double n0 = 0; - /* connect global user variables to hoc */ - static DoubScal hoc_scdoub[] = { - "temp_hh2", &temp_hh2, - "tshift_hh2", &tshift_hh2, - "minf_hh2", &minf_hh2, - "hinf_hh2", &hinf_hh2, - "ninf_hh2", &ninf_hh2, - "mtau_hh2", &mtau_hh2, - "htau_hh2", &htau_hh2, - "ntau_hh2", &ntau_hh2, - "usetable_hh2", &usetable_hh2, - 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 int _ode_count(int); -static void _ode_map(int, double**, double**, double*, Datum*, double*, int); -static void _ode_spec(NrnThread*, _Memb_list*, int); -static void _ode_matsol(NrnThread*, _Memb_list*, int); - -#define _cvode_ieq _ppvar[6]._i - static void _ode_matsol_instance1(_threadargsproto_); - /* connect range variables in _p that hoc is supposed to know about */ - static const char *_mechanism[] = { - "7.7.0", -"hh2", - "gnabar_hh2", - "gkbar_hh2", - "gl_hh2", - "el_hh2", - 0, - "gna_hh2", - "gk_hh2", - "il_hh2", - 0, - "m_hh2", - "h_hh2", - "n_hh2", - 0, - 0}; - static Symbol* _na_sym; - static Symbol* _k_sym; - -extern Prop* need_memb(Symbol*); - -static void nrn_alloc(Prop* _prop) { - Prop *prop_ion; - double *_p; Datum *_ppvar; - _p = nrn_prop_data_alloc(_mechtype, 19, _prop); - /*initialize range parameters*/ - gnabar = 0.12; - gkbar = 0.036; - gl = 0.0003; - el = -54.3; - _prop->param = _p; - _prop->param_size = 19; - _ppvar = nrn_prop_datum_alloc(_mechtype, 7, _prop); - _prop->dparam = _ppvar; - /*connect ionic variables to this model*/ - prop_ion = need_memb(_na_sym); - nrn_promote(prop_ion, 0, 1); - _ppvar[0]._pval = &prop_ion->param[0]; /* ena */ - _ppvar[1]._pval = &prop_ion->param[3]; /* ina */ - _ppvar[2]._pval = &prop_ion->param[4]; /* _ion_dinadv */ - prop_ion = need_memb(_k_sym); - nrn_promote(prop_ion, 0, 1); - _ppvar[3]._pval = &prop_ion->param[0]; /* ek */ - _ppvar[4]._pval = &prop_ion->param[3]; /* ik */ - _ppvar[5]._pval = &prop_ion->param[4]; /* _ion_dikdv */ - -} - static void _initlists(); - /* some states have an absolute tolerance */ - static Symbol** _atollist; - static HocStateTolerance _hoc_state_tol[] = { - 0,0 -}; - static void _thread_mem_init(Datum*); - static void _thread_cleanup(Datum*); - static void _update_ion_pointer(Datum*); - extern Symbol* hoc_lookup(const char*); -extern void _nrn_thread_reg(int, int, void(*)(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 _hh2_reg() { - int _vectorized = 1; - _initlists(); - ion_reg("na", -10000.); - ion_reg("k", -10000.); - _na_sym = hoc_lookup("na_ion"); - _k_sym = hoc_lookup("k_ion"); - register_mech(_mechanism, nrn_alloc,nrn_cur, nrn_jacob, nrn_state, nrn_init, hoc_nrnpointerindex, 2); - _extcall_thread = (Datum*)ecalloc(1, sizeof(Datum)); - _thread_mem_init(_extcall_thread); - _thread1data_inuse = 0; - _mechtype = nrn_get_mechtype(_mechanism[1]); - _nrn_setdata_reg(_mechtype, _setdata); - _nrn_thread_reg(_mechtype, 1, _thread_mem_init); - _nrn_thread_reg(_mechtype, 0, _thread_cleanup); - _nrn_thread_reg(_mechtype, 2, _update_ion_pointer); - _nrn_thread_table_reg(_mechtype, _check_table_thread); - #if NMODL_TEXT - hoc_reg_nmodl_text(_mechtype, nmodl_file_text); - hoc_reg_nmodl_filename(_mechtype, nmodl_filename); -#endif - hoc_register_prop_size(_mechtype, 19, 7); - hoc_register_dparam_semantics(_mechtype, 0, "na_ion"); - hoc_register_dparam_semantics(_mechtype, 1, "na_ion"); - hoc_register_dparam_semantics(_mechtype, 2, "na_ion"); - hoc_register_dparam_semantics(_mechtype, 3, "k_ion"); - hoc_register_dparam_semantics(_mechtype, 4, "k_ion"); - hoc_register_dparam_semantics(_mechtype, 5, "k_ion"); - hoc_register_dparam_semantics(_mechtype, 6, "cvodeieq"); - hoc_register_cvode(_mechtype, _ode_count, _ode_map, _ode_spec, _ode_matsol); - hoc_register_tolerance(_mechtype, _hoc_state_tol, &_atollist); - hoc_register_var(hoc_scdoub, hoc_vdoub, hoc_intfunc); - ivoc_help("help ?1 hh2 /Users/katharinaduecker/Documents/Projects Brown/hnn-core/hnn_core/mod/hh2.mod\n"); - hoc_register_limits(_mechtype, _hoc_parm_limits); - hoc_register_units(_mechtype, _hoc_parm_units); - } - static double *_t_minf; - static double *_t_mtau; - static double *_t_hinf; - static double *_t_htau; - static double *_t_ninf; - static double *_t_ntau; -static int _reset; -static char *modelname = "hh2.mod sodium, potassium, and leak channels"; - -static int error; -static int _ninits = 0; -static int _match_recurse=1; -static void _modl_cleanup(){ _match_recurse=1;} -static int _f_rates(_threadargsprotocomma_ double); -static int rates(_threadargsprotocomma_ double); - -static int _ode_spec1(_threadargsproto_); -/*static int _ode_matsol1(_threadargsproto_);*/ - static void _n_rates(_threadargsprotocomma_ double _lv); - static int _slist1[3], _dlist1[3]; - static int states(_threadargsproto_); - -/*CVODE*/ - static int _ode_spec1 (double* _p, Datum* _ppvar, Datum* _thread, NrnThread* _nt) {int _reset = 0; { - rates ( _threadargscomma_ v ) ; - Dm = ( minf - m ) / mtau ; - Dh = ( hinf - h ) / htau ; - Dn = ( ninf - n ) / ntau ; - } - return _reset; -} - static int _ode_matsol1 (double* _p, Datum* _ppvar, Datum* _thread, NrnThread* _nt) { - rates ( _threadargscomma_ v ) ; - Dm = Dm / (1. - dt*( ( ( ( - 1.0 ) ) ) / mtau )) ; - Dh = Dh / (1. - dt*( ( ( ( - 1.0 ) ) ) / htau )) ; - Dn = Dn / (1. - dt*( ( ( ( - 1.0 ) ) ) / ntau )) ; - return 0; -} - /*END CVODE*/ - static int states (double* _p, Datum* _ppvar, Datum* _thread, NrnThread* _nt) { { - rates ( _threadargscomma_ v ) ; - m = m + (1. - exp(dt*(( ( ( - 1.0 ) ) ) / mtau)))*(- ( ( ( minf ) ) / mtau ) / ( ( ( ( - 1.0 ) ) ) / mtau ) - m) ; - h = h + (1. - exp(dt*(( ( ( - 1.0 ) ) ) / htau)))*(- ( ( ( hinf ) ) / htau ) / ( ( ( ( - 1.0 ) ) ) / htau ) - h) ; - n = n + (1. - exp(dt*(( ( ( - 1.0 ) ) ) / ntau)))*(- ( ( ( ninf ) ) / ntau ) / ( ( ( ( - 1.0 ) ) ) / ntau ) - n) ; - } - return 0; -} - static double _mfac_rates, _tmin_rates; - static void _check_rates(double* _p, Datum* _ppvar, Datum* _thread, NrnThread* _nt) { - static int _maktable=1; int _i, _j, _ix = 0; - double _xi, _tmax; - static double _sav_celsius; - if (!usetable) {return;} - if (_sav_celsius != celsius) { _maktable = 1;} - if (_maktable) { double _x, _dx; _maktable=0; - _tmin_rates = - 100.0 ; - _tmax = 100.0 ; - _dx = (_tmax - _tmin_rates)/200.; _mfac_rates = 1./_dx; - for (_i=0, _x=_tmin_rates; _i < 201; _x += _dx, _i++) { - _f_rates(_p, _ppvar, _thread, _nt, _x); - _t_minf[_i] = minf; - _t_mtau[_i] = mtau; - _t_hinf[_i] = hinf; - _t_htau[_i] = htau; - _t_ninf[_i] = ninf; - _t_ntau[_i] = ntau; - } - _sav_celsius = celsius; - } - } - - static int rates(double* _p, Datum* _ppvar, Datum* _thread, NrnThread* _nt, double _lv) { -#if 0 -_check_rates(_p, _ppvar, _thread, _nt); -#endif - _n_rates(_p, _ppvar, _thread, _nt, _lv); - return 0; - } - - static void _n_rates(double* _p, Datum* _ppvar, Datum* _thread, NrnThread* _nt, double _lv){ int _i, _j; - double _xi, _theta; - if (!usetable) { - _f_rates(_p, _ppvar, _thread, _nt, _lv); return; -} - _xi = _mfac_rates * (_lv - _tmin_rates); - if (isnan(_xi)) { - minf = _xi; - mtau = _xi; - hinf = _xi; - htau = _xi; - ninf = _xi; - ntau = _xi; - return; - } - if (_xi <= 0.) { - minf = _t_minf[0]; - mtau = _t_mtau[0]; - hinf = _t_hinf[0]; - htau = _t_htau[0]; - ninf = _t_ninf[0]; - ntau = _t_ntau[0]; - return; } - if (_xi >= 200.) { - minf = _t_minf[200]; - mtau = _t_mtau[200]; - hinf = _t_hinf[200]; - htau = _t_htau[200]; - ninf = _t_ninf[200]; - ntau = _t_ntau[200]; - return; } - _i = (int) _xi; - _theta = _xi - (double)_i; - minf = _t_minf[_i] + _theta*(_t_minf[_i+1] - _t_minf[_i]); - mtau = _t_mtau[_i] + _theta*(_t_mtau[_i+1] - _t_mtau[_i]); - hinf = _t_hinf[_i] + _theta*(_t_hinf[_i+1] - _t_hinf[_i]); - htau = _t_htau[_i] + _theta*(_t_htau[_i+1] - _t_htau[_i]); - ninf = _t_ninf[_i] + _theta*(_t_ninf[_i+1] - _t_ninf[_i]); - ntau = _t_ntau[_i] + _theta*(_t_ntau[_i+1] - _t_ntau[_i]); - } - - -static int _f_rates ( _threadargsprotocomma_ double _lv ) { - double _lalpha , _lbeta , _lsum , _lq10 ; - _lq10 = pow( 3.0 , ( ( celsius - temp - tshift ) / 10.0 ) ) ; - _lalpha = .1 * vtrap ( _threadargscomma_ - ( _lv + 40.0 ) , 10.0 ) ; - _lbeta = 4.0 * exp ( - ( _lv + 65.0 ) / 18.0 ) ; - _lsum = _lalpha + _lbeta ; - mtau = 1.0 / ( _lq10 * _lsum ) ; - minf = _lalpha / _lsum ; - _lalpha = .07 * exp ( - ( _lv + 65.0 ) / 20.0 ) ; - _lbeta = 1.0 / ( exp ( - ( _lv + 35.0 ) / 10.0 ) + 1.0 ) ; - _lsum = _lalpha + _lbeta ; - htau = 1.0 / ( _lq10 * _lsum ) ; - hinf = _lalpha / _lsum ; - _lalpha = .01 * vtrap ( _threadargscomma_ - ( _lv + 55.0 ) , 10.0 ) ; - _lbeta = .125 * exp ( - ( _lv + 65.0 ) / 80.0 ) ; - _lsum = _lalpha + _lbeta ; - ntau = 1.0 / ( _lq10 * _lsum ) ; - ninf = _lalpha / _lsum ; - return 0; } - -static void _hoc_rates(void) { - double _r; - double* _p; Datum* _ppvar; Datum* _thread; NrnThread* _nt; - if (_extcall_prop) {_p = _extcall_prop->param; _ppvar = _extcall_prop->dparam;}else{ _p = (double*)0; _ppvar = (Datum*)0; } - _thread = _extcall_thread; - _nt = nrn_threads; - -#if 1 - _check_rates(_p, _ppvar, _thread, _nt); -#endif - _r = 1.; - rates ( _p, _ppvar, _thread, _nt, *getarg(1) ); - hoc_retpushx(_r); -} - -double vtrap ( _threadargsprotocomma_ double _lx , double _ly ) { - double _lvtrap; - if ( fabs ( _lx / _ly ) < 1e-6 ) { - _lvtrap = _ly * ( 1.0 - _lx / _ly / 2.0 ) ; - } - else { - _lvtrap = _lx / ( exp ( _lx / _ly ) - 1.0 ) ; - } - -return _lvtrap; - } - -static void _hoc_vtrap(void) { - double _r; - double* _p; Datum* _ppvar; Datum* _thread; NrnThread* _nt; - if (_extcall_prop) {_p = _extcall_prop->param; _ppvar = _extcall_prop->dparam;}else{ _p = (double*)0; _ppvar = (Datum*)0; } - _thread = _extcall_thread; - _nt = nrn_threads; - _r = vtrap ( _p, _ppvar, _thread, _nt, *getarg(1) , *getarg(2) ); - hoc_retpushx(_r); -} - -static int _ode_count(int _type){ return 3;} - -static void _ode_spec(NrnThread* _nt, _Memb_list* _ml, int _type) { - double* _p; Datum* _ppvar; Datum* _thread; - Node* _nd; double _v; int _iml, _cntml; - _cntml = _ml->_nodecount; - _thread = _ml->_thread; - for (_iml = 0; _iml < _cntml; ++_iml) { - _p = _ml->_data[_iml]; _ppvar = _ml->_pdata[_iml]; - _nd = _ml->_nodelist[_iml]; - v = NODEV(_nd); - ena = _ion_ena; - ek = _ion_ek; - _ode_spec1 (_p, _ppvar, _thread, _nt); - }} - -static void _ode_map(int _ieq, double** _pv, double** _pvdot, double* _pp, Datum* _ppd, double* _atol, int _type) { - double* _p; Datum* _ppvar; - int _i; _p = _pp; _ppvar = _ppd; - _cvode_ieq = _ieq; - for (_i=0; _i < 3; ++_i) { - _pv[_i] = _pp + _slist1[_i]; _pvdot[_i] = _pp + _dlist1[_i]; - _cvode_abstol(_atollist, _atol, _i); - } - } - -static void _ode_matsol_instance1(_threadargsproto_) { - _ode_matsol1 (_p, _ppvar, _thread, _nt); - } - -static void _ode_matsol(NrnThread* _nt, _Memb_list* _ml, int _type) { - double* _p; Datum* _ppvar; Datum* _thread; - Node* _nd; double _v; int _iml, _cntml; - _cntml = _ml->_nodecount; - _thread = _ml->_thread; - for (_iml = 0; _iml < _cntml; ++_iml) { - _p = _ml->_data[_iml]; _ppvar = _ml->_pdata[_iml]; - _nd = _ml->_nodelist[_iml]; - v = NODEV(_nd); - ena = _ion_ena; - ek = _ion_ek; - _ode_matsol_instance1(_threadargs_); - }} - -static void _thread_mem_init(Datum* _thread) { - if (_thread1data_inuse) {_thread[_gth]._pval = (double*)ecalloc(6, sizeof(double)); - }else{ - _thread[_gth]._pval = _thread1data; _thread1data_inuse = 1; - } - } - -static void _thread_cleanup(Datum* _thread) { - if (_thread[_gth]._pval == _thread1data) { - _thread1data_inuse = 0; - }else{ - free((void*)_thread[_gth]._pval); - } - } - extern void nrn_update_ion_pointer(Symbol*, Datum*, int, int); - static void _update_ion_pointer(Datum* _ppvar) { - nrn_update_ion_pointer(_na_sym, _ppvar, 0, 0); - nrn_update_ion_pointer(_na_sym, _ppvar, 1, 3); - nrn_update_ion_pointer(_na_sym, _ppvar, 2, 4); - nrn_update_ion_pointer(_k_sym, _ppvar, 3, 0); - nrn_update_ion_pointer(_k_sym, _ppvar, 4, 3); - nrn_update_ion_pointer(_k_sym, _ppvar, 5, 4); - } - -static void initmodel(double* _p, Datum* _ppvar, Datum* _thread, NrnThread* _nt) { - int _i; double _save;{ - h = h0; - m = m0; - n = n0; - { - rates ( _threadargscomma_ v ) ; - m = minf ; - h = hinf ; - n = ninf ; - } - -} -} - -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 0 - _check_rates(_p, _ppvar, _thread, _nt); -#endif -#if CACHEVEC - if (use_cachevec) { - _v = VEC_V(_ni[_iml]); - }else -#endif - { - _nd = _ml->_nodelist[_iml]; - _v = NODEV(_nd); - } - v = _v; - ena = _ion_ena; - ek = _ion_ek; - initmodel(_p, _ppvar, _thread, _nt); - } -} - -static double _nrn_current(double* _p, Datum* _ppvar, Datum* _thread, NrnThread* _nt, double _v){double _current=0.;v=_v;{ { - gna = gnabar * m * m * m * h ; - ina = gna * ( v - ena ) ; - gk = gkbar * n * n * n * n ; - ik = gk * ( v - ek ) ; - il = gl * ( v - el ) ; - } - _current += ina; - _current += ik; - _current += il; - -} 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 CACHEVEC - if (use_cachevec) { - _v = VEC_V(_ni[_iml]); - }else -#endif - { - _nd = _ml->_nodelist[_iml]; - _v = NODEV(_nd); - } - ena = _ion_ena; - ek = _ion_ek; - _g = _nrn_current(_p, _ppvar, _thread, _nt, _v + .001); - { double _dik; - double _dina; - _dina = ina; - _dik = ik; - _rhs = _nrn_current(_p, _ppvar, _thread, _nt, _v); - _ion_dinadv += (_dina - ina)/.001 ; - _ion_dikdv += (_dik - ik)/.001 ; - } - _g = (_g - _rhs)/.001; - _ion_ina += ina ; - _ion_ik += ik ; -#if CACHEVEC - if (use_cachevec) { - VEC_RHS(_ni[_iml]) -= _rhs; - }else -#endif - { - NODERHS(_nd) -= _rhs; - } - -} - -} - -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]; -#if CACHEVEC - if (use_cachevec) { - VEC_D(_ni[_iml]) += _g; - }else -#endif - { - _nd = _ml->_nodelist[_iml]; - NODED(_nd) += _g; - } - -} - -} - -static void nrn_state(NrnThread* _nt, _Memb_list* _ml, int _type) { -double* _p; Datum* _ppvar; Datum* _thread; -Node *_nd; double _v = 0.0; 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 CACHEVEC - if (use_cachevec) { - _v = VEC_V(_ni[_iml]); - }else -#endif - { - _nd = _ml->_nodelist[_iml]; - _v = NODEV(_nd); - } - v=_v; -{ - ena = _ion_ena; - ek = _ion_ek; - { states(_p, _ppvar, _thread, _nt); - } }} - -} - -static void terminal(){} - -static void _initlists(){ - double _x; double* _p = &_x; - int _i; static int _first = 1; - if (!_first) return; - _slist1[0] = m_columnindex; _dlist1[0] = Dm_columnindex; - _slist1[1] = h_columnindex; _dlist1[1] = Dh_columnindex; - _slist1[2] = n_columnindex; _dlist1[2] = Dn_columnindex; - _t_minf = makevector(201*sizeof(double)); - _t_mtau = makevector(201*sizeof(double)); - _t_hinf = makevector(201*sizeof(double)); - _t_htau = makevector(201*sizeof(double)); - _t_ninf = makevector(201*sizeof(double)); - _t_ntau = makevector(201*sizeof(double)); -_first = 0; -} - -#if defined(__cplusplus) -} /* extern "C" */ -#endif - -#if NMODL_TEXT -static const char* nmodl_filename = "/Users/katharinaduecker/Documents/Projects Brown/hnn-core/hnn_core/mod/hh2.mod"; -static const char* nmodl_file_text = - "TITLE hh2.mod sodium, potassium, and leak channels\n" - " \n" - "COMMENT\n" - " This is an adjusted Hodgkin-Huxley treatment for sodium, \n" - " potassium, and leakage channels.\n" - " Membrane voltage is in absolute mV and has been reversed in polarity\n" - " from the original HH convention and shifted to reflect a resting potential\n" - " of -65 mV.\n" - " Remember to set celsius in your HOC file.\n" - "ENDCOMMENT\n" - " \n" - "UNITS {\n" - " (mA) = (milliamp)\n" - " (mV) = (millivolt)\n" - " (S) = (siemens)\n" - "}\n" - " \n" - "? interface\n" - "NEURON {\n" - " SUFFIX hh2\n" - " USEION na READ ena WRITE ina\n" - " USEION k READ ek WRITE ik\n" - " NONSPECIFIC_CURRENT il\n" - " RANGE gnabar, gkbar, gl, el, gna, gk\n" - " GLOBAL minf, hinf, ninf, mtau, htau, ntau, tshift, temp\n" - " THREADSAFE : assigned GLOBALs will be per thread\n" - "}\n" - " \n" - "PARAMETER {\n" - " gnabar = .12 (S/cm2) <0,1e9>\n" - " gkbar = .036 (S/cm2) <0,1e9>\n" - " gl = .0003 (S/cm2) <0,1e9>\n" - " el = -54.3 (mV)\n" - " temp = 6.3\n" - " tshift = 30.7\n" - "}\n" - " \n" - "STATE {\n" - " m h n\n" - "}\n" - " \n" - "ASSIGNED {\n" - " v (mV)\n" - " celsius (degC)\n" - " ena (mV)\n" - " ek (mV)\n" - "\n" - " gna (S/cm2)\n" - " gk (S/cm2)\n" - " ina (mA/cm2)\n" - " ik (mA/cm2)\n" - " il (mA/cm2)\n" - " minf hinf ninf\n" - " mtau (ms) htau (ms) ntau (ms)\n" - "}\n" - " \n" - "? currents\n" - "BREAKPOINT {\n" - " SOLVE states METHOD cnexp\n" - " gna = gnabar*m*m*m*h\n" - " ina = gna*(v - ena)\n" - " gk = gkbar*n*n*n*n\n" - " ik = gk*(v - ek) \n" - " il = gl*(v - el)\n" - "}\n" - " \n" - " \n" - "INITIAL {\n" - " rates(v)\n" - " m = minf\n" - " h = hinf\n" - " n = ninf\n" - "}\n" - "\n" - "? states\n" - "DERIVATIVE states { \n" - " rates(v)\n" - " m' = (minf-m)/mtau\n" - " h' = (hinf-h)/htau\n" - " n' = (ninf-n)/ntau\n" - "}\n" - " \n" - ":LOCAL q10\n" - "\n" - "\n" - "? rates\n" - "PROCEDURE rates(v(mV)) { :Computes rate and other constants at current v.\n" - " :Call once from HOC to initialize inf at resting v.\n" - " LOCAL alpha, beta, sum, q10\n" - " TABLE minf, mtau, hinf, htau, ninf, ntau DEPEND celsius FROM -100 TO 100 WITH 200\n" - "\n" - "UNITSOFF\n" - " q10 = 3^((celsius - temp - tshift)/10)\n" - " :\"m\" sodium activation system\n" - " alpha = .1 * vtrap(-(v+40),10)\n" - " beta = 4 * exp(-(v+65)/18)\n" - " sum = alpha + beta\n" - " mtau = 1/(q10*sum)\n" - " minf = alpha/sum\n" - " :\"h\" sodium inactivation system\n" - " alpha = .07 * exp(-(v+65)/20)\n" - " beta = 1 / (exp(-(v+35)/10) + 1)\n" - " sum = alpha + beta\n" - " htau = 1/(q10*sum)\n" - " hinf = alpha/sum\n" - " :\"n\" potassium activation system\n" - " alpha = .01*vtrap(-(v+55),10) \n" - " beta = .125*exp(-(v+65)/80)\n" - " sum = alpha + beta\n" - " ntau = 1/(q10*sum)\n" - " ninf = alpha/sum\n" - "}\n" - " \n" - "FUNCTION vtrap(x,y) { :Traps for 0 in denominator of rate eqns.\n" - " if (fabs(x/y) < 1e-6) {\n" - " vtrap = y*(1 - x/y/2)\n" - " }else{\n" - " vtrap = x/(exp(x/y) - 1)\n" - " }\n" - "}\n" - " \n" - "UNITSON\n" - ; -#endif diff --git a/hnn_core/mod/arm64/hh2.o b/hnn_core/mod/arm64/hh2.o deleted file mode 100644 index dac6fd77eed5d3abf7d20078335ce0809b8cc447..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 18496 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 -#include -#include -#include "mech_api.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 nrn_init _nrn_init__kca -#define _nrn_initial _nrn_initial__kca -#define nrn_cur _nrn_cur__kca -#define _nrn_current _nrn_current__kca -#define nrn_jacob _nrn_jacob__kca -#define nrn_state _nrn_state__kca -#define _net_receive _net_receive__kca -#define rates rates__kca -#define states states__kca - -#define _threadargscomma_ /**/ -#define _threadargsprotocomma_ /**/ -#define _threadargs_ /**/ -#define _threadargsproto_ /**/ - /*SUPPRESS 761*/ - /*SUPPRESS 762*/ - /*SUPPRESS 763*/ - /*SUPPRESS 765*/ - extern double *getarg(); - static double *_p; static Datum *_ppvar; - -#define t nrn_threads->_t -#define dt nrn_threads->_dt -#define gbar _p[0] -#define gbar_columnindex 0 -#define gk _p[1] -#define gk_columnindex 1 -#define ninf _p[2] -#define ninf_columnindex 2 -#define ntau _p[3] -#define ntau_columnindex 3 -#define n _p[4] -#define n_columnindex 4 -#define cai _p[5] -#define cai_columnindex 5 -#define a _p[6] -#define a_columnindex 6 -#define b _p[7] -#define b_columnindex 7 -#define ik _p[8] -#define ik_columnindex 8 -#define ek _p[9] -#define ek_columnindex 9 -#define Dn _p[10] -#define Dn_columnindex 10 -#define _g _p[11] -#define _g_columnindex 11 -#define _ion_ek *_ppvar[0]._pval -#define _ion_ik *_ppvar[1]._pval -#define _ion_dikdv *_ppvar[2]._pval -#define _ion_cai *_ppvar[3]._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; - /* external NEURON variables */ - extern double celsius; - /* declaration of user functions */ - static void _hoc_rates(void); - 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; - -#define NMODL_TEXT 1 -#if NMODL_TEXT -static const char* nmodl_file_text; -static const char* nmodl_filename; -extern void hoc_reg_nmodl_text(int, const char*); -extern void hoc_reg_nmodl_filename(int, const char*); -#endif - - extern void _nrn_setdata_reg(int, void(*)(Prop*)); - static void _setdata(Prop* _prop) { - _p = _prop->param; _ppvar = _prop->dparam; - } - static void _hoc_setdata() { - Prop *_prop, *hoc_getdata_range(int); - _prop = hoc_getdata_range(_mechtype); - _setdata(_prop); - hoc_retpushx(1.); -} - /* connect user functions to hoc names */ - static VoidFunc hoc_intfunc[] = { - "setdata_kca", _hoc_setdata, - "rates_kca", _hoc_rates, - 0, 0 -}; - /* declare global and static user variables */ -#define Rb Rb_kca - double Rb = 0.02; -#define Ra Ra_kca - double Ra = 0.01; -#define caix caix_kca - double caix = 1; -#define q10 q10_kca - double q10 = 2.3; -#define tshift tshift_kca - double tshift = 30.7; -#define tadj tadj_kca - double tadj = 0; -#define temp temp_kca - double temp = 23; -#define vmax vmax_kca - double vmax = 100; -#define vmin vmin_kca - double vmin = -120; - /* some parameters have upper and lower limits */ - static HocParmLimits _hoc_parm_limits[] = { - 0,0,0 -}; - static HocParmUnits _hoc_parm_units[] = { - "Ra_kca", "/ms", - "Rb_kca", "/ms", - "temp_kca", "degC", - "vmin_kca", "mV", - "vmax_kca", "mV", - "gbar_kca", "pS/um2", - "gk_kca", "pS/um2", - "ntau_kca", "ms", - 0,0 -}; - static double delta_t = 1; - static double n0 = 0; - static double v = 0; - /* connect global user variables to hoc */ - static DoubScal hoc_scdoub[] = { - "caix_kca", &caix_kca, - "Ra_kca", &Ra_kca, - "Rb_kca", &Rb_kca, - "temp_kca", &temp_kca, - "q10_kca", &q10_kca, - "tshift_kca", &tshift_kca, - "vmin_kca", &vmin_kca, - "vmax_kca", &vmax_kca, - "tadj_kca", &tadj_kca, - 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 int _ode_count(int); -static void _ode_map(int, double**, double**, double*, Datum*, double*, int); -static void _ode_spec(NrnThread*, _Memb_list*, int); -static void _ode_matsol(NrnThread*, _Memb_list*, int); - -#define _cvode_ieq _ppvar[4]._i - static void _ode_matsol_instance1(_threadargsproto_); - /* connect range variables in _p that hoc is supposed to know about */ - static const char *_mechanism[] = { - "7.7.0", -"kca", - "gbar_kca", - 0, - "gk_kca", - "ninf_kca", - "ntau_kca", - 0, - "n_kca", - 0, - 0}; - static Symbol* _k_sym; - static Symbol* _ca_sym; - -extern Prop* need_memb(Symbol*); - -static void nrn_alloc(Prop* _prop) { - Prop *prop_ion; - double *_p; Datum *_ppvar; - _p = nrn_prop_data_alloc(_mechtype, 12, _prop); - /*initialize range parameters*/ - gbar = 10; - _prop->param = _p; - _prop->param_size = 12; - _ppvar = nrn_prop_datum_alloc(_mechtype, 5, _prop); - _prop->dparam = _ppvar; - /*connect ionic variables to this model*/ - prop_ion = need_memb(_k_sym); - nrn_promote(prop_ion, 0, 1); - _ppvar[0]._pval = &prop_ion->param[0]; /* ek */ - _ppvar[1]._pval = &prop_ion->param[3]; /* ik */ - _ppvar[2]._pval = &prop_ion->param[4]; /* _ion_dikdv */ - prop_ion = need_memb(_ca_sym); - nrn_promote(prop_ion, 1, 0); - _ppvar[3]._pval = &prop_ion->param[1]; /* cai */ - -} - static void _initlists(); - /* some states have an absolute tolerance */ - static Symbol** _atollist; - static HocStateTolerance _hoc_state_tol[] = { - 0,0 -}; - static void _update_ion_pointer(Datum*); - extern Symbol* hoc_lookup(const char*); -extern void _nrn_thread_reg(int, int, void(*)(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 _kca_reg() { - int _vectorized = 0; - _initlists(); - ion_reg("k", -10000.); - ion_reg("ca", -10000.); - _k_sym = hoc_lookup("k_ion"); - _ca_sym = hoc_lookup("ca_ion"); - register_mech(_mechanism, nrn_alloc,nrn_cur, nrn_jacob, nrn_state, nrn_init, hoc_nrnpointerindex, 0); - _mechtype = nrn_get_mechtype(_mechanism[1]); - _nrn_setdata_reg(_mechtype, _setdata); - _nrn_thread_reg(_mechtype, 2, _update_ion_pointer); - #if NMODL_TEXT - hoc_reg_nmodl_text(_mechtype, nmodl_file_text); - hoc_reg_nmodl_filename(_mechtype, nmodl_filename); -#endif - hoc_register_prop_size(_mechtype, 12, 5); - hoc_register_dparam_semantics(_mechtype, 0, "k_ion"); - hoc_register_dparam_semantics(_mechtype, 1, "k_ion"); - hoc_register_dparam_semantics(_mechtype, 2, "k_ion"); - hoc_register_dparam_semantics(_mechtype, 3, "ca_ion"); - hoc_register_dparam_semantics(_mechtype, 4, "cvodeieq"); - hoc_register_cvode(_mechtype, _ode_count, _ode_map, _ode_spec, _ode_matsol); - hoc_register_tolerance(_mechtype, _hoc_state_tol, &_atollist); - hoc_register_var(hoc_scdoub, hoc_vdoub, hoc_intfunc); - ivoc_help("help ?1 kca /Users/katharinaduecker/Documents/Projects Brown/hnn-core/hnn_core/mod/kca.mod\n"); - hoc_register_limits(_mechtype, _hoc_parm_limits); - hoc_register_units(_mechtype, _hoc_parm_units); - } - static double _znexp ; -static int _reset; -static char *modelname = ""; - -static int error; -static int _ninits = 0; -static int _match_recurse=1; -static void _modl_cleanup(){ _match_recurse=1;} -static int rates(double); - -static int _ode_spec1(_threadargsproto_); -/*static int _ode_matsol1(_threadargsproto_);*/ - static int _slist1[1], _dlist1[1]; - static int states(_threadargsproto_); - -/*CVODE*/ - static int _ode_spec1 () {_reset=0; - { - rates ( _threadargscomma_ cai ) ; - Dn = ( ninf - n ) / ntau ; - } - return _reset; -} - static int _ode_matsol1 () { - rates ( _threadargscomma_ cai ) ; - Dn = Dn / (1. - dt*( ( ( ( - 1.0 ) ) ) / ntau )) ; - return 0; -} - /*END CVODE*/ - static int states () {_reset=0; - { - rates ( _threadargscomma_ cai ) ; - n = n + (1. - exp(dt*(( ( ( - 1.0 ) ) ) / ntau)))*(- ( ( ( ninf ) ) / ntau ) / ( ( ( ( - 1.0 ) ) ) / ntau ) - n) ; - } - return 0; -} - -static int rates ( double _lcai ) { - a = Ra * pow( _lcai , caix ) ; - b = Rb ; - tadj = pow( q10 , ( ( celsius - temp - tshift ) / 10.0 ) ) ; - ntau = 1.0 / tadj / ( a + b ) ; - ninf = a / ( a + b ) ; - return 0; } - -static void _hoc_rates(void) { - double _r; - _r = 1.; - rates ( *getarg(1) ); - hoc_retpushx(_r); -} - -static int _ode_count(int _type){ return 1;} - -static void _ode_spec(NrnThread* _nt, _Memb_list* _ml, int _type) { - Datum* _thread; - Node* _nd; double _v; int _iml, _cntml; - _cntml = _ml->_nodecount; - _thread = _ml->_thread; - for (_iml = 0; _iml < _cntml; ++_iml) { - _p = _ml->_data[_iml]; _ppvar = _ml->_pdata[_iml]; - _nd = _ml->_nodelist[_iml]; - v = NODEV(_nd); - ek = _ion_ek; - cai = _ion_cai; - _ode_spec1 (); - }} - -static void _ode_map(int _ieq, double** _pv, double** _pvdot, double* _pp, Datum* _ppd, double* _atol, int _type) { - int _i; _p = _pp; _ppvar = _ppd; - _cvode_ieq = _ieq; - for (_i=0; _i < 1; ++_i) { - _pv[_i] = _pp + _slist1[_i]; _pvdot[_i] = _pp + _dlist1[_i]; - _cvode_abstol(_atollist, _atol, _i); - } - } - -static void _ode_matsol_instance1(_threadargsproto_) { - _ode_matsol1 (); - } - -static void _ode_matsol(NrnThread* _nt, _Memb_list* _ml, int _type) { - Datum* _thread; - Node* _nd; double _v; int _iml, _cntml; - _cntml = _ml->_nodecount; - _thread = _ml->_thread; - for (_iml = 0; _iml < _cntml; ++_iml) { - _p = _ml->_data[_iml]; _ppvar = _ml->_pdata[_iml]; - _nd = _ml->_nodelist[_iml]; - v = NODEV(_nd); - ek = _ion_ek; - cai = _ion_cai; - _ode_matsol_instance1(_threadargs_); - }} - extern void nrn_update_ion_pointer(Symbol*, Datum*, int, int); - static void _update_ion_pointer(Datum* _ppvar) { - nrn_update_ion_pointer(_k_sym, _ppvar, 0, 0); - nrn_update_ion_pointer(_k_sym, _ppvar, 1, 3); - nrn_update_ion_pointer(_k_sym, _ppvar, 2, 4); - nrn_update_ion_pointer(_ca_sym, _ppvar, 3, 1); - } - -static void initmodel() { - int _i; double _save;_ninits++; - _save = t; - t = 0.0; -{ - n = n0; - { - rates ( _threadargscomma_ cai ) ; - n = ninf ; - } - _sav_indep = t; t = _save; - -} -} - -static void nrn_init(NrnThread* _nt, _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]; -#if CACHEVEC - if (use_cachevec) { - _v = VEC_V(_ni[_iml]); - }else -#endif - { - _nd = _ml->_nodelist[_iml]; - _v = NODEV(_nd); - } - v = _v; - ek = _ion_ek; - cai = _ion_cai; - initmodel(); - }} - -static double _nrn_current(double _v){double _current=0.;v=_v;{ { - gk = tadj * gbar * n ; - ik = ( 1e-4 ) * gk * ( v - ek ) ; - } - _current += ik; - -} return _current; -} - -static void nrn_cur(NrnThread* _nt, _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); - } - ek = _ion_ek; - cai = _ion_cai; - _g = _nrn_current(_v + .001); - { double _dik; - _dik = ik; - _rhs = _nrn_current(_v); - _ion_dikdv += (_dik - ik)/.001 ; - } - _g = (_g - _rhs)/.001; - _ion_ik += ik ; -#if CACHEVEC - if (use_cachevec) { - VEC_RHS(_ni[_iml]) -= _rhs; - }else -#endif - { - NODERHS(_nd) -= _rhs; - } - -}} - -static void nrn_jacob(NrnThread* _nt, _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 void nrn_state(NrnThread* _nt, _Memb_list* _ml, int _type){ -Node *_nd; double _v = 0.0; 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); - } - v=_v; -{ - ek = _ion_ek; - cai = _ion_cai; - { error = states(); - if(error){fprintf(stderr,"at line 84 in file kca.mod:\n SOLVE states METHOD cnexp\n"); nrn_complain(_p); abort_run(error);} - } }} - -} - -static void terminal(){} - -static void _initlists() { - int _i; static int _first = 1; - if (!_first) return; - _slist1[0] = n_columnindex; _dlist1[0] = Dn_columnindex; -_first = 0; -} - -#if NMODL_TEXT -static const char* nmodl_filename = "/Users/katharinaduecker/Documents/Projects Brown/hnn-core/hnn_core/mod/kca.mod"; -static const char* nmodl_file_text = - "COMMENT\n" - " 26 Ago 2002 Modification of original channel to allow variable time step\n" - " and to correct an initialization error.\n" - "\n" - " Done by Michael Hines (michael.hines@yale.edu) and Ruggero Scorcioni (rscorcio@gmu.edu)\n" - " at EU Advance Course in Computational Neuroscience. Obidos, Portugal\n" - "\n" - " kca.mod\n" - "\n" - " Calcium-dependent potassium channel\n" - " Based on Pennefather (1990) -- sympathetic ganglion cells\n" - " taken from Reuveni et al (1993) -- neocortical cells\n" - "\n" - " Author: Zach Mainen, Salk Institute, 1995, zach@salk.edu\n" - "\n" - "ENDCOMMENT\n" - "\n" - "INDEPENDENT {t FROM 0 TO 1 WITH 1 (ms)}\n" - "\n" - "NEURON {\n" - " SUFFIX kca\n" - " USEION k READ ek WRITE ik\n" - " USEION ca READ cai\n" - " RANGE n, gk, gbar\n" - " RANGE ninf, ntau\n" - " GLOBAL Ra, Rb, caix\n" - " GLOBAL q10, temp, tadj, vmin, vmax, tshift\n" - "}\n" - "\n" - "UNITS {\n" - " (mA) = (milliamp)\n" - " (mV) = (millivolt)\n" - " (pS) = (picosiemens)\n" - " (um) = (micron)\n" - "}\n" - "\n" - "PARAMETER {\n" - " : 0.03 mho/cm2\n" - " gbar = 10 (pS/um2)\n" - " v (mV)\n" - " cai (mM)\n" - " caix = 1\n" - "\n" - " : max act rate\n" - " Ra = 0.01 (/ms)\n" - "\n" - " : max deact rate\n" - " Rb = 0.02 (/ms)\n" - "\n" - " dt (ms)\n" - " celsius (degC)\n" - "\n" - " : original temp\n" - " temp = 23 (degC)\n" - " q10 = 2.3\n" - " tshift = 30.7\n" - "\n" - " vmin = -120 (mV)\n" - " vmax = 100 (mV)\n" - "}\n" - "\n" - "ASSIGNED {\n" - " a (/ms)\n" - " b (/ms)\n" - " ik (mA/cm2)\n" - " gk (pS/um2)\n" - " ek (mV)\n" - " ninf\n" - " ntau (ms)\n" - " tadj\n" - "}\n" - "\n" - "\n" - "STATE {\n" - " n\n" - "}\n" - "\n" - "INITIAL {\n" - " rates(cai)\n" - " n = ninf\n" - "}\n" - "\n" - "BREAKPOINT {\n" - " SOLVE states METHOD cnexp\n" - " gk = tadj * gbar * n\n" - " ik = (1e-4) * gk * (v - ek)\n" - "}\n" - "\n" - "LOCAL nexp\n" - "\n" - ": Computes state variable n at the current v and dt.\n" - "DERIVATIVE states {\n" - " rates(cai)\n" - " n' = (ninf - n) / ntau\n" - "}\n" - "\n" - "PROCEDURE rates(cai(mM)) {\n" - " a = Ra * cai^caix\n" - " b = Rb\n" - "\n" - " tadj = q10^((celsius - temp - tshift) / 10)\n" - "\n" - " ntau = 1 / tadj / (a + b)\n" - " ninf = a / (a + b)\n" - "\n" - " : tinc = -dt * tadj\n" - " : nexp = 1 - exp(tinc/ntau)\n" - "}\n" - ; -#endif diff --git a/hnn_core/mod/arm64/kca.o b/hnn_core/mod/arm64/kca.o deleted file mode 100644 index 1ff57893b6931b929d89d6789bc73e939e92c0f5..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 13328 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 -#include -#include -#include "mech_api.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 nrn_init _nrn_init__km -#define _nrn_initial _nrn_initial__km -#define nrn_cur _nrn_cur__km -#define _nrn_current _nrn_current__km -#define nrn_jacob _nrn_jacob__km -#define nrn_state _nrn_state__km -#define _net_receive _net_receive__km -#define _f_trates _f_trates__km -#define rates rates__km -#define states states__km -#define trates trates__km - -#define _threadargscomma_ /**/ -#define _threadargsprotocomma_ /**/ -#define _threadargs_ /**/ -#define _threadargsproto_ /**/ - /*SUPPRESS 761*/ - /*SUPPRESS 762*/ - /*SUPPRESS 763*/ - /*SUPPRESS 765*/ - extern double *getarg(); - static double *_p; static Datum *_ppvar; - -#define t nrn_threads->_t -#define dt nrn_threads->_dt -#define gbar _p[0] -#define gbar_columnindex 0 -#define gk _p[1] -#define gk_columnindex 1 -#define ninf _p[2] -#define ninf_columnindex 2 -#define ntau _p[3] -#define ntau_columnindex 3 -#define n _p[4] -#define n_columnindex 4 -#define a _p[5] -#define a_columnindex 5 -#define b _p[6] -#define b_columnindex 6 -#define ik _p[7] -#define ik_columnindex 7 -#define ek _p[8] -#define ek_columnindex 8 -#define Dn _p[9] -#define Dn_columnindex 9 -#define _g _p[10] -#define _g_columnindex 10 -#define _ion_ek *_ppvar[0]._pval -#define _ion_ik *_ppvar[1]._pval -#define _ion_dikdv *_ppvar[2]._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; - /* external NEURON variables */ - extern double celsius; - /* declaration of user functions */ - static void _hoc_rates(void); - static void _hoc_trates(void); - 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; - -#define NMODL_TEXT 1 -#if NMODL_TEXT -static const char* nmodl_file_text; -static const char* nmodl_filename; -extern void hoc_reg_nmodl_text(int, const char*); -extern void hoc_reg_nmodl_filename(int, const char*); -#endif - - extern void _nrn_setdata_reg(int, void(*)(Prop*)); - static void _setdata(Prop* _prop) { - _p = _prop->param; _ppvar = _prop->dparam; - } - static void _hoc_setdata() { - Prop *_prop, *hoc_getdata_range(int); - _prop = hoc_getdata_range(_mechtype); - _setdata(_prop); - hoc_retpushx(1.); -} - /* connect user functions to hoc names */ - static VoidFunc hoc_intfunc[] = { - "setdata_km", _hoc_setdata, - "rates_km", _hoc_rates, - "trates_km", _hoc_trates, - 0, 0 -}; - /* declare global and static user variables */ -#define Rb Rb_km - double Rb = 0.001; -#define Ra Ra_km - double Ra = 0.001; -#define qa qa_km - double qa = 9; -#define q10 q10_km - double q10 = 2.3; -#define tha tha_km - double tha = -30; -#define tshift tshift_km - double tshift = 30.7; -#define tadj tadj_km - double tadj = 0; -#define temp temp_km - double temp = 23; -#define usetable usetable_km - double usetable = 1; -#define vmax vmax_km - double vmax = 100; -#define vmin vmin_km - double vmin = -120; - /* some parameters have upper and lower limits */ - static HocParmLimits _hoc_parm_limits[] = { - "usetable_km", 0, 1, - 0,0,0 -}; - static HocParmUnits _hoc_parm_units[] = { - "tha_km", "mV", - "qa_km", "mV", - "Ra_km", "/ms", - "Rb_km", "/ms", - "temp_km", "degC", - "vmin_km", "mV", - "vmax_km", "mV", - "gbar_km", "pS/um2", - "gk_km", "pS/um2", - "ntau_km", "ms", - 0,0 -}; - static double delta_t = 1; - static double n0 = 0; - static double v = 0; - /* connect global user variables to hoc */ - static DoubScal hoc_scdoub[] = { - "tha_km", &tha_km, - "qa_km", &qa_km, - "Ra_km", &Ra_km, - "Rb_km", &Rb_km, - "temp_km", &temp_km, - "q10_km", &q10_km, - "tshift_km", &tshift_km, - "vmin_km", &vmin_km, - "vmax_km", &vmax_km, - "tadj_km", &tadj_km, - "usetable_km", &usetable_km, - 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 int _ode_count(int); -static void _ode_map(int, double**, double**, double*, Datum*, double*, int); -static void _ode_spec(NrnThread*, _Memb_list*, int); -static void _ode_matsol(NrnThread*, _Memb_list*, int); - -#define _cvode_ieq _ppvar[3]._i - static void _ode_matsol_instance1(_threadargsproto_); - /* connect range variables in _p that hoc is supposed to know about */ - static const char *_mechanism[] = { - "7.7.0", -"km", - "gbar_km", - 0, - "gk_km", - "ninf_km", - "ntau_km", - 0, - "n_km", - 0, - 0}; - static Symbol* _k_sym; - -extern Prop* need_memb(Symbol*); - -static void nrn_alloc(Prop* _prop) { - Prop *prop_ion; - double *_p; Datum *_ppvar; - _p = nrn_prop_data_alloc(_mechtype, 11, _prop); - /*initialize range parameters*/ - gbar = 10; - _prop->param = _p; - _prop->param_size = 11; - _ppvar = nrn_prop_datum_alloc(_mechtype, 4, _prop); - _prop->dparam = _ppvar; - /*connect ionic variables to this model*/ - prop_ion = need_memb(_k_sym); - nrn_promote(prop_ion, 0, 1); - _ppvar[0]._pval = &prop_ion->param[0]; /* ek */ - _ppvar[1]._pval = &prop_ion->param[3]; /* ik */ - _ppvar[2]._pval = &prop_ion->param[4]; /* _ion_dikdv */ - -} - static void _initlists(); - /* some states have an absolute tolerance */ - static Symbol** _atollist; - static HocStateTolerance _hoc_state_tol[] = { - 0,0 -}; - static void _update_ion_pointer(Datum*); - extern Symbol* hoc_lookup(const char*); -extern void _nrn_thread_reg(int, int, void(*)(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 _km_reg() { - int _vectorized = 0; - _initlists(); - ion_reg("k", -10000.); - _k_sym = hoc_lookup("k_ion"); - register_mech(_mechanism, nrn_alloc,nrn_cur, nrn_jacob, nrn_state, nrn_init, hoc_nrnpointerindex, 0); - _mechtype = nrn_get_mechtype(_mechanism[1]); - _nrn_setdata_reg(_mechtype, _setdata); - _nrn_thread_reg(_mechtype, 2, _update_ion_pointer); - #if NMODL_TEXT - hoc_reg_nmodl_text(_mechtype, nmodl_file_text); - hoc_reg_nmodl_filename(_mechtype, nmodl_filename); -#endif - hoc_register_prop_size(_mechtype, 11, 4); - hoc_register_dparam_semantics(_mechtype, 0, "k_ion"); - hoc_register_dparam_semantics(_mechtype, 1, "k_ion"); - hoc_register_dparam_semantics(_mechtype, 2, "k_ion"); - hoc_register_dparam_semantics(_mechtype, 3, "cvodeieq"); - hoc_register_cvode(_mechtype, _ode_count, _ode_map, _ode_spec, _ode_matsol); - hoc_register_tolerance(_mechtype, _hoc_state_tol, &_atollist); - hoc_register_var(hoc_scdoub, hoc_vdoub, hoc_intfunc); - ivoc_help("help ?1 km /Users/katharinaduecker/Documents/Projects Brown/hnn-core/hnn_core/mod/km.mod\n"); - hoc_register_limits(_mechtype, _hoc_parm_limits); - hoc_register_units(_mechtype, _hoc_parm_units); - } - static double _znexp ; - static double *_t_ninf; - static double *_t_ntau; -static int _reset; -static char *modelname = ""; - -static int error; -static int _ninits = 0; -static int _match_recurse=1; -static void _modl_cleanup(){ _match_recurse=1;} -static int _f_trates(double); -static int rates(double); -static int trates(double); - -static int _ode_spec1(_threadargsproto_); -/*static int _ode_matsol1(_threadargsproto_);*/ - static void _n_trates(double); - static int _slist1[1], _dlist1[1]; - static int states(_threadargsproto_); - -/*CVODE*/ - static int _ode_spec1 () {_reset=0; - { - trates ( _threadargscomma_ v ) ; - Dn = ( ninf - n ) / ntau ; - } - return _reset; -} - static int _ode_matsol1 () { - trates ( _threadargscomma_ v ) ; - Dn = Dn / (1. - dt*( ( ( ( - 1.0 ) ) ) / ntau )) ; - return 0; -} - /*END CVODE*/ - static int states () {_reset=0; - { - trates ( _threadargscomma_ v ) ; - n = n + (1. - exp(dt*(( ( ( - 1.0 ) ) ) / ntau)))*(- ( ( ( ninf ) ) / ntau ) / ( ( ( ( - 1.0 ) ) ) / ntau ) - n) ; - } - return 0; -} - static double _mfac_trates, _tmin_trates; - static void _check_trates(); - static void _check_trates() { - static int _maktable=1; int _i, _j, _ix = 0; - double _xi, _tmax; - static double _sav_celsius; - static double _sav_temp; - static double _sav_Ra; - static double _sav_Rb; - static double _sav_tha; - static double _sav_qa; - if (!usetable) {return;} - if (_sav_celsius != celsius) { _maktable = 1;} - if (_sav_temp != temp) { _maktable = 1;} - if (_sav_Ra != Ra) { _maktable = 1;} - if (_sav_Rb != Rb) { _maktable = 1;} - if (_sav_tha != tha) { _maktable = 1;} - if (_sav_qa != qa) { _maktable = 1;} - if (_maktable) { double _x, _dx; _maktable=0; - _tmin_trates = vmin ; - _tmax = vmax ; - _dx = (_tmax - _tmin_trates)/199.; _mfac_trates = 1./_dx; - for (_i=0, _x=_tmin_trates; _i < 200; _x += _dx, _i++) { - _f_trates(_x); - _t_ninf[_i] = ninf; - _t_ntau[_i] = ntau; - } - _sav_celsius = celsius; - _sav_temp = temp; - _sav_Ra = Ra; - _sav_Rb = Rb; - _sav_tha = tha; - _sav_qa = qa; - } - } - - static int trates(double _lv){ _check_trates(); - _n_trates(_lv); - return 0; - } - - static void _n_trates(double _lv){ int _i, _j; - double _xi, _theta; - if (!usetable) { - _f_trates(_lv); return; -} - _xi = _mfac_trates * (_lv - _tmin_trates); - if (isnan(_xi)) { - ninf = _xi; - ntau = _xi; - return; - } - if (_xi <= 0.) { - ninf = _t_ninf[0]; - ntau = _t_ntau[0]; - return; } - if (_xi >= 199.) { - ninf = _t_ninf[199]; - ntau = _t_ntau[199]; - return; } - _i = (int) _xi; - _theta = _xi - (double)_i; - ninf = _t_ninf[_i] + _theta*(_t_ninf[_i+1] - _t_ninf[_i]); - ntau = _t_ntau[_i] + _theta*(_t_ntau[_i+1] - _t_ntau[_i]); - } - - -static int _f_trates ( double _lv ) { - rates ( _threadargscomma_ _lv ) ; - return 0; } - -static void _hoc_trates(void) { - double _r; - _r = 1.; - trates ( *getarg(1) ); - hoc_retpushx(_r); -} - -static int rates ( double _lv ) { - a = Ra * ( _lv - tha ) / ( 1.0 - exp ( - ( _lv - tha ) / qa ) ) ; - b = - Rb * ( _lv - tha ) / ( 1.0 - exp ( ( _lv - tha ) / qa ) ) ; - tadj = pow( q10 , ( ( celsius - temp - tshift ) / 10.0 ) ) ; - ntau = 1.0 / tadj / ( a + b ) ; - ninf = a / ( a + b ) ; - return 0; } - -static void _hoc_rates(void) { - double _r; - _r = 1.; - rates ( *getarg(1) ); - hoc_retpushx(_r); -} - -static int _ode_count(int _type){ return 1;} - -static void _ode_spec(NrnThread* _nt, _Memb_list* _ml, int _type) { - Datum* _thread; - Node* _nd; double _v; int _iml, _cntml; - _cntml = _ml->_nodecount; - _thread = _ml->_thread; - for (_iml = 0; _iml < _cntml; ++_iml) { - _p = _ml->_data[_iml]; _ppvar = _ml->_pdata[_iml]; - _nd = _ml->_nodelist[_iml]; - v = NODEV(_nd); - ek = _ion_ek; - _ode_spec1 (); - }} - -static void _ode_map(int _ieq, double** _pv, double** _pvdot, double* _pp, Datum* _ppd, double* _atol, int _type) { - int _i; _p = _pp; _ppvar = _ppd; - _cvode_ieq = _ieq; - for (_i=0; _i < 1; ++_i) { - _pv[_i] = _pp + _slist1[_i]; _pvdot[_i] = _pp + _dlist1[_i]; - _cvode_abstol(_atollist, _atol, _i); - } - } - -static void _ode_matsol_instance1(_threadargsproto_) { - _ode_matsol1 (); - } - -static void _ode_matsol(NrnThread* _nt, _Memb_list* _ml, int _type) { - Datum* _thread; - Node* _nd; double _v; int _iml, _cntml; - _cntml = _ml->_nodecount; - _thread = _ml->_thread; - for (_iml = 0; _iml < _cntml; ++_iml) { - _p = _ml->_data[_iml]; _ppvar = _ml->_pdata[_iml]; - _nd = _ml->_nodelist[_iml]; - v = NODEV(_nd); - ek = _ion_ek; - _ode_matsol_instance1(_threadargs_); - }} - extern void nrn_update_ion_pointer(Symbol*, Datum*, int, int); - static void _update_ion_pointer(Datum* _ppvar) { - nrn_update_ion_pointer(_k_sym, _ppvar, 0, 0); - nrn_update_ion_pointer(_k_sym, _ppvar, 1, 3); - nrn_update_ion_pointer(_k_sym, _ppvar, 2, 4); - } - -static void initmodel() { - int _i; double _save;_ninits++; - _save = t; - t = 0.0; -{ - n = n0; - { - trates ( _threadargscomma_ v ) ; - n = ninf ; - } - _sav_indep = t; t = _save; - -} -} - -static void nrn_init(NrnThread* _nt, _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]; -#if CACHEVEC - if (use_cachevec) { - _v = VEC_V(_ni[_iml]); - }else -#endif - { - _nd = _ml->_nodelist[_iml]; - _v = NODEV(_nd); - } - v = _v; - ek = _ion_ek; - initmodel(); - }} - -static double _nrn_current(double _v){double _current=0.;v=_v;{ { - gk = tadj * gbar * n ; - ik = ( 1e-4 ) * gk * ( v - ek ) ; - } - _current += ik; - -} return _current; -} - -static void nrn_cur(NrnThread* _nt, _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); - } - ek = _ion_ek; - _g = _nrn_current(_v + .001); - { double _dik; - _dik = ik; - _rhs = _nrn_current(_v); - _ion_dikdv += (_dik - ik)/.001 ; - } - _g = (_g - _rhs)/.001; - _ion_ik += ik ; -#if CACHEVEC - if (use_cachevec) { - VEC_RHS(_ni[_iml]) -= _rhs; - }else -#endif - { - NODERHS(_nd) -= _rhs; - } - -}} - -static void nrn_jacob(NrnThread* _nt, _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 void nrn_state(NrnThread* _nt, _Memb_list* _ml, int _type){ -Node *_nd; double _v = 0.0; 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); - } - v=_v; -{ - ek = _ion_ek; - { error = states(); - if(error){fprintf(stderr,"at line 90 in file km.mod:\n SOLVE states METHOD cnexp\n"); nrn_complain(_p); abort_run(error);} - } }} - -} - -static void terminal(){} - -static void _initlists() { - int _i; static int _first = 1; - if (!_first) return; - _slist1[0] = n_columnindex; _dlist1[0] = Dn_columnindex; - _t_ninf = makevector(200*sizeof(double)); - _t_ntau = makevector(200*sizeof(double)); -_first = 0; -} - -#if NMODL_TEXT -static const char* nmodl_filename = "/Users/katharinaduecker/Documents/Projects Brown/hnn-core/hnn_core/mod/km.mod"; -static const char* nmodl_file_text = - "COMMENT\n" - " 26 Ago 2002 Modification of original channel to allow variable time step\n" - " and to correct an initialization error.\n" - "\n" - " Done by Michael Hines (michael.hines@yale.edu) and Ruggero Scorcioni (rscorcio@gmu.edu)\n" - " at EU Advance Course in Computational Neuroscience. Obidos, Portugal\n" - "\n" - " km.mod\n" - "\n" - " Potassium channel, Hodgkin-Huxley style kinetics\n" - " Based on I-M (muscarinic K channel)\n" - " Slow, noninactivating\n" - "\n" - " Original Author: Zach Mainen, Salk Institute, 1995, zach@salk.edu\n" - "ENDCOMMENT\n" - "\n" - "INDEPENDENT {t FROM 0 TO 1 WITH 1 (ms)}\n" - "\n" - "NEURON {\n" - " SUFFIX km\n" - " USEION k READ ek WRITE ik\n" - " RANGE n, gk, gbar\n" - " RANGE ninf, ntau\n" - " GLOBAL Ra, Rb\n" - " GLOBAL q10, temp, tadj, vmin, vmax, tshift\n" - "}\n" - "\n" - "UNITS {\n" - " (mA) = (milliamp)\n" - " (mV) = (millivolt)\n" - " (pS) = (picosiemens)\n" - " (um) = (micron)\n" - "}\n" - "\n" - "PARAMETER {\n" - " : 0.03 mho/cm2\n" - " gbar = 10 (pS/um2)\n" - " v (mV)\n" - "\n" - " : v 1/2 for inf\n" - " tha = -30 (mV)\n" - "\n" - " : inf slope\n" - " qa = 9 (mV)\n" - "\n" - " : max act rate (slow)\n" - " Ra = 0.001 (/ms)\n" - "\n" - " : max deact rate (slow)\n" - " Rb = 0.001 (/ms)\n" - "\n" - " dt (ms)\n" - " celsius (degC)\n" - "\n" - " : original temp\n" - " temp = 23 (degC)\n" - "\n" - " : temp sensitivity\n" - " q10 = 2.3\n" - "\n" - " tshift = 30.7\n" - "\n" - " vmin = -120 (mV)\n" - " vmax = 100 (mV)\n" - "}\n" - "\n" - "\n" - "ASSIGNED {\n" - " a (/ms)\n" - " b (/ms)\n" - " ik (mA/cm2)\n" - " gk (pS/um2)\n" - " ek (mV)\n" - " ninf\n" - " ntau (ms)\n" - " tadj\n" - "}\n" - "\n" - "\n" - "STATE {\n" - " n\n" - "}\n" - "\n" - "INITIAL {\n" - " trates(v)\n" - " n = ninf\n" - "}\n" - "\n" - "BREAKPOINT {\n" - " SOLVE states METHOD cnexp\n" - " gk = tadj * gbar * n\n" - " ik = (1e-4) * gk * (v - ek)\n" - "}\n" - "\n" - "LOCAL nexp\n" - "\n" - ": Computes state variable n at the current v and dt.\n" - "DERIVATIVE states {\n" - " trates(v)\n" - " n' = (ninf - n) / ntau\n" - "}\n" - "\n" - ": Computes rate and other constants at current v.\n" - ": Call once from HOC to initialize inf at resting v.\n" - "PROCEDURE trates(v) {\n" - " TABLE ninf, ntau\n" - " DEPEND celsius, temp, Ra, Rb, tha, qa\n" - "\n" - " FROM vmin TO vmax WITH 199\n" - "\n" - " : not consistently executed from here if usetable_hh == 1\n" - " rates(v)\n" - " : tinc = -dt * tadj\n" - " : nexp = 1 - exp(tinc/ntau)\n" - "}\n" - "\n" - ": Computes rate and other constants at current v.\n" - ": Call once from HOC to initialize inf at resting v.\n" - "PROCEDURE rates(v) {\n" - " a = Ra * (v - tha) / (1 - exp(-(v - tha) / qa))\n" - " b = -Rb * (v - tha) / (1 - exp((v - tha) / qa))\n" - "\n" - " tadj = q10^((celsius - temp - tshift) / 10)\n" - " ntau = 1/tadj/(a+b)\n" - " ninf = a/(a+b)\n" - "}\n" - ; -#endif diff --git a/hnn_core/mod/arm64/km.o b/hnn_core/mod/arm64/km.o deleted file mode 100644 index 8822182a349820c9f7265eb25be93f698b7ad431..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 15824 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 Szbo$?G5&AYteVQc0{0&h_u(x7 diff --git a/hnn_core/mod/arm64/makemod2c_inc b/hnn_core/mod/arm64/makemod2c_inc deleted file mode 100644 index c829854aa..000000000 --- a/hnn_core/mod/arm64/makemod2c_inc +++ /dev/null @@ -1,80 +0,0 @@ -./ar.c: ../ar.mod - @printf " -> $(C_GREEN)NMODL$(C_RESET) $<\\n" - (cd ".."; MODLUNIT=$(NRNUNITS) $(NOCMODL) "ar.mod" -o "/Users/katharinaduecker/Documents/projects_brown/hnn-core/hnn_core/mod/arm64") - -./ar.o: ./ar.c - @printf " -> $(C_GREEN)Compiling$(C_RESET) $<\\n" - $(COMPILE) -I".." $(INCLUDES) -fPIC -c $< -o $@ - -./ca.c: ../ca.mod - @printf " -> $(C_GREEN)NMODL$(C_RESET) $<\\n" - (cd ".."; MODLUNIT=$(NRNUNITS) $(NOCMODL) "ca.mod" -o "/Users/katharinaduecker/Documents/projects_brown/hnn-core/hnn_core/mod/arm64") - -./ca.o: ./ca.c - @printf " -> $(C_GREEN)Compiling$(C_RESET) $<\\n" - $(COMPILE) -I".." $(INCLUDES) -fPIC -c $< -o $@ - -./cad.c: ../cad.mod - @printf " -> $(C_GREEN)NMODL$(C_RESET) $<\\n" - (cd ".."; MODLUNIT=$(NRNUNITS) $(NOCMODL) "cad.mod" -o "/Users/katharinaduecker/Documents/projects_brown/hnn-core/hnn_core/mod/arm64") - -./cad.o: ./cad.c - @printf " -> $(C_GREEN)Compiling$(C_RESET) $<\\n" - $(COMPILE) -I".." $(INCLUDES) -fPIC -c $< -o $@ - -./cat.c: ../cat.mod - @printf " -> $(C_GREEN)NMODL$(C_RESET) $<\\n" - (cd ".."; MODLUNIT=$(NRNUNITS) $(NOCMODL) "cat.mod" -o "/Users/katharinaduecker/Documents/projects_brown/hnn-core/hnn_core/mod/arm64") - -./cat.o: ./cat.c - @printf " -> $(C_GREEN)Compiling$(C_RESET) $<\\n" - $(COMPILE) -I".." $(INCLUDES) -fPIC -c $< -o $@ - -./dipole.c: ../dipole.mod - @printf " -> $(C_GREEN)NMODL$(C_RESET) $<\\n" - (cd ".."; MODLUNIT=$(NRNUNITS) $(NOCMODL) "dipole.mod" -o "/Users/katharinaduecker/Documents/projects_brown/hnn-core/hnn_core/mod/arm64") - -./dipole.o: ./dipole.c - @printf " -> $(C_GREEN)Compiling$(C_RESET) $<\\n" - $(COMPILE) -I".." $(INCLUDES) -fPIC -c $< -o $@ - -./dipole_pp.c: ../dipole_pp.mod - @printf " -> $(C_GREEN)NMODL$(C_RESET) $<\\n" - (cd ".."; MODLUNIT=$(NRNUNITS) $(NOCMODL) "dipole_pp.mod" -o "/Users/katharinaduecker/Documents/projects_brown/hnn-core/hnn_core/mod/arm64") - -./dipole_pp.o: ./dipole_pp.c - @printf " -> $(C_GREEN)Compiling$(C_RESET) $<\\n" - $(COMPILE) -I".." $(INCLUDES) -fPIC -c $< -o $@ - -./hh2.c: ../hh2.mod - @printf " -> $(C_GREEN)NMODL$(C_RESET) $<\\n" - (cd ".."; MODLUNIT=$(NRNUNITS) $(NOCMODL) "hh2.mod" -o "/Users/katharinaduecker/Documents/projects_brown/hnn-core/hnn_core/mod/arm64") - -./hh2.o: ./hh2.c - @printf " -> $(C_GREEN)Compiling$(C_RESET) $<\\n" - $(COMPILE) -I".." $(INCLUDES) -fPIC -c $< -o $@ - -./kca.c: ../kca.mod - @printf " -> $(C_GREEN)NMODL$(C_RESET) $<\\n" - (cd ".."; MODLUNIT=$(NRNUNITS) $(NOCMODL) "kca.mod" -o "/Users/katharinaduecker/Documents/projects_brown/hnn-core/hnn_core/mod/arm64") - -./kca.o: ./kca.c - @printf " -> $(C_GREEN)Compiling$(C_RESET) $<\\n" - $(COMPILE) -I".." $(INCLUDES) -fPIC -c $< -o $@ - -./km.c: ../km.mod - @printf " -> $(C_GREEN)NMODL$(C_RESET) $<\\n" - (cd ".."; MODLUNIT=$(NRNUNITS) $(NOCMODL) "km.mod" -o "/Users/katharinaduecker/Documents/projects_brown/hnn-core/hnn_core/mod/arm64") - -./km.o: ./km.c - @printf " -> $(C_GREEN)Compiling$(C_RESET) $<\\n" - $(COMPILE) -I".." $(INCLUDES) -fPIC -c $< -o $@ - -./vecevent.c: ../vecevent.mod - @printf " -> $(C_GREEN)NMODL$(C_RESET) $<\\n" - (cd ".."; MODLUNIT=$(NRNUNITS) $(NOCMODL) "vecevent.mod" -o "/Users/katharinaduecker/Documents/projects_brown/hnn-core/hnn_core/mod/arm64") - -./vecevent.o: ./vecevent.c - @printf " -> $(C_GREEN)Compiling$(C_RESET) $<\\n" - $(COMPILE) -I".." $(INCLUDES) -fPIC -c $< -o $@ - diff --git a/hnn_core/mod/arm64/mod_func.cpp b/hnn_core/mod/arm64/mod_func.cpp deleted file mode 100644 index 20de9a07b..000000000 --- a/hnn_core/mod/arm64/mod_func.cpp +++ /dev/null @@ -1,49 +0,0 @@ -#include -#include "hocdec.h" -extern int nrnmpi_myid; -extern int nrn_nobanner_; -#if defined(__cplusplus) -extern "C" { -#endif - -extern void _ar_reg(void); -extern void _ca_reg(void); -extern void _cad_reg(void); -extern void _cat_reg(void); -extern void _dipole_reg(void); -extern void _dipole_pp_reg(void); -extern void _hh2_reg(void); -extern void _kca_reg(void); -extern void _km_reg(void); -extern void _vecevent_reg(void); - -void modl_reg() { - if (!nrn_nobanner_) if (nrnmpi_myid < 1) { - fprintf(stderr, "Additional mechanisms from files\n"); - fprintf(stderr, " \"ar.mod\""); - fprintf(stderr, " \"ca.mod\""); - fprintf(stderr, " \"cad.mod\""); - fprintf(stderr, " \"cat.mod\""); - fprintf(stderr, " \"dipole.mod\""); - fprintf(stderr, " \"dipole_pp.mod\""); - fprintf(stderr, " \"hh2.mod\""); - fprintf(stderr, " \"kca.mod\""); - fprintf(stderr, " \"km.mod\""); - fprintf(stderr, " \"vecevent.mod\""); - fprintf(stderr, "\n"); - } - _ar_reg(); - _ca_reg(); - _cad_reg(); - _cat_reg(); - _dipole_reg(); - _dipole_pp_reg(); - _hh2_reg(); - _kca_reg(); - _km_reg(); - _vecevent_reg(); -} - -#if defined(__cplusplus) -} -#endif diff --git a/hnn_core/mod/arm64/mod_func.o b/hnn_core/mod/arm64/mod_func.o deleted file mode 100644 index 56a64dd56ea3bd1cbffe0a2bed556e29250c9e0d..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 2320 zcmb7_PiPfK9LHxjPhX;ssBLOft9A_@S}-9^wWg4T7pl<1Qbpb&2gA7TZp@P1ecOHO ze-A-Cc<4dFL!naimVgHlq48iT#e)Sw@z6`X2my2PB0*3R>G${MH%Z>M59;uK^Z9*$ zGxK}1voo`g-@bfT5yB8CRIP(OB*%iGd;%M8wl?Lzs$o-w7PybrWrWE(c!ZRBa3*H~ zNLf2LR$JBDyTExUAEmZRLJU!3NlX)TkmdLpcO+BzNPTSKIUOdxl+J;bMmW7Zz|uj?i&Eakg7K7FQqr7zVXAE-9;UlFasc&a*c`?k25AuW z>s&9yPH+K>_BjS&M6(?bG?I*RZDIr7t1KS+ZFc#*F}wV&xY{Yil}@Aj26nFt{ul6J z_dYYk4^~(8T%}9YK194>R^NCq{LvNI)m^3OBYk4}2>fd;apV2sqiy=Pi{EV1-!T9C zf7|707vI$;|MN9*7wb@krf2^@wtRkccJa_3Gw9nh>ic0H))P0f;=r49ldusttck21 zTN7avG&TsU&&>wny59%Sb5}io)y=i*hiN?uT9r&w9hjUP((cr1s;O89PX%6ZDo8jT zrl$&>7yPiRTgw>)aR>BAAogkhB=|AtgImF4U=Mf{{0JNav3L4w;0NGga0}>w*!TV4 zf!n|l@KbOQ#9nvyDB8O@-V1I(yhqWlaGWNIJ?kuCnxMT1Ql146``VdTw4ZVO35X-* zJW{kDaC{ELk#p`U+P64<1H{pEt}EK~vMK*%5R2nnQnW8{JOyzNIFX|5b9@ZM*>-A* zw!`r%h(~Zn6z#nr&U7@WIKCa+0Zn%TIF2rP%jzNsOOCZqijAho}j*K%%Q$++(3QFxQseV%Vuq?Y>rer%|V&~3axWDOc!#y z@c{ZB-AL`wzi^)=Zl7WOlJyX<>-oM$tQ#*z-`n3qZ{o4kAA5z?ai#1j=(7bK6m(xf?<;6}|7-JKEa-YcA1r8` zp_cJC3;M@`o+)VBw`>1jL~;NhOnm2LBlm+WOX2FfKxV-S`U1K+dv3;#x@>U0u%3#Q zgS#qf?V?lox~J!|x8mSxQlW{{S(pbxCRq}vp^VRlzK|2?$=qwkWKuuwCP|Pt m+8Nf)e(ij%oqgKbtDUbzl*j3imT(}y)DjNl;EJRZD8xVAcUNry diff --git a/hnn_core/mod/arm64/special b/hnn_core/mod/arm64/special deleted file mode 100755 index 8511d2b4f..000000000 --- a/hnn_core/mod/arm64/special +++ /dev/null @@ -1,103 +0,0 @@ -#!/Users/katharinaduecker/miniconda3/envs/hnn_env/bin/python -""" -A generic wrapper to access nrn binaries from a python installation -Please create a softlink with the binary name to be called. -""" -import os -import shutil -import subprocess -import sys -from pkg_resources import working_set -from distutils.ccompiler import new_compiler -from sysconfig import get_config_vars, get_config_var - - -# This replaces the now depricated distutils.sysutils.customize_compiler -def _customize_compiler(compiler): - """Do platform-sepcific customizations of compilers on unix platforms.""" - if compiler.compiler_type == "unix": - (cc, cxx, cflags) = get_config_vars("CC", "CXX", "CFLAGS") - if "CC" in os.environ: - cc = os.environ["CC"] - if "CXX" in os.environ: - cxx = os.environ["CXX"] - if "CFLAGS" in os.environ: - cflags = cflags + " " + os.environ["CFLAGS"] - cc_cmd = cc + " " + cflags - # We update executables in compiler to take advantage of distutils arg splitting - compiler.set_executables(compiler=cc_cmd, compiler_cxx=cxx) - - -def _set_default_compiler(): - """Set (dont overwrite) CC/CXX so that apps dont use the build-time ones""" - ccompiler = new_compiler() - _customize_compiler(ccompiler) - # xcrun wrapper must bring all args - if ccompiler.compiler[0] == "xcrun": - ccompiler.compiler[0] = get_config_var("CC") - ccompiler.compiler_cxx[0] = get_config_var("CXX") - os.environ.setdefault("CC", ccompiler.compiler[0]) - os.environ.setdefault("CXX", ccompiler.compiler_cxx[0]) - - -def _config_exe(exe_name): - """Sets the environment to run the real executable (returned)""" - - package_name = "neuron" - - # determine package to find the install location - if "neuron-gpu-nightly" in working_set.by_key: - print("INFO : Using neuron-gpu-nightly Package (Alpha Developer Version)") - package_name = "neuron-gpu-nightly" - elif "neuron-gpu" in working_set.by_key: - print("INFO : Using neuron-gpu Package (Alpha Version)") - package_name = "neuron-gpu" - elif "neuron-nightly" in working_set.by_key: - print("INFO : Using neuron-nightly Package (Developer Version)") - package_name = "neuron-nightly" - elif "neuron" in working_set.by_key: - package_name = "neuron" - else: - raise RuntimeError("NEURON package not found! Verify PYTHONPATH") - - NRN_PREFIX = os.path.join( - working_set.by_key[package_name].location, "neuron", ".data" - ) - os.environ["NEURONHOME"] = os.path.join(NRN_PREFIX, "share/nrn") - os.environ["NRNHOME"] = NRN_PREFIX - os.environ["CORENRNHOME"] = NRN_PREFIX - os.environ["NRN_PYTHONEXE"] = sys.executable - os.environ["CORENRN_PYTHONEXE"] = sys.executable - os.environ["CORENRN_PERLEXE"] = shutil.which("perl") - os.environ["NRNBIN"] = os.path.dirname(__file__) - - _set_default_compiler() - return os.path.join(NRN_PREFIX, "bin", exe_name) - - -def _wrap_executable(output_name): - """Create a wrapper for an executable in same dir. Requires renaming the original file. - Executables are typically found under arch_name - """ - release_dir = os.path.join(os.environ["NEURONHOME"], "demo/release") - arch_name = next(os.walk(release_dir))[1][0] # first dir - file_path = os.path.join(arch_name, output_name) - shutil.move(file_path, file_path + ".nrn") - shutil.copy(__file__, file_path) - - -if __name__ == "__main__": - exe = _config_exe(os.path.basename(sys.argv[0])) - - if exe.endswith("nrnivmodl"): - # To create a wrapper for special (so it also gets ENV vars) we intercept nrnivmodl - subprocess.check_call([exe, *sys.argv[1:]]) - _wrap_executable("special") - sys.exit(0) - - if exe.endswith("special"): - exe = os.path.join( - sys.argv[0] + ".nrn" - ) # original special is renamed special.nrn - - os.execv(exe, sys.argv) diff --git a/hnn_core/mod/arm64/special.nrn b/hnn_core/mod/arm64/special.nrn deleted file mode 100755 index 8511d2b4f..000000000 --- a/hnn_core/mod/arm64/special.nrn +++ /dev/null @@ -1,103 +0,0 @@ -#!/Users/katharinaduecker/miniconda3/envs/hnn_env/bin/python -""" -A generic wrapper to access nrn binaries from a python installation -Please create a softlink with the binary name to be called. -""" -import os -import shutil -import subprocess -import sys -from pkg_resources import working_set -from distutils.ccompiler import new_compiler -from sysconfig import get_config_vars, get_config_var - - -# This replaces the now depricated distutils.sysutils.customize_compiler -def _customize_compiler(compiler): - """Do platform-sepcific customizations of compilers on unix platforms.""" - if compiler.compiler_type == "unix": - (cc, cxx, cflags) = get_config_vars("CC", "CXX", "CFLAGS") - if "CC" in os.environ: - cc = os.environ["CC"] - if "CXX" in os.environ: - cxx = os.environ["CXX"] - if "CFLAGS" in os.environ: - cflags = cflags + " " + os.environ["CFLAGS"] - cc_cmd = cc + " " + cflags - # We update executables in compiler to take advantage of distutils arg splitting - compiler.set_executables(compiler=cc_cmd, compiler_cxx=cxx) - - -def _set_default_compiler(): - """Set (dont overwrite) CC/CXX so that apps dont use the build-time ones""" - ccompiler = new_compiler() - _customize_compiler(ccompiler) - # xcrun wrapper must bring all args - if ccompiler.compiler[0] == "xcrun": - ccompiler.compiler[0] = get_config_var("CC") - ccompiler.compiler_cxx[0] = get_config_var("CXX") - os.environ.setdefault("CC", ccompiler.compiler[0]) - os.environ.setdefault("CXX", ccompiler.compiler_cxx[0]) - - -def _config_exe(exe_name): - """Sets the environment to run the real executable (returned)""" - - package_name = "neuron" - - # determine package to find the install location - if "neuron-gpu-nightly" in working_set.by_key: - print("INFO : Using neuron-gpu-nightly Package (Alpha Developer Version)") - package_name = "neuron-gpu-nightly" - elif "neuron-gpu" in working_set.by_key: - print("INFO : Using neuron-gpu Package (Alpha Version)") - package_name = "neuron-gpu" - elif "neuron-nightly" in working_set.by_key: - print("INFO : Using neuron-nightly Package (Developer Version)") - package_name = "neuron-nightly" - elif "neuron" in working_set.by_key: - package_name = "neuron" - else: - raise RuntimeError("NEURON package not found! Verify PYTHONPATH") - - NRN_PREFIX = os.path.join( - working_set.by_key[package_name].location, "neuron", ".data" - ) - os.environ["NEURONHOME"] = os.path.join(NRN_PREFIX, "share/nrn") - os.environ["NRNHOME"] = NRN_PREFIX - os.environ["CORENRNHOME"] = NRN_PREFIX - os.environ["NRN_PYTHONEXE"] = sys.executable - os.environ["CORENRN_PYTHONEXE"] = sys.executable - os.environ["CORENRN_PERLEXE"] = shutil.which("perl") - os.environ["NRNBIN"] = os.path.dirname(__file__) - - _set_default_compiler() - return os.path.join(NRN_PREFIX, "bin", exe_name) - - -def _wrap_executable(output_name): - """Create a wrapper for an executable in same dir. Requires renaming the original file. - Executables are typically found under arch_name - """ - release_dir = os.path.join(os.environ["NEURONHOME"], "demo/release") - arch_name = next(os.walk(release_dir))[1][0] # first dir - file_path = os.path.join(arch_name, output_name) - shutil.move(file_path, file_path + ".nrn") - shutil.copy(__file__, file_path) - - -if __name__ == "__main__": - exe = _config_exe(os.path.basename(sys.argv[0])) - - if exe.endswith("nrnivmodl"): - # To create a wrapper for special (so it also gets ENV vars) we intercept nrnivmodl - subprocess.check_call([exe, *sys.argv[1:]]) - _wrap_executable("special") - sys.exit(0) - - if exe.endswith("special"): - exe = os.path.join( - sys.argv[0] + ".nrn" - ) # original special is renamed special.nrn - - os.execv(exe, sys.argv) diff --git a/hnn_core/mod/arm64/vecevent.c b/hnn_core/mod/arm64/vecevent.c deleted file mode 100644 index 205ff9d29..000000000 --- a/hnn_core/mod/arm64/vecevent.c +++ /dev/null @@ -1,421 +0,0 @@ -/* Created by Language version: 7.7.0 */ -/* NOT VECTORIZED */ -#define NRN_VECTORIZED 0 -#include -#include -#include -#include "mech_api.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 nrn_init _nrn_init__VecStim -#define _nrn_initial _nrn_initial__VecStim -#define nrn_cur _nrn_cur__VecStim -#define _nrn_current _nrn_current__VecStim -#define nrn_jacob _nrn_jacob__VecStim -#define nrn_state _nrn_state__VecStim -#define _net_receive _net_receive__VecStim -#define element element__VecStim -#define play play__VecStim - -#define _threadargscomma_ /**/ -#define _threadargsprotocomma_ /**/ -#define _threadargs_ /**/ -#define _threadargsproto_ /**/ - /*SUPPRESS 761*/ - /*SUPPRESS 762*/ - /*SUPPRESS 763*/ - /*SUPPRESS 765*/ - extern double *getarg(); - static double *_p; static Datum *_ppvar; - -#define t nrn_threads->_t -#define dt nrn_threads->_dt -#define index _p[0] -#define index_columnindex 0 -#define etime _p[1] -#define etime_columnindex 1 -#define space _p[2] -#define space_columnindex 2 -#define _tsav _p[3] -#define _tsav_columnindex 3 -#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; - /* external NEURON variables */ - /* declaration of user functions */ - static double _hoc_element(void*); - static double _hoc_play(void*); - 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; - -#define NMODL_TEXT 1 -#if NMODL_TEXT -static const char* nmodl_file_text; -static const char* nmodl_filename; -extern void hoc_reg_nmodl_text(int, const char*); -extern void hoc_reg_nmodl_filename(int, const char*); -#endif - - extern Prop* nrn_point_prop_; - static int _pointtype; - static void* _hoc_create_pnt(Object* _ho) { void* create_point_process(int, Object*); - return create_point_process(_pointtype, _ho); -} - static void _hoc_destroy_pnt(void*); - static double _hoc_loc_pnt(void* _vptr) {double loc_point_process(int, void*); - return loc_point_process(_pointtype, _vptr); -} - static double _hoc_has_loc(void* _vptr) {double has_loc_point(void*); - return has_loc_point(_vptr); -} - static double _hoc_get_loc_pnt(void* _vptr) { - double get_loc_point_process(void*); return (get_loc_point_process(_vptr)); -} - extern void _nrn_setdata_reg(int, void(*)(Prop*)); - static void _setdata(Prop* _prop) { - _p = _prop->param; _ppvar = _prop->dparam; - } - 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, - "element", _hoc_element, - "play", _hoc_play, - 0, 0 -}; - /* declare global and static user variables */ - /* some parameters have upper and lower limits */ - static HocParmLimits _hoc_parm_limits[] = { - 0,0,0 -}; - static HocParmUnits _hoc_parm_units[] = { - 0,0 -}; - static double v = 0; - /* 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 _hoc_destroy_pnt(void* _vptr) { - destroy_point_process(_vptr); -} - /* connect range variables in _p that hoc is supposed to know about */ - static const char *_mechanism[] = { - "7.7.0", -"VecStim", - 0, - 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, 4, _prop); - /*initialize range parameters*/ - } - _prop->param = _p; - _prop->param_size = 4; - if (!nrn_point_prop_) { - _ppvar = nrn_prop_datum_alloc(_mechtype, 3, _prop); - } - _prop->dparam = _ppvar; - /*connect ionic variables to this model*/ - -} - static void _initlists(); - -#define _tqitem &(_ppvar[2]._pvoid) - static void _net_receive(Point_process*, double*, double); - extern Symbol* hoc_lookup(const char*); -extern void _nrn_thread_reg(int, int, void(*)(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 _vecevent_reg() { - int _vectorized = 0; - _initlists(); - _pointtype = point_register_mech(_mechanism, - nrn_alloc,(void*)0, (void*)0, (void*)0, nrn_init, - hoc_nrnpointerindex, 0, - _hoc_create_pnt, _hoc_destroy_pnt, _member_func); - _mechtype = nrn_get_mechtype(_mechanism[1]); - _nrn_setdata_reg(_mechtype, _setdata); - #if NMODL_TEXT - hoc_reg_nmodl_text(_mechtype, nmodl_file_text); - hoc_reg_nmodl_filename(_mechtype, nmodl_filename); -#endif - hoc_register_prop_size(_mechtype, 4, 3); - hoc_register_dparam_semantics(_mechtype, 0, "area"); - hoc_register_dparam_semantics(_mechtype, 1, "pntproc"); - hoc_register_dparam_semantics(_mechtype, 2, "netsend"); - add_nrn_artcell(_mechtype, 2); - add_nrn_has_net_event(_mechtype); - pnt_receive[_mechtype] = _net_receive; - pnt_receive_size[_mechtype] = 1; - hoc_register_var(hoc_scdoub, hoc_vdoub, hoc_intfunc); - ivoc_help("help ?1 VecStim /Users/katharinaduecker/Documents/Projects Brown/hnn-core/hnn_core/mod/vecevent.mod\n"); - hoc_register_limits(_mechtype, _hoc_parm_limits); - hoc_register_units(_mechtype, _hoc_parm_units); - } -static int _reset; -static char *modelname = ""; - -static int error; -static int _ninits = 0; -static int _match_recurse=1; -static void _modl_cleanup(){ _match_recurse=1;} -static int element(); -static int play(); - -static void _net_receive (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 == 1.0 ) { - net_event ( _pnt, t ) ; - element ( _threadargs_ ) ; - if ( index > 0.0 ) { - artcell_net_send ( _tqitem, _args, _pnt, t + etime - t , 1.0 ) ; - } - } - } } - -/*VERBATIM*/ -extern double* vector_vec(); -extern int vector_capacity(); -extern void* vector_arg(); - -static int element ( ) { - -/*VERBATIM*/ - { void* vv; int i, size; double* px; - i = (int)index; - if (i >= 0) { - vv = *((void**)(&space)); - if (vv) { - size = vector_capacity(vv); - px = vector_vec(vv); - if (i < size) { - etime = px[i]; - index += 1.; - } else { - index = -1.; - } - } else { - index = -1.; - } - } - } - return 0; } - -static double _hoc_element(void* _vptr) { - double _r; - _hoc_setdata(_vptr); - _r = 1.; - element ( ); - return(_r); -} - -static int play ( ) { - -/*VERBATIM*/ - void** vv; - vv = (void**)(&space); - *vv = (void*)0; - if (ifarg(1)) { - *vv = vector_arg(1); - } - return 0; } - -static double _hoc_play(void* _vptr) { - double _r; - _hoc_setdata(_vptr); - _r = 1.; - play ( ); - return(_r); -} - -static void initmodel() { - int _i; double _save;_ninits++; -{ - { - index = 0.0 ; - element ( _threadargs_ ) ; - if ( index > 0.0 ) { - artcell_net_send ( _tqitem, (double*)0, _ppvar[1]._pvoid, t + etime - t , 1.0 ) ; - } - } - -} -} - -static void nrn_init(NrnThread* _nt, _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; - initmodel(); -}} - -static double _nrn_current(double _v){double _current=0.;v=_v;{ -} return _current; -} - -static void nrn_state(NrnThread* _nt, _Memb_list* _ml, int _type){ -Node *_nd; double _v = 0.0; 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]; - v=_v; -{ -}} - -} - -static void terminal(){} - -static void _initlists() { - int _i; static int _first = 1; - if (!_first) return; -_first = 0; -} - -#if NMODL_TEXT -static const char* nmodl_filename = "/Users/katharinaduecker/Documents/Projects Brown/hnn-core/hnn_core/mod/vecevent.mod"; -static const char* nmodl_file_text = - ": Vector stream of events\n" - "\n" - "NEURON {\n" - " ARTIFICIAL_CELL VecStim\n" - "}\n" - "\n" - "ASSIGNED {\n" - " index\n" - " etime (ms)\n" - " space\n" - "}\n" - "\n" - "INITIAL {\n" - " index = 0\n" - " element()\n" - " if (index > 0) {\n" - " net_send(etime - t, 1)\n" - " }\n" - "}\n" - "\n" - "NET_RECEIVE (w) {\n" - " if (flag == 1) {\n" - " net_event(t)\n" - " element()\n" - " if (index > 0) {\n" - " net_send(etime - t, 1)\n" - " }\n" - " }\n" - "}\n" - "\n" - "VERBATIM\n" - "extern double* vector_vec();\n" - "extern int vector_capacity();\n" - "extern void* vector_arg();\n" - "ENDVERBATIM\n" - "\n" - "PROCEDURE element() {\n" - "VERBATIM\n" - " { void* vv; int i, size; double* px;\n" - " i = (int)index;\n" - " if (i >= 0) {\n" - " vv = *((void**)(&space));\n" - " if (vv) {\n" - " size = vector_capacity(vv);\n" - " px = vector_vec(vv);\n" - " if (i < size) {\n" - " etime = px[i];\n" - " index += 1.;\n" - " } else {\n" - " index = -1.;\n" - " }\n" - " } else {\n" - " index = -1.;\n" - " }\n" - " }\n" - " }\n" - "ENDVERBATIM\n" - "}\n" - "\n" - "PROCEDURE play() {\n" - "VERBATIM\n" - " void** vv;\n" - " vv = (void**)(&space);\n" - " *vv = (void*)0;\n" - " if (ifarg(1)) {\n" - " *vv = vector_arg(1);\n" - " }\n" - "ENDVERBATIM\n" - "}\n" - ; -#endif diff --git a/hnn_core/mod/arm64/vecevent.o b/hnn_core/mod/arm64/vecevent.o deleted file mode 100644 index 78c3b08684bce7cdbdc1c40dc37ac4aea9031f25..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 7952 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 Date: Sun, 27 Oct 2024 14:32:38 -0400 Subject: [PATCH 05/28] flake8 --- hnn_core/cell.py | 3 ++- hnn_core/cells_default.py | 2 +- hnn_core/network.py | 11 ++++++----- 3 files changed, 9 insertions(+), 7 deletions(-) diff --git a/hnn_core/cell.py b/hnn_core/cell.py index c71be72f5..b803ca07f 100644 --- a/hnn_core/cell.py +++ b/hnn_core/cell.py @@ -728,7 +728,8 @@ def _insert_dipole(self, sec_name_apical): dpp.ztan = seg_lens_z[-1] self.dipole = h.Vector().record(self.dpl_ref) - def create_tonic_bias(self, amplitude, t0, tstop, sect_name='soma',loc=0.5): + def create_tonic_bias(self, amplitude, t0, tstop, sect_name='soma', + loc=0.5): """Create tonic bias at the soma. Parameters diff --git a/hnn_core/cells_default.py b/hnn_core/cells_default.py index 62177e9dd..a420e79c2 100644 --- a/hnn_core/cells_default.py +++ b/hnn_core/cells_default.py @@ -418,7 +418,7 @@ def pyramidal_ca(cell_name, pos, override_params=None, gid=None): override_params['L5Pyr_soma_gnabar_hh2'] = 0.32 gbar_ca = partial( - _linear_g_at_dist, gsoma=10., gdend=40., xkink=1501) # Sarah's values: gsoma=10, gdend = 40 + _linear_g_at_dist, gsoma=10., gdend=40., xkink=1501) gbar_na = partial( _linear_g_at_dist, gsoma=override_params['L5Pyr_soma_gnabar_hh2'], gdend=28e-4, xkink=962) diff --git a/hnn_core/network.py b/hnn_core/network.py index ef74b1b23..3a9c2dfdf 100644 --- a/hnn_core/network.py +++ b/hnn_core/network.py @@ -1133,8 +1133,8 @@ def _instantiate_drives(self, tstop, n_trials=1): self.external_drives[ drive['name']]['events'].append(event_times) - def add_tonic_bias(self, *, cell_type=None, sect_name='soma', bias_name='tonic', - amplitude, t0=0, tstop=None): + def add_tonic_bias(self, *, cell_type=None, sect_name='soma', + bias_name='tonic', amplitude, t0=0, tstop=None): """Attaches parameters of tonic bias input for given cell types Parameters @@ -1146,7 +1146,7 @@ def add_tonic_bias(self, *, cell_type=None, sect_name='soma', bias_name='tonic', sect_name : str | 'soma' section the bias should be added to. bias_name : str | 'tonic' - The name of the bias (allows several biases to be added to the cell). + The name of the bias. amplitude: dict | float A dictionary of cell type keys (str) to amplitude values (float). Valid inputs for cell types are those listed in `net.cell_types`. @@ -1186,7 +1186,7 @@ def add_tonic_bias(self, *, cell_type=None, sect_name='soma', bias_name='tonic', for _cell_type, _amplitude in amplitude.items(): _add_cell_type_bias(network=self, cell_type=_cell_type, - sect_name=sect_name,bias_name=bias_name, + sect_name=sect_name, bias_name=bias_name, amplitude=_amplitude, t_0=t0, t_stop=tstop) @@ -1676,7 +1676,8 @@ def _add_cell_type_bias(network: Network, amplitude: Union[float, dict], network.external_biases[bias_name] = dict() if cell_type in network.external_biases[bias_name]: - raise ValueError(f'Bias named {bias_name} already defined for {cell_type}') + raise ValueError(f'Bias named {bias_name} already defined ' + f'for {cell_type}') cell_type_bias = { 'amplitude': amplitude, From 2680d2683ea88251cc77552013ebb84f4ba7cc6c Mon Sep 17 00:00:00 2001 From: katduecker Date: Tue, 29 Oct 2024 13:36:33 -0400 Subject: [PATCH 06/28] unit tests --- hnn_core/tests/test_gui.py | 3 ++- hnn_core/tests/test_network.py | 3 ++- 2 files changed, 4 insertions(+), 2 deletions(-) diff --git a/hnn_core/tests/test_gui.py b/hnn_core/tests/test_gui.py index d286b8f76..6af313a22 100644 --- a/hnn_core/tests/test_gui.py +++ b/hnn_core/tests/test_gui.py @@ -90,7 +90,8 @@ def check_drive(drive1, drive2, keys): for cell_type, bias_params in bias_dict.items(): check_items(bias_params, net2.external_biases[bias_name][cell_type], - ignore_keys=['tstop'], + # OK to ignore here? + ignore_keys=['tstop', 'sect_name'], message=f'{bias_name}>{cell_type}>') # Check all other attributes diff --git a/hnn_core/tests/test_network.py b/hnn_core/tests/test_network.py index 5b7d7a742..e77065af0 100644 --- a/hnn_core/tests/test_network.py +++ b/hnn_core/tests/test_network.py @@ -855,7 +855,8 @@ def test_tonic_biases(): assert 'tonic' in net.external_biases assert 'L5_pyramidal' not in net.external_biases['tonic'] assert net.external_biases['tonic']['L2_pyramidal']['t0'] == 0 - with pytest.raises(ValueError, match=r'Tonic bias already defined for.*$'): + with pytest.raises(ValueError, match=r'Bias named tonic already defined ' + r'for.*$'): net.add_tonic_bias(amplitude=tonic_bias_2) From 6220c78c6a0aa813172ed23fb5f3fc92101997e6 Mon Sep 17 00:00:00 2001 From: katduecker Date: Tue, 29 Oct 2024 13:41:13 -0400 Subject: [PATCH 07/28] change sect_name to section for consistency --- hnn_core/cell.py | 8 +++++--- hnn_core/network.py | 14 +++++++------- 2 files changed, 12 insertions(+), 10 deletions(-) diff --git a/hnn_core/cell.py b/hnn_core/cell.py index b803ca07f..0d3188d06 100644 --- a/hnn_core/cell.py +++ b/hnn_core/cell.py @@ -728,7 +728,7 @@ def _insert_dipole(self, sec_name_apical): dpp.ztan = seg_lens_z[-1] self.dipole = h.Vector().record(self.dpl_ref) - def create_tonic_bias(self, amplitude, t0, tstop, sect_name='soma', + def create_tonic_bias(self, amplitude, t0, tstop, section='soma', loc=0.5): """Create tonic bias at the soma. @@ -740,11 +740,13 @@ def create_tonic_bias(self, amplitude, t0, tstop, sect_name='soma', The start time of tonic input (in ms). tstop : float The end time of tonic input (in ms). + section : str + Section tonic input is applied to. loc : float (0 to 1) - The location of the input in the soma section. + The location of the input in the section. """ - stim = h.IClamp(self._nrn_sections[sect_name](loc)) + stim = h.IClamp(self._nrn_sections[section](loc)) stim.delay = t0 stim.dur = tstop - t0 stim.amp = amplitude diff --git a/hnn_core/network.py b/hnn_core/network.py index 3a9c2dfdf..ce2410acb 100644 --- a/hnn_core/network.py +++ b/hnn_core/network.py @@ -1133,7 +1133,7 @@ def _instantiate_drives(self, tstop, n_trials=1): self.external_drives[ drive['name']]['events'].append(event_times) - def add_tonic_bias(self, *, cell_type=None, sect_name='soma', + def add_tonic_bias(self, *, cell_type=None, section='soma', bias_name='tonic', amplitude, t0=0, tstop=None): """Attaches parameters of tonic bias input for given cell types @@ -1143,8 +1143,8 @@ def add_tonic_bias(self, *, cell_type=None, sect_name='soma', The name of the cell type to add a tonic input. When supplied, a float value must be provided with the `amplitude` keyword. Valid inputs are those listed in `net.cell_types`. - sect_name : str | 'soma' - section the bias should be added to. + section : str | 'soma' + section the bias should be applied to. bias_name : str | 'tonic' The name of the bias. amplitude: dict | float @@ -1174,7 +1174,7 @@ def add_tonic_bias(self, *, cell_type=None, sect_name='soma', _validate_type(amplitude, (float, int), 'amplitude') _add_cell_type_bias(network=self, cell_type=cell_type, - sect_name=sect_name, bias_name=bias_name, + section=section, bias_name=bias_name, amplitude=float(amplitude), t_0=t0, t_stop=tstop) else: @@ -1186,7 +1186,7 @@ def add_tonic_bias(self, *, cell_type=None, sect_name='soma', for _cell_type, _amplitude in amplitude.items(): _add_cell_type_bias(network=self, cell_type=_cell_type, - sect_name=sect_name, bias_name=bias_name, + section=section, bias_name=bias_name, amplitude=_amplitude, t_0=t0, t_stop=tstop) @@ -1655,7 +1655,7 @@ def __repr__(self): def _add_cell_type_bias(network: Network, amplitude: Union[float, dict], - cell_type=None, sect_name='soma', bias_name='tonic', + cell_type=None, section='soma', bias_name='tonic', t_0=0, t_stop=None): if network is None: @@ -1683,6 +1683,6 @@ def _add_cell_type_bias(network: Network, amplitude: Union[float, dict], 'amplitude': amplitude, 't0': t_0, 'tstop': t_stop, - 'sect_name': sect_name + 'section': section } network.external_biases[bias_name][cell_type] = cell_type_bias From fa323add5fe08980d2d7459c5f98028f76f2488f Mon Sep 17 00:00:00 2001 From: katduecker Date: Tue, 29 Oct 2024 13:45:50 -0400 Subject: [PATCH 08/28] change sect_name to section for consistency test_gui --- hnn_core/tests/test_gui.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/hnn_core/tests/test_gui.py b/hnn_core/tests/test_gui.py index 6af313a22..cd5e5266c 100644 --- a/hnn_core/tests/test_gui.py +++ b/hnn_core/tests/test_gui.py @@ -90,8 +90,8 @@ def check_drive(drive1, drive2, keys): for cell_type, bias_params in bias_dict.items(): check_items(bias_params, net2.external_biases[bias_name][cell_type], - # OK to ignore here? - ignore_keys=['tstop', 'sect_name'], + # OK to ignore section here? + ignore_keys=['tstop', 'section'], message=f'{bias_name}>{cell_type}>') # Check all other attributes From 477317dafae04a7e1f37e0784c3bf66fd83f2cbb Mon Sep 17 00:00:00 2001 From: katduecker Date: Tue, 29 Oct 2024 14:10:40 -0400 Subject: [PATCH 09/28] workaround backwards compatibility --- hnn_core/cell.py | 2 +- hnn_core/network.py | 9 +++++++-- 2 files changed, 8 insertions(+), 3 deletions(-) diff --git a/hnn_core/cell.py b/hnn_core/cell.py index 0d3188d06..3ee185cd9 100644 --- a/hnn_core/cell.py +++ b/hnn_core/cell.py @@ -730,7 +730,7 @@ def _insert_dipole(self, sec_name_apical): def create_tonic_bias(self, amplitude, t0, tstop, section='soma', loc=0.5): - """Create tonic bias at the soma. + """Create tonic bias at defined section. Parameters ---------- diff --git a/hnn_core/network.py b/hnn_core/network.py index ce2410acb..20aa327ad 100644 --- a/hnn_core/network.py +++ b/hnn_core/network.py @@ -1682,7 +1682,12 @@ def _add_cell_type_bias(network: Network, amplitude: Union[float, dict], cell_type_bias = { 'amplitude': amplitude, 't0': t_0, - 'tstop': t_stop, - 'section': section + 'tstop': t_stop } + + # This ensures backwards compatibility with exisiting json + # files (see test_read_configuration_json in test_io.py) + if section != 'soma': + cell_type_bias['section'] = section + network.external_biases[bias_name][cell_type] = cell_type_bias From 855cd70e44f0b490ea09725273ec83832bd86308 Mon Sep 17 00:00:00 2001 From: katduecker Date: Tue, 29 Oct 2024 14:12:35 -0400 Subject: [PATCH 10/28] change CSD back --- hnn_core/extracellular.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/hnn_core/extracellular.py b/hnn_core/extracellular.py index b4917b0e4..d76355df1 100644 --- a/hnn_core/extracellular.py +++ b/hnn_core/extracellular.py @@ -272,7 +272,7 @@ class ExtracellularArray: measured values of conductivity in rat cortex (note units there are mS/cm) """ - def __init__(self, positions, *, conductivity=0.3, method='lsa', + def __init__(self, positions, *, conductivity=0.3, method='psa', min_distance=0.5, times=None, voltages=None): _validate_type(positions, (tuple, list), 'positions') From e80b86d95d2fde53104f3315d119ce2e4098c889 Mon Sep 17 00:00:00 2001 From: katduecker Date: Tue, 29 Oct 2024 14:43:15 -0400 Subject: [PATCH 11/28] add deprecation warning --- hnn_core/network.py | 13 +++++++++---- 1 file changed, 9 insertions(+), 4 deletions(-) diff --git a/hnn_core/network.py b/hnn_core/network.py index 20aa327ad..44f25f701 100644 --- a/hnn_core/network.py +++ b/hnn_core/network.py @@ -1133,7 +1133,7 @@ def _instantiate_drives(self, tstop, n_trials=1): self.external_drives[ drive['name']]['events'].append(event_times) - def add_tonic_bias(self, *, cell_type=None, section='soma', + def add_tonic_bias(self, *, cell_type=None, section=None, bias_name='tonic', amplitude, t0=0, tstop=None): """Attaches parameters of tonic bias input for given cell types @@ -1655,7 +1655,7 @@ def __repr__(self): def _add_cell_type_bias(network: Network, amplitude: Union[float, dict], - cell_type=None, section='soma', bias_name='tonic', + cell_type=None, section=None, bias_name='tonic', t_0=0, t_stop=None): if network is None: @@ -1685,9 +1685,14 @@ def _add_cell_type_bias(network: Network, amplitude: Union[float, dict], 'tstop': t_stop } - # This ensures backwards compatibility with exisiting json + # Deprecation cyle? + # Ensures backwards compatibility with exisiting json # files (see test_read_configuration_json in test_io.py) - if section != 'soma': + if section is None: + warnings.warn("Section for tonic bias is not defined." + "Defaulting to 'soma'. Please define section.", + DeprecationWarning, stacklevel=1) + else: cell_type_bias['section'] = section network.external_biases[bias_name][cell_type] = cell_type_bias From ddddcb3750dbfc4e425b87db2719cdb6f50cd1d5 Mon Sep 17 00:00:00 2001 From: katduecker Date: Tue, 29 Oct 2024 14:45:42 -0400 Subject: [PATCH 12/28] fix typos --- hnn_core/network.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/hnn_core/network.py b/hnn_core/network.py index 44f25f701..6ea233304 100644 --- a/hnn_core/network.py +++ b/hnn_core/network.py @@ -1685,8 +1685,8 @@ def _add_cell_type_bias(network: Network, amplitude: Union[float, dict], 'tstop': t_stop } - # Deprecation cyle? - # Ensures backwards compatibility with exisiting json + # Deprecation cycle? + # Ensures backwards compatibility with existing json # files (see test_read_configuration_json in test_io.py) if section is None: warnings.warn("Section for tonic bias is not defined." From 9b25c3d07fa22cfe10cc8589f870ff893528353d Mon Sep 17 00:00:00 2001 From: katduecker Date: Tue, 29 Oct 2024 17:08:53 -0400 Subject: [PATCH 13/28] unit tests --- hnn_core/network.py | 19 +++++++++++++++---- hnn_core/tests/test_network.py | 16 ++++++++++++++++ 2 files changed, 31 insertions(+), 4 deletions(-) diff --git a/hnn_core/network.py b/hnn_core/network.py index 6ea233304..07057c106 100644 --- a/hnn_core/network.py +++ b/hnn_core/network.py @@ -1143,7 +1143,7 @@ def add_tonic_bias(self, *, cell_type=None, section=None, The name of the cell type to add a tonic input. When supplied, a float value must be provided with the `amplitude` keyword. Valid inputs are those listed in `net.cell_types`. - section : str | 'soma' + section : str | None section the bias should be applied to. bias_name : str | 'tonic' The name of the bias. @@ -1163,6 +1163,11 @@ def add_tonic_bias(self, *, cell_type=None, section=None, multiple are specified with the `amplitude` keyword. """ + if section is None: + warnings.warn("Section for tonic bias is not defined." + "Defaulting to 'soma'.", + DeprecationWarning, stacklevel=1) + # old functionality single cell type - amplitude if cell_type is not None: warnings.warn('cell_type argument will be deprecated and ' @@ -1685,13 +1690,19 @@ def _add_cell_type_bias(network: Network, amplitude: Union[float, dict], 'tstop': t_stop } - # Deprecation cycle? + sections = list(network.cell_types[cell_type].sections.keys()) + # Ensures backwards compatibility with existing json # files (see test_read_configuration_json in test_io.py) if section is None: warnings.warn("Section for tonic bias is not defined." - "Defaulting to 'soma'. Please define section.", - DeprecationWarning, stacklevel=1) + "Defaulting to 'soma'.", + UserWarning, stacklevel=1) + # error when section is defined that doesn't exist. + elif section not in sections: + raise ValueError(f'section must be an existing ' + f'section of the current cell or None. ' + f'Got {section}.') else: cell_type_bias['section'] = section diff --git a/hnn_core/tests/test_network.py b/hnn_core/tests/test_network.py index e77065af0..9286b473c 100644 --- a/hnn_core/tests/test_network.py +++ b/hnn_core/tests/test_network.py @@ -743,6 +743,7 @@ def test_add_cell_type(): def test_tonic_biases(): + """Test tonic biases.""" hnn_core_root = op.dirname(hnn_core.__file__) @@ -859,6 +860,21 @@ def test_tonic_biases(): r'for.*$'): net.add_tonic_bias(amplitude=tonic_bias_2) + # non-existent section + net.external_biases = dict() + + with pytest.raises(ValueError, match=r'section must be an existing ' + r'section of the current cell or None. ' + r'Got apical_4.'): + net.add_tonic_bias(amplitude={'L2_pyramidal': .5}, section='apical_4') + + # deprecation warning when section not defined + net.external_biases = dict() + with pytest.warns(DeprecationWarning, + match=r"Section for tonic bias is not defined." + r"Defaulting to 'soma'."): + net.add_tonic_bias(amplitude={'L2_pyramidal': .5}) + def test_network_mesh(): """Test mesh for defining cell positions biases.""" From fbe25bc39f4f1d562425f85eb15f80c63a93b3bd Mon Sep 17 00:00:00 2001 From: katduecker Date: Tue, 29 Oct 2024 17:15:51 -0400 Subject: [PATCH 14/28] clean up section warning --- hnn_core/network.py | 7 +------ 1 file changed, 1 insertion(+), 6 deletions(-) diff --git a/hnn_core/network.py b/hnn_core/network.py index 07057c106..d8309a5c5 100644 --- a/hnn_core/network.py +++ b/hnn_core/network.py @@ -1163,11 +1163,6 @@ def add_tonic_bias(self, *, cell_type=None, section=None, multiple are specified with the `amplitude` keyword. """ - if section is None: - warnings.warn("Section for tonic bias is not defined." - "Defaulting to 'soma'.", - DeprecationWarning, stacklevel=1) - # old functionality single cell type - amplitude if cell_type is not None: warnings.warn('cell_type argument will be deprecated and ' @@ -1697,7 +1692,7 @@ def _add_cell_type_bias(network: Network, amplitude: Union[float, dict], if section is None: warnings.warn("Section for tonic bias is not defined." "Defaulting to 'soma'.", - UserWarning, stacklevel=1) + DeprecationWarning, stacklevel=1) # error when section is defined that doesn't exist. elif section not in sections: raise ValueError(f'section must be an existing ' From 097a96b2925b16e702fcda35a7046360aab4a2a4 Mon Sep 17 00:00:00 2001 From: George Dang <53052793+gtdang@users.noreply.github.com> Date: Mon, 4 Nov 2024 15:42:37 -0500 Subject: [PATCH 15/28] refactor: changed the default value from None to 'soma' --- hnn_core/network.py | 15 +++++---------- 1 file changed, 5 insertions(+), 10 deletions(-) diff --git a/hnn_core/network.py b/hnn_core/network.py index d8309a5c5..83ca6dd2c 100644 --- a/hnn_core/network.py +++ b/hnn_core/network.py @@ -1133,7 +1133,7 @@ def _instantiate_drives(self, tstop, n_trials=1): self.external_drives[ drive['name']]['events'].append(event_times) - def add_tonic_bias(self, *, cell_type=None, section=None, + def add_tonic_bias(self, *, cell_type=None, section='soma', bias_name='tonic', amplitude, t0=0, tstop=None): """Attaches parameters of tonic bias input for given cell types @@ -1655,7 +1655,7 @@ def __repr__(self): def _add_cell_type_bias(network: Network, amplitude: Union[float, dict], - cell_type=None, section=None, bias_name='tonic', + cell_type=None, section='soma', bias_name='tonic', t_0=0, t_stop=None): if network is None: @@ -1682,19 +1682,14 @@ def _add_cell_type_bias(network: Network, amplitude: Union[float, dict], cell_type_bias = { 'amplitude': amplitude, 't0': t_0, - 'tstop': t_stop + 'tstop': t_stop, + 'section': section } sections = list(network.cell_types[cell_type].sections.keys()) - # Ensures backwards compatibility with existing json - # files (see test_read_configuration_json in test_io.py) - if section is None: - warnings.warn("Section for tonic bias is not defined." - "Defaulting to 'soma'.", - DeprecationWarning, stacklevel=1) # error when section is defined that doesn't exist. - elif section not in sections: + if section not in sections: raise ValueError(f'section must be an existing ' f'section of the current cell or None. ' f'Got {section}.') From 6972d228f4dac36adcad2dfe654685a5704d8773 Mon Sep 17 00:00:00 2001 From: George Dang <53052793+gtdang@users.noreply.github.com> Date: Mon, 4 Nov 2024 15:43:23 -0500 Subject: [PATCH 16/28] chore: updated test asset with section attributes in external_biases --- hnn_core/tests/assets/jones2009_3x3_drives.json | 12 ++++++++---- 1 file changed, 8 insertions(+), 4 deletions(-) diff --git a/hnn_core/tests/assets/jones2009_3x3_drives.json b/hnn_core/tests/assets/jones2009_3x3_drives.json index 149a86fde..0b80b0561 100644 --- a/hnn_core/tests/assets/jones2009_3x3_drives.json +++ b/hnn_core/tests/assets/jones2009_3x3_drives.json @@ -2128,22 +2128,26 @@ "L2_pyramidal": { "amplitude": 1.0, "t0": 0, - "tstop": null + "tstop": null, + "section": "soma" }, "L5_pyramidal": { "amplitude": 0.0, "t0": 0, - "tstop": null + "tstop": null, + "section": "soma" }, "L2_basket": { "amplitude": 0.0, "t0": 0, - "tstop": null + "tstop": null, + "section": "soma" }, "L5_basket": { "amplitude": 0.0, "t0": 0, - "tstop": null + "tstop": null, + "section": "soma" } } }, From 751c462235b726bb697f17cc4b8cefbb2f82787e Mon Sep 17 00:00:00 2001 From: George Dang <53052793+gtdang@users.noreply.github.com> Date: Mon, 4 Nov 2024 15:43:58 -0500 Subject: [PATCH 17/28] chore: removed 'section' from ignore_keys in test_gui.check_equal_networks --- hnn_core/tests/test_gui.py | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/hnn_core/tests/test_gui.py b/hnn_core/tests/test_gui.py index cd5e5266c..d286b8f76 100644 --- a/hnn_core/tests/test_gui.py +++ b/hnn_core/tests/test_gui.py @@ -90,8 +90,7 @@ def check_drive(drive1, drive2, keys): for cell_type, bias_params in bias_dict.items(): check_items(bias_params, net2.external_biases[bias_name][cell_type], - # OK to ignore section here? - ignore_keys=['tstop', 'section'], + ignore_keys=['tstop'], message=f'{bias_name}>{cell_type}>') # Check all other attributes From bc6322c9dec44e0a5283c67ad79521b688ec6d51 Mon Sep 17 00:00:00 2001 From: katduecker Date: Mon, 4 Nov 2024 16:25:38 -0500 Subject: [PATCH 18/28] fix test --- hnn_core/cells_default.py | 1 - hnn_core/tests/test_network.py | 7 ------- 2 files changed, 8 deletions(-) diff --git a/hnn_core/cells_default.py b/hnn_core/cells_default.py index a420e79c2..86f931162 100644 --- a/hnn_core/cells_default.py +++ b/hnn_core/cells_default.py @@ -429,7 +429,6 @@ def pyramidal_ca(cell_name, pos, override_params=None, gid=None): override_params['L5Pyr_dend_gbar_ca'] = gbar_ca override_params['L5Pyr_dend_gnabar_hh2'] = gbar_na override_params['L5Pyr_dend_gkbar_hh2'] = gbar_k - override_params['L5Pyr_soma_gbar_ca'] = 10. cell = pyramidal(cell_name, pos, override_params=override_params, gid=gid) diff --git a/hnn_core/tests/test_network.py b/hnn_core/tests/test_network.py index 9286b473c..eb6301f88 100644 --- a/hnn_core/tests/test_network.py +++ b/hnn_core/tests/test_network.py @@ -868,13 +868,6 @@ def test_tonic_biases(): r'Got apical_4.'): net.add_tonic_bias(amplitude={'L2_pyramidal': .5}, section='apical_4') - # deprecation warning when section not defined - net.external_biases = dict() - with pytest.warns(DeprecationWarning, - match=r"Section for tonic bias is not defined." - r"Defaulting to 'soma'."): - net.add_tonic_bias(amplitude={'L2_pyramidal': .5}) - def test_network_mesh(): """Test mesh for defining cell positions biases.""" From 0c752789a8765a789285ea439bfea74ed68d0c89 Mon Sep 17 00:00:00 2001 From: katduecker Date: Mon, 4 Nov 2024 16:53:31 -0500 Subject: [PATCH 19/28] add bias_name test --- hnn_core/tests/test_network.py | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/hnn_core/tests/test_network.py b/hnn_core/tests/test_network.py index eb6301f88..bb8861fe2 100644 --- a/hnn_core/tests/test_network.py +++ b/hnn_core/tests/test_network.py @@ -860,6 +860,11 @@ def test_tonic_biases(): r'for.*$'): net.add_tonic_bias(amplitude=tonic_bias_2) + net = Network(params) + net.add_tonic_bias(amplitude=tonic_bias_2, bias_name='tonic_2', t0=100) + assert 'tonic_2' in net.external_biases + assert net.external_biases['tonic_2']['L2_pyramidal']['t0'] == 100 + # non-existent section net.external_biases = dict() From e890f83325f0a29f27538ea5e2e3427d9488bebd Mon Sep 17 00:00:00 2001 From: katduecker Date: Mon, 4 Nov 2024 17:21:10 -0500 Subject: [PATCH 20/28] update value error --- hnn_core/network.py | 12 +++++++----- hnn_core/tests/test_network.py | 8 +++++--- 2 files changed, 12 insertions(+), 8 deletions(-) diff --git a/hnn_core/network.py b/hnn_core/network.py index 83ca6dd2c..8e56b297a 100644 --- a/hnn_core/network.py +++ b/hnn_core/network.py @@ -1143,8 +1143,9 @@ def add_tonic_bias(self, *, cell_type=None, section='soma', The name of the cell type to add a tonic input. When supplied, a float value must be provided with the `amplitude` keyword. Valid inputs are those listed in `net.cell_types`. - section : str | None - section the bias should be applied to. + section : str | 'soma' + name of cell section the bias should be applied to. + See net.cell_types[cell_type].sections.keys() bias_name : str | 'tonic' The name of the bias. amplitude: dict | float @@ -1690,9 +1691,10 @@ def _add_cell_type_bias(network: Network, amplitude: Union[float, dict], # error when section is defined that doesn't exist. if section not in sections: - raise ValueError(f'section must be an existing ' - f'section of the current cell or None. ' - f'Got {section}.') + print(f"section must be one of " + f"{sections}. Got {section}.") + raise ValueError(f"section must be one of " + f"{sections}. Got {section}.") else: cell_type_bias['section'] = section diff --git a/hnn_core/tests/test_network.py b/hnn_core/tests/test_network.py index bb8861fe2..36323ff8d 100644 --- a/hnn_core/tests/test_network.py +++ b/hnn_core/tests/test_network.py @@ -5,6 +5,7 @@ import numpy as np from numpy.testing import assert_allclose import pytest +import re import hnn_core from hnn_core import read_params, CellResponse, Network @@ -868,9 +869,10 @@ def test_tonic_biases(): # non-existent section net.external_biases = dict() - with pytest.raises(ValueError, match=r'section must be an existing ' - r'section of the current cell or None. ' - r'Got apical_4.'): + sections = list(net.cell_types['L2_pyramidal'].sections.keys()) + with pytest.raises(ValueError, match=re.escape(f"section must be one of " + f"{sections}." + f"Got apical_4.")): net.add_tonic_bias(amplitude={'L2_pyramidal': .5}, section='apical_4') From 321ff3fab96d845df0702695a5164f0b8cbea164 Mon Sep 17 00:00:00 2001 From: katduecker Date: Tue, 5 Nov 2024 10:58:21 -0500 Subject: [PATCH 21/28] fix regex test --- hnn_core/network.py | 6 ++---- hnn_core/tests/test_network.py | 7 ++----- 2 files changed, 4 insertions(+), 9 deletions(-) diff --git a/hnn_core/network.py b/hnn_core/network.py index 8e56b297a..3e1db731d 100644 --- a/hnn_core/network.py +++ b/hnn_core/network.py @@ -1691,10 +1691,8 @@ def _add_cell_type_bias(network: Network, amplitude: Union[float, dict], # error when section is defined that doesn't exist. if section not in sections: - print(f"section must be one of " - f"{sections}. Got {section}.") - raise ValueError(f"section must be one of " - f"{sections}. Got {section}.") + raise ValueError(f"section must be one of {sections}. " + f"Got {section}.") else: cell_type_bias['section'] = section diff --git a/hnn_core/tests/test_network.py b/hnn_core/tests/test_network.py index 36323ff8d..817d4090b 100644 --- a/hnn_core/tests/test_network.py +++ b/hnn_core/tests/test_network.py @@ -5,7 +5,6 @@ import numpy as np from numpy.testing import assert_allclose import pytest -import re import hnn_core from hnn_core import read_params, CellResponse, Network @@ -869,10 +868,8 @@ def test_tonic_biases(): # non-existent section net.external_biases = dict() - sections = list(net.cell_types['L2_pyramidal'].sections.keys()) - with pytest.raises(ValueError, match=re.escape(f"section must be one of " - f"{sections}." - f"Got apical_4.")): + with pytest.raises(ValueError, match=('section must be one of ' + r".*" + + ' Got apical_4.')): net.add_tonic_bias(amplitude={'L2_pyramidal': .5}, section='apical_4') From d74bb876c6e96a8e5df2d7b96516226e5acd1602 Mon Sep 17 00:00:00 2001 From: Katharina Duecker Date: Thu, 7 Nov 2024 13:50:56 -0500 Subject: [PATCH 22/28] Update hnn_core/tests/test_network.py Co-authored-by: Mainak Jas --- hnn_core/tests/test_network.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/hnn_core/tests/test_network.py b/hnn_core/tests/test_network.py index 817d4090b..f728ef041 100644 --- a/hnn_core/tests/test_network.py +++ b/hnn_core/tests/test_network.py @@ -868,8 +868,8 @@ def test_tonic_biases(): # non-existent section net.external_biases = dict() - with pytest.raises(ValueError, match=('section must be one of ' + r".*" + - ' Got apical_4.')): + with pytest.raises(ValueError, match=(r'section must be one of .*' + ' Got apical_4.')): net.add_tonic_bias(amplitude={'L2_pyramidal': .5}, section='apical_4') From 4ec2a3a7e5c4ac500ea4d46695f9869e03b8c33b Mon Sep 17 00:00:00 2001 From: Katharina Duecker Date: Thu, 7 Nov 2024 13:51:02 -0500 Subject: [PATCH 23/28] Update hnn_core/tests/test_network.py Co-authored-by: Mainak Jas --- hnn_core/tests/test_network.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/hnn_core/tests/test_network.py b/hnn_core/tests/test_network.py index f728ef041..842ba8a07 100644 --- a/hnn_core/tests/test_network.py +++ b/hnn_core/tests/test_network.py @@ -860,7 +860,7 @@ def test_tonic_biases(): r'for.*$'): net.add_tonic_bias(amplitude=tonic_bias_2) - net = Network(params) + net = jones_2009_model() net.add_tonic_bias(amplitude=tonic_bias_2, bias_name='tonic_2', t0=100) assert 'tonic_2' in net.external_biases assert net.external_biases['tonic_2']['L2_pyramidal']['t0'] == 100 From d8556edd64906baf9460354075661608002d2db5 Mon Sep 17 00:00:00 2001 From: Katharina Duecker Date: Thu, 7 Nov 2024 13:51:08 -0500 Subject: [PATCH 24/28] Update hnn_core/tests/test_network.py Co-authored-by: Mainak Jas --- hnn_core/tests/test_network.py | 1 - 1 file changed, 1 deletion(-) diff --git a/hnn_core/tests/test_network.py b/hnn_core/tests/test_network.py index 842ba8a07..ff234a4fb 100644 --- a/hnn_core/tests/test_network.py +++ b/hnn_core/tests/test_network.py @@ -743,7 +743,6 @@ def test_add_cell_type(): def test_tonic_biases(): - """Test tonic biases.""" hnn_core_root = op.dirname(hnn_core.__file__) From d358188580a8bb8a5c9a9d6b56d21ef70dd63793 Mon Sep 17 00:00:00 2001 From: Katharina Duecker Date: Thu, 7 Nov 2024 13:51:16 -0500 Subject: [PATCH 25/28] Update hnn_core/network.py Co-authored-by: Mainak Jas --- hnn_core/network.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/hnn_core/network.py b/hnn_core/network.py index 3e1db731d..f88aad045 100644 --- a/hnn_core/network.py +++ b/hnn_core/network.py @@ -1146,7 +1146,7 @@ def add_tonic_bias(self, *, cell_type=None, section='soma', section : str | 'soma' name of cell section the bias should be applied to. See net.cell_types[cell_type].sections.keys() - bias_name : str | 'tonic' + bias_name : str The name of the bias. amplitude: dict | float A dictionary of cell type keys (str) to amplitude values (float). From aadf0d7ed5752590d708947123224c4dda21243a Mon Sep 17 00:00:00 2001 From: Katharina Duecker Date: Thu, 7 Nov 2024 13:51:24 -0500 Subject: [PATCH 26/28] Update hnn_core/network.py Co-authored-by: Mainak Jas --- hnn_core/network.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/hnn_core/network.py b/hnn_core/network.py index f88aad045..074ca5c5d 100644 --- a/hnn_core/network.py +++ b/hnn_core/network.py @@ -1143,7 +1143,7 @@ def add_tonic_bias(self, *, cell_type=None, section='soma', The name of the cell type to add a tonic input. When supplied, a float value must be provided with the `amplitude` keyword. Valid inputs are those listed in `net.cell_types`. - section : str | 'soma' + section : str name of cell section the bias should be applied to. See net.cell_types[cell_type].sections.keys() bias_name : str From 277cdbbd66f42ac8ee5f01e0db4ccfe3dc24d2a2 Mon Sep 17 00:00:00 2001 From: katduecker Date: Thu, 7 Nov 2024 14:03:10 -0500 Subject: [PATCH 27/28] update whats_new and fix flake8 --- doc/whats_new.rst | 4 ++++ hnn_core/tests/test_network.py | 2 +- 2 files changed, 5 insertions(+), 1 deletion(-) diff --git a/doc/whats_new.rst b/doc/whats_new.rst index 07b130ecb..d93d58165 100644 --- a/doc/whats_new.rst +++ b/doc/whats_new.rst @@ -41,6 +41,10 @@ API - Add :func:`~hnn_core.CellResponse.spike_times_by_type` to get cell spiking times organized by cell type, by `Mainak Jas`_ in :gh:`916`. +- Add option to apply a tonic bias to any compartment of the cell, and option to +add multiple biases per simulation and cell :func:`hnn_core.network.add_tonic_bias`, +by `Katharina Duecker`_ in :gh:`922`. + .. _0.4: 0.4 diff --git a/hnn_core/tests/test_network.py b/hnn_core/tests/test_network.py index ff234a4fb..bb0eba484 100644 --- a/hnn_core/tests/test_network.py +++ b/hnn_core/tests/test_network.py @@ -868,7 +868,7 @@ def test_tonic_biases(): net.external_biases = dict() with pytest.raises(ValueError, match=(r'section must be one of .*' - ' Got apical_4.')): + ' Got apical_4.')): net.add_tonic_bias(amplitude={'L2_pyramidal': .5}, section='apical_4') From cf08abac68a6dcc0c801afd96251426dfda2b37d Mon Sep 17 00:00:00 2001 From: katduecker Date: Thu, 7 Nov 2024 14:03:58 -0500 Subject: [PATCH 28/28] update whats_new --- doc/whats_new.rst | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/doc/whats_new.rst b/doc/whats_new.rst index d93d58165..ee781b59d 100644 --- a/doc/whats_new.rst +++ b/doc/whats_new.rst @@ -42,8 +42,8 @@ API organized by cell type, by `Mainak Jas`_ in :gh:`916`. - Add option to apply a tonic bias to any compartment of the cell, and option to -add multiple biases per simulation and cell :func:`hnn_core.network.add_tonic_bias`, -by `Katharina Duecker`_ in :gh:`922`. + add multiple biases per simulation and cell :func:`hnn_core.network.add_tonic_bias`, + by `Katharina Duecker`_ in :gh:`922`. .. _0.4: