00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021
00022
00023
00024
00025
00026
00027
00028
00029
00030
00031 #ifndef SUNDANCE_EVENT_DETECTOR_H
00032 #define SUNDANCE_EVENT_DETECTOR_H
00033
00034
00035 #include "SundanceDefs.hpp"
00036
00037 namespace Sundance
00038 {
00039 class Expr;
00040
00041
00042 class EventDetectorBase
00043 {
00044 public:
00045
00046 EventDetectorBase() {}
00047
00048
00049 virtual bool terminateOnDetection() const {return false;}
00050
00051
00052 virtual bool checkForEvent(
00053 const double& t1, const Expr& u1,
00054 const double& t2, const Expr& u2) = 0 ;
00055
00056
00057 virtual double eventTime() const = 0 ;
00058
00059
00060 virtual double foundEvent() const = 0 ;
00061 };
00062
00063
00064 enum ThresholdEventType {AnyAbove, AllAbove, AnyBelow, AllBelow};
00065
00066
00067 class ThresholdEventDetector : public EventDetectorBase
00068 {
00069 public:
00070
00071 ThresholdEventDetector(double threshold, ThresholdEventType eventType,
00072 bool terminateOnDetection=false)
00073 : threshold_(threshold), eventType_(eventType),
00074 gotIt_(false), eventTime_(-1.0e300),
00075 terminateOnDetection_(terminateOnDetection) {}
00076
00077
00078 bool terminateOnDetection() const {return terminateOnDetection_;}
00079
00080
00081 bool checkForEvent(
00082 const double& t1, const Expr& u1,
00083 const double& t2, const Expr& u2) ;
00084
00085
00086 double eventTime() const {return eventTime_;}
00087
00088
00089 double foundEvent() const {return gotIt_;}
00090
00091 private:
00092 double threshold_;
00093 ThresholdEventType eventType_;
00094 mutable bool gotIt_;
00095 mutable double eventTime_;
00096 bool terminateOnDetection_;
00097 };
00098
00099
00100
00101
00102 }
00103
00104
00105 #endif