00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019 #ifndef DESORPTION_HPP
00020 #define DESORPTION_HPP
00021
00022 #include <cassert>
00023 #include <RandomLib/Random.hpp>
00024 #include "Reaction.hpp"
00025 #include "Site.hpp"
00026 #include "Arrhenius.hpp"
00027 #include "Lattice.hpp"
00028
00029 namespace Surface { class Species; }
00030
00031 namespace Reactions {
00032
00040 class Desorption: public Reaction
00041 {
00042 public:
00048 Desorption(const Name& name, const Surface::Species& species,
00049 const double preexponential_factor,
00050 const double activation_energy):
00051 name_(name), species_(species),
00052 preexponential_factor_(preexponential_factor),
00053 activation_energy_(activation_energy),
00054 time_(0.0),
00055 desorption_site_(0)
00056 { }
00057
00058 private:
00060 Desorption(const Desorption& other, Surface::Site* desorption_site):
00061 name_(other.name_), species_(other.species_),
00062 preexponential_factor_(other.preexponential_factor_),
00063 activation_energy_(other.activation_energy_),
00064 time_(other.time_),
00065 desorption_site_(desorption_site)
00066 { if (Enabled()) UpdateTime(); }
00067
00068 Desorption(const Desorption&);
00069 Desorption& operator=(const Desorption&);
00070
00071 public:
00073 ~Desorption()
00074 { desorption_site_ = 0; };
00075
00076 Name name() const
00077 { return name_; }
00078
00079 void UpdateTime()
00080 { using std::log; using namespace RandomLib;
00081
00082 const double k = Arrhenius(preexponential_factor_, activation_energy_, Surface::temperature());
00083 double r = Random::Global.Fixed();
00084 while (r == 0.0) r = Random::Global.Fixed();
00085 assert(r != 0 && r != 1);
00086 assert(k != 0.0);
00087 time_ = (-1.0/k)*log(r);
00088 }
00089
00090 double Time() const
00091 { return time_; }
00092
00093 bool Enabled() const
00094 { return desorption_site_->empty(); }
00095
00096 void operator()()
00097 {
00098 if (!Enabled()) return;
00099 desorption_site_->set_species(species_);
00100 }
00101
00102 EventContainer GetEvents(const Surface::Site* desorption_site_ptr) const {
00103 EventPtr desorption_ptr (new Desorption(*this, const_cast<Surface::Site*>(desorption_site_ptr)));
00104 return (desorption_ptr->Enabled() ?
00105 EventContainer(1, desorption_ptr) :
00106 EventContainer());
00107 }
00108
00109
00110 SitePtrContainer site_container() const
00111 { return SitePtrContainer(1, desorption_site_); }
00112
00113 private:
00114 Name name_;
00115 Surface::Species species_;
00116 double preexponential_factor_, activation_energy_;
00117
00118 double time_;
00119 Surface::Site* desorption_site_;
00120 };
00121
00122 }
00123
00124 #endif