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