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"
6 #include "nrniv_mf.h"
7 
8 
9 static const char *mechanism[] = {"0", "capacitance", "cm", 0, "i_cap", 0, 0};
10 static void cap_alloc(Prop *);
11 static void cap_init(NrnThread *, Memb_list *, int);
12 
13 #define nparm 2
14 extern "C" void capac_reg_(void) {
15  int mechtype;
16  /* all methods deal with capacitance in special ways */
17  register_mech(mechanism, cap_alloc, (Pvmi) 0, (Pvmi) 0, (Pvmi) 0, cap_init, -1, 1);
18  mechtype = nrn_get_mechtype(mechanism[1]);
19  hoc_register_prop_size(mechtype, nparm, 0);
20 }
21 
22 #define cm vdata[i][0]
23 #define i_cap vdata[i][1]
24 
25 /*
26 cj is analogous to 1/dt for cvode and daspk
27 for fixed step second order it is 2/dt and
28 for pure implicit fixed step it is 1/dt
29 It used to be static but is now a thread data variable
30 */
31 
33  int count = ml->nodecount;
34  Node **vnode = ml->nodelist;
35  double **vdata = ml->data;
36  int i;
37  double cfac = .001 * _nt->cj;
38 #if CACHEVEC
39  if (use_cachevec) {
40  int *ni = ml->nodeindices;
41  for (i = 0; i < count; i++) {
42  VEC_D(ni[i]) += cfac * cm;
43  }
44  } else
45 #endif /* CACHEVEC */
46  {
47  for (i = 0; i < count; ++i) {
48  NODED(vnode[i]) += cfac * cm;
49  }
50  }
51 }
52 
53 static void cap_init(NrnThread *_nt, Memb_list *ml, int type) {
54  int count = ml->nodecount;
55  double **vdata = ml->data;
56  int i;
57  for (i = 0; i < count; ++i) {
58  i_cap = 0;
59  }
60 }
61 
63  int count = ml->nodecount;
64  Node **vnode = ml->nodelist;
65  double **vdata = ml->data;
66  int i;
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 #if CACHEVEC
72  if (use_cachevec) {
73  int *ni = ml->nodeindices;
74  for (i = 0; i < count; i++) {
75  i_cap = cfac * cm * VEC_RHS(ni[i]);
76  }
77  } else
78 #endif /* CACHEVEC */
79  {
80  for (i = 0; i < count; ++i) {
81  i_cap = cfac * cm * NODERHS(vnode[i]);
82  }
83  }
84 }
85 
86 #if CVODE
87 
89  int count = ml->nodecount;
90  Node **vnode = ml->nodelist;
91  double **vdata = ml->data;
92  int i;
93  double cfac = .001 * _nt->cj;
94 #if CACHEVEC
95  if (use_cachevec) {
96  int *ni = ml->nodeindices;
97  for (i = 0; i < count; i++) {
98  VEC_RHS(ni[i]) *= cfac * cm;
99  }
100  } else
101 #endif /* CACHEVEC */
102  {
103  for (i = 0; i < count; ++i) {
104  NODERHS(vnode[i]) *= cfac * cm;
105  }
106  }
107 }
108 
110  int count = ml->nodecount;
111  Node **vnode = ml->nodelist;
112  double **vdata = ml->data;
113  int i;
114 #if CACHEVEC
115  if (use_cachevec) {
116  int *ni = ml->nodeindices;
117  for (i = 0; i < count; i++) {
118  i_cap = VEC_RHS(ni[i]);
119  VEC_RHS(ni[i]) /= 1.e-3 * cm;
120  }
121  } else
122 #endif /* CACHEVEC */
123  {
124  for (i = 0; i < count; ++i) {
125  i_cap = NODERHS(vnode[i]);
126  NODERHS(vnode[i]) /= 1.e-3 * cm;
127  }
128  }
129  if (_nt->_nrn_fast_imem) {
130  double *p = _nt->_nrn_fast_imem->_nrn_sav_rhs;
131  for (i = 0; i < count; ++i) {
132  p[vnode[i]->v_node_index] += i_cap;
133  }
134  }
135 }
136 
137 #endif /*CVODE*/
138 
139 /* the rest can be constructed automatically from the above info*/
140 
141 static void cap_alloc(Prop *p) {
142  double *pd;
143  pd = nrn_prop_data_alloc(CAP, nparm, p);
144  pd[0] = DEF_cm; /*default capacitance/cm^2*/
145  p->param = pd;
146  p->param_size = nparm;
147 }
148 
149 
int param_size
Definition: section.h:217
static void cap_init(NrnThread *, Memb_list *, int)
Definition: capac.cpp:53
double * param
Definition: section.h:218
short type
Definition: cabvars.h:10
void nrn_capacity_current(NrnThread *_nt, Memb_list *ml)
Definition: capac.cpp:62
#define NODED(n)
Definition: section.h:103
size_t p
Represent main neuron object computed by single thread.
Definition: multicore.h:58
void hoc_register_prop_size(int, int, int)
Definition: init.cpp:721
double ** data
Definition: nrnoc_ml.h:14
void nrn_cap_jacob(NrnThread *_nt, Memb_list *ml)
Definition: capac.cpp:32
_nrn_Fast_Imem * _nrn_fast_imem
Definition: multicore.h:82
#define i_cap
Definition: capac.cpp:23
static const char * mechanism[]
Definition: capac.cpp:9
void nrn_div_capacity(NrnThread *_nt, Memb_list *ml)
Definition: capac.cpp:109
int nrn_get_mechtype(const char *mechname)
Definition: cabcode.cpp:2017
int nodecount
Definition: nrnoc_ml.h:18
double * _nrn_sav_rhs
Definition: multicore.h:46
void capac_reg_(void)
Definition: capac.cpp:14
void(* Pvmi)(struct NrnThread *, Memb_list *, int)
Definition: membfunc.h:18
int use_cachevec
Definition: treeset.cpp:61
void nrn_mul_capacity(NrnThread *_nt, Memb_list *ml)
Definition: capac.cpp:88
Definition: section.h:213
#define nparm
Definition: capac.cpp:13
#define CAP
Definition: membfunc.h:64
#define cm
Definition: capac.cpp:22
#define NODERHS(n)
Definition: section.h:104
void register_mech(const char **, Pvmp, Pvmi, Pvmi, Pvmi, Pvmi, int, int)
Definition: init.cpp:688
#define DEF_cm
Definition: membdef.h:28
Node ** nodelist
Definition: nrnoc_ml.h:5
int v_node_index
Definition: section.h:174
double * nrn_prop_data_alloc(int type, int count, Prop *p)
Definition: cxprop.cpp:262
static void cap_alloc(Prop *)
Definition: capac.cpp:141
#define i
Definition: md1redef.h:12
double cj
Definition: multicore.h:61
#define VEC_D(i)
Definition: section.h:119
Definition: section.h:132
#define VEC_RHS(i)
Definition: section.h:120