2 #include <unordered_map> 25 extern void* dlopen_noerr(
const char*
name,
int mode);
26 #define dlopen dlopen_noerr 27 extern void*
dlsym(
void* handle,
const char*
name);
28 extern int dlclose(
void* handle);
32 #if defined(HAVE_DLFCN_H) 52 #if defined(HAVE_DLFCN_H) 56 fprintf(stderr,
"Could not get symbol %s from CoreNEURON\n",
cnbs[
i].name);
59 void**
c = (
void**)sym;
60 *c = (
void*)(
cnbs[
i].f);
91 if (strcmp(name,
"secondorder") == 0) {
93 }
else if(strcmp(name,
"Random123_global_index") == 0) {
95 }
else if (strcmp(name,
"_nrnunit_use_legacy_") == 0) {
108 for (; sp; sp = sp->
next) {
115 val =
new double[size];
116 for (
int i=0;
i < a->
sub[0]; ++
i) {
125 val[0] = *sp->
u.
pval;
154 for (
int i = 0;
i < nc->
cnt_; ++
i) {
155 nc->
weight_[
i] = weights[ith][iw[ith]++];
184 }
else if (type == 0) {
224 int*& output_gid,
int*& netcon_srcgid,
225 std::vector<int>& netcon_negsrcgid_tid) {
239 int& nmech,
int*& tml_index,
int*& ml_nodecount,
int& nidata,
int& nvdata,
int& nweight) {
252 int vdata_offset = 0;
253 tml_index =
new int[nmech];
254 ml_nodecount =
new int[nmech];
256 for (
size_t j = 0;
j < mla.size(); ++
j) {
257 int type = mla[
j].first;
264 if (ds[psz] == -4 || ds[psz] == -6 || ds[psz] == -7 || ds[psz] == 0) {
270 nvdata = vdata_offset;
282 double*&
area,
double*&
v,
double*& diamvec) {
293 for (
int i=0;
i < nt.
end; ++
i) {
309 diamvec =
new double[nt.
end];
311 for (
int i=0;
i < nt.
end; ++
i) {
327 double*&
data,
int*&
pdata, std::vector<int>& pointer2type) {
333 int type = mlai.first;
336 bool copy = data ?
true :
false;
347 nodeindices = ml->nodeindices;
352 nodeindices = (
int*)
emalloc(n*
sizeof(
int));
353 for (
int i=0; i <
n; ++
i) {
354 nodeindices[
i] = ml->nodeindices[
i];
358 for (
int i = 0; i < nn; ++
i) {
374 for (
int i=0; i < nn; ++
i) {
375 pdata[
i] = pdata1[
i];
389 int*& netcon_pnttype,
int*& netcon_pntindex,
double*& weights,
double*& delays) {
394 output_vindex =
new int[cg.
n_presyn];
409 weights =
new double[nweight];
411 for (
int i=0;
i <
n; ++
i) {
413 for (
int j=0;
j < nc->
cnt_; ++
j) {
418 delays =
new double[
n];
419 for (
int i=0;
i <
n; ++
i) {
433 for (
size_t i = 0;
i < mla.size(); ++
i) {
443 int& icnt,
int& dcnt,
int*& iArray,
double*& dArray) {
460 iArray =
new int[icnt];
464 dArray =
new double[dcnt];
480 int icnt,
int dcnt,
int* iArray,
double* dArray) {
509 for (
int j = 0;
j < sz; ++
j) {
513 const int seman = semantics[
j];
524 pointer2type.push_back(etype);
525 }
else if (etype == -1) {
531 }
else if (etype == -9) {
533 }
else if (etype > 0 && etype < 1000){
535 }
else if (etype > 1000 && etype < 2000) {
537 }
else if (etype == -2) {
539 }
else if (etype == -4) {
540 pdata[jj] = ml_vdata_offset + eindex;
542 }
else if (etype == -6) {
543 pdata[jj] = ml_vdata_offset + eindex;
545 }
else if (etype == -7) {
546 pdata[jj] = ml_vdata_offset + eindex;
587 deferred_netcons.clear();
607 for (
int i=0;
i < fp->count(); ++
i){
613 indices.push_back(
i);
627 int& ix,
int& sz,
double*& yvec,
double*& tvec,
628 int& last_index,
int& discon_index,
int& ubound_index) {
638 double* pd = vp->
pd_;
645 if (pd >= ml->
data[0] && pd < (ml->
data[0] + nn)) {
647 ix = (pd - ml->
data[0]);
675 vp->discon_index_ = discon_index;
676 vp->ubound_index_ = ubound_index;
682 for (
int i=0;
i < fp->count(); ++
i){
698 int triggered = wc->
flag_ ? 1 : 0;
700 (*cb)(tid, pnttype,
pntindex, watch_index, triggered);
735 if (type2movable.empty()) {
741 type2movable[
type] = psz;
753 std::unordered_map<
NetCon*, std::vector<size_t> >& netcon2intdata,
754 std::unordered_map<
PreSyn*, std::vector<size_t> >& presyn2intdata,
755 std::unordered_map<
double*, std::vector<size_t> >& weight2intdata) {
759 double tdeliver = tqi->
t_;
760 core_te->
type.push_back(type);
761 core_te->
td.push_back(tdeliver);
775 size_t iloc = core_te->
intdata.size();
776 core_te->
intdata.push_back(-1);
779 netcon2intdata[nc].push_back(iloc);
785 int movable_index = type2movable[
type];
788 core_te->
intdata.push_back(type);
803 core_te->
intdata.push_back(index);
805 size_t iloc_wt = core_te->
intdata.size();
807 weight2intdata[wt].push_back(iloc_wt);
809 core_te->
intdata.push_back(-1);
814 core_te->
intdata.push_back((movable && *movable == tqi) ? 1 : 0);
815 if (movable && *movable == tqi) {
816 assert(pnt_movable && *pnt_movable == tqi);
825 bool skip = (ps->
nt_ && (ps->
nt_->
id != tid)) ?
true :
false;
828 skip = (!ps->
nt_ && tid != 0) ?
true : skip;
831 core_te->
type.pop_back();
832 core_te->
td.pop_back();
852 size_t iloc = core_te->
intdata.size();
853 core_te->
intdata.push_back(-1);
854 presyn2intdata[ps].push_back(iloc);
866 core_te->
td.pop_back();
867 core_te->
type.pop_back();
870 Fprintf(stderr,
"WARNING: CVode.event(...) for delivery at time step nearest %g discarded. CoreNEURON cannot presently handle interpreter events (rank %d, thread %d).\n",
nrnmpi_myid, tdeliver,
nrnmpi_myid, tid);
890 std::unordered_map<NetCon*, std::vector<size_t> > netcon2intdata;
891 std::unordered_map<PreSyn*, std::vector<size_t> > presyn2intdata;
892 std::unordered_map<double*, std::vector<size_t> > weight2intdata;
897 auto& cg = cellgroups_[tid];
906 set_info(tqi, tid, core_te, netcon2intdata, presyn2intdata, weight2intdata);
912 set_info(tqi, tid, core_te, netcon2intdata, presyn2intdata, weight2intdata);
919 for (
int i = 0;
i < cg.n_netcon; ++
i) {
921 auto iter = netcon2intdata.find(nc);
922 if (iter != netcon2intdata.end()) {
923 for (
auto iloc: iter->second) {
930 #define NRN_SENTINAL 100000000000 931 for (
int i = 0;
i < cg.n_presyn; ++
i) {
933 auto iter = presyn2intdata.find(ps);
934 if (iter != presyn2intdata.end()) {
937 for (
auto iloc: iter->second) {
945 for (
auto& iter: presyn2intdata) {
952 for (
int i = 0;
i < cg.n_netcon; ++
i) {
955 auto iter = weight2intdata.find(wt);
956 if (iter != weight2intdata.end()) {
957 for (
auto iloc: iter->second) {
984 NetCon* nc = CellGroup::deferred_netcons[tid][nc_index];
985 nc->
send(td, net_cvode_instance, &nt);
989 int tar_type,
int tar_index,
990 double flag,
double* weight,
int is_movable)
992 if (type2movable.empty()) {
1012 int movable_index = type2movable[tar_type];
1018 *movable_arg = (
void*)old_movable_arg;
1023 int tar_type,
int tar_index,
1024 double flag,
size_t nc_index,
int is_movable)
1027 NetCon* nc = CellGroup::deferred_netcons[tid][nc_index];
1041 int tar_type,
int tar_index,
1042 double flag,
int is_movable)
1045 double* weight =
NULL;
1064 if (presyns_flag_true.empty()) {
1075 if(presyns_flag_true.erase(index_v)) {
1077 if (presyns_flag_true.empty()) {
1103 presyns_flag_true.insert(index_v);
1116 for (
size_t i = 0;
i < wi.size(); ++
i) {
1120 for (
auto watch_item: active_watch_items){
1121 int watch_index = watch_item.first;
1122 bool above_thresh = watch_item.second;
1131 wc->
flag_ = above_thresh ? 1 : 0;
1146 if (!patternstim_type) {
1148 if (strcmp(
memb_func[
i].sym->name,
"PatternStim") == 0) {
1149 patternstim_type =
i;
int nrnthread_dat2_3(int tid, int nweight, int *&output_vindex, double *&output_threshold, int *&netcon_pnttype, int *&netcon_pntindex, double *&weights, double *&delays)
static void setup_type2semantics()
static core2nrn_callback_t cnbs[]
short * nrn_is_artificial_
static Deferred_Type2ArtMl deferred_type2artml_
int nrnthread_dat2_2(int tid, int *&v_parent_index, double *&a, double *&b, double *&area, double *&v, double *&diamvec)
void core2nrn_NetCon_event(int tid, double td, size_t nc_index)
Called from CoreNEURON core2nrn_tqueue_item.
int nrnthread_dat2_mech(int tid, size_t i, int dsz_inst, int *&nodeindices, double *&data, int *&pdata, std::vector< int > &pointer2type)
static void clean_art(CellGroup *)
std::vector< std::pair< int, bool > > Core2NrnWatchInfoItem
double * contiguous_art_data(double **data, int nitem, int szitem)
std::vector< MlWithArtItem > MlWithArt
double(* c_)(Point_process *)
struct NrnThreadMembList * next
const char * dlerror(void)
NetCvode * net_cvode_instance
int nrn_dblpntr2nrncore(double *pd, NrnThread &nt, int &type, int &index)
static int nrncore_pntindex_for_queue(double *d, int tid, int type)
#define ITERATE(itm, lst)
Symbol * hoc_lookup(const char *)
void core2nrn_vecplay_events()
start the vecplay events
Represent main neuron object computed by single thread.
DatumIndices * datumindices
void * nrn_interthread_enqueue(NrnThread *)
void core2nrn_vecplay(int tid, int i, int last_index, int discon_index, int ubound_index)
getting one item at a time from CoreNEURON
void core2nrn_PreSyn_flag(int tid, std::set< int > presyns_flag_true)
PlayRecList * fixed_play_
void core2nrn_SelfEvent_event_noweight(int tid, double td, int tar_type, int tar_index, double flag, int is_movable)
void nrn2core_PreSyn_flag(int tid, std::set< int > &presyns_flag_true)
virtual void send(double sendtime, NetCvode *, NrnThread *)
int nrnthread_dat2_vecplay(int tid, std::vector< int > &indices)
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)
sprintf(buf," if (secondorder) {\ " int _i;\" " for(_i=0;_i< %d;++_i) {\" " _p[_slist%d[_i]]+=dt *_p[_dlist%d[_i]];\" " }}\", numeqn, listnum, listnum)
#define PlayRecordEventType
int dlclose(void *handle)
int nrnthread_dat2_corepointer(int tid, int &n)
_nrn_Fast_Imem * _nrn_fast_imem
static std::vector< NetCon ** > deferred_netcons
int nrnthread_dat2_corepointer_mech(int tid, int type, int &icnt, int &dcnt, int *&iArray, double *&dArray)
TQItem * atomic_dq(double til)
void nrn2core_transfer_WatchCondition(WatchCondition *wc, void(*cb)(int, int, int, int, int))
getting one item at a time from nrn2core_transfer_WATCH
int get_global_int_item(const char *name)
NrnCoreTransferEvents * nrn2core_transfer_tqueue(int tid)
TQItem * first()
Iterate in ascending bin order starting at current bin.
std::pair< int, Memb_list *> MlWithArtItem
double nrn_ion_charge(Symbol *)
int const size_t const size_t n
void(*)(double *, int *, int *, int *, double *, Datum *, Datum *, NrnThread *) bbcore_write_t
static int patternstim_type
std::vector< int > intdata
bbcore_write_t * nrn_bbcore_write_
static void clean_deferred_netcons()
size_t nrnthreads_type_return(int type, int tid, double *&data, double **&mdata)
Return location for CoreNEURON to copy data into.
void nrnthread_group_ids(int *grp)
#define DiscreteEventType
void * get_global_dbl_item(void *p, const char *&name, int &size, double *&val)
bbcore_write_t * nrn_bbcore_read_
void hoc_execerror(const char *, const char *)
int core2nrn_corepointer_mech(int tid, int type, int icnt, int dcnt, int *iArray, double *dArray)
static void defer_clean_netcons(CellGroup *)
fprintf(stderr, "Don't know the location of params at %p\, pp)
virtual void send(double deliverytime, NetCvode *, NrnThread *)
void * nrn_patternstim_info_ref(Datum *)
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_activate(Datum *, double(*)(Point_process *), int, Point_process *, int, double)
char * emalloc(unsigned n)
int * nrn_prop_param_size_
Symlist * hoc_built_in_symlist
void nrn2core_patternstim(void **info)
static std::map< int, int > type2movable
std::vector< Core2NrnWatchInfoItem > Core2NrnWatchInfo
VEC * cgs(MTX_FN A, void *A_params, VEC *b, VEC *r0, double tol, VEC *x)
NrnWatchAllocateFunc_t * nrn_watch_allocate_
int vector_capacity(Vect *v)
const char * bbcore_write_version
std::vector< int > netcon_negsrcgid_tid
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)
HocStruct cTemplate * ctemplate
void write_memb_mech_types_direct(std::ostream &s)
double * hoc_val_pointer(const char *s)
static void core2nrn_SelfEvent_helper(int tid, double td, int tar_type, int tar_index, double flag, double *weight, int is_movable)
void core2nrn_watch_activate(int tid, int type, int watch_begin, Core2NrnWatchInfo &wi)
#define VecPlayContinuousType
void nrn_net_send(void **, double *, Point_process *, double, double)
std::vector< double > dbldata
double * vector_vec(Vect *v)
void nrnthreads_all_weights_return(std::vector< double *> &weights)
Copy weights from all coreneuron::NrnThread to NetCon instances.
int * datum2int(int type, Memb_list *ml, NrnThread &nt, CellGroup &cg, DatumIndices &di, int ml_vdata_offset, std::vector< int > &pointer2type)
void core2nrn_clear_queues(double time)
Initialize queues before transfer Probably aleady clear, but if binq then must be initialized to time...
void map_coreneuron_callbacks(void *handle)
Populate function pointers by mapping function pointers for callback.
void core2nrn_SelfEvent_event(int tid, double td, int tar_type, int tar_index, double flag, size_t nc_index, int is_movable)
void * dlsym(void *handle, const char *symbol)
static void clear_artdata2index()
uint32_t nrnran123_get_globalindex()
TQueue * net_cvode_instance_event_queue(NrnThread *)
static void set_info(TQItem *tqi, int tid, NrnCoreTransferEvents *core_te, std::unordered_map< NetCon *, std::vector< size_t > > &netcon2intdata, std::unordered_map< PreSyn *, std::vector< size_t > > &presyn2intdata, std::unordered_map< double *, std::vector< size_t > > &weight2intdata)
IvocVect * discon_indices_