NEURON
netcvode.h
Go to the documentation of this file.
1 #pragma once
2 
3 #define PRINT_EVENT 1
4 
5 #include "mymath.h"
6 
7 #include "cvodeobj.h"
9 #include "tqueue.hpp"
10 
11 #include <cmath>
12 #include <vector>
13 #include <unordered_map>
14 
15 struct NrnThread;
16 class PreSyn;
17 class HocDataPaths;
18 using PreSynTable = std::unordered_map<neuron::container::data_handle<double>, PreSyn*>;
19 class NetCon;
20 class DiscreteEvent;
21 class SelfEvent;
23 struct hoc_Item;
24 class PlayRecord;
25 class IvocVect;
26 struct BAMechList;
27 class HTList;
28 // nrn_nthread vectors of HTList* for fixed step method
29 // Thread segregated HTList* of all the CVode.CvodeThreadData.HTList*
30 // Interior vector needed because of the chance of local variable time step.
31 // Practically it will always have length <= 1.
32 using HTListList = std::vector<std::vector<HTList*>>;
33 class NetCvode;
34 class MaxStateItem;
35 typedef std::unordered_map<void*, MaxStateItem*> MaxStateTable;
36 class CvodeThreadData;
37 class HocEvent;
38 typedef std::vector<HocEvent*> HocEventList;
39 struct BAMech;
40 struct Section;
41 struct InterThreadEvent;
42 
44  public:
46  virtual ~NetCvodeThreadData();
47  void interthread_send(double, DiscreteEvent*, NrnThread*);
48  void enqueue(NetCvode*, NrnThread*);
49  TQueue* tq_; // for lvardt
50  Cvode* lcv_; // for lvardt
52  hoc_Item* psl_thr_; // for presyns with fixed step threshold checking
57  MUTDEC
58  int nlcv_;
59  int ite_cnt_;
60  int ite_size_;
63 };
64 
65 class NetCvode {
66  public:
67  NetCvode(bool single = true);
68  virtual ~NetCvode();
69  int solve(double t);
70  void statistics(int);
71  void spike_stat();
72  void re_init(double t0 = 0.);
73  // int cellindex(); // never used
74  void states();
75  void dstates();
76  int fun(double t, double* y, double* ydot);
77  void error_weights();
78  void acor();
79  std::string statename(int, int style = 1);
80  void localstep(bool);
81  bool localstep();
82  bool is_local();
83  void use_daspk(bool);
84  bool use_daspk();
85  void move_event(TQItem*, double, NrnThread*);
86  void remove_event(TQItem*, int threadid);
87  TQItem* event(double tdeliver, DiscreteEvent*, NrnThread*);
88  TQItem* bin_event(double tdeliver, DiscreteEvent*, NrnThread*);
90  void null_event(double);
91  void tstop_event(double);
92  void hoc_event(double,
93  const char* hoc_stmt,
94  Object* ppobj = nullptr,
95  int reinit = 0,
96  Object* pyact = nullptr);
98  Section* ssrc,
99  Object* osrc,
100  Object* target,
101  double threshold,
102  double delay,
103  double weight);
104  void presyn_disconnect(PreSyn*);
105  void check_thresh(NrnThread*);
106  void deliver_net_events(NrnThread*); // for default staggered time step method
107  void deliver_events(double til, NrnThread*); // for initialization events
108  void solver_prepare();
109  void clear_events();
110  void free_event_pools();
111  void init_events();
112  void print_event_queue();
113  void event_queue_info();
114  void vec_event_store();
115  void local_retreat(double, Cvode*);
116  void retreat(double, Cvode*);
117  Object** netconlist();
119  PlayRecord* playrec_uses(void*);
120  void playrec_add(PlayRecord*);
121  void playrec_remove(PlayRecord*);
122  int playrec_item(PlayRecord*);
123  PlayRecord* playrec_item(int);
124  std::vector<PlayRecord*>* playrec_list() {
125  return prl_;
126  }
127  void simgraph_remove();
128  // fixed step continuous play and record
129  std::vector<PlayRecord*>* fixed_play_;
130  std::vector<PlayRecord*>* fixed_record_;
131  void vecrecord_add(); // hoc interface functions
132  void vec_remove();
133  void record_init();
134  void play_init();
137  static double eps(double x) {
138  return eps_ * std::abs(x);
139  }
141  return condition_order_;
142  }
143  void condition_order(int i) {
145  }
147  void psl_append(PreSyn*);
148 
149  public:
150  void rtol(double);
151  double rtol() {
152  return rtol_;
153  }
154  void atol(double);
155  double atol() {
156  return atol_;
157  }
158  double rtol_, atol_;
159  void stiff(int);
160  int stiff() {
161  return stiff_;
162  } // 0 nothing stiff, 1 voltage, 2 mechanisms
163  void maxorder(int);
164  int maxorder() {
165  return maxorder_;
166  }
167  int order(int);
168  void minstep(double);
169  double minstep() {
170  return minstep_;
171  }
172  void maxstep(double);
173  double maxstep() {
174  return maxstep_;
175  }
176  void jacobian(int);
177  int jacobian() {
178  return jacobian_;
179  }
180  void structure_change();
182  // int nlist() { return nlist_; }
183  // Cvode* list() { return list_; }
184  bool initialized_; // for global step solve.
186  double state_magnitudes();
187  Symbol* name2sym(const char*);
188  const char* sym2name(Symbol*);
189  int pgvts(double tstop);
190  void update_ps2nt();
191  void point_receive(int, Point_process*, double*, double);
192  bool deliver_event(double til, NrnThread*); // uses TQueue atomically
193  bool empty_;
194  void delete_list();
195  void delete_list(Cvode*);
196  // private:
197  public:
198  static double eps_;
200  int global_microstep();
204 
205  int pgvts_event(double& tt);
206  DiscreteEvent* pgvts_least(double& tt, int& op, int& init);
207  int pgvts_cvode(double tt, int op);
208 
209  bool init_global();
210  void alloc_list();
211  void del_cv_memb_list();
212  void del_cv_memb_list(Cvode*);
213  void distribute_dinfo(int*, int);
214  void playrec_setup();
215  void fill_global_ba(NrnThread*, int, BAMechList**);
216  void fill_local_ba(int*, NetCvodeThreadData&);
217  void fill_local_ba_cnt(int, int*, NetCvodeThreadData&);
218  BAMechList* cvbml(int, BAMech*, Cvode*);
219  void maxstate_analyse();
221  void fornetcon_prepare();
223  double maxstate_analyse(Symbol*, double*);
224  void p_construct(int);
225  void ps_thread_link(PreSyn*);
227 
228  private:
231 
234  bool single_;
236  int pst_cnt_;
238  std::vector<PlayRecord*>* prl_;
240  HocDataPaths create_hdp(int style);
241 
242  public:
244  void set_CVRhsFn();
245  bool use_partrans();
246  std::vector<PreSyn*>* psl_;
247  HTListList wl_list_; // nrn_nthread of these for faster deliver_net_events when many cvode
248  int pcnt_;
252 
253  public:
254  MUTDEC // only for enqueueing_ so far.
255  void set_enqueueing();
256  double allthread_least_t(int& tid);
257  int solve_when_threads(double);
258  void deliver_events_when_threads(double);
260  void allthread_handle(double, HocEvent*, NrnThread*);
261  void allthread_handle();
263 };
Definition: cvodeobj.h:97
Definition: htlist.h:34
Definition: netcon.h:87
std::vector< PreSyn * > * psl_
Definition: netcvode.h:246
TQItem * bin_event(double tdeliver, DiscreteEvent *, NrnThread *)
Definition: netcvode.cpp:2498
void dstates()
Definition: netcvode.cpp:4195
double state_magnitudes()
Definition: netcvode.cpp:6484
void ps_thread_link(PreSyn *)
Definition: netcvode.cpp:4875
void set_CVRhsFn()
Definition: cvodeobj.cpp:1038
std::string statename(int, int style=1)
Definition: netcvode.cpp:4380
int stiff_
Definition: netcvode.h:229
void fornetcon_prepare()
Definition: netcvode.cpp:3995
void states()
Definition: netcvode.cpp:4167
void deliver_events(double til, NrnThread *)
Definition: netcvode.cpp:2835
double allthread_least_t(int &tid)
Definition: netcvode.cpp:6811
int pgvts_event(double &tt)
Definition: netcvode.cpp:3575
NetCvodeThreadData * p
Definition: netcvode.h:249
int playrec_change_cnt_
Definition: netcvode.h:237
void play_init()
Definition: netcvode.cpp:4139
BAMechList * cvbml(int, BAMech *, Cvode *)
Definition: netcvode.cpp:1789
HocEventList * allthread_hocevents_
Definition: netcvode.h:262
void deliver_least_event(NrnThread *)
Definition: netcvode.cpp:2068
static double eps(double x)
Definition: netcvode.h:137
Cvode * gcv_
Definition: netcvode.h:243
void local_retreat(double, Cvode *)
Definition: netcvode.cpp:3502
void evaluate_conditions()
bool is_local()
Definition: netcvode.cpp:1172
IvocVect * vec_event_store_
Definition: netcvode.h:239
void check_thresh(NrnThread *)
Definition: netcvode.cpp:5914
virtual ~NetCvode()
Definition: netcvode.cpp:1137
void playrec_add(PlayRecord *)
Definition: netcvode.cpp:6018
PreSynTable * pst_
Definition: netcvode.h:235
int maxorder_
Definition: netcvode.h:229
void vec_remove()
Definition: netcvode.cpp:6311
void p_construct(int)
Definition: netcvode.cpp:4916
std::vector< PlayRecord * > * prl_
Definition: netcvode.h:238
double atol_
Definition: netcvode.h:158
int pst_cnt_
Definition: netcvode.h:236
double rtol()
Definition: netcvode.h:151
void retreat(double, Cvode *)
Definition: netcvode.cpp:3532
bool empty_
Definition: netcvode.h:193
int stiff()
Definition: netcvode.h:160
MaxStateTable * mst_
Definition: netcvode.h:226
void tstop_event(double)
int maxorder()
Definition: netcvode.h:164
int owned_by_thread(neuron::container::data_handle< double > const &)
Definition: netcvode.cpp:6415
void send2thread(double, DiscreteEvent *, NrnThread *)
std::vector< PlayRecord * > * playrec_list()
Definition: netcvode.h:124
void init_events()
Definition: netcvode.cpp:2749
DiscreteEvent * pgvts_least(double &tt, int &op, int &init)
Definition: netcvode.cpp:3604
void statistics(int)
Definition: netcvode.cpp:3837
HocDataPaths create_hdp(int style)
Create a lookup table for variable names.
Definition: netcvode.cpp:4348
HTListList wl_list_
Definition: netcvode.h:247
void del_cv_memb_list()
Definition: netcvode.cpp:1289
std::vector< PlayRecord * > * fixed_record_
Definition: netcvode.h:130
void deliver_net_events(NrnThread *)
Definition: netcvode.cpp:5958
void fixed_record_continuous(neuron::model_sorted_token const &, NrnThread &nt)
Definition: netcvode.cpp:5524
void vec_event_store()
Definition: netcvode.cpp:2485
double atol()
Definition: netcvode.h:155
void spike_stat()
Definition: netcvode.cpp:3900
void simgraph_remove()
Definition: glinerec.cpp:218
int condition_order()
Definition: netcvode.h:140
int pgvts_cvode(double tt, int op)
Definition: netcvode.cpp:3661
const char * sym2name(Symbol *)
Definition: netcvode.cpp:4432
int fornetcon_change_cnt_
Definition: netcvode.h:222
int solve_when_threads(double)
Definition: netcvode.cpp:6663
bool use_partrans()
Definition: netcvode.cpp:3689
void playrec_setup()
Definition: netcvode.cpp:6317
void condition_order(int i)
Definition: netcvode.h:143
void free_event_pools()
Definition: netcvode.cpp:2735
void error_weights()
Definition: netcvode.cpp:4283
int fun(double t, double *y, double *ydot)
void point_receive(int, Point_process *, double *, double)
void delete_list()
Definition: netcvode.cpp:1260
void null_event(double)
Definition: netcvode.cpp:2536
void clear_events()
Definition: netcvode.cpp:2663
std::vector< PlayRecord * > * fixed_play_
Definition: netcvode.h:129
void consist_sec_pd(const char *, Section *, neuron::container::data_handle< double > const &)
Definition: netcvode.cpp:6447
Object ** netconlist()
Definition: netcvode.cpp:907
void fill_local_ba_cnt(int, int *, NetCvodeThreadData &)
Definition: netcvode.cpp:1770
void update_ps2nt()
Definition: netcvode.cpp:4899
static double eps_
Definition: netcvode.h:198
NetCvode(bool single=true)
Definition: netcvode.cpp:1086
void alloc_list()
Definition: netcvode.cpp:1396
int use_long_double_
Definition: netcvode.h:251
void maxstate_analyze_1(int, Cvode &, CvodeThreadData &)
Definition: netcvode.cpp:6555
void distribute_dinfo(int *, int)
Definition: netcvode.cpp:1342
void maxstate_analyse()
Definition: netcvode.cpp:6586
void fill_global_ba(NrnThread *, int, BAMechList **)
Definition: netcvode.cpp:1755
MUTDEC void set_enqueueing()
Definition: netcvode.cpp:6805
bool initialized_
Definition: netcvode.h:184
int pcnt_
Definition: netcvode.h:248
void remove_event(TQItem *, int threadid)
Definition: netcvode.cpp:2251
bool init_global()
Definition: netcvode.cpp:1428
void solver_prepare()
Definition: netcvode.cpp:3925
int order(int)
Definition: netcvode.cpp:4501
int matrix_change_cnt_
Definition: netcvode.h:233
void playrec_remove(PlayRecord *)
Definition: netcvode.cpp:6024
double minstep_
Definition: netcvode.h:230
int jacobian_
Definition: netcvode.h:229
void psl_append(PreSyn *)
Definition: netcvode.cpp:4624
void presyn_disconnect(PreSyn *)
Definition: netcvode.cpp:4631
int global_microstep()
Definition: netcvode.cpp:2116
int global_microstep_when_threads()
Definition: netcvode.cpp:6779
void hoc_event(double, const char *hoc_stmt, Object *ppobj=nullptr, int reinit=0, Object *pyact=nullptr)
Definition: netcvode.cpp:2545
void re_init(double t0=0.)
Definition: netcvode.cpp:3958
int condition_order_
Definition: netcvode.h:203
void fill_local_ba(int *, NetCvodeThreadData &)
Definition: netcvode.cpp:1764
int local_microstep(neuron::model_sorted_token const &, NrnThread &)
Definition: netcvode.cpp:2101
void acor()
Definition: netcvode.cpp:4312
int print_event_
Definition: netcvode.h:181
void event_queue_info()
Definition: netcvode.cpp:2902
void allthread_handle()
Definition: netcvode.cpp:2576
TQueue * event_queue(NrnThread *nt)
Definition: netcvode.cpp:3749
void vecrecord_add()
Definition: netcvode.cpp:6295
bool single_
Definition: netcvode.h:234
double rtol_
Definition: netcvode.h:158
int solve(double t)
Definition: netcvode.cpp:1949
void move_event(TQItem *, double, NrnThread *)
Definition: netcvode.cpp:2235
int enqueueing_
Definition: netcvode.h:250
bool deliver_event(double til, NrnThread *)
Definition: netcvode.cpp:2082
void deliver_events_when_threads(double)
Definition: netcvode.cpp:6767
Symbol * name2sym(const char *)
Definition: netcvode.cpp:4442
int playrec_item(PlayRecord *)
Definition: netcvode.cpp:6032
double maxstep_
Definition: netcvode.h:230
double maxstep()
Definition: netcvode.h:173
void fixed_play_continuous(NrnThread *)
Definition: netcvode.cpp:5534
int jacobian()
Definition: netcvode.h:177
NetCon * install_deliver(neuron::container::data_handle< double > psrc, Section *ssrc, Object *osrc, Object *target, double threshold, double delay, double weight)
Definition: netcvode.cpp:4551
void print_event_queue()
Definition: netcvode.cpp:2854
bool localstep()
Definition: netcvode.cpp:1168
int pgvts(double tstop)
Definition: netcvode.cpp:3558
void record_init()
Definition: netcvode.cpp:4123
int structure_change_cnt_
Definition: netcvode.h:232
double minstep()
Definition: netcvode.h:169
PlayRecord * playrec_uses(void *)
Definition: netcvode.cpp:6045
TQItem * event(double tdeliver, DiscreteEvent *, NrnThread *)
Definition: netcvode.cpp:2522
bool use_daspk()
Definition: netcvode.cpp:1191
void structure_change()
Definition: netcvode.cpp:4540
virtual ~NetCvodeThreadData()
Definition: netcvode.cpp:1006
MUTDEC int nlcv_
Definition: netcvode.h:58
double immediate_deliver_
Definition: netcvode.h:62
void interthread_send(double, DiscreteEvent *, NrnThread *)
Definition: netcvode.cpp:1028
TQItemPool * tpool_
Definition: netcvode.h:54
SelfEventPool * sepool_
Definition: netcvode.h:53
int unreffed_event_cnt_
Definition: netcvode.h:61
TQueue * tq_
Definition: netcvode.h:49
InterThreadEvent * inter_thread_events_
Definition: netcvode.h:55
void enqueue(NetCvode *, NrnThread *)
Definition: netcvode.cpp:1064
hoc_Item * psl_thr_
Definition: netcvode.h:52
SelfQueue * selfqueue_
Definition: netcvode.h:56
TQueue * tqe_
Definition: netcvode.h:51
Definition: netcon.h:258
#define i
Definition: md1redef.h:19
threshold
Definition: extdef.h:5
void init()
Definition: init.cpp:141
std::vector< std::vector< HTList * > > HTListList
Definition: netcvode.h:32
std::unordered_map< void *, MaxStateItem * > MaxStateTable
Definition: netcvode.h:34
std::vector< HocEvent * > HocEventList
Definition: netcvode.h:37
std::unordered_map< neuron::container::data_handle< double >, PreSyn * > PreSynTable
Definition: netcvode.h:18
#define MUTDEC
Definition: nrnmutdec.h:31
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: model.h:47
Definition: tqitem.hpp:3