NEURON
cvtrset.cpp
Go to the documentation of this file.
1 #include "nrnconf.h"
2 #include <stdio.h>
3 #include <errno.h>
4 #include <math.h>
5 #include <InterViews/resource.h>
6 #include "nrnoc2iv.h"
7 #include "cvodeobj.h"
8 #include "nonvintblock.h"
9 
10 #include "membfunc.h"
11 #include "neuron.h"
12 
13 extern int diam_changed;
14 extern int tree_changed;
15 
16 void Cvode::rhs(NrnThread* _nt) {
17  int i;
18 
19  CvodeThreadData& z = CTD(_nt->id);
20  if (diam_changed) {
21  recalc_diam();
22  }
23  if (z.v_node_count_ == 0) { return; }
24  for (i = 0; i < z.v_node_count_; ++i) {
25  NODERHS(z.v_node_[i]) = 0.;
26  }
27  if (_nt->_nrn_fast_imem) {
28  double* p = _nt->_nrn_fast_imem->_nrn_sav_rhs;
29  for (i = 0; i < z.v_node_count_; ++i) {
30  Node* nd = z.v_node_[i];
31  p[nd->v_node_index] = 0;
32  }
33  }
34 
35  rhs_memb(z.cv_memb_list_, _nt);
36  nrn_nonvint_block_current(_nt->end, _nt->_actual_rhs, _nt->id);
37 
38  if (_nt->_nrn_fast_imem) {
39  double* p = _nt->_nrn_fast_imem->_nrn_sav_rhs;
40  for (i = 0; i < z.v_node_count_; ++i) {
41  Node* nd = z.v_node_[i];
42  p[nd->v_node_index] -= NODERHS(nd);
43  }
44  }
45 
46  /* at this point d contains all the membrane conductances */
47  /* now the internal axial currents.
48  rhs += ai_j*(vi_j - vi)
49  */
50  for (i = z.rootnodecount_; i < z.v_node_count_; ++i) {
51  Node* nd = z.v_node_[i];
52  Node* pnd = z.v_parent_[i];
53  double dv = NODEV(pnd) - NODEV(nd);
54  /* our connection coefficients are negative so */
55  NODERHS(nd) -= NODEB(nd)*dv;
56  NODERHS(pnd) += NODEA(nd)*dv;
57  }
58 }
59 
60 void Cvode::rhs_memb(CvMembList* cmlist, NrnThread* _nt) {
61  CvMembList* cml;
62  errno = 0;
63  for (cml = cmlist; cml; cml = cml->next) {
64  Memb_func* mf = memb_func + cml->index;
65  Pvmi s = mf->current;
66  if (s) {
67  Memb_list* ml = cml->ml;
68  (*s)(_nt, ml, cml->index);
69  if (errno) {
70  if (nrn_errno_check(cml->index)) {
71 hoc_warning("errno set during calculation of currents", (char*)0);
72  }
73  }
74  }
75  }
77  activstim_rhs();
79 }
80 
81 void Cvode::lhs(NrnThread* _nt) {
82  int i;
83 
84  CvodeThreadData& z = CTD(_nt->id);
85  if (z.v_node_count_ == 0) { return; }
86  for (i = 0; i < z.v_node_count_; ++i) {
87  NODED(z.v_node_[i]) = 0.;
88  }
89 
90  lhs_memb(z.cv_memb_list_, _nt);
92  nrn_cap_jacob(_nt, z.cmlcap_->ml);
93 
94  // _nrn_fast_imem not needed since exact icap added in nrn_div_capacity
95 
96  /* now add the axial currents */
97  for (i = 0; i < z.v_node_count_; ++i) {
98  NODED(z.v_node_[i]) -= NODEB(z.v_node_[i]);
99  }
100  for (i=z.rootnodecount_; i < z.v_node_count_; ++i) {
101  NODED(z.v_parent_[i]) -= NODEA(z.v_node_[i]);
102  }
103 }
104 
105 void Cvode::lhs_memb(CvMembList* cmlist, NrnThread* _nt) {
106  CvMembList* cml;
107  for (cml = cmlist; cml; cml = cml->next) {
108  Memb_func* mf = memb_func + cml->index;
109  Memb_list* ml = cml->ml;
110  Pvmi s = mf->jacob;
111  if (s) {
112  Pvmi s = mf->jacob;
113  (*s)(_nt, ml, cml->index);
114  if (errno) {
115  if (nrn_errno_check(cml->index)) {
116 hoc_warning("errno set during calculation of di/dv", (char*)0);
117  }
118  }
119  }
120  }
122  activclamp_lhs();
123 }
124 
125 /* triangularization of the matrix equations */
127  Node *nd, *pnd;
128  double p;
129  int i;
130  CvodeThreadData& z = CTD(_nt->id);
131 
132  for (i = z.v_node_count_ - 1; i >= z.rootnodecount_; --i) {
133  nd = z.v_node_[i];
134  pnd = z.v_parent_[i];
135  p = NODEA(nd) / NODED(nd);
136  NODED(pnd) -= p * NODEB(nd);
137  NODERHS(pnd) -= p * NODERHS(nd);
138  }
139 }
140 
141 /* back substitution to finish solving the matrix equations */
143  Node *nd, *cnd;
144  int i;
145  CvodeThreadData& z = CTD(_nt->id);
146 
147  for (i = 0; i < z.rootnodecount_; ++i) {
148  NODERHS(z.v_node_[i]) /= NODED(z.v_node_[i]);
149  }
150  for (i = z.rootnodecount_; i < z.v_node_count_; ++i) {
151  cnd = z.v_node_[i];
152  nd = z.v_parent_[i];
153  NODERHS(cnd) -= NODEB(cnd) * NODERHS(nd);
154  NODERHS(cnd) /= NODED(cnd);
155  }
156 }
void activclamp_rhs(void)
Definition: clamp.cpp:162
#define nrn_nonvint_block_conductance(size, d, tid)
Definition: nonvintblock.h:47
void lhs_memb(CvMembList *, NrnThread *)
Definition: cvtrset.cpp:105
int tree_changed
Definition: cabcode.cpp:19
#define NODEV(n)
Definition: section.h:114
#define NODED(n)
Definition: section.h:103
void rhs_memb(CvMembList *, NrnThread *)
Definition: cvtrset.cpp:60
int index
Definition: cvodeobj.h:28
Pvmi current
Definition: membfunc.h:33
size_t p
Represent main neuron object computed by single thread.
Definition: multicore.h:58
double * _actual_rhs
Definition: multicore.h:70
int rootnodecount_
Definition: cvodeobj.h:58
Memb_func * memb_func
Definition: init.cpp:161
nd
Definition: treeset.cpp:893
void activclamp_lhs(void)
Definition: clamp.cpp:180
void activstim_rhs(void)
Definition: fstim.cpp:159
int diam_changed
Definition: cabcode.cpp:23
void nrn_cap_jacob(NrnThread *_nt, Memb_list *ml)
Definition: capac.cpp:32
_nrn_Fast_Imem * _nrn_fast_imem
Definition: multicore.h:82
Node ** v_node_
Definition: cvodeobj.h:60
int id
Definition: multicore.h:66
CvMembList * cmlcap_
Definition: cvodeobj.h:52
void rhs(NrnThread *)
Definition: cvtrset.cpp:16
#define CTD(i)
Definition: cvodeobj.h:40
_CONST char * s
Definition: system.cpp:74
#define NODEA(n)
Definition: section.h:123
double * _nrn_sav_rhs
Definition: multicore.h:46
Node ** v_parent_
Definition: cvodeobj.h:61
void(* Pvmi)(struct NrnThread *, Memb_list *, int)
Definition: membfunc.h:18
void hoc_warning(const char *, const char *)
static Node * pnd
Definition: clamp.cpp:33
void activsynapse_rhs(void)
Definition: synapse.cpp:204
errno
Definition: system.cpp:98
#define NODEB(n)
Definition: section.h:124
void bksub(NrnThread *)
Definition: cvtrset.cpp:142
CvMembList * next
Definition: cvodeobj.h:26
int end
Definition: multicore.h:65
#define NODERHS(n)
Definition: section.h:104
void triang(NrnThread *)
Definition: cvtrset.cpp:126
Pvmi jacob
Definition: membfunc.h:34
int v_node_index
Definition: section.h:174
#define i
Definition: md1redef.h:12
void recalc_diam()
Definition: treeset.cpp:940
void activsynapse_lhs(void)
Definition: synapse.cpp:214
void lhs(NrnThread *)
Definition: cvtrset.cpp:81
int nrn_errno_check(int)
Definition: fadvance.cpp:784
Definition: section.h:132
CvMembList * cv_memb_list_
Definition: cvodeobj.h:51
Memb_list * ml
Definition: cvodeobj.h:27
#define nrn_nonvint_block_current(size, rhs, tid)
Definition: nonvintblock.h:42
int v_node_count_
Definition: cvodeobj.h:59