NEURON
section.h
Go to the documentation of this file.
1 /* /local/src/master/nrn/src/nrnoc/section.h,v 1.4 1996/05/21 17:09:24 hines Exp */
2 #pragma once
3 
4 /* In order to support oc objects containing sections, instead of vector
5  of ordered sections, we now have a list (in the nmodl sense)
6  of unordered sections. The lesser efficiency is ok because the
7  number crunching is vectorized. ie only the user interface deals
8  with sections and that needs to be convenient
9 */
10 /* Data structure for solving branching 1-D tree diffusion type equations.
11  Vector of ordered sections each of which points to a vector of nodes.
12  Each section must have at least one node. There may be 0 sections.
13  The order of last node to first node is used in triangularization.
14  First node to last is used in back substitution.
15  The first node of a section is connected to some node of a section
16  with lesser index.
17 */
18 /* An equation is associated with each node. d and rhs are the diagonal and
19  right hand side respectively. a is the effect of this node on the parent
20  node's equation. b is the effect of the parent node on this node's
21  equation.
22  d is assumed to be non-zero.
23  d and rhs is calculated from the property list.
24 */
25 #include "hoclist.h"
26 #include "cabcode.h"
27 #include "membfunc.h"
30 #include "neuron/model_data.hpp"
31 #include "nrnredef.h"
32 #include "options.h"
33 #include "section_fwd.hpp"
34 
35 /*#define DEBUGSOLVE 1*/
36 #define xpop hoc_xpop
37 #define pc hoc_pc
38 #define spop hoc_spop
39 #define execerror hoc_execerror
40 #include "hocdec.h"
41 
42 #include <optional>
43 
44 #if DIAMLIST
45 struct Pt3d {
46  float x, y, z, d; // 3d point, microns
47  double arc;
48 };
49 #endif
50 struct Section {
51  int refcount{}; // may be in more than one list
52  short nnode{}; // Number of nodes for ith section
53  Section* parentsec{}; // parent section of node 0
54  Section* child{}; // root of the list of children connected to this parent kept in order of
55  // increasing x
56  Section* sibling{}; // used as list of sections that have same parent
57 
58  Node* parentnode{}; // parent node; only valid when tree_changed = 0
59  Node** pnode{}; // Pointer to pointer vector of node structures
60  int order{}; // index of this in secorder vector
61  short recalc_area_{}; // NODEAREA, NODERINV, diam, L need recalculation
62  short volatile_mark{}; // for searching
63  void* volatile_ptr{}; // e.g. ShapeSection*
64 #if DIAMLIST
65  short npt3d{}; // number of 3-d points
66  short pt3d_bsize{}; // amount of allocated space for 3-d points
67  Pt3d* pt3d{}; // list of 3d points with diameter
68  Pt3d* logical_connection{}; // nullptr for legacy, otherwise specifies logical connection
69  // position (for translation)
70 #endif
71  Prop* prop{}; // eg. length, etc.
72 };
73 
74 typedef float NodeCoef;
75 typedef double NodeVal;
76 
77 typedef struct Info3Coef {
78  NodeVal current; /* for use in next time step */
80  NodeCoef coef0; /* 5dx/12 */
81  NodeCoef coefn; /* 1dx/12 */
82  NodeCoef coefjdot; /* dx^2*ra/12 */
83  NodeCoef coefdg; /* dx/12 */
84  NodeCoef coefj; /* 1/(ra*dx) */
85  struct Node* nd2; /* the node dx away in the opposite direction*/
86  /* note above implies that nodes next to branches cannot have point processes
87  and still be third order correct. Also nodes next to branches cannot themselves
88  be branch points */
90 
91 typedef struct Info3Val { /* storage to help build matrix efficiently */
92  NodeVal GC; /* doesn't include point processes */
96 
97 
98 /* if any double is added after area then think about changing
99 the notify_free_val parameter in node_free in solve.cpp
100 */
101 #define NODEAREA(n) ((n)->area())
102 #define NODERINV(n) ((n)->_rinv)
103 
104 struct Extnode;
105 struct Node {
106  // Eventually the old Node class should become an alias for
107  // neuron::container::handle::Node, but as an intermediate measure we can
108  // add one of those as a member and forward some access/modifications to it.
110 
111  [[nodiscard]] auto id() {
112  return _node_handle.id();
113  }
114  [[nodiscard]] auto& a() {
115  return _node_handle.a();
116  }
117  [[nodiscard]] auto const& a() const {
118  return _node_handle.a();
119  }
120  [[nodiscard]] auto& area() {
121  return _node_handle.area_hack();
122  }
123  [[nodiscard]] auto const& area() const {
124  return _node_handle.area_hack();
125  }
126  [[nodiscard]] auto area_handle() {
127  return _node_handle.area_handle();
128  }
129  [[nodiscard]] auto& b() {
130  return _node_handle.b();
131  }
132  [[nodiscard]] auto const& b() const {
133  return _node_handle.b();
134  }
135  [[nodiscard]] auto& d() {
136  return _node_handle.d();
137  }
138  [[nodiscard]] auto const& d() const {
139  return _node_handle.d();
140  }
141  [[nodiscard]] auto& v() {
142  return _node_handle.v_hack();
143  }
144  [[nodiscard]] auto const& v() const {
145  return _node_handle.v_hack();
146  }
147  [[nodiscard]] auto& v_hack() {
148  return _node_handle.v_hack();
149  }
150  [[nodiscard]] auto const& v_hack() const {
151  return _node_handle.v_hack();
152  }
153  [[nodiscard]] auto v_handle() {
154  return _node_handle.v_handle();
155  }
156  [[nodiscard]] auto& rhs() {
157  return _node_handle.rhs();
158  }
159  [[nodiscard]] auto const& rhs() const {
160  return _node_handle.rhs();
161  }
162  [[nodiscard]] auto rhs_handle() {
163  return _node_handle.rhs_handle();
164  }
165  [[nodiscard]] auto& sav_d() {
166  return _node_handle.sav_d();
167  }
168  [[nodiscard]] auto const& sav_d() const {
169  return _node_handle.sav_d();
170  }
171  [[nodiscard]] auto& sav_rhs() {
172  return _node_handle.sav_rhs();
173  }
174  [[nodiscard]] auto const& sav_rhs() const {
175  return _node_handle.sav_rhs();
176  }
177  [[nodiscard]] auto sav_rhs_handle() {
178  return _node_handle.sav_rhs_handle();
179  }
180  [[nodiscard]] auto non_owning_handle() {
182  }
183  double _rinv{}; /* conductance uS from node to parent */
184  double* _a_matelm;
185  double* _b_matelm;
186  double* _d_matelm;
187  int eqn_index_; /* sparse13 matrix row/col index */
188  /* if no extnodes then = v_node_index +1*/
189  /* each extnode adds nlayer more equations after this */
190  Prop* prop{}; /* Points to beginning of property list */
191  Section* child; /* section connected to this node */
192  /* 0 means no other section connected */
193  Section* sec; /* section this node is in */
194  /* #if NRNMPI */
195  struct Node* _classical_parent; /* needed for multisplit */
196  struct NrnThread* _nt;
197 /* #endif */
198 #if EXTRACELLULAR
200 #endif
201 
202 #if EXTRAEQN
203  Eqnblock* eqnblock{}; /* hook to other equations which
204  need to be solved at the same time as the membrane
205  potential. eg. fast changeing ionic concentrations */
206 #endif
207 
208 #if DEBUGSOLVE
209  double savd;
210  double savrhs;
211 #endif /*DEBUGSOLVE*/
212  int v_node_index; /* only used to calculate parent_node_indices*/
213  int sec_node_index_; /* to calculate segment index from *Node */
214  Node() = default;
215  Node(Node const&) = delete;
216  Node(Node&&) = default;
217  Node& operator=(Node const&) = delete;
218  Node& operator=(Node&&) = default;
219  ~Node();
220  friend std::ostream& operator<<(std::ostream& os, Node const& n) {
221  return os << n._node_handle;
222  }
223 };
224 
225 #if !INCLUDEHOCH
226 #include "hocdec.h" /* Prop needs Datum and Datum needs Symbol */
227 #endif
228 
229 
230 #define PROP_PY_INDEX 10
231 struct Prop {
232  // Working assumption is that we can safely equate "Prop" with "instance
233  // of a mechanism" apart from a few special cases like CABLESECTION
234  Prop(Node* node, short type)
235  : node(node)
236  , _type{type} {
237  if (type != CABLESECTION) {
240  }
241  }
242  Node* node; /* The node this property belongs to. */
243  Prop* next; /* linked list of properties */
244  short _type; /* type of membrane, e.g. passive, HH, etc. */
245  int dparam_size; /* for notifying hoc_free_val_array */
246  // double* param; /* vector of doubles for this property */
247  Datum* dparam; /* usually vector of pointers to doubles
248  of other properties but maybe other things as well
249  for example one cable section property is a
250  symbol */
251  long _alloc_seq; /* for cache efficiency */
252  Object* ob; /* nullptr if normal property, otherwise the object containing the data*/
253 
254  /** @brief Get the identifier of this instance.
255  */
256  [[nodiscard]] auto id() const {
258  return m_mech_handle->id_hack();
259  }
260 
261  /**
262  * @brief Check if the given handle refers to data owned by this Prop.
263  */
264  [[nodiscard]] bool owns(neuron::container::data_handle<double> const& handle) const {
266  auto const num_fpfields = m_mech_handle->num_fpfields();
267  auto* const raw_ptr = static_cast<double const*>(handle);
268  for (auto i = 0; i < num_fpfields; ++i) {
269  for (auto j = 0; j < m_mech_handle->fpfield_dimension(i); ++j) {
270  if (raw_ptr == &m_mech_handle->fpfield(i, j)) {
271  return true;
272  }
273  }
274  }
275  return false;
276  }
277 
278  /**
279  * @brief Return a reference to the i-th floating point data field associated with this Prop.
280  *
281  * Note that there is a subtlety with the numbering scheme in case of array variables.
282  * If we have 3 array variables (a, b, c) with dimensions x, y, z:
283  * a[x] b[y] c[z]
284  * then, for example, the second element of b (assume y >= 2) is obtained with param(1, 1).
285  * In AoS NEURON these values were all stored contiguously, and the values were obtained using
286  * a single index; taking the same example, the second element of b used to be found at index
287  * x + 1 in the param array. In all of the above, scalar variables are treated the same and
288  * simply have dimension 1. In SoA NEURON then a[1] is stored immediately after a[0] in memory,
289  * but for a given mechanism instance b[0] is **not** stored immediately after a[x-1].
290  *
291  * It is possible, but a little inefficient, to calculate the new pair of indices from an old
292  * index. For that, see the param_legacy and param_handle_legacy functions.
293  */
294  [[nodiscard]] double& param(int field_index, int array_index = 0) {
296  return m_mech_handle->fpfield(field_index, array_index);
297  }
298 
299  /**
300  * @brief Return a reference to the i-th double value associated with this Prop.
301  *
302  * See the discussion above about numbering schemes.
303  */
304  [[nodiscard]] double const& param(int field_index, int array_index = 0) const {
306  return m_mech_handle->fpfield(field_index, array_index);
307  }
308 
309  /**
310  * @brief Return a handle to the i-th double value associated with this Prop.
311  *
312  * See the discussion above about numbering schemes.
313  */
314  [[nodiscard]] auto param_handle(int field, int array_index = 0) {
316  return m_mech_handle->fpfield_handle(field, array_index);
317  }
318 
320  return param_handle(ind.field, ind.array_index);
321  }
322 
323  private:
324  /**
325  * @brief Translate a legacy (flat) index into a (variable, array offset) pair.
326  * @todo Reimplement this using the new helpers.
327  */
328  [[nodiscard]] std::pair<int, int> translate_legacy_index(int legacy_index) const {
330  int total{};
331  auto const num_fields = m_mech_handle->num_fpfields();
332  for (auto field = 0; field < num_fields; ++field) {
333  auto const array_dim = m_mech_handle->fpfield_dimension(field);
334  if (legacy_index < total + array_dim) {
335  auto const array_index = legacy_index - total;
336  return {field, array_index};
337  }
338  total += array_dim;
339  }
340  throw std::runtime_error("could not translate legacy index " +
341  std::to_string(legacy_index));
342  }
343 
344  public:
345  [[nodiscard]] double& param_legacy(int legacy_index) {
346  auto const [array_dim, array_index] = translate_legacy_index(legacy_index);
347  return param(array_dim, array_index);
348  }
349 
350  [[nodiscard]] double const& param_legacy(int legacy_index) const {
351  auto const [array_dim, array_index] = translate_legacy_index(legacy_index);
352  return param(array_dim, array_index);
353  }
354 
355  [[nodiscard]] auto param_handle_legacy(int legacy_index) {
356  auto const [array_dim, array_index] = translate_legacy_index(legacy_index);
357  return param_handle(array_dim, array_index);
358  }
359 
360  /**
361  * @brief Return how many double values are assocated with this Prop.
362  *
363  * In case of array variables, this is the sum over array dimensions.
364  * i.e. if a mechanism has a[2] b[2] then param_size()=4 and param_num_vars()=2.
365  */
366  [[nodiscard]] int param_size() const {
368  return m_mech_handle->fpfields_size();
369  }
370 
371  /**
372  * @brief Return how many (possibly-array) variables are associated with this Prop.
373  *
374  * In case of array variables, this ignores array dimensions.
375  * i.e. if a mechanism has a[2] b[2] then param_size()=4 and param_num_vars()=2.
376  */
377  [[nodiscard]] int param_num_vars() const {
379  return m_mech_handle->num_fpfields();
380  }
381 
382  /**
383  * @brief Return the array dimension of the given value.
384  */
385  [[nodiscard]] int param_array_dimension(int field) const {
387  return m_mech_handle->fpfield_dimension(field);
388  }
389 
390  [[nodiscard]] std::size_t current_row() const {
392  return m_mech_handle->current_row();
393  }
394 
395  friend std::ostream& operator<<(std::ostream& os, Prop const& p) {
396  if (p.m_mech_handle) {
397  return os << *p.m_mech_handle;
398  } else {
399  return os << "Prop{nullopt}";
400  }
401  }
402 
403  private:
404  // This is a handle that owns a row of the ~global mechanism data for
405  // `_type`. Usage of `param` and `param_size` should be replaced with
406  // indirection through this.
407  std::optional<neuron::container::Mechanism::owning_handle> m_mech_handle;
408 };
409 
410 extern void nrn_prop_datum_free(int type, Datum* ppd);
411 extern void nrn_delete_mechanism_prop_datum(int type);
412 extern int nrn_mechanism_prop_datum_count(int type);
413 
414 #if EXTRAEQN
415 /*Blocks of equations can hang off each node of the current conservation
416 equations. These are equations which must be solved simultaneously
417 because they depend on the voltage and affect the voltage. An example
418 are fast changing ionic concentrations (or merely if we want to be
419 able to calculate steady states using a stable method).
420 */
421 typedef struct Eqnblock {
422  struct Eqnblock* eqnblock_next; /* may be several such blocks */
423  Pfri eqnblock_triang; /* triangularization function */
424  Pfri eqnblock_bksub; /* back substitution function */
425  double* eqnblock_data;
426 #if 0
427  the solving functions know how to find the following info from
428  the eqnblock_data.
429  double *eqnblock_row; /* current conservation depends on states */
430  double *eqnblock_col; /* state equations depend on voltage */
431  double *eqnblock_matrix; /* state equations depend on states */
432  double *eqnblock_rhs:
433  the functions merely take a pointer to the node and this Eqnblock
434  in order to update the values of the diagonal, v, and the rhs
435  The interface with EXTRACELLULAR makes things a bit more subtle.
436  It seems clear that we will have to change the meaning of v to
437  be membrane potential so that the internal potential is v + vext.
438  This will avoid requiring two rows and two columns since
439  the state equations will depend only on v and not vext.
440  In fact, if vext did not have longitudinal relationships with
441  other vext the extracellular mechanism could be implemented in
442  this style.
443 #endif
444 } Eqnblock;
445 #endif /*EXTRAEQN*/
446 
447 extern int nrn_global_ncell; /* note that for multiple threads all the rootnodes are no longer
448  contiguous */
449 extern hoc_List* section_list; /* Where the Sections live */
450 
451 extern Section* sec_alloc(); /* Allocates a single section */
452 extern void node_alloc(Section*, short); /* Allocates node vectors in a section*/
453 extern Node* nrn_parent_node(Node*);
454 extern Section* nrn_section_alloc();
455 extern void nrn_section_free(Section*);
456 extern int nrn_is_valid_section_ptr(void*);
457 
458 
459 #include <multicore.h>
460 
461 #define tstopbit (1 << 15)
462 #define tstopset stoprun |= tstopbit
463 #define tstopunset stoprun &= (~tstopbit)
464 /* cvode.event(tevent) sets this. Reset at beginning */
465 /* of any hoc call for integration and before returning to hoc */
466 
467 
468 #include "nrn_ansi.h"
#define v
Definition: md1redef.h:11
#define i
Definition: md1redef.h:19
static double order(void *v)
Definition: cvodeobj.cpp:218
#define assert(ex)
Definition: hocassrt.h:24
int(* Pfri)(void)
Definition: hocdec.h:30
static VoidFunc functions[]
Definition: hocmodl.h:4
#define rhs
Definition: lineq.h:6
#define CABLESECTION
Definition: membfunc.hpp:58
static const char * mechanism[]
Definition: capac.cpp:19
void update(NrnThread *_nt)
handle_interface< non_owning_identifier< storage > > handle
Non-owning handle to a Mechanism instance.
Model & model()
Access the global Model instance.
Definition: model_data.hpp:206
if(ncell==0)
Definition: cellorder.cpp:785
std::string to_string(const T &obj)
static List * info
static Node * node(Object *)
Definition: netcvode.cpp:291
int const size_t const size_t n
Definition: nrngsl.h:10
size_t p
size_t j
short type
Definition: cabvars.h:10
static List * potential
Definition: nrnunit.cpp:13
static double take(void *v)
Definition: ocbbs.cpp:416
#define EXTRACELLULAR
Definition: options.h:16
int find(const int, const int, const int, const int, const int)
void node_alloc(Section *, short)
Definition: solve.cpp:705
double NodeVal
Definition: section.h:75
struct Info3Coef Info3Coef
hoc_List * section_list
Definition: init.cpp:113
int nrn_is_valid_section_ptr(void *)
Definition: cxprop.cpp:101
int nrn_global_ncell
Definition: init.cpp:114
void nrn_prop_datum_free(int type, Datum *ppd)
Definition: cxprop.cpp:54
Node * nrn_parent_node(Node *)
Definition: treeset.cpp:809
void nrn_section_free(Section *)
Definition: cxprop.cpp:95
int nrn_mechanism_prop_datum_count(int type)
Definition: cxprop.cpp:47
Section * sec_alloc()
Allocate a new Section object.
Definition: solve.cpp:445
Section * nrn_section_alloc()
Definition: cxprop.cpp:85
float NodeCoef
Definition: section.h:74
struct Info3Val Info3Val
void nrn_delete_mechanism_prop_datum(int type)
Definition: cxprop.cpp:70
Forward declarations of Section, Node etc.
struct Node * nd2
Definition: section.h:85
NodeCoef coefjdot
Definition: section.h:82
NodeCoef coefdg
Definition: section.h:83
NodeCoef coef0
Definition: section.h:80
NodeCoef coefj
Definition: section.h:84
NodeCoef coefn
Definition: section.h:81
NodeVal current
Definition: section.h:78
NodeVal djdv0
Definition: section.h:79
NodeCoef Cdt
Definition: section.h:94
NodeVal GC
Definition: section.h:92
NodeVal EC
Definition: section.h:93
Definition: section.h:105
struct NrnThread * _nt
Definition: section.h:196
auto const & b() const
Definition: section.h:132
Node()=default
auto & d()
Definition: section.h:135
auto const & a() const
Definition: section.h:117
auto & sav_d()
Definition: section.h:165
auto & b()
Definition: section.h:129
auto const & v_hack() const
Definition: section.h:150
struct Node * _classical_parent
Definition: section.h:195
auto & sav_rhs()
Definition: section.h:171
auto const & sav_d() const
Definition: section.h:168
auto const & sav_rhs() const
Definition: section.h:174
auto const & area() const
Definition: section.h:123
auto const & rhs() const
Definition: section.h:159
double * _d_matelm
Definition: section.h:186
auto area_handle()
Definition: section.h:126
int eqn_index_
Definition: section.h:187
auto v_handle()
Definition: section.h:153
double * _a_matelm
Definition: section.h:184
Section * sec
Definition: section.h:193
int v_node_index
Definition: section.h:212
Extnode * extnode
Definition: section.h:199
neuron::container::Node::owning_handle _node_handle
Definition: section.h:109
auto & a()
Definition: section.h:114
auto id()
Definition: section.h:111
~Node()
Definition: solve.cpp:548
auto & area()
Definition: section.h:120
auto & rhs()
Definition: section.h:156
Section * child
Definition: section.h:191
Node & operator=(Node &&)=default
auto const & d() const
Definition: section.h:138
double * _b_matelm
Definition: section.h:185
auto & v()
Definition: section.h:141
auto sav_rhs_handle()
Definition: section.h:177
auto rhs_handle()
Definition: section.h:162
Node(Node &&)=default
double _rinv
Definition: section.h:183
auto non_owning_handle()
Definition: section.h:180
Node & operator=(Node const &)=delete
friend std::ostream & operator<<(std::ostream &os, Node const &n)
Definition: section.h:220
auto & v_hack()
Definition: section.h:147
Node(Node const &)=delete
int sec_node_index_
Definition: section.h:213
Prop * prop
Definition: section.h:190
auto const & v() const
Definition: section.h:144
Represent main neuron object computed by single thread.
Definition: multicore.h:58
Definition: hocdec.h:173
Definition: section.h:231
int param_num_vars() const
Return how many (possibly-array) variables are associated with this Prop.
Definition: section.h:377
Datum * dparam
Definition: section.h:247
int param_array_dimension(int field) const
Return the array dimension of the given value.
Definition: section.h:385
double const & param(int field_index, int array_index=0) const
Return a reference to the i-th double value associated with this Prop.
Definition: section.h:304
short _type
Definition: section.h:244
int dparam_size
Definition: section.h:245
auto id() const
Get the identifier of this instance.
Definition: section.h:256
double & param(int field_index, int array_index=0)
Return a reference to the i-th floating point data field associated with this Prop.
Definition: section.h:294
auto param_handle(neuron::container::field_index ind)
Definition: section.h:319
Object * ob
Definition: section.h:252
Node * node
Definition: section.h:242
auto param_handle_legacy(int legacy_index)
Definition: section.h:355
friend std::ostream & operator<<(std::ostream &os, Prop const &p)
Definition: section.h:395
auto param_handle(int field, int array_index=0)
Return a handle to the i-th double value associated with this Prop.
Definition: section.h:314
long _alloc_seq
Definition: section.h:251
bool owns(neuron::container::data_handle< double > const &handle) const
Check if the given handle refers to data owned by this Prop.
Definition: section.h:264
std::size_t current_row() const
Definition: section.h:390
int param_size() const
Return how many double values are assocated with this Prop.
Definition: section.h:366
std::pair< int, int > translate_legacy_index(int legacy_index) const
Translate a legacy (flat) index into a (variable, array offset) pair.
Definition: section.h:328
Prop * next
Definition: section.h:243
double & param_legacy(int legacy_index)
Definition: section.h:345
double const & param_legacy(int legacy_index) const
Definition: section.h:350
std::optional< neuron::container::Mechanism::owning_handle > m_mech_handle
Definition: section.h:407
Prop(Node *node, short type)
Definition: section.h:234
Definition: section.h:45
float z
Definition: section.h:46
double arc
Definition: section.h:47
float x
Definition: section.h:46
float y
Definition: section.h:46
float d
Definition: section.h:46
Section * sibling
Definition: section.h:56
int order
Definition: section.h:60
short volatile_mark
Definition: section.h:62
short recalc_area_
Definition: section.h:61
void * volatile_ptr
Definition: section.h:63
Prop * prop
Definition: section.h:71
Pt3d * pt3d
Definition: section.h:67
short pt3d_bsize
Definition: section.h:66
Section * child
Definition: section.h:54
short npt3d
Definition: section.h:65
Node * parentnode
Definition: section.h:58
short nnode
Definition: section.h:52
int refcount
Definition: section.h:51
Pt3d * logical_connection
Definition: section.h:68
Section * parentsec
Definition: section.h:53
Node ** pnode
Definition: section.h:59
container::Mechanism::storage & mechanism_data(int type)
Get the structure holding the data of a particular Mechanism.
Definition: model_data.hpp:93
container::Node::storage & node_data()
Access the structure containing the data of all Nodes.
Definition: model_data.hpp:24
Base class defining the public API of Mechanism handles.
Definition: mechanism.hpp:71
field::Diagonal::type & d()
Return the diagonal element.
Definition: node.hpp:158
data_handle< field::RHS::type > rhs_handle()
Return a handle to the right hand side of the Hines solver.
Definition: node.hpp:223
field::RHS::type & rhs()
Return the right hand side of the Hines solver.
Definition: node.hpp:209
field::BelowDiagonal::type & b()
Return the below-diagonal element.
Definition: node.hpp:144
field::Voltage::type & v_hack()
This is a workaround for v sometimes being a macro.
Definition: node.hpp:194
data_handle< field::FastIMemSavRHS::type > sav_rhs_handle()
Definition: node.hpp:242
field::AboveDiagonal::type & a()
Return the above-diagonal element.
Definition: node.hpp:96
field::FastIMemSavRHS::type & sav_rhs()
Definition: node.hpp:235
field::Area::type & area_hack()
This is a workaround for area sometimes being a macro.
Definition: node.hpp:123
field::FastIMemSavRHS::type & sav_d()
Definition: node.hpp:227
data_handle< field::Voltage::type > v_handle()
Return a handle to the membrane potential.
Definition: node.hpp:186
data_handle< field::Area::type > area_handle()
Return a data_handle to the area.
Definition: node.hpp:137
Owning handle to a Node.
Definition: node_data.hpp:31
handle non_owning_handle()
Get a non-owning handle from an owning handle.
Definition: node_data.hpp:37
Struct used to index SoAoS data, such as array range variables.
Non-template stable handle to a generic value.
non_owning_identifier_without_container id() const
Obtain a lightweight identifier of the current entry.
Definition: view_utils.hpp:54