NEURON
nrncore_callbacks.h
Go to the documentation of this file.
1 #ifndef NRN_NRNCORE_CALLBACKS_H
2 #define NRN_NRNCORE_CALLBACKS_H
3 
4 #include <fstream>
5 #include <sstream>
6 #include <vector>
7 #include <set>
8 #include <cstdlib>
9 // includers need several pieces of info for nrn_get_partrans_setup_info
10 #include "partrans.h"
11 
12 typedef void* (*CNB)(...);
13 typedef struct core2nrn_callback_t {
14  const char* name;
15  CNB f;
17 
18 // Mechanism type to be used from stdindex2ptr (in CoreNeuron) and nrn_dblpntr2nrncore.
19 // Values of the mechanism types should be negative numbers to avoid any conflict with
20 // mechanism types of Memb_list(>0) or time(0) passed to CoreNeuron
21 enum mech_type { voltage = -1, i_membrane_ = -2 };
22 
23 class Memb_list;
24 class NrnThread;
25 class CellGroup;
26 class DatumIndices;
27 
28 extern "C" {
29 
30 void write_memb_mech_types_direct(std::ostream& s);
31 void part2_clean();
32 
33 int get_global_int_item(const char* name);
34 void* get_global_dbl_item(void* p, const char*& name, int& size, double*& val);
35 
36 
37 void nrnthread_group_ids(int* groupids);
38 int nrnthread_dat1(int tid,
39  int& n_presyn,
40  int& n_netcon,
41  int*& output_gid,
42  int*& netcon_srcgid,
43  std::vector<int>& netcon_negsrcgid_tid);
44 int nrnthread_dat2_1(int tid,
45  int& ngid,
46  int& n_real_gid,
47  int& nnode,
48  int& ndiam,
49  int& nmech,
50  int*& tml_index,
51  int*& ml_nodecount,
52  int& nidata,
53  int& nvdata,
54  int& nweight);
55 int nrnthread_dat2_2(int tid,
56  int*& v_parent_index,
57  double*& a,
58  double*& b,
59  double*& area,
60  double*& v,
61  double*& diamvec);
62 int nrnthread_dat2_mech(int tid,
63  size_t i,
64  int dsz_inst,
65  int*& nodeindices,
66  double*& data,
67  int*& pdata,
68  std::vector<int>& pointer2type);
69 int nrnthread_dat2_3(int tid,
70  int nweight,
71  int*& output_vindex,
72  double*& output_threshold,
73  int*& netcon_pnttype,
74  int*& netcon_pntindex,
75  double*& weights,
76  double*& delays);
77 int nrnthread_dat2_corepointer(int tid, int& n);
79  int type,
80  int& icnt,
81  int& dcnt,
82  int*& iarray,
83  double*& darray);
84 int nrnthread_dat2_vecplay(int tid, std::vector<int>& n);
85 int nrnthread_dat2_vecplay_inst(int tid,
86  int i,
87  int& vptype,
88  int& mtype,
89  int& ix,
90  int& sz,
91  double*& yvec,
92  double*& tvec,
93  int& last_index,
94  int& discon_index,
95  int& ubound_index);
96 
97 int* datum2int(int type,
98  Memb_list* ml,
99  NrnThread& nt,
100  CellGroup& cg,
101  DatumIndices& di,
102  int ml_vdata_offset,
103  std::vector<int>& pointer2type);
104 }
105 
106 extern "C" {
108  int& bsize,
109  int& ntrajec,
110  void**& vpr,
111  int*& types,
112  int*& indices,
113  double**& pvars,
114  double**& varrays);
115 void nrnthread_trajectory_values(int tid, int n_pr, void** vpr, double t);
116 void nrnthread_trajectory_return(int tid, int n_pr, int bsize, int vecsz, void** vpr, double t);
117 }
118 
119 extern "C" {
120 int nrnthread_all_spike_vectors_return(std::vector<double>& spiketvec,
121  std::vector<int>& spikegidvec);
122 void nrnthreads_all_weights_return(std::vector<double*>& weights);
123 size_t nrnthreads_type_return(int type, int tid, double*& data, double**& mdata);
124 int core2nrn_corepointer_mech(int tid, int type, int icnt, int dcnt, int* iarray, double* darray);
125 }
126 
127 // For direct transfer of event queue information from CoreNEURON
128 extern "C" {
129 void core2nrn_clear_queues(double t);
130 
131 void core2nrn_NetCon_event(int tid, double td, size_t nc_index);
132 
133 void core2nrn_SelfEvent_event(int tid,
134  double td,
135  int tar_type,
136  int tar_index,
137  double flag,
138  size_t nc_index,
139  int is_movable);
140 
142  double td,
143  int tar_type,
144  int tar_index,
145  double flag,
146  int is_movable);
147 
148 // Set of the voltage indices in which PreSyn.flag_ == true
149 void core2nrn_PreSyn_flag(int tid, std::set<int> presyns_flag_true);
150 } // end of extern "C"
151 
152 // For direct transfer of event queue information to CoreNEURON
153 // Must be the same as corresponding struct NrnCoreTransferEvents in CoreNEURON
155  std::vector<int> type; // DiscreteEvent type
156  std::vector<double> td; // delivery time
157  std::vector<int> intdata; // ints specific to the DiscreteEvent type
158  std::vector<double> dbldata; // doubles specific to the type.
159 };
160 
161 // For direct transfer of CoreNEURON WATCH activation back to NEURON
162 typedef std::vector<std::pair<int, bool>> Core2NrnWatchInfoItem;
163 typedef std::vector<Core2NrnWatchInfoItem> Core2NrnWatchInfo;
164 
165 extern "C" {
167 
168 // per item direct transfer of WatchCondition
169 void nrn2core_transfer_WATCH(void (*cb)(int, int, int, int, int));
170 
171 void nrn_watch_clear();
172 void core2nrn_watch_activate(int tid, int type, int wbegin, Core2NrnWatchInfo&);
173 
174 // per VecPlayContinous direct transfer of instance indices.
175 void core2nrn_vecplay(int tid, int i_nrn, int last_index, int discon_index, int ubound_index);
177 
178 // Add the voltage indices in which PreSyn.flag_ == true to the set.
179 void nrn2core_PreSyn_flag(int tid, std::set<int>& presyns_flag_true);
180 
181 // Direct transfer with respect to PatternStim
182 void nrn2core_patternstim(void** info);
183 
184 } // end of extern "C"
185 
187  {"nrn2core_group_ids_", (CNB) nrnthread_group_ids},
188  {"nrn2core_mkmech_info_", (CNB) write_memb_mech_types_direct},
189  {"nrn2core_get_global_dbl_item_", (CNB) get_global_dbl_item},
190  {"nrn2core_get_global_int_item_", (CNB) get_global_int_item},
191  {"nrn2core_get_partrans_setup_info_", (CNB) nrn_get_partrans_setup_info},
192  {"nrn2core_get_dat1_", (CNB) nrnthread_dat1},
193  {"nrn2core_get_dat2_1_", (CNB) nrnthread_dat2_1},
194  {"nrn2core_get_dat2_2_", (CNB) nrnthread_dat2_2},
195  {"nrn2core_get_dat2_mech_", (CNB) nrnthread_dat2_mech},
196  {"nrn2core_get_dat2_3_", (CNB) nrnthread_dat2_3},
197  {"nrn2core_get_dat2_corepointer_", (CNB) nrnthread_dat2_corepointer},
198  {"nrn2core_get_dat2_corepointer_mech_", (CNB) nrnthread_dat2_corepointer_mech},
199  {"nrn2core_get_dat2_vecplay_", (CNB) nrnthread_dat2_vecplay},
200  {"nrn2core_get_dat2_vecplay_inst_", (CNB) nrnthread_dat2_vecplay_inst},
201  {"nrn2core_part2_clean_", (CNB) part2_clean},
202 
203  {"nrn2core_get_trajectory_requests_", (CNB) nrnthread_get_trajectory_requests},
204  {"nrn2core_trajectory_values_", (CNB) nrnthread_trajectory_values},
205  {"nrn2core_trajectory_return_", (CNB) nrnthread_trajectory_return},
206 
207  {"nrn2core_all_spike_vectors_return_", (CNB) nrnthread_all_spike_vectors_return},
208  {"nrn2core_all_weights_return_", (CNB) nrnthreads_all_weights_return},
209  {"nrn2core_type_return_", (CNB) nrnthreads_type_return},
210 
211  {"nrn2core_transfer_tqueue_", (CNB) nrn2core_transfer_tqueue},
212  {"nrn2core_transfer_watch_", (CNB) nrn2core_transfer_WATCH},
213  {"nrn2core_transfer_PreSyn_flag_", (CNB) nrn2core_PreSyn_flag},
214  {"core2nrn_watch_clear_", (CNB) nrn_watch_clear},
215  {"core2nrn_watch_activate_", (CNB) core2nrn_watch_activate},
216  {"core2nrn_vecplay_", (CNB) core2nrn_vecplay},
217  {"core2nrn_vecplay_events_", (CNB) core2nrn_vecplay_events},
218 
219  {"core2nrn_clear_queues_", (CNB) core2nrn_clear_queues},
220  {"core2nrn_corepointer_mech_", (CNB) core2nrn_corepointer_mech},
221  {"core2nrn_NetCon_event_", (CNB) core2nrn_NetCon_event},
222  {"core2nrn_SelfEvent_event_", (CNB) core2nrn_SelfEvent_event},
223  {"core2nrn_SelfEvent_event_noweight_", (CNB) core2nrn_SelfEvent_event_noweight},
224  {"core2nrn_PreSyn_flag_", (CNB) core2nrn_PreSyn_flag},
225 
226  {"nrn2core_patternstim_", (CNB) nrn2core_patternstim},
227 
228  {NULL, NULL}};
229 
230 
231 void map_coreneuron_callbacks(void* handle);
232 
233 #endif // NRN_NRNCORE_CALLBACKS_H
void cb(const char *s)
Definition: bbstest.cpp:5
short type
Definition: cabvars.h:9
double t
Definition: cvodeobj.cpp:59
#define nodeindices
Definition: md1redef.h:26
#define area
Definition: md1redef.h:5
#define v
Definition: md1redef.h:4
#define i
Definition: md1redef.h:12
#define pdata
Definition: md1redef.h:28
char * name
Definition: init.cpp:16
static List * info
static core2nrn_callback_t cnbs[]
void nrn2core_transfer_WATCH(void(*cb)(int, int, int, int, int))
Definition: netcvode.cpp:6161
void *(* CNB)(...)
NrnCoreTransferEvents * nrn2core_transfer_tqueue(int tid)
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:6054
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:1329
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.
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 nrnthread_dat2_1(int tid, 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 * 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()
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
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:6097
void write_memb_mech_types_direct(std::ostream &s)
int nrnthread_dat2_mech(int tid, size_t i, int dsz_inst, int *&nodeindices, double *&data, int *&pdata, std::vector< int > &pointer2type)
mech_type
@ i_membrane_
@ voltage
void nrnthread_group_ids(int *groupids)
int nrnthread_dat1(int tid, int &n_presyn, int &n_netcon, int *&output_gid, int *&netcon_srcgid, std::vector< int > &netcon_negsrcgid_tid)
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)
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...
size_t nrnthreads_type_return(int type, int tid, double *&data, double **&mdata)
Return location for CoreNEURON to copy data into.
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:2620
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:11
size_t p
SetupTransferInfo * nrn_get_partrans_setup_info(int ngroup, int cn_nthread, size_t cn_sidt_sz)
Definition: partrans.cpp:1117
#define data
Definition: rbtqueue.cpp:49
#define NULL
Definition: sptree.h:16
std::vector< double > dbldata
std::vector< double > td
std::vector< int > intdata
std::vector< int > type
Represent main neuron object computed by single thread.
Definition: multicore.h:58