diff --git a/cnexp_array/neuron/leonhard.cpp b/cnexp_array/neuron/leonhard.cpp index dc66bc0..066c96a 100644 --- a/cnexp_array/neuron/leonhard.cpp +++ b/cnexp_array/neuron/leonhard.cpp @@ -103,6 +103,7 @@ namespace neuron { struct leonhard_NodeData { int const * nodeindices; double const * node_voltages; + double * node_diagonal; double * node_rhs; int nodecount; }; @@ -125,6 +126,7 @@ namespace neuron { return leonhard_NodeData { _ml_arg.nodeindices, _nt.node_voltage_storage(), + _nt.node_d_storage(), _nt.node_rhs_storage(), _ml_arg.nodecount }; @@ -208,7 +210,17 @@ namespace neuron { /** nrn_jacob function */ - static void nrn_jacob_leonhard(_nrn_model_sorted_token const& _sorted_token, NrnThread* _nt, Memb_list* _ml_arg, int _type) {} + static void nrn_jacob_leonhard(_nrn_model_sorted_token const& _sorted_token, NrnThread* _nt, Memb_list* _ml_arg, int _type) { + _nrn_mechanism_cache_range _lmr{_sorted_token, *_nt, *_ml_arg, _type}; + auto inst = make_instance_leonhard(_lmr); + auto node_data = make_node_data_leonhard(*_nt, *_ml_arg); + auto nodecount = _ml_arg->nodecount; + for (int id = 0; id < nodecount; id++) { + // set conductances properly + int node_id = node_data.nodeindices[id]; + node_data.node_diagonal[node_id] += inst.g_unused[id]; + } + } static void _initlists() { diff --git a/cnexp_scalar/neuron/leonhard.cpp b/cnexp_scalar/neuron/leonhard.cpp index 9d82dc2..c3048b2 100644 --- a/cnexp_scalar/neuron/leonhard.cpp +++ b/cnexp_scalar/neuron/leonhard.cpp @@ -97,6 +97,7 @@ namespace neuron { struct leonhard_NodeData { int const * nodeindices; double const * node_voltages; + double * node_diagonal; double * node_rhs; int nodecount; }; @@ -116,6 +117,7 @@ namespace neuron { return leonhard_NodeData { _ml_arg.nodeindices, _nt.node_voltage_storage(), + _nt.node_d_storage(), _nt.node_rhs_storage(), _ml_arg.nodecount }; @@ -194,7 +196,17 @@ namespace neuron { /** nrn_jacob function */ - static void nrn_jacob_leonhard(_nrn_model_sorted_token const& _sorted_token, NrnThread* _nt, Memb_list* _ml_arg, int _type) {} + static void nrn_jacob_leonhard(_nrn_model_sorted_token const& _sorted_token, NrnThread* _nt, Memb_list* _ml_arg, int _type) { + _nrn_mechanism_cache_range _lmr{_sorted_token, *_nt, *_ml_arg, _type}; + auto inst = make_instance_leonhard(_lmr); + auto node_data = make_node_data_leonhard(*_nt, *_ml_arg); + auto nodecount = _ml_arg->nodecount; + for (int id = 0; id < nodecount; id++) { + // set conductances properly + int node_id = node_data.nodeindices[id]; + node_data.node_diagonal[node_id] += inst.g_unused[id]; + } + } static void _initlists() { diff --git a/func_proc/neuron/func_proc.cpp b/func_proc/neuron/func_proc.cpp index b15e8d0..08e19ab 100644 --- a/func_proc/neuron/func_proc.cpp +++ b/func_proc/neuron/func_proc.cpp @@ -93,6 +93,7 @@ namespace neuron { struct test_func_proc_NodeData { int const * nodeindices; double const * node_voltages; + double * node_diagonal; double * node_rhs; int nodecount; }; @@ -110,6 +111,7 @@ namespace neuron { return test_func_proc_NodeData { _ml_arg.nodeindices, _nt.node_voltage_storage(), + _nt.node_d_storage(), _nt.node_rhs_storage(), _ml_arg.nodecount }; @@ -367,7 +369,14 @@ namespace neuron { /** nrn_jacob function */ - static void nrn_jacob_test_func_proc(_nrn_model_sorted_token const& _sorted_token, NrnThread* _nt, Memb_list* _ml_arg, int _type) {} + static void nrn_jacob_test_func_proc(_nrn_model_sorted_token const& _sorted_token, NrnThread* _nt, Memb_list* _ml_arg, int _type) { + _nrn_mechanism_cache_range _lmr{_sorted_token, *_nt, *_ml_arg, _type}; + auto inst = make_instance_test_func_proc(_lmr); + auto node_data = make_node_data_test_func_proc(*_nt, *_ml_arg); + auto nodecount = _ml_arg->nodecount; + for (int id = 0; id < nodecount; id++) { + } + } static void _initlists() { diff --git a/func_proc_pnt/neuron/func_proc_pnt.cpp b/func_proc_pnt/neuron/func_proc_pnt.cpp index 5ef3ee3..9ef393b 100644 --- a/func_proc_pnt/neuron/func_proc_pnt.cpp +++ b/func_proc_pnt/neuron/func_proc_pnt.cpp @@ -92,6 +92,7 @@ namespace neuron { struct test_func_proc_pnt_NodeData { int const * nodeindices; double const * node_voltages; + double * node_diagonal; double * node_rhs; int nodecount; }; @@ -110,6 +111,7 @@ namespace neuron { return test_func_proc_pnt_NodeData { _ml_arg.nodeindices, _nt.node_voltage_storage(), + _nt.node_d_storage(), _nt.node_rhs_storage(), _ml_arg.nodecount }; @@ -293,7 +295,14 @@ namespace neuron { /** nrn_jacob function */ - static void nrn_jacob_test_func_proc_pnt(_nrn_model_sorted_token const& _sorted_token, NrnThread* _nt, Memb_list* _ml_arg, int _type) {} + static void nrn_jacob_test_func_proc_pnt(_nrn_model_sorted_token const& _sorted_token, NrnThread* _nt, Memb_list* _ml_arg, int _type) { + _nrn_mechanism_cache_range _lmr{_sorted_token, *_nt, *_ml_arg, _type}; + auto inst = make_instance_test_func_proc_pnt(_lmr); + auto node_data = make_node_data_test_func_proc_pnt(*_nt, *_ml_arg); + auto nodecount = _ml_arg->nodecount; + for (int id = 0; id < nodecount; id++) { + } + } static void _initlists() { diff --git a/global_breakpoint/neuron/leonhard.cpp b/global_breakpoint/neuron/leonhard.cpp index 6971917..55c7ed2 100644 --- a/global_breakpoint/neuron/leonhard.cpp +++ b/global_breakpoint/neuron/leonhard.cpp @@ -97,6 +97,7 @@ namespace neuron { struct leonhard_NodeData { int const * nodeindices; double const * node_voltages; + double * node_diagonal; double * node_rhs; int nodecount; }; @@ -116,6 +117,7 @@ namespace neuron { return leonhard_NodeData { _ml_arg.nodeindices, _nt.node_voltage_storage(), + _nt.node_d_storage(), _nt.node_rhs_storage(), _ml_arg.nodecount }; @@ -195,7 +197,17 @@ namespace neuron { /** nrn_jacob function */ - static void nrn_jacob_leonhard(_nrn_model_sorted_token const& _sorted_token, NrnThread* _nt, Memb_list* _ml_arg, int _type) {} + static void nrn_jacob_leonhard(_nrn_model_sorted_token const& _sorted_token, NrnThread* _nt, Memb_list* _ml_arg, int _type) { + _nrn_mechanism_cache_range _lmr{_sorted_token, *_nt, *_ml_arg, _type}; + auto inst = make_instance_leonhard(_lmr); + auto node_data = make_node_data_leonhard(*_nt, *_ml_arg); + auto nodecount = _ml_arg->nodecount; + for (int id = 0; id < nodecount; id++) { + // set conductances properly + int node_id = node_data.nodeindices[id]; + node_data.node_diagonal[node_id] += inst.g_unused[id]; + } + } static void _initlists() { diff --git a/nonspecific_current/neuron/leonhard.cpp b/nonspecific_current/neuron/leonhard.cpp index 9042934..f52e8a3 100644 --- a/nonspecific_current/neuron/leonhard.cpp +++ b/nonspecific_current/neuron/leonhard.cpp @@ -94,6 +94,7 @@ namespace neuron { struct leonhard_NodeData { int const * nodeindices; double const * node_voltages; + double * node_diagonal; double * node_rhs; int nodecount; }; @@ -112,6 +113,7 @@ namespace neuron { return leonhard_NodeData { _ml_arg.nodeindices, _nt.node_voltage_storage(), + _nt.node_d_storage(), _nt.node_rhs_storage(), _ml_arg.nodecount }; @@ -199,6 +201,8 @@ namespace neuron { double rhs = I0; double g = (I1-I0)/0.001; node_data.node_rhs[node_id] -= rhs; + // remember the conductances so we can set them later + inst.g_unused[id] = g; } } @@ -214,7 +218,17 @@ namespace neuron { /** nrn_jacob function */ - static void nrn_jacob_leonhard(_nrn_model_sorted_token const& _sorted_token, NrnThread* _nt, Memb_list* _ml_arg, int _type) {} + static void nrn_jacob_leonhard(_nrn_model_sorted_token const& _sorted_token, NrnThread* _nt, Memb_list* _ml_arg, int _type) { + _nrn_mechanism_cache_range _lmr{_sorted_token, *_nt, *_ml_arg, _type}; + auto inst = make_instance_leonhard(_lmr); + auto node_data = make_node_data_leonhard(*_nt, *_ml_arg); + auto nodecount = _ml_arg->nodecount; + for (int id = 0; id < nodecount; id++) { + // set conductances properly + int node_id = node_data.nodeindices[id]; + node_data.node_diagonal[node_id] += inst.g_unused[id]; + } + } static void _initlists() { diff --git a/parameter/neuron/neuron_variables.cpp b/parameter/neuron/neuron_variables.cpp index de17ba9..55eb84b 100644 --- a/parameter/neuron/neuron_variables.cpp +++ b/parameter/neuron/neuron_variables.cpp @@ -96,6 +96,7 @@ namespace neuron { struct NeuronVariables_NodeData { int const * nodeindices; double const * node_voltages; + double * node_diagonal; double * node_rhs; int nodecount; }; @@ -115,6 +116,7 @@ namespace neuron { return NeuronVariables_NodeData { _ml_arg.nodeindices, _nt.node_voltage_storage(), + _nt.node_d_storage(), _nt.node_rhs_storage(), _ml_arg.nodecount }; @@ -192,7 +194,17 @@ namespace neuron { /** nrn_jacob function */ - static void nrn_jacob_NeuronVariables(_nrn_model_sorted_token const& _sorted_token, NrnThread* _nt, Memb_list* _ml_arg, int _type) {} + static void nrn_jacob_NeuronVariables(_nrn_model_sorted_token const& _sorted_token, NrnThread* _nt, Memb_list* _ml_arg, int _type) { + _nrn_mechanism_cache_range _lmr{_sorted_token, *_nt, *_ml_arg, _type}; + auto inst = make_instance_NeuronVariables(_lmr); + auto node_data = make_node_data_NeuronVariables(*_nt, *_ml_arg); + auto nodecount = _ml_arg->nodecount; + for (int id = 0; id < nodecount; id++) { + // set conductances properly + int node_id = node_data.nodeindices[id]; + node_data.node_diagonal[node_id] += inst.g_unused[id]; + } + } static void _initlists() { diff --git a/parameter/neuron/test_parameter.cpp b/parameter/neuron/test_parameter.cpp index b7690f9..fe11229 100644 --- a/parameter/neuron/test_parameter.cpp +++ b/parameter/neuron/test_parameter.cpp @@ -92,6 +92,7 @@ namespace neuron { struct test_parameter_NodeData { int const * nodeindices; double const * node_voltages; + double * node_diagonal; double * node_rhs; int nodecount; }; @@ -110,6 +111,7 @@ namespace neuron { return test_parameter_NodeData { _ml_arg.nodeindices, _nt.node_voltage_storage(), + _nt.node_d_storage(), _nt.node_rhs_storage(), _ml_arg.nodecount }; @@ -202,7 +204,14 @@ namespace neuron { /** nrn_jacob function */ - static void nrn_jacob_test_parameter(_nrn_model_sorted_token const& _sorted_token, NrnThread* _nt, Memb_list* _ml_arg, int _type) {} + static void nrn_jacob_test_parameter(_nrn_model_sorted_token const& _sorted_token, NrnThread* _nt, Memb_list* _ml_arg, int _type) { + _nrn_mechanism_cache_range _lmr{_sorted_token, *_nt, *_ml_arg, _type}; + auto inst = make_instance_test_parameter(_lmr); + auto node_data = make_node_data_test_parameter(*_nt, *_ml_arg); + auto nodecount = _ml_arg->nodecount; + for (int id = 0; id < nodecount; id++) { + } + } static void _initlists() { diff --git a/point_process/neuron/test_pp.cpp b/point_process/neuron/test_pp.cpp index f4d4b48..fc6a849 100644 --- a/point_process/neuron/test_pp.cpp +++ b/point_process/neuron/test_pp.cpp @@ -90,6 +90,7 @@ namespace neuron { struct test_pp_NodeData { int const * nodeindices; double const * node_voltages; + double * node_diagonal; double * node_rhs; int nodecount; }; @@ -107,6 +108,7 @@ namespace neuron { return test_pp_NodeData { _ml_arg.nodeindices, _nt.node_voltage_storage(), + _nt.node_d_storage(), _nt.node_rhs_storage(), _ml_arg.nodecount }; @@ -198,7 +200,14 @@ namespace neuron { /** nrn_jacob function */ - static void nrn_jacob_test_pp(_nrn_model_sorted_token const& _sorted_token, NrnThread* _nt, Memb_list* _ml_arg, int _type) {} + static void nrn_jacob_test_pp(_nrn_model_sorted_token const& _sorted_token, NrnThread* _nt, Memb_list* _ml_arg, int _type) { + _nrn_mechanism_cache_range _lmr{_sorted_token, *_nt, *_ml_arg, _type}; + auto inst = make_instance_test_pp(_lmr); + auto node_data = make_node_data_test_pp(*_nt, *_ml_arg); + auto nodecount = _ml_arg->nodecount; + for (int id = 0; id < nodecount; id++) { + } + } static void _initlists() {