NEURON
nrn_ansi.h
Go to the documentation of this file.
1 #pragma once
2 #include "hocdec.h"
3 #include "membfunc.h" // nrn_bamech_t
4 #include "cabcode.h"
6 #include "seclist.h"
8 #include <memory>
9 
10 struct Extnode;
11 struct hoc_Item;
12 struct HocParmLimits;
13 struct HocParmUnits;
14 struct HocStateTolerance;
15 struct Node;
16 struct Object;
17 struct Point_process;
18 struct Prop;
19 struct Section;
20 struct Symbol;
21 
22 // nocpout.cpp
23 extern void hoc_register_limits(int, HocParmLimits*);
24 extern void hoc_register_units(int, HocParmUnits*);
25 extern void hoc_register_dparam_semantics(int, int, const char*);
26 extern void add_nrn_fornetcons(int, int);
27 extern void hoc_register_tolerance(int, HocStateTolerance*, Symbol***);
28 
29 extern "C" void modl_reg(void);
30 
31 // nrnmech stuff
32 extern void _nrn_free_fornetcon(void**);
33 extern double nrn_call_mech_func(Symbol*, int narg, Prop*, int type);
34 
35 // mod stuff
36 extern void _nrn_free_watch(Datum*, int, int);
37 extern void _nrn_watch_activate(Datum*,
38  double (*)(Point_process*),
39  int,
41  int,
42  double);
43 extern void _nrn_watch_allocate(Datum*,
44  double (*)(Point_process*),
45  int,
47  double nrflag);
48 extern void hoc_reg_ba(int, nrn_bamech_t, int);
49 [[nodiscard]] inline int nrn_pointing(double* p) {
50  return static_cast<bool>(p);
51 }
52 
53 extern void nrn_popsec(void);
54 
55 extern int state_discon_allowed_;
56 extern int section_object_seen;
57 
58 extern int nrn_isecstack(void);
59 extern void nrn_secstack(int);
60 extern void nrn_relocate_old_points(Section* oldsec, Node* oldnode, Section* sec, Node* node);
61 extern void extcell_2d_alloc(Section* sec);
62 extern int nrn_is_ion(int);
63 extern void single_prop_free(Prop*);
64 extern void prop_free(Prop**);
65 extern int can_change_morph(Section*);
66 extern void nrn_area_ri(Section* sec);
67 extern void nrn_diam_change(Section*);
68 extern void sec_free(hoc_Item*);
69 extern void extcell_node_create(Node*);
70 extern void extnode_free_elements(Extnode*);
71 extern void section_order(void);
73 extern "C" void nrn_random_play();
74 extern void fixed_play_continuous(NrnThread*);
75 extern void setup_tree_matrix(neuron::model_sorted_token const& sorted_token, NrnThread& nt);
76 extern void nrn_solve(NrnThread*);
77 extern void second_order_cur(NrnThread*);
78 void nrn_update_voltage(neuron::model_sorted_token const& sorted_token, NrnThread& nt);
79 extern void nrn_fixed_step_lastpart(neuron::model_sorted_token const& sorted_token, NrnThread& nt);
80 extern void hoc_register_dparam_size(int, int);
81 extern int nrn_errno_check(int);
82 void long_difus_solve(neuron::model_sorted_token const&, int method, NrnThread& nt);
83 extern void nrn_fihexec(int);
84 extern int special_pnt_call(Object*, Symbol*, int);
85 extern void nrn_mk_prop_pools(int);
86 extern void SectionRef_reg(void);
87 
88 extern void hoc_symbol_tolerance(Symbol*, double);
89 extern void node_destruct(Node**, int);
90 extern void nrn_sec_ref(Section**, Section*);
91 extern void hoc_level_pushsec(Section*);
92 void nrn_ba(neuron::model_sorted_token const&, NrnThread&, int);
93 extern void nrn_rhs_ext(NrnThread*);
94 extern void nrn_setup_ext(NrnThread*);
98 extern void clear_point_process_struct(Prop* p);
99 extern void ext_con_coef(void);
100 extern void nrn_multisplit_ptr_update(void);
101 extern void nrn_use_daspk(int);
102 extern void nrn_update_ps2nt(void);
104 extern void activstim_rhs(void);
105 extern void activclamp_rhs(void);
106 extern void activclamp_lhs(void);
107 extern void activsynapse_rhs(void);
108 extern void activsynapse_lhs(void);
109 extern void stim_prepare(void);
110 extern void clamp_prepare(void);
111 extern void synapse_prepare(void);
112 
117 extern void v_setup_vectors(void);
118 extern void section_ref(Section*);
119 extern void section_unref(Section*);
120 extern const char* nrn_sec2pysecname(Section*);
121 extern double node_dist(Section*, Node*); // distance of node to parent position
122 extern double topol_distance(Section*, Node*, Section*, Node*, Section**, Node**);
123 extern void nrn_clear_mark(void);
124 extern short nrn_increment_mark(Section*);
125 extern short nrn_value_mark(Section*);
126 extern int is_point_process(Object*);
127 extern int nrn_vartype(const Symbol*); // nrnocCONST, DEP, STATE
128 extern void recalc_diam(void);
129 extern bool nrn_use_fast_imem;
130 void nrn_fast_imem_alloc();
131 extern void nrn_calc_fast_imem(NrnThread*);
132 extern void nrn_seg_or_x_arg(int iarg, Section** psec, double* px);
133 extern void nrn_seg_or_x_arg2(int iarg, Section** psec, double* px);
134 extern Section* nrnpy_pysecname2sec(const char*);
135 extern const char* nrnpy_sec2pysecname(Section* sec);
136 extern void nrnpy_pysecname2sec_add(Section* sec);
138 extern void nrn_verify_ion_charge_defined();
139 
140 extern void nrn_pt3dclear(Section*, int);
141 extern void nrn_length_change(Section*, double);
142 extern void stor_pt3d(Section*, double x, double y, double z, double d);
143 extern int nrn_netrec_state_adjust;
144 extern int nrn_sparse_partrans;
145 
146 char* nrn_version(int);
147 
148 /** @brief Get the number of NEURON configuration items.
149  */
150 [[nodiscard]] std::size_t nrn_num_config_keys();
151 
152 /** @brief Get the ith NEURON configuration key.
153  *
154  * @param i Key index, must be less than nrn_num_config_keys().
155  */
156 [[nodiscard]] char* nrn_get_config_key(std::size_t i);
157 
158 /** @brief Get the ith NEURON configuration value.
159  *
160  * @param i Key index, must be less than nrn_num_config_keys().
161  */
162 [[nodiscard]] char* nrn_get_config_val(std::size_t i);
163 
164 /**
165  In mechanism libraries, cannot use
166  auto const token = nrn_ensure_model_data_are_sorted();
167  because the return type is incomplete (from include/neuron/model_data.hpp).
168  And we do not want to fix by installing more *.hpp files in the
169  include/neuron directory because of potential ABI incompatibility (anything
170  with std::string anywhere in it).
171  The work around is to provide an extra layer of indirection via unique_ptr
172  so the opaque token has a definite size (one pointer) and declaration.
173 
174  The "trick" is just that you have to make sure the parts of the opaque
175  token that need the definition of the non-opaque token are defined in
176  the right place. That's why the constructor and destructor are defined
177  in fadvance.cpp
178 
179  Instead, use
180  auto const token = nrn_ensure_model_data_are_sorted_opaque();
181  This file is already included in all translated mod files.
182 **/
183 namespace neuron {
184 struct model_sorted_token;
188  operator model_sorted_token const &() const {
189  return *m_ptr;
190  }
191 
192  private:
193  std::unique_ptr<model_sorted_token> m_ptr;
194 };
195 } // namespace neuron
#define sec
Definition: md1redef.h:20
#define i
Definition: md1redef.h:19
static int indx
Definition: deriv.cpp:289
static int narg()
Definition: ivocvect.cpp:121
void(*)(Node *, Datum *, Datum *, NrnThread *, Memb_list *, std::size_t, neuron::model_sorted_token const &) nrn_bamech_t
Definition: membfunc.h:30
In mechanism libraries, cannot use auto const token = nrn_ensure_model_data_are_sorted(); because the...
Definition: tnode.hpp:17
void SectionRef_reg(void)
Definition: secref.cpp:363
int is_point_process(Object *)
Definition: point.cpp:370
double nrn_call_mech_func(Symbol *, int narg, Prop *, int type)
Definition: init.cpp:1259
void activclamp_lhs(void)
Definition: clamp.cpp:190
void activsynapse_rhs(void)
Definition: synapse.cpp:206
void extnode_free_elements(Extnode *)
Definition: extcelln.cpp:211
void nrn_clear_mark(void)
Definition: solve.cpp:426
void nrn_lhs(neuron::model_sorted_token const &, NrnThread &)
Definition: treeset.cpp:488
void nrn_rhs_ext(NrnThread *)
Definition: extcelln.cpp:340
void nrn_pt3dclear(Section *, int)
Definition: treeset.cpp:1087
void hoc_register_limits(int, HocParmLimits *)
Definition: init.cpp:1092
void nrn_calc_fast_imem(NrnThread *)
Definition: fadvance.cpp:610
void nrn_update_ps2nt(void)
Definition: netcvode.cpp:4871
void _nrn_watch_allocate(Datum *, double(*)(Point_process *), int, Point_process *, double nrflag)
Introduced so corenrn->nrn can request the mod file to make sure all WatchCondition are allocated.
Definition: netcvode.cpp:2430
void _nrn_watch_activate(Datum *, double(*)(Point_process *), int, Point_process *, int, double)
Definition: netcvode.cpp:2340
void nrn_verify_ion_charge_defined()
Definition: eion.cpp:263
void add_nrn_fornetcons(int, int)
Definition: init.cpp:205
void ext_con_coef(void)
Definition: extcelln.cpp:483
int nrn_is_ion(int)
Definition: eion.cpp:50
void nrn_update_voltage(neuron::model_sorted_token const &sorted_token, NrnThread &nt)
Definition: fadvance.cpp:572
int special_pnt_call(Object *, Symbol *, int)
Definition: hocmech.cpp:107
int nrn_pointing(double *p)
Definition: nrn_ansi.h:49
void hoc_level_pushsec(Section *)
turn off section stack fixing (in case of return, continue, break in a section statement) between exp...
Definition: cabcode.cpp:2187
void nrn_seg_or_x_arg2(int iarg, Section **psec, double *px)
Definition: point.cpp:186
void hoc_register_dparam_semantics(int, int, const char *)
Legacy way of registering pdata semantics.
Definition: init.cpp:980
short nrn_value_mark(Section *)
Definition: solve.cpp:434
void nrn_relocate_old_points(Section *oldsec, Node *oldnode, Section *sec, Node *node)
Definition: point.cpp:153
void nrn_area_ri(Section *sec)
Definition: treeset.cpp:752
void second_order_cur(NrnThread *)
Definition: eion.cpp:640
void clamp_prepare(void)
Definition: clamp.cpp:154
void nrn_mk_prop_pools(int)
Definition: cxprop.cpp:27
void synapse_prepare(void)
Definition: synapse.cpp:198
int nrn_vartype(const Symbol *)
Definition: eion.cpp:503
void activstim_rhs(void)
Definition: fstim.cpp:162
int nrn_isecstack(void)
Definition: cabcode.cpp:85
int nrn_netrec_state_adjust
Definition: init.cpp:111
void hoc_register_units(int, HocParmUnits *)
Definition: init.cpp:1109
const char * nrnpy_sec2pysecname(Section *sec)
void activclamp_rhs(void)
Definition: clamp.cpp:172
void setup_tree_matrix(neuron::model_sorted_token const &sorted_token, NrnThread &nt)
Definition: treeset.cpp:599
void hoc_reg_ba(int, nrn_bamech_t, int)
Definition: init.cpp:1126
void stor_pt3d(Section *, double x, double y, double z, double d)
Definition: treeset.cpp:1332
void nrnpy_pysecname2sec_add(Section *sec)
void nrn_solve(NrnThread *)
Definition: solve.cpp:333
int state_discon_allowed_
Definition: init.cpp:108
void nrn_div_capacity(neuron::model_sorted_token const &, NrnThread *, Memb_list *)
Definition: capac.cpp:91
void section_ref(Section *)
Definition: solve.cpp:520
void stim_prepare(void)
Definition: fstim.cpp:154
void clear_point_process_struct(Prop *p)
Definition: point.cpp:347
std::size_t nrn_num_config_keys()
Get the number of NEURON configuration items.
Definition: nrnversion.cpp:85
void hoc_symbol_tolerance(Symbol *, double)
Definition: code2.cpp:111
neuron::container::data_handle< double > dprop(Symbol *s, int indx, Section *sec, short inode)
returns location of property symbol
Definition: cabcode.cpp:1922
char * nrn_version(int)
Definition: nrnversion.cpp:27
void hoc_register_tolerance(int, HocStateTolerance *, Symbol ***)
Definition: init.cpp:1175
void hoc_register_dparam_size(int, int)
int section_object_seen
Definition: hoc_oop.cpp:28
double node_dist(Section *, Node *)
Definition: solve.cpp:153
void nrn_random_play()
Definition: extdef.h:10
double topol_distance(Section *, Node *, Section *, Node *, Section **, Node **)
Definition: solve.cpp:167
void nrn_ba(neuron::model_sorted_token const &, NrnThread &, int)
Definition: fadvance.cpp:989
int can_change_morph(Section *)
Definition: treeset.cpp:1228
bool nrn_use_fast_imem
Definition: fadvance.cpp:147
void nrn_fixed_step(neuron::model_sorted_token const &)
Definition: fadvance.cpp:324
char * nrn_get_config_val(std::size_t i)
Get the ith NEURON configuration value.
Definition: nrnversion.cpp:94
void section_unref(Section *)
Definition: solve.cpp:509
void modl_reg(void)
Needed for compilation.
Definition: inithoc.cpp:414
void prop_free(Prop **)
Definition: treeset.cpp:710
void activsynapse_lhs(void)
Definition: synapse.cpp:215
void extcell_2d_alloc(Section *sec)
Definition: extcelln.cpp:328
void section_order(void)
Definition: solve.cpp:729
void sec_free(hoc_Item *)
Definition: solve.cpp:467
void nrn_diam_change(Section *)
Definition: treeset.cpp:1185
void nrn_rhs(neuron::model_sorted_token const &, NrnThread &)
Definition: treeset.cpp:375
void nrn_seg_or_x_arg(int iarg, Section **psec, double *px)
Definition: point.cpp:170
void nrn_fast_imem_alloc()
Definition: multicore.cpp:377
void nrn_multisplit_ptr_update(void)
void nrn_use_daspk(int)
Definition: netcvode.cpp:282
void _nrn_free_watch(Datum *, int, int)
Called by Point_process destructor in translated mod file.
Definition: netcvode.cpp:2469
void nrn_mul_capacity(neuron::model_sorted_token const &, NrnThread *, Memb_list *)
Definition: capac.cpp:78
void node_destruct(Node **, int)
Definition: solve.cpp:569
void nrn_length_change(Section *, double)
Definition: treeset.cpp:1205
void nrn_fihexec(int)
Definition: finithnd.cpp:33
void single_prop_free(Prop *)
Definition: treeset.cpp:718
void nrn_fixed_step_lastpart(neuron::model_sorted_token const &sorted_token, NrnThread &nt)
Definition: fadvance.cpp:502
void nrn_popsec(void)
Definition: cabcode.cpp:154
void extcell_node_create(Node *)
Definition: extcelln.cpp:302
void recalc_diam(void)
Definition: treeset.cpp:923
int nrn_errno_check(int)
Definition: fadvance.cpp:767
void nrn_fixed_step_group(neuron::model_sorted_token const &, int n)
Definition: fadvance.cpp:379
void v_setup_vectors(void)
Definition: treeset.cpp:1596
void nrn_cap_jacob(neuron::model_sorted_token const &, NrnThread *, Memb_list *)
Definition: capac.cpp:39
void _nrn_free_fornetcon(void **)
Definition: netcvode.cpp:4110
void nrn_sec_ref(Section **, Section *)
Definition: solve.cpp:525
const char * nrn_sec2pysecname(Section *)
Definition: cabcode.cpp:1703
void nrn_secstack(int)
Definition: cabcode.cpp:89
char * nrn_get_config_key(std::size_t i)
Get the ith NEURON configuration key.
Definition: nrnversion.cpp:89
void nrnpy_pysecname2sec_remove(Section *sec)
int nrn_sparse_partrans
Definition: init.cpp:112
short nrn_increment_mark(Section *)
Definition: solve.cpp:431
neuron::model_sorted_token nrn_ensure_model_data_are_sorted()
Ensure neuron::container::* data are sorted.
Definition: treeset.cpp:2182
void long_difus_solve(neuron::model_sorted_token const &, int method, NrnThread &nt)
Definition: ldifus.cpp:86
void fixed_play_continuous(NrnThread *)
Definition: cvodestb.cpp:82
Section * nrnpy_pysecname2sec(const char *)
void nrn_setup_ext(NrnThread *)
Definition: extcelln.cpp:417
neuron::opaque_model_sorted_token nrn_ensure_model_data_are_sorted_opaque()
Definition: fadvance.cpp:1069
static Node * node(Object *)
Definition: netcvode.cpp:291
int const size_t const size_t n
Definition: nrngsl.h:10
size_t p
s
Definition: multisend.cpp:521
short type
Definition: cabvars.h:10
A view into a set of mechanism instances.
Definition: nrnoc_ml.h:34
Definition: section.h:105
Represent main neuron object computed by single thread.
Definition: multicore.h:58
Definition: hocdec.h:173
A point process is computed just like regular mechanisms.
Definition: section_fwd.hpp:77
Definition: section.h:231
Definition: model.h:47
Non-template stable handle to a generic value.
std::unique_ptr< model_sorted_token > m_ptr
Definition: nrn_ansi.h:193
opaque_model_sorted_token(model_sorted_token &&)
Definition: fadvance.cpp:1064