NEURON
capac.cpp
Go to the documentation of this file.
1 #include <../../nrnconf.h>
2 /* /local/src/master/nrn/src/nrnoc/capac.cpp,v 1.6 1998/11/25 19:14:28 hines Exp */
3 
4 #include "section.h"
5 #include "membdef.h"
7 #include "nrniv_mf.h"
8 
9 
10 static const char* mechanism[] = {"0", "capacitance", "cm", 0, "i_cap", 0, 0};
11 static void cap_alloc(Prop*);
12 static void cap_init(neuron::model_sorted_token const&, NrnThread*, Memb_list*, int);
13 
14 static constexpr auto nparm = 2;
15 static constexpr auto ndparm = 0;
16 static std::vector<double> parm_default{DEF_cm};
17 
18 extern "C" void capac_reg_(void) {
19  int mechtype;
20  /* all methods deal with capacitance in special ways */
21  register_mech(mechanism, cap_alloc, nullptr, nullptr, nullptr, cap_init, -1, 1);
22  mechtype = nrn_get_mechtype(mechanism[1]);
25  neuron::mechanism::register_data_fields(mechtype, field<double>{"cm"}, field<double>{"i_cap"});
26  hoc_register_prop_size(mechtype, nparm, 0);
27 }
28 
29 static constexpr auto cm_index = 0;
30 static constexpr auto i_cap_index = 1;
31 
32 /*
33 cj is analogous to 1/dt for cvode and daspk
34 for fixed step second order it is 2/dt and
35 for pure implicit fixed step it is 1/dt
36 It used to be static but is now a thread data variable
37 */
38 
39 void nrn_cap_jacob(neuron::model_sorted_token const& sorted_token, NrnThread* _nt, Memb_list* ml) {
40  neuron::cache::MechanismRange<nparm, ndparm> ml_cache{sorted_token, *_nt, *ml, ml->type()};
41  auto* const vec_d = _nt->node_d_storage();
42  int count = ml->nodecount;
43  double cfac = .001 * _nt->cj;
44  int* ni = ml->nodeindices;
45  for (int i = 0; i < count; i++) {
46  vec_d[ni[i]] += cfac * ml_cache.fpfield<cm_index>(i);
47  }
48 }
49 
50 static void cap_init(neuron::model_sorted_token const& sorted_token,
51  NrnThread* _nt,
52  Memb_list* ml,
53  int type) {
54  neuron::cache::MechanismRange<nparm, ndparm> ml_cache{sorted_token, *_nt, *ml, type};
55  int count = ml->nodecount;
56  for (int i = 0; i < count; ++i) {
57  ml_cache.fpfield<i_cap_index>(i) = 0;
58  }
59 }
60 
62  NrnThread* _nt,
63  Memb_list* ml) {
64  neuron::cache::MechanismRange<nparm, ndparm> ml_cache{sorted_token, *_nt, *ml, ml->type()};
65  auto* const vec_rhs = _nt->node_rhs_storage();
66  int count = ml->nodecount;
67  double cfac = .001 * _nt->cj;
68  /* since rhs is dvm for a full or half implicit step */
69  /* (nrn_update_2d() replaces dvi by dvi-dvx) */
70  /* no need to distinguish secondorder */
71  int* ni = ml->nodeindices;
72  for (int i = 0; i < count; i++) {
73  ml_cache.fpfield<i_cap_index>(i) = cfac * ml_cache.fpfield<cm_index>(i) * vec_rhs[ni[i]];
74  }
75 }
76 
77 
79  NrnThread* _nt,
80  Memb_list* ml) {
81  neuron::cache::MechanismRange<nparm, ndparm> ml_cache{sorted_token, *_nt, *ml, ml->type()};
82  auto* const vec_rhs = _nt->node_rhs_storage();
83  int count = ml->nodecount;
84  double cfac = .001 * _nt->cj;
85  int* ni = ml->nodeindices;
86  for (int i = 0; i < count; i++) {
87  vec_rhs[ni[i]] *= cfac * ml_cache.fpfield<cm_index>(i);
88  }
89 }
90 
92  NrnThread* _nt,
93  Memb_list* ml) {
94  neuron::cache::MechanismRange<nparm, ndparm> ml_cache{sorted_token, *_nt, *ml, ml->type()};
95  auto* const vec_rhs = _nt->node_rhs_storage();
96  int count = ml->nodecount;
97  Node** vnode = ml->nodelist;
98  int* ni = ml->nodeindices;
99  for (int i = 0; i < count; i++) {
100  ml_cache.fpfield<i_cap_index>(i) = vec_rhs[ni[i]];
101  vec_rhs[ni[i]] /= 1.e-3 * ml_cache.fpfield<cm_index>(i);
102  }
103  if (auto const vec_sav_rhs = _nt->node_sav_rhs_storage(); vec_sav_rhs) {
104  for (int i = 0; i < count; ++i) {
105  vec_sav_rhs[vnode[i]->v_node_index] += ml_cache.fpfield<i_cap_index>(i);
106  }
107  }
108 }
109 
110 
111 /* the rest can be constructed automatically from the above info*/
112 
113 static void cap_alloc(Prop* p) {
114  assert(p->param_size() == nparm);
115  assert(p->param_num_vars() == nparm);
116  p->param(0) = parm_default[0]; // DEF_cm default capacitance/cm^2
117 }
#define i
Definition: md1redef.h:19
#define assert(ex)
Definition: hocassrt.h:24
#define DEF_cm
int nrn_get_mechtype(const char *name)
Get mechanism type by the mechanism name.
Definition: mk_mech.cpp:145
void hoc_register_prop_size(int, int, int)
int register_mech(const char **m, mod_alloc_t alloc, mod_f_t cur, mod_f_t jacob, mod_f_t stat, mod_f_t initialize, mod_f_t private_constructor, mod_f_t private_destructor, int nrnpointerindex, int vectorized)
static void register_data_fields(int mech_type, Fields const &... fields)
Type- and array-aware version of hoc_register_prop_size.
Definition: membfunc.h:235
auto *const vec_d
Definition: cellorder.cpp:615
auto *const vec_rhs
Definition: cellorder.cpp:616
size_t p
short type
Definition: cabvars.h:10
static constexpr auto cm_index
Definition: capac.cpp:29
void nrn_capacity_current(neuron::model_sorted_token const &sorted_token, NrnThread *_nt, Memb_list *ml)
Definition: capac.cpp:61
static void cap_init(neuron::model_sorted_token const &, NrnThread *, Memb_list *, int)
Definition: capac.cpp:50
void nrn_cap_jacob(neuron::model_sorted_token const &sorted_token, NrnThread *_nt, Memb_list *ml)
Definition: capac.cpp:39
void nrn_div_capacity(neuron::model_sorted_token const &sorted_token, NrnThread *_nt, Memb_list *ml)
Definition: capac.cpp:91
void nrn_mul_capacity(neuron::model_sorted_token const &sorted_token, NrnThread *_nt, Memb_list *ml)
Definition: capac.cpp:78
static constexpr auto i_cap_index
Definition: capac.cpp:30
static constexpr auto nparm
Definition: capac.cpp:14
static void cap_alloc(Prop *)
Definition: capac.cpp:113
static constexpr auto ndparm
Definition: capac.cpp:15
static std::vector< double > parm_default
Definition: capac.cpp:16
static const char * mechanism[]
Definition: capac.cpp:10
void capac_reg_(void)
Definition: capac.cpp:18
void hoc_register_parm_default(int mechtype, const std::vector< double > *pd)
Definition: init.cpp:741
A view into a set of mechanism instances.
Definition: nrnoc_ml.h:34
int nodecount
Definition: nrnoc_ml.h:78
int * nodeindices
Definition: nrnoc_ml.h:74
int type() const
Get the mechanism type.
Definition: memblist.cpp:177
Node ** nodelist
Definition: nrnoc_ml.h:68
Definition: section.h:105
int v_node_index
Definition: section.h:212
Represent main neuron object computed by single thread.
Definition: multicore.h:58
double cj
Definition: multicore.h:61
double * node_sav_rhs_storage()
Definition: multicore.cpp:1088
double * node_rhs_storage()
Definition: multicore.cpp:1074
double * node_d_storage()
Definition: multicore.cpp:1069
Definition: section.h:231
Version of Memb_list for use in performance-critical code.