openCARP
Doxygen code documentation for the open cardiac electrophysiology simulator openCARP
timer_utils.h
Go to the documentation of this file.
1 // SPDX-FileCopyrightText: Copyright (c) NumeriCor GmbH
2 // SPDX-License-Identifier: Apache-2.0
3 
12 #ifndef TIMER_H
13 #define TIMER_H
14 
15 #include <cstdio>
16 #include <cstdlib>
17 #include <cstdbool>
18 #include <cmath>
19 
20 #include <string>
21 #include <vector>
22 
23 
24 namespace opencarp {
25 
30 
35 
36 struct base_timer {
38  const char* name;
39  bool triggered;
41  int numIOs;
42  double trigger_dur;
44  int active;
45  std::string pool;
46 
47  virtual ~base_timer() = default;
48  virtual void update() = 0;
49  virtual void reset() = 0;
50 
51  inline void assign_pool(const char* poolname)
52  {
53  pool = poolname;
54  }
55 };
56 
57 
60 public:
61 
62  double time;
63  long d_time;
64  double time_step;
65  double start;
66  long d_start;
67  double end;
68  long d_end;
69 
70  std::vector<base_timer*> timers;
71 
77  timer_manager(double inp_dt, double inp_start, double inp_end)
78  {
79  setup(inp_dt, inp_start, inp_end);
80  timers.assign(iotm_num_timers, nullptr);
81  }
82 
89  inline void update_timers()
90  {
91  d_time++;
92  time = d_time * time_step;
93 
94  for (base_timer* t : timers)
95  if(t != nullptr) t->update();
96  }
97 
101  inline void reset_timers() {
102  time = start;
103  d_time = d_start;
104 
105  for (base_timer* t : timers)
106  if(t != nullptr) t->reset();
107  }
108 
122  int add_eq_timer(double istart, double iend, int ntrig, double iintv, double idur,
123  const char *iname, const char *poolname = nullptr);
124 
125  int add_neq_timer(const std::vector<double> & itrig, double idur, const char *iname,
126  const char *poolname = nullptr);
127 
128  inline int
129  add_singlestep_timer(double tg, double idur, const char *iname,
130  const char *poolname = nullptr)
131  {
132  return add_eq_timer(tg, tg, 0, 0, idur, iname, poolname);
133  }
134 
135  void initialize_eq_timer(double istart, double iend, int ntrig, double iintv,
136  double idur, int ID, const char *iname, const char* poolname = nullptr);
137 
138  void initialize_neq_timer(const std::vector<double> & itrig, double idur, int ID,
139  const char *iname, const char* poolname = nullptr);
140 
141  inline void
142  initialize_singlestep_timer(double tg, double idur, int ID, const char *iname,
143  const char *poolname = nullptr)
144  {
145  initialize_eq_timer(tg, tg, 0, 0, idur, ID, iname, poolname);
146  }
147 
148  inline size_t num_timers() const {return timers.size();}
149  inline double timer_duration(int ID) const {return ID > -1 ? timers[ID]->trigger_dur : 0.0;}
150  inline bool elapsed() const {return d_time > d_end;}
151 
152  inline bool trigger(int ID) const
153  {
154  return ID > -1 && timers[ID] != nullptr && timers[ID]->triggered;
155  }
156 
157  inline bool triggered_now(int ID) const
158  {
159  return ID > -1 &&
160  timers[ID] != nullptr &&
161  ( (timers[ID]->d_trigger_dur>0 && timers[ID]->d_trigger_dur-timers[ID]->active == 1) ||
162  (!timers[ID]->d_trigger_dur && timers[ID]->triggered) );
163  }
164 
165  inline bool trigger_end(int ID) const
166  {
167  return ID > -1 &&
168  timers[ID] != nullptr &&
169  timers[ID]->triggered &&
170  !timers[ID]->active;
171  }
172 
173  inline int trigger_elapse(int ID) const
174  {
175  if(ID > -1 && timers[ID] != nullptr)
176  return timers[ID]->d_trigger_dur - timers[ID]->active - 1;
177  else
178  return 0;
179  }
180 
182  inline int active_ticks(int ID) const
183  {
184  if(ID > -1 && timers[ID] != nullptr)
185  return timers[ID]->triggered ? timers[ID]->d_trigger_dur - timers[ID]->active : 0;
186  else
187  return 0;
188  }
189 
199  void setup(double inp_dt, double inp_start, double inp_end);
200 };
201 
202 
204 {
206 
207  double start;
208  long d_start;
209  double end;
210  long d_end;
211  double intv;
212  long d_intv;
213  double nxt;
214  long d_nxt;
215 
216  void initialize(const timer_manager* t, double istart, double iend, int ntrig, double iintv,
217  double idur, const char *iname);
218  void update();
219  void reset();
220 };
221 
223 {
225 
226  std::vector<double> trig;
227  std::vector<long> d_trig;
228 
229  void initialize(const timer_manager* t, const std::vector<double> & itrig,
230  const double idur, const char *iname);
231  void update();
232  void reset();
233 };
234 
235 } // namespace opencarp
236 
237 #endif
238 
centralize time managment and output triggering
Definition: timer_utils.h:59
void setup(double inp_dt, double inp_start, double inp_end)
Initialize the timer_manager.
Definition: timer_utils.cc:21
void initialize_neq_timer(const std::vector< double > &itrig, double idur, int ID, const char *iname, const char *poolname=nullptr)
Definition: timer_utils.cc:48
double end
final time
Definition: timer_utils.h:67
long d_time
current time instance index
Definition: timer_utils.h:63
long d_start
initial index in multiples of dt
Definition: timer_utils.h:66
bool trigger(int ID) const
Definition: timer_utils.h:152
void initialize_eq_timer(double istart, double iend, int ntrig, double iintv, double idur, int ID, const char *iname, const char *poolname=nullptr)
Definition: timer_utils.cc:33
double time_step
global reference time step
Definition: timer_utils.h:64
int add_neq_timer(const std::vector< double > &itrig, double idur, const char *iname, const char *poolname=nullptr)
Definition: timer_utils.cc:77
int add_eq_timer(double istart, double iend, int ntrig, double iintv, double idur, const char *iname, const char *poolname=nullptr)
Add a equidistant step timer to the array of timers.
Definition: timer_utils.cc:63
void reset_timers()
Reset time in timer_manager and then reset registered timers.
Definition: timer_utils.h:101
double start
initial time (nonzero when restarting)
Definition: timer_utils.h:65
int add_singlestep_timer(double tg, double idur, const char *iname, const char *poolname=nullptr)
Definition: timer_utils.h:129
double timer_duration(int ID) const
Definition: timer_utils.h:149
void initialize_singlestep_timer(double tg, double idur, int ID, const char *iname, const char *poolname=nullptr)
Definition: timer_utils.h:142
timer_manager(double inp_dt, double inp_start, double inp_end)
Definition: timer_utils.h:77
int trigger_elapse(int ID) const
Definition: timer_utils.h:173
size_t num_timers() const
Definition: timer_utils.h:148
long d_end
final index in multiples of dt
Definition: timer_utils.h:68
bool trigger_end(int ID) const
Definition: timer_utils.h:165
std::vector< base_timer * > timers
vector containing individual timers
Definition: timer_utils.h:70
int active_ticks(int ID) const
return number of ticks elapsed after trigger
Definition: timer_utils.h:182
double time
current time
Definition: timer_utils.h:62
bool triggered_now(int ID) const
Definition: timer_utils.h:157
io_time
The timers we always need are indexed in this enum.
Definition: timer_utils.h:29
@ iotm_chkpt_list
Definition: timer_utils.h:29
@ iotm_console
Definition: timer_utils.h:29
@ iotm_num_timers
Definition: timer_utils.h:29
@ iotm_spacedt
Definition: timer_utils.h:29
@ iotm_trace
Definition: timer_utils.h:29
@ iotm_chkpt_intv
Definition: timer_utils.h:29
@ iotm_state_var
Definition: timer_utils.h:29
t_timer
We distinguish between equidistant and non-equidistant timers with an enum.
Definition: timer_utils.h:34
@ NONEQUDIST
Definition: timer_utils.h:34
virtual void update()=0
std::string pool
label of pool (IO || TS || STIM || ...) to which timer belongs
Definition: timer_utils.h:45
long d_trigger_dur
discrete duration
Definition: timer_utils.h:43
virtual void reset()=0
int trigger_count
count number of triggered IO events
Definition: timer_utils.h:40
t_timer type
type of timer, continuous equidistant, or non-equidistant
Definition: timer_utils.h:37
virtual ~base_timer()=default
const char * name
timer name
Definition: timer_utils.h:38
double trigger_dur
triggered event duration (e.g.,stim duration)
Definition: timer_utils.h:42
bool triggered
flag indicating trigger at current time step
Definition: timer_utils.h:39
void assign_pool(const char *poolname)
Definition: timer_utils.h:51
int numIOs
total number of triggers during simulation
Definition: timer_utils.h:41
int active
count down to end of a trigger with duration
Definition: timer_utils.h:44
long d_intv
discrete io interval in multiples of dt
Definition: timer_utils.h:212
double start
Time when we start I/O in mode _EQUDIST.
Definition: timer_utils.h:207
void initialize(const timer_manager *t, double istart, double iend, int ntrig, double iintv, double idur, const char *iname)
Definition: timer_utils.cc:91
double nxt
next output time in ms
Definition: timer_utils.h:213
double end
Time when we stop I/O in mode _EQUDIST.
Definition: timer_utils.h:209
const timer_manager * mng
Definition: timer_utils.h:205
long d_end
discrete stop index in multiples of dt
Definition: timer_utils.h:210
long d_start
discrete start in multiples of dt
Definition: timer_utils.h:208
long d_nxt
next output index
Definition: timer_utils.h:214
double intv
io interval in ms
Definition: timer_utils.h:211
std::vector< double > trig
the times that the timer will trigger
Definition: timer_utils.h:226
void initialize(const timer_manager *t, const std::vector< double > &itrig, const double idur, const char *iname)
Definition: timer_utils.cc:174
const timer_manager * mng
Definition: timer_utils.h:224
std::vector< long > d_trig
the discrete times associated to trig
Definition: timer_utils.h:227