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 void update() = 0;
48  virtual void reset() = 0;
49 
50  inline void assign_pool(const char* poolname)
51  {
52  pool = poolname;
53  }
54 };
55 
56 
59 public:
60 
61  double time;
62  long d_time;
63  double time_step;
64  double start;
65  long d_start;
66  double end;
67  long d_end;
68 
69  std::vector<base_timer*> timers;
70 
76  timer_manager(double inp_dt, double inp_start, double inp_end)
77  {
78  setup(inp_dt, inp_start, inp_end);
79  timers.assign(iotm_num_timers, nullptr);
80  }
81 
88  inline void update_timers()
89  {
90  d_time++;
91  time = d_time * time_step;
92 
93  for (base_timer* t : timers)
94  if(t != nullptr) t->update();
95  }
96 
100  inline void reset_timers() {
101  time = start;
102  d_time = d_start;
103 
104  for (base_timer* t : timers)
105  if(t != nullptr) t->reset();
106  }
107 
121  int add_eq_timer(double istart, double iend, int ntrig, double iintv, double idur,
122  const char *iname, const char *poolname = nullptr);
123 
124  int add_neq_timer(const std::vector<double> & itrig, double idur, const char *iname,
125  const char *poolname = nullptr);
126 
127  inline int
128  add_singlestep_timer(double tg, double idur, const char *iname,
129  const char *poolname = nullptr)
130  {
131  return add_eq_timer(tg, tg, 0, 0, idur, iname, poolname);
132  }
133 
134  void initialize_eq_timer(double istart, double iend, int ntrig, double iintv,
135  double idur, int ID, const char *iname, const char* poolname = nullptr);
136 
137  void initialize_neq_timer(const std::vector<double> & itrig, double idur, int ID,
138  const char *iname, const char* poolname = nullptr);
139 
140  inline void
141  initialize_singlestep_timer(double tg, double idur, int ID, const char *iname,
142  const char *poolname = nullptr)
143  {
144  initialize_eq_timer(tg, tg, 0, 0, idur, ID, iname, poolname);
145  }
146 
147  inline size_t num_timers() const {return timers.size();}
148  inline double timer_duration(int ID) const {return ID > -1 ? timers[ID]->trigger_dur : 0.0;}
149  inline bool elapsed() const {return d_time > d_end;}
150 
151  inline bool trigger(int ID) const
152  {
153  return ID > -1 && timers[ID] != nullptr && timers[ID]->triggered;
154  }
155 
156  inline bool triggered_now(int ID) const
157  {
158  return ID > -1 &&
159  timers[ID] != nullptr &&
160  ((timers[ID]->d_trigger_dur) - (timers[ID]->active)) == 1;
161  }
162 
163  inline bool trigger_end(int ID) const
164  {
165  return ID > -1 &&
166  timers[ID] != nullptr &&
167  timers[ID]->triggered &&
168  !timers[ID]->active;
169  }
170 
171  inline int trigger_elapse(int ID) const
172  {
173  if(ID > -1 && timers[ID] != nullptr)
174  return timers[ID]->d_trigger_dur - timers[ID]->active - 1;
175  else
176  return 0;
177  }
178 
180  inline int active_ticks(int ID) const
181  {
182  if(ID > -1 && timers[ID] != nullptr)
183  return timers[ID]->triggered ? timers[ID]->d_trigger_dur - timers[ID]->active : 0;
184  else
185  return 0;
186  }
187 
197  void setup(double inp_dt, double inp_start, double inp_end);
198 };
199 
200 
202 {
204 
205  double start;
206  long d_start;
207  double end;
208  long d_end;
209  double intv;
210  long d_intv;
211  double nxt;
212  long d_nxt;
213 
214  void initialize(const timer_manager* t, double istart, double iend, int ntrig, double iintv,
215  double idur, const char *iname);
216  void update();
217  void reset();
218 };
219 
221 {
223 
224  std::vector<double> trig;
225  std::vector<long> d_trig;
226 
227  void initialize(const timer_manager* t, const std::vector<double> & itrig,
228  const double idur, const char *iname);
229  void update();
230  void reset();
231 };
232 
233 } // namespace opencarp
234 
235 #endif
236 
centralize time managment and output triggering
Definition: timer_utils.h:58
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:66
long d_time
current time instance index
Definition: timer_utils.h:62
long d_start
initial index in multiples of dt
Definition: timer_utils.h:65
bool trigger(int ID) const
Definition: timer_utils.h:151
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:63
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:100
double start
initial time (nonzero when restarting)
Definition: timer_utils.h:64
int add_singlestep_timer(double tg, double idur, const char *iname, const char *poolname=nullptr)
Definition: timer_utils.h:128
double timer_duration(int ID) const
Definition: timer_utils.h:148
void initialize_singlestep_timer(double tg, double idur, int ID, const char *iname, const char *poolname=nullptr)
Definition: timer_utils.h:141
timer_manager(double inp_dt, double inp_start, double inp_end)
Definition: timer_utils.h:76
int trigger_elapse(int ID) const
Definition: timer_utils.h:171
size_t num_timers() const
Definition: timer_utils.h:147
long d_end
final index in multiples of dt
Definition: timer_utils.h:67
bool trigger_end(int ID) const
Definition: timer_utils.h:163
std::vector< base_timer * > timers
vector containing individual timers
Definition: timer_utils.h:69
int active_ticks(int ID) const
return number of ticks elapsed after trigger
Definition: timer_utils.h:180
double time
current time
Definition: timer_utils.h:61
bool triggered_now(int ID) const
Definition: timer_utils.h:156
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
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:50
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:210
double start
Time when we start I/O in mode _EQUDIST.
Definition: timer_utils.h:205
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:211
double end
Time when we stop I/O in mode _EQUDIST.
Definition: timer_utils.h:207
const timer_manager * mng
Definition: timer_utils.h:203
long d_end
discrete stop index in multiples of dt
Definition: timer_utils.h:208
long d_start
discrete start in multiples of dt
Definition: timer_utils.h:206
long d_nxt
next output index
Definition: timer_utils.h:212
double intv
io interval in ms
Definition: timer_utils.h:209
std::vector< double > trig
the times that the timer will trigger
Definition: timer_utils.h:224
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:222
std::vector< long > d_trig
the discrete times associated to trig
Definition: timer_utils.h:225