NEURON
nrncore_callbacks.h
Go to the documentation of this file.
1 #pragma once
2 
3 #include <fstream>
4 #include <sstream>
5 #include <vector>
6 #include <set>
7 #include <cstdlib>
8 #include <inttypes.h>
9 
10 // includers need several pieces of info for nrn_get_partrans_setup_info
11 #include "partrans.h"
12 
13 typedef void* (*CNB)(...);
14 typedef struct core2nrn_callback_t {
15  const char* name;
16  CNB f;
18 
19 // Mechanism type to be used from legacy_index2pointer (in CoreNeuron) and nrn_dblpntr2nrncore.
20 // Values of the mechanism types should be negative numbers to avoid any conflict with
21 // mechanism types of Memb_list(>0) or time(0) passed to CoreNeuron
22 enum mech_type { voltage = -1, i_membrane_ = -2 };
23 
24 struct Memb_list;
25 struct NrnThread;
26 class CellGroup;
27 class DatumIndices;
28 
29 extern "C" {
30 
31 void write_memb_mech_types_direct(std::ostream& s);
32 void part2_clean();
33 
34 int get_global_int_item(const char* name);
35 void* get_global_dbl_item(void* p, const char*& name, int& size, double*& val);
36 
37 
38 void nrnthread_group_ids(int* groupids);
39 int nrnthread_dat1(int tid,
40  int& n_presyn,
41  int& n_netcon,
42  std::vector<int>& output_gid,
43  int*& netcon_srcgid,
44  std::vector<int>& netcon_negsrcgid_tid);
45 int nrnthread_dat2_1(int tid,
46  int& n_real_cell,
47  int& ngid,
48  int& n_real_gid,
49  int& nnode,
50  int& ndiam,
51  int& nmech,
52  int*& tml_index,
53  int*& ml_nodecount,
54  int& nidata,
55  int& nvdata,
56  int& nweight);
57 int nrnthread_dat2_2(int tid,
58  int*& v_parent_index,
59  double*& a,
60  double*& b,
61  double*& area,
62  double*& v,
63  double*& diamvec);
64 int nrnthread_dat2_mech(int tid,
65  size_t i,
66  int dsz_inst,
67  int*& nodeindices,
68  double*& data,
69  int*& pdata,
70  std::vector<uint32_t>& nmodlrandom,
71  std::vector<int>& pointer2type);
72 int nrnthread_dat2_3(int tid,
73  int nweight,
74  int*& output_vindex,
75  double*& output_threshold,
76  int*& netcon_pnttype,
77  int*& netcon_pntindex,
78  double*& weights,
79  double*& delays);
80 int nrnthread_dat2_corepointer(int tid, int& n);
82  int type,
83  int& icnt,
84  int& dcnt,
85  int*& iarray,
86  double*& darray);
87 int nrnthread_dat2_vecplay(int tid, std::vector<int>& n);
88 int nrnthread_dat2_vecplay_inst(int tid,
89  int i,
90  int& vptype,
91  int& mtype,
92  int& ix,
93  int& sz,
94  double*& yvec,
95  double*& tvec,
96  int& last_index,
97  int& discon_index,
98  int& ubound_index);
99 void nrnthread_dat3_cell_count(int& cell_count);
100 void nrnthread_dat3_cellmapping(int i, int& gid, int& nsec, int& nseg, int& n_seclist);
101 void nrnthread_dat3_secmapping(int i_c,
102  int i_sec,
103  std::string& sclname,
104  int& nsec,
105  int& nseg,
106  size_t& total_lfp_factors,
107  int& n_electrodes,
108  std::vector<int>& data_sec,
109  std::vector<int>& data_seg,
110  std::vector<double>& data_lfp);
111 
112 int* datum2int(int type,
113  Memb_list* ml,
114  NrnThread& nt,
115  CellGroup& cg,
116  DatumIndices& di,
117  int ml_vdata_offset,
118  std::vector<int>& pointer2type);
119 }
120 
121 extern "C" {
123  int& bsize,
124  int& ntrajec,
125  void**& vpr,
126  int*& types,
127  int*& indices,
128  double**& pvars,
129  double**& varrays);
130 void nrnthread_trajectory_values(int tid, int n_pr, void** vpr, double t);
131 void nrnthread_trajectory_return(int tid, int n_pr, int bsize, int vecsz, void** vpr, double t);
132 }
133 
134 extern "C" {
135 int nrnthread_all_spike_vectors_return(std::vector<double>& spiketvec,
136  std::vector<int>& spikegidvec);
137 void nrnthreads_all_weights_return(std::vector<double*>& weights);
138 size_t nrnthreads_type_return(int type, int tid, double*& data, std::vector<double*>& mdata);
139 int core2nrn_corepointer_mech(int tid, int type, int icnt, int dcnt, int* iarray, double* darray);
140 int core2nrn_nmodlrandom(int tid,
141  int type,
142  const std::vector<int>& indices,
143  const std::vector<double>& nmodlrandom);
144 }
145 
146 // For direct transfer of event queue information from CoreNEURON
147 extern "C" {
148 void core2nrn_clear_queues(double t);
149 
150 void core2nrn_NetCon_event(int tid, double td, size_t nc_index);
151 
152 void core2nrn_SelfEvent_event(int tid,
153  double td,
154  int tar_type,
155  int tar_index,
156  double flag,
157  size_t nc_index,
158  int is_movable);
159 
161  double td,
162  int tar_type,
163  int tar_index,
164  double flag,
165  int is_movable);
166 
167 // Set of the voltage indices in which PreSyn.flag_ == true
168 void core2nrn_PreSyn_flag(int tid, std::set<int> presyns_flag_true);
169 } // end of extern "C"
170 
171 // For direct transfer of event queue information to CoreNEURON
172 // Must be the same as corresponding struct NrnCoreTransferEvents in CoreNEURON
173 struct NrnCoreTransferEvents {
174  std::vector<int> type; // DiscreteEvent type
175  std::vector<double> td; // delivery time
176  std::vector<int> intdata; // ints specific to the DiscreteEvent type
177  std::vector<double> dbldata; // doubles specific to the type.
178 };
179 
180 // For direct transfer of CoreNEURON WATCH activation back to NEURON
181 typedef std::vector<std::pair<int, bool>> Core2NrnWatchInfoItem;
182 typedef std::vector<Core2NrnWatchInfoItem> Core2NrnWatchInfo;
183 
184 void nrn_watch_clear();
185 
186 extern "C" {
188 
189 // per item direct transfer of WatchCondition
190 void nrn2core_transfer_WATCH(void (*cb)(int, int, int, int, int));
191 
192 void core2nrn_watch_activate(int tid, int type, int wbegin, Core2NrnWatchInfo&);
193 
194 // per VecPlayContinous direct transfer of instance indices.
195 void core2nrn_vecplay(int tid, int i_nrn, int last_index, int discon_index, int ubound_index);
197 
198 // Add the voltage indices in which PreSyn.flag_ == true to the set.
199 void nrn2core_PreSyn_flag(int tid, std::set<int>& presyns_flag_true);
200 
201 // Direct transfer with respect to PatternStim
202 void nrn2core_patternstim(void** info);
203 
204 // Info from NEURON subworlds at beginning of psolve.
205 void nrn2core_subworld_info(int& cnt,
206  int& subworld_index,
207  int& subworld_rank,
208  int& subworld_size,
209  int& numprocs_world);
210 
211 } // end of extern "C"
212 
214  {"nrn2core_group_ids_", (CNB) nrnthread_group_ids},
215  {"nrn2core_mkmech_info_", (CNB) write_memb_mech_types_direct},
216  {"nrn2core_get_global_dbl_item_", (CNB) get_global_dbl_item},
217  {"nrn2core_get_global_int_item_", (CNB) get_global_int_item},
218  {"nrn2core_get_partrans_setup_info_", (CNB) nrn_get_partrans_setup_info},
219  {"nrn2core_get_dat1_", (CNB) nrnthread_dat1},
220  {"nrn2core_get_dat2_1_", (CNB) nrnthread_dat2_1},
221  {"nrn2core_get_dat2_2_", (CNB) nrnthread_dat2_2},
222  {"nrn2core_get_dat2_mech_", (CNB) nrnthread_dat2_mech},
223  {"nrn2core_get_dat2_3_", (CNB) nrnthread_dat2_3},
224  {"nrn2core_get_dat2_corepointer_", (CNB) nrnthread_dat2_corepointer},
225  {"nrn2core_get_dat2_corepointer_mech_", (CNB) nrnthread_dat2_corepointer_mech},
226  {"nrn2core_get_dat2_vecplay_", (CNB) nrnthread_dat2_vecplay},
227  {"nrn2core_get_dat2_vecplay_inst_", (CNB) nrnthread_dat2_vecplay_inst},
228  {"nrn2core_part2_clean_", (CNB) part2_clean},
229  {"nrn2core_get_dat3_cell_count_", (CNB) nrnthread_dat3_cell_count},
230  {"nrn2core_get_dat3_cellmapping_", (CNB) nrnthread_dat3_cellmapping},
231  {"nrn2core_get_dat3_secmapping_", (CNB) nrnthread_dat3_secmapping},
232 
233  {"nrn2core_get_trajectory_requests_", (CNB) nrnthread_get_trajectory_requests},
234  {"nrn2core_trajectory_values_", (CNB) nrnthread_trajectory_values},
235  {"nrn2core_trajectory_return_", (CNB) nrnthread_trajectory_return},
236 
237  {"nrn2core_all_spike_vectors_return_", (CNB) nrnthread_all_spike_vectors_return},
238  {"nrn2core_all_weights_return_", (CNB) nrnthreads_all_weights_return},
239  {"nrn2core_type_return_", (CNB) nrnthreads_type_return},
240 
241  {"nrn2core_transfer_tqueue_", (CNB) nrn2core_transfer_tqueue},
242  {"nrn2core_transfer_watch_", (CNB) nrn2core_transfer_WATCH},
243  {"nrn2core_transfer_PreSyn_flag_", (CNB) nrn2core_PreSyn_flag},
244  {"core2nrn_watch_clear_", (CNB) nrn_watch_clear},
245  {"core2nrn_watch_activate_", (CNB) core2nrn_watch_activate},
246  {"core2nrn_vecplay_", (CNB) core2nrn_vecplay},
247  {"core2nrn_vecplay_events_", (CNB) core2nrn_vecplay_events},
248 
249  {"core2nrn_clear_queues_", (CNB) core2nrn_clear_queues},
250  {"core2nrn_corepointer_mech_", (CNB) core2nrn_corepointer_mech},
251  {"core2nrn_nmodlrandom_", (CNB) core2nrn_nmodlrandom},
252  {"core2nrn_NetCon_event_", (CNB) core2nrn_NetCon_event},
253  {"core2nrn_SelfEvent_event_", (CNB) core2nrn_SelfEvent_event},
254  {"core2nrn_SelfEvent_event_noweight_", (CNB) core2nrn_SelfEvent_event_noweight},
255  {"core2nrn_PreSyn_flag_", (CNB) core2nrn_PreSyn_flag},
256 
257  {"nrn2core_patternstim_", (CNB) nrn2core_patternstim},
258 
259  {"nrn2core_subworld_info_", (CNB) nrn2core_subworld_info},
260 
261  {NULL, NULL}};
262 
263 
264 void map_coreneuron_callbacks(void* handle);
#define cnt
Definition: tqueue.hpp:44
#define nodeindices
Definition: md1redef.h:35
#define area
Definition: md1redef.h:12
#define v
Definition: md1redef.h:11
#define weights
Definition: md1redef.h:42
#define i
Definition: md1redef.h:19
#define pdata
Definition: md1redef.h:37
const char * name
Definition: init.cpp:16
handle_interface< non_owning_identifier< storage > > handle
Non-owning handle to a Mechanism instance.
static List * info
static core2nrn_callback_t cnbs[]
void nrn2core_transfer_WATCH(void(*cb)(int, int, int, int, int))
Definition: netcvode.cpp:5945
int nrnthread_dat1(int tid, int &n_presyn, int &n_netcon, std::vector< int > &output_gid, int *&netcon_srcgid, std::vector< int > &netcon_negsrcgid_tid)
void *(* CNB)(...)
size_t nrnthreads_type_return(int type, int tid, double *&data, std::vector< double * > &mdata)
Return location for CoreNEURON to copy data into.
NrnCoreTransferEvents * nrn2core_transfer_tqueue(int tid)
void nrnthread_dat3_cell_count(int &cell_count)
int core2nrn_corepointer_mech(int tid, int type, int icnt, int dcnt, int *iarray, double *darray)
void nrnthread_trajectory_values(int tid, int n_pr, void **vpr, double t)
Definition: netcvode.cpp:5839
int nrnthread_dat2_1(int tid, int &n_real_cell, int &ngid, int &n_real_gid, int &nnode, int &ndiam, int &nmech, int *&tml_index, int *&ml_nodecount, int &nidata, int &nvdata, int &nweight)
int nrnthread_all_spike_vectors_return(std::vector< double > &spiketvec, std::vector< int > &spikegidvec)
NEURON callback used from CORENEURON to transfer all spike vectors after simulation.
Definition: netpar.cpp:1320
void core2nrn_NetCon_event(int tid, double td, size_t nc_index)
Called from CoreNEURON core2nrn_tqueue_item.
int nrnthread_dat2_3(int tid, int nweight, int *&output_vindex, double *&output_threshold, int *&netcon_pnttype, int *&netcon_pntindex, double *&weights, double *&delays)
int nrnthread_dat2_vecplay(int tid, std::vector< int > &n)
void map_coreneuron_callbacks(void *handle)
Populate function pointers by mapping function pointers for callback.
void nrnthread_dat3_cellmapping(int i, int &gid, int &nsec, int &nseg, int &n_seclist)
std::vector< Core2NrnWatchInfoItem > Core2NrnWatchInfo
void * get_global_dbl_item(void *p, const char *&name, int &size, double *&val)
void nrn2core_PreSyn_flag(int tid, std::set< int > &presyns_flag_true)
int * datum2int(int type, Memb_list *ml, NrnThread &nt, CellGroup &cg, DatumIndices &di, int ml_vdata_offset, std::vector< int > &pointer2type)
void core2nrn_SelfEvent_event(int tid, double td, int tar_type, int tar_index, double flag, size_t nc_index, int is_movable)
void part2_clean()
void nrnthread_dat3_secmapping(int i_c, int i_sec, std::string &sclname, int &nsec, int &nseg, size_t &total_lfp_factors, int &n_electrodes, std::vector< int > &data_sec, std::vector< int > &data_seg, std::vector< double > &data_lfp)
struct core2nrn_callback_t core2nrn_callback_t
void core2nrn_SelfEvent_event_noweight(int tid, double td, int tar_type, int tar_index, double flag, int is_movable)
void nrnthread_get_trajectory_requests(int tid, int &bsize, int &ntrajec, void **&vpr, int *&types, int *&indices, double **&pvars, double **&varrays)
int nrnthread_dat2_vecplay_inst(int tid, int i, int &vptype, int &mtype, int &ix, int &sz, double *&yvec, double *&tvec, int &last_index, int &discon_index, int &ubound_index)
void core2nrn_vecplay_events()
start the vecplay events
int core2nrn_nmodlrandom(int tid, int type, const std::vector< int > &indices, const std::vector< double > &nmodlrandom)
void core2nrn_PreSyn_flag(int tid, std::set< int > presyns_flag_true)
void nrnthread_trajectory_return(int tid, int n_pr, int bsize, int vecsz, void **vpr, double t)
Definition: netcvode.cpp:5881
void write_memb_mech_types_direct(std::ostream &s)
mech_type
@ i_membrane_
@ voltage
void nrnthread_group_ids(int *groupids)
void nrnthreads_all_weights_return(std::vector< double * > &weights)
Copy weights from all coreneuron::NrnThread to NetCon instances.
std::vector< std::pair< int, bool > > Core2NrnWatchInfoItem
int get_global_int_item(const char *name)
int nrnthread_dat2_corepointer(int tid, int &n)
void nrn2core_subworld_info(int &cnt, int &subworld_index, int &subworld_rank, int &subworld_size, int &numprocs_world)
int nrnthread_dat2_2(int tid, int *&v_parent_index, double *&a, double *&b, double *&area, double *&v, double *&diamvec)
void core2nrn_watch_activate(int tid, int type, int wbegin, Core2NrnWatchInfo &)
void core2nrn_clear_queues(double t)
Initialize queues before transfer Probably aleady clear, but if binq then must be initialized to time...
int nrnthread_dat2_mech(int tid, size_t i, int dsz_inst, int *&nodeindices, double *&data, int *&pdata, std::vector< uint32_t > &nmodlrandom, std::vector< int > &pointer2type)
void nrn2core_patternstim(void **info)
void core2nrn_vecplay(int tid, int i_nrn, int last_index, int discon_index, int ubound_index)
getting one item at a time from CoreNEURON
void nrn_watch_clear()
Watch info corenrn->nrn transfer requires all activated WatchCondition be deactivated prior to mirror...
Definition: netcvode.cpp:2456
int nrnthread_dat2_corepointer_mech(int tid, int type, int &icnt, int &dcnt, int *&iarray, double *&darray)
int const size_t const size_t n
Definition: nrngsl.h:10
size_t p
s
Definition: multisend.cpp:521
SetupTransferInfo * nrn_get_partrans_setup_info(int ngroup, int cn_nthread, size_t cn_sidt_sz)
Definition: partrans.cpp:981
short type
Definition: cabvars.h:10
#define NULL
Definition: spdefs.h:105
A view into a set of mechanism instances.
Definition: nrnoc_ml.h:34
std::vector< double > td
std::vector< double > dbldata
std::vector< int > intdata
Represent main neuron object computed by single thread.
Definition: multicore.h:58