00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019 #ifndef FRM_HPP
00020 #define FRM_HPP
00021
00022 #include <set>
00023 #include <vector>
00024 #include <map>
00025 #include <utility>
00026 #include <ostream>
00027 #include <tr1/functional>
00028 #include "Lattice.hpp"
00029 #include "Reaction.hpp"
00030
00031 namespace Algorithms {
00032
00057 class Frm {
00058
00060 struct Sort_event_by_time:
00061 std::tr1::function<bool(Reactions::EventPtr, Reactions::EventPtr)>
00062 {
00063 bool operator()(Reactions::EventPtr lhs, Reactions::EventPtr rhs) const
00064 { return lhs->Time() < rhs->Time(); }
00065 };
00066
00068 typedef std::set<Reactions::EventPtr, Sort_event_by_time> EventsQueue;
00069
00071 typedef std::multimap<Surface::Site*, Reactions::EventPtr> EventsPerSiteContainer;
00072
00074 typedef std::vector<Reactions::Reaction*> ReactionContainer;
00075
00076 public:
00078 typedef std::map<Reactions::Reaction::Name, int> ReactionCounter;
00079
00083 Frm(Surface::Lattice::iterator first, Surface::Lattice::iterator last):
00084 reaction_container_(), event_queue_(), time_(0.0),
00085 lattice_beg_(first), lattice_end_(last)
00086 { }
00087
00089 void Init();
00090
00092 void operator()();
00093
00095 void Clear()
00096 { events_per_site_container_.clear(); event_queue_.clear(); }
00097
00101
00102
00105 double time() const
00106 { return time_; }
00107
00110 ReactionCounter reaction_counter()
00111 { return reaction_counter_; }
00112
00114
00118
00119
00122 void set_time(double time)
00123 { time_ = time; }
00124
00127 void set_reaction_ptr(Reactions::Reaction* reaction)
00128 { reaction_container_.push_back(reaction); }
00129
00131
00132 private:
00133 Frm(const Frm&);
00134 void operator=(const Frm&);
00135
00140 Reactions::EventPtr PopEvent() const
00141 { return *event_queue_.begin(); }
00142
00143 void InsertEvent(Surface::Site*, const Reactions::Reaction* const);
00144
00146 void UpdateQueue(Reactions::EventPtr);
00147
00149 void ReorderQueue(Reactions::EventPtr);
00150
00155
00156 EventsQueue event_queue_;
00157 ReactionCounter reaction_counter_;
00158 ReactionContainer reaction_container_;
00159 EventsPerSiteContainer events_per_site_container_;
00160
00161 typedef std::pair<EventsPerSiteContainer::iterator,
00162 EventsPerSiteContainer::iterator> EventsRange;
00163
00165 double time_;
00166
00168 Surface::Lattice::iterator lattice_beg_, lattice_end_;
00169 };
00170
00171 }
00172
00173 #endif