NEURON
netcvode.h
Go to the documentation of this file.
1 #ifndef netcvode_h
2 #define netcvode_h
3 
4 #define PRINT_EVENT 1
5 
6 #include "mymath.h"
7 #include "tqueue.h"
8 #include <vector>
9 #include <unordered_map>
10 
11 struct NrnThread;
12 class PreSyn;
13 class HocDataPaths;
14 typedef std::unordered_map<double*, PreSyn*> PreSynTable;
15 class NetCon;
16 class DiscreteEvent;
17 class TQItemPool;
18 class SelfEventPool;
19 class SelfEvent;
20 struct hoc_Item;
21 class PlayRecord;
22 class PlayRecList;
23 class IvocVect;
24 class BAMechList;
25 class HTList;
26 // nrn_nthread vectors of HTList* for fixed step method
27 // Thread segregated HTList* of all the CVode.CvodeThreadData.HTList*
28 // Interior vector needed because of the chance of local variable time step.
29 // Practically it will always have length <= 1.
30 using HTListList = std::vector<std::vector<HTList*>>;
31 class NetCvode;
32 class MaxStateItem;
33 typedef std::unordered_map<void*, MaxStateItem*> MaxStateTable;
34 class CvodeThreadData;
35 class HocEvent;
36 typedef std::vector<HocEvent*> HocEventList;
37 struct BAMech;
38 struct Section;
39 struct InterThreadEvent;
40 
42  public:
44  virtual ~NetCvodeThreadData();
45  void interthread_send(double, DiscreteEvent*, NrnThread*);
46  void enqueue(NetCvode*, NrnThread*);
47  TQueue* tq_; // for lvardt
48  Cvode* lcv_; // for lvardt
50  hoc_Item* psl_thr_; // for presyns with fixed step threshold checking
51  SelfEventPool* sepool_;
52  TQItemPool* tpool_;
54  SelfQueue* selfqueue_;
55  MUTDEC
56  int nlcv_;
57  int ite_cnt_;
58  int ite_size_;
61 };
62 
63 class NetCvode {
64  public:
65  NetCvode(bool single = true);
66  virtual ~NetCvode();
67  int solve(double t);
68  void statistics(int);
69  void spike_stat();
70  void re_init(double t0 = 0.);
71  int cellindex();
72  void states();
73  void dstates();
74  int fun(double t, double* y, double* ydot);
75  void error_weights();
76  void acor();
77  const char* statename(int, int style = 1);
78  void localstep(bool);
79  bool localstep();
80  bool is_local();
81  void use_daspk(bool);
82  bool use_daspk();
83  void move_event(TQItem*, double, NrnThread*);
84  void remove_event(TQItem*, int threadid);
85  TQItem* event(double tdeliver, DiscreteEvent*, NrnThread*);
86 #if BBTQ == 3 || BBTQ == 4
87  TQItem* fifo_event(double tdeliver, DiscreteEvent*, NrnThread*);
88 #endif
89 #if BBTQ == 5
90  TQItem* bin_event(double tdeliver, DiscreteEvent*, NrnThread*);
91 #endif
93  void null_event(double);
94  void tstop_event(double);
95  void hoc_event(double,
96  const char* hoc_stmt,
97  Object* ppobj = nil,
98  int reinit = 0,
99  Object* pyact = nil);
100  NetCon* install_deliver(double* psrc,
101  Section* ssrc,
102  Object* osrc,
103  Object* target,
104  double threshold,
105  double delay,
106  double weight);
107  void presyn_disconnect(PreSyn*);
108  void check_thresh(NrnThread*);
109  void deliver_net_events(NrnThread*); // for default staggered time step method
110  void deliver_events(double til, NrnThread*); // for initialization events
111  void solver_prepare();
112  void clear_events();
113  void init_events();
114  void print_event_queue();
115  void event_queue_info();
116  void vec_event_store();
117  void local_retreat(double, Cvode*);
118  void retreat(double, Cvode*);
119  Object** netconlist();
120  int owned_by_thread(double*);
121  PlayRecord* playrec_uses(void*);
123  void playrec_remove(PlayRecord*);
124  int playrec_item(PlayRecord*);
125  PlayRecord* playrec_item(int);
126  PlayRecList* playrec_list() {
127  return prl_;
128  }
129  void simgraph_remove();
130  // fixed step continuous play and record
131  PlayRecList* fixed_play_;
132  PlayRecList* fixed_record_;
133  void vecrecord_add(); // hoc interface functions
134  void vec_remove();
135  void record_init();
136  void play_init();
139  static double eps(double x) {
140  return eps_ * Math::abs(x);
141  }
143  return condition_order_;
144  }
145  void condition_order(int i) {
147  }
149  void psl_append(PreSyn*);
150  void recalc_ptrs();
151 
152  public:
153  void rtol(double);
154  double rtol() {
155  return rtol_;
156  }
157  void atol(double);
158  double atol() {
159  return atol_;
160  }
161  double rtol_, atol_;
162  void stiff(int);
163  int stiff() {
164  return stiff_;
165  } // 0 nothing stiff, 1 voltage, 2 mechanisms
166  void maxorder(int);
167  int maxorder() {
168  return maxorder_;
169  }
170  int order(int);
171  void minstep(double);
172  double minstep() {
173  return minstep_;
174  }
175  void maxstep(double);
176  double maxstep() {
177  return maxstep_;
178  }
179  void jacobian(int);
180  int jacobian() {
181  return jacobian_;
182  }
183  void structure_change();
185  // int nlist() { return nlist_; }
186  // Cvode* list() { return list_; }
187  bool initialized_; // for global step solve.
188  void consist_sec_pd(const char*, Section*, double*);
189  double state_magnitudes();
190  Symbol* name2sym(const char*);
191  const char* sym2name(Symbol*);
192  int pgvts(double tstop);
193  void update_ps2nt();
194  void point_receive(int, Point_process*, double*, double);
195  bool deliver_event(double til, NrnThread*); // uses TQueue atomically
196  bool empty_;
197  void delete_list();
198  void delete_list(Cvode*);
199  // private:
200  public:
201  static double eps_;
203  int global_microstep();
207 
208  int pgvts_event(double& tt);
209  DiscreteEvent* pgvts_least(double& tt, int& op, int& init);
210  int pgvts_cvode(double tt, int op);
211 
212  bool init_global();
213  void alloc_list();
214  void del_cv_memb_list();
215  void del_cv_memb_list(Cvode*);
216  void distribute_dinfo(int*, int);
217  void playrec_setup();
218  void fill_global_ba(NrnThread*, int, BAMechList**);
219  void fill_local_ba(int*, NetCvodeThreadData&);
220  void fill_local_ba_cnt(int, int*, NetCvodeThreadData&);
221  BAMechList* cvbml(int, BAMech*, Cvode*);
222  void maxstate_analyse();
224  void fornetcon_prepare();
226  double maxstate_analyse(Symbol*, double*);
227  void p_construct(int);
228  void ps_thread_link(PreSyn*);
230 
231  private:
234 
237  bool single_;
239  int pst_cnt_;
241  PlayRecList* prl_;
244 
245  public:
247  void set_CVRhsFn();
248  bool use_partrans();
249  hoc_Item* psl_; // actually a hoc_List
250  HTListList wl_list_; // nrn_nthread of these for faster deliver_net_events when many cvode
251  int pcnt_;
255 
256  public:
257  MUTDEC // only for enqueueing_ so far.
258  void
259  set_enqueueing();
260  double allthread_least_t(int& tid);
261  int solve_when_threads(double);
262  void deliver_events_when_threads(double);
264  void allthread_handle(double, HocEvent*, NrnThread*);
265  void allthread_handle();
267 };
268 
269 #endif
#define nil
Definition: enter-scope.h:36
Definition: cvodeobj.h:76
Definition: htlist.h:35
static int abs(int)
Definition: math.cpp:43
Definition: netcon.h:83
TQItem * bin_event(double tdeliver, DiscreteEvent *, NrnThread *)
Definition: netcvode.cpp:2685
int local_microstep(NrnThread *)
Definition: netcvode.cpp:2246
void dstates()
Definition: netcvode.cpp:4330
double state_magnitudes()
Definition: netcvode.cpp:6710
void ps_thread_link(PreSyn *)
Definition: netcvode.cpp:5011
void set_CVRhsFn()
Definition: cvodeobj.cpp:1070
PlayRecList * prl_
Definition: netcvode.h:241
int stiff_
Definition: netcvode.h:232
void fornetcon_prepare()
Definition: netcvode.cpp:4126
void states()
Definition: netcvode.cpp:4301
void deliver_events(double til, NrnThread *)
Definition: netcvode.cpp:3061
double allthread_least_t(int &tid)
Definition: netcvode.cpp:7062
int pgvts_event(double &tt)
Definition: netcvode.cpp:3707
NetCvodeThreadData * p
Definition: netcvode.h:252
int playrec_change_cnt_
Definition: netcvode.h:240
void play_init()
Definition: netcvode.cpp:4276
PlayRecList * fixed_record_
Definition: netcvode.h:132
BAMechList * cvbml(int, BAMech *, Cvode *)
Definition: netcvode.cpp:1935
HocEventList * allthread_hocevents_
Definition: netcvode.h:266
void deliver_least_event(NrnThread *)
Definition: netcvode.cpp:2213
static double eps(double x)
Definition: netcvode.h:139
Cvode * gcv_
Definition: netcvode.h:246
void local_retreat(double, Cvode *)
Definition: netcvode.cpp:3585
void evaluate_conditions()
bool is_local()
Definition: netcvode.cpp:1306
void consist_sec_pd(const char *, Section *, double *)
Definition: netcvode.cpp:6676
IvocVect * vec_event_store_
Definition: netcvode.h:242
void check_thresh(NrnThread *)
Definition: netcvode.cpp:6130
virtual ~NetCvode()
Definition: netcvode.cpp:1261
void playrec_add(PlayRecord *)
PreSynTable * pst_
Definition: netcvode.h:238
int owned_by_thread(double *)
Definition: netcvode.cpp:6644
int maxorder_
Definition: netcvode.h:232
void vec_remove()
Definition: netcvode.cpp:6556
void p_construct(int)
Definition: netcvode.cpp:5053
double atol_
Definition: netcvode.h:161
int pst_cnt_
Definition: netcvode.h:239
double rtol()
Definition: netcvode.h:154
void retreat(double, Cvode *)
Definition: netcvode.cpp:3612
bool empty_
Definition: netcvode.h:196
int stiff()
Definition: netcvode.h:163
MaxStateTable * mst_
Definition: netcvode.h:229
void tstop_event(double)
int maxorder()
Definition: netcvode.h:167
void send2thread(double, DiscreteEvent *, NrnThread *)
void init_events()
Definition: netcvode.cpp:2950
PlayRecList * fixed_play_
Definition: netcvode.h:131
DiscreteEvent * pgvts_least(double &tt, int &op, int &init)
Definition: netcvode.cpp:3736
void statistics(int)
Definition: netcvode.cpp:3968
HTListList wl_list_
Definition: netcvode.h:250
hoc_Item * psl_
Definition: netcvode.h:249
void del_cv_memb_list()
Definition: netcvode.cpp:1447
void deliver_net_events(NrnThread *)
Definition: netcvode.cpp:6174
void vec_event_store()
Definition: netcvode.cpp:2649
double atol()
Definition: netcvode.h:158
void spike_stat()
Definition: netcvode.cpp:4031
void simgraph_remove()
Definition: glinerec.cpp:259
int condition_order()
Definition: netcvode.h:142
int pgvts_cvode(double tt, int op)
Definition: netcvode.cpp:3793
const char * sym2name(Symbol *)
Definition: netcvode.cpp:4561
int fornetcon_change_cnt_
Definition: netcvode.h:225
int solve_when_threads(double)
Definition: netcvode.cpp:6915
bool use_partrans()
Definition: netcvode.cpp:3821
void playrec_setup()
Definition: netcvode.cpp:6563
void condition_order(int i)
Definition: netcvode.h:145
NetCon * install_deliver(double *psrc, Section *ssrc, Object *osrc, Object *target, double threshold, double delay, double weight)
Definition: netcvode.cpp:4683
void recalc_ptrs()
Definition: netcvode.cpp:6854
void error_weights()
Definition: netcvode.cpp:4418
int fun(double t, double *y, double *ydot)
void point_receive(int, Point_process *, double *, double)
void delete_list()
Definition: netcvode.cpp:1412
void null_event(double)
Definition: netcvode.cpp:2726
void clear_events()
Definition: netcvode.cpp:2868
Object ** netconlist()
Definition: netcvode.cpp:948
void hoc_event(double, const char *hoc_stmt, Object *ppobj=nil, int reinit=0, Object *pyact=nil)
Definition: netcvode.cpp:2744
void fill_local_ba_cnt(int, int *, NetCvodeThreadData &)
Definition: netcvode.cpp:1917
void update_ps2nt()
Definition: netcvode.cpp:5035
static double eps_
Definition: netcvode.h:201
NetCvode(bool single=true)
Definition: netcvode.cpp:1212
void alloc_list()
Definition: netcvode.cpp:1577
int use_long_double_
Definition: netcvode.h:254
const char * statename(int, int style=1)
Definition: netcvode.cpp:4476
void maxstate_analyze_1(int, Cvode &, CvodeThreadData &)
Definition: netcvode.cpp:6781
void distribute_dinfo(int *, int)
Definition: netcvode.cpp:1521
void maxstate_analyse()
Definition: netcvode.cpp:6811
void fill_global_ba(NrnThread *, int, BAMechList **)
Definition: netcvode.cpp:1902
MUTDEC void set_enqueueing()
Definition: netcvode.cpp:7056
bool initialized_
Definition: netcvode.h:187
int pcnt_
Definition: netcvode.h:251
void remove_event(TQItem *, int threadid)
Definition: netcvode.cpp:2405
bool init_global()
Definition: netcvode.cpp:1615
void solver_prepare()
Definition: netcvode.cpp:4056
int order(int)
Definition: netcvode.cpp:4633
int matrix_change_cnt_
Definition: netcvode.h:236
void playrec_remove(PlayRecord *)
Definition: netcvode.cpp:6246
double minstep_
Definition: netcvode.h:233
int jacobian_
Definition: netcvode.h:232
PlayRecList * playrec_list()
Definition: netcvode.h:126
void psl_append(PreSyn *)
Definition: netcvode.cpp:4756
void presyn_disconnect(PreSyn *)
Definition: netcvode.cpp:4763
int global_microstep()
Definition: netcvode.cpp:2260
int global_microstep_when_threads()
Definition: netcvode.cpp:7030
void re_init(double t0=0.)
Definition: netcvode.cpp:4089
int condition_order_
Definition: netcvode.h:206
void fill_local_ba(int *, NetCvodeThreadData &)
Definition: netcvode.cpp:1911
void acor()
Definition: netcvode.cpp:4447
int print_event_
Definition: netcvode.h:184
void event_queue_info()
Definition: netcvode.cpp:3134
void allthread_handle()
Definition: netcvode.cpp:2781
TQueue * event_queue(NrnThread *nt)
Definition: netcvode.cpp:3880
void vecrecord_add()
Definition: netcvode.cpp:6534
bool single_
Definition: netcvode.h:237
int cellindex()
Definition: netcvode.cpp:4283
double rtol_
Definition: netcvode.h:161
int solve(double t)
Definition: netcvode.cpp:2095
void move_event(TQItem *, double, NrnThread *)
Definition: netcvode.cpp:2379
int enqueueing_
Definition: netcvode.h:253
bool deliver_event(double til, NrnThread *)
Definition: netcvode.cpp:2227
void deliver_events_when_threads(double)
Definition: netcvode.cpp:7018
Symbol * name2sym(const char *)
Definition: netcvode.cpp:4571
void fixed_record_continuous(NrnThread *)
Definition: netcvode.cpp:5714
int playrec_item(PlayRecord *)
Definition: netcvode.cpp:6272
double maxstep_
Definition: netcvode.h:233
double maxstep()
Definition: netcvode.h:176
void fixed_play_continuous(NrnThread *)
Definition: netcvode.cpp:5726
int jacobian()
Definition: netcvode.h:180
void print_event_queue()
Definition: netcvode.cpp:3080
bool localstep()
Definition: netcvode.cpp:1302
int pgvts(double tstop)
Definition: netcvode.cpp:3690
void record_init()
Definition: netcvode.cpp:4259
int structure_change_cnt_
Definition: netcvode.h:235
double minstep()
Definition: netcvode.h:172
HocDataPaths * hdp_
Definition: netcvode.h:243
PlayRecord * playrec_uses(void *)
Definition: netcvode.cpp:6287
TQItem * event(double tdeliver, DiscreteEvent *, NrnThread *)
Definition: netcvode.cpp:2712
bool use_daspk()
Definition: netcvode.cpp:1325
void structure_change()
Definition: netcvode.cpp:4672
virtual ~NetCvodeThreadData()
Definition: netcvode.cpp:1129
MUTDEC int nlcv_
Definition: netcvode.h:56
double immediate_deliver_
Definition: netcvode.h:60
void interthread_send(double, DiscreteEvent *, NrnThread *)
Definition: netcvode.cpp:1153
TQItemPool * tpool_
Definition: netcvode.h:52
SelfEventPool * sepool_
Definition: netcvode.h:51
int unreffed_event_cnt_
Definition: netcvode.h:59
TQueue * tq_
Definition: netcvode.h:47
InterThreadEvent * inter_thread_events_
Definition: netcvode.h:53
void enqueue(NetCvode *, NrnThread *)
Definition: netcvode.cpp:1190
hoc_Item * psl_thr_
Definition: netcvode.h:50
SelfQueue * selfqueue_
Definition: netcvode.h:54
TQueue * tqe_
Definition: netcvode.h:49
Definition: netcon.h:255
Definition: bbtqueue.h:6
double t
Definition: cvodeobj.cpp:59
#define i
Definition: md1redef.h:12
threshold
Definition: extdef.h:5
void init()
Definition: init.cpp:291
#define fifo_event
Definition: netcvode.cpp:2681
std::unordered_map< double *, PreSyn * > PreSynTable
Definition: netcvode.h:13
std::vector< std::vector< HTList * > > HTListList
Definition: netcvode.h:30
std::unordered_map< void *, MaxStateItem * > MaxStateTable
Definition: netcvode.h:32
std::vector< HocEvent * > HocEventList
Definition: netcvode.h:35
#define MUTDEC
Definition: nrnmutdec.h:68
Represent main neuron object computed by single thread.
Definition: multicore.h:58
Definition: hocdec.h:227
Definition: model.h:57