NEURON
hocevent.cpp
Go to the documentation of this file.
1 #include <objcmd.h>
2 #include <pool.h>
3 #include <netcon.h>
4 #include <nrnoc2iv.h>
5 #include <mymath.h>
6 
7 extern int cvode_active_;
8 
9 declarePool(HocEventPool, HocEvent)
10 implementPool(HocEventPool, HocEvent)
11 HocEventPool* HocEvent::hepool_;
12 
14  stmt_ = nil;
15  ppobj_ = nil;
16  reinit_ = 0;
17 }
18 
20  if (stmt_) {
21  delete stmt_;
22  }
23 }
24 
25 void HocEvent::pr(const char* s, double tt, NetCvode* ns) {
26  Printf("%s HocEvent %s %.15g\n", s, stmt_ ? stmt_->name() : "", tt);
27 }
28 
29 HocEvent* HocEvent::alloc(const char* stmt, Object* ppobj, int reinit, Object* pyact) {
30  if (!hepool_) {
31  nrn_hoc_lock();
32  if (!hepool_) {
33  hepool_ = new HocEventPool(100, 1);
34  }
36  }
37  HocEvent* he = hepool_->alloc();
38  he->stmt_ = nil;
39  he->ppobj_ = ppobj;
40  he->reinit_ = reinit;
41  if (pyact) {
42  he->stmt_ = new HocCommand(pyact);
43  }else if (stmt) {
44  he->stmt_ = new HocCommand(stmt);
45  }
46  return he;
47 }
48 
50  if (stmt_) {
51  delete stmt_;
52  stmt_ = nil;
53  }
54  hepool_->hpfree(this);
55 }
56 
58  if (stmt_) {
59  delete stmt_;
60  stmt_ = nil;
61  }
62 }
63 
64 void HocEvent::deliver(double tt, NetCvode* nc, NrnThread* nt) {
65  extern double t;
66  if (!ppobj_) {
67  nc->allthread_handle(tt, this, nt);
68  return;
69  }
70  if (stmt_) {
71  if (nrn_nthread > 1 || nc->is_local()) {
72  if (!ppobj_) {
73 hoc_execerror("multiple threads and/or local variable time step method require an appropriate POINT_PROCESS arg to CVode.event to safely execute:", stmt_->name());
74  }
75  Cvode* cv = (Cvode*)ob2pntproc(ppobj_)->nvi_;
76  if (cv && cvode_active_) {
77  nc->local_retreat(tt, cv);
78  if (reinit_) {
79  cv->set_init_flag();
80  }
81  nt->_t = cv->t_;
82  }
83  nrn_hoc_lock();
84  t = tt;
85  }else if (cvode_active_ && reinit_) {
86  nc->retreat(tt, nc->gcv_);
87  assert(MyMath::eq(tt, nc->gcv_->t_, NetCvode::eps(tt)));
88  assert(tt == nt->_t);
89  nc->gcv_->set_init_flag();
90  t = tt;
91  }else{
92  t = nt_t = tt;
93  }
94  stmt_->execute(false);
95  if (nrn_nthread > 1 || nc->is_local()) {
97  }
98  }
99  hefree();
100 }
101 
103  if (stmt_) {
104  stmt_->execute(false);
105  }else{
106  tstopset;
107  }
108  hefree();
109 }
110 
111 void HocEvent::pgvts_deliver(double tt, NetCvode* nc) {
112  deliver(tt, nc, nrn_threads);
113 }
114 
116  if (hepool_) {
117  hepool_->free_all();
118  }
119 }
120 
122 // pr("HocEvent::savestate_save", 0, net_cvode_instance);
123  HocEvent* he = new HocEvent();
124  if (stmt_) {
125  if (stmt_->pyobject()) {
126  he->stmt_ = new HocCommand(stmt_->pyobject());
127  }else{
128  he->stmt_ = new HocCommand(stmt_->name(), stmt_->object());
129  }
130  he->reinit_ = reinit_;
131  he->ppobj_ = ppobj_;
132  }
133  return he;
134 }
135 
136 void HocEvent::savestate_restore(double tt, NetCvode* nc) {
137 // pr("HocEvent::savestate_restore", tt, nc);
138  HocEvent* he = alloc(nil, nil, 0);
139  NrnThread* nt = nrn_threads;
140  if (stmt_) {
141  if (stmt_->pyobject()) {
142  he->stmt_ = new HocCommand(stmt_->pyobject());
143  }else{
144  he->stmt_ = new HocCommand(stmt_->name(), stmt_->object());
145  }
146  he->reinit_ = reinit_;
147  he->ppobj_ = ppobj_;
148  if (ppobj_) {
149  nt = (NrnThread*)ob2pntproc(ppobj_)->_vnt;
150  }
151  }
152  nc->event(tt, he, nt);
153 }
154 
156  HocEvent* he = new HocEvent();
157  int have_stmt, have_obj, index;
158  char stmt[256], objname[100], buf[200];
159  Object* obj = nil;
160 // nrn_assert(fscanf(f, "%d %d\n", &have_stmt, &have_obj) == 2);
161  nrn_assert(fgets(buf, 200, f));
162  nrn_assert(sscanf(buf, "%d %d\n", &have_stmt, &have_obj) == 2);
163  if (have_stmt) {
164  nrn_assert(fgets(stmt, 256, f));
165  stmt[strlen(stmt)-1] = '\0';
166  if (have_obj) {
167 // nrn_assert(fscanf(f, "%s %d\n", objname, &index) == 1);
168  nrn_assert(fgets(buf, 200, f));
169  nrn_assert(sscanf(buf, "%s %d\n", objname, &index) == 1);
170  obj = hoc_name2obj(objname, index);
171  }
172  he->stmt_ = new HocCommand(stmt, obj);
173  }
174  return he;
175 }
176 
178  fprintf(f, "%d\n", HocEventType);
179  fprintf(f, "%d %d\n", stmt_ ? 1 : 0, (stmt_ && stmt_->object()) ? 1 : 0);
180  if (stmt_) {
181  fprintf(f, "%s\n", stmt_->name());
182  if (stmt_->object()) {
183  fprintf(f, "%s %d\n", stmt_->object()->ctemplate->sym->name,
184  stmt_->object()->index);
185  }
186  }
187 }
188 
#define Printf
Definition: model.h:252
#define nrn_assert(ex)
Definition: nrnassrt.h:35
bool is_local()
Definition: netcvode.cpp:1280
#define assert(ex)
Definition: hocassrt.h:26
HocCommand * stmt_
Definition: netcon.h:339
void * _vnt
Definition: section.h:269
TQItem * event(double tdeliver, DiscreteEvent *, NrnThread *)
Definition: netcvode.cpp:2623
HocCommand * stmt()
Definition: netcon.h:328
virtual void allthread_handle()
Definition: hocevent.cpp:102
virtual void pr(const char *, double t, NetCvode *)
Definition: hocevent.cpp:25
declarePool(HocEventPool, HocEvent) implementPool(HocEventPool
Represent main neuron object computed by single thread.
Definition: multicore.h:58
void retreat(double, Cvode *)
Definition: netcvode.cpp:3543
Object * ppobj_
Definition: netcon.h:340
virtual void deliver(double, NetCvode *, NrnThread *)
Definition: hocevent.cpp:64
implementPool(TQItemPool, TQItem) SelfQueue
Definition: tqueue.cpp:110
void nrn_hoc_lock()
Definition: multicore.cpp:1064
static DiscreteEvent * savestate_read(FILE *)
Definition: hocevent.cpp:155
void local_retreat(double, Cvode *)
Definition: netcvode.cpp:3522
virtual void savestate_restore(double deliverytime, NetCvode *)
Definition: hocevent.cpp:136
const char * name()
Definition: objcmd.cpp:84
int cvode_active_
Definition: fadvance.cpp:158
#define nt_t
Definition: cvodeobj.cpp:60
int nrn_nthread
Definition: multicore.cpp:44
virtual DiscreteEvent * savestate_save()
Definition: hocevent.cpp:121
_CONST char * s
Definition: system.cpp:74
NrnThread * nrn_threads
Definition: multicore.cpp:45
int execute(bool notify=true)
Definition: objcmd.cpp:105
double t_
Definition: cvodeobj.h:97
void hefree()
Definition: hocevent.cpp:49
static HocEventPool * hepool_
Definition: netcon.h:343
void allthread_handle(double, HocEvent *, NrnThread *)
Definition: netcvode.cpp:2716
void hoc_execerror(const char *, const char *)
Definition: hoc.cpp:741
static void reclaim()
Definition: hocevent.cpp:115
Object * hoc_name2obj(const char *name, int index)
Definition: hoc_oop.cpp:955
fprintf(stderr, "Don't know the location of params at %p\, pp)
#define nil
Definition: enter-scope.h:36
static bool eq(double x, double y, double e)
Definition: mymath.h:80
void nrn_hoc_unlock()
Definition: multicore.cpp:1072
Cvode * gcv_
Definition: netcvode.h:205
double _t
Definition: multicore.h:59
static double eps(double x)
Definition: netcvode.h:128
#define tstopset
Definition: section.h:328
Definition: hocdec.h:226
Definition: cvodeobj.h:75
HocEvent()
Definition: hocevent.cpp:13
virtual ~HocEvent()
Definition: hocevent.cpp:19
Point_process * ob2pntproc(Object *)
Definition: hocmech.cpp:88
void set_init_flag()
Definition: cvodeobj.cpp:790
void * nvi_
Definition: section.h:268
virtual void pgvts_deliver(double t, NetCvode *)
Definition: hocevent.cpp:111
char buf[512]
Definition: init.cpp:13
Object * object()
Definition: objcmd.h:29
int reinit_
Definition: netcon.h:341
static HocEvent * alloc(const char *stmt, Object *, int, Object *pyact=nil)
Definition: hocevent.cpp:29
double t
Definition: init.cpp:123
#define HocEventType
Definition: netcon.h:48
virtual void savestate_write(FILE *)
Definition: hocevent.cpp:177
void clear()
Definition: hocevent.cpp:57
int index
Definition: hocdec.h:228
short index
Definition: cabvars.h:11
Object * pyobject()
Definition: objcmd.h:30