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, int& n_presyn, int& n_netcon,
39  int*& output_gid, int*& netcon_srcgid,
40  std::vector<int>& netcon_negsrcgid_tid);
41 int nrnthread_dat2_1(int tid, int& ngid, int& n_real_gid, int& nnode, int& ndiam,
42  int& nmech, int*& tml_index, int*& ml_nodecount, int& nidata,
43  int& nvdata, int& nweight);
44 int nrnthread_dat2_2(int tid, int*& v_parent_index, double*& a, double*& b,
45  double*& area, double*& v, double*& diamvec);
46 int nrnthread_dat2_mech(int tid, size_t i, int dsz_inst, int*& nodeindices,
47  double*& data, int*& pdata, std::vector<int>& pointer2type);
48 int nrnthread_dat2_3(int tid, int nweight, int*& output_vindex, double*& output_threshold,
49  int*& netcon_pnttype, int*& netcon_pntindex, double*& weights, double*& delays);
50 int nrnthread_dat2_corepointer(int tid, int& n);
51 int nrnthread_dat2_corepointer_mech(int tid, int type,
52  int& icnt, int& dcnt, int*& iarray, double*& darray);
53 int nrnthread_dat2_vecplay(int tid, std::vector<int>& n);
54 int nrnthread_dat2_vecplay_inst(int tid, int i, int& vptype, int& mtype,
55  int& ix, int& sz, double*& yvec, double*& tvec,
56  int& last_index, int& discon_index, int& ubound_index);
57 
58 int* datum2int(int type, Memb_list* ml, NrnThread& nt, CellGroup& cg, DatumIndices& di, int ml_vdata_offset, std::vector<int>& pointer2type);
59 }
60 
61 extern "C" {
62 void nrnthread_get_trajectory_requests(int tid, int& bsize, int& ntrajec, void**& vpr, int*& types, int*& indices, double**& pvars, double**& varrays);
63 void nrnthread_trajectory_values(int tid, int n_pr, void** vpr, double t);
64 void nrnthread_trajectory_return(int tid, int n_pr, int bsize, int vecsz, void** vpr, double t);
65 }
66 
67 extern "C" {
68 int nrnthread_all_spike_vectors_return(std::vector<double>& spiketvec, std::vector<int>& spikegidvec);
69 void nrnthreads_all_weights_return(std::vector<double*>& weights);
70 size_t nrnthreads_type_return(int type, int tid, double*& data, double**& mdata);
71 int core2nrn_corepointer_mech(int tid, int type,
72  int icnt, int dcnt, int* iarray, double* darray);
73 }
74 
75 // For direct transfer of event queue information from CoreNEURON
76 extern "C" {
77 void core2nrn_clear_queues(double t);
78 
79 void core2nrn_NetCon_event(int tid, double td, size_t nc_index);
80 
81 void core2nrn_SelfEvent_event(int tid, double td,
82  int tar_type, int tar_index,
83  double flag, size_t nc_index, int is_movable);
84 
85 void core2nrn_SelfEvent_event_noweight(int tid, double td,
86  int tar_type, int tar_index,
87  double flag, int is_movable);
88 
89 //Set of the voltage indices in which PreSyn.flag_ == true
90 void core2nrn_PreSyn_flag(int tid, std::set<int> presyns_flag_true);
91 } // end of extern "C"
92 
93 // For direct transfer of event queue information to CoreNEURON
94 // Must be the same as corresponding struct NrnCoreTransferEvents in CoreNEURON
96  std::vector<int> type; // DiscreteEvent type
97  std::vector<double> td; // delivery time
98  std::vector<int> intdata; // ints specific to the DiscreteEvent type
99  std::vector<double> dbldata; // doubles specific to the type.
100 };
101 
102 // For direct transfer of CoreNEURON WATCH activation back to NEURON
103 typedef std::vector<std::pair<int, bool> > Core2NrnWatchInfoItem;
104 typedef std::vector<Core2NrnWatchInfoItem> Core2NrnWatchInfo;
105 
106 extern "C" {
108 
109 // per item direct transfer of WatchCondition
110 void nrn2core_transfer_WATCH(void(*cb)(int, int, int, int, int));
111 
112 void nrn_watch_clear();
113 void core2nrn_watch_activate(int tid, int type, int wbegin, Core2NrnWatchInfo&);
114 
115 // per VecPlayContinous direct transfer of instance indices.
116 void core2nrn_vecplay(int tid, int i_nrn, int last_index, int discon_index, int ubound_index);
118 
119 // Add the voltage indices in which PreSyn.flag_ == true to the set.
120 void nrn2core_PreSyn_flag(int tid, std::set<int>& presyns_flag_true);
121 
122 // Direct transfer with respect to PatternStim
123 void nrn2core_patternstim(void** info);
124 
125 } // end of extern "C"
126 
128  {"nrn2core_group_ids_", (CNB)nrnthread_group_ids},
129  {"nrn2core_mkmech_info_", (CNB)write_memb_mech_types_direct},
130  {"nrn2core_get_global_dbl_item_", (CNB)get_global_dbl_item},
131  {"nrn2core_get_global_int_item_", (CNB)get_global_int_item},
132  {"nrn2core_get_partrans_setup_info_", (CNB)nrn_get_partrans_setup_info},
133  {"nrn2core_get_dat1_", (CNB)nrnthread_dat1},
134  {"nrn2core_get_dat2_1_", (CNB)nrnthread_dat2_1},
135  {"nrn2core_get_dat2_2_", (CNB)nrnthread_dat2_2},
136  {"nrn2core_get_dat2_mech_", (CNB)nrnthread_dat2_mech},
137  {"nrn2core_get_dat2_3_", (CNB)nrnthread_dat2_3},
138  {"nrn2core_get_dat2_corepointer_", (CNB)nrnthread_dat2_corepointer},
139  {"nrn2core_get_dat2_corepointer_mech_", (CNB)nrnthread_dat2_corepointer_mech},
140  {"nrn2core_get_dat2_vecplay_", (CNB)nrnthread_dat2_vecplay},
141  {"nrn2core_get_dat2_vecplay_inst_", (CNB)nrnthread_dat2_vecplay_inst},
142  {"nrn2core_part2_clean_", (CNB)part2_clean},
143 
144  {"nrn2core_get_trajectory_requests_", (CNB)nrnthread_get_trajectory_requests},
145  {"nrn2core_trajectory_values_", (CNB)nrnthread_trajectory_values},
146  {"nrn2core_trajectory_return_", (CNB)nrnthread_trajectory_return},
147 
148  {"nrn2core_all_spike_vectors_return_", (CNB)nrnthread_all_spike_vectors_return},
149  {"nrn2core_all_weights_return_", (CNB)nrnthreads_all_weights_return},
150  {"nrn2core_type_return_", (CNB)nrnthreads_type_return},
151 
152  {"nrn2core_transfer_tqueue_", (CNB)nrn2core_transfer_tqueue},
153  {"nrn2core_transfer_watch_", (CNB)nrn2core_transfer_WATCH},
154  {"nrn2core_transfer_PreSyn_flag_", (CNB)nrn2core_PreSyn_flag},
155  {"core2nrn_watch_clear_", (CNB)nrn_watch_clear},
156  {"core2nrn_watch_activate_", (CNB)core2nrn_watch_activate},
157  {"core2nrn_vecplay_", (CNB)core2nrn_vecplay},
158  {"core2nrn_vecplay_events_", (CNB)core2nrn_vecplay_events},
159 
160  {"core2nrn_clear_queues_", (CNB)core2nrn_clear_queues},
161  {"core2nrn_corepointer_mech_", (CNB)core2nrn_corepointer_mech},
162  {"core2nrn_NetCon_event_", (CNB)core2nrn_NetCon_event},
163  {"core2nrn_SelfEvent_event_", (CNB)core2nrn_SelfEvent_event},
164  {"core2nrn_SelfEvent_event_noweight_", (CNB)core2nrn_SelfEvent_event_noweight},
165  {"core2nrn_PreSyn_flag_", (CNB)core2nrn_PreSyn_flag},
166 
167  {"nrn2core_patternstim_", (CNB)nrn2core_patternstim},
168 
169  {NULL, NULL}
170 };
171 
172 
173 void map_coreneuron_callbacks(void* handle);
174 
175 #endif //NRN_NRNCORE_CALLBACKS_H
static core2nrn_callback_t cnbs[]
#define data
Definition: rbtqueue.cpp:49
void * get_global_dbl_item(void *p, const char *&name, int &size, double *&val)
int * datum2int(int type, Memb_list *ml, NrnThread &nt, CellGroup &cg, DatumIndices &di, int ml_vdata_offset, std::vector< int > &pointer2type)
#define area
Definition: md1redef.h:5
std::vector< double > td
void nrn2core_PreSyn_flag(int tid, std::set< int > &presyns_flag_true)
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
short type
Definition: cabvars.h:10
void core2nrn_watch_activate(int tid, int type, int wbegin, Core2NrnWatchInfo &)
std::vector< std::pair< int, bool > > Core2NrnWatchInfoItem
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 nrn2core_transfer_WATCH(void(*cb)(int, int, int, int, int))
Definition: netcvode.cpp:5889
void core2nrn_NetCon_event(int tid, double td, size_t nc_index)
Called from CoreNEURON core2nrn_tqueue_item.
size_t p
Represent main neuron object computed by single thread.
Definition: multicore.h:58
int nrnthread_dat2_2(int tid, int *&v_parent_index, double *&a, double *&b, double *&area, double *&v, double *&diamvec)
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:1273
#define v
Definition: md1redef.h:4
int nrnthread_dat2_corepointer(int tid, int &n)
#define nodeindices
Definition: md1redef.h:26
void map_coreneuron_callbacks(void *handle)
Populate function pointers by mapping function pointers for callback.
static List * info
j< sec-> nnode
Definition: treeset.cpp:905
void core2nrn_vecplay_events()
start the vecplay events
void nrnthreads_all_weights_return(std::vector< double *> &weights)
Copy weights from all coreneuron::NrnThread to NetCon instances.
void core2nrn_PreSyn_flag(int tid, std::set< int > presyns_flag_true)
SetupTransferInfo * nrn_get_partrans_setup_info(int ngroup, int cn_nthread, size_t cn_sidt_sz)
Definition: partrans.cpp:1031
NrnCoreTransferEvents * nrn2core_transfer_tqueue(int tid)
int get_global_int_item(const char *name)
int const size_t const size_t n
Definition: nrngsl.h:12
_CONST char * s
Definition: system.cpp:74
int nrnthread_dat2_vecplay(int tid, std::vector< int > &n)
int val
Definition: dll.cpp:167
std::vector< int > intdata
int nrnthread_dat1(int tid, int &n_presyn, int &n_netcon, int *&output_gid, int *&netcon_srcgid, std::vector< int > &netcon_negsrcgid_tid)
void nrn_watch_clear()
Watch info corenrn->nrn transfer requires all activated WatchCondition be deactivated prior to mirror...
Definition: netcvode.cpp:2537
void nrnthread_trajectory_return(int tid, int n_pr, int bsize, int vecsz, void **vpr, double t)
Definition: netcvode.cpp:5826
void cb(const char *s)
Definition: bbstest.cpp:5
void core2nrn_SelfEvent_event(int tid, double td, int tar_type, int tar_index, double flag, size_t nc_index, int is_movable)
int nrnthread_dat2_3(int tid, int nweight, int *&output_vindex, double *&output_threshold, int *&netcon_pnttype, int *&netcon_pntindex, double *&weights, double *&delays)
void nrnthread_get_trajectory_requests(int tid, int &bsize, int &ntrajec, void **&vpr, int *&types, int *&indices, double **&pvars, double **&varrays)
int core2nrn_corepointer_mech(int tid, int type, int icnt, int dcnt, int *iarray, double *darray)
std::vector< Core2NrnWatchInfoItem > Core2NrnWatchInfo
void part2_clean()
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)
mech_type
size_t nrnthreads_type_return(int type, int tid, double *&data, double **&mdata)
Return location for CoreNEURON to copy data into.
#define i
Definition: md1redef.h:12
std::vector< double > dbldata
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< int > &pointer2type)
std::vector< int > type
void nrn2core_patternstim(void **info)
void write_memb_mech_types_direct(std::ostream &s)
void nrnthread_trajectory_values(int tid, int n_pr, void **vpr, double t)
Definition: netcvode.cpp:5785
void core2nrn_SelfEvent_event_noweight(int tid, double td, int tar_type, int tar_index, double flag, int is_movable)
double t
Definition: init.cpp:123
int nrnthread_dat2_corepointer_mech(int tid, int type, int &icnt, int &dcnt, int *&iarray, double *&darray)
void *(* CNB)(...)
struct core2nrn_callback_t core2nrn_callback_t
return NULL
Definition: cabcode.cpp:461
#define pdata
Definition: md1redef.h:28
void nrnthread_group_ids(int *groupids)