31 #ifndef _adevs_event_locators_h_
32 #define _adevs_event_locators_h_
33 #include "adevs_hybrid.h"
54 enum Mode { INTERPOLATE, BISECTION };
57 bool find_events(
bool* events,
const double* qstart,
double* qend,
64 int sign(
double x)
const
66 if (x < 0.0)
return -1;
67 else if (x > 0.0)
return 1;
73 event_locator_impl<X>::event_locator_impl(ode_system<X>* sys,
74 double err_tol, Mode mode):
75 event_locator<X>(sys),
79 z[0] =
new double[sys->numEvents()];
80 z[1] =
new double[sys->numEvents()];
84 event_locator_impl<X>::~event_locator_impl()
86 delete [] z[0];
delete [] z[1];
91 const double* qstart,
double* qend,
ode_solver<X>* solver,
double& h)
95 this->sys->state_event_func(qstart,z[0]);
100 bool event_in_interval =
false, found_event =
false;
101 this->sys->state_event_func(qend,z[1]);
103 for (
int i = 0; i < this->sys->numEvents(); i++)
106 if (sign(z[1][i]) != sign(z[0][i]))
109 if (fabs(z[1][i]) <= err_tol)
111 events[i] = found_event =
true;
116 if (mode == INTERPOLATE)
118 double tcandidate = z[0][i]*h/(z[0][i]-z[1][i]);
120 if (tcandidate < h/4.0) tcandidate = h/4.0;
121 if (tcandidate < tguess) tguess = tcandidate;
123 event_in_interval =
true;
128 if (event_in_interval)
130 if (mode == BISECTION) h /= 2.0;
132 for (
int i = 0; i < this->sys->numVars(); i++)
136 else return found_event;
145 template <
typename X>
158 template <
typename X>
Mode
Definition: adevs_event_locators.h:54
Definition: adevs_event_locators.h:159
Definition: adevs_event_locators.h:44
Definition: adevs_hybrid.h:396
Definition: adevs_event_locators.h:146
virtual void advance(double *q, double h)=0
bool find_events(bool *events, const double *qstart, double *qend, ode_solver< X > *solver, double &h)
Definition: adevs_event_locators.h:90
Definition: adevs_hybrid.h:45
Definition: adevs_hybrid.h:367